On Thu, Dec 10, 2009 at 01:57:21PM -0200, Dave Kleikamp wrote:
>diff --git a/arch/powerpc/include/asm/processor.h 
>b/arch/powerpc/include/asm/processor.h
>index 9eed29e..1393307 100644
>--- a/arch/powerpc/include/asm/processor.h
>+++ b/arch/powerpc/include/asm/processor.h
>@@ -161,9 +161,35 @@ struct thread_struct {
> #ifdef CONFIG_PPC32
>       void            *pgdir;         /* root of page-table tree */
> #endif
>-#if defined(CONFIG_4xx) || defined (CONFIG_BOOKE)
>-      unsigned long   dbcr0;          /* debug control register values */
>+#if defined(CONFIG_40x) || defined(CONFIG_BOOKE)
>+      /*
>+       * The following help to manage the use of Debug Control Registers
>+       * om the BookE platforms.
>+       */
>+      unsigned long   dbcr0;
>       unsigned long   dbcr1;
>+      unsigned long   dbcr2;

This is wrong for 405.  405 only has dbcr0 and dbcr1.  I don't see why you'd
change the #define values to be more explicit and then include things that
don't make sense.

>+      /*
>+       * The stored value of the DBSR register will be the value at the
>+       * last debug interrupt. This register can only be read from the
>+       * user (will never be written to) and has value while helping to
>+       * describe the reason for the last debug trap.  Torez
>+       */
>+      unsigned long   dbsr;
>+      /*
>+       * The following will contain addresses used by debug applications
>+       * to help trace and trap on particular address locations.
>+       * The bits in the Debug Control Registers above help define which
>+       * of the following registers will contain valid data and/or addresses.
>+       */
>+      unsigned long   iac1;
>+      unsigned long   iac2;
>+      unsigned long   iac3;
>+      unsigned long   iac4;
>+      unsigned long   dac1;
>+      unsigned long   dac2;
>+      unsigned long   dvc1;
>+      unsigned long   dvc2;
> #endif

Without digging much, I'm wondering if we could just use a pointer to a debug
register structure here instead of growing struct thread more.

>       /* FP and VSX 0-31 register set */
>       double          fpr[32][TS_FPRWIDTH];
>diff --git a/arch/powerpc/include/asm/reg_booke.h 
>b/arch/powerpc/include/asm/reg_booke.h
>index 3bf7835..7f8c71f 100644
>--- a/arch/powerpc/include/asm/reg_booke.h
>+++ b/arch/powerpc/include/asm/reg_booke.h
>@@ -248,6 +248,8 @@
> #define DBSR_RET      0x00008000      /* Return Debug Event */
> #define DBSR_CIRPT    0x00000040      /* Critical Interrupt Taken Event */
> #define DBSR_CRET     0x00000020      /* Critical Return Debug Event */
>+#define DBSR_IAC12ATS 0x00000002      /* Instr Address Compare 1/2 Toggle */
>+#define DBSR_IAC34ATS 0x00000001      /* Instr Address Compare 3/4 Toggle */
> #endif
> #ifdef CONFIG_40x
> #define DBSR_IC               0x80000000      /* Instruction Completion */
>@@ -294,25 +296,68 @@
> #define DBCR0_IC      0x08000000      /* Instruction Completion */
> #define DBCR0_ICMP    DBCR0_IC
> #define DBCR0_BT      0x04000000      /* Branch Taken */
>-#define DBCR0_BRT     DBCR0_BT
> #define DBCR0_EDE     0x02000000      /* Exception Debug Event */
> #define DBCR0_IRPT    DBCR0_EDE
> #define DBCR0_TDE     0x01000000      /* TRAP Debug Event */
>-#define DBCR0_IA1     0x00800000      /* Instr Addr compare 1 enable */
>-#define DBCR0_IAC1    DBCR0_IA1
>-#define DBCR0_IA2     0x00400000      /* Instr Addr compare 2 enable */
>-#define DBCR0_IAC2    DBCR0_IA2
>-#define DBCR0_IA12    0x00200000      /* Instr Addr 1-2 range enable */
>-#define DBCR0_IA12X   0x00100000      /* Instr Addr 1-2 range eXclusive */
>-#define DBCR0_IA3     0x00080000      /* Instr Addr compare 3 enable */
>-#define DBCR0_IAC3    DBCR0_IA3
>-#define DBCR0_IA4     0x00040000      /* Instr Addr compare 4 enable */
>-#define DBCR0_IAC4    DBCR0_IA4
>-#define DBCR0_IA34    0x00020000      /* Instr Addr 3-4 range Enable */
>-#define DBCR0_IA34X   0x00010000      /* Instr Addr 3-4 range eXclusive */
>-#define DBCR0_IA12T   0x00008000      /* Instr Addr 1-2 range Toggle */
>-#define DBCR0_IA34T   0x00004000      /* Instr Addr 3-4 range Toggle */
>+#define DBCR0_IAC1    0x00800000      /* Instr Addr compare 1 enable */
>+#define DBCR0_IAC2    0x00400000      /* Instr Addr compare 2 enable */
>+#define DBCR0_IAC12M  0x00300000      /* Instr Addr 1-2 range enable */
>+#define DBCR0_IAC12M_R        0x00100000      /* Instr Addr 1-2 Reserved 
>state */
>+#define DBCR0_IAC12M_I        0x00200000      /* Instr Addr 1-2 range 
>Inclusive */
>+#define DBCR0_IAC12M_X        0x00300000      /* Instr Addr 1-2 range 
>eXclusive */
>+#define DBCR0_IAC3    0x00080000      /* Instr Addr compare 3 enable */
>+#define DBCR0_IAC4    0x00040000      /* Instr Addr compare 4 enable */
>+#define DBCR0_IAC34   0x00020000      /* Instr Addr 3-4 range Enable */
>+#define DBCR0_IAC34X  0x00010000      /* Instr Addr 3-4 range eXclusive */
>+#define DBCR0_IAC12T  0x00008000      /* Instr Addr 1-2 range Toggle */
>+#define DBCR0_IAC34T  0x00004000      /* Instr Addr 3-4 range Toggle */

A lot of this seems to just be cleanup... would it be possible to factor out
the cleanup parts so that the additions are easier to review?

> #define DBCR0_FT      0x00000001      /* Freeze Timers on debug event */
>+
>+#define DBCR0_USER_DEBUG      (DBCR0_IDM | DBCR0_ICMP | DBCR0_IAC1 | \
>+                               DBCR0_IAC2 | DBCR0_IAC3 | DBCR0_IAC4)
>+#define DBCR0_BASE_REG_VALUE  0
>+
>+#define dbcr_iac_range(task)  ((task)->thread.dbcr0)
>+#define DBCR_IAC12M   DBCR0_IAC12M
>+#define DBCR_IAC12M_I DBCR0_IAC12M_I
>+#define DBCR_IAC12M_X DBCR0_IAC12M_X
>+#define DBCR_IAC34M   DBCR0_IAC34M
>+#define DBCR_IAC34M_I DBCR0_IAC34M_I
>+#define DBCR_IAC34M_X DBCR0_IAC34M_X
>+
>+/* Bit definitions related to the DBCR1. */
>+#define DBCR1_D1R     0x80000000      /* DAC1 Read Debug Event */
>+#define DBCR1_DAC1R   DBCR1_D1R
>+#define DBCR1_D2R     0x40000000      /* DAC2 Read Debug Event */
>+#define DBCR1_DAC2R   DBCR1_D2R
>+#define DBCR1_D1W     0x20000000      /* DAC1 Write Debug Event */
>+#define DBCR1_DAC1W   DBCR1_D1W
>+#define DBCR1_D2W     0x10000000      /* DAC2 Write Debug Event */
>+#define DBCR1_DAC2W   DBCR1_D2W
>+
>+#define DBCR1_USER_DEBUG      (DBCR1_DAC1R | DBCR1_DAC2R | DBCR1_DAC1W | \
>+                               DBCR1_DAC2W)
>+#define DBCR1_BASE_REG_VALUE  0
>+
>+#define dbcr_dac(task)        ((task)->thread.dbcr1)
>+#define DBCR_DAC1R    DBCR1_DAC1R
>+#define DBCR_DAC1W    DBCR1_DAC1W
>+#define DBCR_DAC2R    DBCR1_DAC2R
>+#define DBCR_DAC2W    DBCR1_DAC2W
>+
>+#define DBCR2_USER_DEBUG      0
>+#define DBCR2_BASE_REG_VALUE  0

