projects
/
sbcl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
0.9.10.30:
[sbcl.git]
/
src
/
runtime
/
x86-arch.c
diff --git
a/src/runtime/x86-arch.c
b/src/runtime/x86-arch.c
index
5e46ac3
..
9d76b93
100644
(file)
--- a/
src/runtime/x86-arch.c
+++ b/
src/runtime/x86-arch.c
@@
-35,6
+35,15
@@
unsigned long fast_random_state = 1;
void arch_init(void)
{}
void arch_init(void)
{}
+
+#ifndef LISP_FEATURE_WIN32
+os_vm_address_t
+arch_get_bad_addr(int sig, siginfo_t *code, os_context_t *context)
+{
+ return (os_vm_address_t)code->si_addr;
+}
+#endif
+
\f
/*
* hacking signal contexts
\f
/*
* hacking signal contexts
@@
-46,7
+55,7
@@
void arch_init(void)
int *
context_eflags_addr(os_context_t *context)
{
int *
context_eflags_addr(os_context_t *context)
{
-#if defined __linux__
+#if defined __linux__ || defined __sun
/* KLUDGE: As of kernel 2.2.14 on Red Hat 6.2, there's code in the
* <sys/ucontext.h> file to define symbolic names for offsets into
* gregs[], but it's conditional on __USE_GNU and not defined, so
/* KLUDGE: As of kernel 2.2.14 on Red Hat 6.2, there's code in the
* <sys/ucontext.h> file to define symbolic names for offsets into
* gregs[], but it's conditional on __USE_GNU and not defined, so
@@
-57,8
+66,12
@@
context_eflags_addr(os_context_t *context)
return &context->uc_mcontext.mc_eflags;
#elif defined __OpenBSD__
return &context->sc_eflags;
return &context->uc_mcontext.mc_eflags;
#elif defined __OpenBSD__
return &context->sc_eflags;
+#elif defined LISP_FEATURE_DARWIN
+ return &context->uc_mcontext->ss.eflags;
#elif defined __NetBSD__
return &(context->uc_mcontext.__gregs[_REG_EFL]);
#elif defined __NetBSD__
return &(context->uc_mcontext.__gregs[_REG_EFL]);
+#elif defined LISP_FEATURE_WIN32
+ return (int *)&context->EFlags;
#else
#error unsupported OS
#endif
#else
#error unsupported OS
#endif
@@
-126,15
+139,22
@@
arch_set_pseudo_atomic_interrupted(os_context_t *context)
SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(1),
arch_os_get_current_thread());
}
SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(1),
arch_os_get_current_thread());
}
+
+void
+arch_clear_pseudo_atomic_interrupted(os_context_t *context)
+{
+ SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0),
+ arch_os_get_current_thread());
+}
\f
/*
* This stuff seems to get called for TRACE and debug activity.
*/
\f
/*
* This stuff seems to get called for TRACE and debug activity.
*/
-unsigned long
+unsigned int
arch_install_breakpoint(void *pc)
{
arch_install_breakpoint(void *pc)
{
- unsigned long result = *(unsigned long*)pc;
+ unsigned int result = *(unsigned int*)pc;
*(char*)pc = BREAKPOINT_INST; /* x86 INT3 */
*((char*)pc+1) = trap_Breakpoint; /* Lisp trap code */
*(char*)pc = BREAKPOINT_INST; /* x86 INT3 */
*((char*)pc+1) = trap_Breakpoint; /* Lisp trap code */
@@
-143,7
+163,7
@@
arch_install_breakpoint(void *pc)
}
void
}
void
-arch_remove_breakpoint(void *pc, unsigned long orig_inst)
+arch_remove_breakpoint(void *pc, unsigned int orig_inst)
{
*((char *)pc) = orig_inst & 0xff;
*((char *)pc + 1) = (orig_inst & 0xff00) >> 8;
{
*((char *)pc) = orig_inst & 0xff;
*((char *)pc + 1) = (orig_inst & 0xff00) >> 8;
@@
-180,7
+200,7
@@
arch_do_displaced_inst(os_context_t *context, unsigned int orig_inst)
*context_eflags_addr(context) |= 0x100;
#endif
*context_eflags_addr(context) |= 0x100;
#endif
- single_stepping = (unsigned int*)pc;
+ single_stepping = pc;
#ifdef CANNOT_GET_TO_SINGLE_STEP_FLAG
*os_context_pc_addr(context) = (char *)pc - 9;
#ifdef CANNOT_GET_TO_SINGLE_STEP_FLAG
*os_context_pc_addr(context) = (char *)pc - 9;
@@
-190,10
+210,10
@@
arch_do_displaced_inst(os_context_t *context, unsigned int orig_inst)
void
sigtrap_handler(int signal, siginfo_t *info, void *void_context)
{
void
sigtrap_handler(int signal, siginfo_t *info, void *void_context)
{
- int code = info->si_code;
os_context_t *context = (os_context_t*)void_context;
unsigned int trap;
os_context_t *context = (os_context_t*)void_context;
unsigned int trap;
+#ifndef LISP_FEATURE_WIN32
if (single_stepping && (signal==SIGTRAP))
{
/* fprintf(stderr,"* single step trap %x\n", single_stepping); */
if (single_stepping && (signal==SIGTRAP))
{
/* fprintf(stderr,"* single step trap %x\n", single_stepping); */
@@
-217,6
+237,7
@@
sigtrap_handler(int signal, siginfo_t *info, void *void_context)
single_stepping = NULL;
return;
}
single_stepping = NULL;
return;
}
+#endif
/* This is just for info in case the monitor wants to print an
* approximation. */
/* This is just for info in case the monitor wants to print an
* approximation. */
@@
-238,6
+259,7
@@
sigtrap_handler(int signal, siginfo_t *info, void *void_context)
* number of bytes will follow, the first is the length of the byte
* arguments to follow. */
trap = *(unsigned char *)(*os_context_pc_addr(context));
* number of bytes will follow, the first is the length of the byte
* arguments to follow. */
trap = *(unsigned char *)(*os_context_pc_addr(context));
+ /* FSHOW((stderr, "/<sigtrap trap %d at pc_addr: %p>\n", trap, *os_context_pc_addr(context))); */
switch (trap) {
case trap_PendingInterrupt:
switch (trap) {
case trap_PendingInterrupt:
@@
-252,12
+274,12
@@
sigtrap_handler(int signal, siginfo_t *info, void *void_context)
* seems to be no point in doing that, since we're just
* going to lose(..) anyway. */
fake_foreign_function_call(context);
* seems to be no point in doing that, since we're just
* going to lose(..) anyway. */
fake_foreign_function_call(context);
- lose("%%PRIMITIVE HALT called; the party is over.");
+ lose("%%PRIMITIVE HALT called; the party is over.\n");
case trap_Error:
case trap_Cerror:
case trap_Error:
case trap_Cerror:
- FSHOW((stderr, "<trap error/cerror %d>\n", code));
- interrupt_internal_error(signal, info, context, code==trap_Cerror);
+ FSHOW((stderr, "<trap error/cerror %d>\n", trap));
+ interrupt_internal_error(signal, info, context, trap==trap_Cerror);
break;
case trap_Breakpoint:
break;
case trap_Breakpoint:
@@
-273,7
+295,7
@@
sigtrap_handler(int signal, siginfo_t *info, void *void_context)
default:
FSHOW((stderr,"/[C--trap default %d %d %x]\n",
default:
FSHOW((stderr,"/[C--trap default %d %d %x]\n",
- signal, code, context));
+ signal, trap, context));
interrupt_handle_now(signal, info, context);
break;
}
interrupt_handle_now(signal, info, context);
break;
}
@@
-282,6
+304,14
@@
sigtrap_handler(int signal, siginfo_t *info, void *void_context)
static void
sigill_handler(int signal, siginfo_t *siginfo, void *void_context) {
os_context_t *context = (os_context_t*)void_context;
static void
sigill_handler(int signal, siginfo_t *siginfo, void *void_context) {
os_context_t *context = (os_context_t*)void_context;
+
+#if defined(LISP_FEATURE_DARWIN)
+ if (*((unsigned short *)*os_context_pc_addr(context)) == 0x0b0f) {
+ *os_context_pc_addr(context) += 2;
+ return sigtrap_handler(signal, siginfo, void_context);
+ }
+#endif
+
fake_foreign_function_call(context);
monitor_or_something();
}
fake_foreign_function_call(context);
monitor_or_something();
}
@@
-301,8
+331,10
@@
arch_install_interrupt_handlers()
* OS I haven't tested on?) and we have to go back to the old CMU
* CL way, I hope there will at least be a comment to explain
* why.. -- WHN 2001-06-07 */
* OS I haven't tested on?) and we have to go back to the old CMU
* CL way, I hope there will at least be a comment to explain
* why.. -- WHN 2001-06-07 */
+#ifndef LISP_FEATURE_WIN32
undoably_install_low_level_interrupt_handler(SIGILL , sigill_handler);
undoably_install_low_level_interrupt_handler(SIGTRAP, sigtrap_handler);
undoably_install_low_level_interrupt_handler(SIGILL , sigill_handler);
undoably_install_low_level_interrupt_handler(SIGTRAP, sigtrap_handler);
+#endif
SHOW("returning from arch_install_interrupt_handlers()");
}
SHOW("returning from arch_install_interrupt_handlers()");
}