Tried to build --without-sb-thread but doesn't seem to have an effect. So I commented out in thread.c ----------- /* #ifdef LISP_FEATURE_OS_THREAD_STACK extern void* funcall1_switching_stack(void*, void *(*fun)(void *)); void* new_thread_trampoline_switch_stack(void* th) { return funcall1_switching_stack(th, new_thread_trampoline); } #endif */ ----------- Maybe I don't need this right now as in linux there doesn't seem to be an assembler file that does that part, too. Current "blocking" error is this (which seems to be independent from the mapping code below): "obj/from-xc/src/code/early-defmethod.lisp-obj" "obj/from-xc/src/code/format.lisp-obj" "obj/from-xc/src/code/target-format.lisp-obj" "obj/from-xc/src/code/late-globaldb.lisp-obj" ; in: SB-INT:NAMED-LAMBDA (SB-DISASSEM::INST-PRINTER SB-RISCV-ASM::C.J 1) ; (SB-DISASSEM::LOOKUP-LABEL SB-DISASSEM::|.T9|) ; ; note: deleting unreachable code ; (OR ; (GETHASH SB-DISASSEM::LAB ; (SB-DISASSEM::DSTATE-LABEL-HASH SB-DISASSEM::DSTATE)) ; SB-DISASSEM::LAB) ; --> IF ; ==> ; SB-DISASSEM::LAB ; ; note: deleting unreachable code ; (SB-DISASSEM::INST-PRINT-NAME SB-DISASSEM::INST) ; ; note: deleting unreachable code ; (SB-DISASSEM::DSTATE-ARGUMENT-COLUMN SB-DISASSEM::DSTATE) ; ; note: deleting unreachable code ; (SB-DISASSEM::LOCAL-PRINC16 SB-DISASSEM::|.T10|) ; ; note: deleting unreachable code ; (SB-DISASSEM:PRINC16 SB-DISASSEM::THING STREAM) ; ; note: deleting unreachable code ; (SB-DISASSEM:OPERAND SB-DISASSEM::THING SB-DISASSEM::DSTATE) ; ; note: deleting unreachable code ; ; compilation unit finished ; printed 7 notes ; in: ; SB-INT:NAMED-LAMBDA (SB-DISASSEM::INST-PRINTER SB-RISCV-ASM::C.BEQZ 1) ; (OR ; (GETHASH SB-DISASSEM::LAB ; (SB-DISASSEM::DSTATE-LABEL-HASH SB-DISASSEM::DSTATE)) ; SB-DISASSEM::LAB) ; --> IF ; ==> ; SB-DISASSEM::LAB ; ; note: deleting unreachable code ; (PRINC ", " STREAM) ; ; note: deleting unreachable code ; (SB-DISASSEM::INST-PRINT-NAME SB-DISASSEM::INST) ; ; note: deleting unreachable code ; (LET* ((SB-DISASSEM::|.T6| ; (THE (UNSIGNED-BYTE 2) (SB-DISASSEM::LOCAL-EXTRACT '#))) ; (SB-DISASSEM::|.T5| ; (THE (UNSIGNED-BYTE 2) (SB-DISASSEM::LOCAL-EXTRACT '#))) ; (SB-DISASSEM::|.T4| ; (THE (UNSIGNED-BYTE 1) (SB-DISASSEM::LOCAL-EXTRACT '#))) ; (SB-DISASSEM::|.T3| ; (THE (UNSIGNED-BYTE 2) (SB-DISASSEM::LOCAL-EXTRACT '#))) ; (SB-DISASSEM::|.T2| ; (THE (UNSIGNED-BYTE 1) (SB-DISASSEM::LOCAL-EXTRACT '#))) ; (SB-DISASSEM::|.T7| ; (SB-DISASSEM::ADJUST-LABEL ; (LIST SB-DISASSEM::|.T2| SB-DISASSEM::|.T3| SB-DISASSEM::|.T4| ; SB-DISASSEM::|.T5| SB-DISASSEM::|.T6|) ; #)) ; (SB-DISASSEM::|.T8| (SB-DISASSEM::LOOKUP-LABEL SB-DISASSEM::|.T7|)) ; (SB-DISASSEM::|.T1| ; (THE (UNSIGNED-BYTE 3) (SB-DISASSEM::LOCAL-EXTRACT '#)))) ; (SB-DISASSEM::LOCAL-PRINT-NAME) ; (SB-DISASSEM::LOCAL-TAB-TO-ARG-COLUMN) ; (SB-DISASSEM::LOCAL-CALL-ARG-PRINTER SB-DISASSEM::|.T1| ; #) ; (SB-DISASSEM::LOCAL-PRINT-ARG-SEPARATOR) ; (SB-DISASSEM::LOCAL-PRINC16 SB-DISASSEM::|.T8|)) ; ; note: deleting unreachable code ; (SB-DISASSEM::DSTATE-ARGUMENT-COLUMN SB-DISASSEM::DSTATE) ; ; note: deleting unreachable code ; (SB-DISASSEM:PRINC16 SB-DISASSEM::THING STREAM) ; ; note: deleting unreachable code ; (SB-DISASSEM:OPERAND SB-DISASSEM::THING SB-DISASSEM::DSTATE) ; ; note: deleting unreachable code ; ; compilation unit finished ; printed 7 notes CORRUPTION WARNING Looks there is some "problem" in compiler/riscv/insts.lisp or compiler/riscv/target-insts.lisp as package SB-RISCV-ASM is defined there ? --------------------- Current mapping (c.f. riscv-lispreags.h) os_context_register_addr(os_context_t *context, int regno) { switch (regno) { // c.f.: https://en.wikichip.org/wiki/risc-v/registers case reg_RA: return (&context->sc_ra); // return address case reg_NSP: return (&context->sc_sp); // stack pointer case reg_GLOBAL: return (&context->sc_gp); // global pointer case reg_TP: return (&context->sc_tp); // thread pointer case reg_LIP: case reg_CFP: case reg_OCFP: case reg_LEXENV: case reg_NULL: case reg_CODE: case reg_NARGS: return (&context->sc_t[regno]); // temporary register 0 - 6 case reg_NFP: case reg_CSP: case reg_A4: case reg_NL4: case reg_A5: case reg_NL5: case reg_L0: case reg_NL6: case reg_L1: case reg_NL7: #ifdef LISP_FEATURE_SB_THREAD case reg_THREAD: #else case reg_L2: #endif case reg_CFUNC: return (&context->sc_s[regno]); // saved register 0 - 11 case reg_A0: case reg_NL0: case reg_A1: case reg_NL1: case reg_A2: case reg_NL2: case reg_A3: case reg_NL3: return (&context->sc_a[regno]); // function argument register 0 - 7 default: return (&context->sc_sepc); // exception program counter } } os_context_register_t * os_context_float_register_addr(os_context_t *context, int offset) { return (&context->sc_f[offset]); // floating-point registers } void os_restore_fp_control(os_context_t *context) { // ToDo // (&context->sc_fcsr); // floating-point control register } os_context_register_t * os_context_lr_addr(os_context_t *context) { return os_context_register_addr(context, reg_LIP); } ------------------------------