Messages in this thread | | | Date | Sat, 19 Apr 2008 18:40:39 -0400 | From | Mathieu Desnoyers <> | Subject | Re: [RFC PATCH] x86 NMI-safe INT3 and Page Fault (v7) |
| |
* Jeremy Fitzhardinge (jeremy@goop.org) wrote: > Mathieu Desnoyers wrote: >> * Jeremy Fitzhardinge (jeremy@goop.org) wrote: >> >>> Mathieu Desnoyers wrote: >>> >>>> +/* >>>> + * Only returns from a trap or exception to a NMI context >>>> (intra-privilege >>>> + * level near return) to the same SS and CS segments. Should be used >>>> + * upon trap or exception return when nested over a NMI context so no >>>> iret is >>>> + * issued. It takes care of modifying the eflags, rsp and returning to >>>> the >>>> + * previous function. >>>> + * >>>> + * The stack, at that point, looks like : >>>> + * >>>> + * 0(rsp) RIP >>>> + * 8(rsp) CS >>>> + * 16(rsp) EFLAGS >>>> + * 24(rsp) RSP >>>> + * 32(rsp) SS >>>> + * >>>> + * Upon execution : >>>> + * Copy EIP to the top of the return stack >>>> + * Update top of return stack address >>>> + * Pop eflags into the eflags register >>>> + * Make the return stack current >>>> + * Near return (popping the return address from the return stack) >>>> + */ >>>> +#define INTERRUPT_RETURN_NMI_SAFE pushq %rax; \ >>>> + mov %rsp, %rax; \ >>>> + mov 24+8(%rax), %rsp; \ >>>> + pushq 0+8(%rax); \ >>>> + pushq 16+8(%rax); \ >>>> + movq (%rax), %rax; \ >>>> + popfq; \ >>>> + ret; >>>> >>> I got this right first go? I must be getting good at this... >>> >>> >> >> Yes, it looked good to me at least :) >> >> >>> Anyway, trailing ';', and perhaps use a consistent form for mov (either >>> movq or mov in all three instances). >>> >>> >> >> Ok, fixed. Here is the update. >> >> The last issue standing would be the paravirt code. Any ideas about how >> it's best to do it ? It would be good to be able to get the nmi-safe >> version on bare metal, patched with a standard iret emulation in >> paravirt code. >> > > #ifdef CONFIG_PARAVIRT > #define NMI_RETURN paravirt_nmi_return > > /* elsewhere */ > .nmi_return = native_iret_nmi_return; > #else > #define NMI_RETURN NMI_SAFE_NMI_RETURN > #endif > > ? >
Then I guess we would have to start dealing with faults caused by popf if it happens to be run before the code patching is done ?
Mathieu
> J
-- Mathieu Desnoyers Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
| |