|
466 | 466 | #elif defined(__aarch64__)
|
467 | 467 |
|
468 | 468 | /****************************************************************/
|
| 469 | + /* https://github.com/ossrs/srs/issues/1282#issuecomment-445539513 */ |
469 | 470 |
|
470 | 471 | #define JB_X19 0
|
471 | 472 | #define JB_X20 1
|
|
560 | 561 | #elif defined(__arm__)
|
561 | 562 |
|
562 | 563 | /****************************************************************/
|
| 564 | + /* https://github.com/ossrs/srs/issues/1282#issuecomment-445539513 */ |
563 | 565 |
|
564 |
| - .globl _st_md_cxt_save |
565 |
| - .type _st_md_cxt_save, %function |
566 |
| - .align 2 |
| 566 | + /* Register list for a ldm/stm instruction to load/store |
| 567 | + the general registers from a __jmp_buf. */ |
| 568 | + # define JMP_BUF_REGLIST {v1-v6, sl, fp, sp, lr} |
| 569 | + |
| 570 | + .file "md.S" |
| 571 | + .text |
| 572 | + |
| 573 | + /* _st_md_cxt_save(__jmp_buf env) */ |
| 574 | + .globl _st_md_cxt_save |
| 575 | + .type _st_md_cxt_save, %function |
| 576 | + .align 2 |
567 | 577 | _st_md_cxt_save:
|
568 |
| - mov ip, r0 // r0 is the param jmpbuf ptr address. |
569 |
| - // Save registers like |
570 |
| - // *ip++ = v1 |
571 |
| - // *ip++ = ... |
572 |
| - // *ip++ = v6 |
573 |
| - // *ip++ = sl |
574 |
| - // *ip++ = fp |
575 |
| - stmia ip!, {v1-v6, sl, fp} // TODO: compatible with other ARM version. |
576 |
| - movs r2, sp |
577 |
| - stmia ip!, {r2, lr} |
578 |
| - mov r0, #0 // r0 save the return value(0) of setjmp. |
579 |
| - bx lr // return |
580 |
| - .size _st_md_cxt_save, .-_st_md_cxt_save |
| 578 | + mov ip, r0 |
| 579 | + |
| 580 | + /* Save registers */ |
| 581 | + stmia ip!, JMP_BUF_REGLIST |
| 582 | + |
| 583 | + #ifdef __VFP_FP__ |
| 584 | + /* Store the VFP registers. */ |
| 585 | + /* Following instruction is vstmia ip!, {d8-d15}. */ |
| 586 | + stc p11, cr8, [ip], #64 |
| 587 | + #endif |
| 588 | + |
| 589 | + #ifdef __IWMMXT__ |
| 590 | + /* Save the call-preserved iWMMXt registers. */ |
| 591 | + /* Following instructions are wstrd wr10, [ip], #8 (etc.) */ |
| 592 | + stcl p1, cr10, [r12], #8 |
| 593 | + stcl p1, cr11, [r12], #8 |
| 594 | + stcl p1, cr12, [r12], #8 |
| 595 | + stcl p1, cr13, [r12], #8 |
| 596 | + stcl p1, cr14, [r12], #8 |
| 597 | + stcl p1, cr15, [r12], #8 |
| 598 | + #endif |
| 599 | + |
| 600 | + mov r0, #0 |
| 601 | + bx lr |
| 602 | + |
| 603 | + .size _st_md_cxt_save, .-_st_md_cxt_save |
581 | 604 |
|
582 | 605 | /****************************************************************/
|
583 | 606 |
|
584 |
| - .globl _st_md_cxt_restore |
585 |
| - .type _st_md_cxt_restore, %function |
586 |
| - .align 2 |
| 607 | + /* _st_md_cxt_restore(__jmp_buf env, int val) */ |
| 608 | + .globl _st_md_cxt_restore |
| 609 | + .type _st_md_cxt_restore, %function |
| 610 | + .align 2 |
587 | 611 | _st_md_cxt_restore:
|
588 |
| - mov ip, r0 // r0 -> jmp_buf |
589 |
| - movs r0, r1 // r1 -> return value |
590 |
| - // The bellow is a group, that is: |
591 |
| - // if (r0 == 0) r0 =1; |
592 |
| - ITT eq |
593 |
| - moveq r0, #1 // long_jmp should never return 0 |
594 |
| - |
595 |
| - ldmia ip!, {v1-v6, sl, fp} // restore registers. |
596 |
| - ldr sp, [ip], #4 // restore sp, like: sp=*ip; ip+=4; |
597 |
| - ldr lr, [ip], #4 |
598 |
| - bx lr |
599 |
| - .size _st_md_cxt_restore, .-_st_md_cxt_restore |
| 612 | + mov ip, r0 |
| 613 | + |
| 614 | + /* Restore registers */ |
| 615 | + ldmia ip!, JMP_BUF_REGLIST |
| 616 | + |
| 617 | + #ifdef __VFP_FP__ |
| 618 | + /* Restore the VFP registers. */ |
| 619 | + /* Following instruction is vldmia ip!, {d8-d15}. */ |
| 620 | + ldc p11, cr8, [r12], #64 |
| 621 | + #endif |
| 622 | + |
| 623 | + #ifdef __IWMMXT__ |
| 624 | + /* Restore the call-preserved iWMMXt registers. */ |
| 625 | + /* Following instructions are wldrd wr10, [ip], #8 (etc.) */ |
| 626 | + ldcl p1, cr10, [r12], #8 |
| 627 | + ldcl p1, cr11, [r12], #8 |
| 628 | + ldcl p1, cr12, [r12], #8 |
| 629 | + ldcl p1, cr13, [r12], #8 |
| 630 | + ldcl p1, cr14, [r12], #8 |
| 631 | + ldcl p1, cr15, [r12], #8 |
| 632 | + #endif |
| 633 | + |
| 634 | + movs r0, r1 /* get the return value in place */ |
| 635 | + moveq r0, #1 /* can't let setjmp() return zero! */ |
| 636 | + bx lr |
| 637 | + |
| 638 | + .size _st_md_cxt_restore, .-_st_md_cxt_restore |
600 | 639 |
|
601 | 640 | /****************************************************************/
|
602 | 641 |
|
|
0 commit comments