vm: context switching needs to scrub the return address
parent
96ca7c1d92
commit
3f28c0e7f5
|
@ -252,6 +252,10 @@ IN: bootstrap.x86
|
||||||
|
|
||||||
! Contexts
|
! Contexts
|
||||||
: jit-switch-context ( reg -- )
|
: jit-switch-context ( reg -- )
|
||||||
|
! Dummy return address -- it never gets returned to but it
|
||||||
|
! must point to inside the current code block
|
||||||
|
ESP -4 [+] HEX: ffffffff MOV rc-absolute-cell rt-this jit-rel
|
||||||
|
|
||||||
! Save ds, rs registers
|
! Save ds, rs registers
|
||||||
jit-load-vm
|
jit-load-vm
|
||||||
jit-save-context
|
jit-save-context
|
||||||
|
|
|
@ -228,6 +228,11 @@ IN: bootstrap.x86
|
||||||
|
|
||||||
! Contexts
|
! Contexts
|
||||||
: jit-switch-context ( reg -- )
|
: jit-switch-context ( reg -- )
|
||||||
|
! Dummy return address -- it never gets returned to but it
|
||||||
|
! must point to inside the current code block
|
||||||
|
R11 0 [RIP+] LEA
|
||||||
|
RSP -8 [+] R11 MOV
|
||||||
|
|
||||||
! Save ds, rs registers
|
! Save ds, rs registers
|
||||||
jit-save-context
|
jit-save-context
|
||||||
|
|
||||||
|
|
|
@ -138,6 +138,11 @@ cell factor_vm::frame_scan(stack_frame *frame)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cell factor_vm::frame_offset(stack_frame *frame)
|
||||||
|
{
|
||||||
|
return (cell)FRAME_RETURN_ADDRESS(frame,this) - (cell)frame_code(frame)->entry_point();
|
||||||
|
}
|
||||||
|
|
||||||
struct stack_frame_accumulator {
|
struct stack_frame_accumulator {
|
||||||
factor_vm *parent;
|
factor_vm *parent;
|
||||||
growable_array frames;
|
growable_array frames;
|
||||||
|
|
|
@ -210,7 +210,8 @@ struct call_frame_scrubber {
|
||||||
const code_block *compiled = parent->frame_code(frame);
|
const code_block *compiled = parent->frame_code(frame);
|
||||||
gc_info *info = compiled->block_gc_info();
|
gc_info *info = compiled->block_gc_info();
|
||||||
|
|
||||||
u32 return_address = (cell)FRAME_RETURN_ADDRESS(frame,parent) - (cell)compiled->entry_point();
|
cell return_address = parent->frame_offset(frame);
|
||||||
|
assert(return_address < compiled->size());
|
||||||
int index = info->return_address_index(return_address);
|
int index = info->return_address_index(return_address);
|
||||||
|
|
||||||
if(index != -1)
|
if(index != -1)
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
namespace factor
|
namespace factor
|
||||||
{
|
{
|
||||||
|
|
||||||
int gc_info::return_address_index(u32 return_address)
|
int gc_info::return_address_index(cell return_address)
|
||||||
{
|
{
|
||||||
u32 *return_address_array = return_addresses();
|
u32 *return_address_array = return_addresses();
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ struct gc_info {
|
||||||
+ index * gc_root_count;
|
+ index * gc_root_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
int return_address_index(u32 return_address);
|
int return_address_index(cell return_address);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -286,8 +286,8 @@ struct call_frame_slot_visitor {
|
||||||
{
|
{
|
||||||
const code_block *compiled = visitor->fixup.translate_code(parent->frame_code(frame));
|
const code_block *compiled = visitor->fixup.translate_code(parent->frame_code(frame));
|
||||||
gc_info *info = compiled->block_gc_info();
|
gc_info *info = compiled->block_gc_info();
|
||||||
|
cell return_address = parent->frame_offset(frame);
|
||||||
u32 return_address = (cell)FRAME_RETURN_ADDRESS(frame,parent) - (cell)compiled->entry_point();
|
assert(return_address < compiled->size());
|
||||||
int index = info->return_address_index(return_address);
|
int index = info->return_address_index(return_address);
|
||||||
|
|
||||||
if(index != -1)
|
if(index != -1)
|
||||||
|
|
|
@ -596,6 +596,7 @@ struct factor_vm
|
||||||
cell frame_executing_quot(stack_frame *frame);
|
cell frame_executing_quot(stack_frame *frame);
|
||||||
stack_frame *frame_successor(stack_frame *frame);
|
stack_frame *frame_successor(stack_frame *frame);
|
||||||
cell frame_scan(stack_frame *frame);
|
cell frame_scan(stack_frame *frame);
|
||||||
|
cell frame_offset(stack_frame *frame);
|
||||||
void primitive_callstack_to_array();
|
void primitive_callstack_to_array();
|
||||||
stack_frame *innermost_stack_frame(callstack *stack);
|
stack_frame *innermost_stack_frame(callstack *stack);
|
||||||
void primitive_innermost_stack_frame_executing();
|
void primitive_innermost_stack_frame_executing();
|
||||||
|
|
Loading…
Reference in New Issue