Jay Lan wrote:
> 
> I will let Keith to comment on the logic of your code, but this patch
> will cause IA64 compilation to fail because kdb_giveback_vector()
> is not defined for IA64.
> 
> Suggestions:
> 1) change kdb_takeover_vector and kdb_giveback_vector to arch-dependent
>    version of kdba_takeover_vector and kdba_giveback_vector.
> 2) extern of kdba_giveback_vector should be moved to arch-dependent
>    kdb.h (ie, arch/{ia64,x86}/include/asm/kdb.h.) and the ia64 version
>    to be a dummy define.
> 3) kdbmain.c should change accordingly.
Hi Cliff,

Attached below is a revised patch to change your patch with my
suggestions above.

Thanks,
jay




-- Attached file included as plaintext by Ecartis --
-- File: KDB_VECTOR.v2.1

Revised Cliff's KDB_VECTOR patch version 2 to make kdba_takeover_vector
and kdba_giveback_vector arch dependent.

---
 arch/ia64/include/asm/kdb.h   |    2 ++
 arch/x86/kdb/kdbasupport_32.c |   22 ++++++++++++++++++----
 arch/x86/kdb/kdbasupport_64.c |   23 +++++++++++++++++++----
 include/asm-x86/irq_vectors.h |   11 ++++++-----
 include/asm-x86/kdb.h         |    2 ++
 kdb/kdbmain.c                 |    2 ++
 6 files changed, 49 insertions(+), 13 deletions(-)

Index: linux/arch/x86/kdb/kdbasupport_32.c
===================================================================
--- linux.orig/arch/x86/kdb/kdbasupport_32.c    2008-10-29 17:19:18.000000000 
-0700
+++ linux/arch/x86/kdb/kdbasupport_32.c 2008-10-29 17:21:15.944621636 -0700
@@ -883,9 +883,6 @@ kdba_cpu_up(void)
 static int __init
 kdba_arch_init(void)
 {
-#ifdef CONFIG_SMP
-       set_intr_gate(KDB_VECTOR, kdb_interrupt);
-#endif
        set_intr_gate(KDBENTER_VECTOR, kdb_call);
        return 0;
 }
