!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
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)
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();
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:
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;
}
switch (dwCtrlType) {
case CTRL_C_EVENT:
case CTRL_BREAK_EVENT:
- enqueue_safepoint_signal((cell)-1);
+ enqueue_safepoint_fep();
return TRUE;
default:
return FALSE;
last_nano_count(0),
signal_callstack_seg(NULL)
{
+#ifndef WINDOWS
sigemptyset(&safepoint_signals);
+#endif
primitive_reset_dispatch_stats();
}
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;
void fp_signal_handler_impl();
void enqueue_safepoint_fep();
void enqueue_safepoint_sample();
- void enqueue_safepoint_signal(cell signal);
void handle_safepoint();
// bignum
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__