x86,kgdb: Add low level debug hook
[sfrench/cifs-2.6.git] / include / linux / kgdb.h
index 19ec41a183f58f0e82c2a5a9fa840c2a11b2b6fb..19d1b29a26947bd81c8302d334f0fe349f19febf 100644 (file)
 #include <linux/serial_8250.h>
 #include <linux/linkage.h>
 #include <linux/init.h>
-
 #include <asm/atomic.h>
+#ifdef CONFIG_HAVE_ARCH_KGDB
 #include <asm/kgdb.h>
+#endif
 
+#ifdef CONFIG_KGDB
 struct pt_regs;
 
 /**
@@ -33,20 +35,6 @@ struct pt_regs;
  */
 extern int kgdb_skipexception(int exception, struct pt_regs *regs);
 
-/**
- *     kgdb_post_primary_code - (optional) Save error vector/code numbers.
- *     @regs: Original pt_regs.
- *     @e_vector: Original error vector.
- *     @err_code: Original error code.
- *
- *     This is usually needed on architectures which support SMP and
- *     KGDB.  This function is called after all the secondary cpus have
- *     been put to a know spin state and the primary CPU has control over
- *     KGDB.
- */
-extern void kgdb_post_primary_code(struct pt_regs *regs, int e_vector,
-                                 int err_code);
-
 /**
  *     kgdb_disable_hw_debug - (optional) Disable hardware debugging hook
  *     @regs: Current &struct pt_regs.
@@ -72,6 +60,7 @@ struct uart_port;
 void kgdb_breakpoint(void);
 
 extern int kgdb_connected;
+extern int kgdb_io_module_registered;
 
 extern atomic_t                        kgdb_setting_breakpoint;
 extern atomic_t                        kgdb_cpu_doing_single_step;
@@ -202,6 +191,17 @@ kgdb_arch_handle_exception(int vector, int signo, int err_code,
  */
 extern void kgdb_roundup_cpus(unsigned long flags);
 
+/**
+ *     kgdb_arch_set_pc - Generic call back to the program counter
+ *     @regs: Current &struct pt_regs.
+ *  @pc: The new value for the program counter
+ *
+ *     This function handles updating the program counter and requires an
+ *     architecture specific implementation.
+ */
+extern void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long pc);
+
+
 /* Optional functions. */
 extern int kgdb_validate_break_address(unsigned long addr);
 extern int kgdb_arch_set_breakpoint(unsigned long addr, char *saved_instr);
@@ -264,6 +264,7 @@ extern unsigned long __weak kgdb_arch_pc(int exception, struct pt_regs *regs);
 
 extern int kgdb_register_io_module(struct kgdb_io *local_kgdb_io_ops);
 extern void kgdb_unregister_io_module(struct kgdb_io *local_kgdb_io_ops);
+extern struct kgdb_io *dbg_io_ops;
 
 extern int kgdb_hex2long(char **ptr, unsigned long *long_val);
 extern int kgdb_mem2hex(char *mem, char *buf, int count);
@@ -278,5 +279,9 @@ extern int kgdb_nmicallback(int cpu, void *regs);
 
 extern int                     kgdb_single_step;
 extern atomic_t                        kgdb_active;
-
+#define in_dbg_master() \
+       (raw_smp_processor_id() == atomic_read(&kgdb_active))
+#else /* ! CONFIG_KGDB */
+#define in_dbg_master() (0)
+#endif /* ! CONFIG_KGDB */
 #endif /* _KGDB_H_ */