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