/* Breakpoint stuff */
 struct bpt {
        unsigned long   address;
-       unsigned int    instr[2];
+       unsigned int    *instr;
        atomic_t        ref_count;
        int             enabled;
        unsigned long   pad;
 
 #define BP_NUM(bp)     ((bp) - bpts + 1)
 
+#define BPT_SIZE       (sizeof(unsigned int) * 2)
+#define BPT_WORDS      (BPT_SIZE / sizeof(unsigned int))
+static unsigned int bpt_table[NBPTS * BPT_WORDS];
+
 /* Prototypes */
 static int cmds(struct pt_regs *);
 static int mread(unsigned long, void *, int);
 {
        unsigned long off;
 
-       off = nip - (unsigned long) bpts;
-       if (off >= sizeof(bpts))
+       off = nip - (unsigned long)bpt_table;
+       if (off >= sizeof(bpt_table))
                return NULL;
-       off %= sizeof(struct bpt);
-       if (off != offsetof(struct bpt, instr[0])
-           && off != offsetof(struct bpt, instr[1]))
+       *offp = off % BPT_SIZE;
+       if (*offp != 0 && *offp != 4)
                return NULL;
-       *offp = off - offsetof(struct bpt, instr[0]);
-       return (struct bpt *) (nip - off);
+       return bpts + (off / BPT_SIZE);
 }
 
 static struct bpt *new_breakpoint(unsigned long a)
        for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
                if (!bp->enabled && atomic_read(&bp->ref_count) == 0) {
                        bp->address = a;
-                       patch_instruction(&bp->instr[1], bpinstr);
+                       bp->instr = bpt_table + ((bp - bpts) * BPT_WORDS);
+                       patch_instruction(bp->instr + 1, bpinstr);
                        return bp;
                }
        }