@@ -142,6 +142,15 @@ LoadStoreErrorHandlerStack:
142
142
. word 0 # a5
143
143
. word 0 # a6
144
144
145
+ LoadStoreErrorHandlerStack_reentry:
146
+ . word 0 # a0
147
+ . word 0 # (unused)
148
+ . word 0 # a2
149
+ . word 0 # a3
150
+ . word 0 # a4
151
+ . word 0 # a5
152
+ . word 0 # a6
153
+
145
154
#if HAVE_XSR
146
155
.data
147
156
. global LABEL(_Pri_ , _HandlerAddress)
@@ -169,11 +178,23 @@ LoadStoreErrorHandler:
169
178
// . global LoadStoreErrorHandler
170
179
.type LoadStoreErrorHandler , @function
171
180
181
+ rsr a0 , excsave1 # restore a0 saved by UserExceptionVector
182
+ wsr a1 , excsave1 # save a1 to excsave1 , a1 can be used as varalbe
183
+
184
+ movi a1 , LABEL(_Pri_ , _NMICount)
185
+ l32i a1 , a1 , 0
186
+
187
+ bnez a1 , LoadStoreErrorHandler_reentry
188
+ movi sp , LoadStoreErrorHandlerStack
189
+ j LoadStoreErrorHandler_ common
190
+ LoadStoreErrorHandler_reentry:
191
+ movi sp , LoadStoreErrorHandlerStack_reentry
192
+ LoadStoreErrorHandler_ common :
193
+
172
194
/ * Registers are saved in the address corresponding to their register
173
195
* number times 4 . This allows a quick and easy mapping later on when
174
196
* needing to store the value to a particular register number. * /
175
- mov a0 , sp
176
- movi sp , LoadStoreErrorHandlerStack
197
+
177
198
s32i a0 , sp , 0
178
199
s32i a2 , sp , 0x08
179
200
s32i a3 , sp , 0x0c
@@ -258,8 +279,7 @@ LoadStoreErrorHandler:
258
279
l32i a2 , sp , 0x08
259
280
l32i a3 , sp , 0x0c
260
281
l32i a4 , sp , 0x10
261
- mov a1 , a0
262
- rsr a0 , excsave1 # restore a1 saved by UserExceptionVector
282
+ rsr a1 , excsave1 # restore a1 saved by UserExceptionVector
263
283
rfe
264
284
265
285
.LSE_assign_reg:
@@ -409,8 +429,7 @@ LoadStoreErrorHandler:
409
429
l32i a4 , sp , 0x10
410
430
l32i a5 , sp , 0x14
411
431
l32i a6 , sp , 0x18
412
- mov a1 , a0
413
- rsr a0 , excsave1 # restore a1 saved by UserExceptionVector
432
+ rsr a1 , excsave1 # restore a1 saved by UserExceptionVector
414
433
rfe
415
434
416
435
.LSE_wrong_opcode:
@@ -422,22 +441,19 @@ LoadStoreErrorHandler:
422
441
l32i a2 , sp , 0x08
423
442
l32i a3 , sp , 0x0c
424
443
l32i a4 , sp , 0x10
425
- mov a1 , a0
426
- rsr a0 , excsave1
444
+ rsr a1 , excsave1
427
445
call0 user_fatal_exception_handler
428
446
429
447
.balign 4
430
448
.LSE_assign_a1:
431
449
/ * a1 is saved in excsave1 , so just update th at with the value , * /
432
- //wsr a4 , excsave1
433
450
s32i a4 , sp , 0x04
434
451
/ * Then restore all regs and return * /
435
452
l32i a0 , sp , 0
436
453
l32i a2 , sp , 0x08
437
454
l32i a3 , sp , 0x0c
438
455
l32i a4 , sp , 0x10
439
456
l32i a1 , sp , 0x04
440
- rsr a0 , excsave1
441
457
rfe
442
458
443
459
.balign 4
@@ -452,88 +468,77 @@ LoadStoreErrorHandler:
452
468
mov a5 , a4
453
469
l32i a2 , sp , 0x08
454
470
l32i a4 , sp , 0x10
455
- mov a1 , a0
456
- rsr a0 , excsave1
471
+ rsr a1 , excsave1
457
472
rfe
458
473
459
474
.org .LSE_jumptable_base + ( 16 * 6 )
460
475
mov a6 , a4
461
476
l32i a2 , sp , 0x08
462
477
l32i a4 , sp , 0x10
463
- mov a1 , a0
464
- rsr a0 , excsave1
478
+ rsr a1 , excsave1
465
479
rfe
466
480
467
481
.org .LSE_jumptable_base + ( 16 * 7 )
468
482
mov a7 , a4
469
483
l32i a2 , sp , 0x08
470
484
l32i a4 , sp , 0x10
471
- mov a1 , a0
472
- rsr a0 , excsave1
485
+ rsr a1 , excsave1
473
486
rfe
474
487
475
488
.org .LSE_jumptable_base + ( 16 * 8 )
476
489
mov a8 , a4
477
490
l32i a2 , sp , 0x08
478
491
l32i a4 , sp , 0x10
479
- mov a1 , a0
480
- rsr a0 , excsave1
492
+ rsr a1 , excsave1
481
493
rfe
482
494
483
495
.org .LSE_jumptable_base + ( 16 * 9 )
484
496
mov a9 , a4
485
497
l32i a2 , sp , 0x08
486
498
l32i a4 , sp , 0x10
487
- mov a1 , a0
488
- rsr a0 , excsave1
499
+ rsr a1 , excsave1
489
500
rfe
490
501
491
502
.org .LSE_jumptable_base + ( 16 * 10 )
492
503
mov a10 , a4
493
504
l32i a2 , sp , 0x08
494
505
l32i a4 , sp , 0x10
495
- mov a1 , a0
496
- rsr a0 , excsave1
506
+ rsr a1 , excsave1
497
507
rfe
498
508
499
509
.org .LSE_jumptable_base + ( 16 * 11 )
500
510
mov a11 , a4
501
511
l32i a2 , sp , 0x08
502
512
l32i a4 , sp , 0x10
503
- mov a1 , a0
504
- rsr a0 , excsave1
513
+ rsr a1 , excsave1
505
514
rfe
506
515
507
516
.org .LSE_jumptable_base + ( 16 * 12 )
508
517
mov a12 , a4
509
518
l32i a2 , sp , 0x08
510
519
l32i a4 , sp , 0x10
511
- mov a1 , a0
512
- rsr a0 , excsave1
520
+ rsr a1 , excsave1
513
521
rfe
514
522
515
523
.org .LSE_jumptable_base + ( 16 * 13 )
516
524
mov a13 , a4
517
525
l32i a2 , sp , 0x08
518
526
l32i a4 , sp , 0x10
519
- mov a1 , a0
520
- rsr a0 , excsave1
527
+ rsr a1 , excsave1
521
528
rfe
522
529
523
530
.org .LSE_jumptable_base + ( 16 * 14 )
524
531
mov a14 , a4
525
532
l32i a2 , sp , 0x08
526
533
l32i a4 , sp , 0x10
527
- mov a1 , a0
528
- rsr a0 , excsave1
534
+ rsr a1 , excsave1
529
535
rfe
530
536
531
537
.org .LSE_jumptable_base + ( 16 * 15 )
532
538
mov a15 , a4
533
539
l32i a2 , sp , 0x08
534
540
l32i a4 , sp , 0x10
535
- mov a1 , a0
536
- rsr a0 , excsave1
541
+ rsr a1 , excsave1
537
542
rfe
538
543
539
544
. section .UserEnter.text , "ax"
0 commit comments