diff options
author | Michal Simek <monstr@monstr.eu> | 2009-03-27 09:25:13 -0400 |
---|---|---|
committer | Michal Simek <monstr@monstr.eu> | 2009-03-27 09:25:13 -0400 |
commit | c4df4bc155bbe18fb91800bb9d29499a4fb211ad (patch) | |
tree | f464d6ab47a0ff39e3d4859deba517d2f0d7fe82 /arch/microblaze/include | |
parent | 945ce1bc54e40aa0a659226b6e79a0bce065945f (diff) |
microblaze_v8: exception handling
Reviewed-by: Ingo Molnar <mingo@elte.hu>
Acked-by: Stephen Neuendorffer <stephen.neuendorffer@xilinx.com>
Acked-by: John Linn <john.linn@xilinx.com>
Acked-by: John Williams <john.williams@petalogix.com>
Signed-off-by: Michal Simek <monstr@monstr.eu>
Diffstat (limited to 'arch/microblaze/include')
-rw-r--r-- | arch/microblaze/include/asm/exceptions.h | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/arch/microblaze/include/asm/exceptions.h b/arch/microblaze/include/asm/exceptions.h new file mode 100644 index 000000000000..4cdd2159f470 --- /dev/null +++ b/arch/microblaze/include/asm/exceptions.h | |||
@@ -0,0 +1,96 @@ | |||
1 | /* | ||
2 | * Preliminary support for HW exception handing for Microblaze | ||
3 | * | ||
4 | * Copyright (C) 2008 Michal Simek | ||
5 | * Copyright (C) 2008 PetaLogix | ||
6 | * Copyright (C) 2005 John Williams <jwilliams@itee.uq.edu.au> | ||
7 | * | ||
8 | * This file is subject to the terms and conditions of the GNU General | ||
9 | * Public License. See the file COPYING in the main directory of this | ||
10 | * archive for more details. | ||
11 | */ | ||
12 | |||
13 | #ifndef _ASM_MICROBLAZE_EXCEPTIONS_H | ||
14 | #define _ASM_MICROBLAZE_EXCEPTIONS_H | ||
15 | |||
16 | #ifdef __KERNEL__ | ||
17 | #ifndef __ASSEMBLY__ | ||
18 | |||
19 | /* Macros to enable and disable HW exceptions in the MSR */ | ||
20 | /* Define MSR enable bit for HW exceptions */ | ||
21 | #define HWEX_MSR_BIT (1 << 8) | ||
22 | |||
23 | #if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR | ||
24 | #define __enable_hw_exceptions() \ | ||
25 | __asm__ __volatile__ (" msrset r0, %0; \ | ||
26 | nop;" \ | ||
27 | : \ | ||
28 | : "i" (HWEX_MSR_BIT) \ | ||
29 | : "memory") | ||
30 | |||
31 | #define __disable_hw_exceptions() \ | ||
32 | __asm__ __volatile__ (" msrclr r0, %0; \ | ||
33 | nop;" \ | ||
34 | : \ | ||
35 | : "i" (HWEX_MSR_BIT) \ | ||
36 | : "memory") | ||
37 | #else /* !CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */ | ||
38 | #define __enable_hw_exceptions() \ | ||
39 | __asm__ __volatile__ (" \ | ||
40 | mfs r12, rmsr; \ | ||
41 | nop; \ | ||
42 | ori r12, r12, %0; \ | ||
43 | mts rmsr, r12; \ | ||
44 | nop;" \ | ||
45 | : \ | ||
46 | : "i" (HWEX_MSR_BIT) \ | ||
47 | : "memory", "r12") | ||
48 | |||
49 | #define __disable_hw_exceptions() \ | ||
50 | __asm__ __volatile__ (" \ | ||
51 | mfs r12, rmsr; \ | ||
52 | nop; \ | ||
53 | andi r12, r12, ~%0; \ | ||
54 | mts rmsr, r12; \ | ||
55 | nop;" \ | ||
56 | : \ | ||
57 | : "i" (HWEX_MSR_BIT) \ | ||
58 | : "memory", "r12") | ||
59 | #endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */ | ||
60 | |||
61 | asmlinkage void full_exception(struct pt_regs *regs, unsigned int type, | ||
62 | int fsr, int addr); | ||
63 | |||
64 | #if defined(CONFIG_XMON) | ||
65 | extern void xmon(struct pt_regs *regs); | ||
66 | extern int xmon_bpt(struct pt_regs *regs); | ||
67 | extern int xmon_sstep(struct pt_regs *regs); | ||
68 | extern int xmon_iabr_match(struct pt_regs *regs); | ||
69 | extern int xmon_dabr_match(struct pt_regs *regs); | ||
70 | extern void (*xmon_fault_handler)(struct pt_regs *regs); | ||
71 | |||
72 | void (*debugger)(struct pt_regs *regs) = xmon; | ||
73 | int (*debugger_bpt)(struct pt_regs *regs) = xmon_bpt; | ||
74 | int (*debugger_sstep)(struct pt_regs *regs) = xmon_sstep; | ||
75 | int (*debugger_iabr_match)(struct pt_regs *regs) = xmon_iabr_match; | ||
76 | int (*debugger_dabr_match)(struct pt_regs *regs) = xmon_dabr_match; | ||
77 | void (*debugger_fault_handler)(struct pt_regs *regs); | ||
78 | #elif defined(CONFIG_KGDB) | ||
79 | void (*debugger)(struct pt_regs *regs); | ||
80 | int (*debugger_bpt)(struct pt_regs *regs); | ||
81 | int (*debugger_sstep)(struct pt_regs *regs); | ||
82 | int (*debugger_iabr_match)(struct pt_regs *regs); | ||
83 | int (*debugger_dabr_match)(struct pt_regs *regs); | ||
84 | void (*debugger_fault_handler)(struct pt_regs *regs); | ||
85 | #else | ||
86 | #define debugger(regs) do { } while (0) | ||
87 | #define debugger_bpt(regs) 0 | ||
88 | #define debugger_sstep(regs) 0 | ||
89 | #define debugger_iabr_match(regs) 0 | ||
90 | #define debugger_dabr_match(regs) 0 | ||
91 | #define debugger_fault_handler ((void (*)(struct pt_regs *))0) | ||
92 | #endif | ||
93 | |||
94 | #endif /*__ASSEMBLY__ */ | ||
95 | #endif /* __KERNEL__ */ | ||
96 | #endif /* _ASM_MICROBLAZE_EXCEPTIONS_H */ | ||