From: Christophe R. <cr...@us...> - 2005-04-05 16:38:27
|
Update of /cvsroot/sbcl/sbcl/src/runtime In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21323/src/runtime Modified Files: Config.mips-linux globals.h mips-arch.c mips-arch.h mips-assem.S Log Message: 0.8.21.18: Patch from Thiemo Seufer / Peter van Eynde for MIPS assembly code ... maybe fixes stability problems. Index: Config.mips-linux =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/Config.mips-linux,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Config.mips-linux 30 Oct 2003 17:27:36 -0000 1.2 +++ Config.mips-linux 5 Apr 2005 16:38:17 -0000 1.3 @@ -7,15 +7,15 @@ # provided with absolutely no warranty. See the COPYING and CREDITS # files for more information. -CFLAGS += -g -O0 -LD = ld -LINKFLAGS = -v -g +CFLAGS += -Dmips -g +LD = ld +LINKFLAGS = -v -g -O2 NM = nm -p ASSEM_SRC = mips-assem.S ldso-stubs.S ARCH_SRC = mips-arch.c #undefineds.c -OS_SRC = linux-os.c mips-linux-os.c os-common.c +OS_SRC = linux-os.c mips-linux-os.c os-common.c OS_LIBS= -ldl GC_SRC= cheneygc.c Index: globals.h =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/globals.h,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- globals.h 10 Aug 2004 00:20:46 -0000 1.19 +++ globals.h 5 Apr 2005 16:38:17 -0000 1.20 @@ -43,8 +43,12 @@ #else /* LANGUAGE_ASSEMBLY */ #ifdef mips +#ifdef __linux__ +#define EXTERN(name,bytes) .globl name +#else #define EXTERN(name,bytes) .extern name bytes #endif +#endif /**/ #ifdef sparc #ifdef SVR4 Index: mips-arch.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/mips-arch.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- mips-arch.c 10 Aug 2004 00:20:47 -0000 1.6 +++ mips-arch.c 5 Apr 2005 16:38:17 -0000 1.7 @@ -40,8 +40,8 @@ long opcode = inst >> 26; long r1 = (inst >> 21) & 0x1f; long r2 = (inst >> 16) & 0x1f; - long bdisp = (inst&(1<<15)) ? inst | (-1 << 16) : inst&0xffff; - long jdisp = (inst&(1<<25)) ? inst | (-1 << 26) : inst&0xffff; + long bdisp = ((inst&(1<<15)) ? inst | (-1 << 16) : inst&0x7fff) << 2; + long jdisp = (inst&0x3ffffff) << 2; long disp = 0; switch(opcode) { @@ -77,17 +77,14 @@ != *os_context_register_addr(context, r2)) disp = bdisp; break; - case 0x6: /* ble */ + case 0x6: /* blez */ if(*os_context_register_addr(context, r1) - /* FIXME: One has to assume that the CMUCL gods of old have - got the sign issues right... but it might be worth - checking, someday */ <= *os_context_register_addr(context, r2)) disp = bdisp; break; case 0x7: /* bgtz */ if(*os_context_register_addr(context, r1) - >= *os_context_register_addr(context, r2)) + > *os_context_register_addr(context, r2)) disp = bdisp; break; case 0x2: /* j */ @@ -98,7 +95,7 @@ *os_context_register_addr(context, 31) = *os_context_pc_addr(context) + 4; break; } - return (*os_context_pc_addr(context) + disp * 4); + return (*os_context_pc_addr(context) + disp); } void arch_skip_instruction(os_context_t *context) @@ -166,9 +163,9 @@ void arch_do_displaced_inst(os_context_t *context, unsigned int orig_inst) { - unsigned long *pc = (unsigned long *)*os_context_pc_addr(context); - unsigned long *break_pc, *next_pc; - unsigned long next_inst; + unsigned int *pc = (unsigned int *)*os_context_pc_addr(context); + unsigned int *break_pc, *next_pc; + unsigned int next_inst; int opcode; orig_sigmask = *os_context_sigmask_addr(context); @@ -186,7 +183,7 @@ /* Put the original instruction back. */ *break_pc = orig_inst; - os_flush_icache((os_vm_address_t)break_pc, sizeof(unsigned long)); + os_flush_icache((os_vm_address_t)break_pc, sizeof(unsigned int)); skipped_break_addr = break_pc; /* Figure out where it goes. */ @@ -200,18 +197,18 @@ displaced_after_inst = *next_pc; *next_pc = (trap_AfterBreakpoint << 16) | 0xd; - os_flush_icache((os_vm_address_t)next_pc, sizeof(unsigned long)); + os_flush_icache((os_vm_address_t)next_pc, sizeof(unsigned int)); } static void sigtrap_handler(int signal, siginfo_t *info, void *void_context) { os_context_t *context = arch_os_get_context(&void_context); sigset_t *mask; - int code; + unsigned int code; /* Don't disallow recursive breakpoint traps. Otherwise, we can't */ /* use debugger breakpoints anywhere in here. */ mask = os_context_sigmask_addr(context); - sigsetmask(mask); + sigprocmask(SIG_SETMASK, mask, NULL); code = ((*(int *) (*os_context_pc_addr(context))) >> 16) & 0x1f; switch (code) { @@ -243,7 +240,7 @@ sizeof(unsigned long)); skipped_break_addr = NULL; *(unsigned long *)(*os_context_pc_addr(context)) = displaced_after_inst; - os_flush_icache((os_vm_address_t) *os_context_pc_addr(context), sizeof(unsigned long)); + os_flush_icache((os_vm_address_t) *os_context_pc_addr(context), sizeof(unsigned int)); *os_context_sigmask_addr(context) = orig_sigmask; break; Index: mips-arch.h =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/mips-arch.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- mips-arch.h 22 Mar 2005 14:02:22 -0000 1.3 +++ mips-arch.h 5 Apr 2005 16:38:17 -0000 1.4 @@ -3,13 +3,13 @@ static inline void -get_spinlock(lispobj *word,long value) +get_spinlock(volatile lispobj *word, long value) { *word=value; /* FIXME for threads */ } static inline void -release_spinlock(lispobj *word) +release_spinlock(volatile lispobj *word) { *word=0; } Index: mips-assem.S =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/mips-assem.S,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- mips-assem.S 7 Mar 2003 15:40:15 -0000 1.2 +++ mips-assem.S 5 Apr 2005 16:38:17 -0000 1.3 @@ -1,14 +1,13 @@ -#define LANGUAGE_ASSEMBLY - -#include "sbcl.h" +#include "sbcl.h" #include "lispregs.h" +#include "globals.h" #include "genesis/fdefn.h" #include "genesis/closure.h" #include "genesis/simple-fun.h" #include "genesis/static-symbols.h" #define zero $0 -#define at $1 +#define AT $1 #define v0 $2 #define v1 $3 #define a0 $4 @@ -40,21 +39,37 @@ #define s8 $30 #define ra $31 +/* + * NESTED - declare nested routine entry point + */ +#define NESTED(symbol, framesize, rpc) \ + .globl symbol; \ + .align 2; \ + .type symbol,@function; \ + .ent symbol,0; \ +symbol: .frame sp, framesize, rpc + +/* + * END - mark end of function + */ +#define END(function) \ + .end function; \ + .size function,.-function + + + .text /* * Function to transfer control into lisp. */ - .text - .globl call_into_lisp - .ent call_into_lisp -call_into_lisp: -#define framesize 12*4 +#define framesize 16*4 + NESTED(call_into_lisp, framesize, ra) subu sp, framesize - .frame sp, framesize, ra /* Save all the C regs. */ - .mask 0xc0ff0000, 0 + .mask 0xd0ff0000, -4 sw ra, framesize(sp) sw s8, framesize-4(sp) + sw gp, framesize-8(sp) sw s7, framesize-12(sp) sw s6, framesize-16(sp) sw s5, framesize-20(sp) @@ -110,9 +125,9 @@ .set reorder /* Pass in args */ - move reg_LEXENV, $4 - move reg_CFP, $5 - sll reg_NARGS, $6, 2 + move reg_LEXENV, a0 + move reg_CFP, a1 + sll reg_NARGS, a2, 2 lw reg_A0, 0(reg_CFP) lw reg_A1, 4(reg_CFP) lw reg_A2, 8(reg_CFP) @@ -128,7 +143,7 @@ /* Jump into lisp land. */ addu reg_LIP, reg_CODE, 6*4 - FUN_POINTER_LOWTAG - j reg_LIP + jr reg_LIP .set noreorder .align 3 @@ -179,6 +194,7 @@ /* Restore C regs */ lw ra, framesize(sp) lw s8, framesize-4(sp) + lw gp, framesize-8(sp) lw s7, framesize-12(sp) lw s6, framesize-16(sp) lw s5, framesize-20(sp) @@ -192,16 +208,17 @@ addu sp, framesize /* Back we go. */ - j ra + jr ra - .end call_into_lisp + END(call_into_lisp) /* * Transfering control from Lisp into C */ - .text .globl call_into_c - .ent call_into_c + .align 2 + .type call_into_c,@function + .ent call_into_c,0 call_into_c: /* Set up a stack frame. */ move reg_OCFP, reg_CFP @@ -243,7 +260,7 @@ /* Into C land we go. */ move t9, reg_CFUNC - jal t9 + jalr t9 nop lw gp, 12(reg_CFP) @@ -299,16 +316,14 @@ /* Return to LISP. */ j reg_LIP - .end call_into_c + END(call_into_c) - .text .globl start_of_tramps start_of_tramps: /* * The undefined-function trampoline. */ - .text .globl undefined_tramp .ent undefined_tramp undefined_tramp: @@ -324,7 +339,6 @@ /* * The closure trampoline. */ - .text .globl closure_tramp .ent closure_tramp closure_tramp: @@ -334,7 +348,6 @@ j reg_LIP .end closure_tramp - .text .globl end_of_tramps end_of_tramps: @@ -343,7 +356,6 @@ * Function-end breakpoint magic. */ - .text .align 2 .set noreorder .globl function_end_breakpoint_guts @@ -371,67 +383,3 @@ .globl fun_end_breakpoint_end fun_end_breakpoint_end: .set reorder - -/* FIXME: I don't think the below are actually used anywhere */ - .text - .align 2 - .globl call_on_stack - .ent call_on_stack -call_on_stack: - subu sp, a1, 16 - jal a0 - break 0 - .end call_on_stack - - .globl save_state - .ent save_state -save_state: - subu sp, 40 - .frame sp, 40, ra - /* Save all the C regs. */ - .mask 0xc0ff0000, 0 - sw ra, 40(sp) - sw s8, 40-4(sp) - sw s7, 40-8(sp) - sw s6, 40-12(sp) - sw s5, 40-16(sp) - sw s4, 40-20(sp) - sw s3, 40-24(sp) - sw s2, 40-28(sp) - sw s1, 40-32(sp) - sw s0, 40-36(sp) - - /* Should also save the floating point state. */ - - move t0, a0 - move a0, sp - - jal t0 - -_restore_state: - - lw ra, 40(sp) - lw s8, 40-4(sp) - lw s7, 40-8(sp) - lw s6, 40-12(sp) - lw s5, 40-16(sp) - lw s4, 40-20(sp) - lw s3, 40-24(sp) - lw s2, 40-28(sp) - lw s1, 40-32(sp) - lw s0, 40-36(sp) - - addu sp, 40 - j ra - - .globl restore_state -restore_state: - move sp, a0 - move v0, a1 - j _restore_state - .end save_state - - - - - |