Fix callstack relocation
parent
05e66a0659
commit
64e3e0c0d6
Binary file not shown.
19
vm/image.c
19
vm/image.c
|
@ -173,6 +173,8 @@ void fixup_alien(F_ALIEN *d)
|
||||||
d->expired = T;
|
d->expired = T;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
F_FIXNUM delta;
|
||||||
|
|
||||||
void fixup_stack_frame(F_STACK_FRAME *frame)
|
void fixup_stack_frame(F_STACK_FRAME *frame)
|
||||||
{
|
{
|
||||||
code_fixup(&frame->xt);
|
code_fixup(&frame->xt);
|
||||||
|
@ -185,13 +187,22 @@ void fixup_stack_frame(F_STACK_FRAME *frame)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CALLSTACK_UP_P
|
#ifdef CALLSTACK_UP_P
|
||||||
printf("%x %x\n",frame->xt,*(CELL *)(frame->next + 1));
|
F_STACK_FRAME *next = REBASE_FRAME_SUCCESSOR(frame,delta);
|
||||||
code_fixup((CELL *)(frame->next + 1));
|
code_fixup((XT *)(next + 1));
|
||||||
#else
|
#else
|
||||||
code_fixup(&frame->return_address);
|
code_fixup(&frame->return_address);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fixup_callstack_object(F_CALLSTACK *stack)
|
||||||
|
{
|
||||||
|
CELL top = (CELL)(stack + 1);
|
||||||
|
CELL bottom = top + untag_fixnum_fast(stack->length);
|
||||||
|
delta = (bottom - stack->bottom);
|
||||||
|
|
||||||
|
iterate_callstack_object(stack,fixup_stack_frame);
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize an object in a newly-loaded image */
|
/* Initialize an object in a newly-loaded image */
|
||||||
void relocate_object(CELL relocating)
|
void relocate_object(CELL relocating)
|
||||||
{
|
{
|
||||||
|
@ -212,9 +223,7 @@ void relocate_object(CELL relocating)
|
||||||
fixup_alien((F_ALIEN *)relocating);
|
fixup_alien((F_ALIEN *)relocating);
|
||||||
break;
|
break;
|
||||||
case CALLSTACK_TYPE:
|
case CALLSTACK_TYPE:
|
||||||
iterate_callstack_object(
|
fixup_callstack_object((F_CALLSTACK *)relocating);
|
||||||
(F_CALLSTACK *)relocating,
|
|
||||||
fixup_stack_frame);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,7 +111,7 @@ void iterate_callstack(CELL top, CELL bottom, CELL base, CALLSTACK_ITER iterator
|
||||||
|
|
||||||
while(ITERATING_P)
|
while(ITERATING_P)
|
||||||
{
|
{
|
||||||
F_STACK_FRAME *next = (F_STACK_FRAME *)((CELL)FRAME_SUCCESSOR(frame) + delta);
|
F_STACK_FRAME *next = REBASE_FRAME_SUCCESSOR(frame,delta);
|
||||||
iterator(frame);
|
iterator(frame);
|
||||||
frame = next;
|
frame = next;
|
||||||
}
|
}
|
||||||
|
@ -344,7 +344,7 @@ static F_FIXNUM delta;
|
||||||
|
|
||||||
void adjust_stack_frame(F_STACK_FRAME *frame)
|
void adjust_stack_frame(F_STACK_FRAME *frame)
|
||||||
{
|
{
|
||||||
FRAME_SUCCESSOR(frame) = (F_STACK_FRAME *)((CELL)FRAME_SUCCESSOR(frame) + delta);
|
FRAME_SUCCESSOR(frame) = REBASE_FRAME_SUCCESSOR(frame,delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
void adjust_callstack(F_CALLSTACK *stack, CELL bottom)
|
void adjust_callstack(F_CALLSTACK *stack, CELL bottom)
|
||||||
|
|
|
@ -56,6 +56,8 @@ void init_stacks(CELL ds_size, CELL rs_size);
|
||||||
|
|
||||||
#define FIRST_STACK_FRAME(stack) (F_STACK_FRAME *)((stack) + 1)
|
#define FIRST_STACK_FRAME(stack) (F_STACK_FRAME *)((stack) + 1)
|
||||||
|
|
||||||
|
#define REBASE_FRAME_SUCCESSOR(frame,delta) (F_STACK_FRAME *)((CELL)FRAME_SUCCESSOR(frame) + delta)
|
||||||
|
|
||||||
typedef void (*CALLSTACK_ITER)(F_STACK_FRAME *frame);
|
typedef void (*CALLSTACK_ITER)(F_STACK_FRAME *frame);
|
||||||
|
|
||||||
void iterate_callstack(CELL top, CELL bottom, CELL base, CALLSTACK_ITER iterator);
|
void iterate_callstack(CELL top, CELL bottom, CELL base, CALLSTACK_ITER iterator);
|
||||||
|
|
Loading…
Reference in New Issue