Merge branch 'linus' into cont_syslog
[safe/jmp/linux-2.6] / include / linux / kgdb.h
index b0985b7..9340f34 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;
 
-/*
- *     kgdb_skipexception - Bail out of KGDB when we've been triggered.
+/**
+ *     kgdb_skipexception - (optional) exit kgdb_handle_exception early
  *     @exception: Exception vector number
  *     @regs: Current &struct pt_regs.
  *
- *     On some architectures we need to skip a breakpoint exception when
- *     it occurs after a breakpoint has been removed.
+ *     On some architectures it is required to skip a breakpoint
+ *     exception when it occurs after a breakpoint has been removed.
+ *     This can be implemented in the architecture specific portion of kgdb.
  */
 extern int kgdb_skipexception(int exception, struct pt_regs *regs);
 
-/*
- *     kgdb_post_primary_code - Save error vector/code numbers.
- *     @regs: Original pt_regs.
- *     @e_vector: Original error vector.
- *     @err_code: Original error code.
- *
- *     This is 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 - Disable hardware debugging while we in kgdb.
+/**
+ *     kgdb_disable_hw_debug - (optional) Disable hardware debugging hook
  *     @regs: Current &struct pt_regs.
  *
  *     This function will be called if the particular architecture must
@@ -59,10 +49,18 @@ struct tasklet_struct;
 struct task_struct;
 struct uart_port;
 
-/* To enter the debugger explicitly. */
+/**
+ *     kgdb_breakpoint - compiled in breakpoint
+ *
+ *     This will be implemented as a static inline per architecture.  This
+ *     function is called by the kgdb core to execute an architecture
+ *     specific trap to cause kgdb to enter the exception processing.
+ *
+ */
 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;
@@ -102,7 +100,7 @@ struct kgdb_bkpt {
  * Functions each KGDB-supporting architecture must provide:
  */
 
-/*
+/**
  *     kgdb_arch_init - Perform any architecture specific initalization.
  *
  *     This function will handle the initalization of any architecture
@@ -110,7 +108,7 @@ struct kgdb_bkpt {
  */
 extern int kgdb_arch_init(void);
 
-/*
+/**
  *     kgdb_arch_exit - Perform any architecture specific uninitalization.
  *
  *     This function will handle the uninitalization of any architecture
@@ -118,7 +116,7 @@ extern int kgdb_arch_init(void);
  */
 extern void kgdb_arch_exit(void);
 
-/*
+/**
  *     pt_regs_to_gdb_regs - Convert ptrace regs to GDB regs
  *     @gdb_regs: A pointer to hold the registers in the order GDB wants.
  *     @regs: The &struct pt_regs of the current process.
@@ -128,7 +126,7 @@ extern void kgdb_arch_exit(void);
  */
 extern void pt_regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *regs);
 
-/*
+/**
  *     sleeping_thread_to_gdb_regs - Convert ptrace regs to GDB regs
  *     @gdb_regs: A pointer to hold the registers in the order GDB wants.
  *     @p: The &struct task_struct of the desired process.
@@ -143,7 +141,7 @@ extern void pt_regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *regs);
 extern void
 sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p);
 
-/*
+/**
  *     gdb_regs_to_pt_regs - Convert GDB regs to ptrace regs.
  *     @gdb_regs: A pointer to hold the registers we've received from GDB.
  *     @regs: A pointer to a &struct pt_regs to hold these values in.
@@ -153,7 +151,7 @@ sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p);
  */
 extern void gdb_regs_to_pt_regs(unsigned long *gdb_regs, struct pt_regs *regs);
 
-/*
+/**
  *     kgdb_arch_handle_exception - Handle architecture specific GDB packets.
  *     @vector: The error vector of the exception that happened.
  *     @signo: The signal number of the exception that happened.
@@ -175,12 +173,12 @@ kgdb_arch_handle_exception(int vector, int signo, int err_code,
                           char *remcom_out_buffer,
                           struct pt_regs *regs);
 
-/*
+/**
  *     kgdb_roundup_cpus - Get other CPUs into a holding pattern
  *     @flags: Current IRQ state
  *
  *     On SMP systems, we need to get the attention of the other CPUs
- *     and get them be in a known state.  This should do what is needed
+ *     and get them into a known state.  This should do what is needed
  *     to get the other CPUs to call kgdb_wait(). Note that on some arches,
  *     the NMI approach is not used for rounding up all the CPUs. For example,
  *     in case of MIPS, smp_call_function() is used to roundup CPUs. In
@@ -193,12 +191,34 @@ 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);
 extern int kgdb_arch_remove_breakpoint(unsigned long addr, char *bundle);
 
-/*
+/**
+ *     kgdb_arch_late - Perform any architecture specific initalization.
+ *
+ *     This function will handle the late initalization of any
+ *     architecture specific callbacks.  This is an optional function for
+ *     handling things like late initialization of hw breakpoints.  The
+ *     default implementation does nothing.
+ */
+extern void kgdb_arch_late(void);
+
+
+/**
  * struct kgdb_arch - Describe architecture specific values.
  * @gdb_bpt_instr: The instruction to trigger a breakpoint.
  * @flags: Flags for the breakpoint, currently just %KGDB_HW_BREAKPOINT.
@@ -227,7 +247,7 @@ struct kgdb_arch {
        void    (*correct_hw_break)(void);
 };
 
-/*
+/**
  * struct kgdb_io - Describe the interface for an I/O driver to talk with KGDB.
  * @name: Name of the I/O driver.
  * @read_char: Pointer to a function that will return one char.
@@ -238,6 +258,8 @@ struct kgdb_arch {
  * the I/O driver.
  * @post_exception: Pointer to a function that will do any cleanup work
  * for the I/O driver.
+ * @is_console: 1 if the end device is a console 0 if the I/O device is
+ * not a console
  */
 struct kgdb_io {
        const char              *name;
@@ -247,18 +269,23 @@ struct kgdb_io {
        int                     (*init) (void);
        void                    (*pre_exception) (void);
        void                    (*post_exception) (void);
+       int                     is_console;
 };
 
 extern struct kgdb_arch                arch_kgdb_ops;
 
+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, long *long_val);
+extern int kgdb_hex2long(char **ptr, unsigned long *long_val);
 extern int kgdb_mem2hex(char *mem, char *buf, int count);
 extern int kgdb_hex2mem(char *buf, char *mem, int count);
 
 extern int kgdb_isremovedbreak(unsigned long addr);
+extern void kgdb_schedule_breakpoint(void);
 
 extern int
 kgdb_handle_exception(int ex_vector, int signo, int err_code,
@@ -267,5 +294,12 @@ 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))
+extern bool dbg_is_early;
+extern void __init dbg_late_init(void);
+#else /* ! CONFIG_KGDB */
+#define in_dbg_master() (0)
+#define dbg_late_init()
+#endif /* ! CONFIG_KGDB */
 #endif /* _KGDB_H_ */