[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [MirageOS-devel] Crash on x86 with doubles
On 1 Jul 2014, at 22:53, Thomas Leonard <talex5@xxxxxxxxx> wrote: > I've got printing of floating point values working now on ARM, but > while testing I discovered it crashes on x86. > > This turned out to be unrelated to OCaml or Mirage. It seems that > passing a double argument to any varargs function causes a crash on > x86_64 if done from a Mini-OS thread. Can any x86 gurus here shed some > light on what might cause that? x86 is a mystery to me. First thing to check is that %rsp stack alignment is valid when you enter the function, as it's required to be 16-byte aligned by the x86_64 ABI if you're using the XMM registers. An ancient diff in our local MiniOS that fixed one instance of this is below. (I can't reproduce this instantly to give you a more precise diagnosis as I'm travelling at the moment, apologies!) -anil commit c185b18d3e1809257d6b5dcba1bd258ec77565e1 Author: Anil Madhavapeddy <anil@xxxxxxxxxx> Date: Wed Jul 21 16:59:24 2010 +0100 fix a nasty stack misalignment problem when executing code inside an event handler. The irq stack xen injects is only 8 byte aligned instead of 16, and so eventually any varargs call Just adjust %esp directly in the callback to deal with this case. diff --git a/runtime/kernel/hypervisor.c b/runtime/kernel/hypervisor.c index 9f628c4..19c2134 100644 --- a/runtime/kernel/hypervisor.c +++ b/runtime/kernel/hypervisor.c @@ -46,6 +46,11 @@ void do_hypervisor_callback(struct pt_regs *regs) in_callback = 1; + /* Adjust the stack to be 16-byte aligned, so that functions + called from an event callback will respect the x86_64 ABI. + The Xen IRQ injection is only 8-bytes */ + asm("andl $0xfffffff0, %esp"); + vcpu_info->evtchn_upcall_pending = 0; /* NB x86. No need for a barrier here -- XCHG is a barrier on x86. */ l1 = xchg(&vcpu_info->evtchn_pending_sel, 0); @@ -60,7 +65,7 @@ void do_hypervisor_callback(struct pt_regs *regs) l2 &= ~(1UL << l2i); port = (l1i * (sizeof(unsigned long) * 8)) + l2i; - do_event(port, regs); + do_event(port, regs); } } _______________________________________________ MirageOS-devel mailing list MirageOS-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/mirageos-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |