📄 swi_handler.lst
字号:
1 # 1 "Compil/srcWinARM/swi_handler.S"
2 # 1 "<built-in>"
1 /*****************************************************************************
0
0
2 * swi_handler.s: SWI handler file ARM
3 * tested with ARM77TDMI and ARM77TDMI-S
4 *
5 * by Martin Thomas
6 * http://www.siwawi.arubi.uni-kl.de/avr_projects
7 * based on information from ARM documents
8 *
9 *****************************************************************************/
10
11 /*
12 20060902 - SWI-handler in section .init if vectors in ROM
13 SWI-handler in section .fastrun if vectors in RAM
14 */
15
16
17 #include "swi_numbers.h"
1 #ifndef SWI_NUM_
2 #define SWI_NUM_
3
4 /*
5 .set SWI_IRQ_DIS, 0
6 .set SWI_IRQ_EN, 1
7 .set SWI_FIQ_DIS, 2
8 .set SWI_FIQ_EN, 3
9 .set SWI_GET_CPSR, 4
10 .set SWI_IRQ_REST, 5
11 .set SWI_FIQ_REST, 6
12 */
13
14 #define SWI_NUM_IRQ_DIS 0
15 #define SWI_NUM_IRQ_EN 1
16 #define SWI_NUM_FIQ_DIS 2
17 #define SWI_NUM_FIQ_EN 3
18 #define SWI_NUM_GET_CPSR 4
18
19 .set SWI_IRQ_DIS, SWI_NUM_IRQ_DIS
20 .set SWI_IRQ_EN, SWI_NUM_IRQ_EN
21 .set SWI_FIQ_DIS, SWI_NUM_FIQ_DIS
22 .set SWI_FIQ_EN, SWI_NUM_FIQ_EN
23 .set SWI_GET_CPSR, SWI_NUM_GET_CPSR
24 .set SWI_IRQ_REST, SWI_NUM_IRQ_REST
25 .set SWI_FIQ_REST, SWI_NUM_FIQ_REST
26
27 .set I_Bit, 0x80
28 .set F_Bit, 0x40
29 .set T_Bit, 0x20
30
31 #ifdef ROM_RUN
32 #ifdef VECTORS_IN_RAM
33 .set VECTREMAPPED, 1
34 #else
35 .set VECTREMAPPED, 0
36 #endif
37 #endif
38
39 #ifdef RAM_RUN
40 .set VECTREMAPPED, 0
41 #endif
42
43
44 .text
45 .arm
46
47 /* Handler located in RAM if exception-vector in RAM */
48 .if (VECTREMAPPED)
49 .print "SWI-Handler in section .fastrun -> .data"
50 .section .fastrun, "ax"
51 .else
52 .print "SWI-Handler in section .init -> .text"
53 .section .init, "ax"
54 .endif
55
56
57 /* for external c-function (dummy provided at EOF if no
58 c-function should be used) */
59 .extern SWI_Handler_User
60
61
62 .global SoftwareInterruptASM
63 .func SoftwareInterruptASM
64 SoftwareInterruptASM:
65 0000 10402DE9 STMFD sp!, {r4, lr} /* store regs. */
66 0004 00404FE1 MRS r4, spsr
67 0008 200014E3 TST r4, #T_Bit /* test for thumb */
68 000c B2405E11 LDRNEH r4, [lr, #-2] /* NE->thumb - get swi instruction code */
69 0010 FF4CC413 BICNE r4, r4, #0xff00 /* NE->thumb - clear top 8 bits leaving swi "comment field"=number
70 0014 04401E05 LDREQ r4, [lr, #-4] /* EQ->arm - get swi instruction code */
71 0018 FF44C403 BICEQ r4, r4, #0xff000000 /* EQ->arm - clear top 8 bits leaving swi "comment field"=number */
72 001c 060054E3 CMP r4, #MAX_SWI /* range-check */
73 0020 04F19F97 LDRLS pc, [pc, r4, LSL #2] /* jump to routine if <= MAX (LS) */
74
75 /* if none from the predefined SWIs match call the user磗-handler */
76 0024 280000EA B UserSWIHandler
77
78
79 /* Jump-Table */
80 SwiTableStart:
81 0028 44000000 .word IRQDisable // 0
82 002c 54000000 .word IRQEnable // 1
83 0030 64000000 .word FIQDisable // 2
84 0034 78000000 .word FIQEnable // 3
85 0038 8C000000 .word CPSRget // 4
86 003c 94000000 .word IRQRestore // 5
87 0040 B0000000 .word FIQRestore // 6
88 SwiTableEnd:
89 .set MAX_SWI, ((SwiTableEnd-SwiTableStart)/4)-1
90
91 IRQDisable:
92 0044 00004FE1 MRS r0, SPSR /* Get SPSR = return value */
93 0048 804080E3 ORR r4, r0, #I_Bit /* I_Bit set */
94 004c 04F061E1 MSR SPSR_c, r4 /* Set SPSR */
95 0050 280000EA B EndofSWI
96
97 IRQEnable:
98 0054 00004FE1 MRS r0, SPSR /* Get SPSR = return value */
99 0058 8040C0E3 BIC r4, r0, #I_Bit /* I_Bit clear */
100 005c 04F061E1 MSR SPSR_c, r4 /* Set SPSR */
101 0060 240000EA B EndofSWI
102
103 FIQDisable:
104 0064 00004FE1 MRS r0, SPSR
105 0068 404080E3 ORR r4, r0, #F_Bit
106 006c 400000E2 AND r0, r0, #F_Bit
107 0070 04F061E1 MSR SPSR_c, r4
108 0074 1F0000EA B EndofSWI
109
110 FIQEnable:
111 0078 00004FE1 MRS r0, SPSR
112 007c 4040C0E3 BIC r4, r0, #F_Bit
113 0080 400000E2 AND r0, r0, #F_Bit
114 0084 04F061E1 MSR SPSR_c, r4
115 0088 1A0000EA B EndofSWI
116
117 CPSRget:
118 // LDR r0, =0xdeadbeef
119 008c 00004FE1 MRS r0, SPSR /* Get SPSR */
120 0090 180000EA B EndofSWI
121
122 IRQRestore:
123 0094 00404FE1 MRS r4, SPSR /* Get SPSR */
124 0098 800000E2 AND r0, r0, #I_Bit
125 009c 800010E3 TST r0, #I_Bit /* Test input for I_Bit */
126 00a0 8040C403 BICEQ r4, r4, #I_Bit
127 00a4 80408413 ORRNE r4, r4, #I_Bit
128 00a8 04F061E1 MSR SPSR_c, r4
129 00ac 110000EA B EndofSWI
130
131 FIQRestore:
132 00b0 00404FE1 MRS r4, SPSR /* Get SPSR */
133 00b4 400000E2 AND r0, r0, #F_Bit
134 00b8 400010E3 TST r0, #F_Bit /* Test input for F_Bit */
135 00bc 4040C403 BICEQ r4, r4, #F_Bit
136 00c0 40408413 ORRNE r4, r4, #F_Bit
137 00c4 04F061E1 MSR SPSR_c, r4
138 00c8 0A0000EA B EndofSWI
139
140 UserSWIHandler:
141 00cc FE5F2DE9 stmfd sp!,{r1-r12,lr}
142 00d0 00C04FE1 mrs r12, spsr
143 00d4 00102DE9 stmfd sp!, {r12}
144 00d8 1CC09FE5 ldr r12, =SWI_Handler_User
145 00dc 0430A0E1 mov r3, r4 /* pass SWI-Number as Param */
146 00e0 0FE0A0E1 mov lr, pc
147 00e4 1CFF2FE1 bx r12 /* call c-function */
148 00e8 0010BDE8 ldmfd sp!, {r12}
149 00ec 0CF06FE1 msr spsr_cxsf, r12
150 00f0 FE9FFDE8 ldmfd sp!, {r1-r12,pc}^ /* return-value in r0 */
151 00f4 FFFFFFEA b EndofSWI
152
153 EndofSWI:
154 00f8 1080FDE8 LDMFD sp!, {r4,pc}^
155 .endfunc
156
157 #if 0
158 /* dummy if no c-function is available - TODO weak? */
159 SWI_Handler_User:
160 bx lr
161 #endif
162
163
164 00fc 00000000 .end
DEFINED SYMBOLS
*ABS*:00000000 Compil/srcWinARM/swi_handler.S
Compil/srcWinARM/swi_handler.S:19 *ABS*:00000000 SWI_IRQ_DIS
Compil/srcWinARM/swi_handler.S:20 *ABS*:00000001 SWI_IRQ_EN
Compil/srcWinARM/swi_handler.S:21 *ABS*:00000002 SWI_FIQ_DIS
Compil/srcWinARM/swi_handler.S:22 *ABS*:00000003 SWI_FIQ_EN
Compil/srcWinARM/swi_handler.S:23 *ABS*:00000004 SWI_GET_CPSR
Compil/srcWinARM/swi_handler.S:24 *ABS*:00000005 SWI_IRQ_REST
Compil/srcWinARM/swi_handler.S:25 *ABS*:00000006 SWI_FIQ_REST
Compil/srcWinARM/swi_handler.S:27 *ABS*:00000080 I_Bit
Compil/srcWinARM/swi_handler.S:28 *ABS*:00000040 F_Bit
Compil/srcWinARM/swi_handler.S:29 *ABS*:00000020 T_Bit
Compil/srcWinARM/swi_handler.S:33 *ABS*:00000001 VECTREMAPPED
Compil/srcWinARM/swi_handler.S:45 .text:00000000 $a
Compil/srcWinARM/swi_handler.S:64 .fastrun:00000000 SoftwareInterruptASM
Compil/srcWinARM/swi_handler.S:65 .fastrun:00000000 $a
*ABS*:00000006 MAX_SWI
Compil/srcWinARM/swi_handler.S:140 .fastrun:000000cc UserSWIHandler
Compil/srcWinARM/swi_handler.S:80 .fastrun:00000028 SwiTableStart
Compil/srcWinARM/swi_handler.S:81 .fastrun:00000028 $d
Compil/srcWinARM/swi_handler.S:91 .fastrun:00000044 IRQDisable
Compil/srcWinARM/swi_handler.S:97 .fastrun:00000054 IRQEnable
Compil/srcWinARM/swi_handler.S:103 .fastrun:00000064 FIQDisable
Compil/srcWinARM/swi_handler.S:110 .fastrun:00000078 FIQEnable
Compil/srcWinARM/swi_handler.S:117 .fastrun:0000008c CPSRget
Compil/srcWinARM/swi_handler.S:122 .fastrun:00000094 IRQRestore
Compil/srcWinARM/swi_handler.S:131 .fastrun:000000b0 FIQRestore
Compil/srcWinARM/swi_handler.S:88 .fastrun:00000044 SwiTableEnd
Compil/srcWinARM/swi_handler.S:92 .fastrun:00000044 $a
Compil/srcWinARM/swi_handler.S:153 .fastrun:000000f8 EndofSWI
Compil/srcWinARM/swi_handler.S:164 .fastrun:000000fc $d
UNDEFINED SYMBOLS
SWI_Handler_User
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -