diff --git a/.gitignore b/.gitignore index e9b5ce8..20f6130 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ googletest-* *.gcno coverage codecov +*.dSYM diff --git a/LICENSE b/LICENSE index 1bb04f3..04f1913 100644 --- a/LICENSE +++ b/LICENSE @@ -7,7 +7,7 @@ Individual files contain the following tag instead of the full license text. SPDX-License-Identifier: MPL-1.1 OR GPL-2.0-or-later -Some ASM codes for new porting OS/CPU, "utest" and "porting" directory is +All source code in the "tools", "utest" and "porting" directory is distributed under the MIT style license. SPDX-License-Identifier: MIT diff --git a/porting/.gitignore b/tools/porting/.gitignore similarity index 100% rename from porting/.gitignore rename to tools/porting/.gitignore diff --git a/porting/Makefile b/tools/porting/Makefile similarity index 89% rename from porting/Makefile rename to tools/porting/Makefile index b1fc081..e31722b 100644 --- a/porting/Makefile +++ b/tools/porting/Makefile @@ -1,5 +1,7 @@ .PHONY: clean +CFLAGS=-g -O0 + ./porting: porting.c $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -Wall -o $@ $^ $(LDLIBS) diff --git a/porting/porting.c b/tools/porting/porting.c similarity index 68% rename from porting/porting.c rename to tools/porting/porting.c index ada15be..d07db2f 100644 --- a/porting/porting.c +++ b/tools/porting/porting.c @@ -20,7 +20,7 @@ int main(int argc, char** argv) printf("\nCPU specs:\n"); #ifdef __mips__ // https://s3-eu-west-1.amazonaws.com/downloads-mips/documents/MD00565-2B-MIPS32-QRC-01.01.pdf - printf("__mips__: %d, __mips:%d, __mips_isa_rev:%d, _MIPSEL:%d\n", __mips__, __mips, __mips_isa_rev, _MIPSEL); + printf("__mips__: %d, __mips:%d, _MIPSEL:%d\n", __mips__, __mips, _MIPSEL); #endif #ifdef __x86_64__ printf("__x86_64__: %d\n", __x86_64__); @@ -48,20 +48,20 @@ int main(int argc, char** argv) void print_jmpbuf() { // https://en.wikipedia.org/wiki/MIPS_architecture#Calling_conventions - register long int gp asm("gp"); - register long int sp asm("sp"); - register long int fp asm("fp"); + register void* gp asm("gp"); + register void* sp asm("sp"); + register void* fp asm("fp"); // $s0–$s7 $16–$23 saved temporaries - register long int s0 asm("s0"); - register long int s1 asm("s1"); - register long int s2 asm("s2"); - register long int s3 asm("s3"); - register long int s4 asm("s4"); - register long int s5 asm("s5"); - register long int s6 asm("s6"); - register long int s7 asm("s7"); + register void* s0 asm("s0"); + register void* s1 asm("s1"); + register void* s2 asm("s2"); + register void* s3 asm("s3"); + register void* s4 asm("s4"); + register void* s5 asm("s5"); + register void* s6 asm("s6"); + register void* s7 asm("s7"); printf("gp=%p, fp=%p, sp=%p, s0=%p, s1=%p, s2=%p, s3=%p, s4=%p, s5=%p, s6=%p, s7=%p\n", - (void*)gp, (void*)fp, (void*)sp, (void*)s0, (void*)s1, (void*)s2, (void*)s3, (void*)s4, (void*)s5, (void*)s6, (void*)s7); + gp, fp, sp, s0, s1, s2, s3, s4, s5, s6, s7); /* typedef unsigned long long __jmp_buf[13]; @@ -88,15 +88,17 @@ void print_jmpbuf() void print_jmpbuf() { // https://courses.cs.washington.edu/courses/cse378/10au/sections/Section1_recap.pdf - register long int rsp asm("rsp"); - register long int rbx asm("rbx"); - register long int rbp asm("rbp"); - register long int r12 asm("r12"); - register long int r13 asm("r13"); - register long int r14 asm("r14"); - register long int r15 asm("r15"); - printf("rsp=%p, rbx=%p, rbp=%p, r12=%p, r13=%p, r14=%p, r15=%p\n", - (void*)rbx, (void*)rbp, (void*)r12, (void*)r13, (void*)r14, (void*)r15); + void *rbx, *rbp, *r12, *r13, *r14, *r15, *rsp; + __asm__ __volatile__ ("movq %%rbx,%0": "=r"(rbx): /* No input */); + __asm__ __volatile__ ("movq %%rbp,%0": "=r"(rbp): /* No input */); + __asm__ __volatile__ ("movq %%r12,%0": "=r"(r12): /* No input */); + __asm__ __volatile__ ("movq %%r13,%0": "=r"(r13): /* No input */); + __asm__ __volatile__ ("movq %%r14,%0": "=r"(r14): /* No input */); + __asm__ __volatile__ ("movq %%r15,%0": "=r"(r15): /* No input */); + __asm__ __volatile__ ("movq %%rsp,%0": "=r"(rsp): /* No input */); + + printf("rbx=%p, rbp=%p,%p, r12=%p, r13=%p, r14=%p, r15=%p, rsp=%p\n", + rbx, rbp, rbp2, r12, r13, r14, r15, rsp); jmp_buf ctx = {0}; setjmp(ctx); diff --git a/tools/verify/.gitignore b/tools/verify/.gitignore new file mode 100644 index 0000000..0b59873 --- /dev/null +++ b/tools/verify/.gitignore @@ -0,0 +1 @@ +verify diff --git a/tools/verify/Makefile b/tools/verify/Makefile new file mode 100644 index 0000000..5b1671b --- /dev/null +++ b/tools/verify/Makefile @@ -0,0 +1,11 @@ +.PHONY: clean + +LDLIBS=../../obj/libst.a +CFLAGS=-g -O0 + +./verify: verify.c + $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -Wall -o $@ $^ $(LDLIBS) + +clean: + rm -f verify + diff --git a/tools/verify/verify.c b/tools/verify/verify.c new file mode 100644 index 0000000..d04dbd2 --- /dev/null +++ b/tools/verify/verify.c @@ -0,0 +1,95 @@ +/* SPDX-License-Identifier: MIT */ +/* Copyright (c) 2021 Winlin */ + +#include + +#include +extern int _st_md_cxt_save(jmp_buf env); +extern void _st_md_cxt_restore(jmp_buf env, int val); + +void verify_jmpbuf(); +void print_buf(unsigned char* p, int nn_jb); + +int main(int argc, char** argv) +{ + verify_jmpbuf(); + return 0; +} + +#ifdef __linux__ +#ifdef __mips__ +void verify_jmpbuf() +{ + // https://en.wikipedia.org/wiki/MIPS_architecture#Calling_conventions + register void* gp asm("gp"); + register void* sp asm("sp"); + register void* fp asm("fp"); + // $s0–$s7 $16–$23 saved temporaries + register void* s0 asm("s0"); + register void* s1 asm("s1"); + register void* s2 asm("s2"); + register void* s3 asm("s3"); + register void* s4 asm("s4"); + register void* s5 asm("s5"); + register void* s6 asm("s6"); + register void* s7 asm("s7"); + printf("gp=%p, fp=%p, sp=%p, s0=%p, s1=%p, s2=%p, s3=%p, s4=%p, s5=%p, s6=%p, s7=%p\n", + gp, fp, sp, s0, s1, s2, s3, s4, s5, s6, s7); + + jmp_buf ctx = {0}; + _st_md_cxt_save(ctx); + + int nn_jb = sizeof(ctx[0].__jb); + unsigned char* p = (unsigned char*)ctx[0].__jb; + print_buf(p, nn_jb); +} +#endif +#endif + +#ifdef __APPLE__ +#ifdef __x86_64__ +void verify_jmpbuf() +{ + // https://courses.cs.washington.edu/courses/cse378/10au/sections/Section1_recap.pdf + void *rbx, *rbp, *r12, *r13, *r14, *r15, *rsp; + __asm__ __volatile__ ("movq %%rbx,%0": "=r"(rbx): /* No input */); + __asm__ __volatile__ ("movq %%rbp,%0": "=r"(rbp): /* No input */); + __asm__ __volatile__ ("movq %%r12,%0": "=r"(r12): /* No input */); + __asm__ __volatile__ ("movq %%r13,%0": "=r"(r13): /* No input */); + __asm__ __volatile__ ("movq %%r14,%0": "=r"(r14): /* No input */); + __asm__ __volatile__ ("movq %%r15,%0": "=r"(r15): /* No input */); + __asm__ __volatile__ ("movq %%rsp,%0": "=r"(rsp): /* No input */); + + printf("rbx=%p, rbp=%p,%p, r12=%p, r13=%p, r14=%p, r15=%p, rsp=%p\n", + rbx, rbp, rbp2, r12, r13, r14, r15, rsp); + + jmp_buf ctx = {0}; + _st_md_cxt_save(ctx); + + int nn_jb = sizeof(ctx); + printf("sizeof(jmp_buf)=%d (unsigned long long [%d])\n", nn_jb, nn_jb/8); + + unsigned char* p = (unsigned char*)ctx; + print_buf(p, nn_jb); +} +#endif +#endif + +void print_buf(unsigned char* p, int nn_jb) +{ + printf(" "); + + for (int i = 0; i < nn_jb; i++) { + printf("0x%02x ", (unsigned char)p[i]); + + int newline = ((i + 1) % sizeof(void*)); + if (!newline || i == nn_jb - 1) { + printf("\n"); + } + + if (!newline && i < nn_jb - 1) { + printf(" "); + } + } +} +