Skip to content

Commit db42969

Browse files
committed
For #24: Support Loongson CPU arch
1 parent 4bca722 commit db42969

File tree

4 files changed

+172
-3
lines changed

4 files changed

+172
-3
lines changed

md.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,11 @@
187187
#define MD_USE_BUILTIN_SETJMP
188188
#define MD_GET_SP(_t) *((long *)&((_t)->context[0].__jb[0]))
189189

190+
#elif defined(__loongarch__)
191+
/* https://github.com/ossrs/state-threads/issues/24 */
192+
#define MD_USE_BUILTIN_SETJMP
193+
#define MD_GET_SP(_t) *((long *)&((_t)->context[0].__jmpbuf[0]))
194+
190195
#else
191196
#error "Unknown CPU architecture"
192197
#endif /* Cases with common MD_INIT_CONTEXT and different SP locations */

md_linux.S

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,88 @@
428428

429429
/****************************************************************/
430430

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+
431513
#endif
432514

433515
#endif

tools/porting/porting.c

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
int foo_return_zero();
88
int foo_return_one();
9+
int foo_return_one_arg1(int r0);
910
extern void print_buf(unsigned char* p, int nn_jb);
1011
extern void print_jmpbuf();
1112

@@ -22,11 +23,14 @@ int main(int argc, char** argv)
2223
printf("\nCPU specs:\n");
2324
#ifdef __mips__
2425
// https://s3-eu-west-1.amazonaws.com/downloads-mips/documents/MD00565-2B-MIPS32-QRC-01.01.pdf
25-
printf("__mips__: %d, __mips:%d, _MIPSEL:%d\n", __mips__, __mips, _MIPSEL);
26+
printf("__mips__: %d, __mips: %d, _MIPSEL: %d\n", __mips__, __mips, _MIPSEL);
2627
#endif
2728
#ifdef __x86_64__
2829
printf("__x86_64__: %d\n", __x86_64__);
2930
#endif
31+
#ifdef __loongarch__
32+
printf("__loongarch__: %d, __loongarch64 :%d\n", __loongarch__, __loongarch64);
33+
#endif
3034

3135
printf("\nCompiler specs:\n");
3236
#ifdef __GLIBC__
@@ -36,13 +40,14 @@ int main(int argc, char** argv)
3640
printf("sizeof(long long int)=%d\n", (int)sizeof(long long int));
3741
printf("sizeof(void*)=%d\n", (int)sizeof(void*));
3842
#ifdef __ptr_t
39-
printf("sizeof(__ptr_t)=%d\n", sizeof(__ptr_t));
43+
printf("sizeof(__ptr_t)=%d\n", (int)sizeof(__ptr_t));
4044
#endif
4145

4246
printf("\nReturn value:\n");
4347
int r0 = foo_return_zero();
4448
int r1 = foo_return_one();
45-
printf("foo_return_zero=%d, foo_return_one=%d\n", r0, r1);
49+
int r2 = foo_return_one_arg1(r1);
50+
printf("foo_return_zero=%d, foo_return_one=%d, foo_return_one_arg1=%d\n", r0, r1, r2);
4651

4752
printf("\nCalling conventions:\n");
4853
print_jmpbuf();
@@ -60,6 +65,11 @@ int foo_return_one()
6065
return 1;
6166
}
6267

68+
int foo_return_one_arg1(int r0)
69+
{
70+
return r0 + 2;
71+
}
72+
6373
#ifdef __linux__
6474
#ifdef __mips__
6575
void print_jmpbuf()
@@ -102,6 +112,47 @@ void print_jmpbuf()
102112
unsigned char* p = (unsigned char*)ctx[0].__jb;
103113
print_buf(p, nn_jb);
104114
}
115+
#elif __loongarch__
116+
void print_jmpbuf()
117+
{
118+
// https://github.com/ossrs/state-threads/issues/24#porting
119+
register void* ra asm("r1"); // r1, ra, Return address
120+
register void* sp asm("r3"); // r3, sp, Stack pointer
121+
register void* fp asm("r22"); // r22, fp, Frame pointer
122+
// r23-r31, s0-s8, Subroutine register variable
123+
register void* s0 asm("r23");
124+
register void* s1 asm("r24");
125+
register void* s2 asm("r25");
126+
register void* s3 asm("r26");
127+
register void* s4 asm("r27");
128+
register void* s5 asm("r28");
129+
register void* s6 asm("r29");
130+
register void* s7 asm("r30");
131+
register void* s8 asm("r31");
132+
133+
/*
134+
struct __jmp_buf_tag {
135+
__jmp_buf __jmpbuf;
136+
int __mask_was_saved;
137+
__sigset_t __saved_mask;
138+
};
139+
typedef struct __jmp_buf_tag jmp_buf[1];
140+
*/
141+
jmp_buf ctx = {0};
142+
int r0 = setjmp(ctx);
143+
if (!r0) {
144+
longjmp(ctx, 1);
145+
}
146+
147+
printf("ra=%p, sp=%p, fp=%p, s0=%p, s1=%p, s2=%p, s3=%p, s4=%p, s5=%p, s6=%p, s7=%p, s7=%p\n",
148+
ra, sp, fp, s0, s1, s2, s3, s4, s5, s6, s7, s8);
149+
150+
int nn_jb = sizeof(ctx[0].__jmpbuf);
151+
printf("sizeof(jmp_buf)=%d (unsigned long long [%d])\n", nn_jb, nn_jb/8);
152+
153+
unsigned char* p = (unsigned char*)ctx[0].__jmpbuf;
154+
print_buf(p, nn_jb);
155+
}
105156
#endif
106157
#endif
107158

tools/verify/verify.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,37 @@ void verify_jmpbuf()
4848
unsigned char* p = (unsigned char*)ctx[0].__jb;
4949
print_buf(p, nn_jb);
5050
}
51+
#elif __loongarch__
52+
void verify_jmpbuf()
53+
{
54+
// https://github.com/ossrs/state-threads/issues/24#porting
55+
register void* ra asm("r1"); // r1, ra, Return address
56+
register void* sp asm("r3"); // r3, sp, Stack pointer
57+
register void* fp asm("r22"); // r22, fp, Frame pointer
58+
// r23-r31, s0-s8, Subroutine register variable
59+
register void* s0 asm("r23");
60+
register void* s1 asm("r24");
61+
register void* s2 asm("r25");
62+
register void* s3 asm("r26");
63+
register void* s4 asm("r27");
64+
register void* s5 asm("r28");
65+
register void* s6 asm("r29");
66+
register void* s7 asm("r30");
67+
register void* s8 asm("r31");
68+
69+
jmp_buf ctx = {0};
70+
int r0 = _st_md_cxt_save(ctx);
71+
if (!r0) {
72+
_st_md_cxt_restore(ctx, 1); // Restore/Jump to previous line, set r0 to 1.
73+
}
74+
75+
printf("sp=%p, ra=%p, fp=%p, s0=%p, s1=%p, s2=%p, s3=%p, s4=%p, s5=%p, s6=%p, s7=%p, s7=%p\n",
76+
sp, ra, fp, s0, s1, s2, s3, s4, s5, s6, s7, s8);
77+
78+
int nn_jb = sizeof(ctx[0].__jmpbuf);
79+
unsigned char* p = (unsigned char*)ctx[0].__jmpbuf;
80+
print_buf(p, nn_jb);
81+
}
5182
#endif
5283
#endif
5384

0 commit comments

Comments
 (0)