Why are these defined for 405?

>+/*
>+ * Are there any active Debug Events represented in the
>+ * Debug Control Registers?
>+ */
>+#define DBCR0_ACTIVE_EVENTS   (DBCR0_ICMP | DBCR0_IAC1 | DBCR0_IAC2 | \
>+                               DBCR0_IAC3 | DBCR0_IAC4)
>+#define DBCR1_ACTIVE_EVENTS   (DBCR1_D1R | DBCR1_D2R | DBCR1_D1W | DBCR1_D2W)
>+#define DBCR_ACTIVE_EVENTS(dbcr0, dbcr1)  (((dbcr0) & DBCR0_ACTIVE_EVENTS) || 
>\
>+                                         ((dbcr1) & DBCR1_ACTIVE_EVENTS))
>+
> #elif defined(CONFIG_BOOKE)
> #define DBCR0_EDM     0x80000000      /* External Debug Mode */
> #define DBCR0_IDM     0x40000000      /* Internal Debug Mode */
>@@ -324,8 +369,7 @@
> #define DBCR0_RST_NONE        0x00000000      /* No Reset */
> #define DBCR0_ICMP    0x08000000      /* Instruction Completion */
> #define DBCR0_IC      DBCR0_ICMP
>-#define DBCR0_BRT     0x04000000      /* Branch Taken */
>-#define DBCR0_BT      DBCR0_BRT
>+#define DBCR0_BT      0x04000000      /* Branch Taken */

This seems like just cleanup of DBCR0_BRT?

> #define DBCR0_IRPT    0x02000000      /* Exception Debug Event */
> #define DBCR0_TDE     0x01000000      /* TRAP Debug Event */
> #define DBCR0_TIE     DBCR0_TDE
>@@ -342,19 +386,99 @@
> #define DBCR0_CRET    0x00000020      /* Critical Return Debug Event */
> #define DBCR0_FT      0x00000001      /* Freeze Timers on debug event */
>
>+#define DBCR0_USER_DEBUG      (DBCR0_IDM | DBCR0_ICMP | DBCR0_IAC1 | \
>+                               DBCR0_IAC2 | DBCR0_IAC3 | DBCR0_IAC4 | \
>+                               DBCR0_DAC1R | DBCR0_DAC1W  | DBCR0_DAC2R | \
>+                               DBCR0_DAC2W)
>+#define DBCR0_BASE_REG_VALUE  0
>+
>+#define dbcr_dac(task)        ((task)->thread.dbcr0)
>+#define DBCR_DAC1R    DBCR0_DAC1R
>+#define DBCR_DAC1W    DBCR0_DAC1W
>+#define DBCR_DAC2R    DBCR0_DAC2R
>+#define DBCR_DAC2W    DBCR0_DAC2W
>+
> /* Bit definitions related to the DBCR1. */

I'll try to review these a bit later.  Changing #defines makes for hard patch
review :)

josh
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to