| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | #include "master.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-04 02:46:13 -04:00
										 |  |  | namespace factor | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-25 03:55:18 -04: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-08-28 16:46:47 -04:00
										 |  |  | DWORD dwTlsIndex;  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void init_platform_globals() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-09-23 13:18:23 -04:00
										 |  |  | 	if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES) | 
					
						
							| 
									
										
										
										
											2009-08-28 16:46:47 -04:00
										 |  |  | 		fatal_error("TlsAlloc failed - out of indexes",0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-23 14:05:46 -04:00
										 |  |  | void register_vm_with_thread(factor_vm *vm) | 
					
						
							| 
									
										
										
										
											2009-08-28 16:46:47 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-09-23 13:18:23 -04:00
										 |  |  | 	if (! TlsSetValue(dwTlsIndex, vm)) | 
					
						
							| 
									
										
										
										
											2009-08-28 16:46:47 -04:00
										 |  |  | 		fatal_error("TlsSetValue failed",0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-23 14:05:46 -04:00
										 |  |  | factor_vm *tls_vm() | 
					
						
							| 
									
										
										
										
											2009-08-28 16:46:47 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-10-02 10:37:04 -04:00
										 |  |  | 	factor_vm *vm = (factor_vm*)TlsGetValue(dwTlsIndex); | 
					
						
							|  |  |  | 	assert(vm != NULL); | 
					
						
							|  |  |  | 	return vm; | 
					
						
							| 
									
										
										
										
											2009-08-25 01:35:54 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-25 03:55:18 -04:00
										 |  |  | s64 current_micros() | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | { | 
					
						
							|  |  |  | 	FILETIME t; | 
					
						
							|  |  |  | 	GetSystemTimeAsFileTime(&t); | 
					
						
							|  |  |  | 	return (((s64)t.dwLowDateTime | (s64)t.dwHighDateTime<<32) | 
					
						
							|  |  |  | 		- EPOCH_OFFSET) / 10; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-23 14:05:46 -04:00
										 |  |  | LONG factor_vm::exception_handler(PEXCEPTION_POINTERS pe) | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | { | 
					
						
							|  |  |  | 	PEXCEPTION_RECORD e = (PEXCEPTION_RECORD)pe->ExceptionRecord; | 
					
						
							|  |  |  | 	CONTEXT *c = (CONTEXT*)pe->ContextRecord; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-03 15:32:39 -04:00
										 |  |  | 	if(in_code_heap_p(c->EIP)) | 
					
						
							|  |  |  | 		signal_callstack_top = (stack_frame *)c->ESP; | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 	else | 
					
						
							| 
									
										
										
										
											2009-09-03 15:32:39 -04:00
										 |  |  | 		signal_callstack_top = NULL; | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-05 04:27:28 -04: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; | 
					
						
							| 
									
										
										
										
											2009-10-05 04:27:28 -04: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: | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 		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; | 
					
						
							|  |  |  | 	case 0x40010006: | 
					
						
							|  |  |  | 		/* If the Widcomm bluetooth stack is installed, the BTTray.exe
 | 
					
						
							|  |  |  | 		process injects code into running programs. For some reason this | 
					
						
							|  |  |  | 		results in random SEH exceptions with this (undocumented) | 
					
						
							|  |  |  | 		exception code being raised. The workaround seems to be ignoring | 
					
						
							|  |  |  | 		this altogether, since that is what happens if SEH is not | 
					
						
							|  |  |  | 		enabled. Don't really have any idea what this exception means. */ | 
					
						
							|  |  |  | 		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; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return EXCEPTION_CONTINUE_EXECUTION; | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-03 15:32:39 -04:00
										 |  |  | FACTOR_STDCALL LONG exception_handler(PEXCEPTION_POINTERS pe) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-10-14 14:14:57 -04:00
										 |  |  | 	return tls_vm()->exception_handler(pe); | 
					
						
							| 
									
										
										
										
											2009-09-03 15:32:39 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-24 16:10:18 -04:00
										 |  |  | bool handler_added = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-23 14:05:46 -04:00
										 |  |  | void factor_vm::c_to_factor_toplevel(cell quot) | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-08-24 16:10:18 -04:00
										 |  |  | 	if(!handler_added){ | 
					
						
							| 
									
										
										
										
											2009-09-03 15:32:39 -04:00
										 |  |  | 		if(!AddVectoredExceptionHandler(0, (PVECTORED_EXCEPTION_HANDLER)factor::exception_handler)) | 
					
						
							| 
									
										
										
										
											2009-08-24 16:10:18 -04:00
										 |  |  | 			fatal_error("AddVectoredExceptionHandler failed", 0); | 
					
						
							|  |  |  | 		handler_added = 1; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-08-19 14:02:12 -04:00
										 |  |  | 	c_to_factor(quot,this); | 
					
						
							| 
									
										
										
										
											2009-09-03 15:32:39 -04:00
										 |  |  |  	RemoveVectoredExceptionHandler((void *)factor::exception_handler); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -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
										 |  |  | } |