6 THREADHANDLE start_thread(void *(*start_routine)(void *), void *args)
8 return (void *)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, args, 0, 0);
14 GetSystemTimeAsFileTime(&t);
15 return (((u64)t.dwLowDateTime | (u64)t.dwHighDateTime<<32)
22 LARGE_INTEGER frequency;
26 ret = QueryPerformanceCounter(&count);
28 fatal_error("QueryPerformanceCounter", 0);
29 ret = QueryPerformanceFrequency(&frequency);
31 fatal_error("QueryPerformanceFrequency", 0);
36 /* On VirtualBox, QueryPerformanceCounter does not increment
37 the high part every time the low part overflows. Workaround. */
38 if(lo > count.LowPart)
43 return (u64)((((u64)hi << 32) | (u64)lo)*(1000000000.0/frequency.QuadPart));
46 void sleep_nanos(u64 nsec)
48 Sleep((DWORD)(nsec/1000000));
51 LONG factor_vm::exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch)
53 c->ESP = (cell)fix_callstack_top((stack_frame *)c->ESP);
54 signal_callstack_top = (stack_frame *)c->ESP;
56 switch (e->ExceptionCode)
58 case EXCEPTION_ACCESS_VIOLATION:
59 signal_fault_addr = e->ExceptionInformation[1];
60 c->EIP = (cell)factor::memory_signal_handler_impl;
63 case STATUS_FLOAT_DENORMAL_OPERAND:
64 case STATUS_FLOAT_DIVIDE_BY_ZERO:
65 case STATUS_FLOAT_INEXACT_RESULT:
66 case STATUS_FLOAT_INVALID_OPERATION:
67 case STATUS_FLOAT_OVERFLOW:
68 case STATUS_FLOAT_STACK_CHECK:
69 case STATUS_FLOAT_UNDERFLOW:
70 case STATUS_FLOAT_MULTIPLE_FAULTS:
71 case STATUS_FLOAT_MULTIPLE_TRAPS:
73 signal_fpu_status = fpu_status(MXCSR(c));
75 signal_fpu_status = fpu_status(X87SW(c) | MXCSR(c));
78 MXCSR(c) &= 0xffffffc0;
79 c->EIP = (cell)factor::fp_signal_handler_impl;
82 signal_number = e->ExceptionCode;
83 c->EIP = (cell)factor::misc_signal_handler_impl;
90 VM_C_API LONG exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch)
92 return current_vm()->exception_handler(e,frame,c,dispatch);
95 void factor_vm::open_console()