48 ********************************************************************/ |
48 ********************************************************************/ |
49 |
49 |
50 __NAKED__ void SyborgInterrupt::MsTimerTick(TAny* /*aPtr*/) |
50 __NAKED__ void SyborgInterrupt::MsTimerTick(TAny* /*aPtr*/) |
51 { |
51 { |
52 // Service 1ms tick interrupt |
52 // Service 1ms tick interrupt |
53 asm("ldr r1, __KHwCounterTimer"); |
53 asm("ldr r1, =KHwCounterTimer"); |
54 asm("push {r0}"); |
54 asm("push {r0}"); |
55 asm("mov r0, #1"); |
55 asm("mov r0, #1"); |
56 asm("str r0, [r1, #24]"); |
56 asm("str r0, [r1, #24]"); |
57 asm("pop {r0}"); |
57 asm("pop {r0}"); |
58 asm("b "CSM_ZN7NTimerQ4TickEv); |
58 asm("b "CSM_ZN7NTimerQ4TickEv); |
59 asm("bx lr"); |
59 asm("bx lr"); |
60 |
|
61 asm("__KHwCounterTimer:"); |
|
62 asm(".word %a0" : : "i" ((TInt)KHwBaseCounterTimer)); |
|
63 } |
60 } |
64 |
61 |
65 /******************************************************************** |
62 /******************************************************************** |
66 * Interrupt handling/dispatch |
63 * Interrupt handling/dispatch |
67 ********************************************************************/ |
64 ********************************************************************/ |
70 // Must preserve r4-r11 |
67 // Must preserve r4-r11 |
71 // Uses r4,r5,r12 |
68 // Uses r4,r5,r12 |
72 __NAKED__ void SyborgInterrupt::IrqDispatch() |
69 __NAKED__ void SyborgInterrupt::IrqDispatch() |
73 { |
70 { |
74 asm("push {r4,r5,lr} "); |
71 asm("push {r4,r5,lr} "); |
75 asm("ldr r4, __KHwBaseSic"); |
72 asm("ldr r4, =KHwBaseSic"); |
76 asm("ldr r12, __SicHandlerStart"); |
73 asm("ldr r12, =Handlers"); |
77 asm("ldr r5, [r4, #8]"); // r5 - pending interrupt |
74 asm("ldr r5, [r4, #8]"); // r5 - pending interrupt |
78 asm("adr lr, Clear"); |
75 asm("adr lr, Clear"); |
79 asm("add r12, r5, lsl #3"); |
76 asm("add r12, r5, lsl #3"); |
80 asm("ldm r12, {r0, pc}"); |
77 asm("ldm r12, {r0, pc}"); |
81 |
78 |
82 asm("Clear:"); |
79 asm("Clear:"); |
83 // asm("str r5, [r4, #16]"); // TODO: error |
80 // asm("str r5, [r4, #16]"); // TODO: error |
84 asm("pop {r4,r5,pc}"); |
81 asm("pop {r4,r5,pc}"); |
85 |
82 |
86 asm("__KHwBaseSic:"); |
|
87 asm(".word %a0" : : "i" ((TInt)KHwBaseSic)); |
|
88 asm("__SicHandlerStart:"); |
|
89 asm(".word %a0" : : "i" ((TInt)&Handlers[0])); |
|
90 } |
83 } |
91 |
84 |
92 __NAKED__ void SyborgInterrupt::FiqDispatch() |
85 __NAKED__ void SyborgInterrupt::FiqDispatch() |
93 { |
86 { |
94 // FIQ dispatcher |
87 // FIQ dispatcher |