[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] arm/vm_event: get/set registers
Add support for getting/setting registers through vm_event on ARM. The set of registers can be expanded in the future to include other registers as well if necessary but for now it is limited to TTB/CR/R0/R1, PC and CPSR. Signed-off-by: Tamas K Lengyel <tamas.lengyel@xxxxxxxxxxxx> --- Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx> Cc: Julien Grall <julien.grall@xxxxxxx> Cc: Razvan Cojocaru <rcojocaru@xxxxxxxxxxxxxxx> Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- xen/arch/arm/Makefile | 1 + xen/arch/arm/vm_event.c | 53 ++++++++++++++++++++++++++++++++++++++++++ xen/include/asm-arm/vm_event.h | 11 --------- xen/include/asm-x86/vm_event.h | 4 ---- xen/include/public/vm_event.h | 14 +++++++++-- xen/include/xen/vm_event.h | 3 +++ 6 files changed, 69 insertions(+), 17 deletions(-) create mode 100644 xen/arch/arm/vm_event.c diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile index b264ed4..5752830 100644 --- a/xen/arch/arm/Makefile +++ b/xen/arch/arm/Makefile @@ -41,6 +41,7 @@ obj-y += traps.o obj-y += vgic.o obj-y += vgic-v2.o obj-$(CONFIG_ARM_64) += vgic-v3.o +obj-y += vm_event.o obj-y += vtimer.o obj-y += vpsci.o obj-y += vuart.o diff --git a/xen/arch/arm/vm_event.c b/xen/arch/arm/vm_event.c new file mode 100644 index 0000000..5e4bee1 --- /dev/null +++ b/xen/arch/arm/vm_event.c @@ -0,0 +1,53 @@ +/* + * arch/arm/vm_event.c + * + * Architecture-specific vm_event handling routines + * + * Copyright (c) 2016 Tamas K Lengyel (tamas.lengyel@xxxxxxxxxxxx) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License v2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; If not, see <http://www.gnu.org/licenses/>. + */ + +#include <xen/sched.h> +#include <asm/vm_event.h> + +void vm_event_fill_regs(vm_event_request_t *req) +{ + const struct cpu_user_regs *regs = guest_cpu_user_regs(); + + req->data.regs.arm.cpsr = regs->cpsr; + req->data.regs.arm.pc = regs->pc; + req->data.regs.arm.ttbcr = READ_SYSREG(TCR_EL1); + req->data.regs.arm.ttbr0 = READ_SYSREG64(TTBR0_EL1); + req->data.regs.arm.ttbr1 = READ_SYSREG64(TTBR1_EL1); +} + +void vm_event_set_registers(struct vcpu *v, vm_event_response_t *rsp) +{ + struct cpu_user_regs *regs = guest_cpu_user_regs(); + + regs->cpsr = rsp->data.regs.arm.cpsr; + regs->pc = rsp->data.regs.arm.pc; + v->arch.ttbcr = rsp->data.regs.arm.ttbcr; + v->arch.ttbr0 = rsp->data.regs.arm.ttbr0; + v->arch.ttbr1 = rsp->data.regs.arm.ttbr1; +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/include/asm-arm/vm_event.h b/xen/include/asm-arm/vm_event.h index ccc4b60..9482636 100644 --- a/xen/include/asm-arm/vm_event.h +++ b/xen/include/asm-arm/vm_event.h @@ -45,15 +45,4 @@ void vm_event_register_write_resume(struct vcpu *v, vm_event_response_t *rsp) /* Not supported on ARM. */ } -static inline -void vm_event_set_registers(struct vcpu *v, vm_event_response_t *rsp) -{ - /* Not supported on ARM. */ -} - -static inline void vm_event_fill_regs(vm_event_request_t *req) -{ - /* Not supported on ARM. */ -} - #endif /* __ASM_ARM_VM_EVENT_H__ */ diff --git a/xen/include/asm-x86/vm_event.h b/xen/include/asm-x86/vm_event.h index 7e6adff..294def6 100644 --- a/xen/include/asm-x86/vm_event.h +++ b/xen/include/asm-x86/vm_event.h @@ -39,8 +39,4 @@ void vm_event_toggle_singlestep(struct domain *d, struct vcpu *v); void vm_event_register_write_resume(struct vcpu *v, vm_event_response_t *rsp); -void vm_event_set_registers(struct vcpu *v, vm_event_response_t *rsp); - -void vm_event_fill_regs(vm_event_request_t *req); - #endif /* __ASM_X86_VM_EVENT_H__ */ diff --git a/xen/include/public/vm_event.h b/xen/include/public/vm_event.h index 64e6857..1e3195d 100644 --- a/xen/include/public/vm_event.h +++ b/xen/include/public/vm_event.h @@ -132,8 +132,8 @@ #define VM_EVENT_X86_XCR0 3 /* - * Using a custom struct (not hvm_hw_cpu) so as to not fill - * the vm_event ring buffer too quickly. + * Using custom vCPU structs (i.e. not hvm_hw_cpu) for both x86 and ARM + * so as to not fill the vm_event ring buffer too quickly. */ struct vm_event_regs_x86 { uint64_t rax; @@ -171,6 +171,15 @@ struct vm_event_regs_x86 { uint32_t _pad; }; +struct vm_event_regs_arm { + uint64_t ttbr0; + uint64_t ttbr1; + uint64_t ttbcr; + uint64_t pc; + uint32_t cpsr; + uint32_t _pad; +}; + /* * mem_access flag definitions * @@ -273,6 +282,7 @@ typedef struct vm_event_st { union { union { struct vm_event_regs_x86 x86; + struct vm_event_regs_arm arm; } regs; struct vm_event_emul_read_data emul_read_data; diff --git a/xen/include/xen/vm_event.h b/xen/include/xen/vm_event.h index c09f723..4f088c8 100644 --- a/xen/include/xen/vm_event.h +++ b/xen/include/xen/vm_event.h @@ -75,6 +75,9 @@ int vm_event_domctl(struct domain *d, xen_domctl_vm_event_op_t *vec, void vm_event_vcpu_pause(struct vcpu *v); void vm_event_vcpu_unpause(struct vcpu *v); +void vm_event_fill_regs(vm_event_request_t *req); +void vm_event_set_registers(struct vcpu *v, vm_event_response_t *rsp); + #endif /* __VM_EVENT_H__ */ /* -- 2.8.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |