[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] hvm crash on hypercall event channel

On 10/04/2012 12:30, "Daniel Castro" <evil.dani@xxxxxxxxx> wrote:

> Hello All,
> I am writing the PV-Drivers for Seabios.
> When I put a request on the front ring and issue the hypercall to
> notify, the hvm guest crashes.
> Here is the dmesg output:
> (XEN) realmode.c:116:d10 Failed to emulate insn.
> (XEN) realmode.c:166:d10 Real-mode emulation failed @ f000:00001c4b:
> 0f aa ba b2 00 ec

Looks like instruction RSM (return from SMM mode). Seems unlikely!

However, even if you are trying to run VMCALL (opcode 0F 01 C1) from
realmode it may not work as we emulate real mode for older Intel CPUs, and
our emulator does not include the vmcall instruction. Also the hypercall
stub code we provide to guests is only correct for 32-bit and 64-bit modes.
You can't legitimately use the hypercall stubs from real mode, vm86 mode, or
16-bit protected mode.

Could you just do the hypercalls from 32-bit mode? Our old rombios had a
32-bit code area for stuff like this, quite probably seabios has similar. Or
perhaps if not it could gain this functionality. Hypercalls from 16-bit mode
are not something we care to add support for, I think.

 -- Keir

> (XEN) domain_crash called from realmode.c:167
> (XEN) Domain 10 (vcpu#0) crashed on cpu#1:
> (XEN) ----[ Xen-4.2-unstable  x86_64  debug=y  Not tainted ]----
> (XEN) CPU:    1
> (XEN) RIP:    f000:[<0000000000001c4b>]
> (XEN) RFLAGS: 0000000000000097   CONTEXT: hvm guest
> (XEN) rax: 00000000000a0000   rbx: 000000000003fef8   rcx: 0000000000000320
> (XEN) rdx: 00000000000000b3   rsi: 00000000000fd600   rdi: 0000000000000340
> (XEN) rbp: 000000000009a040   rsp: 0000000000000308   r8:  0000000000000000
> (XEN) r9:  0000000000000000   r10: 0000000000000000   r11: 0000000000000000
> (XEN) r12: 0000000000000000   r13: 0000000000000000   r14: 0000000000000000
> (XEN) r15: 0000000000000000   cr0: 0000000000000010   cr4: 0000000000000000
> (XEN) cr3: 0000000000800000   cr2: 0000000000000000
> (XEN) ds: 9940   es: 9940   fs: 0000   gs: 0000   ss: 9940   cs: f000
> Here is the code for issue the hypercall:
> dprintf(1,"Start notify procedure\n");
> evtchn_send_t send;
> send.port = GET_GLOBALFLAT(bi->port);
> dprintf(1,"In notify before hypercall port is %d = %d",send.port);
> //hypercall_event_channel_op(EVTCHNOP_send, &send);
> dprintf(1,"read operation notify res %d\n",
> hypercall_event_channel_op(EVTCHNOP_send, &send));
> Nothing out of the ordinary. Except that the hypercall is issued under
> 16bit, It works under 32bit.
> Any ideas what could be wrong?

Xen-devel mailing list



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.