diff options
| -rw-r--r-- | arch/microblaze/kernel/entry.S | 30 | ||||
| -rw-r--r-- | arch/microblaze/kernel/exceptions.c | 8 |
2 files changed, 19 insertions, 19 deletions
diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S index 397754cd31c9..5a5cb5842938 100644 --- a/arch/microblaze/kernel/entry.S +++ b/arch/microblaze/kernel/entry.S | |||
| @@ -778,19 +778,22 @@ C_ENTRY(_debug_exception): | |||
| 778 | 778 | ||
| 779 | addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */ | 779 | addik r1, r1, -STATE_SAVE_SIZE; /* Make room on the stack. */ |
| 780 | SAVE_REGS; | 780 | SAVE_REGS; |
| 781 | swi r17, r1, PTO+PT_R17; | ||
| 782 | swi r16, r1, PTO+PT_R16; | ||
| 783 | swi r16, r1, PTO+PT_PC; /* Save LP */ | ||
| 781 | 784 | ||
| 782 | swi r0, r1, PTO + PT_MODE; /* Was in user-mode. */ | 785 | swi r0, r1, PTO + PT_MODE; /* Was in user-mode. */ |
| 783 | lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); | 786 | lwi r11, r0, TOPHYS(PER_CPU(ENTRY_SP)); |
| 784 | swi r11, r1, PTO+PT_R1; /* Store user SP. */ | 787 | swi r11, r1, PTO+PT_R1; /* Store user SP. */ |
| 785 | 2: | 788 | 2: lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); |
| 786 | tovirt(r1,r1) | 789 | tovirt(r1,r1) |
| 787 | 790 | ||
| 788 | set_vms; | 791 | set_vms; |
| 789 | addi r5, r0, SIGTRAP /* send the trap signal */ | 792 | addik r5, r1, PTO; |
| 790 | add r6, r0, CURRENT_TASK; /* Get current task ptr into r11 */ | ||
| 791 | addk r7, r0, r0 /* 3rd param zero */ | ||
| 792 | dbtrap_call: rtbd r0, send_sig; | ||
| 793 | addik r15, r0, dbtrap_call; | 793 | addik r15, r0, dbtrap_call; |
| 794 | dbtrap_call: /* return point for kernel/user entry */ | ||
| 795 | rtbd r0, sw_exception | ||
| 796 | nop | ||
| 794 | 797 | ||
| 795 | set_bip; /* Ints masked for state restore*/ | 798 | set_bip; /* Ints masked for state restore*/ |
| 796 | lwi r11, r1, PTO + PT_MODE; | 799 | lwi r11, r1, PTO + PT_MODE; |
| @@ -838,6 +841,8 @@ dbtrap_call: rtbd r0, send_sig; | |||
| 838 | tophys(r1,r1); | 841 | tophys(r1,r1); |
| 839 | 842 | ||
| 840 | RESTORE_REGS | 843 | RESTORE_REGS |
| 844 | lwi r17, r1, PTO+PT_R17; | ||
| 845 | lwi r16, r1, PTO+PT_R16; | ||
| 841 | addik r1, r1, STATE_SAVE_SIZE /* Clean up stack space. */ | 846 | addik r1, r1, STATE_SAVE_SIZE /* Clean up stack space. */ |
| 842 | 847 | ||
| 843 | 848 | ||
| @@ -854,11 +859,10 @@ dbtrap_call: rtbd r0, send_sig; | |||
| 854 | tovirt(r1,r1); | 859 | tovirt(r1,r1); |
| 855 | 6: | 860 | 6: |
| 856 | DBTRAP_return: /* Make global symbol for debugging */ | 861 | DBTRAP_return: /* Make global symbol for debugging */ |
| 857 | rtbd r14, 0; /* Instructions to return from an IRQ */ | 862 | rtbd r16, 0; /* Instructions to return from an IRQ */ |
| 858 | nop; | 863 | nop; |
| 859 | 864 | ||
| 860 | 865 | ||
| 861 | |||
| 862 | ENTRY(_switch_to) | 866 | ENTRY(_switch_to) |
| 863 | /* prepare return value */ | 867 | /* prepare return value */ |
| 864 | addk r3, r0, CURRENT_TASK | 868 | addk r3, r0, CURRENT_TASK |
| @@ -946,13 +950,6 @@ ENTRY(_switch_to) | |||
| 946 | ENTRY(_reset) | 950 | ENTRY(_reset) |
| 947 | brai 0x70; /* Jump back to FS-boot */ | 951 | brai 0x70; /* Jump back to FS-boot */ |
| 948 | 952 | ||
| 949 | ENTRY(_break) | ||
| 950 | mfs r5, rmsr | ||
| 951 | swi r5, r0, 0x250 + TOPHYS(r0_ram) | ||
| 952 | mfs r5, resr | ||
| 953 | swi r5, r0, 0x254 + TOPHYS(r0_ram) | ||
| 954 | bri 0 | ||
| 955 | |||
| 956 | /* These are compiled and loaded into high memory, then | 953 | /* These are compiled and loaded into high memory, then |
| 957 | * copied into place in mach_early_setup */ | 954 | * copied into place in mach_early_setup */ |
| 958 | .section .init.ivt, "ax" | 955 | .section .init.ivt, "ax" |
| @@ -964,12 +961,9 @@ ENTRY(_break) | |||
| 964 | nop | 961 | nop |
| 965 | brai TOPHYS(_user_exception); /* syscall handler */ | 962 | brai TOPHYS(_user_exception); /* syscall handler */ |
| 966 | brai TOPHYS(_interrupt); /* Interrupt handler */ | 963 | brai TOPHYS(_interrupt); /* Interrupt handler */ |
| 967 | brai TOPHYS(_break); /* nmi trap handler */ | 964 | brai TOPHYS(_debug_exception); /* debug trap handler */ |
| 968 | brai TOPHYS(_hw_exception_handler); /* HW exception handler */ | 965 | brai TOPHYS(_hw_exception_handler); /* HW exception handler */ |
| 969 | 966 | ||
| 970 | .org 0x60 | ||
| 971 | brai TOPHYS(_debug_exception); /* debug trap handler*/ | ||
| 972 | |||
| 973 | .section .rodata,"a" | 967 | .section .rodata,"a" |
| 974 | #include "syscall_table.S" | 968 | #include "syscall_table.S" |
| 975 | 969 | ||
diff --git a/arch/microblaze/kernel/exceptions.c b/arch/microblaze/kernel/exceptions.c index 02cbdfe5aa8d..e0c6f8c2bd9d 100644 --- a/arch/microblaze/kernel/exceptions.c +++ b/arch/microblaze/kernel/exceptions.c | |||
| @@ -48,6 +48,12 @@ void die(const char *str, struct pt_regs *fp, long err) | |||
| 48 | do_exit(err); | 48 | do_exit(err); |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | /* for user application debugging */ | ||
| 52 | void sw_exception(struct pt_regs *regs) | ||
| 53 | { | ||
| 54 | _exception(SIGTRAP, regs, TRAP_BRKPT, regs->r16); | ||
| 55 | } | ||
| 56 | |||
| 51 | void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr) | 57 | void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr) |
| 52 | { | 58 | { |
| 53 | siginfo_t info; | 59 | siginfo_t info; |
| @@ -143,7 +149,7 @@ asmlinkage void full_exception(struct pt_regs *regs, unsigned int type, | |||
| 143 | #ifdef CONFIG_MMU | 149 | #ifdef CONFIG_MMU |
| 144 | case MICROBLAZE_PRIVILEGED_EXCEPTION: | 150 | case MICROBLAZE_PRIVILEGED_EXCEPTION: |
| 145 | pr_debug(KERN_WARNING "Privileged exception\n"); | 151 | pr_debug(KERN_WARNING "Privileged exception\n"); |
| 146 | /* "brk r0,r0" - used as debug breakpoint */ | 152 | /* "brk r0,r0" - used as debug breakpoint - old toolchain */ |
| 147 | if (get_user(code, (unsigned long *)regs->pc) == 0 | 153 | if (get_user(code, (unsigned long *)regs->pc) == 0 |
| 148 | && code == 0x980c0000) { | 154 | && code == 0x980c0000) { |
| 149 | _exception(SIGTRAP, regs, TRAP_BRKPT, addr); | 155 | _exception(SIGTRAP, regs, TRAP_BRKPT, addr); |
