Skip to content

Commit ef782b2

Browse files
donghengqazwujiangang
authored andcommitted
fix(esp8266): Fix load/store error when use "a0"
Closes #183
1 parent 2e657bb commit ef782b2

File tree

1 file changed

+37
-32
lines changed

1 file changed

+37
-32
lines changed

Diff for: components/esp8266/source/xtensa_vectors.S

+37-32
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,15 @@ LoadStoreErrorHandlerStack:
142142
.word 0 # a5
143143
.word 0 # a6
144144

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+
145154
#if HAVE_XSR
146155
.data
147156
.global LABEL(_Pri_,_HandlerAddress)
@@ -169,11 +178,23 @@ LoadStoreErrorHandler:
169178
// .global LoadStoreErrorHandler
170179
.type LoadStoreErrorHandler, @function
171180

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+
172194
/* Registers are saved in the address corresponding to their register
173195
* number times 4. This allows a quick and easy mapping later on when
174196
* needing to store the value to a particular register number. */
175-
mov a0, sp
176-
movi sp, LoadStoreErrorHandlerStack
197+
177198
s32i a0, sp, 0
178199
s32i a2, sp, 0x08
179200
s32i a3, sp, 0x0c
@@ -258,8 +279,7 @@ LoadStoreErrorHandler:
258279
l32i a2, sp, 0x08
259280
l32i a3, sp, 0x0c
260281
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
263283
rfe
264284

265285
.LSE_assign_reg:
@@ -409,8 +429,7 @@ LoadStoreErrorHandler:
409429
l32i a4, sp, 0x10
410430
l32i a5, sp, 0x14
411431
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
414433
rfe
415434

416435
.LSE_wrong_opcode:
@@ -422,22 +441,19 @@ LoadStoreErrorHandler:
422441
l32i a2, sp, 0x08
423442
l32i a3, sp, 0x0c
424443
l32i a4, sp, 0x10
425-
mov a1, a0
426-
rsr a0, excsave1
444+
rsr a1, excsave1
427445
call0 user_fatal_exception_handler
428446

429447
.balign 4
430448
.LSE_assign_a1:
431449
/* a1 is saved in excsave1, so just update that with the value, */
432-
//wsr a4, excsave1
433450
s32i a4, sp, 0x04
434451
/* Then restore all regs and return */
435452
l32i a0, sp, 0
436453
l32i a2, sp, 0x08
437454
l32i a3, sp, 0x0c
438455
l32i a4, sp, 0x10
439456
l32i a1, sp, 0x04
440-
rsr a0, excsave1
441457
rfe
442458

443459
.balign 4
@@ -452,88 +468,77 @@ LoadStoreErrorHandler:
452468
mov a5, a4
453469
l32i a2, sp, 0x08
454470
l32i a4, sp, 0x10
455-
mov a1, a0
456-
rsr a0, excsave1
471+
rsr a1, excsave1
457472
rfe
458473

459474
.org .LSE_jumptable_base + (16 * 6)
460475
mov a6, a4
461476
l32i a2, sp, 0x08
462477
l32i a4, sp, 0x10
463-
mov a1, a0
464-
rsr a0, excsave1
478+
rsr a1, excsave1
465479
rfe
466480

467481
.org .LSE_jumptable_base + (16 * 7)
468482
mov a7, a4
469483
l32i a2, sp, 0x08
470484
l32i a4, sp, 0x10
471-
mov a1, a0
472-
rsr a0, excsave1
485+
rsr a1, excsave1
473486
rfe
474487

475488
.org .LSE_jumptable_base + (16 * 8)
476489
mov a8, a4
477490
l32i a2, sp, 0x08
478491
l32i a4, sp, 0x10
479-
mov a1, a0
480-
rsr a0, excsave1
492+
rsr a1, excsave1
481493
rfe
482494

483495
.org .LSE_jumptable_base + (16 * 9)
484496
mov a9, a4
485497
l32i a2, sp, 0x08
486498
l32i a4, sp, 0x10
487-
mov a1, a0
488-
rsr a0, excsave1
499+
rsr a1, excsave1
489500
rfe
490501

491502
.org .LSE_jumptable_base + (16 * 10)
492503
mov a10, a4
493504
l32i a2, sp, 0x08
494505
l32i a4, sp, 0x10
495-
mov a1, a0
496-
rsr a0, excsave1
506+
rsr a1, excsave1
497507
rfe
498508

499509
.org .LSE_jumptable_base + (16 * 11)
500510
mov a11, a4
501511
l32i a2, sp, 0x08
502512
l32i a4, sp, 0x10
503-
mov a1, a0
504-
rsr a0, excsave1
513+
rsr a1, excsave1
505514
rfe
506515

507516
.org .LSE_jumptable_base + (16 * 12)
508517
mov a12, a4
509518
l32i a2, sp, 0x08
510519
l32i a4, sp, 0x10
511-
mov a1, a0
512-
rsr a0, excsave1
520+
rsr a1, excsave1
513521
rfe
514522

515523
.org .LSE_jumptable_base + (16 * 13)
516524
mov a13, a4
517525
l32i a2, sp, 0x08
518526
l32i a4, sp, 0x10
519-
mov a1, a0
520-
rsr a0, excsave1
527+
rsr a1, excsave1
521528
rfe
522529

523530
.org .LSE_jumptable_base + (16 * 14)
524531
mov a14, a4
525532
l32i a2, sp, 0x08
526533
l32i a4, sp, 0x10
527-
mov a1, a0
528-
rsr a0, excsave1
534+
rsr a1, excsave1
529535
rfe
530536

531537
.org .LSE_jumptable_base + (16 * 15)
532538
mov a15, a4
533539
l32i a2, sp, 0x08
534540
l32i a4, sp, 0x10
535-
mov a1, a0
536-
rsr a0, excsave1
541+
rsr a1, excsave1
537542
rfe
538543

539544
.section .UserEnter.text, "ax"

0 commit comments

Comments
 (0)