factor/vm/os-windows-nt.c

58 lines
1.6 KiB
C
Raw Normal View History

2007-09-20 18:09:08 -04:00
#include "master.h"
s64 current_micros(void)
2007-09-20 18:09:08 -04:00
{
FILETIME t;
GetSystemTimeAsFileTime(&t);
return (((s64)t.dwLowDateTime | (s64)t.dwHighDateTime<<32)
- EPOCH_OFFSET) / 10;
2007-09-20 18:09:08 -04:00
}
long exception_handler(PEXCEPTION_POINTERS pe)
2007-09-20 18:09:08 -04:00
{
PEXCEPTION_RECORD e = (PEXCEPTION_RECORD)pe->ExceptionRecord;
CONTEXT *c = (CONTEXT*)pe->ContextRecord;
2008-02-04 12:45:53 -05:00
if(in_code_heap_p(c->EIP))
signal_callstack_top = (void *)c->ESP;
2007-09-27 16:10:37 -04:00
else
signal_callstack_top = NULL;
if(e->ExceptionCode == EXCEPTION_ACCESS_VIOLATION)
{
signal_fault_addr = e->ExceptionInformation[1];
2008-02-04 12:45:53 -05:00
c->EIP = (CELL)memory_signal_handler_impl;
}
else if(e->ExceptionCode == EXCEPTION_FLT_DIVIDE_BY_ZERO
|| e->ExceptionCode == EXCEPTION_INT_DIVIDE_BY_ZERO)
{
signal_number = ERROR_DIVIDE_BY_ZERO;
2008-02-04 12:45:53 -05:00
c->EIP = (CELL)divide_by_zero_signal_handler_impl;
}
/* If the Widcomm bluetooth stack is installed, the BTTray.exe process
injects code into running programs. For some reason this results in
random SEH exceptions with this (undocumented) exception code being
raised. The workaround seems to be ignoring this altogether, since that
is what happens if SEH is not enabled. Don't really have any idea what
this exception means. */
else if(e->ExceptionCode != 0x40010006)
{
signal_number = 11;
2008-02-04 12:45:53 -05:00
c->EIP = (CELL)misc_signal_handler_impl;
}
return EXCEPTION_CONTINUE_EXECUTION;
2007-09-20 18:09:08 -04:00
}
void c_to_factor_toplevel(CELL quot)
2007-09-20 18:09:08 -04:00
{
if(!AddVectoredExceptionHandler(0, (void*)exception_handler))
fatal_error("AddVectoredExceptionHandler failed", 0);
c_to_factor(quot);
RemoveVectoredExceptionHandler((void*)exception_handler);
}
void open_console(void)
{
}