vm: update windows for resumable signals
							parent
							
								
									9541bf14f5
								
							
						
					
					
						commit
						6d57eb4f59
					
				| 
						 | 
				
			
			@ -14,9 +14,9 @@ CL_FLAGS = $(CL_FLAGS) /Zi /DFACTOR_DEBUG
 | 
			
		|||
 | 
			
		||||
!IF "$(PLATFORM)" == "x86-32"
 | 
			
		||||
LINK_FLAGS = $(LINK_FLAGS) /safeseh
 | 
			
		||||
PLAF_DLL_OBJS = vm\os-windows-x86.32.obj vm\safeseh.obj
 | 
			
		||||
PLAF_DLL_OBJS = vm\os-windows-x86.32.obj vm\safeseh.obj vm\cpu-x86.obj
 | 
			
		||||
!ELSEIF "$(PLATFORM)" == "x86-64"
 | 
			
		||||
PLAF_DLL_OBJS = vm\os-windows-x86.64.obj
 | 
			
		||||
PLAF_DLL_OBJS = vm\os-windows-x86.64.obj vm\cpu-x86.obj
 | 
			
		||||
!ENDIF
 | 
			
		||||
 | 
			
		||||
ML_FLAGS = /nologo /safeseh
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -170,12 +170,6 @@ void factor_vm::enqueue_safepoint_fep()
 | 
			
		|||
	code->guard_safepoint();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void factor_vm::enqueue_safepoint_signal(cell signal)
 | 
			
		||||
{
 | 
			
		||||
	sigaddset(&safepoint_signals, signal);
 | 
			
		||||
	code->guard_safepoint();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void factor_vm::enqueue_safepoint_sample()
 | 
			
		||||
{
 | 
			
		||||
	if (!sampling_p)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -146,6 +146,12 @@ void factor_vm::dispatch_signal(void *uap, void (handler)())
 | 
			
		|||
	UAP_SET_TOC_POINTER(uap, (cell)FUNCTION_TOC_POINTER(handler));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void factor_vm::enqueue_safepoint_signal(cell signal)
 | 
			
		||||
{
 | 
			
		||||
	sigaddset(&safepoint_signals, signal);
 | 
			
		||||
	code->guard_safepoint();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void memory_signal_handler(int signal, siginfo_t *siginfo, void *uap)
 | 
			
		||||
{
 | 
			
		||||
	factor_vm *vm = current_vm();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -216,14 +216,15 @@ void sleep_nanos(u64 nsec)
 | 
			
		|||
 | 
			
		||||
LONG factor_vm::exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch)
 | 
			
		||||
{
 | 
			
		||||
	c->ESP = (cell)fix_callstack_top((stack_frame *)c->ESP);
 | 
			
		||||
	ctx->callstack_top = (stack_frame *)c->ESP;
 | 
			
		||||
 | 
			
		||||
	switch (e->ExceptionCode)
 | 
			
		||||
	{
 | 
			
		||||
	case EXCEPTION_ACCESS_VIOLATION:
 | 
			
		||||
		signal_fault_addr = e->ExceptionInformation[1];
 | 
			
		||||
		c->EIP = (cell)factor::memory_signal_handler_impl;
 | 
			
		||||
		dispatch_signal_handler(
 | 
			
		||||
			(cell*)&c->ESP,
 | 
			
		||||
			(cell*)&c->EIP,
 | 
			
		||||
			(cell)factor::memory_signal_handler_impl
 | 
			
		||||
		);
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	case STATUS_FLOAT_DENORMAL_OPERAND:
 | 
			
		||||
| 
						 | 
				
			
			@ -244,11 +245,19 @@ LONG factor_vm::exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c,
 | 
			
		|||
		X87SW(c) = 0;
 | 
			
		||||
#endif
 | 
			
		||||
		MXCSR(c) &= 0xffffffc0;
 | 
			
		||||
		c->EIP = (cell)factor::fp_signal_handler_impl;
 | 
			
		||||
		dispatch_signal_handler(
 | 
			
		||||
			(cell*)&c->ESP,
 | 
			
		||||
			(cell*)&c->EIP,
 | 
			
		||||
			(cell)factor::fp_signal_handler_impl
 | 
			
		||||
		);
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		signal_number = e->ExceptionCode;
 | 
			
		||||
		c->EIP = (cell)factor::synchronous_signal_handler_impl;
 | 
			
		||||
		dispatch_signal_handler(
 | 
			
		||||
			(cell*)&c->ESP,
 | 
			
		||||
			(cell*)&c->EIP,
 | 
			
		||||
			(cell)factor::synchronous_signal_handler_impl
 | 
			
		||||
		);
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -265,7 +274,7 @@ BOOL factor_vm::ctrl_handler(DWORD dwCtrlType)
 | 
			
		|||
	switch (dwCtrlType) {
 | 
			
		||||
	case CTRL_C_EVENT:
 | 
			
		||||
	case CTRL_BREAK_EVENT:
 | 
			
		||||
		enqueue_safepoint_signal((cell)-1);
 | 
			
		||||
		enqueue_safepoint_fep();
 | 
			
		||||
		return TRUE;
 | 
			
		||||
	default:
 | 
			
		||||
		return FALSE;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,9 @@ factor_vm::factor_vm() :
 | 
			
		|||
	last_nano_count(0),
 | 
			
		||||
	signal_callstack_seg(NULL)
 | 
			
		||||
{
 | 
			
		||||
#ifndef WINDOWS
 | 
			
		||||
	sigemptyset(&safepoint_signals);
 | 
			
		||||
#endif
 | 
			
		||||
	primitive_reset_dispatch_stats();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -73,7 +73,6 @@ struct factor_vm
 | 
			
		|||
	unsigned int signal_fpu_status;
 | 
			
		||||
	bool safepoint_fep;
 | 
			
		||||
	cell safepoint_sample_count;
 | 
			
		||||
	sigset_t safepoint_signals;
 | 
			
		||||
 | 
			
		||||
	/* GC is off during heap walking */
 | 
			
		||||
	bool gc_off;
 | 
			
		||||
| 
						 | 
				
			
			@ -201,7 +200,6 @@ struct factor_vm
 | 
			
		|||
	void fp_signal_handler_impl();
 | 
			
		||||
	void enqueue_safepoint_fep();
 | 
			
		||||
	void enqueue_safepoint_sample();
 | 
			
		||||
	void enqueue_safepoint_signal(cell signal);
 | 
			
		||||
	void handle_safepoint();
 | 
			
		||||
 | 
			
		||||
	// bignum
 | 
			
		||||
| 
						 | 
				
			
			@ -720,15 +718,15 @@ struct factor_vm
 | 
			
		|||
	void windows_image_path(vm_char *full_path, vm_char *temp_path, unsigned int length);
 | 
			
		||||
	BOOL windows_stat(vm_char *path);
 | 
			
		||||
 | 
			
		||||
  #if defined(WINNT)
 | 
			
		||||
	void open_console();
 | 
			
		||||
	LONG exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch);
 | 
			
		||||
	BOOL ctrl_handler(DWORD dwCtrlType);
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #else  // UNIX
 | 
			
		||||
	void dispatch_signal(void *uap, void (handler)());
 | 
			
		||||
	void enqueue_safepoint_signal(cell signal);
 | 
			
		||||
	void unix_init_signals();
 | 
			
		||||
	sigset_t safepoint_signals;
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #ifdef __APPLE__
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue