factor/vm/os-windows-nt.cpp

72 lines
1.9 KiB
C++
Raw Normal View History

2009-05-02 05:04:19 -04:00
#include "master.hpp"
2009-05-04 02:46:13 -04:00
namespace factor
{
2009-05-05 12:33:35 -04:00
s64 current_micros()
2009-05-02 05:04:19 -04:00
{
FILETIME t;
GetSystemTimeAsFileTime(&t);
return (((s64)t.dwLowDateTime | (s64)t.dwHighDateTime<<32)
- EPOCH_OFFSET) / 10;
}
FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe)
2009-05-02 05:04:19 -04:00
{
PEXCEPTION_RECORD e = (PEXCEPTION_RECORD)pe->ExceptionRecord;
CONTEXT *c = (CONTEXT*)pe->ContextRecord;
if(in_code_heap_p(c->EIP))
2009-05-05 14:03:24 -04:00
signal_callstack_top = (stack_frame *)c->ESP;
2009-05-02 05:04:19 -04:00
else
signal_callstack_top = NULL;
2009-09-14 04:09:03 -04:00
switch (e->ExceptionCode)
{
case EXCEPTION_ACCESS_VIOLATION:
2009-05-02 05:04:19 -04:00
signal_fault_addr = e->ExceptionInformation[1];
2009-05-04 05:50:24 -04:00
c->EIP = (cell)memory_signal_handler_impl;
2009-09-14 04:09:03 -04:00
break;
2009-09-14 04:09:03 -04:00
case EXCEPTION_FLT_DENORMAL_OPERAND:
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
case EXCEPTION_FLT_INEXACT_RESULT:
case EXCEPTION_FLT_INVALID_OPERATION:
case EXCEPTION_FLT_OVERFLOW:
case EXCEPTION_FLT_STACK_CHECK:
case EXCEPTION_FLT_UNDERFLOW:
/* XXX MxCsr is not available in CONTEXT structure on x86.32 */
signal_fpu_status = c->FloatSave.StatusWord;
c->FloatSave.StatusWord = 0;
c->EIP = (cell)fp_signal_handler_impl;
break;
case 0x40010006:
/* 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. */
break;
default:
2009-05-02 05:04:19 -04:00
signal_number = e->ExceptionCode;
2009-05-04 05:50:24 -04:00
c->EIP = (cell)misc_signal_handler_impl;
2009-09-14 04:09:03 -04:00
break;
}
return EXCEPTION_CONTINUE_EXECUTION;
2009-05-02 05:04:19 -04:00
}
2009-05-04 05:50:24 -04:00
void c_to_factor_toplevel(cell quot)
2009-05-02 05:04:19 -04:00
{
if(!AddVectoredExceptionHandler(0, (PVECTORED_EXCEPTION_HANDLER)exception_handler))
2009-05-02 05:04:19 -04:00
fatal_error("AddVectoredExceptionHandler failed", 0);
c_to_factor(quot);
RemoveVectoredExceptionHandler((void *)exception_handler);
2009-05-02 05:04:19 -04:00
}
2009-05-05 12:33:35 -04:00
void open_console()
2009-05-02 05:04:19 -04:00
{
}
2009-05-04 02:46:13 -04:00
}