|
428 | 428 |
|
429 | 429 | /****************************************************************/ |
430 | 430 |
|
| 431 | + |
| 432 | + |
| 433 | + |
| 434 | + |
| 435 | + |
| 436 | + |
| 437 | + |
| 438 | + |
| 439 | + |
| 440 | +#elif defined(__loongarch__) |
| 441 | + |
| 442 | + /****************************************************************/ |
| 443 | + |
| 444 | + /* |
| 445 | + * Internal __jmp_buf layout |
| 446 | + */ |
| 447 | + #define JB_SP 0 /* R3, SP, Stack pointer */ |
| 448 | + #define JB_RA 1 /* R1, RA, Return address */ |
| 449 | + #define JB_FP 2 /* FP/R22 Frame pointer */ |
| 450 | + #define JB_S0 3 /* R23-R31, S0-S8, Subroutine register variable */ |
| 451 | + #define JB_S1 4 /* R23-R31, S0-S8, Subroutine register variable */ |
| 452 | + #define JB_S2 5 /* R23-R31, S0-S8, Subroutine register variable */ |
| 453 | + #define JB_S3 6 /* R23-R31, S0-S8, Subroutine register variable */ |
| 454 | + #define JB_S4 7 /* R23-R31, S0-S8, Subroutine register variable */ |
| 455 | + #define JB_S5 8 /* R23-R31, S0-S8, Subroutine register variable */ |
| 456 | + #define JB_S6 9 /* R23-R31, S0-S8, Subroutine register variable */ |
| 457 | + #define JB_S7 10 /* R23-R31, S0-S8, Subroutine register variable */ |
| 458 | + #define JB_S8 11 /* R23-R31, S0-S8, Subroutine register variable */ |
| 459 | + |
| 460 | + .file "md_linux.S" |
| 461 | + .text |
| 462 | + |
| 463 | + /* _st_md_cxt_save(__jmp_buf env) */ /* The env is $r4, https://github.com/ossrs/state-threads/issues/24#porting */ |
| 464 | + .globl _st_md_cxt_save |
| 465 | + .type _st_md_cxt_save, %function |
| 466 | + .align 2 |
| 467 | + _st_md_cxt_save: |
| 468 | + st.d $r3, $r4, 0 /* Save sp to env[0], *(long*)($r4+0) = sp */ |
| 469 | + st.d $r1, $r4, 8 /* Save ra to env[1], *(long*)($r4+8) = r1 */ |
| 470 | + st.d $r22, $r4, 16 /* Save fp to env[2], *(long*)($r4+16) = r22 */ |
| 471 | + st.d $r23, $r4, 24 /* Save fp to env[3], *(long*)($r4+24) = r23 */ |
| 472 | + st.d $r24, $r4, 32 /* Save fp to env[4], *(long*)($r4+32) = r24 */ |
| 473 | + st.d $r25, $r4, 40 /* Save fp to env[5], *(long*)($r4+40) = r25 */ |
| 474 | + st.d $r26, $r4, 48 /* Save fp to env[6], *(long*)($r4+48) = r26 */ |
| 475 | + st.d $r27, $r4, 56 /* Save fp to env[7], *(long*)($r4+56) = r27 */ |
| 476 | + st.d $r28, $r4, 64 /* Save fp to env[8], *(long*)($r4+64) = r28 */ |
| 477 | + st.d $r29, $r4, 72 /* Save fp to env[9], *(long*)($r4+72) = r29 */ |
| 478 | + st.d $r30, $r4, 80 /* Save fp to env[10], *(long*)($r4+80) = r30 */ |
| 479 | + st.d $r31, $r4, 88 /* Save fp to env[11], *(long*)($r4+88) = r31 */ |
| 480 | + addi.w $r12, $r0, 0 /* Set return value to 0 */ |
| 481 | + move $r4, $r12 /* Set return value to 0 */ |
| 482 | + jirl $r0, $r1, 0 /* Return */ |
| 483 | + |
| 484 | + .size _st_md_cxt_save, .-_st_md_cxt_save |
| 485 | + |
| 486 | + /****************************************************************/ |
| 487 | + |
| 488 | + /* _st_md_cxt_restore(__jmp_buf env, int val) */ |
| 489 | + .globl _st_md_cxt_restore |
| 490 | + .type _st_md_cxt_restore, %function |
| 491 | + .align 2 |
| 492 | + _st_md_cxt_restore: |
| 493 | + ld.d $r3, $r4, 0 /* Load sp from env[0], sp=*(long*)($r4+0) */ |
| 494 | + ld.d $r1, $r4, 8 /* Load ra from env[1], r1=*(long*)($r4+8) */ |
| 495 | + ld.d $r22, $r4, 16 /* Load ra from env[2], r22=*(long*)($r4+16) */ |
| 496 | + ld.d $r23, $r4, 24 /* Load ra from env[3], r23=*(long*)($r4+24) */ |
| 497 | + ld.d $r24, $r4, 32 /* Load ra from env[4], r24=*(long*)($r4+32) */ |
| 498 | + ld.d $r25, $r4, 40 /* Load ra from env[5], r25=*(long*)($r4+40) */ |
| 499 | + ld.d $r26, $r4, 48 /* Load ra from env[6], r26=*(long*)($r4+48) */ |
| 500 | + ld.d $r27, $r4, 56 /* Load ra from env[7], r27=*(long*)($r4+56) */ |
| 501 | + ld.d $r28, $r4, 64 /* Load ra from env[8], r28=*(long*)($r4+64) */ |
| 502 | + ld.d $r29, $r4, 72 /* Load ra from env[9], r29=*(long*)($r4+72) */ |
| 503 | + ld.d $r30, $r4, 80 /* Load ra from env[10], r30=*(long*)($r4+80) */ |
| 504 | + ld.d $r31, $r4, 88 /* Load ra from env[11], r31=*(long*)($r4+88) */ |
| 505 | + addi.w $r12, $r0, 1 /* Set return value to 1 */ |
| 506 | + move $r4, $r12 /* Set return value to 1 */ |
| 507 | + jirl $r0, $r1, 0 /* Return to the saved return address */ |
| 508 | + |
| 509 | + .size _st_md_cxt_restore, .-_st_md_cxt_restore |
| 510 | + |
| 511 | + /****************************************************************/ |
| 512 | + |
431 | 513 | #endif |
432 | 514 |
|
433 | 515 | #endif |
0 commit comments