diff options
author | Stephen Rothwell <sfr@canb.auug.org.au> | 2009-05-29 11:25:18 +1000 |
---|---|---|
committer | Stephen Rothwell <sfr@canb.auug.org.au> | 2009-05-29 11:25:18 +1000 |
commit | a21c8ea96682dd55daa07c8350c5ffb59fcada1f (patch) | |
tree | e36b67ccf3fb56cdf2c38de5387566de0b559806 | |
parent | 94c99ae30bf1d8de39e47eb052dd47c86adaaefc (diff) | |
parent | 98ddb33cecfe5752836a3359148ec0469617c8b6 (diff) |
Merge commit 'kgdb/kgdb-next'
-rw-r--r-- | arch/x86/kernel/kgdb.c | 9 | ||||
-rw-r--r-- | include/linux/kgdb.h | 48 | ||||
-rw-r--r-- | kernel/kgdb.c | 6 |
3 files changed, 52 insertions, 11 deletions
diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c index 8d82a77a3f3b..8352c0b9643f 100644 --- a/arch/x86/kernel/kgdb.c +++ b/arch/x86/kernel/kgdb.c @@ -85,10 +85,15 @@ void pt_regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *regs) gdb_regs[GDB_DS] = regs->ds; gdb_regs[GDB_ES] = regs->es; gdb_regs[GDB_CS] = regs->cs; - gdb_regs[GDB_SS] = __KERNEL_DS; gdb_regs[GDB_FS] = 0xFFFF; gdb_regs[GDB_GS] = 0xFFFF; - gdb_regs[GDB_SP] = (int)®s->sp; + if (user_mode_vm(regs)) { + gdb_regs[GDB_SS] = regs->ss; + gdb_regs[GDB_SP] = regs->sp; + } else { + gdb_regs[GDB_SS] = __KERNEL_DS; + gdb_regs[GDB_SP] = (unsigned long)®s->sp; + } #else gdb_regs[GDB_R8] = regs->r8; gdb_regs[GDB_R9] = regs->r9; diff --git a/include/linux/kgdb.h b/include/linux/kgdb.h index 6adcc297e354..cedae0b71192 100644 --- a/include/linux/kgdb.h +++ b/include/linux/kgdb.h @@ -29,8 +29,7 @@ struct pt_regs; * * 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 - * for kgdb. + * This can be implemented in the architecture specific portion of kgdb. */ extern int kgdb_skipexception(int exception, struct pt_regs *regs); @@ -65,7 +64,7 @@ struct uart_port; /** * kgdb_breakpoint - compiled in breakpoint * - * This will be impelmented a static inline per architecture. This + * 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. * @@ -190,7 +189,7 @@ kgdb_arch_handle_exception(int vector, int signo, int err_code, * @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 @@ -267,8 +266,45 @@ 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 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); + +/** + * kgdb_mem2hex - (optional arch override) translate bin to hex chars + * @mem: source buffer + * @buf: target buffer + * @count: number of bytes in mem + * + * Architectures which do not support probe_kernel_(read|write), + * can make an alternate implementation of this function. + * This function safely reads memory into hex + * characters for use with the kgdb protocol. + */ +extern int __weak kgdb_mem2hex(char *mem, char *buf, int count); + +/** + * kgdb_hex2mem - (optional arch override) translate hex chars to bin + * @buf: source buffer + * @mem: target buffer + * @count: number of bytes in mem + * + * Architectures which do not support probe_kernel_(read|write), + * can make an alternate implementation of this function. + * This function safely writes hex characters into memory + * for use with the kgdb protocol. + */ +extern int __weak kgdb_hex2mem(char *buf, char *mem, int count); + +/** + * kgdb_ebin2mem - (optional arch override) Copy binary array from @buf into @mem + * @buf: source buffer + * @mem: target buffer + * @count: number of bytes in mem + * + * Architectures which do not support probe_kernel_(read|write), + * can make an alternate implementation of this function. + * This function safely copies binary array into memory + * for use with the kgdb protocol. + */ +extern int __weak kgdb_ebin2mem(char *buf, char *mem, int count); extern int kgdb_isremovedbreak(unsigned long addr); diff --git a/kernel/kgdb.c b/kernel/kgdb.c index 9147a3190c9d..6a90eb6c2b67 100644 --- a/kernel/kgdb.c +++ b/kernel/kgdb.c @@ -363,7 +363,7 @@ static void put_packet(char *buffer) * Convert the memory pointed to by mem into hex, placing result in buf. * Return a pointer to the last char put in buf (null). May return an error. */ -int kgdb_mem2hex(char *mem, char *buf, int count) +int __weak kgdb_mem2hex(char *mem, char *buf, int count) { char *tmp; int err; @@ -393,7 +393,7 @@ int kgdb_mem2hex(char *mem, char *buf, int count) * 0x7d escaped with 0x7d. Return a pointer to the character after * the last byte written. */ -static int kgdb_ebin2mem(char *buf, char *mem, int count) +int __weak kgdb_ebin2mem(char *buf, char *mem, int count) { int err = 0; char c; @@ -418,7 +418,7 @@ static int kgdb_ebin2mem(char *buf, char *mem, int count) * Return a pointer to the character AFTER the last byte written. * May return an error. */ -int kgdb_hex2mem(char *buf, char *mem, int count) +int __weak kgdb_hex2mem(char *buf, char *mem, int count) { char *tmp_raw; char *tmp_hex; |