Subversion Repositories HelenOS

Rev

Rev 2341 | Rev 2355 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2341 Rev 2344
Line 57... Line 57...
57
extern uintptr_t exc_stack;
57
extern uintptr_t exc_stack;
58
 
58
 
59
 
59
 
60
inline static void setup_stack_and_save_regs()
60
inline static void setup_stack_and_save_regs()
61
{
61
{
-
 
62
/*
-
 
63
 
-
 
64
str r0, =exc_stack
-
 
65
str r1, =exc_stack + 4
-
 
66
mrs r0, cpsr
-
 
67
mrs r1, spsr
-
 
68
and r0, r0, #0x1f
-
 
69
and r1, r1, #0x1f
-
 
70
cmp r0, r1
-
 
71
be 3f
-
 
72
@different exception mode => preserve sp
-
 
73
ldr r1, [=exc_stack + 4]
-
 
74
ldr r0, [=exc_stack]
-
 
75
 
-
 
76
3:
-
 
77
mrs r0, spsr
-
 
78
stmfd sp!, {r0, sp, lr}
-
 
79
*/
-
 
80
   
62
asm volatile(   "ldr r13, =exc_stack        \n\
81
asm volatile("ldr r13, =exc_stack       \n\
63
    stmfd r13!, {r0}            \n\
82
    stmfd r13!, {r0}            \n\
64
    mrs r0, spsr                \n\
83
    mrs r0, spsr                \n\
65
    and r0, r0, #0x1f           \n\
84
    and r0, r0, #0x1f           \n\
66
    cmp r0, #0x10               \n\
85
    cmp r0, #0x10               \n\
67
    bne 1f                  \n\
86
    bne 1f                  \n\
Line 247... Line 266...
247
 
266
 
248
/** Low-level Interrupt Exception handler. */
267
/** Low-level Interrupt Exception handler. */
249
static void irq_exception_entry()
268
static void irq_exception_entry()
250
{
269
{
251
    asm("sub lr, lr, #4");
270
    asm("sub lr, lr, #4");
-
 
271
    setup_stack_and_save_regs();
-
 
272
 
-
 
273
    /* switch to Undefined mode */
-
 
274
    asm("stmfd sp!, {r0-r3}");
-
 
275
    asm("mov r1, sp");
-
 
276
    asm("mov r2, lr");
-
 
277
//  asm("mrs r3, spsr");
-
 
278
    asm("mrs r0, cpsr");
-
 
279
    asm("bic r0, r0, #0x1f");
-
 
280
    asm("orr r0, r0, #0x1b");
-
 
281
    asm("msr cpsr_c, r0");
-
 
282
    asm("mov sp, r1");
-
 
283
    asm("mov lr, r2");
-
 
284
//  asm("msr spsr, r3");
-
 
285
    asm("ldmfd sp!, {r0-r3}");
-
 
286
 
252
    PROCESS_EXCEPTION(EXC_IRQ);
287
    CALL_EXC_DISPATCH(EXC_IRQ)
-
 
288
 
-
 
289
    load_regs();
253
}
290
}
254
 
291
 
255
 
292
 
256
/** Software Interrupt handler.
293
/** Software Interrupt handler.
257
 *
294
 *