Sergei Shtylyov wrote:
> Since it doesn't make sense both to set kgdb_may_fault flag before setting up
> the jump buffer and to resotre the preempt count if a fault hasn't happened,
> get rid of kgdb_[un]set_may_fault() introducing the inline wrapper around
> kgdb_fault_setjmp() call to enable the kernel faults and save/restore the
> preempt count if the preemption is enabled (removing kgdb_fault_preempt_count
> global variable at the same time) and directly clearing kgdb_may_fault on the
> normal, non-faulted exit path from the memory manipulation functions...
>
> Also, while at it, do some more cleanups:
>
> - add newlines after block declarations;
>
> - get rid of unneeded braces;
>
I liked the unneeded braces. I know it's not popular
in the Linux community. We has some very good
programmers back at Siemens in Germany that
advocated using unneeded braces and I think I
bought into their point of view. Just looks much
easier to read for me now that I'm use to it.
Sigh.
> - clean up grammar/style in comments...
>
> Signed-off-by: Sergei Shtylyov <[EMAIL PROTECTED]>
>
> ---
> Just remembered that I intended to add newlines after block decrations. :-)
> The patch is against the linux_2_6_21_uprev branch as usual...
>
> kernel/kgdb.c | 120
> +++++++++++++++++++++++++++++++---------------------------
> 1 files changed, 65 insertions(+), 55 deletions(-)
>
> Index: linux-2.6/kernel/kgdb.c
> ===================================================================
> --- linux-2.6.orig/kernel/kgdb.c
> +++ linux-2.6/kernel/kgdb.c
> @@ -10,6 +10,7 @@
> * Copyright (C) 2004-2006 Tom Rini <[EMAIL PROTECTED]>
> * Copyright (C) 2004-2006 LinSysSoft Technologies Pvt. Ltd.
> * Copyright (C) 2005-2007 Wind River Systems, Inc.
> + * Copyright (C) 2007 MontaVista Software, Inc.
> *
> * Contributors at various stages not listed above:
> * Jason Wessel ( [EMAIL PROTECTED] )
> @@ -65,12 +66,9 @@ extern int pid_max;
> int kgdb_initialized;
> /* Is a host GDB connected to us? */
> int kgdb_connected;
> -/* Could we be about to try and access a bad memory location? If so we
> - * also need to flag this has happend. */
> +/* Could we be about to try and access a bad memory location?
> + * If so we also need to flag this has happened. */
> int kgdb_may_fault;
> -#ifdef CONFIG_PREEMPT
> -static int kgdb_fault_preempt_count;
> -#endif
>
> /* All the KGDB handlers are installed */
> int kgdb_from_module_registered = 0;
> @@ -196,6 +194,7 @@ static void get_packet(char *buffer)
> unsigned char xmitcsum;
> int count;
> char ch;
> +
> if (!kgdb_io_ops.read_char)
> return;
> do {
> @@ -235,20 +234,6 @@ static void get_packet(char *buffer)
> } while (checksum != xmitcsum);
> }
>
> -static void kgdb_set_may_fault(void) {
> - kgdb_may_fault = 1;
> -#ifdef CONFIG_PREEMPT
> - kgdb_fault_preempt_count = preempt_count();
> -#endif
> -}
> -
> -static void kgdb_unset_may_fault(void) {
> - kgdb_may_fault = 0;
> -#ifdef CONFIG_PREEMPT
> - preempt_count() = kgdb_fault_preempt_count;
> -#endif
> -}
> -
> /*
> * Send the packet in buffer.
> * Check for gdb connection if asked for.
> @@ -303,21 +288,48 @@ 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.
> + * Wrap kgdb_fault_setjmp() call to enable the kernel faults and save/restore
> + * the state before/after a fault has happened.
> + * Note that it *must* be inline to work correctly.
> + */
> +static inline int fault_setjmp(void)
> +{
> +#ifdef CONFIG_PREEMPT
> + int count = preempt_count();
> +#endif
> +
> + /*
> + * kgdb_fault_setjmp() returns 0 after the jump buffer has been setup,
> + * and non-zero when an expected kernel fault has happened.
> + */
> + if (kgdb_fault_setjmp(kgdb_fault_jmp_regs) == 0) {
> + kgdb_may_fault = 1;
> + return 0;
> + } else {
> +#ifdef CONFIG_PREEMPT
> + preempt_count() = count;
> +#endif
> + kgdb_may_fault = 0;
> + return 1;
> + }
> +}
> +
> +/*
> + * 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.
> */
> char *kgdb_mem2hex(char *mem, char *buf, int count)
> {
> - kgdb_set_may_fault();
> - if ((kgdb_fault_setjmp(kgdb_fault_jmp_regs)) != 0) {
> - kgdb_unset_may_fault();
> + if (fault_setjmp() != 0)
> return ERR_PTR(-EINVAL);
> - }
> - /* Accessing some registers in a single load instruction is
> +
> + /*
> + * Accessing some registers in a single load instruction is
> * required to avoid bad side effects for some I/O registers.
> */
> if ((count == 2) && (((long)mem & 1) == 0)) {
> unsigned short tmp_s = *(unsigned short *)mem;
> +
> mem += 2;
> #ifdef __BIG_ENDIAN
> *buf++ = hexchars[(tmp_s >> 12) & 0xf];
> @@ -332,6 +344,7 @@ char *kgdb_mem2hex(char *mem, char *buf,
> #endif
> } else if ((count == 4) && (((long)mem & 3) == 0)) {
> unsigned long tmp_l = *(unsigned int *)mem;
> +
> mem += 4;
> #ifdef __BIG_ENDIAN
> *buf++ = hexchars[(tmp_l >> 28) & 0xf];
> @@ -355,6 +368,7 @@ char *kgdb_mem2hex(char *mem, char *buf,
> #ifdef CONFIG_64BIT
> } else if ((count == 8) && (((long)mem & 7) == 0)) {
> unsigned long long tmp_ll = *(unsigned long long *)mem;
> +
> mem += 8;
> #ifdef __BIG_ENDIAN
> *buf++ = hexchars[(tmp_ll >> 60) & 0xf];
> @@ -392,14 +406,14 @@ char *kgdb_mem2hex(char *mem, char *buf,
> *buf++ = hexchars[(tmp_ll >> 56) & 0xf];
> #endif
> #endif
> - } else {
> + } else
> while (count-- > 0) {
> unsigned char ch = *mem++;
> +
> *buf++ = hexchars[ch >> 4];
> *buf++ = hexchars[ch & 0xf];
> }
> - }
> - kgdb_unset_may_fault();
> + kgdb_may_fault = 0;
> *buf = 0;
> return (buf);
> }
> @@ -411,35 +425,32 @@ char *kgdb_mem2hex(char *mem, char *buf,
> */
> static char *kgdb_ebin2mem(char *buf, char *mem, int count)
> {
> - kgdb_set_may_fault();
> - if ((kgdb_fault_setjmp(kgdb_fault_jmp_regs)) != 0) {
> - kgdb_unset_may_fault();
> + if (fault_setjmp() != 0)
> return ERR_PTR(-EINVAL);
> - }
> - for (; count > 0; count--, buf++) {
> +
> + for (; count > 0; count--, buf++)
> if (*buf == 0x7d)
> *mem++ = *(++buf) ^ 0x20;
> else
> *mem++ = *buf;
> - }
> - kgdb_unset_may_fault();
> +
> + kgdb_may_fault = 0;
> return mem;
> }
>
> /*
> - * convert the hex array pointed to by buf into binary to be placed in mem
> - * return a pointer to the character AFTER the last byte written
> + * Convert the hex array pointed to by buf into binary to be placed in mem.
> + * Return a pointer to the character AFTER the last byte written.
> * May return an error.
> */
> char *kgdb_hex2mem(char *buf, char *mem, int count)
> {
> - kgdb_set_may_fault();
> - if ((kgdb_fault_setjmp(kgdb_fault_jmp_regs)) != 0) {
> - kgdb_unset_may_fault();
> + if (fault_setjmp() != 0)
> return ERR_PTR(-EINVAL);
> - }
> +
> if ((count == 2) && (((long)mem & 1) == 0)) {
> unsigned short tmp_s = 0;
> +
> #ifdef __BIG_ENDIAN
> tmp_s |= hex(*buf++) << 12;
> tmp_s |= hex(*buf++) << 8;
> @@ -455,6 +466,7 @@ char *kgdb_hex2mem(char *buf, char *mem,
> mem += 2;
> } else if ((count == 4) && (((long)mem & 3) == 0)) {
> unsigned long tmp_l = 0;
> +
> #ifdef __BIG_ENDIAN
> tmp_l |= hex(*buf++) << 28;
> tmp_l |= hex(*buf++) << 24;
> @@ -478,13 +490,15 @@ char *kgdb_hex2mem(char *buf, char *mem,
> mem += 4;
> } else {
> int i;
> +
> for (i = 0; i < count; i++) {
> unsigned char ch = hex(*buf++) << 4;
> +
> ch |= hex(*buf++);
> *mem++ = ch;
> }
> }
> - kgdb_unset_may_fault();
> + kgdb_may_fault = 0;
> return (mem);
> }
>
> @@ -639,39 +653,35 @@ static void kgdb_wait(struct pt_regs *re
>
> int kgdb_get_mem(char *addr, unsigned char *buf, int count)
> {
> - kgdb_set_may_fault();
> - if ((kgdb_fault_setjmp(kgdb_fault_jmp_regs)) != 0) {
> - kgdb_unset_may_fault();
> + if (fault_setjmp() != 0)
> return -EINVAL;
> - }
> +
> while (count) {
> if ((unsigned long)addr < TASK_SIZE) {
> - kgdb_unset_may_fault();
> + kgdb_may_fault = 0;
> return -EINVAL;
> }
> *buf++ = *addr++;
> count--;
> }
> - kgdb_unset_may_fault();
> + kgdb_may_fault = 0;
> return 0;
> }
>
> int kgdb_set_mem(char *addr, unsigned char *buf, int count)
> {
> - kgdb_set_may_fault();
> - if ((kgdb_fault_setjmp(kgdb_fault_jmp_regs)) != 0) {
> - kgdb_unset_may_fault();
> + if (fault_setjmp() != 0)
> return -EINVAL;
> - }
> +
> while (count) {
> if ((unsigned long)addr < TASK_SIZE) {
> - kgdb_unset_may_fault();
> + kgdb_may_fault = 0;
> return -EINVAL;
> }
> *addr++ = *buf++;
> count--;
> }
> - kgdb_unset_may_fault();
> + kgdb_may_fault = 0;
> return 0;
> }
> int kgdb_activate_sw_breakpoints(void)
>
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Splunk Inc.
> Still grepping through log files to find problems? Stop.
> Now Search log events and configuration files using AJAX and a browser.
> Download your FREE copy of Splunk now >> http://get.splunk.com/
> _______________________________________________
> Kgdb-bugreport mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/kgdb-bugreport
>
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Kgdb-bugreport mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/kgdb-bugreport