2009-05-02 05:04:19 -04:00
|
|
|
#include "master.hpp"
|
|
|
|
|
2009-05-04 02:46:13 -04:00
|
|
|
namespace factor
|
|
|
|
{
|
|
|
|
|
2009-12-13 17:52:59 -05:00
|
|
|
THREADHANDLE start_thread(void *(*start_routine)(void *), void *args)
|
|
|
|
{
|
|
|
|
return (void *)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, args, 0, 0);
|
2009-08-23 09:36:24 -04:00
|
|
|
}
|
|
|
|
|
2009-11-18 16:58:48 -05:00
|
|
|
u64 system_micros()
|
2009-05-02 05:04:19 -04:00
|
|
|
{
|
|
|
|
FILETIME t;
|
|
|
|
GetSystemTimeAsFileTime(&t);
|
2009-11-18 16:58:48 -05:00
|
|
|
return (((u64)t.dwLowDateTime | (u64)t.dwHighDateTime<<32)
|
2009-05-02 05:04:19 -04:00
|
|
|
- EPOCH_OFFSET) / 10;
|
|
|
|
}
|
|
|
|
|
2009-11-18 16:58:48 -05:00
|
|
|
u64 nano_count()
|
2009-11-18 05:20:05 -05:00
|
|
|
{
|
|
|
|
LARGE_INTEGER count;
|
|
|
|
LARGE_INTEGER frequency;
|
2009-12-22 15:36:33 -05:00
|
|
|
static u32 hi = 0;
|
|
|
|
static u32 lo = 0;
|
2009-11-18 05:20:05 -05:00
|
|
|
BOOL ret;
|
|
|
|
ret = QueryPerformanceCounter(&count);
|
|
|
|
if(ret == 0)
|
|
|
|
fatal_error("QueryPerformanceCounter", 0);
|
|
|
|
ret = QueryPerformanceFrequency(&frequency);
|
|
|
|
if(ret == 0)
|
|
|
|
fatal_error("QueryPerformanceFrequency", 0);
|
2009-12-13 21:42:51 -05:00
|
|
|
|
2010-02-06 01:45:06 -05:00
|
|
|
#ifdef FACTOR_64
|
|
|
|
hi = count.HighPart;
|
|
|
|
#else
|
|
|
|
/* On VirtualBox, QueryPerformanceCounter does not increment
|
|
|
|
the high part every time the low part overflows. Workaround. */
|
|
|
|
if(lo > count.LowPart)
|
|
|
|
hi++;
|
|
|
|
#endif
|
2009-12-13 21:42:51 -05:00
|
|
|
lo = count.LowPart;
|
|
|
|
|
2009-12-28 11:02:36 -05:00
|
|
|
return (u64)((((u64)hi << 32) | (u64)lo)*(1000000000.0/frequency.QuadPart));
|
2009-11-18 05:20:05 -05:00
|
|
|
}
|
|
|
|
|
2009-11-20 05:21:21 -05:00
|
|
|
void sleep_nanos(u64 nsec)
|
|
|
|
{
|
|
|
|
Sleep((DWORD)(nsec/1000000));
|
|
|
|
}
|
|
|
|
|
2010-04-03 20:24:33 -04:00
|
|
|
LONG factor_vm::exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch)
|
2009-05-02 05:04:19 -04:00
|
|
|
{
|
2010-03-27 07:33:28 -04:00
|
|
|
c->ESP = (cell)fix_callstack_top((stack_frame *)c->ESP);
|
2010-03-28 18:57:47 -04:00
|
|
|
signal_callstack_top = (stack_frame *)c->ESP;
|
2009-05-02 05:04:19 -04:00
|
|
|
|
2010-02-06 02:06:26 -05:00
|
|
|
switch (e->ExceptionCode)
|
|
|
|
{
|
|
|
|
case EXCEPTION_ACCESS_VIOLATION:
|
2009-09-03 15:32:39 -04:00
|
|
|
signal_fault_addr = e->ExceptionInformation[1];
|
|
|
|
c->EIP = (cell)factor::memory_signal_handler_impl;
|
2010-02-06 02:06:26 -05:00
|
|
|
break;
|
2009-09-10 17:10:25 -04:00
|
|
|
|
2009-09-14 13:02:02 -04:00
|
|
|
case STATUS_FLOAT_DENORMAL_OPERAND:
|
|
|
|
case STATUS_FLOAT_DIVIDE_BY_ZERO:
|
|
|
|
case STATUS_FLOAT_INEXACT_RESULT:
|
|
|
|
case STATUS_FLOAT_INVALID_OPERATION:
|
|
|
|
case STATUS_FLOAT_OVERFLOW:
|
|
|
|
case STATUS_FLOAT_STACK_CHECK:
|
|
|
|
case STATUS_FLOAT_UNDERFLOW:
|
|
|
|
case STATUS_FLOAT_MULTIPLE_FAULTS:
|
|
|
|
case STATUS_FLOAT_MULTIPLE_TRAPS:
|
2010-02-06 01:45:06 -05:00
|
|
|
#ifdef FACTOR_64
|
2010-01-24 08:17:18 -05:00
|
|
|
signal_fpu_status = fpu_status(MXCSR(c));
|
|
|
|
#else
|
2009-09-03 15:32:39 -04:00
|
|
|
signal_fpu_status = fpu_status(X87SW(c) | MXCSR(c));
|
2009-09-14 13:02:02 -04:00
|
|
|
X87SW(c) = 0;
|
2010-01-24 08:17:18 -05:00
|
|
|
#endif
|
2009-09-14 13:02:02 -04:00
|
|
|
MXCSR(c) &= 0xffffffc0;
|
2009-09-03 15:32:39 -04:00
|
|
|
c->EIP = (cell)factor::fp_signal_handler_impl;
|
2009-09-14 04:09:03 -04:00
|
|
|
break;
|
|
|
|
default:
|
2009-09-03 15:32:39 -04:00
|
|
|
signal_number = e->ExceptionCode;
|
|
|
|
c->EIP = (cell)factor::misc_signal_handler_impl;
|
2009-09-14 04:09:03 -04:00
|
|
|
break;
|
|
|
|
}
|
2010-04-03 20:24:33 -04:00
|
|
|
|
2010-04-06 17:30:41 -04:00
|
|
|
return 0;
|
2009-05-02 05:04:19 -04:00
|
|
|
}
|
|
|
|
|
2010-04-05 16:48:09 -04:00
|
|
|
VM_C_API LONG exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch)
|
2009-09-03 15:32:39 -04:00
|
|
|
{
|
2010-04-03 20:24:33 -04:00
|
|
|
return current_vm()->exception_handler(e,frame,c,dispatch);
|
2009-09-03 15:32:39 -04:00
|
|
|
}
|
|
|
|
|
2009-09-23 14:05:46 -04:00
|
|
|
void factor_vm::open_console()
|
2009-08-18 15:03:11 -04:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2009-05-04 02:46:13 -04:00
|
|
|
}
|