33d05f43c3d2e71ef3c7554ce8ab13318e7c8534
[sbcl.git] / src / runtime / win32-os.c
1 /*
2  * the Win32 incarnation of OS-dependent routines.  See also
3  * $(sbcl_arch)-win32-os.c
4  *
5  * This file (along with os.h) exports an OS-independent interface to
6  * the operating system VM facilities. Surprise surprise, this
7  * interface looks a lot like the Mach interface (but simpler in some
8  * places). For some operating systems, a subset of these functions
9  * will have to be emulated.
10  */
11
12 /*
13  * This software is part of the SBCL system. See the README file for
14  * more information.
15  *
16  * This software is derived from the CMU CL system, which was
17  * written at Carnegie Mellon University and released into the
18  * public domain. The software is in the public domain and is
19  * provided with absolutely no warranty. See the COPYING and CREDITS
20  * files for more information.
21  */
22
23 /*
24  * This file was copied from the Linux version of the same, and
25  * likely still has some linuxisms in it have haven't been elimiated
26  * yet.
27  */
28
29 #include <malloc.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <sys/param.h>
33 #include <sys/file.h>
34 #include <io.h>
35 #include "sbcl.h"
36 #include "os.h"
37 #include "arch.h"
38 #include "globals.h"
39 #include "sbcl.h"
40 #include "interrupt.h"
41 #include "interr.h"
42 #include "lispregs.h"
43 #include "runtime.h"
44 #include "alloc.h"
45 #include "genesis/primitive-objects.h"
46 #include "dynbind.h"
47
48 #include <sys/types.h>
49 #include <sys/time.h>
50 #include <sys/stat.h>
51 #include <unistd.h>
52
53 #include <math.h>
54 #include <float.h>
55
56 #include <excpt.h>
57 #include <errno.h>
58
59 #include "validate.h"
60 #include "thread.h"
61 #include "cpputil.h"
62
63 #ifndef LISP_FEATURE_SB_THREAD
64 /* dummy definition to reduce ifdef clutter */
65 #define WITH_GC_AT_SAFEPOINTS_ONLY() if (0) ; else
66 #endif
67
68 os_vm_size_t os_vm_page_size;
69
70 #include "gc.h"
71 #include "gencgc-internal.h"
72 #include <winsock2.h>
73
74 #if 0
75 int linux_sparc_siginfo_bug = 0;
76 int linux_supports_futex=0;
77 #endif
78
79 #include <stdarg.h>
80 #include <string.h>
81
82 /* missing definitions for modern mingws */
83 #ifndef EH_UNWINDING
84 #define EH_UNWINDING 0x02
85 #endif
86 #ifndef EH_EXIT_UNWIND
87 #define EH_EXIT_UNWIND 0x04
88 #endif
89
90 /* Tired of writing arch_os_get_current_thread each time. */
91 #define this_thread (arch_os_get_current_thread())
92
93 /* wrappers for winapi calls that must be successful (like SBCL's
94  * (aver ...) form). */
95
96 /* win_aver function: basic building block for miscellaneous
97  * ..AVER.. macrology (below) */
98
99 /* To do: These routines used to be "customizable" with dyndebug_init()
100  * and variables like dyndebug_survive_aver, dyndebug_skip_averlax based
101  * on environment variables.  Those features got lost on the way, but
102  * ought to be reintroduced. */
103
104 static inline
105 intptr_t win_aver(intptr_t value, char* comment, char* file, int line,
106                   int justwarn)
107 {
108     if (!value) {
109         LPSTR errorMessage = "<FormatMessage failed>";
110         DWORD errorCode = GetLastError(), allocated=0;
111         int posixerrno = errno;
112         const char* posixstrerror = strerror(errno);
113         char* report_template =
114             "Expression unexpectedly false: %s:%d\n"
115             " ... %s\n"
116             "     ===> returned #X%p, \n"
117             "     (in thread %p)"
118             " ... Win32 thinks:\n"
119             "     ===> code %u, message => %s\n"
120             " ... CRT thinks:\n"
121             "     ===> code %u, message => %s\n";
122
123         allocated =
124             FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER|
125                            FORMAT_MESSAGE_FROM_SYSTEM,
126                            NULL,
127                            errorCode,
128                            MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),
129                            (LPSTR)&errorMessage,
130                            1024u,
131                            NULL);
132
133         if (justwarn) {
134             fprintf(stderr, report_template,
135                     file, line,
136                     comment, value,
137                     this_thread,
138                     (unsigned)errorCode, errorMessage,
139                     posixerrno, posixstrerror);
140         } else {
141             lose(report_template,
142                     file, line,
143                     comment, value,
144                     this_thread,
145                     (unsigned)errorCode, errorMessage,
146                     posixerrno, posixstrerror);
147         }
148         if (allocated)
149             LocalFree(errorMessage);
150     }
151     return value;
152 }
153
154 /* sys_aver function: really tiny adaptor of win_aver for
155  * "POSIX-parody" CRT results ("lowio" and similar stuff):
156  * negative number means something... negative. */
157 static inline
158 intptr_t sys_aver(long value, char* comment, char* file, int line,
159               int justwarn)
160 {
161     win_aver((intptr_t)(value>=0),comment,file,line,justwarn);
162     return value;
163 }
164
165 /* Check for (call) result being boolean true. (call) may be arbitrary
166  * expression now; massive attack of gccisms ensures transparent type
167  * conversion back and forth, so the type of AVER(expression) is the
168  * type of expression. Value is the same _if_ it can be losslessly
169  * converted to (void*) and back.
170  *
171  * Failed AVER() is normally fatal. Well, unless dyndebug_survive_aver
172  * flag is set. */
173
174 #define AVER(call)                                                      \
175     ({ __typeof__(call) __attribute__((unused)) me =                    \
176             (__typeof__(call))                                          \
177             win_aver((intptr_t)(call), #call, __FILE__, __LINE__, 0);      \
178         me;})
179
180 /* AVERLAX(call): do the same check as AVER did, but be mild on
181  * failure: print an annoying unrequested message to stderr, and
182  * continue. With dyndebug_skip_averlax flag, AVERLAX stop even to
183  * check and complain. */
184
185 #define AVERLAX(call)                                                   \
186     ({ __typeof__(call) __attribute__((unused)) me =                    \
187             (__typeof__(call))                                          \
188             win_aver((intptr_t)(call), #call, __FILE__, __LINE__, 1);      \
189         me;})
190
191 /* Now, when failed AVER... prints both errno and GetLastError(), two
192  * variants of "POSIX/lowio" style checks below are almost useless
193  * (they build on sys_aver like the two above do on win_aver). */
194
195 #define CRT_AVER_NONNEGATIVE(call)                              \
196     ({ __typeof__(call) __attribute__((unused)) me =            \
197             (__typeof__(call))                                  \
198             sys_aver((call), #call, __FILE__, __LINE__, 0);     \
199         me;})
200
201 #define CRT_AVERLAX_NONNEGATIVE(call)                           \
202     ({ __typeof__(call) __attribute__((unused)) me =            \
203             (__typeof__(call))                                  \
204             sys_aver((call), #call, __FILE__, __LINE__, 1);     \
205         me;})
206
207 /* to be removed */
208 #define CRT_AVER(booly)                                         \
209     ({ __typeof__(booly) __attribute__((unused)) me = (booly);  \
210         sys_aver((booly)?0:-1, #booly, __FILE__, __LINE__, 0);  \
211         me;})
212
213 const char * t_nil_s(lispobj symbol);
214
215 /*
216  * The following signal-mask-related alien routines are called from Lisp:
217  */
218
219 /* As of win32, deferrables _do_ matter. gc_signal doesn't. */
220 unsigned long block_deferrables_and_return_mask()
221 {
222     sigset_t sset;
223     block_deferrable_signals(0, &sset);
224     return (unsigned long)sset;
225 }
226
227 #if defined(LISP_FEATURE_SB_THREAD)
228 void apply_sigmask(unsigned long sigmask)
229 {
230     sigset_t sset = (sigset_t)sigmask;
231     pthread_sigmask(SIG_SETMASK, &sset, 0);
232 }
233 #endif
234
235 /* The exception handling function looks like this: */
236 EXCEPTION_DISPOSITION handle_exception(EXCEPTION_RECORD *,
237                                        struct lisp_exception_frame *,
238                                        CONTEXT *,
239                                        void *);
240 /* handle_exception is defined further in this file, but since SBCL
241  * 1.0.1.24, it doesn't get registered as SEH handler directly anymore,
242  * not even by wos_install_interrupt_handlers. Instead, x86-assem.S
243  * provides exception_handler_wrapper; we install it here, and each
244  * exception frame on nested funcall()s also points to it.
245  */
246
247
248 void *base_seh_frame;
249
250 HMODULE runtime_module_handle = 0u;
251
252 static void *get_seh_frame(void)
253 {
254     void* retval;
255 #ifdef LISP_FEATURE_X86
256     asm volatile ("mov %%fs:0,%0": "=r" (retval));
257 #else
258     asm volatile ("mov %%gs:0,%0": "=r" (retval));
259 #endif
260     return retval;
261 }
262
263 static void set_seh_frame(void *frame)
264 {
265 #ifdef LISP_FEATURE_X86
266     asm volatile ("mov %0,%%fs:0": : "r" (frame));
267 #else
268     asm volatile ("mov %0,%%gs:0": : "r" (frame));
269 #endif
270 }
271
272 #if defined(LISP_FEATURE_SB_THREAD)
273
274 void alloc_gc_page()
275 {
276     AVER(VirtualAlloc(GC_SAFEPOINT_PAGE_ADDR, sizeof(lispobj),
277                       MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE));
278 }
279
280 /* Permit loads from GC_SAFEPOINT_PAGE_ADDR (NB page state change is
281  * "synchronized" with the memory region content/availability --
282  * e.g. you won't see other CPU flushing buffered writes after WP --
283  * but there is some window when other thread _seem_ to trap AFTER
284  * access is granted. You may think of it something like "OS enters
285  * SEH handler too slowly" -- what's important is there's no implicit
286  * synchronization between VirtualProtect caller and other thread's
287  * SEH handler, hence no ordering of events. VirtualProtect is
288  * implicitly synchronized with protected memory contents (only).
289  *
290  * The last fact may be potentially used with many benefits e.g. for
291  * foreign call speed, but we don't use it for now: almost the only
292  * fact relevant to the current signalling protocol is "sooner or
293  * later everyone will trap [everyone will stop trapping]".
294  *
295  * An interesting source on page-protection-based inter-thread
296  * communication is a well-known paper by Dave Dice, Hui Huang,
297  * Mingyao Yang: ``Asymmetric Dekker Synchronization''. Last time
298  * I checked it was available at
299  * http://home.comcast.net/~pjbishop/Dave/Asymmetric-Dekker-Synchronization.txt
300  */
301 void map_gc_page()
302 {
303     DWORD oldProt;
304     AVER(VirtualProtect((void*) GC_SAFEPOINT_PAGE_ADDR, sizeof(lispobj),
305                         PAGE_READWRITE, &oldProt));
306 }
307
308 void unmap_gc_page()
309 {
310     DWORD oldProt;
311     AVER(VirtualProtect((void*) GC_SAFEPOINT_PAGE_ADDR, sizeof(lispobj),
312                         PAGE_NOACCESS, &oldProt));
313 }
314
315 #endif
316
317 #if defined(LISP_FEATURE_SB_DYNAMIC_CORE)
318 /* This feature has already saved me more development time than it
319  * took to implement.  In its current state, ``dynamic RT<->core
320  * linking'' is a protocol of initialization of C runtime and Lisp
321  * core, populating SBCL linkage table with entries for runtime
322  * "foreign" symbols that were referenced in cross-compiled code.
323  *
324  * How it works: a sketch
325  *
326  * Last Genesis (resulting in cold-sbcl.core) binds foreign fixups in
327  * x-compiled lisp-objs to sequential addresses from the beginning of
328  * linkage-table space; that's how it ``resolves'' foreign references.
329  * Obviously, this process doesn't require pre-built runtime presence.
330  *
331  * When the runtime loads the core (cold-sbcl.core initially,
332  * sbcl.core later), runtime should do its part of the protocol by (1)
333  * traversing a list of ``runtime symbols'' prepared by Genesis and
334  * dumped as a static symbol value, (2) resolving each name from this
335  * list to an address (stubbing unresolved ones with
336  * undefined_alien_address or undefined_alien_function), (3) adding an
337  * entry for each symbol somewhere near the beginning of linkage table
338  * space (location is provided by the core).
339  *
340  * The implementation of the part described in the last paragraph
341  * follows. C side is currently more ``hackish'' and less clear than
342  * the Lisp code; OTOH, related Lisp changes are scattered, and some
343  * of them play part in complex interrelations -- beautiful but taking
344  * much time to understand --- but my subset of PE-i386 parser below
345  * is in one place (here) and doesn't have _any_ non-trivial coupling
346  * with the rest of the Runtime.
347  *
348  * What do we gain with this feature, after all?
349  *
350  * One things that I have to do rather frequently: recompile and
351  * replace runtime without rebuilding the core. Doubtlessly, slam.sh
352  * was a great time-saver here, but relinking ``cold'' core and bake a
353  * ``warm'' one takes, as it seems, more than 10x times of bare
354  * SBCL.EXE build time -- even if everything is recompiled, which is
355  * now unnecessary. Today, if I have a new idea for the runtime,
356  * getting from C-x C-s M-x ``compile'' to fully loaded SBCL
357  * installation takes 5-15 seconds.
358  *
359  * Another thing (that I'm not currently using, but obviously
360  * possible) is delivering software patches to remote system on
361  * customer site. As you are doing minor additions or corrections in
362  * Lisp code, it doesn't take much effort to prepare a tiny ``FASL
363  * bundle'' that rolls up your patch, redumps and -- presto -- 100MiB
364  * program is fixed by sending and loading a 50KiB thingie.
365  *
366  * However, until LISP_FEATURE_SB_DYNAMIC_CORE, if your bug were fixed
367  * by modifying two lines of _C_ sources, a customer described above
368  * had to be ready to receive and reinstall a new 100MiB
369  * executable. With the aid of code below, deploying such a fix
370  * requires only sending ~300KiB (when stripped) of SBCL.EXE.
371  *
372  * But there is more to it: as the common linkage-table is used for
373  * DLLs and core, its entries may be overridden almost without a look
374  * into SBCL internals. Therefore, ``patching'' C runtime _without_
375  * restarting target systems is also possible in many situations
376  * (it's not as trivial as loading FASLs into a running daemon, but
377  * easy enough to be a viable alternative if any downtime is highly
378  * undesirable).
379  *
380  * During my (rather limited) commercial Lisp development experience
381  * I've already been through a couple of situations where such
382  * ``deployment'' issues were important; from my _total_ programming
383  * experience I know -- _sometimes_ they are a two orders of magnitude
384  * more important than those I observed.
385  *
386  * The possibility of entire runtime ``hot-swapping'' in running
387  * process is not purely theoretical, as it could seem. There are 2-3
388  * problems whose solution is not obvious (call stack patching, for
389  * instance), but it's literally _nothing_ if compared with
390  * e.g. LISP_FEATURE_SB_AUTO_FPU_SWITCH.  By the way, one of the
391  * problems with ``hot-swapping'', that could become a major one in
392  * many other environments, is nonexistent in SBCL: we already have a
393  * ``global quiesce point'' that is generally required for this kind
394  * of worldwide revolution -- around collect_garbage.
395  *
396  * What's almost unnoticeable from the C side (where you are now, dear
397  * reader): using the same style for all linking is beautiful. I tried
398  * to leave old-style linking code in place for the sake of
399  * _non-linkage-table_ platforms (they probably don't have -ldl or its
400  * equivalent, like LL/GPA, at all) -- but i did it usually by moving
401  * the entire `old style' code under #!-sb-dynamic-core and
402  * refactoring the `new style' branch, instead of cutting the tail
403  * piecemeal and increasing #!+-ifdeffery amount & the world enthropy.
404  *
405  * If we look at the majority of the ``new style'' code units, it's a
406  * common thing to observe how #!+-ifdeffery _vanishes_ instead of
407  * multiplying: #!-sb-xc, #!+sb-xc-host and #!-sb-xc-host end up
408  * needing the same code. Runtime checks of static v. dynamic symbol
409  * disappear even faster. STDCALL mangling and leading underscores go
410  * out of scope (and GCed, hopefully) instead of surfacing here and
411  * there as a ``special case for core static symbols''. What I like
412  * the most about CL development in general is a frequency of solving
413  * problems and fixing bugs by simplifying code and dropping special
414  * cases.
415  *
416  * Last important thing about the following code: besides resolving
417  * symbols provided by the core itself, it detects runtime's own
418  * build-time prerequisite DLLs. Any symbol that is unresolved against
419  * the core is looked up in those DLLs (normally kernel32, msvcrt,
420  * ws2_32... I could forget something). This action (1) resembles
421  * implementation of foreign symbol lookup in SBCL itself, (2)
422  * emulates shared library d.l. facilities of OSes that use flat
423  * dynamic symbol namespace (or default to it). Anyone concerned with
424  * portability problems of this PE-i386 stuff below will be glad to
425  * hear that it could be ported to most modern Unices _by deletion_:
426  * raw dlsym() with null handle usually does the same thing that i'm
427  * trying to squeeze out of MS Windows by the brute force.
428  *
429  * My reason for _desiring_ flat symbol namespace, populated from
430  * link-time dependencies, is avoiding any kind of ``requested-by-Lisp
431  * symbol lists to be linked statically'', providing core v. runtime
432  * independence in both directions. Minimizing future maintenance
433  * effort is very important; I had gone for it consistently, starting
434  * by turning "CloseHandle@4" into a simple "CloseHandle", continuing
435  * by adding intermediate Genesis resulting in autogenerated symbol
436  * list (farewell, void scratch(); good riddance), going to take
437  * another great step for core/runtime independence... and _without_
438  * flat namespace emulation, the ghosts and spirits exiled at the
439  * first steps would come and take revenge: well, here are the symbols
440  * that are really in msvcrt.dll.. hmm, let's link statically against
441  * them, so the entry is pulled from the import library.. and those
442  * entry has mangled names that we have to map.. ENOUGH, I though
443  * here: fed up with stuff like that.
444  *
445  * Now here we are, without import libraries, without mangled symbols,
446  * and without nm-generated symbol tables. Every symbol exported by
447  * the runtime is added to SBCL.EXE export directory; every symbol
448  * requested by the core is looked up by GetProcAddress for SBCL.EXE,
449  * falling back to GetProcAddress for MSVCRT.dll, etc etc.. All ties
450  * between SBCL's foreign symbols with object file symbol tables,
451  * import libraries and other pre-linking symbol-resolving entities
452  * _having no representation in SBCL.EXE_ were teared.
453  *
454  * This simplistic approach proved to work well; there is only one
455  * problem introduced by it, and rather minor: in real MSVCRT.dll,
456  * what's used to be available as open() is now called _open();
457  * similar thing happened to many other `lowio' functions, though not
458  * every one, so it's not a kind of name mangling but rather someone's
459  * evil creative mind in action.
460  *
461  * When we look up any of those poor `uglified' functions in CRT
462  * reference on MSDN, we can see a notice resembling this one:
463  *
464  * `unixishname()' is obsolete and provided for backward
465  * compatibility; new standard-compliant function, `_unixishname()',
466  * should be used instead.  Sentences of that kind were there for
467  * several years, probably even for a decade or more (a propos,
468  * MSVCRT.dll, as the name to link against, predates year 2000, so
469  * it's actually possible). Reasoning behing it (what MS people had in
470  * mind) always seemed strange to me: if everyone uses open() and that
471  * `everyone' is important to you, why rename the function?  If no one
472  * uses open(), why provide or retain _open() at all? <kidding>After
473  * all, names like _open() are entirely non-informative and just plain
474  * ugly; compare that with CreateFileW() or InitCommonControlsEx(),
475  * the real examples of beauty and clarity.</kidding>
476  *
477  * Anyway, if the /standard/ name on Windows is _open() (I start to
478  * recall, vaguely, that it's because of _underscore names being
479  * `reserved to system' and all other ones `available for user', per
480  * ANSI/ISO C89) -- well, if the /standard/ name is _open, SBCL should
481  * use it when it uses MSVCRT and not some ``backward-compatible''
482  * stuff. Deciding this way, I added a hack to SBCL's syscall macros,
483  * so "[_]open" as a syscall name is interpreted as a request to link
484  * agains "_open" on win32 and "open" on every other system.
485  *
486  * Of course, this name-parsing trick lacks conceptual clarity; we're
487  * going to get rid of it eventually. */
488
489 u32 os_get_build_time_shared_libraries(u32 excl_maximum,
490                                        void* opt_root,
491                                        void** opt_store_handles,
492                                        const char *opt_store_names[])
493 {
494     void* base = opt_root ? opt_root : (void*)runtime_module_handle;
495     /* base defaults to 0x400000 with GCC/mingw32. If you dereference
496      * that location, you'll see 'MZ' bytes */
497     void* base_magic_location =
498         base + ((IMAGE_DOS_HEADER*)base)->e_lfanew;
499
500     /* dos header provided the offset from `base' to
501      * IMAGE_FILE_HEADER where PE-i386 really starts */
502
503     void* check_duplicates[excl_maximum];
504
505     if ((*(u32*)base_magic_location)!=0x4550) {
506         /* We don't need this DLL thingie _that_ much. If the world
507          * has changed to a degree where PE magic isn't found, let's
508          * silently return `no libraries detected'. */
509         return 0;
510     } else {
511         /* We traverse PE-i386 structures of SBCL.EXE in memory (not
512          * in the file). File and memory layout _surely_ differ in
513          * some places and _may_ differ in some other places, but
514          * fortunately, those places are irrelevant to the task at
515          * hand. */
516
517         IMAGE_FILE_HEADER* image_file_header = (base_magic_location + 4);
518         IMAGE_OPTIONAL_HEADER* image_optional_header =
519             (void*)(image_file_header + 1);
520         IMAGE_DATA_DIRECTORY* image_import_direntry =
521             &image_optional_header->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
522         IMAGE_IMPORT_DESCRIPTOR* image_import_descriptor =
523             base + image_import_direntry->VirtualAddress;
524         u32 nlibrary, i,j;
525
526         for (nlibrary=0u; nlibrary < excl_maximum
527                           && image_import_descriptor->FirstThunk;
528              ++image_import_descriptor)
529         {
530             HMODULE hmodule;
531             odxprint(runtime_link, "Now should know DLL: %s",
532                      (char*)(base + image_import_descriptor->Name));
533             /* Code using image thunk data to get its handle was here, with a
534              * number of platform-specific tricks (like using VirtualQuery for
535              * old OSes lacking GetModuleHandleEx).
536              *
537              * It's now replaced with requesting handle by name, which is
538              * theoretically unreliable (with SxS, multiple modules with same
539              * name are quite possible), but good enough to find the
540              * link-time dependencies of our executable or DLL. */
541
542             hmodule = (HMODULE)
543                 GetModuleHandle(base + image_import_descriptor->Name);
544
545             if (hmodule)
546             {
547                 /* We may encouncer some module more than once while
548                    traversing import descriptors (it's usually a
549                    result of non-trivial linking process, like doing
550                    ld -r on some groups of files before linking
551                    everything together.
552
553                    Anyway: using a module handle more than once will
554                    do no harm, but it slows down the startup (even
555                    now, our startup time is not a pleasant topic to
556                    discuss when it comes to :sb-dynamic-core; there is
557                    an obvious direction to go for speed, though --
558                    instead of resolving symbols one-by-one, locate PE
559                    export directories -- they are sorted by symbol
560                    name -- and merge them, at one pass, with sorted
561                    list of required symbols (the best time to sort the
562                    latter list is during Genesis -- that's why I don't
563                    proceed with memory copying, qsort() and merge
564                    right here)). */
565
566                 for (j=0; j<nlibrary; ++j)
567                 {
568                     if(check_duplicates[j] == hmodule)
569                         break;
570                 }
571                 if (j<nlibrary) continue; /* duplicate => skip it in
572                                            * outer loop */
573
574                 check_duplicates[nlibrary] = hmodule;
575                 if (opt_store_handles) {
576                     opt_store_handles[nlibrary] = hmodule;
577                 }
578                 if (opt_store_names) {
579                     opt_store_names[nlibrary] = (const char *)
580                         (base + image_import_descriptor->Name);
581                 }
582                 odxprint(runtime_link, "DLL detection: %u, base %p: %s",
583                          nlibrary, hmodule,
584                          (char*)(base + image_import_descriptor->Name));
585                 ++ nlibrary;
586             }
587         }
588         return nlibrary;
589     }
590 }
591
592 static u32 buildTimeImageCount = 0;
593 static void* buildTimeImages[16];
594
595 /* Resolve symbols against the executable and its build-time dependencies */
596 void* os_dlsym_default(char* name)
597 {
598     unsigned int i;
599     void* result = 0;
600     if (buildTimeImageCount == 0) {
601         buildTimeImageCount =
602             1 + os_get_build_time_shared_libraries(15u,
603             NULL, 1+(void**)buildTimeImages, NULL);
604     }
605     for (i = 0; i<buildTimeImageCount && (!result); ++i) {
606         result = GetProcAddress(buildTimeImages[i], name);
607     }
608     return result;
609 }
610
611 #endif /* SB_DYNAMIC_CORE */
612
613 #if defined(LISP_FEATURE_SB_THREAD)
614 /* We want to get a slot in TIB that (1) is available at constant
615    offset, (2) is our private property, so libraries wouldn't legally
616    override it, (3) contains something predefined for threads created
617    out of our sight.
618
619    Low 64 TLS slots are adressable directly, starting with
620    FS:[#xE10]. When SBCL runtime is initialized, some of the low slots
621    may be already in use by its prerequisite DLLs, as DllMain()s and
622    TLS callbacks have been called already. But slot 63 is unlikely to
623    be reached at this point: one slot per DLL that needs it is the
624    common practice, and many system DLLs use predefined TIB-based
625    areas outside conventional TLS storage and don't need TLS slots.
626    With our current dependencies, even slot 2 is observed to be free
627    (as of WinXP and wine).
628
629    Now we'll call TlsAlloc() repeatedly until slot 63 is officially
630    assigned to us, then TlsFree() all other slots for normal use. TLS
631    slot 63, alias FS:[#.(+ #xE10 (* 4 63))], now belongs to us.
632
633    To summarize, let's list the assumptions we make:
634
635    - TIB, which is FS segment base, contains first 64 TLS slots at the
636    offset #xE10 (i.e. TIB layout compatibility);
637    - TLS slots are allocated from lower to higher ones;
638    - All libraries together with CRT startup have not requested 64
639    slots yet.
640
641    All these assumptions together don't seem to be less warranted than
642    the availability of TIB arbitrary data slot for our use. There are
643    some more reasons to prefer slot 63 over TIB arbitrary data: (1) if
644    our assumptions for slot 63 are violated, it will be detected at
645    startup instead of causing some system-specific unreproducible
646    problems afterwards, depending on OS and loaded foreign libraries;
647    (2) if getting slot 63 reliably with our current approach will
648    become impossible for some future Windows version, we can add TLS
649    callback directory to SBCL binary; main image TLS callback is
650    started before _any_ TLS slot is allocated by libraries, and
651    some C compiler vendors rely on this fact. */
652
653 void os_preinit()
654 {
655 #ifdef LISP_FEATURE_X86
656     DWORD slots[TLS_MINIMUM_AVAILABLE];
657     DWORD key;
658     int n_slots = 0, i;
659     for (i=0; i<TLS_MINIMUM_AVAILABLE; ++i) {
660         key = TlsAlloc();
661         if (key == OUR_TLS_INDEX) {
662             if (TlsGetValue(key)!=NULL)
663                 lose("TLS slot assertion failed: fresh slot value is not NULL");
664             TlsSetValue(OUR_TLS_INDEX, (void*)(intptr_t)0xFEEDBAC4);
665             if ((intptr_t)(void*)arch_os_get_current_thread()!=(intptr_t)0xFEEDBAC4)
666                 lose("TLS slot assertion failed: TIB layout change detected");
667             TlsSetValue(OUR_TLS_INDEX, NULL);
668             break;
669         }
670         slots[n_slots++]=key;
671     }
672     for (i=0; i<n_slots; ++i) {
673         TlsFree(slots[i]);
674     }
675     if (key!=OUR_TLS_INDEX) {
676         lose("TLS slot assertion failed: slot 63 is unavailable "
677              "(last TlsAlloc() returned %u)",key);
678     }
679 #endif
680 }
681 #endif  /* LISP_FEATURE_SB_THREAD */
682
683 int os_number_of_processors = 1;
684
685 BOOL WINAPI CancelIoEx(HANDLE handle, LPOVERLAPPED overlapped);
686 typeof(CancelIoEx) *ptr_CancelIoEx;
687 BOOL WINAPI CancelSynchronousIo(HANDLE threadHandle);
688 typeof(CancelSynchronousIo) *ptr_CancelSynchronousIo;
689
690 #define RESOLVE(hmodule,fn)                     \
691     do {                                        \
692         ptr_##fn = (typeof(ptr_##fn))           \
693             GetProcAddress(hmodule,#fn);        \
694     } while (0)
695
696 static void resolve_optional_imports()
697 {
698     HMODULE kernel32 = GetModuleHandleA("kernel32");
699     if (kernel32) {
700         RESOLVE(kernel32,CancelIoEx);
701         RESOLVE(kernel32,CancelSynchronousIo);
702     }
703 }
704
705 #undef RESOLVE
706
707 intptr_t win32_get_module_handle_by_address(os_vm_address_t addr)
708 {
709     HMODULE result = 0;
710     /* So apparently we could use VirtualQuery instead of
711      * GetModuleHandleEx if we wanted to support pre-XP, pre-2003
712      * versions of Windows (i.e. Windows 2000).  I've opted against such
713      * special-casing. :-).  --DFL */
714     return (intptr_t)(GetModuleHandleEx(
715                           GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
716                           GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
717                           (LPCSTR)addr, &result)
718                       ? result : 0);
719 }
720
721 void os_init(char *argv[], char *envp[])
722 {
723     SYSTEM_INFO system_info;
724     GetSystemInfo(&system_info);
725     os_vm_page_size = system_info.dwPageSize > BACKEND_PAGE_BYTES?
726         system_info.dwPageSize : BACKEND_PAGE_BYTES;
727 #if defined(LISP_FEATURE_X86)
728     fast_bzero_pointer = fast_bzero_detect;
729 #endif
730     os_number_of_processors = system_info.dwNumberOfProcessors;
731
732     base_seh_frame = get_seh_frame();
733
734     resolve_optional_imports();
735     runtime_module_handle = (HMODULE)win32_get_module_handle_by_address(&runtime_module_handle);
736 }
737
738 static inline boolean local_thread_stack_address_p(os_vm_address_t address)
739 {
740     return this_thread &&
741         (((((u64)address >= (u64)this_thread->os_address) &&
742            ((u64)address < ((u64)this_thread)-THREAD_CSP_PAGE_SIZE))||
743           (((u64)address >= (u64)this_thread->control_stack_start)&&
744            ((u64)address < (u64)this_thread->control_stack_end))));
745 }
746
747 /*
748  * So we have three fun scenarios here.
749  *
750  * First, we could be being called to reserve the memory areas
751  * during initialization (prior to loading the core file).
752  *
753  * Second, we could be being called by the GC to commit a page
754  * that has just been decommitted (for easy zero-fill).
755  *
756  * Third, we could be being called by create_thread_struct()
757  * in order to create the sundry and various stacks.
758  *
759  * The third case is easy to pick out because it passes an
760  * addr of 0.
761  *
762  * The second case is easy to pick out because it will be for
763  * a range of memory that is MEM_RESERVE rather than MEM_FREE.
764  *
765  * The second case is also an easy implement, because we leave
766  * the memory as reserved (since we do lazy commits).
767  */
768
769 os_vm_address_t
770 os_validate(os_vm_address_t addr, os_vm_size_t len)
771 {
772     MEMORY_BASIC_INFORMATION mem_info;
773
774     if (!addr) {
775         /* the simple case first */
776         return
777             AVERLAX(VirtualAlloc(addr, len, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE));
778     }
779
780     if (!AVERLAX(VirtualQuery(addr, &mem_info, sizeof mem_info)))
781         return 0;
782
783     if ((mem_info.State == MEM_RESERVE) && (mem_info.RegionSize >=len)) {
784       /* It would be correct to return here. However, support for Wine
785        * is beneficial, and Wine has a strange behavior in this
786        * department. It reports all memory below KERNEL32.DLL as
787        * reserved, but disallows MEM_COMMIT.
788        *
789        * Let's work around it: reserve the region we need for a second
790        * time. The second reservation is documented to fail on normal NT
791        * family, but it will succeed on Wine if this region is
792        * actually free.
793        */
794       VirtualAlloc(addr, len, MEM_RESERVE, PAGE_EXECUTE_READWRITE);
795       /* If it is wine, the second call has succeded, and now the region
796        * is really reserved. */
797       return addr;
798     }
799
800     if (mem_info.State == MEM_RESERVE) {
801         fprintf(stderr, "validation of reserved space too short.\n");
802         fflush(stderr);
803         /* Oddly, we do not treat this assertion as fatal; hence also the
804          * provision for MEM_RESERVE in the following code, I suppose: */
805     }
806
807     if (!AVERLAX(VirtualAlloc(addr, len, (mem_info.State == MEM_RESERVE)?
808                               MEM_COMMIT: MEM_RESERVE, PAGE_EXECUTE_READWRITE)))
809         return 0;
810
811     return addr;
812 }
813
814 /*
815  * For os_invalidate(), we merely decommit the memory rather than
816  * freeing the address space. This loses when freeing per-thread
817  * data and related memory since it leaks address space.
818  *
819  * So far the original comment (author unknown).  It used to continue as
820  * follows:
821  *
822  *   It's not too lossy, however, since the two scenarios I'm aware of
823  *   are fd-stream buffers, which are pooled rather than torched, and
824  *   thread information, which I hope to pool (since windows creates
825  *   threads at its own whim, and we probably want to be able to have
826  *   them callback without funky magic on the part of the user, and
827  *   full-on thread allocation is fairly heavyweight).
828  *
829  * But: As it turns out, we are no longer content with decommitting
830  * without freeing, and have now grown a second function
831  * os_invalidate_free(), sort of a really_os_invalidate().
832  *
833  * As discussed on #lisp, this is not a satisfactory solution, and probably
834  * ought to be rectified in the following way:
835  *
836  *  - Any cases currently going through the non-freeing version of
837  *    os_invalidate() are ultimately meant for zero-filling applications.
838  *    Replace those use cases with an os_revalidate_bzero() or similarly
839  *    named function, which explicitly takes care of that aspect of
840  *    the semantics.
841  *
842  *  - The remaining uses of os_invalidate should actually free, and once
843  *    the above is implemented, we can rename os_invalidate_free back to
844  *    just os_invalidate().
845  *
846  * So far the new plan, as yet unimplemented. -- DFL
847  */
848
849 void
850 os_invalidate(os_vm_address_t addr, os_vm_size_t len)
851 {
852     AVERLAX(VirtualFree(addr, len, MEM_DECOMMIT));
853 }
854
855 void
856 os_invalidate_free(os_vm_address_t addr, os_vm_size_t len)
857 {
858     AVERLAX(VirtualFree(addr, 0, MEM_RELEASE));
859 }
860
861 void
862 os_invalidate_free_by_any_address(os_vm_address_t addr, os_vm_size_t len)
863 {
864     MEMORY_BASIC_INFORMATION minfo;
865     AVERLAX(VirtualQuery(addr, &minfo, sizeof minfo));
866     AVERLAX(minfo.AllocationBase);
867     AVERLAX(VirtualFree(minfo.AllocationBase, 0, MEM_RELEASE));
868 }
869
870 /* os_validate doesn't commit, i.e. doesn't actually "validate" in the
871  * sense that we could start using the space afterwards.  Usually it's
872  * os_map or Lisp code that will run into that, in which case we recommit
873  * elsewhere in this file.  For cases where C wants to write into newly
874  * os_validate()d memory, it needs to commit it explicitly first:
875  */
876 os_vm_address_t
877 os_validate_recommit(os_vm_address_t addr, os_vm_size_t len)
878 {
879     return
880         AVERLAX(VirtualAlloc(addr, len, MEM_COMMIT, PAGE_EXECUTE_READWRITE));
881 }
882
883 /*
884  * os_map() is called to map a chunk of the core file into memory.
885  *
886  * Unfortunately, Windows semantics completely screws this up, so
887  * we just add backing store from the swapfile to where the chunk
888  * goes and read it up like a normal file. We could consider using
889  * a lazy read (demand page) setup, but that would mean keeping an
890  * open file pointer for the core indefinately (and be one more
891  * thing to maintain).
892  */
893
894 os_vm_address_t
895 os_map(int fd, int offset, os_vm_address_t addr, os_vm_size_t len)
896 {
897     os_vm_size_t count;
898
899     AVER(VirtualAlloc(addr, len, MEM_COMMIT, PAGE_EXECUTE_READWRITE)||
900          VirtualAlloc(addr, len, MEM_RESERVE|MEM_COMMIT,
901                       PAGE_EXECUTE_READWRITE));
902
903     CRT_AVER_NONNEGATIVE(lseek(fd, offset, SEEK_SET));
904
905     count = read(fd, addr, len);
906     CRT_AVER( count == len );
907
908     return addr;
909 }
910
911 static DWORD os_protect_modes[8] = {
912     PAGE_NOACCESS,
913     PAGE_READONLY,
914     PAGE_READWRITE,
915     PAGE_READWRITE,
916     PAGE_EXECUTE,
917     PAGE_EXECUTE_READ,
918     PAGE_EXECUTE_READWRITE,
919     PAGE_EXECUTE_READWRITE,
920 };
921
922 void
923 os_protect(os_vm_address_t address, os_vm_size_t length, os_vm_prot_t prot)
924 {
925     DWORD old_prot;
926
927     DWORD new_prot = os_protect_modes[prot];
928     AVER(VirtualProtect(address, length, new_prot, &old_prot)||
929          (VirtualAlloc(address, length, MEM_COMMIT, new_prot) &&
930           VirtualProtect(address, length, new_prot, &old_prot)));
931     odxprint(misc,"Protecting %p + %p vmaccess %d "
932              "newprot %08x oldprot %08x",
933              address,length,prot,new_prot,old_prot);
934 }
935
936 /* FIXME: Now that FOO_END, rather than FOO_SIZE, is the fundamental
937  * description of a space, we could probably punt this and just do
938  * (FOO_START <= x && x < FOO_END) everywhere it's called. */
939 static boolean
940 in_range_p(os_vm_address_t a, lispobj sbeg, size_t slen)
941 {
942     char* beg = (char*)((uword_t)sbeg);
943     char* end = (char*)((uword_t)sbeg) + slen;
944     char* adr = (char*)a;
945     return (adr >= beg && adr < end);
946 }
947
948 boolean
949 is_linkage_table_addr(os_vm_address_t addr)
950 {
951     return in_range_p(addr, LINKAGE_TABLE_SPACE_START, LINKAGE_TABLE_SPACE_END);
952 }
953
954 static boolean is_some_thread_local_addr(os_vm_address_t addr);
955
956 boolean
957 is_valid_lisp_addr(os_vm_address_t addr)
958 {
959     if(in_range_p(addr, READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE) ||
960        in_range_p(addr, STATIC_SPACE_START   , STATIC_SPACE_SIZE) ||
961        in_range_p(addr, DYNAMIC_SPACE_START  , dynamic_space_size) ||
962        is_some_thread_local_addr(addr))
963         return 1;
964     return 0;
965 }
966
967 /* test if an address is within thread-local space */
968 static boolean
969 is_thread_local_addr(struct thread* th, os_vm_address_t addr)
970 {
971     /* Assuming that this is correct, it would warrant further comment,
972      * I think.  Based on what our call site is doing, we have been
973      * tasked to check for the address of a lisp object; not merely any
974      * foreign address within the thread's area.  Indeed, this used to
975      * be a check for control and binding stack only, rather than the
976      * full thread "struct".  So shouldn't the THREAD_STRUCT_SIZE rather
977      * be (thread_control_stack_size+BINDING_STACK_SIZE) instead?  That
978      * would also do away with the LISP_FEATURE_SB_THREAD case.  Or does
979      * it simply not matter?  --DFL */
980     ptrdiff_t diff = ((char*)th->os_address)-(char*)addr;
981     return diff > (ptrdiff_t)0 && diff < (ptrdiff_t)THREAD_STRUCT_SIZE
982 #ifdef LISP_FEATURE_SB_THREAD
983         && addr != (os_vm_address_t) th->csp_around_foreign_call
984 #endif
985         ;
986 }
987
988 static boolean
989 is_some_thread_local_addr(os_vm_address_t addr)
990 {
991     boolean result = 0;
992 #ifdef LISP_FEATURE_SB_THREAD
993     struct thread *th;
994     pthread_mutex_lock(&all_threads_lock);
995     for_each_thread(th) {
996         if(is_thread_local_addr(th,addr)) {
997             result = 1;
998             break;
999         }
1000     }
1001     pthread_mutex_unlock(&all_threads_lock);
1002 #endif
1003     return result;
1004 }
1005
1006
1007 /* A tiny bit of interrupt.c state we want our paws on. */
1008 extern boolean internal_errors_enabled;
1009
1010 extern void exception_handler_wrapper();
1011
1012 void
1013 c_level_backtrace(const char* header, int depth)
1014 {
1015     void* frame;
1016     int n = 0;
1017     void** lastseh;
1018
1019     for (lastseh = get_seh_frame(); lastseh && (lastseh!=(void*)-1);
1020          lastseh = *lastseh);
1021
1022     fprintf(stderr, "Backtrace: %s (thread %p)\n", header, this_thread);
1023     for (frame = __builtin_frame_address(0); frame; frame=*(void**)frame)
1024     {
1025         if ((n++)>depth)
1026             return;
1027         fprintf(stderr, "[#%02d]: ebp = 0x%p, ret = 0x%p\n",n,
1028                 frame, ((void**)frame)[1]);
1029     }
1030 }
1031
1032 #ifdef LISP_FEATURE_X86
1033 #define voidreg(ctxptr,name) ((void*)((ctxptr)->E##name))
1034 #else
1035 #define voidreg(ctxptr,name) ((void*)((ctxptr)->R##name))
1036 #endif
1037
1038
1039 #if defined(LISP_FEATURE_X86)
1040 static int
1041 handle_single_step(os_context_t *ctx)
1042 {
1043     if (!single_stepping)
1044         return -1;
1045
1046     /* We are doing a displaced instruction. At least function
1047      * end breakpoints use this. */
1048     WITH_GC_AT_SAFEPOINTS_ONLY () /* Todo: Is it really gc-unsafe? */
1049         restore_breakpoint_from_single_step(ctx);
1050
1051     return 0;
1052 }
1053 #endif
1054
1055 #ifdef LISP_FEATURE_UD2_BREAKPOINTS
1056 #define SBCL_EXCEPTION_BREAKPOINT EXCEPTION_ILLEGAL_INSTRUCTION
1057 #define TRAP_CODE_WIDTH 2
1058 #else
1059 #define SBCL_EXCEPTION_BREAKPOINT EXCEPTION_BREAKPOINT
1060 #define TRAP_CODE_WIDTH 1
1061 #endif
1062
1063 static int
1064 handle_breakpoint_trap(os_context_t *ctx, struct thread* self)
1065 {
1066 #ifdef LISP_FEATURE_UD2_BREAKPOINTS
1067     if (((unsigned short *)((ctx->win32_context)->Eip))[0] != 0x0b0f)
1068         return -1;
1069 #endif
1070
1071     /* Unlike some other operating systems, Win32 leaves EIP
1072      * pointing to the breakpoint instruction. */
1073     (*os_context_pc_addr(ctx)) += TRAP_CODE_WIDTH;
1074
1075     /* Now EIP points just after the INT3 byte and aims at the
1076      * 'kind' value (eg trap_Cerror). */
1077     unsigned trap = *(unsigned char *)(*os_context_pc_addr(ctx));
1078
1079 #ifdef LISP_FEATURE_SB_THREAD
1080     /* Before any other trap handler: gc_safepoint ensures that
1081        inner alloc_sap for passing the context won't trap on
1082        pseudo-atomic. */
1083     if (trap == trap_PendingInterrupt) {
1084         /* Done everything needed for this trap, except EIP
1085            adjustment */
1086         arch_skip_instruction(ctx);
1087         thread_interrupted(ctx);
1088         return 0;
1089     }
1090 #endif
1091
1092     /* This is just for info in case the monitor wants to print an
1093      * approximation. */
1094     access_control_stack_pointer(self) =
1095         (lispobj *)*os_context_sp_addr(ctx);
1096
1097     WITH_GC_AT_SAFEPOINTS_ONLY() {
1098 #if defined(LISP_FEATURE_SB_THREAD)
1099         block_blockable_signals(0,&ctx->sigmask);
1100 #endif
1101         handle_trap(ctx, trap);
1102 #if defined(LISP_FEATURE_SB_THREAD)
1103         thread_sigmask(SIG_SETMASK,&ctx->sigmask,NULL);
1104 #endif
1105     }
1106
1107     /* Done, we're good to go! */
1108     return 0;
1109 }
1110
1111 static int
1112 handle_access_violation(os_context_t *ctx,
1113                         EXCEPTION_RECORD *exception_record,
1114                         void *fault_address,
1115                         struct thread* self)
1116 {
1117     CONTEXT *win32_context = ctx->win32_context;
1118
1119 #if defined(LISP_FEATURE_X86)
1120     odxprint(pagefaults,
1121              "SEGV. ThSap %p, Eip %p, Esp %p, Esi %p, Edi %p, "
1122              "Addr %p Access %d\n",
1123              self,
1124              win32_context->Eip,
1125              win32_context->Esp,
1126              win32_context->Esi,
1127              win32_context->Edi,
1128              fault_address,
1129              exception_record->ExceptionInformation[0]);
1130 #else
1131     odxprint(pagefaults,
1132              "SEGV. ThSap %p, Eip %p, Esp %p, Esi %p, Edi %p, "
1133              "Addr %p Access %d\n",
1134              self,
1135              win32_context->Rip,
1136              win32_context->Rsp,
1137              win32_context->Rsi,
1138              win32_context->Rdi,
1139              fault_address,
1140              exception_record->ExceptionInformation[0]);
1141 #endif
1142
1143     /* Stack: This case takes care of our various stack exhaustion
1144      * protect pages (with the notable exception of the control stack!). */
1145     if (self && local_thread_stack_address_p(fault_address)) {
1146         if (handle_guard_page_triggered(ctx, fault_address))
1147             return 0; /* gc safety? */
1148         goto try_recommit;
1149     }
1150
1151     /* Safepoint pages */
1152 #ifdef LISP_FEATURE_SB_THREAD
1153     if (fault_address == (void *) GC_SAFEPOINT_PAGE_ADDR) {
1154         thread_in_lisp_raised(ctx);
1155         return 0;
1156     }
1157
1158     if ((((u64)fault_address) == ((u64)self->csp_around_foreign_call))){
1159         thread_in_safety_transition(ctx);
1160         return 0;
1161     }
1162 #endif
1163
1164     /* dynamic space */
1165     page_index_t index = find_page_index(fault_address);
1166     if (index != -1) {
1167         /*
1168          * Now, if the page is supposedly write-protected and this
1169          * is a write, tell the gc that it's been hit.
1170          */
1171         if (page_table[index].write_protected) {
1172             gencgc_handle_wp_violation(fault_address);
1173         } else {
1174             AVER(VirtualAlloc(PTR_ALIGN_DOWN(fault_address,os_vm_page_size),
1175                               os_vm_page_size,
1176                               MEM_COMMIT, PAGE_EXECUTE_READWRITE));
1177         }
1178         return 0;
1179     }
1180
1181     if (fault_address == undefined_alien_address)
1182         return -1;
1183
1184     /* linkage table or a "valid_lisp_addr" outside of dynamic space (?) */
1185     if (is_linkage_table_addr(fault_address)
1186         || is_valid_lisp_addr(fault_address))
1187         goto try_recommit;
1188
1189     return -1;
1190
1191 try_recommit:
1192     /* First use of a new page, lets get some memory for it. */
1193
1194 #if defined(LISP_FEATURE_X86)
1195     AVER(VirtualAlloc(PTR_ALIGN_DOWN(fault_address,os_vm_page_size),
1196                       os_vm_page_size,
1197                       MEM_COMMIT, PAGE_EXECUTE_READWRITE)
1198          ||(fprintf(stderr,"Unable to recommit addr %p eip 0x%08lx\n",
1199                     fault_address, win32_context->Eip) &&
1200             (c_level_backtrace("BT",5),
1201              fake_foreign_function_call(ctx),
1202              lose("Lispy backtrace"),
1203              0)));
1204 #else
1205     AVER(VirtualAlloc(PTR_ALIGN_DOWN(fault_address,os_vm_page_size),
1206                       os_vm_page_size,
1207                       MEM_COMMIT, PAGE_EXECUTE_READWRITE)
1208          ||(fprintf(stderr,"Unable to recommit addr %p eip 0x%p\n",
1209                     fault_address, (void*)win32_context->Rip) &&
1210             (c_level_backtrace("BT",5),
1211              fake_foreign_function_call(ctx),
1212              lose("Lispy backtrace"),
1213              0)));
1214 #endif
1215
1216     return 0;
1217 }
1218
1219 static void
1220 signal_internal_error_or_lose(os_context_t *ctx,
1221                               EXCEPTION_RECORD *exception_record,
1222                               void *fault_address)
1223 {
1224     /*
1225      * If we fall through to here then we need to either forward
1226      * the exception to the lisp-side exception handler if it's
1227      * set up, or drop to LDB.
1228      */
1229
1230     if (internal_errors_enabled) {
1231         lispobj context_sap;
1232         lispobj exception_record_sap;
1233
1234         asm("fnclex");
1235         /* We're making the somewhat arbitrary decision that having
1236          * internal errors enabled means that lisp has sufficient
1237          * marbles to be able to handle exceptions, but exceptions
1238          * aren't supposed to happen during cold init or reinit
1239          * anyway. */
1240
1241 #if defined(LISP_FEATURE_SB_THREAD)
1242         block_blockable_signals(0,&ctx->sigmask);
1243 #endif
1244         fake_foreign_function_call(ctx);
1245
1246         WITH_GC_AT_SAFEPOINTS_ONLY() {
1247             /* Allocate the SAP objects while the "interrupts" are still
1248              * disabled. */
1249             context_sap = alloc_sap(ctx);
1250             exception_record_sap = alloc_sap(exception_record);
1251 #if defined(LISP_FEATURE_SB_THREAD)
1252             thread_sigmask(SIG_SETMASK, &ctx->sigmask, NULL);
1253 #endif
1254
1255             /* The exception system doesn't automatically clear pending
1256              * exceptions, so we lose as soon as we execute any FP
1257              * instruction unless we do this first. */
1258             /* Call into lisp to handle things. */
1259             funcall2(StaticSymbolFunction(HANDLE_WIN32_EXCEPTION),
1260                      context_sap,
1261                      exception_record_sap);
1262         }
1263         /* If Lisp doesn't nlx, we need to put things back. */
1264         undo_fake_foreign_function_call(ctx);
1265 #if defined(LISP_FEATURE_SB_THREAD)
1266         thread_sigmask(SIG_SETMASK, &ctx->sigmask, NULL);
1267 #endif
1268         /* FIXME: HANDLE-WIN32-EXCEPTION should be allowed to decline */
1269         return;
1270     }
1271
1272     fprintf(stderr, "Exception Code: 0x%p.\n",
1273             (void*)(intptr_t)exception_record->ExceptionCode);
1274     fprintf(stderr, "Faulting IP: 0x%p.\n",
1275             (void*)(intptr_t)exception_record->ExceptionAddress);
1276     if (exception_record->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) {
1277         MEMORY_BASIC_INFORMATION mem_info;
1278
1279         if (VirtualQuery(fault_address, &mem_info, sizeof mem_info)) {
1280             fprintf(stderr, "page status: 0x%lx.\n", mem_info.State);
1281         }
1282
1283         fprintf(stderr, "Was writing: %p, where: 0x%p.\n",
1284                 (void*)exception_record->ExceptionInformation[0],
1285                 fault_address);
1286     }
1287
1288     fflush(stderr);
1289
1290     fake_foreign_function_call(ctx);
1291     lose("Exception too early in cold init, cannot continue.");
1292 }
1293
1294 /*
1295  * A good explanation of the exception handling semantics is
1296  *   http://win32assembly.online.fr/Exceptionhandling.html (possibly defunct)
1297  * or:
1298  *   http://www.microsoft.com/msj/0197/exception/exception.aspx
1299  */
1300
1301 EXCEPTION_DISPOSITION
1302 handle_exception(EXCEPTION_RECORD *exception_record,
1303                  struct lisp_exception_frame *exception_frame,
1304                  CONTEXT *win32_context,
1305                  void *dispatcher_context)
1306 {
1307     if (!win32_context)
1308         /* Not certain why this should be possible, but let's be safe... */
1309         return ExceptionContinueSearch;
1310
1311     if (exception_record->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND)) {
1312         /* If we're being unwound, be graceful about it. */
1313
1314         /* Undo any dynamic bindings. */
1315         unbind_to_here(exception_frame->bindstack_pointer,
1316                        arch_os_get_current_thread());
1317         return ExceptionContinueSearch;
1318     }
1319
1320     DWORD lastError = GetLastError();
1321     DWORD lastErrno = errno;
1322     DWORD code = exception_record->ExceptionCode;
1323     struct thread* self = arch_os_get_current_thread();
1324
1325     os_context_t context, *ctx = &context;
1326     context.win32_context = win32_context;
1327 #if defined(LISP_FEATURE_SB_THREAD)
1328     context.sigmask = self ? self->os_thread->blocked_signal_set : 0;
1329 #endif
1330
1331     /* For EXCEPTION_ACCESS_VIOLATION only. */
1332     void *fault_address = (void *)exception_record->ExceptionInformation[1];
1333
1334     odxprint(seh,
1335              "SEH: rec %p, ctxptr %p, rip %p, fault %p\n"
1336              "... code %p, rcx %p, fp-tags %p\n\n",
1337              exception_record,
1338              win32_context,
1339              voidreg(win32_context,ip),
1340              fault_address,
1341              (void*)(intptr_t)code,
1342              voidreg(win32_context,cx),
1343              win32_context->FloatSave.TagWord);
1344
1345     /* This function had become unwieldy.  Let's cut it down into
1346      * pieces based on the different exception codes.  Each exception
1347      * code handler gets the chance to decline by returning non-zero if it
1348      * isn't happy: */
1349
1350     int rc;
1351     switch (code) {
1352     case EXCEPTION_ACCESS_VIOLATION:
1353         rc = handle_access_violation(
1354             ctx, exception_record, fault_address, self);
1355         break;
1356
1357     case SBCL_EXCEPTION_BREAKPOINT:
1358         rc = handle_breakpoint_trap(ctx, self);
1359         break;
1360
1361 #if defined(LISP_FEATURE_X86)
1362     case EXCEPTION_SINGLE_STEP:
1363         rc = handle_single_step(ctx);
1364         break;
1365 #endif
1366
1367     default:
1368         rc = -1;
1369     }
1370
1371     if (rc)
1372         /* All else failed, drop through to the lisp-side exception handler. */
1373         signal_internal_error_or_lose(ctx, exception_record, fault_address);
1374
1375     errno = lastErrno;
1376     SetLastError(lastError);
1377     return ExceptionContinueExecution;
1378 }
1379
1380 void
1381 wos_install_interrupt_handlers(struct lisp_exception_frame *handler)
1382 {
1383 #ifdef LISP_FEATURE_X86
1384     handler->next_frame = get_seh_frame();
1385     handler->handler = (void*)exception_handler_wrapper;
1386     set_seh_frame(handler);
1387 #else
1388     static int once = 0;
1389     if (!once++)
1390         AddVectoredExceptionHandler(1,veh);
1391 #endif
1392 }
1393
1394 /*
1395  * The stubs below are replacements for the windows versions,
1396  * which can -fail- when used in our memory spaces because they
1397  * validate the memory spaces they are passed in a way that
1398  * denies our exception handler a chance to run.
1399  */
1400
1401 void *memmove(void *dest, const void *src, size_t n)
1402 {
1403     if (dest < src) {
1404         int i;
1405         for (i = 0; i < n; i++) *(((char *)dest)+i) = *(((char *)src)+i);
1406     } else {
1407         while (n--) *(((char *)dest)+n) = *(((char *)src)+n);
1408     }
1409     return dest;
1410 }
1411
1412 void *memcpy(void *dest, const void *src, size_t n)
1413 {
1414     while (n--) *(((char *)dest)+n) = *(((char *)src)+n);
1415     return dest;
1416 }
1417
1418 char *dirname(char *path)
1419 {
1420     static char buf[PATH_MAX + 1];
1421     size_t pathlen = strlen(path);
1422     int i;
1423
1424     if (pathlen >= sizeof(buf)) {
1425         lose("Pathname too long in dirname.\n");
1426         return NULL;
1427     }
1428
1429     strcpy(buf, path);
1430     for (i = pathlen; i >= 0; --i) {
1431         if (buf[i] == '/' || buf[i] == '\\') {
1432             buf[i] = '\0';
1433             break;
1434         }
1435     }
1436
1437     return buf;
1438 }
1439
1440 // 0 - not a socket or other error, 1 - has input, 2 - has no input
1441 int
1442 socket_input_available(HANDLE socket)
1443 {
1444     unsigned long count = 0, count_size = 0;
1445     int wsaErrno = GetLastError();
1446     int err = WSAIoctl((SOCKET)socket, FIONREAD, NULL, 0,
1447                        &count, sizeof(count), &count_size, NULL, NULL);
1448
1449     int ret;
1450
1451     if (err == 0) {
1452         ret = (count > 0) ? 1 : 2;
1453     } else
1454         ret = 0;
1455     SetLastError(wsaErrno);
1456     return ret;
1457 }
1458
1459 /* Unofficial but widely used property of console handles: they have
1460    #b11 in two minor bits, opposed to other handles, that are
1461    machine-word-aligned. Properly emulated even on wine.
1462
1463    Console handles are special in many aspects, e.g. they aren't NTDLL
1464    system handles: kernel32 redirects console operations to CSRSS
1465    requests. Using the hack below to distinguish console handles is
1466    justified, as it's the only method that won't hang during
1467    outstanding reads, won't try to lock NT kernel object (if there is
1468    one; console isn't), etc. */
1469 int
1470 console_handle_p(HANDLE handle)
1471 {
1472     return (handle != NULL)&&
1473         (handle != INVALID_HANDLE_VALUE)&&
1474         ((((int)(intptr_t)handle)&3)==3);
1475 }
1476
1477 /* Atomically mark current thread as (probably) doing synchronous I/O
1478  * on handle, if no cancellation is requested yet (and return TRUE),
1479  * otherwise clear thread's I/O cancellation flag and return false.
1480  */
1481 static
1482 boolean io_begin_interruptible(HANDLE handle)
1483 {
1484     /* No point in doing it unless OS supports cancellation from other
1485      * threads */
1486     if (!ptr_CancelIoEx)
1487         return 1;
1488
1489     if (!__sync_bool_compare_and_swap(&this_thread->synchronous_io_handle_and_flag,
1490                                       0, handle)) {
1491         ResetEvent(this_thread->private_events.events[0]);
1492         this_thread->synchronous_io_handle_and_flag = 0;
1493         return 0;
1494     }
1495     return 1;
1496 }
1497
1498 /* Unmark current thread as (probably) doing synchronous I/O; if an
1499  * I/O cancellation was requested, postpone it until next
1500  * io_begin_interruptible */
1501 static void
1502 io_end_interruptible(HANDLE handle)
1503 {
1504     if (!ptr_CancelIoEx)
1505         return;
1506     __sync_bool_compare_and_swap(&this_thread->synchronous_io_handle_and_flag,
1507                                  handle, 0);
1508 }
1509
1510 /* Documented limit for ReadConsole/WriteConsole is 64K bytes.
1511    Real limit observed on W2K-SP3 is somewhere in between 32KiB and 64Kib...
1512 */
1513 #define MAX_CONSOLE_TCHARS 16384
1514
1515 int
1516 win32_write_unicode_console(HANDLE handle, void * buf, int count)
1517 {
1518     DWORD written = 0;
1519     DWORD nchars;
1520     BOOL result;
1521     nchars = count>>1;
1522     if (nchars>MAX_CONSOLE_TCHARS) nchars = MAX_CONSOLE_TCHARS;
1523
1524     if (!io_begin_interruptible(handle)) {
1525         errno = EINTR;
1526         return -1;
1527     }
1528     result = WriteConsoleW(handle,buf,nchars,&written,NULL);
1529     io_end_interruptible(handle);
1530
1531     if (result) {
1532         if (!written) {
1533             errno = EINTR;
1534             return -1;
1535         } else {
1536             return 2*written;
1537         }
1538     } else {
1539         DWORD err = GetLastError();
1540         odxprint(io,"WriteConsole fails => %u\n", err);
1541         errno = (err==ERROR_OPERATION_ABORTED ? EINTR : EIO);
1542         return -1;
1543     }
1544 }
1545
1546 /*
1547  * (AK writes:)
1548  *
1549  * It may be unobvious, but (probably) the most straightforward way of
1550  * providing some sane CL:LISTEN semantics for line-mode console
1551  * channel requires _dedicated input thread_.
1552  *
1553  * LISTEN should return true iff the next (READ-CHAR) won't have to
1554  * wait. As our console may be shared with another process, entirely
1555  * out of our control, looking at the events in PeekConsoleEvent
1556  * result (and searching for #\Return) doesn't cut it.
1557  *
1558  * We decided that console input thread must do something smarter than
1559  * a bare loop of continuous ReadConsoleW(). On Unix, user experience
1560  * with the terminal is entirely unaffected by the fact that some
1561  * process does (or doesn't) call read(); the situation on MS Windows
1562  * is different.
1563  *
1564  * Echo output and line editing present on MS Windows while some
1565  * process is waiting in ReadConsole(); otherwise all input events are
1566  * buffered. If our thread were calling ReadConsole() all the time, it
1567  * would feel like Unix cooked mode.
1568  *
1569  * But we don't write a Unix emulator here, even if it sometimes feels
1570  * like that; therefore preserving this aspect of console I/O seems a
1571  * good thing to us.
1572  *
1573  * LISTEN itself becomes trivial with dedicated input thread, but the
1574  * goal stated above -- provide `native' user experience with blocked
1575  * console -- don't play well with this trivial implementation.
1576  *
1577  * What's currently implemented is a compromise, looking as something
1578  * in between Unix cooked mode and Win32 line mode.
1579  *
1580  * 1. As long as no console I/O function is called (incl. CL:LISTEN),
1581  * console looks `blocked': no echo, no line editing.
1582  *
1583  * 2. (READ-CHAR), (READ-SEQUENCE) and other functions doing real
1584  * input result in the ReadConsole request (in a dedicated thread);
1585  *
1586  * 3. Once ReadConsole is called, it is not cancelled in the
1587  * middle. In line mode, it returns when <Enter> key is hit (or
1588  * something like that happens). Therefore, if line editing and echo
1589  * output had a chance to happen, console won't look `blocked' until
1590  * the line is entered (even if line input was triggered by
1591  * (READ-CHAR)).
1592  *
1593  * 4. LISTEN may request ReadConsole too (if no other thread is
1594  * reading the console and no data are queued). It's the only case
1595  * when the console becomes `unblocked' without any actual input
1596  * requested by Lisp code.  LISTEN check if there is at least one
1597  * input event in PeekConsole queue; unless there is such an event,
1598  * ReadConsole is not triggered by LISTEN.
1599  *
1600  * 5. Console-reading Lisp thread now may be interrupted immediately;
1601  * ReadConsole call itself, however, continues until the line is
1602  * entered.
1603  */
1604
1605 struct {
1606     WCHAR buffer[MAX_CONSOLE_TCHARS];
1607     DWORD head, tail;
1608     pthread_mutex_t lock;
1609     pthread_cond_t cond_has_data;
1610     pthread_cond_t cond_has_client;
1611     pthread_t thread;
1612     boolean initialized;
1613     HANDLE handle;
1614     boolean in_progress;
1615 } ttyinput = {.lock = PTHREAD_MUTEX_INITIALIZER};
1616
1617 static void*
1618 tty_read_line_server()
1619 {
1620     pthread_mutex_lock(&ttyinput.lock);
1621     while (ttyinput.handle) {
1622         DWORD nchars;
1623         BOOL ok;
1624
1625         while (!ttyinput.in_progress)
1626             pthread_cond_wait(&ttyinput.cond_has_client,&ttyinput.lock);
1627
1628         pthread_mutex_unlock(&ttyinput.lock);
1629
1630         ok = ReadConsoleW(ttyinput.handle,
1631                           &ttyinput.buffer[ttyinput.tail],
1632                           MAX_CONSOLE_TCHARS-ttyinput.tail,
1633                           &nchars,NULL);
1634
1635         pthread_mutex_lock(&ttyinput.lock);
1636
1637         if (ok) {
1638             ttyinput.tail += nchars;
1639             pthread_cond_broadcast(&ttyinput.cond_has_data);
1640         }
1641         ttyinput.in_progress = 0;
1642     }
1643     pthread_mutex_unlock(&ttyinput.lock);
1644     return NULL;
1645 }
1646
1647 static boolean
1648 tty_maybe_initialize_unlocked(HANDLE handle)
1649 {
1650     if (!ttyinput.initialized) {
1651         if (!DuplicateHandle(GetCurrentProcess(),handle,
1652                              GetCurrentProcess(),&ttyinput.handle,
1653                              0,FALSE,DUPLICATE_SAME_ACCESS)) {
1654             return 0;
1655         }
1656         pthread_cond_init(&ttyinput.cond_has_data,NULL);
1657         pthread_cond_init(&ttyinput.cond_has_client,NULL);
1658         pthread_create(&ttyinput.thread,NULL,tty_read_line_server,NULL);
1659         ttyinput.initialized = 1;
1660     }
1661     return 1;
1662 }
1663
1664 boolean
1665 win32_tty_listen(HANDLE handle)
1666 {
1667     boolean result = 0;
1668     INPUT_RECORD ir;
1669     DWORD nevents;
1670     pthread_mutex_lock(&ttyinput.lock);
1671     if (!tty_maybe_initialize_unlocked(handle))
1672         result = 0;
1673
1674     if (ttyinput.in_progress) {
1675         result = 0;
1676     } else {
1677         if (ttyinput.head != ttyinput.tail) {
1678             result = 1;
1679         } else {
1680             if (PeekConsoleInput(ttyinput.handle,&ir,1,&nevents) && nevents) {
1681                 ttyinput.in_progress = 1;
1682                 pthread_cond_broadcast(&ttyinput.cond_has_client);
1683             }
1684         }
1685     }
1686     pthread_mutex_unlock(&ttyinput.lock);
1687     return result;
1688 }
1689
1690 static int
1691 tty_read_line_client(HANDLE handle, void* buf, int count)
1692 {
1693     int result = 0;
1694     int nchars = count / sizeof(WCHAR);
1695     sigset_t pendset;
1696
1697     if (!nchars)
1698         return 0;
1699     if (nchars>MAX_CONSOLE_TCHARS)
1700         nchars=MAX_CONSOLE_TCHARS;
1701
1702     count = nchars*sizeof(WCHAR);
1703
1704     pthread_mutex_lock(&ttyinput.lock);
1705
1706     if (!tty_maybe_initialize_unlocked(handle)) {
1707         result = -1;
1708         errno = EIO;
1709         goto unlock;
1710     }
1711
1712     while (!result) {
1713         while (ttyinput.head == ttyinput.tail) {
1714             if (!io_begin_interruptible(ttyinput.handle)) {
1715                 ttyinput.in_progress = 0;
1716                 result = -1;
1717                 errno = EINTR;
1718                 goto unlock;
1719             } else {
1720                 if (!ttyinput.in_progress) {
1721                     /* We are to wait */
1722                     ttyinput.in_progress=1;
1723                     /* wake console reader */
1724                     pthread_cond_broadcast(&ttyinput.cond_has_client);
1725                 }
1726                 pthread_cond_wait(&ttyinput.cond_has_data, &ttyinput.lock);
1727                 io_end_interruptible(ttyinput.handle);
1728             }
1729         }
1730         result = sizeof(WCHAR)*(ttyinput.tail-ttyinput.head);
1731         if (result > count) {
1732             result = count;
1733         }
1734         if (result) {
1735             if (result > 0) {
1736                 DWORD nch,offset = 0;
1737                 LPWSTR ubuf = buf;
1738
1739                 memcpy(buf,&ttyinput.buffer[ttyinput.head],count);
1740                 ttyinput.head += (result / sizeof(WCHAR));
1741                 if (ttyinput.head == ttyinput.tail)
1742                     ttyinput.head = ttyinput.tail = 0;
1743
1744                 for (nch=0;nch<result/sizeof(WCHAR);++nch) {
1745                     if (ubuf[nch]==13) {
1746                         ++offset;
1747                     } else {
1748                         ubuf[nch-offset]=ubuf[nch];
1749                     }
1750                 }
1751                 result-=offset*sizeof(WCHAR);
1752
1753             }
1754         } else {
1755             result = -1;
1756             ttyinput.head = ttyinput.tail = 0;
1757             errno = EIO;
1758         }
1759     }
1760 unlock:
1761     pthread_mutex_unlock(&ttyinput.lock);
1762     return result;
1763 }
1764
1765 int
1766 win32_read_unicode_console(HANDLE handle, void* buf, int count)
1767 {
1768
1769     int result;
1770     result = tty_read_line_client(handle,buf,count);
1771     return result;
1772 }
1773
1774 boolean
1775 win32_maybe_interrupt_io(void* thread)
1776 {
1777     struct thread *th = thread;
1778     boolean done = 0;
1779     /* Kludge. (?)
1780      *
1781      * ICBW about all of this.  But it seems to me that this procedure is
1782      * a race condition.  In theory.  One that is hard produce (I can't
1783      * come up with a test case that exploits it), and might only be a bug
1784      * if users are doing weird things with I/O, possibly from FFI.  But a
1785      * race is a race, so shouldn't this function and io_end_interruptible
1786      * cooperate more?
1787      *
1788      * Here's my thinking:
1789      *
1790      * A.. <interruptee thread>
1791      *     ... stuffs its handle into its structure.
1792      * B.. <interrupter thread>
1793      *     ... calls us to wake the thread, finds the handle.
1794      *     But just before we actually call CancelSynchronousIo/CancelIoEx,
1795      *     something weird happens in the scheduler and the system is
1796      *     so extremely busy that the interrupter doesn't get scheduled
1797      *     for a while, giving the interruptee lots of time to continue.
1798      * A.. Didn't actually have to block, calls io_end_interruptible (in
1799      *     which the handle flag already invalid, but it doesn't care
1800      *     about that and still continues).
1801      *     ... Proceeds to do unrelated I/O, e.g. goes into FFI code
1802      *     (possible, because the CSP page hasn't been armed yet), which
1803      *     does I/O from a C library, completely unrelated to SBCL's
1804      *     routines.
1805      * B.. The scheduler gives us time for the interrupter again.
1806      *     We call CancelSynchronousIo/CancelIoEx.
1807      * A.. Interruptee gets an expected error in unrelated I/O during FFI.
1808      *     Interruptee's C code is unhappy and dies.
1809      *
1810      * Note that CancelSynchronousIo and CancelIoEx have a rather different
1811      * effect here.  In the normal (CancelIoEx) case, we only ever kill
1812      * I/O on the file handle in question.  I think we could ask users
1813      * to please not both use Lisp streams (unix-read/write) _and_ FFI code
1814      * on the same file handle in quick succession.
1815      *
1816      * CancelSynchronousIo seems more dangerous though.  Here we interrupt
1817      * I/O on any other handle, even ones we're not actually responsible for,
1818      * because this functions deals with the thread handle, not the file
1819      * handle.
1820      *
1821      * Options:
1822      *  - Use mutexes.  Somewhere, somehow.  Presumably one mutex per
1823      *    target thread, acquired around win32_maybe_interrupt_io and
1824      *    io_end_interruptible.  (That's one mutex use per I/O
1825      *    operation, but I can't imagine that compared to our FFI overhead
1826      *    that's much of a problem.)
1827      *  - In io_end_interruptible, detect that the flag has been
1828      *    invalidated, and in that case, do something clever (what?) to
1829      *    wait for the imminent gc_stop_the_world, which implicitly tells
1830      *    us that win32_maybe_interrupt_io must have exited.  Except if
1831      *    some _third_ thread is also beginning to call interrupt-thread
1832      *    and wake_thread at the same time...?
1833      *  - Revert the whole CancelSynchronousIo business after all.
1834      *  - I'm wrong and everything is OK already.
1835      */
1836     if (ptr_CancelIoEx) {
1837         HANDLE h = (HANDLE)
1838             InterlockedExchangePointer((volatile LPVOID *)
1839                                        &th->synchronous_io_handle_and_flag,
1840                                        (LPVOID)INVALID_HANDLE_VALUE);
1841         if (h && (h!=INVALID_HANDLE_VALUE)) {
1842             if (console_handle_p(h)) {
1843                 pthread_mutex_lock(&ttyinput.lock);
1844                 pthread_cond_broadcast(&ttyinput.cond_has_data);
1845                 pthread_mutex_unlock(&ttyinput.lock);
1846             }
1847             if (ptr_CancelSynchronousIo) {
1848                 pthread_mutex_lock(&th->os_thread->fiber_lock);
1849                 done = ptr_CancelSynchronousIo(th->os_thread->fiber_group->handle);
1850                 pthread_mutex_unlock(&th->os_thread->fiber_lock);
1851             }
1852             return (!!done)|(!!ptr_CancelIoEx(h,NULL));
1853         }
1854     }
1855     return 0;
1856 }
1857
1858 static const LARGE_INTEGER zero_large_offset = {.QuadPart = 0LL};
1859
1860 int
1861 win32_unix_write(HANDLE handle, void * buf, int count)
1862 {
1863     DWORD written_bytes;
1864     OVERLAPPED overlapped;
1865     struct thread * self = arch_os_get_current_thread();
1866     BOOL waitInGOR;
1867     LARGE_INTEGER file_position;
1868     BOOL seekable;
1869     BOOL ok;
1870
1871     if (console_handle_p(handle))
1872         return win32_write_unicode_console(handle,buf,count);
1873
1874     overlapped.hEvent = self->private_events.events[0];
1875     seekable = SetFilePointerEx(handle,
1876                                 zero_large_offset,
1877                                 &file_position,
1878                                 FILE_CURRENT);
1879     if (seekable) {
1880         overlapped.Offset = file_position.LowPart;
1881         overlapped.OffsetHigh = file_position.HighPart;
1882     } else {
1883         overlapped.Offset = 0;
1884         overlapped.OffsetHigh = 0;
1885     }
1886     if (!io_begin_interruptible(handle)) {
1887         errno = EINTR;
1888         return -1;
1889     }
1890     ok = WriteFile(handle, buf, count, &written_bytes, &overlapped);
1891     io_end_interruptible(handle);
1892
1893     if (ok) {
1894         goto done_something;
1895     } else {
1896         DWORD errorCode = GetLastError();
1897         if (errorCode==ERROR_OPERATION_ABORTED) {
1898             GetOverlappedResult(handle,&overlapped,&written_bytes,FALSE);
1899             errno = EINTR;
1900             return -1;
1901         }
1902         if (errorCode!=ERROR_IO_PENDING) {
1903             errno = EIO;
1904             return -1;
1905         } else {
1906             if(WaitForMultipleObjects(2,self->private_events.events,
1907                                       FALSE,INFINITE) != WAIT_OBJECT_0) {
1908                 CancelIo(handle);
1909                 waitInGOR = TRUE;
1910             } else {
1911                 waitInGOR = FALSE;
1912             }
1913             if (!GetOverlappedResult(handle,&overlapped,&written_bytes,waitInGOR)) {
1914                 if (GetLastError()==ERROR_OPERATION_ABORTED) {
1915                     errno = EINTR;
1916                 } else {
1917                     errno = EIO;
1918                 }
1919                 return -1;
1920             } else {
1921                 goto done_something;
1922             }
1923         }
1924     }
1925   done_something:
1926     if (seekable) {
1927         file_position.QuadPart += written_bytes;
1928         SetFilePointerEx(handle,file_position,NULL,FILE_BEGIN);
1929     }
1930     return written_bytes;
1931 }
1932
1933 int
1934 win32_unix_read(HANDLE handle, void * buf, int count)
1935 {
1936     OVERLAPPED overlapped = {.Internal=0};
1937     DWORD read_bytes = 0;
1938     struct thread * self = arch_os_get_current_thread();
1939     DWORD errorCode = 0;
1940     BOOL waitInGOR = FALSE;
1941     BOOL ok = FALSE;
1942     LARGE_INTEGER file_position;
1943     BOOL seekable;
1944
1945     if (console_handle_p(handle))
1946         return win32_read_unicode_console(handle,buf,count);
1947
1948     overlapped.hEvent = self->private_events.events[0];
1949     /* If it has a position, we won't try overlapped */
1950     seekable = SetFilePointerEx(handle,
1951                                 zero_large_offset,
1952                                 &file_position,
1953                                 FILE_CURRENT);
1954     if (seekable) {
1955         overlapped.Offset = file_position.LowPart;
1956         overlapped.OffsetHigh = file_position.HighPart;
1957     } else {
1958         overlapped.Offset = 0;
1959         overlapped.OffsetHigh = 0;
1960     }
1961     if (!io_begin_interruptible(handle)) {
1962         errno = EINTR;
1963         return -1;
1964     }
1965     ok = ReadFile(handle,buf,count,&read_bytes, &overlapped);
1966     io_end_interruptible(handle);
1967     if (ok) {
1968         /* immediately */
1969         goto done_something;
1970     } else {
1971         errorCode = GetLastError();
1972         if (errorCode == ERROR_HANDLE_EOF ||
1973             errorCode == ERROR_BROKEN_PIPE ||
1974             errorCode == ERROR_NETNAME_DELETED) {
1975             read_bytes = 0;
1976             goto done_something;
1977         }
1978         if (errorCode==ERROR_OPERATION_ABORTED) {
1979             GetOverlappedResult(handle,&overlapped,&read_bytes,FALSE);
1980             errno = EINTR;
1981             return -1;
1982         }
1983         if (errorCode!=ERROR_IO_PENDING) {
1984             /* is it some _real_ error? */
1985             errno = EIO;
1986             return -1;
1987         } else {
1988             int ret;
1989             if( (ret = WaitForMultipleObjects(2,self->private_events.events,
1990                                               FALSE,INFINITE)) != WAIT_OBJECT_0) {
1991                 CancelIo(handle);
1992                 waitInGOR = TRUE;
1993                 /* Waiting for IO only */
1994             } else {
1995                 waitInGOR = FALSE;
1996             }
1997             ok = GetOverlappedResult(handle,&overlapped,&read_bytes,waitInGOR);
1998             if (!ok) {
1999                 errorCode = GetLastError();
2000                 if (errorCode == ERROR_HANDLE_EOF ||
2001                     errorCode == ERROR_BROKEN_PIPE ||
2002                     errorCode == ERROR_NETNAME_DELETED) {
2003                     read_bytes = 0;
2004                     goto done_something;
2005                 } else {
2006                     if (errorCode == ERROR_OPERATION_ABORTED)
2007                         errno = EINTR;      /* that's it. */
2008                     else
2009                         errno = EIO;        /* something unspecific */
2010                     return -1;
2011                 }
2012             } else
2013                 goto done_something;
2014         }
2015     }
2016   done_something:
2017     if (seekable) {
2018         file_position.QuadPart += read_bytes;
2019         SetFilePointerEx(handle,file_position,NULL,FILE_BEGIN);
2020     }
2021     return read_bytes;
2022 }
2023
2024 void __stdcall RtlUnwind(void *, void *, void *, void *); /* I don't have winternl.h */
2025
2026 /* We used to have a scratch() function listing all symbols needed by
2027  * Lisp.  Much rejoicing commenced upon its removal.  However, I would
2028  * like cold init to fail aggressively when encountering unused symbols.
2029  * That poses a problem, however, since our C code no longer includes
2030  * any references to symbols in ws2_32.dll, and hence the linker
2031  * completely ignores our request to reference it (--no-as-needed does
2032  * not work).  Warm init would later load the DLLs explicitly, but then
2033  * it's too late for an early sanity check.  In the unfortunate spirit
2034  * of scratch(), continue to reference some required DLLs explicitly by
2035  * means of one scratch symbol per DLL.
2036  */
2037 void scratch(void)
2038 {
2039     /* a function from ws2_32.dll */
2040     shutdown(0, 0);
2041
2042     /* a function from shell32.dll */
2043     SHGetFolderPathA(0, 0, 0, 0, 0);
2044 }
2045
2046 char *
2047 os_get_runtime_executable_path(int external)
2048 {
2049     char path[MAX_PATH + 1];
2050     DWORD bufsize = sizeof(path);
2051     DWORD size;
2052
2053     if ((size = GetModuleFileNameA(NULL, path, bufsize)) == 0)
2054         return NULL;
2055     else if (size == bufsize && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
2056         return NULL;
2057
2058     return copied_string(path);
2059 }
2060
2061 #ifdef LISP_FEATURE_SB_THREAD
2062
2063 int
2064 win32_wait_object_or_signal(HANDLE waitFor)
2065 {
2066     struct thread * self = arch_os_get_current_thread();
2067     HANDLE handles[2];
2068     handles[0] = waitFor;
2069     handles[1] = self->private_events.events[1];
2070     return
2071         WaitForMultipleObjects(2,handles, FALSE,INFINITE);
2072 }
2073
2074 /*
2075  * Portability glue for win32 waitable timers.
2076  *
2077  * One may ask: Why is there a wrapper in C when the calls are so
2078  * obvious that Lisp could do them directly (as it did on Windows)?
2079  *
2080  * But the answer is that on POSIX platforms, we now emulate the win32
2081  * calls and hide that emulation behind this os_* abstraction.
2082  */
2083 HANDLE
2084 os_create_wtimer()
2085 {
2086     return CreateWaitableTimer(0, 0, 0);
2087 }
2088
2089 int
2090 os_wait_for_wtimer(HANDLE handle)
2091 {
2092     return win32_wait_object_or_signal(handle);
2093 }
2094
2095 void
2096 os_close_wtimer(HANDLE handle)
2097 {
2098     CloseHandle(handle);
2099 }
2100
2101 void
2102 os_set_wtimer(HANDLE handle, int sec, int nsec)
2103 {
2104     /* in units of 100ns, i.e. 0.1us. Negative for relative semantics. */
2105     long long dueTime
2106         = -(((long long) sec) * 10000000
2107             + ((long long) nsec + 99) / 100);
2108     SetWaitableTimer(handle, (LARGE_INTEGER*) &dueTime, 0, 0, 0, 0);
2109 }
2110
2111 void
2112 os_cancel_wtimer(HANDLE handle)
2113 {
2114     CancelWaitableTimer(handle);
2115 }
2116 #endif
2117
2118 /* EOF */