Skip to content

Commit f9a13a8

Browse files
committed
For #9, use new algorithm for arm.
1 parent 0451a89 commit f9a13a8

File tree

1 file changed

+70
-31
lines changed

1 file changed

+70
-31
lines changed

md.S

+70-31
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,7 @@
466466
#elif defined(__aarch64__)
467467

468468
/****************************************************************/
469+
/* https://github.com/ossrs/srs/issues/1282#issuecomment-445539513 */
469470

470471
#define JB_X19 0
471472
#define JB_X20 1
@@ -560,43 +561,81 @@
560561
#elif defined(__arm__)
561562

562563
/****************************************************************/
564+
/* https://github.com/ossrs/srs/issues/1282#issuecomment-445539513 */
563565

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
567577
_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
581604

582605
/****************************************************************/
583606

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
587611
_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
600639

601640
/****************************************************************/
602641

0 commit comments

Comments
 (0)