6 THREADHANDLE start_thread(void *(*start_routine)(void *), void *args)
8 return (void *)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, args, 0, 0);
13 static double scale_factor;
19 BOOL ret = QueryPerformanceCounter(&count);
21 fatal_error("QueryPerformanceCounter", 0);
23 if(scale_factor == 0.0)
25 LARGE_INTEGER frequency;
26 BOOL ret = QueryPerformanceFrequency(&frequency);
28 fatal_error("QueryPerformanceFrequency", 0);
29 scale_factor = (1000000000.0 / frequency.QuadPart);
35 /* On VirtualBox, QueryPerformanceCounter does not increment
36 the high part every time the low part overflows. Workaround. */
37 if(lo > count.LowPart)
42 return (u64)((((u64)hi << 32) | (u64)lo) * scale_factor);
45 void sleep_nanos(u64 nsec)
47 Sleep((DWORD)(nsec/1000000));
50 LONG factor_vm::exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch)
52 c->ESP = (cell)fix_callstack_top((stack_frame *)c->ESP);
53 ctx->callstack_top = (stack_frame *)c->ESP;
55 switch (e->ExceptionCode)
57 case EXCEPTION_ACCESS_VIOLATION:
58 signal_fault_addr = e->ExceptionInformation[1];
59 c->EIP = (cell)factor::memory_signal_handler_impl;
62 case STATUS_FLOAT_DENORMAL_OPERAND:
63 case STATUS_FLOAT_DIVIDE_BY_ZERO:
64 case STATUS_FLOAT_INEXACT_RESULT:
65 case STATUS_FLOAT_INVALID_OPERATION:
66 case STATUS_FLOAT_OVERFLOW:
67 case STATUS_FLOAT_STACK_CHECK:
68 case STATUS_FLOAT_UNDERFLOW:
69 case STATUS_FLOAT_MULTIPLE_FAULTS:
70 case STATUS_FLOAT_MULTIPLE_TRAPS:
72 signal_fpu_status = fpu_status(MXCSR(c));
74 signal_fpu_status = fpu_status(X87SW(c) | MXCSR(c));
76 /* This seems to have no effect */
79 MXCSR(c) &= 0xffffffc0;
80 c->EIP = (cell)factor::fp_signal_handler_impl;
83 signal_number = e->ExceptionCode;
84 c->EIP = (cell)factor::misc_signal_handler_impl;
91 VM_C_API LONG exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch)
93 return current_vm()->exception_handler(e,frame,c,dispatch);
96 void factor_vm::open_console()