]> gitweb.factorcode.org Git - factor.git/blob - vm/os-windows-nt.cpp
removed vm ptrs from unix code (still in signal handlers tho)
[factor.git] / vm / os-windows-nt.cpp
1 #include "master.hpp"
2
3 namespace factor
4 {
5
6 void *start_thread(void *(*start_routine)(void *),void *args){
7     return CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, args, 0, 0); 
8 }
9
10 cell factorvm::thread_id(){
11         return GetCurrentThreadId();
12 }
13
14
15 s64 factorvm::current_micros()
16 {
17         FILETIME t;
18         GetSystemTimeAsFileTime(&t);
19         return (((s64)t.dwLowDateTime | (s64)t.dwHighDateTime<<32)
20                 - EPOCH_OFFSET) / 10;
21 }
22
23 FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe)
24 {
25         factorvm *myvm = lookup_vm(GetCurrentThreadId());
26         PEXCEPTION_RECORD e = (PEXCEPTION_RECORD)pe->ExceptionRecord;
27         CONTEXT *c = (CONTEXT*)pe->ContextRecord;
28
29         if(myvm->in_code_heap_p(c->EIP))
30                 myvm->signal_callstack_top = (stack_frame *)c->ESP;
31         else
32                 myvm->signal_callstack_top = NULL;
33
34     switch (e->ExceptionCode) {
35     case EXCEPTION_ACCESS_VIOLATION:
36                 myvm->signal_fault_addr = e->ExceptionInformation[1];
37                 c->EIP = (cell)memory_signal_handler_impl;
38         break;
39
40         case STATUS_FLOAT_DENORMAL_OPERAND:
41         case STATUS_FLOAT_DIVIDE_BY_ZERO:
42         case STATUS_FLOAT_INEXACT_RESULT:
43         case STATUS_FLOAT_INVALID_OPERATION:
44         case STATUS_FLOAT_OVERFLOW:
45         case STATUS_FLOAT_STACK_CHECK:
46         case STATUS_FLOAT_UNDERFLOW:
47         case STATUS_FLOAT_MULTIPLE_FAULTS:
48         case STATUS_FLOAT_MULTIPLE_TRAPS:
49                 myvm->signal_fpu_status = fpu_status(X87SW(c) | MXCSR(c));
50                 X87SW(c) = 0;
51                 MXCSR(c) &= 0xffffffc0;
52                 c->EIP = (cell)fp_signal_handler_impl;
53                 break;
54         case 0x40010006:
55                 /* If the Widcomm bluetooth stack is installed, the BTTray.exe
56                 process injects code into running programs. For some reason this
57                 results in random SEH exceptions with this (undocumented)
58                 exception code being raised. The workaround seems to be ignoring
59                 this altogether, since that is what happens if SEH is not
60                 enabled. Don't really have any idea what this exception means. */
61                 break;
62         default:
63                 myvm->signal_number = e->ExceptionCode;
64                 c->EIP = (cell)misc_signal_handler_impl;
65                 break;
66         }
67         return EXCEPTION_CONTINUE_EXECUTION;
68 }
69
70 bool handler_added = 0;
71
72 void factorvm::c_to_factor_toplevel(cell quot)
73 {
74         if(!handler_added){
75                 if(!AddVectoredExceptionHandler(0, (PVECTORED_EXCEPTION_HANDLER)exception_handler))
76                         fatal_error("AddVectoredExceptionHandler failed", 0);
77                 handler_added = 1;
78         }
79         c_to_factor(quot,this);
80         RemoveVectoredExceptionHandler((void *)exception_handler);
81 }
82
83 void factorvm::open_console()
84 {
85 }
86
87 }