[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 0/1] ARM: Implement support for write-ctrlreg vm-events
I've decided to include a cover-letter for this patch to ask for some feedback on a few matters (and also to detail the changes that were done here instead of writing that in the commit message). First, DETAILS OF CHANGES: == Moved to common-side: 1) monitor_ctrlreg_bitmask macro 2) hvm_event_cr->vm_event_monitor_cr 3) XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG handling (moved from X86 arch_monitor_domctl_event to common monitor_domctl) == ARM implementations: 1) add VM_EVENT_ARM_{SCTLR,TTBR{0,1},TTBCR} as possible vm_event_write_ctrlreg indexes 2) add write_ctrlreg_* bits in arch_domain 3) vm_event_monitor_get_capabilities updated to reflect support for XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG 4) on the scheduling tail, p2m_restore_state sets the HCR_TVM bit if write_ctrlreg_enabled <> 0 for the domain 5) traps.c, traps.h: do_cp15_32, do_cp15_64 and do_sysreg now handle HCR_TVM traps, emulating writes as needed and also calling vm_event_monitor_cr in the process for the targeted monitored registers The patch was currently tested on an ARMv8 (CONFIG_ARM_64) machine (after applying a fix I'll send soon). With CONFIG_ARM_32 I only checked that Xen clean-builds ok. Then, QUESTIONS (FOR VM-EVENTS & ARM MAINTAINERS ESPECIALLY): Q1) Getting rid of the "#ifdef CONFIG_X86" @ monitor_domctl->XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG case. To trap targeted control-registers writes, on ARM we check if write_ctrlreg_enabled is non-zero on the scheduling tail and set/unset the HCR_TVM bit accordingly (see the p2m_restore_state function). I see that on X86 for CR3 that's done @ vmx_update_guest_cr by this code: /* Trap CR3 updates if CR3 memory events are enabled. */ if ( v->domain->arch.monitor.write_ctrlreg_enabled & monitor_ctrlreg_bitmask(VM_EVENT_X86_CR3) ) v->arch.hvm_vmx.exec_control |= CPU_BASED_CR3_LOAD_EXITING; Couldn't we move this part on the X86 scheduling tail as it is done for ARM in this changeset? Q2) About VM_EVENT_FLAG_DENY Q2.1) Doesn't it require sync = 1 (i.e. the vcpu to be paused) to work? If so, shouldn't we call vm_event_register_write_resume only after checking that VM_EVENT_FLAG_VCPU_PAUSED flag is set (vm_event_resume). Moreover, if we do that, wouldn't it be 'cleaner' to rename vm_event_register_write_resume->vm_event_deny, check for the VM_EVENT_FLAG_DENY flag in vm_event_resume instead and call vm_event_deny from there after this check? Q2.2) VM_EVENT_FLAG_DENY functionality is not implemented w/ this change-set. What is done instead is that the control-register write is done *before* sending the vm-event (vm_event_put_request). This way, the user can override the written register value after receiving the vm-event, which in effect provides the same flexibility as VM_EVENT_FLAG_DENY does. Using this strategy instead would simplify both Xen's code and the libxc user's code. Thoughts? Q3) About security: i.e. making sure I don't crash Xen :) When a system-register write is trapped in Xen due to the HCR_TVM bit, besides triggering the vm-event where it's the case, we also need to emulate this write operation. This is done with the WRITE_SYSREG* macros (see TVM_EMUL/TVM_EMUL_VMEVT macros and their usage). A potential security issue I see here is a case where WRITE_SYSREG* would cause some kind of hardware fault/exception from EL2 that I did not take into account. Since the value that must be written is determined by the domain, that would mean that a 'bad' domain could willingly cause Xen to crash. I've read the ARM manuals and of course I've kept this in mind while doing the emulation, but I still need some clarifications. Concretely, this is the information I haven't found while reading the docs: Q3.1) If an AArch64 domain does: MSR SCTLR_EL1, <Xt> and given that SCTLR_EL1 is a 32-bit system register and that Xt is a 64-bit register, what happens if the *high* 32-bits of Xt are not set to zero? Are they simply ignored or would that cause a fault? If so, would that fault happen before trapping to EL2? Q3.2) What would happen if a domain writes an invalid value to these regs. By invalid I mean writing 1 to RES0/UNK/SBZP/RAZ/SBZP bits or vice-versa (0 to RES1,etc). Again, could such behavior cause faults when doing WRITE_SYSREG*? Note that this also concerns functions like xc_vcpu_setcontext. Q4) The ARMv7 manual doesn't include AMAIR0/AMAIR1 in the list of registers that cause HYP traps on write when the HCR.TVM bit is set. Is that correct? If so, should I surround parts relevant to them in this changeset w/ CONFIG_ARM_64? Corneliu ZUZU (1): arm/monitor vm-events: implement write-ctrlreg support xen/arch/arm/p2m.c | 5 + xen/arch/arm/traps.c | 128 +++++++++++++++++++++- xen/arch/x86/hvm/event.c | 27 ----- xen/arch/x86/hvm/hvm.c | 2 +- xen/arch/x86/hvm/vmx/vmx.c | 2 +- xen/arch/x86/monitor.c | 45 -------- xen/common/monitor.c | 48 +++++++++ xen/common/vm_event.c | 29 +++++ xen/include/asm-arm/domain.h | 8 ++ xen/include/asm-arm/traps.h | 227 ++++++++++++++++++++++++++++++++++++++++ xen/include/asm-arm/vm_event.h | 4 +- xen/include/asm-x86/hvm/event.h | 13 +-- xen/include/asm-x86/monitor.h | 2 - xen/include/public/vm_event.h | 8 +- xen/include/xen/monitor.h | 2 + xen/include/xen/vm_event.h | 8 ++ 16 files changed, 467 insertions(+), 91 deletions(-) create mode 100644 xen/include/asm-arm/traps.h -- 2.5.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |