[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v8 4/6] arm/vm_event: get/set registers
On 05/07/16 19:37, Tamas K Lengyel wrote: +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.ttbr0 = READ_SYSREG64(TTBR0_EL1); + req->data.regs.arm.ttbr1 = READ_SYSREG64(TTBR1_EL1); + + if ( psr_mode_is_32bit(regs->cpsr) ) + { + req->data.regs.arm.arch.arm32.r0 = regs->r0; + req->data.regs.arm.arch.arm32.r1 = regs->r1; + req->data.regs.arm.arch.arm32.r2 = regs->r2; + req->data.regs.arm.arch.arm32.r3 = regs->r3; + req->data.regs.arm.arch.arm32.r4 = regs->r4; + req->data.regs.arm.arch.arm32.r5 = regs->r5; + req->data.regs.arm.arch.arm32.r6 = regs->r6; + req->data.regs.arm.arch.arm32.r7 = regs->r7; + req->data.regs.arm.arch.arm32.r8 = regs->r8; + req->data.regs.arm.arch.arm32.r9 = regs->r9; + req->data.regs.arm.arch.arm32.r10 = regs->r10; + req->data.regs.arm.arch.arm32.r11 = regs->fp; + req->data.regs.arm.arch.arm32.r12 = regs->r12; + req->data.regs.arm.arch.arm32.r13 = regs->sp; Please look at the description of "sp" in cpu_user_regs. You will notice this is only valid for the hypervisor. There are multiple stack pointers for the guest depending on the running mode (see B9.2.1 in ARM DDI 0406C.c), so you may want to pass all of them. + req->data.regs.arm.arch.arm32.r14 = regs->lr; Whilst lr is an union with lr_usr on ARM32 port, for the ARM64 port they are distinct (see cpu_users). So you would use the wrong register here. However, as for sp, there are multiple lr pointers for the guest depending on the running mode. So you will pass the wrong lr if the guest is running in another mode than user. Regards, -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |