]> gitweb.factorcode.org Git - factor.git/blob - vm/os-windows-nt.cpp
395ab10214b353e5ba988102e95dd37767bc87c1
[factor.git] / vm / os-windows-nt.cpp
1 #include "master.hpp"
2
3 namespace factor
4 {
5
6 THREADHANDLE start_thread(void *(*start_routine)(void *), void *args)
7 {
8         return (void *)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, args, 0, 0);
9 }
10
11 u64 nano_count()
12 {
13         static double scale_factor;
14
15         static u32 hi = 0;
16         static u32 lo = 0;
17
18         LARGE_INTEGER count;
19         BOOL ret = QueryPerformanceCounter(&count);
20         if(ret == 0)
21                 fatal_error("QueryPerformanceCounter", 0);
22
23         if(scale_factor == 0.0)
24         {
25                 LARGE_INTEGER frequency;
26                 BOOL ret = QueryPerformanceFrequency(&frequency);
27                 if(ret == 0)
28                         fatal_error("QueryPerformanceFrequency", 0);
29                 scale_factor = (1000000000.0 / frequency.QuadPart);
30         }
31
32 #ifdef FACTOR_64
33         hi = count.HighPart;
34 #else
35         /* On VirtualBox, QueryPerformanceCounter does not increment
36         the high part every time the low part overflows.  Workaround. */
37         if(lo > count.LowPart)
38                 hi++;
39 #endif
40         lo = count.LowPart;
41
42         return (u64)((((u64)hi << 32) | (u64)lo) * scale_factor);
43 }
44
45 void sleep_nanos(u64 nsec)
46 {
47         Sleep((DWORD)(nsec/1000000));
48 }
49
50 LONG factor_vm::exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch)
51 {
52         c->ESP = (cell)fix_callstack_top((stack_frame *)c->ESP);
53         ctx->callstack_top = (stack_frame *)c->ESP;
54
55         switch (e->ExceptionCode)
56         {
57         case EXCEPTION_ACCESS_VIOLATION:
58                 signal_fault_addr = e->ExceptionInformation[1];
59                 c->EIP = (cell)factor::memory_signal_handler_impl;
60                 break;
61
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:
71 #ifdef FACTOR_64
72                 signal_fpu_status = fpu_status(MXCSR(c));
73 #else
74                 signal_fpu_status = fpu_status(X87SW(c) | MXCSR(c));
75
76                 /* This seems to have no effect */
77                 X87SW(c) = 0;
78 #endif
79                 MXCSR(c) &= 0xffffffc0;
80                 c->EIP = (cell)factor::fp_signal_handler_impl;
81                 break;
82         default:
83                 signal_number = e->ExceptionCode;
84                 c->EIP = (cell)factor::misc_signal_handler_impl;
85                 break;
86         }
87
88         return 0;
89 }
90
91 VM_C_API LONG exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch)
92 {
93         return current_vm()->exception_handler(e,frame,c,dispatch);
94 }
95
96 void factor_vm::open_console()
97 {
98 }
99
100 }