* [PATCH 0/4] traps: x86: more unification
@ 2008-09-30 16:41 Alexander van Heukelum
2008-09-30 16:41 ` [PATCH 1/4] traps: x86_64: split out math_error and simd_math_error Alexander van Heukelum
` (2 more replies)
0 siblings, 3 replies; 12+ messages in thread
From: Alexander van Heukelum @ 2008-09-30 16:41 UTC (permalink / raw)
To: Ingo Molnar, LKML, Yinghai Lu; +Cc: Alexander van Heukelum
Hi Ingo,
Here are some more unification patches for traps_xx.c. They
are against the current x86/traps branch in the tip tree and
work fine for my miniconfigs.
The branch does not at the moment compile a defconfig kernel,
due to a missing PCI_DEVICE_ID_AMD_10H_NB_MISC define, however.
Moreover, a defconfig won't run :-/ (on qemu-system-x86_64).
Bisection pointed to commit 10a434fcb "x86: remove cpu_vendor_dev".
The kernel crashes early with a general protection fault in a call
to strnlen. I have no idea what goes wrong, yet.
Greetings,
Alexander
^ permalink raw reply [flat|nested] 12+ messages in thread* [PATCH 1/4] traps: x86_64: split out math_error and simd_math_error 2008-09-30 16:41 [PATCH 0/4] traps: x86: more unification Alexander van Heukelum @ 2008-09-30 16:41 ` Alexander van Heukelum 2008-09-30 16:41 ` [PATCH 2/4] traps: i386: factor out lazy io-bitmap copy Alexander van Heukelum 2008-09-30 19:37 ` [PATCH] fix: x86: remove cpu_vendor_dev Alexander van Heukelum 2008-10-01 7:06 ` [PATCH 0/4] traps: x86: more unification Ingo Molnar 2 siblings, 1 reply; 12+ messages in thread From: Alexander van Heukelum @ 2008-09-30 16:41 UTC (permalink / raw) To: Ingo Molnar, LKML, Yinghai Lu; +Cc: Alexander van Heukelum Split out math_error from do_coprocessor_error and simd_math_error from do_simd_coprocessor_error, like on i386. While at it, add the "error_code" parameter to do_coprocessor_error, do_simd_coprocessor_error and do_spurious_interrupt_bug. This does not change the generated code, but brings the declarations in line with all the other trap handlers. Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm> --- arch/x86/kernel/traps_64.c | 36 +++++++++++++++++++++--------------- include/asm-x86/traps.h | 6 +++--- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/arch/x86/kernel/traps_64.c b/arch/x86/kernel/traps_64.c index 8ab8f81..201f98d 100644 --- a/arch/x86/kernel/traps_64.c +++ b/arch/x86/kernel/traps_64.c @@ -457,18 +457,12 @@ static int kernel_math_error(struct pt_regs *regs, const char *str, int trapnr) * the correct behaviour even in the presence of the asynchronous * IRQ13 behaviour */ -asmlinkage void do_coprocessor_error(struct pt_regs *regs) +void math_error(void __user *ip) { - void __user *ip = (void __user *)(regs->ip); struct task_struct *task; siginfo_t info; unsigned short cwd, swd; - conditional_sti(regs); - if (!user_mode(regs) && - kernel_math_error(regs, "kernel x87 math error", 16)) - return; - /* * Save the info for the exception handler and clear the error. */ @@ -521,23 +515,26 @@ asmlinkage void do_coprocessor_error(struct pt_regs *regs) force_sig_info(SIGFPE, &info, task); } +asmlinkage void do_coprocessor_error(struct pt_regs *regs, long error_code) +{ + conditional_sti(regs); + if (!user_mode(regs) && + kernel_math_error(regs, "kernel x87 math error", 16)) + return; + math_error((void __user *)regs->ip); +} + asmlinkage void bad_intr(void) { printk("bad interrupt"); } -asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs) +static void simd_math_error(void __user *ip) { - void __user *ip = (void __user *)(regs->ip); struct task_struct *task; siginfo_t info; unsigned short mxcsr; - conditional_sti(regs); - if (!user_mode(regs) && - kernel_math_error(regs, "kernel simd math error", 19)) - return; - /* * Save the info for the exception handler and clear the error. */ @@ -580,7 +577,16 @@ asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs) force_sig_info(SIGFPE, &info, task); } -asmlinkage void do_spurious_interrupt_bug(struct pt_regs *regs) +asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs, long error_code) +{ + conditional_sti(regs); + if (!user_mode(regs) && + kernel_math_error(regs, "kernel simd math error", 19)) + return; + simd_math_error((void __user *)regs->ip); +} + +asmlinkage void do_spurious_interrupt_bug(struct pt_regs *regs, long error_code) { } diff --git a/include/asm-x86/traps.h b/include/asm-x86/traps.h index 7a692ba..c82c39c 100644 --- a/include/asm-x86/traps.h +++ b/include/asm-x86/traps.h @@ -72,9 +72,9 @@ asmlinkage void double_fault(void); asmlinkage void do_int3(struct pt_regs *, long); asmlinkage void do_stack_segment(struct pt_regs *, long); asmlinkage void do_debug(struct pt_regs *, unsigned long); -asmlinkage void do_coprocessor_error(struct pt_regs *); -asmlinkage void do_simd_coprocessor_error(struct pt_regs *); -asmlinkage void do_spurious_interrupt_bug(struct pt_regs *); +asmlinkage void do_coprocessor_error(struct pt_regs *, long); +asmlinkage void do_simd_coprocessor_error(struct pt_regs *, long); +asmlinkage void do_spurious_interrupt_bug(struct pt_regs *, long); asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code); -- 1.5.4.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 2/4] traps: i386: factor out lazy io-bitmap copy 2008-09-30 16:41 ` [PATCH 1/4] traps: x86_64: split out math_error and simd_math_error Alexander van Heukelum @ 2008-09-30 16:41 ` Alexander van Heukelum 2008-09-30 16:41 ` [PATCH 3/4] traps: x86: introduce dotraplinkage Alexander van Heukelum 0 siblings, 1 reply; 12+ messages in thread From: Alexander van Heukelum @ 2008-09-30 16:41 UTC (permalink / raw) To: Ingo Molnar, LKML, Yinghai Lu; +Cc: Alexander van Heukelum x86_64 does not do the lazy io-bitmap dance. Putting it in its own function makes i386's do_general_protection look much more like x86_64's. Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm> --- arch/x86/kernel/traps_32.c | 76 +++++++++++++++++++++++++------------------- 1 files changed, 43 insertions(+), 33 deletions(-) diff --git a/arch/x86/kernel/traps_32.c b/arch/x86/kernel/traps_32.c index dd183a2..78113d3 100644 --- a/arch/x86/kernel/traps_32.c +++ b/arch/x86/kernel/traps_32.c @@ -96,6 +96,47 @@ die_if_kernel(const char *str, struct pt_regs *regs, long err) die(str, regs, err); } +/* + * Perform the lazy TSS's I/O bitmap copy. If the TSS has an + * invalid offset set (the LAZY one) and the faulting thread has + * a valid I/O bitmap pointer, we copy the I/O bitmap in the TSS, + * we set the offset field correctly and return 1. + */ +static int lazy_iobitmap_copy(void) +{ + struct thread_struct *thread; + struct tss_struct *tss; + int cpu; + + cpu = get_cpu(); + tss = &per_cpu(init_tss, cpu); + thread = ¤t->thread; + + if (tss->x86_tss.io_bitmap_base == INVALID_IO_BITMAP_OFFSET_LAZY && + thread->io_bitmap_ptr) { + memcpy(tss->io_bitmap, thread->io_bitmap_ptr, + thread->io_bitmap_max); + /* + * If the previously set map was extending to higher ports + * than the current one, pad extra space with 0xff (no access). + */ + if (thread->io_bitmap_max < tss->io_bitmap_max) { + memset((char *) tss->io_bitmap + + thread->io_bitmap_max, 0xff, + tss->io_bitmap_max - thread->io_bitmap_max); + } + tss->io_bitmap_max = thread->io_bitmap_max; + tss->x86_tss.io_bitmap_base = IO_BITMAP_OFFSET; + tss->io_bitmap_owner = thread; + put_cpu(); + + return 1; + } + put_cpu(); + + return 0; +} + static void __kprobes do_trap(int trapnr, int signr, char *str, struct pt_regs *regs, long error_code, siginfo_t *info) @@ -188,44 +229,13 @@ void __kprobes do_general_protection(struct pt_regs *regs, long error_code) { struct task_struct *tsk; - struct thread_struct *thread; - struct tss_struct *tss; - int cpu; conditional_sti(regs); - cpu = get_cpu(); - tss = &per_cpu(init_tss, cpu); - thread = ¤t->thread; - - /* - * Perform the lazy TSS's I/O bitmap copy. If the TSS has an - * invalid offset set (the LAZY one) and the faulting thread has - * a valid I/O bitmap pointer, we copy the I/O bitmap in the TSS - * and we set the offset field correctly. Then we let the CPU to - * restart the faulting instruction. - */ - if (tss->x86_tss.io_bitmap_base == INVALID_IO_BITMAP_OFFSET_LAZY && - thread->io_bitmap_ptr) { - memcpy(tss->io_bitmap, thread->io_bitmap_ptr, - thread->io_bitmap_max); - /* - * If the previously set map was extending to higher ports - * than the current one, pad extra space with 0xff (no access). - */ - if (thread->io_bitmap_max < tss->io_bitmap_max) { - memset((char *) tss->io_bitmap + - thread->io_bitmap_max, 0xff, - tss->io_bitmap_max - thread->io_bitmap_max); - } - tss->io_bitmap_max = thread->io_bitmap_max; - tss->x86_tss.io_bitmap_base = IO_BITMAP_OFFSET; - tss->io_bitmap_owner = thread; - put_cpu(); - + if (lazy_iobitmap_copy()) { + /* restart the faulting instruction */ return; } - put_cpu(); if (regs->flags & X86_VM_MASK) goto gp_in_vm86; -- 1.5.4.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 3/4] traps: x86: introduce dotraplinkage 2008-09-30 16:41 ` [PATCH 2/4] traps: i386: factor out lazy io-bitmap copy Alexander van Heukelum @ 2008-09-30 16:41 ` Alexander van Heukelum 2008-09-30 16:41 ` [PATCH 4/4] traps: x86: converge do_debug handlers Alexander van Heukelum 0 siblings, 1 reply; 12+ messages in thread From: Alexander van Heukelum @ 2008-09-30 16:41 UTC (permalink / raw) To: Ingo Molnar, LKML, Yinghai Lu; +Cc: Alexander van Heukelum Mark the exception handlers with "dotraplinkage" to hide the calling convention differences between i386 and x86_64. Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm> --- arch/x86/kernel/entry_64.S | 2 +- arch/x86/kernel/traps_32.c | 28 +++++++++------- arch/x86/kernel/traps_64.c | 31 +++++++++++------- include/asm-x86/traps.h | 73 +++++++++++++++++++++---------------------- 4 files changed, 72 insertions(+), 62 deletions(-) diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 1924659..291dd21 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S @@ -1266,7 +1266,7 @@ ENTRY(simd_coprocessor_error) END(simd_coprocessor_error) ENTRY(device_not_available) - zeroentry math_state_restore + zeroentry do_device_not_available END(device_not_available) /* runs on exception stack */ diff --git a/arch/x86/kernel/traps_32.c b/arch/x86/kernel/traps_32.c index 78113d3..6ecc1b7 100644 --- a/arch/x86/kernel/traps_32.c +++ b/arch/x86/kernel/traps_32.c @@ -191,7 +191,7 @@ vm86_trap: } #define DO_ERROR(trapnr, signr, str, name) \ -void do_##name(struct pt_regs *regs, long error_code) \ +dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \ { \ if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ == NOTIFY_STOP) \ @@ -201,7 +201,7 @@ void do_##name(struct pt_regs *regs, long error_code) \ } #define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \ -void do_##name(struct pt_regs *regs, long error_code) \ +dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \ { \ siginfo_t info; \ info.si_signo = signr; \ @@ -225,7 +225,7 @@ DO_ERROR(11, SIGBUS, "segment not present", segment_not_present) DO_ERROR(12, SIGBUS, "stack segment", stack_segment) DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0) -void __kprobes +dotraplinkage void __kprobes do_general_protection(struct pt_regs *regs, long error_code) { struct task_struct *tsk; @@ -429,7 +429,8 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs) reassert_nmi(); } -notrace __kprobes void do_nmi(struct pt_regs *regs, long error_code) +dotraplinkage notrace __kprobes void +do_nmi(struct pt_regs *regs, long error_code) { int cpu; @@ -457,7 +458,7 @@ void restart_nmi(void) acpi_nmi_enable(); } -void __kprobes do_int3(struct pt_regs *regs, long error_code) +dotraplinkage void __kprobes do_int3(struct pt_regs *regs, long error_code) { #ifdef CONFIG_KPROBES if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP) @@ -495,7 +496,7 @@ void __kprobes do_int3(struct pt_regs *regs, long error_code) * find every occurrence of the TF bit that could be saved away even * by user code) */ -void __kprobes do_debug(struct pt_regs *regs, long error_code) +dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) { struct task_struct *tsk = current; unsigned int condition; @@ -632,7 +633,7 @@ void math_error(void __user *ip) force_sig_info(SIGFPE, &info, task); } -void do_coprocessor_error(struct pt_regs *regs, long error_code) +dotraplinkage void do_coprocessor_error(struct pt_regs *regs, long error_code) { conditional_sti(regs); ignore_fpu_irq = 1; @@ -687,7 +688,8 @@ static void simd_math_error(void __user *ip) force_sig_info(SIGFPE, &info, task); } -void do_simd_coprocessor_error(struct pt_regs *regs, long error_code) +dotraplinkage void +do_simd_coprocessor_error(struct pt_regs *regs, long error_code) { conditional_sti(regs); @@ -711,7 +713,8 @@ void do_simd_coprocessor_error(struct pt_regs *regs, long error_code) force_sig(SIGSEGV, current); } -void do_spurious_interrupt_bug(struct pt_regs *regs, long error_code) +dotraplinkage void +do_spurious_interrupt_bug(struct pt_regs *regs, long error_code) { conditional_sti(regs); #if 0 @@ -789,7 +792,8 @@ asmlinkage void math_emulate(long arg) #endif /* CONFIG_MATH_EMULATION */ -void __kprobes do_device_not_available(struct pt_regs *regs, long error) +dotraplinkage void __kprobes +do_device_not_available(struct pt_regs *regs, long error) { if (read_cr0() & X86_CR0_EM) { conditional_sti(regs); @@ -801,14 +805,14 @@ void __kprobes do_device_not_available(struct pt_regs *regs, long error) } #ifdef CONFIG_X86_MCE -void __kprobes do_machine_check(struct pt_regs *regs, long error) +dotraplinkage void __kprobes do_machine_check(struct pt_regs *regs, long error) { conditional_sti(regs); machine_check_vector(regs, error); } #endif -void do_iret_error(struct pt_regs *regs, long error_code) +dotraplinkage void do_iret_error(struct pt_regs *regs, long error_code) { siginfo_t info; local_irq_enable(); diff --git a/arch/x86/kernel/traps_64.c b/arch/x86/kernel/traps_64.c index 201f98d..d4e02c1 100644 --- a/arch/x86/kernel/traps_64.c +++ b/arch/x86/kernel/traps_64.c @@ -126,7 +126,7 @@ kernel_trap: } #define DO_ERROR(trapnr, signr, str, name) \ -asmlinkage void do_##name(struct pt_regs *regs, long error_code) \ +dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \ { \ if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ == NOTIFY_STOP) \ @@ -136,7 +136,7 @@ asmlinkage void do_##name(struct pt_regs *regs, long error_code) \ } #define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \ -asmlinkage void do_##name(struct pt_regs *regs, long error_code) \ +dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \ { \ siginfo_t info; \ info.si_signo = signr; \ @@ -160,7 +160,7 @@ DO_ERROR(11, SIGBUS, "segment not present", segment_not_present) DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0) /* Runs on IST stack */ -asmlinkage void do_stack_segment(struct pt_regs *regs, long error_code) +dotraplinkage void do_stack_segment(struct pt_regs *regs, long error_code) { if (notify_die(DIE_TRAP, "stack segment", regs, error_code, 12, SIGBUS) == NOTIFY_STOP) @@ -170,7 +170,7 @@ asmlinkage void do_stack_segment(struct pt_regs *regs, long error_code) preempt_conditional_cli(regs); } -asmlinkage void do_double_fault(struct pt_regs *regs, long error_code) +dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code) { static const char str[] = "double fault"; struct task_struct *tsk = current; @@ -187,7 +187,7 @@ asmlinkage void do_double_fault(struct pt_regs *regs, long error_code) die(str, regs, error_code); } -asmlinkage void __kprobes +dotraplinkage void __kprobes do_general_protection(struct pt_regs *regs, long error_code) { struct task_struct *tsk; @@ -318,7 +318,7 @@ asmlinkage notrace __kprobes void default_do_nmi(struct pt_regs *regs) io_check_error(reason, regs); } -asmlinkage notrace __kprobes void +dotraplinkage notrace __kprobes void do_nmi(struct pt_regs *regs, long error_code) { nmi_enter(); @@ -344,7 +344,7 @@ void restart_nmi(void) } /* runs on IST stack. */ -asmlinkage void __kprobes do_int3(struct pt_regs *regs, long error_code) +dotraplinkage void __kprobes do_int3(struct pt_regs *regs, long error_code) { if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP) == NOTIFY_STOP) @@ -377,8 +377,7 @@ asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs) } /* runs on IST stack. */ -asmlinkage void __kprobes do_debug(struct pt_regs *regs, - unsigned long error_code) +dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) { struct task_struct *tsk = current; unsigned long condition; @@ -515,7 +514,7 @@ void math_error(void __user *ip) force_sig_info(SIGFPE, &info, task); } -asmlinkage void do_coprocessor_error(struct pt_regs *regs, long error_code) +dotraplinkage void do_coprocessor_error(struct pt_regs *regs, long error_code) { conditional_sti(regs); if (!user_mode(regs) && @@ -577,7 +576,8 @@ static void simd_math_error(void __user *ip) force_sig_info(SIGFPE, &info, task); } -asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs, long error_code) +dotraplinkage void +do_simd_coprocessor_error(struct pt_regs *regs, long error_code) { conditional_sti(regs); if (!user_mode(regs) && @@ -586,7 +586,8 @@ asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs, long error_code) simd_math_error((void __user *)regs->ip); } -asmlinkage void do_spurious_interrupt_bug(struct pt_regs *regs, long error_code) +dotraplinkage void +do_spurious_interrupt_bug(struct pt_regs *regs, long error_code) { } @@ -638,6 +639,12 @@ asmlinkage void math_state_restore(void) } EXPORT_SYMBOL_GPL(math_state_restore); +dotraplinkage void __kprobes +do_device_not_available(struct pt_regs *regs, long error) +{ + math_state_restore(); +} + void __init trap_init(void) { set_intr_gate(0, ÷_error); diff --git a/include/asm-x86/traps.h b/include/asm-x86/traps.h index c82c39c..6c3dc2c 100644 --- a/include/asm-x86/traps.h +++ b/include/asm-x86/traps.h @@ -3,7 +3,12 @@ #include <asm/debugreg.h> -/* Common in X86_32 and X86_64 */ +#ifdef CONFIG_X86_32 +#define dotraplinkage +#else +#define dotraplinkage asmlinkage +#endif + asmlinkage void divide_error(void); asmlinkage void debug(void); asmlinkage void nmi(void); @@ -12,31 +17,47 @@ asmlinkage void overflow(void); asmlinkage void bounds(void); asmlinkage void invalid_op(void); asmlinkage void device_not_available(void); +#ifdef CONFIG_X86_64 +asmlinkage void double_fault(void); +#endif asmlinkage void coprocessor_segment_overrun(void); asmlinkage void invalid_TSS(void); asmlinkage void segment_not_present(void); asmlinkage void stack_segment(void); asmlinkage void general_protection(void); asmlinkage void page_fault(void); +asmlinkage void spurious_interrupt_bug(void); asmlinkage void coprocessor_error(void); -asmlinkage void simd_coprocessor_error(void); asmlinkage void alignment_check(void); -asmlinkage void spurious_interrupt_bug(void); #ifdef CONFIG_X86_MCE asmlinkage void machine_check(void); #endif /* CONFIG_X86_MCE */ +asmlinkage void simd_coprocessor_error(void); -void do_divide_error(struct pt_regs *, long); -void do_overflow(struct pt_regs *, long); -void do_bounds(struct pt_regs *, long); -void do_coprocessor_segment_overrun(struct pt_regs *, long); -void do_invalid_TSS(struct pt_regs *, long); -void do_segment_not_present(struct pt_regs *, long); -void do_stack_segment(struct pt_regs *, long); -void do_alignment_check(struct pt_regs *, long); -void do_invalid_op(struct pt_regs *, long); -void do_general_protection(struct pt_regs *, long); -void do_nmi(struct pt_regs *, long); +dotraplinkage void do_divide_error(struct pt_regs *, long); +dotraplinkage void do_debug(struct pt_regs *, long); +dotraplinkage void do_nmi(struct pt_regs *, long); +dotraplinkage void do_int3(struct pt_regs *, long); +dotraplinkage void do_overflow(struct pt_regs *, long); +dotraplinkage void do_bounds(struct pt_regs *, long); +dotraplinkage void do_invalid_op(struct pt_regs *, long); +dotraplinkage void do_device_not_available(struct pt_regs *, long); +dotraplinkage void do_coprocessor_segment_overrun(struct pt_regs *, long); +dotraplinkage void do_invalid_TSS(struct pt_regs *, long); +dotraplinkage void do_segment_not_present(struct pt_regs *, long); +dotraplinkage void do_stack_segment(struct pt_regs *, long); +dotraplinkage void do_general_protection(struct pt_regs *, long); +dotraplinkage void do_page_fault(struct pt_regs *, unsigned long); +dotraplinkage void do_spurious_interrupt_bug(struct pt_regs *, long); +dotraplinkage void do_coprocessor_error(struct pt_regs *, long); +dotraplinkage void do_alignment_check(struct pt_regs *, long); +#ifdef CONFIG_X86_MCE +dotraplinkage void do_machine_check(struct pt_regs *, long); +#endif +dotraplinkage void do_simd_coprocessor_error(struct pt_regs *, long); +#ifdef CONFIG_X86_32 +dotraplinkage void do_iret_error(struct pt_regs *, long); +#endif static inline int get_si_code(unsigned long condition) { @@ -52,31 +73,9 @@ extern int panic_on_unrecovered_nmi; extern int kstack_depth_to_print; #ifdef CONFIG_X86_32 - -void do_iret_error(struct pt_regs *, long); -void do_int3(struct pt_regs *, long); -void do_debug(struct pt_regs *, long); void math_error(void __user *); -void do_coprocessor_error(struct pt_regs *, long); -void do_simd_coprocessor_error(struct pt_regs *, long); -void do_spurious_interrupt_bug(struct pt_regs *, long); unsigned long patch_espfix_desc(unsigned long, unsigned long); asmlinkage void math_emulate(long); +#endif -void do_page_fault(struct pt_regs *regs, unsigned long error_code); - -#else /* CONFIG_X86_32 */ - -asmlinkage void double_fault(void); - -asmlinkage void do_int3(struct pt_regs *, long); -asmlinkage void do_stack_segment(struct pt_regs *, long); -asmlinkage void do_debug(struct pt_regs *, unsigned long); -asmlinkage void do_coprocessor_error(struct pt_regs *, long); -asmlinkage void do_simd_coprocessor_error(struct pt_regs *, long); -asmlinkage void do_spurious_interrupt_bug(struct pt_regs *, long); - -asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code); - -#endif /* CONFIG_X86_32 */ #endif /* ASM_X86__TRAPS_H */ -- 1.5.4.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 4/4] traps: x86: converge do_debug handlers 2008-09-30 16:41 ` [PATCH 3/4] traps: x86: introduce dotraplinkage Alexander van Heukelum @ 2008-09-30 16:41 ` Alexander van Heukelum 0 siblings, 0 replies; 12+ messages in thread From: Alexander van Heukelum @ 2008-09-30 16:41 UTC (permalink / raw) To: Ingo Molnar, LKML, Yinghai Lu; +Cc: Alexander van Heukelum Make the x86_64-version and the i386-version of do_debug more similar. - introduce preempt_conditional_sti/cli to i386. The preempt-count is now elevated during the trap handler, like on x86_64. It does not run on a separate stack, however. - replace an open-coded "send_sigtrap" - copy some comments Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm> --- arch/x86/kernel/traps_32.c | 30 +++++++++++++++++++++--------- arch/x86/kernel/traps_64.c | 17 +++++++++-------- include/asm-x86/ptrace.h | 4 ---- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/arch/x86/kernel/traps_32.c b/arch/x86/kernel/traps_32.c index 6ecc1b7..da97cd2 100644 --- a/arch/x86/kernel/traps_32.c +++ b/arch/x86/kernel/traps_32.c @@ -89,6 +89,20 @@ static inline void conditional_sti(struct pt_regs *regs) local_irq_enable(); } +static inline void preempt_conditional_sti(struct pt_regs *regs) +{ + inc_preempt_count(); + if (regs->flags & X86_EFLAGS_IF) + local_irq_enable(); +} + +static inline void preempt_conditional_cli(struct pt_regs *regs) +{ + if (regs->flags & X86_EFLAGS_IF) + local_irq_disable(); + dec_preempt_count(); +} + static inline void die_if_kernel(const char *str, struct pt_regs *regs, long err) { @@ -499,7 +513,7 @@ dotraplinkage void __kprobes do_int3(struct pt_regs *regs, long error_code) dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) { struct task_struct *tsk = current; - unsigned int condition; + unsigned long condition; int si_code; get_debugreg(condition, 6); @@ -517,9 +531,9 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code, SIGTRAP) == NOTIFY_STOP) return; + /* It's safe to allow irq's after DR6 has been saved */ - if (regs->flags & X86_EFLAGS_IF) - local_irq_enable(); + preempt_conditional_sti(regs); /* Mask out spurious debug traps due to lazy DR7 setting */ if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3)) { @@ -538,16 +552,11 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) * kernel space (but re-enable TF when returning to user mode). */ if (condition & DR_STEP) { - /* - * We already checked v86 mode above, so we can - * check for kernel mode by just checking the CPL - * of CS. - */ if (!user_mode(regs)) goto clear_TF_reenable; } - si_code = get_si_code((unsigned long)condition); + si_code = get_si_code(condition); /* Ok, finally something we can handle */ send_sigtrap(tsk, regs, error_code, si_code); @@ -557,15 +566,18 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) */ clear_dr7: set_debugreg(0, 7); + preempt_conditional_cli(regs); return; debug_vm86: handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 1); + preempt_conditional_cli(regs); return; clear_TF_reenable: set_tsk_thread_flag(tsk, TIF_SINGLESTEP); regs->flags &= ~X86_EFLAGS_TF; + preempt_conditional_cli(regs); return; } diff --git a/arch/x86/kernel/traps_64.c b/arch/x86/kernel/traps_64.c index d4e02c1..80dbbc7 100644 --- a/arch/x86/kernel/traps_64.c +++ b/arch/x86/kernel/traps_64.c @@ -381,7 +381,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) { struct task_struct *tsk = current; unsigned long condition; - siginfo_t info; + int si_code; get_debugreg(condition, 6); @@ -399,6 +399,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) SIGTRAP) == NOTIFY_STOP) return; + /* It's safe to allow irq's after DR6 has been saved */ preempt_conditional_sti(regs); /* Mask out spurious debug traps due to lazy DR7 setting */ @@ -407,6 +408,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) goto clear_dr7; } + /* Save debug status register where ptrace can see it */ tsk->thread.debugreg6 = condition; /* @@ -418,15 +420,14 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) goto clear_TF_reenable; } + si_code = get_si_code(condition); /* Ok, finally something we can handle */ - tsk->thread.trap_no = 1; - tsk->thread.error_code = error_code; - info.si_signo = SIGTRAP; - info.si_errno = 0; - info.si_code = get_si_code(condition); - info.si_addr = user_mode(regs) ? (void __user *)regs->ip : NULL; - force_sig_info(SIGTRAP, &info, tsk); + send_sigtrap(tsk, regs, error_code, si_code); + /* + * Disable additional traps. They'll be re-enabled when + * the signal is delivered. + */ clear_dr7: set_debugreg(0, 7); preempt_conditional_cli(regs); diff --git a/include/asm-x86/ptrace.h b/include/asm-x86/ptrace.h index ac578f1..a202552 100644 --- a/include/asm-x86/ptrace.h +++ b/include/asm-x86/ptrace.h @@ -174,12 +174,8 @@ extern unsigned long profile_pc(struct pt_regs *regs); extern unsigned long convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs); - -#ifdef CONFIG_X86_32 extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int error_code, int si_code); -#endif - void signal_fault(struct pt_regs *regs, void __user *frame, char *where); extern long syscall_trace_enter(struct pt_regs *); -- 1.5.4.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH] fix: x86: remove cpu_vendor_dev 2008-09-30 16:41 [PATCH 0/4] traps: x86: more unification Alexander van Heukelum 2008-09-30 16:41 ` [PATCH 1/4] traps: x86_64: split out math_error and simd_math_error Alexander van Heukelum @ 2008-09-30 19:37 ` Alexander van Heukelum 2008-09-30 20:37 ` Yinghai Lu 2008-10-01 7:06 ` [PATCH 0/4] traps: x86: more unification Ingo Molnar 2 siblings, 1 reply; 12+ messages in thread From: Alexander van Heukelum @ 2008-09-30 19:37 UTC (permalink / raw) To: Ingo Molnar, LKML, Yinghai Lu x86_64-kernels after commit 10a434fcb "x86: remove cpu_vendor_dev" crashed on qemu-system-x86_64 due to a typo in vmlinux_64.lds.S. Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm> --- On Tue, Sep 30, 2008 at 06:41:33PM +0200, Alexander van Heukelum wrote: > Moreover, a defconfig won't run :-/ (on qemu-system-x86_64). > Bisection pointed to commit 10a434fcb "x86: remove cpu_vendor_dev". > The kernel crashes early with a general protection fault in a call > to strnlen. I have no idea what goes wrong, yet. It took quite some time, but I found the problem... I'll leave the other one to you ;). Greetings, Alexander arch/x86/kernel/vmlinux_64.lds.S | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/arch/x86/kernel/vmlinux_64.lds.S b/arch/x86/kernel/vmlinux_64.lds.S index 201e81a..46e0544 100644 --- a/arch/x86/kernel/vmlinux_64.lds.S +++ b/arch/x86/kernel/vmlinux_64.lds.S @@ -172,8 +172,8 @@ SECTIONS .x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) { *(.x86_cpu_dev.init) } - SECURITY_INIT __x86_cpu_dev_end = .; + SECURITY_INIT . = ALIGN(8); .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) { ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH] fix: x86: remove cpu_vendor_dev 2008-09-30 19:37 ` [PATCH] fix: x86: remove cpu_vendor_dev Alexander van Heukelum @ 2008-09-30 20:37 ` Yinghai Lu 2008-10-01 6:49 ` Ingo Molnar 0 siblings, 1 reply; 12+ messages in thread From: Yinghai Lu @ 2008-09-30 20:37 UTC (permalink / raw) To: Alexander van Heukelum; +Cc: Ingo Molnar, LKML On Tue, Sep 30, 2008 at 12:37 PM, Alexander van Heukelum <heukelum@mailshack.com> wrote: > x86_64-kernels after commit 10a434fcb "x86: remove cpu_vendor_dev" > crashed on qemu-system-x86_64 due to a typo in vmlinux_64.lds.S. > > Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm> > > --- > > On Tue, Sep 30, 2008 at 06:41:33PM +0200, Alexander van Heukelum wrote: >> Moreover, a defconfig won't run :-/ (on qemu-system-x86_64). >> Bisection pointed to commit 10a434fcb "x86: remove cpu_vendor_dev". >> The kernel crashes early with a general protection fault in a call >> to strnlen. I have no idea what goes wrong, yet. > > It took quite some time, but I found the problem... I'll leave > the other one to you ;). > > Greetings, > Alexander > > arch/x86/kernel/vmlinux_64.lds.S | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/arch/x86/kernel/vmlinux_64.lds.S b/arch/x86/kernel/vmlinux_64.lds.S > index 201e81a..46e0544 100644 > --- a/arch/x86/kernel/vmlinux_64.lds.S > +++ b/arch/x86/kernel/vmlinux_64.lds.S > @@ -172,8 +172,8 @@ SECTIONS > .x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) { > *(.x86_cpu_dev.init) > } > - SECURITY_INIT > __x86_cpu_dev_end = .; > + SECURITY_INIT > > . = ALIGN(8); > .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) { > that is merging problem, Ingo should fix that already... YH ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] fix: x86: remove cpu_vendor_dev 2008-09-30 20:37 ` Yinghai Lu @ 2008-10-01 6:49 ` Ingo Molnar 2008-10-01 7:22 ` Yinghai Lu 0 siblings, 1 reply; 12+ messages in thread From: Ingo Molnar @ 2008-10-01 6:49 UTC (permalink / raw) To: Yinghai Lu; +Cc: Alexander van Heukelum, LKML * Yinghai Lu <yinghai@kernel.org> wrote: > On Tue, Sep 30, 2008 at 12:37 PM, Alexander van Heukelum > <heukelum@mailshack.com> wrote: > > x86_64-kernels after commit 10a434fcb "x86: remove cpu_vendor_dev" > > crashed on qemu-system-x86_64 due to a typo in vmlinux_64.lds.S. > > > > Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm> > > > > --- > > > > On Tue, Sep 30, 2008 at 06:41:33PM +0200, Alexander van Heukelum wrote: > >> Moreover, a defconfig won't run :-/ (on qemu-system-x86_64). > >> Bisection pointed to commit 10a434fcb "x86: remove cpu_vendor_dev". > >> The kernel crashes early with a general protection fault in a call > >> to strnlen. I have no idea what goes wrong, yet. > > > > It took quite some time, but I found the problem... I'll leave > > the other one to you ;). > > > > Greetings, > > Alexander > > > > arch/x86/kernel/vmlinux_64.lds.S | 2 +- > > 1 files changed, 1 insertions(+), 1 deletions(-) > > > > diff --git a/arch/x86/kernel/vmlinux_64.lds.S b/arch/x86/kernel/vmlinux_64.lds.S > > index 201e81a..46e0544 100644 > > --- a/arch/x86/kernel/vmlinux_64.lds.S > > +++ b/arch/x86/kernel/vmlinux_64.lds.S > > @@ -172,8 +172,8 @@ SECTIONS > > .x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) { > > *(.x86_cpu_dev.init) > > } > > - SECURITY_INIT > > __x86_cpu_dev_end = .; > > + SECURITY_INIT > > > > . = ALIGN(8); > > .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) { > > > > that is merging problem, Ingo should fix that already... indeed. I've fixed it in tip/x86/traps by applying Alexander's patch. Ingo ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] fix: x86: remove cpu_vendor_dev 2008-10-01 6:49 ` Ingo Molnar @ 2008-10-01 7:22 ` Yinghai Lu 2008-10-01 7:36 ` Ingo Molnar 0 siblings, 1 reply; 12+ messages in thread From: Yinghai Lu @ 2008-10-01 7:22 UTC (permalink / raw) To: Ingo Molnar; +Cc: Alexander van Heukelum, LKML On Tue, Sep 30, 2008 at 11:49 PM, Ingo Molnar <mingo@elte.hu> wrote: > > * Yinghai Lu <yinghai@kernel.org> wrote: > >> On Tue, Sep 30, 2008 at 12:37 PM, Alexander van Heukelum >> <heukelum@mailshack.com> wrote: >> > x86_64-kernels after commit 10a434fcb "x86: remove cpu_vendor_dev" >> > crashed on qemu-system-x86_64 due to a typo in vmlinux_64.lds.S. >> > >> > Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm> >> > >> > --- >> > >> > On Tue, Sep 30, 2008 at 06:41:33PM +0200, Alexander van Heukelum wrote: >> >> Moreover, a defconfig won't run :-/ (on qemu-system-x86_64). >> >> Bisection pointed to commit 10a434fcb "x86: remove cpu_vendor_dev". >> >> The kernel crashes early with a general protection fault in a call >> >> to strnlen. I have no idea what goes wrong, yet. >> > >> > It took quite some time, but I found the problem... I'll leave >> > the other one to you ;). >> > >> > Greetings, >> > Alexander >> > >> > arch/x86/kernel/vmlinux_64.lds.S | 2 +- >> > 1 files changed, 1 insertions(+), 1 deletions(-) >> > >> > diff --git a/arch/x86/kernel/vmlinux_64.lds.S b/arch/x86/kernel/vmlinux_64.lds.S >> > index 201e81a..46e0544 100644 >> > --- a/arch/x86/kernel/vmlinux_64.lds.S >> > +++ b/arch/x86/kernel/vmlinux_64.lds.S >> > @@ -172,8 +172,8 @@ SECTIONS >> > .x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) { >> > *(.x86_cpu_dev.init) >> > } >> > - SECURITY_INIT >> > __x86_cpu_dev_end = .; >> > + SECURITY_INIT >> > >> > . = ALIGN(8); >> > .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) { >> > >> >> that is merging problem, Ingo should fix that already... > > indeed. I've fixed it in tip/x86/traps by applying Alexander's patch. > still have merging problem... in tip/master we have __x86_cpu_dev_start = .; .x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) { *(.x86_cpu_dev.init) } __x86_cpu_dev_end = .; SECURITY_INIT DYN_ARRAY_INIT(8) SECURITY_INIT there is two copy of SECURITY_INIT YH ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] fix: x86: remove cpu_vendor_dev 2008-10-01 7:22 ` Yinghai Lu @ 2008-10-01 7:36 ` Ingo Molnar 2008-10-01 14:53 ` Yinghai Lu 0 siblings, 1 reply; 12+ messages in thread From: Ingo Molnar @ 2008-10-01 7:36 UTC (permalink / raw) To: Yinghai Lu; +Cc: Alexander van Heukelum, LKML * Yinghai Lu <yinghai@kernel.org> wrote: > On Tue, Sep 30, 2008 at 11:49 PM, Ingo Molnar <mingo@elte.hu> wrote: > > > > * Yinghai Lu <yinghai@kernel.org> wrote: > > > >> On Tue, Sep 30, 2008 at 12:37 PM, Alexander van Heukelum > >> <heukelum@mailshack.com> wrote: > >> > x86_64-kernels after commit 10a434fcb "x86: remove cpu_vendor_dev" > >> > crashed on qemu-system-x86_64 due to a typo in vmlinux_64.lds.S. > >> > > >> > Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm> > >> > > >> > --- > >> > > >> > On Tue, Sep 30, 2008 at 06:41:33PM +0200, Alexander van Heukelum wrote: > >> >> Moreover, a defconfig won't run :-/ (on qemu-system-x86_64). > >> >> Bisection pointed to commit 10a434fcb "x86: remove cpu_vendor_dev". > >> >> The kernel crashes early with a general protection fault in a call > >> >> to strnlen. I have no idea what goes wrong, yet. > >> > > >> > It took quite some time, but I found the problem... I'll leave > >> > the other one to you ;). > >> > > >> > Greetings, > >> > Alexander > >> > > >> > arch/x86/kernel/vmlinux_64.lds.S | 2 +- > >> > 1 files changed, 1 insertions(+), 1 deletions(-) > >> > > >> > diff --git a/arch/x86/kernel/vmlinux_64.lds.S b/arch/x86/kernel/vmlinux_64.lds.S > >> > index 201e81a..46e0544 100644 > >> > --- a/arch/x86/kernel/vmlinux_64.lds.S > >> > +++ b/arch/x86/kernel/vmlinux_64.lds.S > >> > @@ -172,8 +172,8 @@ SECTIONS > >> > .x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) { > >> > *(.x86_cpu_dev.init) > >> > } > >> > - SECURITY_INIT > >> > __x86_cpu_dev_end = .; > >> > + SECURITY_INIT > >> > > >> > . = ALIGN(8); > >> > .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) { > >> > > >> > >> that is merging problem, Ingo should fix that already... > > > > indeed. I've fixed it in tip/x86/traps by applying Alexander's patch. > > > > still have merging problem... in tip/master we have > > __x86_cpu_dev_start = .; > .x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) { > *(.x86_cpu_dev.init) > } > __x86_cpu_dev_end = .; > SECURITY_INIT > > DYN_ARRAY_INIT(8) > > SECURITY_INIT > > there is two copy of SECURITY_INIT indeed. I fixed this up now. interestingly, this seems to be one of the rare cases where Git auto-merge does the wrong thing - tt should have detected a conflict. Ingo ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] fix: x86: remove cpu_vendor_dev 2008-10-01 7:36 ` Ingo Molnar @ 2008-10-01 14:53 ` Yinghai Lu 0 siblings, 0 replies; 12+ messages in thread From: Yinghai Lu @ 2008-10-01 14:53 UTC (permalink / raw) To: Ingo Molnar; +Cc: Alexander van Heukelum, LKML On Wed, Oct 1, 2008 at 12:36 AM, Ingo Molnar <mingo@elte.hu> wrote: > >> there is two copy of SECURITY_INIT > > indeed. I fixed this up now. > > interestingly, this seems to be one of the rare cases where Git > auto-merge does the wrong thing - tt should have detected a conflict. > should let git guys know that. YH ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 0/4] traps: x86: more unification 2008-09-30 16:41 [PATCH 0/4] traps: x86: more unification Alexander van Heukelum 2008-09-30 16:41 ` [PATCH 1/4] traps: x86_64: split out math_error and simd_math_error Alexander van Heukelum 2008-09-30 19:37 ` [PATCH] fix: x86: remove cpu_vendor_dev Alexander van Heukelum @ 2008-10-01 7:06 ` Ingo Molnar 2 siblings, 0 replies; 12+ messages in thread From: Ingo Molnar @ 2008-10-01 7:06 UTC (permalink / raw) To: Alexander van Heukelum; +Cc: LKML, Yinghai Lu * Alexander van Heukelum <heukelum@fastmail.fm> wrote: > Hi Ingo, > > Here are some more unification patches for traps_xx.c. They > are against the current x86/traps branch in the tip tree and > work fine for my miniconfigs. applied to tip/x86/traps, thanks Alexander! > The branch does not at the moment compile a defconfig kernel, due to a > missing PCI_DEVICE_ID_AMD_10H_NB_MISC define, however. hm, commit 021f8b7 was missing, cf16970 got detached from that commit. I fixed it all up in tip/x86/traps. Ingo ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2008-10-01 14:53 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-09-30 16:41 [PATCH 0/4] traps: x86: more unification Alexander van Heukelum 2008-09-30 16:41 ` [PATCH 1/4] traps: x86_64: split out math_error and simd_math_error Alexander van Heukelum 2008-09-30 16:41 ` [PATCH 2/4] traps: i386: factor out lazy io-bitmap copy Alexander van Heukelum 2008-09-30 16:41 ` [PATCH 3/4] traps: x86: introduce dotraplinkage Alexander van Heukelum 2008-09-30 16:41 ` [PATCH 4/4] traps: x86: converge do_debug handlers Alexander van Heukelum 2008-09-30 19:37 ` [PATCH] fix: x86: remove cpu_vendor_dev Alexander van Heukelum 2008-09-30 20:37 ` Yinghai Lu 2008-10-01 6:49 ` Ingo Molnar 2008-10-01 7:22 ` Yinghai Lu 2008-10-01 7:36 ` Ingo Molnar 2008-10-01 14:53 ` Yinghai Lu 2008-10-01 7:06 ` [PATCH 0/4] traps: x86: more unification Ingo Molnar
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox