📄 startup.l
字号:
00000018 00 195
00000018 00 196
00000018 00 197 #-------------------------------------------------
00000018 00 198 # Special Purpose Register Indices for SRR0, SRR1
00000018 00 199 #-------------------------------------------------
00000018 00 200
00000018 00 201 SRR0: .equ 26 # Save/Restore Register 0
00000018 00 202 SRR1: .equ 27 # Save/Restore Register 1
00000018 00 203
00000018 00 204 #*****************************************************************************
00000018 00 205 # This is the external interrupts vector table entry for the MPC8xx.
00000018 00 206 # This code is setup for handling non-reentrant external interrupts.
00000018 00 207 #
00000018 00 208 # The following are the steps, in order, taken by the External Interrupt
00000018 00 209 # Table Code:
00000018 00 210 # 1) Save following Registers: gpr0, gpr3-gpr12, CR, XER, LR, CTR
00000018 00 211 # on stack as necessary to preserve user state across the interrupt
00000018 00 212 # handler. Save SRR0, SRR1 to provide breakpoint/debug support for
00000018 00 213 # Interrupt Code.
00000018 00 214 # 2) The exception vector (0x500) is saved in register r3.
00000018 00 215 # 3) Absolute Branch and Link to C routine to complete interrupt processing.
00000018 00 216 # 4) Restore Registers in (1) from stack.
00000018 00 217 # 5) Execute rfi instruction to return from supervisor-state interrupt handler.
00000018 00 218 #*****************************************************************************
00000018 00 219
00000018 00 220 .text
00000018 00 221 ExtIntTable:
00000018 00 222
00000018 00 223 #-----------------------------------------------------
00000018 00 224 # Save USER State
00000018 00 225 #-----------------------------------------------------
00000018 00 226
00000018 00 227 #-----------------------------------------------------
00000018 00 228 # Save r0 -- Volatile Register
00000018 00 229 # Update SP (r1) (Allocate Interrupt STACK frame)
00000018 00 230 #-----------------------------------------------------
00000018 00 231
00000018 00 9401 ffb0 232 stwu r0, -STACK_SZ+R0_OFFSET(r1)
0000001c 00 233
0000001c 00 234 #---------------------------------------------------------------
0000001c 00 235 # Save SRR0, SRR1
0000001c 00 236 # NOTE: DO NOT Trace or Set Breakpoint Before SRR0, SRR1 Saved
0000001c 00 237 #---------------------------------------------------------------
0000001c 00 238
0000001c 00 7c1a 02a6 239 mfspr r0, SRR0
00000020 00 9001 0034 240 stw r0, SRR0_OFFSET(r1)
00000024 00 7c1b 02a6 241 mfspr r0, SRR1
00000028 00 9001 0038 242 stw r0, SRR1_OFFSET(r1)
0000002c 00 243
0000002c 00 244 #--------------------------------------------
0000002c 00 245 # Save r3-r12 -- Volatile Registers
0000002c 00 246 #--------------------------------------------
0000002c 00 247
0000002c 00 9061 000c 248 stw r3, R3_OFFSET(r1) # Store r3
00000030 00 9081 0010 249 stw r4, R4_OFFSET(r1) # Store r4
00000034 00 90a1 0014 250 stw r5, R5_OFFSET(r1) # Store r5
00000038 00 90c1 0018 251 stw r6, R6_OFFSET(r1) # Store r6
0000003c 00 90e1 001c 252 stw r7, R7_OFFSET(r1) # Store r7
00000040 00 9101 0020 253 stw r8, R8_OFFSET(r1) # Store r8
00000044 00 9121 0024 254 stw r9, R9_OFFSET(r1) # Store r9
00000048 00 9141 0028 255 stw r10, R10_OFFSET(r1) # Store r10
0000004c 00 9161 002c 256 stw r11, R11_OFFSET(r1) # Store r11
00000050 00 9181 0030 257 stw r12, R12_OFFSET(r1) # Store r12
00000054 00 258
00000054 00 259 #----------------
00000054 00 260 # Store LR
00000054 00 261 #----------------
00000054 00 262
00000054 00 7c08 02a6 263 mflr r0
00000058 00 9001 003c 264 stw r0, LR_OFFSET(r1)
0000005c 00 265
0000005c 00 266 #----------------
0000005c 00 267 # Save CTR
0000005c 00 268 #----------------
0000005c 00 269
0000005c 00 7c09 02a6 270 mfctr r0
00000060 00 9001 0040 271 stw r0, CTR_OFFSET(r1)
00000064 00 272
00000064 00 273 #----------------
00000064 00 274 # Save XER
00000064 00 275 #----------------
00000064 00 276
00000064 00 7c01 02a6 277 mfxer r0
00000068 00 9001 0044 278 stw r0, XER_OFFSET(r1)
0000006c 00 279
0000006c 00 280 #----------------
0000006c 00 281 # Save CR
0000006c 00 282 #----------------
0000006c 00 283
0000006c 00 7c00 0026 284 mfcr r0
00000070 00 9001 0048 285 stw r0, CR_OFFSET(r1)
00000074 00 286
00000074 00 287 #----------------------------------
00000074 00 288 # Allocate C FRAME (1-Quad Word)
00000074 00 289 #----------------------------------
00000074 00 290
00000074 00 3821 fff0 291 subi r1,r1,C_FRAME_SZ
00000078 00 292
00000078 00 293 #----------------------------------------------------
00000078 00 294 # Place External Interrupt Vector in r3
00000078 00 295 #----------------------------------------------------
00000078 00 296
00000078 00 3860 0500 297 addi r3,r0,EXTERNAL_INTERRUPT_VECTOR
0000007c 00 298
0000007c 00 299 #----------------------------------------------------
0000007c 00 300 # Execute external interrupt handler
0000007c 00 301 #----------------------------------------------------
0000007c 00 302
0000007c 00 4800 0003 303 bla ExtIntHandler
00000080 00 304
00000080 00 305 #----------------------------------------------------
00000080 00 306 # Restore USER State
00000080 00 307 #----------------------------------------------------
00000080 00 308
00000080 00 309 #----------------------------------------------------
00000080 00 310 # Deallocate C FRAME (1-Quad Word)
00000080 00 311 #----------------------------------------------------
00000080 00 312
00000080 00 3821 0010 313 addi r1,r1,C_FRAME_SZ
00000084 00 314
00000084 00 315 #--------------
00000084 00 316 # Restore CR
00000084 00 317 #--------------
00000084 00 318
00000084 00 8001 0048 319 lwz r0, CR_OFFSET(r1)
00000088 00 7c0f f120 320 mtcrf 0xff,r0
0000008c 00 321
0000008c 00 322 #--------------
0000008c 00 323 # Restore XER
0000008c 00 324 #--------------
0000008c 00 325
0000008c 00 8001 0044 326 lwz r0, XER_OFFSET(r1)
00000090 00 7c01 03a6 327 mtxer r0
00000094 00 328
00000094 00 329 #--------------
00000094 00 330 # Restore CTR
00000094 00 331 #--------------
00000094 00 332
00000094 00 8001 0040 333 lwz r0, CTR_OFFSET(r1)
00000098 00 7c09 03a6 334 mtctr r0
0000009c 00 335
0000009c 00 336 #-------------
0000009c 00 337 # Restore LR
0000009c 00 338 #-------------
0000009c 00 339
0000009c 00 8001 003c 340 lwz r0, LR_OFFSET(r1)
000000a0 00 7c08 03a6 341 mtlr r0
000000a4 00 342
000000a4 00 343 #--------------------------------------
000000a4 00 344 # Restore r12-r3 -- Volatile Registers
000000a4 00 345 #--------------------------------------
000000a4 00 346
000000a4 00 8181 0030 347 lwz r12, R12_OFFSET(r1) # Store r12
000000a8 00 8161 002c 348 lwz r11, R11_OFFSET(r1) # Store r11
000000ac 00 8141 0028 349 lwz r10, R10_OFFSET(r1) # Store r10
000000b0 00 8121 0024 350 lwz r9, R9_OFFSET(r1) # Store r9
000000b4 00 8101 0020 351 lwz r8, R8_OFFSET(r1) # Store r8
000000b8 00 80e1 001c 352 lwz r7, R7_OFFSET(r1) # Store r7
000000bc 00 80c1 0018 353 lwz r6, R6_OFFSET(r1) # Store r6
000000c0 00 80a1 0014 354 lwz r5, R5_OFFSET(r1) # Store r5
000000c4 00 8081 0010 355 lwz r4, R4_OFFSET(r1) # Store r4
000000c8 00 8061 000c 356 lwz r3, R3_OFFSET(r1) # Store r3
000000cc 00 357
000000cc 00 358 #-----------------------------------------------------------------
000000cc 00 359 # Save SRR1, SRR0
000000cc 00 360 # NOTE: DO NOT Trace or Set Breakpoint After SRR1, SRR0 Restored
000000cc 00 361 #-----------------------------------------------------------------
000000cc 00 362
000000cc 00 8001 0038 363 lwz r0, SRR1_OFFSET(r1)
000000d0 00 7c1b 03a6 364 mtspr SRR1, r0
000000d4 00 365
000000d4 00 8001 0034 366 lwz r0, SRR0_OFFSET(r1)
000000d8 00 7c1a 03a6 367 mtspr SRR0, r0
000000dc 00 368
000000dc 00 369 #---------------------------------------------------
000000dc 00 370 # Restore r0 -- Volatile Register
000000dc 00 371 # Update SP (r1) (Deallocate Interrupt STACK frame)
000000dc 00 372 #---------------------------------------------------
000000dc 00 373
000000dc 00 8001 0000 374 lwz r0, R0_OFFSET(r1)
000000e0 00 3821 0050 375 addi r1, r1, STACK_SZ
000000e4 00 376
000000e4 00 377 # ----------------------------------------------------
000000e4 00 378 # Return from interrupt handler in supervisor state to user code
000000e4 00 379 # ----------------------------------------------------
000000e4 00 380
000000e4 00 4c00 0064 381 rfi
000000e8 00 382
000000e8 00 0000 0040 383 .word 64 # pad space
000000ec 00 384
000000ec 00 385
000000ec 00 386
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -