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@lists.xen.org https://lists.xen.org/xen-devel