@@ -1027,14 +1024,31 @@ kdba_verify_rw(unsigned long addr, size_
 
 #include <mach_ipi.h>
 
+gate_desc save_idt[NR_VECTORS];
+
+void kdba_takeover_vector(int vector)
+{
+       memcpy(&save_idt[vector], &idt_table[vector], sizeof(gate_desc));
+       set_intr_gate(KDB_VECTOR, kdb_interrupt);
+       return;
+}
+
+void kdba_giveback_vector(int vector)
+{
+       native_write_idt_entry(idt_table, vector, &save_idt[vector]);
+       return;
+}
+
 /* When first entering KDB, try a normal IPI.  That reduces backtrace problems
  * on the other cpus.
  */
 void
 smp_kdb_stop(void)
 {
-       if (!KDB_FLAG(NOIPI))
+       if (!KDB_FLAG(NOIPI)) {
+               kdba_takeover_vector(KDB_VECTOR);
                send_IPI_allbutself(KDB_VECTOR);
+       }
 }
 
 /* The normal KDB IPI handler */
Index: linux/arch/x86/kdb/kdbasupport_64.c
===================================================================
--- linux.orig/arch/x86/kdb/kdbasupport_64.c    2008-10-29 17:19:18.000000000 
-0700
+++ linux/arch/x86/kdb/kdbasupport_64.c 2008-10-29 17:21:15.952621783 -0700
@@ -21,6 +21,7 @@
 #include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/kdebug.h>
+#include <linux/cpumask.h>
 #include <asm/processor.h>
 #include <asm/msr.h>
 #include <asm/uaccess.h>
@@ -900,9 +901,6 @@ kdba_cpu_up(void)
 static int __init
 kdba_arch_init(void)
 {
-#ifdef CONFIG_SMP
-       set_intr_gate(KDB_VECTOR, kdb_interrupt);
-#endif
        set_intr_gate(KDBENTER_VECTOR, kdb_call);
        return 0;
 }
@@ -976,14 +974,31 @@ kdba_set_current_task(const struct task_
 
 #include <mach_ipi.h>
 
+gate_desc save_idt[NR_VECTORS];
+
+void kdba_takeover_vector(int vector)
+{
+       memcpy(&save_idt[vector], &idt_table[vector], sizeof(gate_desc));
+       set_intr_gate(KDB_VECTOR, kdb_interrupt);
+       return;
+}
+
+void kdba_giveback_vector(int vector)
+{
+       native_write_idt_entry(idt_table, vector, &save_idt[vector]);
+       return;
+}
+
 /* When first entering KDB, try a normal IPI.  That reduces backtrace problems
  * on the other cpus.
  */
 void
 smp_kdb_stop(void)
 {
-       if (!KDB_FLAG(NOIPI))
+       if (!KDB_FLAG(NOIPI)) {
+               kdba_takeover_vector(KDB_VECTOR);
                send_IPI_allbutself(KDB_VECTOR);
+       }
 }
 
 /* The normal KDB IPI handler */
Index: linux/include/asm-x86/irq_vectors.h
===================================================================
--- linux.orig/include/asm-x86/irq_vectors.h    2008-10-29 17:19:18.000000000 
-0700
+++ linux/include/asm-x86/irq_vectors.h 2008-10-29 17:22:32.050027567 -0700
@@ -66,7 +66,6 @@
 # define RESCHEDULE_VECTOR             0xfc
 # define CALL_FUNCTION_VECTOR          0xfb
 # define CALL_FUNCTION_SINGLE_VECTOR   0xfa
-#define        KDB_VECTOR                      0xf9
 # define THERMAL_APIC_VECTOR           0xf0
 
 #else
@@ -79,10 +78,6 @@
 #define THERMAL_APIC_VECTOR            0xfa
 #define THRESHOLD_APIC_VECTOR          0xf9
 #define UV_BAU_MESSAGE                 0xf8
-/* Overload KDB_VECTOR with UV_BAU_MESSAGE. By the time the UV hardware is
- * ready, we should have moved to a dynamically allocated vector scheme.
- */
-#define KDB_VECTOR                     0xf8
 #define INVALIDATE_TLB_VECTOR_END      0xf7
 #define INVALIDATE_TLB_VECTOR_START    0xf0    /* f0-f7 used for TLB flush */
 
@@ -91,6 +86,12 @@
 #endif
 
 /*
+ * KDB_VECTOR will take over vector 0xfe when it is needed, as in theory
+ * it should not be used anyway.
+ */
+#define KDB_VECTOR                     0xfe
+
+/*
  * Local APIC timer IRQ vector is on a different priority level,
  * to work around the 'lost local interrupt if more than 2 IRQ
  * sources per level' errata.
Index: linux/kdb/kdbmain.c
===================================================================
--- linux.orig/kdb/kdbmain.c    2008-10-29 17:19:18.000000000 -0700
+++ linux/kdb/kdbmain.c 2008-10-29 17:21:15.988622448 -0700
@@ -1666,6 +1666,8 @@ kdb_wait_for_cpus(void)
                                        wait == 1 ? " is" : "s are",
                                        wait == 1 ? "its" : "their");
        }
+       /* give back the vector we took over in smp_kdb_stop */
+       kdba_giveback_vector(KDB_VECTOR);
 #endif /* CONFIG_SMP */
 }
 
Index: linux/arch/ia64/include/asm/kdb.h
===================================================================
--- linux.orig/arch/ia64/include/asm/kdb.h      2008-10-28 17:17:26.000000000 
-0700
+++ linux/arch/ia64/include/asm/kdb.h   2008-10-29 17:21:16.008622818 -0700
@@ -43,4 +43,6 @@ kdba_funcptr_value(void *fp)
        return *(unsigned long *)fp;
 }
 
+#define kdba_giveback_vector(vector) (0)
+
 #endif /* !_ASM_KDB_H */
Index: linux/include/asm-x86/kdb.h
===================================================================
--- linux.orig/include/asm-x86/kdb.h    2008-10-28 17:17:27.000000000 -0700
+++ linux/include/asm-x86/kdb.h 2008-10-29 17:21:16.028623187 -0700
@@ -133,4 +133,6 @@ kdba_funcptr_value(void *fp)
        return (unsigned long)fp;
 }
 
+extern void kdba_giveback_vector(int);
+
 #endif /* !_ASM_KDB_H */


---------------------------
Use http://oss.sgi.com/ecartis to modify your settings or to unsubscribe.

Reply via email to