sparc32: drop hardcoding trap_level in kgdb_trap
authorSam Ravnborg <sam@ravnborg.org>
Fri, 22 Apr 2016 17:41:03 +0000 (19:41 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 21 May 2016 00:55:41 +0000 (17:55 -0700)
Fix this so we pass the trap_level from the actual trap
code like we do in sparc64.
Add use on ENTRY(), ENDPROC() in the assembler function too.

This fixes a bug where the hardcoded value for trap_level
was the sparc64 value.

As the generic code does not use the trap_level argument
(for sparc32) - this patch does not have any functional impact.

Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/include/asm/head_32.h
arch/sparc/include/asm/kgdb.h
arch/sparc/kernel/entry.S
arch/sparc/kernel/kgdb_32.c

index 5f1dbe315bc81cfe3fb1473f62a39dc1ce106fba..6fc60fd182c41cf2f98496fc9d4fd123478d47a9 100644 (file)
        nop;
 
 #ifdef CONFIG_KGDB
-#define KGDB_TRAP(num) \
-       b kgdb_trap_low; \
-       rd %psr,%l0; \
-       nop; \
+#define KGDB_TRAP(num)                  \
+       mov num, %l7;                   \
+       b kgdb_trap_low;                \
+       rd %psr,%l0;                    \
        nop;
 #else
 #define KGDB_TRAP(num) \
index 47366af7a589736f5e526f23f68d121212b163fa..a6ad7bf84bac4f415aec304b50143c8d9f5b8a67 100644 (file)
@@ -28,10 +28,10 @@ enum regnames {
 #define NUMREGBYTES            ((GDB_CSR + 1) * 4)
 #else
 #define NUMREGBYTES            ((GDB_Y + 1) * 8)
+#endif
 
 struct pt_regs;
 asmlinkage void kgdb_trap(unsigned long trap_level, struct pt_regs *regs);
-#endif
 
 void arch_kgdb_breakpoint(void);
 
index 51aa6e86a5f88f5f8e3fe144f0609679cf365d3d..07918ab3062e1a219ee456593044fb7ee61044e4 100644 (file)
@@ -1225,20 +1225,18 @@ breakpoint_trap:
        RESTORE_ALL
 
 #ifdef CONFIG_KGDB
-       .align  4
-       .globl  kgdb_trap_low
-       .type   kgdb_trap_low,#function
-kgdb_trap_low:
+       ENTRY(kgdb_trap_low)
        rd      %wim,%l3
        SAVE_ALL
        wr      %l0, PSR_ET, %psr
        WRITE_PAUSE
 
+       mov     %l7, %o0                ! trap_level
        call    kgdb_trap
-        add    %sp, STACKFRAME_SZ, %o0
+        add    %sp, STACKFRAME_SZ, %o1 ! struct pt_regs *regs
 
        RESTORE_ALL
-       .size   kgdb_trap_low,.-kgdb_trap_low
+       ENDPROC(kgdb_trap_low)
 #endif
 
        .align  4
index dcf210811af4ef343099724cfa569ac7f0ca8ba5..5d0a323878c942be46cd07b85d7a29aeb4086fab 100644 (file)
@@ -135,19 +135,19 @@ int kgdb_arch_handle_exception(int e_vector, int signo, int err_code,
 
 extern void do_hw_interrupt(struct pt_regs *regs, unsigned long type);
 
-asmlinkage void kgdb_trap(struct pt_regs *regs)
+asmlinkage void kgdb_trap(unsigned long trap_level, struct pt_regs *regs)
 {
        unsigned long flags;
 
        if (user_mode(regs)) {
-               do_hw_interrupt(regs, 0xfd);
+               do_hw_interrupt(regs, trap_level);
                return;
        }
 
        flushw_all();
 
        local_irq_save(flags);
-       kgdb_handle_exception(0x172, SIGTRAP, 0, regs);
+       kgdb_handle_exception(trap_level, SIGTRAP, 0, regs);
        local_irq_restore(flags);
 }