From: NIIBE Y. <gn...@ch...> - 2000-06-02 08:28:16
|
GDB is not yet working. But here's the changes needed. I'll commit this on tomorrow or Sunday, if there's no problem. 2000-06-02 NIIBE Yutaka <gn...@m1...> * arch/sh/kernel/entry.S (Throughout): Use ".align 2" instead of ".balign 4". (debug_kernel): Renamed from "debug". (debug_trap): Implemented. (system_call): Call debug_trap. * arch/sh/kernel/process.c (break_point_trap_software): New function. (break_point_trap): Define arguments. * arch/sh/kernel/entry.S (system_call): Push/Pop registers against syscall_trace, those may be clobbered. Index: arch/sh/kernel/entry.S =================================================================== RCS file: /cvsroot/linuxsh/kernel/arch/sh/kernel/entry.S,v retrieving revision 1.10 diff -u -r1.10 entry.S --- arch/sh/kernel/entry.S 2000/04/30 23:33:47 1.10 +++ arch/sh/kernel/entry.S 2000/06/02 08:13:29 @@ -127,7 +127,7 @@ or $r11, $r10; \ ldc $r10, $sr - .balign 4 + .align 2 tlb_miss_load: mov.l 2f, $r0 mov.l @$r0, $r6 @@ -137,7 +137,7 @@ jmp @$r0 mov #0, $r5 - .balign 4 + .align 2 tlb_miss_store: mov.l 2f, $r0 mov.l @$r0, $r6 @@ -147,7 +147,7 @@ jmp @$r0 mov #1, $r5 - .balign 4 + .align 2 initial_page_write: mov.l 2f, $r0 mov.l @$r0, $r6 @@ -157,7 +157,7 @@ jmp @$r0 mov #1, $r5 - .balign 4 + .align 2 tlb_protection_violation_load: mov.l 2f, $r0 mov.l @$r0, $r6 @@ -167,7 +167,7 @@ jmp @$r0 mov #0, $r5 - .balign 4 + .align 2 tlb_protection_violation_store: mov.l 2f, $r0 mov.l @$r0, $r6 @@ -177,14 +177,14 @@ jmp @$r0 mov #1, $r5 - .balign 4 + .align 2 1: .long SYMBOL_NAME(do_page_fault) 2: .long MMU_TEA #ifdef CONFIG_DEBUG_KERNEL_WITH_GDB_STUB - .balign 4 + .align 2 /* Unwind the stack and jmp to the debug entry */ -debug: +debug_kernel: mov.l @$r15+, $r0 mov.l @$r15+, $r1 mov.l @$r15+, $r2 @@ -216,19 +216,36 @@ mov.l 2f, $k0 jmp @$k0 ldc $k1, $ssr - .balign 4 + .align 2 1: .long 0x300000f0 2: .long 0xa0000100 #endif - .balign 4 + .align 2 +debug_trap: +#ifdef CONFIG_DEBUG_KERNEL_WITH_GDB_STUB + mov #SR, $r0 + mov.l @($r0,$r15), $r0 ! get status register + shll $r0 + shll $r0 ! kernel space? + bt/s debug_kernel +#endif + mov.l @$r15, $r0 + mov.l 1f, $r8 + jmp @$r8 + nop + + .align 2 +1: .long SYMBOL_NAME(break_point_trap_software) + + .align 2 error: ! STI() mov.l 1f, $r0 jmp @$r0 nop - .balign 4 + .align 2 1: .long SYMBOL_NAME(do_exception_error) badsys: mov #-ENOSYS, $r0 @@ -263,13 +280,11 @@ mov.l 1f, $r9 mov.l @$r9, $r8 ! -#ifdef CONFIG_DEBUG_KERNEL_WITH_GDB_STUB mov #0x20, $r9 extu.b $r9, $r9 shll2 $r9 cmp/hs $r9, $r8 - bt debug -#endif + bt debug_trap ! mov #SYSCALL_NR, $r14 add $r15, $r14 @@ -318,9 +333,27 @@ ! Trace system call mov #-ENOSYS, $r11 mov.l $r11, @(R0,$r15) + ! Push up $R0--$R2, and $R4--$R7 + mov.l $r0, @-$r15 + mov.l $r1, @-$r15 + mov.l $r2, @-$r15 + mov.l $r4, @-$r15 + mov.l $r5, @-$r15 + mov.l $r6, @-$r15 + mov.l $r7, @-$r15 + ! mov.l 2f, $r11 jsr @$r11 nop + ! Pop down $R0--$R2, and $R4--$R7 + mov.l @$r15+, $r7 + mov.l @$r15+, $r6 + mov.l @$r15+, $r5 + mov.l @$r15+, $r4 + mov.l @$r15+, $r2 + mov.l @$r15+, $r1 + mov.l @$r15+, $r0 + ! mov.l __syscall_ret_trace, $r10 bra 6f lds $r10, $pr @@ -337,7 +370,7 @@ nop ! In case of trace - .balign 4 + .align 2 3: #ifdef COMPAT_OLD_SYSCALL_ABI add $r8, $r15 ! pop off the arguments @@ -347,7 +380,7 @@ mova SYMBOL_NAME(ret_from_syscall), $r0 jmp @$r1 lds $r0, $pr - .balign 4 + .align 2 1: .long TRA 2: .long SYMBOL_NAME(syscall_trace) __n_sys: .long NR_syscalls @@ -366,18 +399,18 @@ .previous .section __ex_table, "a" - .balign 4 + .align 2 .long 4b,fixup_syscall_argerr .previous #endif - .balign 4 + .align 2 reschedule: mova SYMBOL_NAME(ret_from_syscall), $r0 mov.l 1f, $r1 jmp @$r1 lds $r0, $pr - .balign 4 + .align 2 1: .long SYMBOL_NAME(schedule) ENTRY(ret_from_irq) @@ -401,11 +434,11 @@ STI() bra ret_from_syscall nop - .balign 4 + .align 2 __INV_IMASK: .long 0xffffff0f ! ~(IMASK) - .balign 4 + .align 2 syscall_ret: #ifdef COMPAT_OLD_SYSCALL_ABI add $r8, $r15 ! pop off the arguments @@ -438,7 +471,7 @@ mova restore_all, $r0 jmp @$r1 lds $r0, $pr - .balign 4 + .align 2 __do_signal: .long SYMBOL_NAME(do_signal) __softirq_state: @@ -446,7 +479,7 @@ __do_softirq: .long SYMBOL_NAME(do_softirq) - .balign 4 + .align 2 restore_all: #if defined(__SH4__) mov.l __fpu_prepare_fd, $r0 @@ -554,7 +587,7 @@ rte nop - .balign 4 + .align 2 __blrb_flags: .long 0x30000000 #if defined(__SH4__) __fpu_prepare_fd: @@ -582,7 +615,7 @@ mov.l 2f, $k3 bra handle_exception mov.l @$k2, $k2 - .balign 4 + .align 2 2: .long SYMBOL_NAME(ret_from_exception) 1: .long EXPEVT ! @@ -601,7 +634,7 @@ bra handle_exception mov.l @$k2, $k2 - .balign 4 + .align 2 1: .long EXPEVT 2: .long INTEVT 3: .long SYMBOL_NAME(ret_from_irq) @@ -707,7 +740,7 @@ mov.l @$r9, $r9 jmp @$r9 nop - .balign 4 + .align 2 1: .long SYMBOL_NAME(exception_handling_table) 2: .long 0x00008000 ! FD=1 3: .long 0x000000f0 ! FD=0, IMASK=15 Index: arch/sh/kernel/process.c =================================================================== RCS file: /cvsroot/linuxsh/kernel/arch/sh/kernel/process.c,v retrieving revision 1.8 diff -u -r1.8 process.c --- arch/sh/kernel/process.c 2000/04/28 17:58:50 1.8 +++ arch/sh/kernel/process.c 2000/06/02 08:13:29 @@ -384,11 +384,21 @@ restore_flags(flags); } -asmlinkage void break_point_trap(void) +asmlinkage void break_point_trap(unsigned long r4, unsigned long r5, + unsigned long r6, unsigned long r7, + struct pt_regs regs) { - /* Clear traicng. */ + /* Clear tracing. */ ctrl_outw(0, UBC_BBRA); ctrl_outw(0, UBC_BBRB); + force_sig(SIGTRAP, current); +} + +asmlinkage void break_point_trap_software(unsigned long r4, unsigned long r5, + unsigned long r6, unsigned long r7, + struct pt_regs regs) +{ + regs.pc -= 2; force_sig(SIGTRAP, current); } |