9 #define LFLUSH_I_AND_D 0x00000808
12 /* process bits for task_struct.flags */
13 #define PF_TRACESYS_OFF 3
14 #define PF_TRACESYS_BIT 5
15 #define PF_PTRACED_OFF 3
16 #define PF_PTRACED_BIT 4
17 #define PF_DTRACE_OFF 1
18 #define PF_DTRACE_BIT 5
21 * NOTE! The single-stepping code assumes that all interrupt handlers
22 * start by saving SYSCFG on the stack with their first instruction.
25 /* This one is used for exceptions, emulation, and NMI. It doesn't push
26 RETI and doesn't do cli. */
27 #define SAVE_ALL_SYS save_context_no_interrupts
28 /* This is used for all normal interrupts. It saves a minimum of registers
29 to the stack, loads the IRQ number, and jumps to common code. */
31 # define LOAD_IPIPE_IPEND \
36 # define LOAD_IPIPE_IPEND
39 #ifndef CONFIG_EXACT_HWERR
40 /* As a debugging aid - we save IPEND when DEBUG_KERNEL is on,
41 * otherwise it is a waste of cycles.
43 # ifndef CONFIG_DEBUG_KERNEL
44 #define INTERRUPT_ENTRY(N) \
46 [--sp] = P0; /*orig_p0*/ \
47 [--sp] = R0; /*orig_r0*/ \
48 [--sp] = (R7:0,P5:0); \
51 jump __common_int_entry;
52 # else /* CONFIG_DEBUG_KERNEL */
53 #define INTERRUPT_ENTRY(N) \
55 [--sp] = P0; /*orig_p0*/ \
56 [--sp] = R0; /*orig_r0*/ \
57 [--sp] = (R7:0,P5:0); \
63 jump __common_int_entry;
64 # endif /* CONFIG_DEBUG_KERNEL */
66 /* For timer interrupts, we need to save IPEND, since the user_mode
67 *macro accesses it to determine where to account time.
69 #define TIMER_INTERRUPT_ENTRY(N) \
71 [--sp] = P0; /*orig_p0*/ \
72 [--sp] = R0; /*orig_r0*/ \
73 [--sp] = (R7:0,P5:0); \
78 jump __common_int_entry;
79 #else /* CONFIG_EXACT_HWERR is defined */
81 /* if we want hardware error to be exact, we need to do a SSYNC (which forces
82 * read/writes to complete to the memory controllers), and check to see that
83 * caused a pending HW error condition. If so, we assume it was caused by user
84 * space, by setting the same interrupt that we are in (so it goes off again)
85 * and context restore, and a RTI (without servicing anything). This should
86 * cause the pending HWERR to fire, and when that is done, this interrupt will
87 * be re-serviced properly.
88 * As you can see by the code - we actually need to do two SSYNCS - one to
89 * make sure the read/writes complete, and another to make sure the hardware
90 * error is recognized by the core.
92 #define INTERRUPT_ENTRY(N) \
96 [--sp] = P0; /*orig_p0*/ \
97 [--sp] = R0; /*orig_r0*/ \
98 [--sp] = (R7:0,P5:0); \
103 CC = BITTST(R0, EVT_IVHW_P); \
111 jump __common_int_entry; \
114 (R7:0, P5:0) = [SP++]; \
120 #define TIMER_INTERRUPT_ENTRY(N) \
124 [--sp] = P0; /*orig_p0*/ \
125 [--sp] = R0; /*orig_r0*/ \
126 [--sp] = (R7:0,P5:0); \
131 CC = BITTST(R0, EVT_IVHW_P); \
138 jump __common_int_entry; \
141 (R7:0, P5:0) = [SP++]; \
146 #endif /* CONFIG_EXACT_HWERR */
148 /* This one pushes RETI without using CLI. Interrupts are enabled. */
149 #define SAVE_CONTEXT_SYSCALL save_context_syscall
150 #define SAVE_CONTEXT save_context_with_interrupts
151 #define SAVE_CONTEXT_CPLB save_context_cplb
153 #define RESTORE_ALL_SYS restore_context_no_interrupts
154 #define RESTORE_CONTEXT restore_context_with_interrupts
155 #define RESTORE_CONTEXT_CPLB restore_context_cplb
157 #endif /* __ASSEMBLY__ */
158 #endif /* __BFIN_ENTRY_H */