Comment 6 for bug 2029382

Revision history for this message
Robert Palm (r-p-x) wrote :

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|)
; #<FUNCTION SB-RISCV-ASM::USE-CB-LABEL>))
; (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|
; #<FUNCTION SB-RISCV-ASM::PRINT-RVC-REG>)
; (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);
}
------------------------------