linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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 = &current->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 = &current->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, &divide_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 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

* 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

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;
as well as URLs for NNTP newsgroup(s).