X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-arch.c;h=a62d20443e19b0368d53b22d1e5b127178e8c5d3;hb=3fe0010d2777b41e01ea9b4a0f894cfa40f7df1b;hp=e0806155810426f9d580448c1780ccf2606289d5;hpb=5813c792f8a5d69dd796d2b545b8f7867ddef389;p=sbcl.git diff --git a/src/runtime/x86-arch.c b/src/runtime/x86-arch.c index e080615..a62d204 100644 --- a/src/runtime/x86-arch.c +++ b/src/runtime/x86-arch.c @@ -11,11 +11,11 @@ #include +#include "sbcl.h" #include "runtime.h" #include "globals.h" #include "validate.h" #include "os.h" -#include "sbcl.h" #include "arch.h" #include "lispregs.h" #include "signal.h" @@ -57,6 +57,8 @@ context_eflags_addr(os_context_t *context) return &context->uc_mcontext.mc_eflags; #elif defined __OpenBSD__ return &context->sc_eflags; +#elif defined __NetBSD__ + return &(context->uc_mcontext.__gregs[_REG_EFL]); #else #error unsupported OS #endif @@ -72,8 +74,7 @@ void arch_skip_instruction(os_context_t *context) int vlen; int code; - FSHOW((stderr, "/[arch_skip_inst at %x]\n", *os_context_pc_addr(context))); - + /* Get and skip the Lisp interrupt code. */ code = *(char*)(*os_context_pc_addr(context))++; switch (code) @@ -84,7 +85,7 @@ void arch_skip_instruction(os_context_t *context) vlen = *(char*)(*os_context_pc_addr(context))++; /* Skip Lisp error arg data bytes. */ while (vlen-- > 0) { - ( (char*)(*os_context_pc_addr(context)) )++; + ++*os_context_pc_addr(context); } break; @@ -141,18 +142,6 @@ arch_install_breakpoint(void *pc) return result; } -void -get_spinlock(lispobj *word,int value) -{ - u32 eax=0; - do { - asm ("xor %0,%0;lock cmpxchg %1,%2" - : "=a" (eax) - : "r" (value), "m" (*word) - : "memory", "cc"); - } while(eax!=0); -} - void arch_remove_breakpoint(void *pc, unsigned long orig_inst) { @@ -254,7 +243,7 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context) case trap_PendingInterrupt: FSHOW((stderr, "/\n")); arch_skip_instruction(context); - interrupt_handle_pending(context); + interrupt_handle_pending(context); break; case trap_Halt: @@ -272,12 +261,12 @@ sigtrap_handler(int signal, siginfo_t *info, void *void_context) break; case trap_Breakpoint: - (char*)(*os_context_pc_addr(context)) -= 1; + --*os_context_pc_addr(context); handle_breakpoint(signal, info, context); break; case trap_FunEndBreakpoint: - (char*)(*os_context_pc_addr(context)) -= 1; + --*os_context_pc_addr(context); *os_context_pc_addr(context) = (int)handle_fun_end_breakpoint(signal, info, context); break; @@ -363,3 +352,35 @@ funcall3(lispobj function, lispobj arg0, lispobj arg1, lispobj arg2) args[2] = arg2; return call_into_lisp(function, args, 3); } + +#ifdef LISP_FEATURE_LINKAGE_TABLE +/* FIXME: It might be cleaner to generate these from the lisp side of + * things. + */ + +void +arch_write_linkage_table_jmp(char * reloc, void * fun) +{ + /* Make JMP to function entry. JMP offset is calculated from next + * instruction. + */ + long offset = (char *)fun - (reloc + 5); + int i; + + *reloc++ = 0xe9; /* opcode for JMP rel32 */ + for (i = 0; i < 4; i++) { + *reloc++ = offset & 0xff; + offset >>= 8; + } + + /* write a nop for good measure. */ + *reloc = 0x90; +} + +void +arch_write_linkage_table_ref(void * reloc, void * data) +{ + *(unsigned long *)reloc = (unsigned long)data; +} + +#endif