diff options
Diffstat (limited to 'arch/microblaze')
-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); |