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"
|
!IF "$(PLATFORM)" == "x86-32"
|
||||||
LINK_FLAGS = $(LINK_FLAGS) /safeseh
|
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"
|
!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
|
!ENDIF
|
||||||
|
|
||||||
ML_FLAGS = /nologo /safeseh
|
ML_FLAGS = /nologo /safeseh
|
||||||
|
|
|
@ -170,12 +170,6 @@ void factor_vm::enqueue_safepoint_fep()
|
||||||
code->guard_safepoint();
|
code->guard_safepoint();
|
||||||
}
|
}
|
||||||
|
|
||||||
void factor_vm::enqueue_safepoint_signal(cell signal)
|
|
||||||
{
|
|
||||||
sigaddset(&safepoint_signals, signal);
|
|
||||||
code->guard_safepoint();
|
|
||||||
}
|
|
||||||
|
|
||||||
void factor_vm::enqueue_safepoint_sample()
|
void factor_vm::enqueue_safepoint_sample()
|
||||||
{
|
{
|
||||||
if (!sampling_p)
|
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));
|
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)
|
void memory_signal_handler(int signal, siginfo_t *siginfo, void *uap)
|
||||||
{
|
{
|
||||||
factor_vm *vm = current_vm();
|
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)
|
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)
|
switch (e->ExceptionCode)
|
||||||
{
|
{
|
||||||
case EXCEPTION_ACCESS_VIOLATION:
|
case EXCEPTION_ACCESS_VIOLATION:
|
||||||
signal_fault_addr = e->ExceptionInformation[1];
|
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;
|
break;
|
||||||
|
|
||||||
case STATUS_FLOAT_DENORMAL_OPERAND:
|
case STATUS_FLOAT_DENORMAL_OPERAND:
|
||||||
|
@ -244,11 +245,19 @@ LONG factor_vm::exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c,
|
||||||
X87SW(c) = 0;
|
X87SW(c) = 0;
|
||||||
#endif
|
#endif
|
||||||
MXCSR(c) &= 0xffffffc0;
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
signal_number = e->ExceptionCode;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,7 +274,7 @@ BOOL factor_vm::ctrl_handler(DWORD dwCtrlType)
|
||||||
switch (dwCtrlType) {
|
switch (dwCtrlType) {
|
||||||
case CTRL_C_EVENT:
|
case CTRL_C_EVENT:
|
||||||
case CTRL_BREAK_EVENT:
|
case CTRL_BREAK_EVENT:
|
||||||
enqueue_safepoint_signal((cell)-1);
|
enqueue_safepoint_fep();
|
||||||
return TRUE;
|
return TRUE;
|
||||||
default:
|
default:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
|
@ -20,7 +20,9 @@ factor_vm::factor_vm() :
|
||||||
last_nano_count(0),
|
last_nano_count(0),
|
||||||
signal_callstack_seg(NULL)
|
signal_callstack_seg(NULL)
|
||||||
{
|
{
|
||||||
|
#ifndef WINDOWS
|
||||||
sigemptyset(&safepoint_signals);
|
sigemptyset(&safepoint_signals);
|
||||||
|
#endif
|
||||||
primitive_reset_dispatch_stats();
|
primitive_reset_dispatch_stats();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,6 @@ struct factor_vm
|
||||||
unsigned int signal_fpu_status;
|
unsigned int signal_fpu_status;
|
||||||
bool safepoint_fep;
|
bool safepoint_fep;
|
||||||
cell safepoint_sample_count;
|
cell safepoint_sample_count;
|
||||||
sigset_t safepoint_signals;
|
|
||||||
|
|
||||||
/* GC is off during heap walking */
|
/* GC is off during heap walking */
|
||||||
bool gc_off;
|
bool gc_off;
|
||||||
|
@ -201,7 +200,6 @@ struct factor_vm
|
||||||
void fp_signal_handler_impl();
|
void fp_signal_handler_impl();
|
||||||
void enqueue_safepoint_fep();
|
void enqueue_safepoint_fep();
|
||||||
void enqueue_safepoint_sample();
|
void enqueue_safepoint_sample();
|
||||||
void enqueue_safepoint_signal(cell signal);
|
|
||||||
void handle_safepoint();
|
void handle_safepoint();
|
||||||
|
|
||||||
// bignum
|
// bignum
|
||||||
|
@ -720,15 +718,15 @@ struct factor_vm
|
||||||
void windows_image_path(vm_char *full_path, vm_char *temp_path, unsigned int length);
|
void windows_image_path(vm_char *full_path, vm_char *temp_path, unsigned int length);
|
||||||
BOOL windows_stat(vm_char *path);
|
BOOL windows_stat(vm_char *path);
|
||||||
|
|
||||||
#if defined(WINNT)
|
|
||||||
void open_console();
|
void open_console();
|
||||||
LONG exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch);
|
LONG exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch);
|
||||||
BOOL ctrl_handler(DWORD dwCtrlType);
|
BOOL ctrl_handler(DWORD dwCtrlType);
|
||||||
#endif
|
|
||||||
|
|
||||||
#else // UNIX
|
#else // UNIX
|
||||||
void dispatch_signal(void *uap, void (handler)());
|
void dispatch_signal(void *uap, void (handler)());
|
||||||
|
void enqueue_safepoint_signal(cell signal);
|
||||||
void unix_init_signals();
|
void unix_init_signals();
|
||||||
|
sigset_t safepoint_signals;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
|
|
Loading…
Reference in New Issue