Update of /cvsroot/sbcl/sbcl/src/runtime
In directory usw-pr-cvs1:/tmp/cvs-serv22592/src/runtime
Modified Files:
GNUmakefile bsd-os.c bsd-os.h globals.c interrupt.c
interrupt.h linux-os.c linux-os.h osf1-os.c osf1-os.h
runtime.c sunos-os.c sunos-os.h validate.c validate.h
x86-linux-os.c
Log Message:
0.7.6.1:
Mostly-tested but still considered "experimental" non-invasive
stack exhaustion checking, using a guard page at the end of the
stack and an extra clause in the sigsegv (on some ports, sigbus)
handler. One day there will be an internals doc with the
gory details: for now, try http://ww.telent.net/diary/2002/7/#23.59392
Index: GNUmakefile
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/GNUmakefile,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- GNUmakefile 7 Jun 2002 01:54:42 -0000 1.11
+++ GNUmakefile 23 Jul 2002 17:22:37 -0000 1.12
@@ -52,9 +52,10 @@
sbcl: ${OBJS}
$(CC) ${LINKFLAGS} ${OS_LINK_FLAGS} -o $@ ${OBJS} ${OS_LIBS} -lm
+
.PHONY: clean all
clean:
- rm -f depend *.o sbcl sbcl.nm core *.tmp ; true
+ -rm -f depend *.o sbcl sbcl.nm core *.tmp
depend: ${C_SRCS} sbcl.h
Index: bsd-os.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/bsd-os.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- bsd-os.c 27 May 2001 15:20:16 -0000 1.11
+++ bsd-os.c 23 Jul 2002 17:22:37 -0000 1.12
@@ -230,23 +230,19 @@
#else
#error unsupported BSD variant
#endif
- if (!gencgc_handle_wp_violation(fault_addr)) {
- interrupt_handle_now(signal, siginfo, void_context);
- }
+ os_context_t *context = arch_os_get_context(&void_context);
+ if (!gencgc_handle_wp_violation(fault_addr))
+ if(!handle_control_stack_guard_triggered(context,fault_addr))
+ /* FIXME is this context or void_context? not that it */
+ /* makes a difference currently except on linux/sparc */
+ interrupt_handle_now(signal, siginfo, void_context);
}
void
os_install_interrupt_handlers(void)
{
SHOW("os_install_interrupt_handlers()/bsd-os/defined(GENCGC)");
-#if defined __FreeBSD__
- undoably_install_low_level_interrupt_handler(SIGBUS,
- memory_fault_handler);
-#elif defined __OpenBSD__
- undoably_install_low_level_interrupt_handler(SIGSEGV,
+ undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT,
memory_fault_handler);
-#else
-#error unsupported BSD variant
-#endif
SHOW("leaving os_install_interrupt_handlers()");
}
Index: bsd-os.h
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/bsd-os.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- bsd-os.h 15 Feb 2002 17:10:02 -0000 1.6
+++ bsd-os.h 23 Jul 2002 17:22:37 -0000 1.7
@@ -28,14 +28,17 @@
* is an mcontext_t, but according to comments by Raymond Wiker in the
* original FreeBSD port of SBCL, that's wrong, it's actually a
* ucontext_t. */
+
typedef ucontext_t os_context_t;
/* As the sbcl-devel message from Raymond Wiker 2000-12-01, FreeBSD
* (unlike Linux and OpenBSD) doesn't let us tweak the CPU's single
* step flag bit by messing with the flags stored in a signal context,
* so we need to implement single stepping in a more roundabout way. */
#define CANNOT_GET_TO_SINGLE_STEP_FLAG
+#define SIG_MEMORY_FAULT SIGBUS
#elif defined __OpenBSD__
typedef struct sigcontext os_context_t;
+#define SIG_MEMORY_FAULT SIGSEGV
#else
#error unsupported BSD variant
#endif
Index: globals.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/globals.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- globals.c 9 Jul 2002 14:18:40 -0000 1.8
+++ globals.c 23 Jul 2002 17:22:37 -0000 1.9
@@ -60,10 +60,10 @@
foreign_function_call_active = 1;
/* Initialize the current Lisp state. */
-#ifndef __i386__ /* if stack grows upward */
- current_control_stack_pointer = (lispobj *)CONTROL_STACK_START;
-#else
+#ifdef LISP_FEATURE_STACK_GROWS_DOWNWARD_NOT_UPWARD
current_control_stack_pointer = (lispobj *)CONTROL_STACK_END;
+#else
+ current_control_stack_pointer = (lispobj *)CONTROL_STACK_START;
#endif
current_control_frame_pointer = (lispobj *)0;
Index: interrupt.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/interrupt.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- interrupt.c 18 Jul 2002 16:49:39 -0000 1.27
+++ interrupt.c 23 Jul 2002 17:22:37 -0000 1.28
@@ -32,7 +32,6 @@
#include "dynbind.h"
#include "interr.h"
-
void sigaddset_blockable(sigset_t *s)
{
sigaddset(s, SIGHUP);
@@ -106,31 +105,15 @@
* utility routines used by various signal handlers
*/
-void
-fake_foreign_function_call(os_context_t *context)
+void
+build_fake_control_stack_frames(os_context_t *context)
{
- int context_index;
-#ifndef __i386__
+#ifndef LISP_FEATURE_X86
+
lispobj oldcont;
-#endif
- /* Get current Lisp state from context. */
-#ifdef reg_ALLOC
- dynamic_space_free_pointer =
- (lispobj *)(*os_context_register_addr(context, reg_ALLOC));
-#ifdef alpha
- if ((long)dynamic_space_free_pointer & 1) {
- lose("dead in fake_foreign_function_call, context = %x", context);
- }
-#endif
-#endif
-#ifdef reg_BSP
- current_binding_stack_pointer =
- (lispobj *)(*os_context_register_addr(context, reg_BSP));
-#endif
+ /* Build a fake stack frame or frames */
-#ifndef __i386__
- /* Build a fake stack frame. */
current_control_frame_pointer =
(lispobj *)(*os_context_register_addr(context, reg_CSP));
if ((lispobj *)(*os_context_register_addr(context, reg_CFP))
@@ -155,9 +138,10 @@
oldcont = (lispobj)(*os_context_register_addr(context, reg_OCFP));
}
}
- /* ### We can't tell whether we are still in the caller if it had
- * to reg_ALLOCate the stack frame due to stack arguments. */
- /* ### Can anything strange happen during return? */
+ /* We can't tell whether we are still in the caller if it had to
+ * allocate a stack frame due to stack arguments. */
+ /* This observation provoked some past CMUCL maintainer to ask
+ * "Can anything strange happen during return?" */
else {
/* normal case */
oldcont = (lispobj)(*os_context_register_addr(context, reg_CFP));
@@ -170,6 +154,29 @@
current_control_frame_pointer[2] =
(lispobj)(*os_context_register_addr(context, reg_CODE));
#endif
+}
+
+void
+fake_foreign_function_call(os_context_t *context)
+{
+ int context_index;
+
+ /* Get current Lisp state from context. */
+#ifdef reg_ALLOC
+ dynamic_space_free_pointer =
+ (lispobj *)(*os_context_register_addr(context, reg_ALLOC));
+#ifdef alpha
+ if ((long)dynamic_space_free_pointer & 1) {
+ lose("dead in fake_foreign_function_call, context = %x", context);
+ }
+#endif
+#endif
+#ifdef reg_BSP
+ current_binding_stack_pointer =
+ (lispobj *)(*os_context_register_addr(context, reg_BSP));
+#endif
+
+ build_fake_control_stack_frames(context);
/* Do dynamic binding of the active interrupt context index
* and save the context in the context array. */
@@ -180,8 +187,7 @@
* which do bare >> and << for fixnum_value and make_fixnum. */
if (context_index >= MAX_INTERRUPTS) {
- lose("maximum interrupt nesting depth (%d) exceeded",
- MAX_INTERRUPTS);
+ lose("maximum interrupt nesting depth (%d) exceeded", MAX_INTERRUPTS);
}
bind_variable(FREE_INTERRUPT_CONTEXT_INDEX,
@@ -493,16 +499,53 @@
if (current_auto_gc_trigger == NULL)
return 0;
else{
- lispobj *badaddr=(lispobj *)arch_get_bad_addr(signal,
- info,
- context);
-
- return (badaddr >= current_auto_gc_trigger &&
- badaddr < current_dynamic_space + DYNAMIC_SPACE_SIZE);
+ void *badaddr=arch_get_bad_addr(signal,info,context);
+ return (badaddr >= (void *)current_auto_gc_trigger &&
+ badaddr <((void *)current_dynamic_space + DYNAMIC_SPACE_SIZE));
}
}
#endif
+/* and similarly for the control stack guard page */
+
+boolean handle_control_stack_guard_triggered(os_context_t *context,void *addr)
+{
+ /* note the os_context hackery here. When the signal handler returns,
+ * it won't go back to what it was doing ... */
+ if(addr>=CONTROL_STACK_GUARD_PAGE &&
+ addr<(CONTROL_STACK_GUARD_PAGE+os_vm_page_size)) {
+ void *function;
+ /* we hit the end of the control stack. disable protection
+ * temporarily so the error handler has some headroom */
+ protect_control_stack_guard_page(0);
+
+ function=
+ &(((struct simple_fun *)
+ native_pointer(SymbolFunction(CONTROL_STACK_EXHAUSTED_ERROR)))
+ ->code);
+
+ /* Build a stack frame showing `interrupted' so that the
+ * user's backtrace makes (as much) sense (as usual) */
+ build_fake_control_stack_frames(context);
+ /* signal handler will "return" to this error-causing function */
+ *os_context_pc_addr(context)= function;
+#ifndef LISP_FEATURE_X86
+ /* this much of the calling convention is common to all
+ non-x86 ports */
+ *os_context_register_addr(context,reg_NARGS)=0;
+ *os_context_register_addr(context,reg_LIP)= function;
+ *os_context_register_addr(context,reg_CFP)=
+ current_control_frame_pointer;
+#ifdef ARCH_HAS_NPC_REGISTER
+ *os_context_register_addr(context,reg_LIP)=
+ 4+*os_context_pc_addr(context);
+#endif
+#endif
+ return 1;
+ }
+ else return 0;
+}
+
#ifndef __i386__
/* This function gets called from the SIGSEGV (for e.g. Linux or
* OpenBSD) or SIGBUS (for e.g. FreeBSD) handler. Here we check
@@ -547,8 +590,8 @@
if(current_dynamic_space==old_free_space)
/* MAYBE-GC (as the name suggest) might not. If it
* doesn't, it won't reset the GC trigger either, so we
- * have to do it ourselves. Add small amount of space
- * to tide us over while GC is inhibited
+ * have to do it ourselves. Put it near the end of
+ * dynamic space so we're not running into it continually
*/
set_auto_gc_trigger(DYNAMIC_SPACE_SIZE
-(u32)os_vm_page_size);
@@ -622,7 +665,20 @@
sigemptyset(&sa.sa_mask);
sigaddset_blockable(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO | SA_RESTART;
-
+#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
+ /* Signal handlers are run on the control stack, so if it is exhausted
+ * we had better use an alternate stack for whatever signal tells us
+ * we've exhausted it */
+ if(signal==SIG_MEMORY_FAULT) {
+ stack_t sigstack;
+ sigstack.ss_sp=(void *) ALTERNATE_SIGNAL_STACK_START;
+ sigstack.ss_flags=0;
+ sigstack.ss_size = SIGSTKSZ;
+ sigaltstack(&sigstack,0);
+ sa.sa_flags|=SA_ONSTACK;
+ }
+#endif
+
/* In the case of interrupt handlers which are modified more than
* once, we only save the original unmodified copy. */
if (!old_low_level_signal_handler_state->was_modified) {
Index: interrupt.h
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/interrupt.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- interrupt.h 18 Jul 2002 17:47:34 -0000 1.4
+++ interrupt.h 23 Jul 2002 17:22:37 -0000 1.5
@@ -35,6 +35,7 @@
extern void interrupt_handle_pending(os_context_t*);
extern void interrupt_internal_error(int, siginfo_t*, os_context_t*,
boolean continuable);
+extern boolean handle_control_stack_guard_triggered(os_context_t *,void *);
extern boolean interrupt_maybe_gc(int, siginfo_t*, void*);
extern void undoably_install_low_level_interrupt_handler (int signal,
void
Index: linux-os.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/linux-os.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -d -r1.15 -r1.16
--- linux-os.c 16 Jul 2002 13:48:07 -0000 1.15
+++ linux-os.c 23 Jul 2002 17:22:37 -0000 1.16
@@ -87,7 +87,7 @@
started up a process with a different set of traps, or
something?) Find out what this was meant to do, and reenable it
or delete it if possible. -- CSR, 2002-07-15 */
- /* SET_FPU_CONTROL_WORD(0x1372|4|8|16|32); /* no interrupts */
+ /* SET_FPU_CONTROL_WORD(0x1372|4|8|16|32); no interrupts */
#endif
}
@@ -242,6 +242,7 @@
* any OS-dependent special low-level handling for signals
*/
+
#if defined GENCGC
/*
@@ -253,9 +254,9 @@
{
os_context_t *context = arch_os_get_context(&void_context);
void* fault_addr = (void*)context->uc_mcontext.cr2;
- if (!gencgc_handle_wp_violation(fault_addr)) {
- interrupt_handle_now(signal, info, void_context);
- }
+ if (!gencgc_handle_wp_violation(fault_addr))
+ if(!handle_control_stack_guard_triggered(context,fault_addr))
+ interrupt_handle_now(signal, info, void_context);
}
#else
@@ -266,19 +267,14 @@
os_context_t *context = arch_os_get_context(&void_context);
os_vm_address_t addr;
-#ifdef __i386__
- interrupt_handle_now(signal,contextstruct);
-#else
- char *control_stack_top = (char*)CONTROL_STACK_START + CONTROL_STACK_SIZE;
-
addr = arch_get_bad_addr(signal,info,context);
-
if (addr != NULL &&
- *os_context_register_addr(context,reg_ALLOC) & (1L<<63)){
+ *os_context_register_addr(context,reg_ALLOC) & (1L<<63)){
- /* This is the end of a pseudo-atomic section during which
- * a signal was received. We must deal with the pending interrupt
- * (see also interrupt.c, ../code/interrupt.lisp)
+ /* Alpha stuff: This is the end of a pseudo-atomic section
+ * during which a signal was received. We must deal with the
+ * pending interrupt (see also interrupt.c,
+ * ../code/interrupt.lisp)
*/
/* (how we got here: when interrupting, we set bit 63 in
* reg_Alloc. At the end of the atomic section we tried to
@@ -287,28 +283,18 @@
*/
*os_context_register_addr(context,reg_ALLOC) -= (1L<<63);
interrupt_handle_pending(context);
- } else if (addr > control_stack_top && addr < BINDING_STACK_START) {
- fprintf(stderr,
- "Possible stack overflow at 0x%016lX:\n"
- "control_stack_top=%lx, BINDING_STACK_START=%lx\n",
- addr,
- control_stack_top,
- BINDING_STACK_START);
- /* Try to fix control frame pointer. */
- while ( ! (CONTROL_STACK_START <= *current_control_frame_pointer &&
- *current_control_frame_pointer <= control_stack_top))
- ((char*)current_control_frame_pointer) -= sizeof(lispobj);
- monitor_or_something();
- } else if (!interrupt_maybe_gc(signal, info, context)) {
- interrupt_handle_now(signal, info, context);
+ } else {
+ if(!interrupt_maybe_gc(signal, info, context))
+ if(!handle_control_stack_guard_triggered(context,addr))
+ interrupt_handle_now(signal, info, context);
}
-#endif
}
#endif
void
os_install_interrupt_handlers(void)
{
- undoably_install_low_level_interrupt_handler(SIGSEGV, sigsegv_handler);
+ undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT,
+ sigsegv_handler);
}
Index: linux-os.h
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/linux-os.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- linux-os.h 16 Jul 2002 13:48:07 -0000 1.5
+++ linux-os.h 23 Jul 2002 17:22:37 -0000 1.6
@@ -36,5 +36,7 @@
#define OS_VM_PROT_WRITE PROT_WRITE
#define OS_VM_PROT_EXECUTE PROT_EXEC
+#define SIG_MEMORY_FAULT SIGSEGV
+
/* /usr/include/asm/sigcontext.h */
typedef long os_context_register_t ;
Index: osf1-os.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/osf1-os.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- osf1-os.c 18 Jul 2002 17:47:34 -0000 1.2
+++ osf1-os.c 23 Jul 2002 17:22:37 -0000 1.3
@@ -142,7 +142,8 @@
fprintf(stderr, "bad address 0x%p\n",addr);
lose("ran off end of dynamic space");
} else if (!interrupt_maybe_gc(signal, info, context)) {
- interrupt_handle_now(signal, info, context);
+ if(!handle_control_stack_guard_triggered(context,addr))
+ interrupt_handle_now(signal, info, context);
}
}
@@ -150,6 +151,7 @@
void
os_install_interrupt_handlers(void)
{
- undoably_install_low_level_interrupt_handler(SIGSEGV, sigsegv_handler);
+ undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT,
+ sigsegv_handler);
}
Index: osf1-os.h
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/osf1-os.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- osf1-os.h 7 Jun 2002 11:30:46 -0000 1.1
+++ osf1-os.h 23 Jul 2002 17:22:37 -0000 1.2
@@ -12,6 +12,8 @@
#define OS_VM_PROT_WRITE PROT_WRITE
#define OS_VM_PROT_EXECUTE PROT_EXEC
+#define SIG_MEMORY_FAULT SIGSEGV
+
typedef long os_context_register_t ;
#ifndef NSIG /* osf1 -D_XOPEN_SOURCE_EXTENDED omits this */
Index: runtime.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/runtime.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- runtime.c 9 Jul 2002 14:18:40 -0000 1.14
+++ runtime.c 23 Jul 2002 17:22:37 -0000 1.15
@@ -254,11 +254,6 @@
set_lossage_handler(monitor_or_something);
-#if 0
- os_init();
- gc_init();
- validate();
-#endif
globals_init();
initial_function = load_core_file(core);
Index: sunos-os.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/sunos-os.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- sunos-os.c 17 Jul 2002 14:29:52 -0000 1.5
+++ sunos-os.c 23 Jul 2002 17:22:37 -0000 1.6
@@ -173,10 +173,9 @@
os_vm_address_t addr;
addr = arch_get_bad_addr(signal, info, context);
- /* There's some complicated recovery code in linux-os.c here
- that I'm currently too confused to understand. FIXME. */
if(!interrupt_maybe_gc(signal, info, context)) {
- interrupt_handle_now(signal, info, context);
+ if(!handle_control_stack_guard_triggered(context,addr))
+ interrupt_handle_now(signal, info, context);
}
}
@@ -185,5 +184,6 @@
void
os_install_interrupt_handlers()
{
- undoably_install_low_level_interrupt_handler(SIGSEGV,sigsegv_handler);
+ undoably_install_low_level_interrupt_handler(SIG_MEMORY_FAULT,
+ sigsegv_handler);
}
Index: sunos-os.h
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/sunos-os.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- sunos-os.h 25 Mar 2002 18:25:04 -0000 1.1
+++ sunos-os.h 23 Jul 2002 17:22:37 -0000 1.2
@@ -30,5 +30,7 @@
#define OS_VM_PROT_WRITE PROT_WRITE
#define OS_VM_PROT_EXECUTE PROT_EXEC
+#define SIG_MEMORY_FAULT SIGSEGV
+
/* Yaargh?! */
typedef int os_context_register_t ;
Index: validate.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/validate.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- validate.c 18 Jul 2002 17:47:34 -0000 1.11
+++ validate.c 23 Jul 2002 17:22:37 -0000 1.12
@@ -74,6 +74,9 @@
#endif
ensure_space( (lispobj *)CONTROL_STACK_START , CONTROL_STACK_SIZE);
ensure_space( (lispobj *)BINDING_STACK_START , BINDING_STACK_SIZE);
+#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
+ ensure_space( (lispobj *) ALTERNATE_SIGNAL_STACK_START, SIGSTKSZ);
+#endif
#ifdef HOLES
make_holes();
@@ -81,8 +84,16 @@
#ifndef GENCGC
current_dynamic_space = DYNAMIC_0_SPACE_START;
#endif
-
+
#ifdef PRINTNOISE
printf(" done.\n");
#endif
+ protect_control_stack_guard_page(1);
}
+
+void protect_control_stack_guard_page(int protect_p) {
+ os_protect(CONTROL_STACK_GUARD_PAGE,
+ os_vm_page_size,protect_p ?
+ (OS_VM_PROT_READ|OS_VM_PROT_EXECUTE) : OS_VM_PROT_ALL);
+}
+
Index: validate.h
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/validate.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- validate.h 19 May 2001 01:03:02 -0000 1.5
+++ validate.h 23 Jul 2002 17:22:37 -0000 1.6
@@ -19,6 +19,12 @@
#define READ_ONLY_SPACE_SIZE (READ_ONLY_SPACE_END - READ_ONLY_SPACE_START)
#define STATIC_SPACE_SIZE ( STATIC_SPACE_END - STATIC_SPACE_START)
+#ifdef LISP_FEATURE_STACK_GROWS_DOWNWARD_NOT_UPWARD
+#define CONTROL_STACK_GUARD_PAGE (CONTROL_STACK_START)
+#else
+#define CONTROL_STACK_GUARD_PAGE (CONTROL_STACK_END - os_vm_page_size)
+#endif
+
#if !defined(LANGUAGE_ASSEMBLY)
extern void validate(void);
#endif
Index: x86-linux-os.c
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/runtime/x86-linux-os.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- x86-linux-os.c 16 Jul 2002 13:48:07 -0000 1.5
+++ x86-linux-os.c 23 Jul 2002 17:22:37 -0000 1.6
@@ -67,13 +67,19 @@
os_context_register_t *
os_context_pc_addr(os_context_t *context)
{
- return &context->uc_mcontext.gregs[14];
+ return &context->uc_mcontext.gregs[14]; /* REG_EIP */
}
os_context_register_t *
os_context_sp_addr(os_context_t *context)
+{
+ return &context->uc_mcontext.gregs[17]; /* REG_UESP */
+}
+
+os_context_register_t *
+os_context_fp_addr(os_context_t *context)
{
- return &context->uc_mcontext.gregs[17];
+ return &context->uc_mcontext.gregs[6]; /* REG_EBP */
}
unsigned long
|