1 /*
2  * win32 specific declarations
3  *
4  * Copyright (c) 2003-2008 Fabrice Bellard
5  * Copyright (c) 2010 Jes Sorensen <Jes.Sorensen@redhat.com>
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy
8  * of this software and associated documentation files (the "Software"), to deal
9  * in the Software without restriction, including without limitation the rights
10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11  * copies of the Software, and to permit persons to whom the Software is
12  * furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in
15  * all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23  * THE SOFTWARE.
24  */
25 
26 #ifndef QEMU_OS_WIN32_H
27 #define QEMU_OS_WIN32_H
28 
29 #include <winsock2.h>
30 #include <windows.h>
31 #include <setjmp.h>
32 
33 /* Workaround for older versions of MinGW. */
34 #ifndef ECONNREFUSED
35 # define ECONNREFUSED WSAECONNREFUSED
36 #endif
37 #ifndef EINPROGRESS
38 # define EINPROGRESS  WSAEINPROGRESS
39 #endif
40 #ifndef EHOSTUNREACH
41 # define EHOSTUNREACH WSAEHOSTUNREACH
42 #endif
43 #ifndef EINTR
44 # define EINTR        WSAEINTR
45 #endif
46 #ifndef EINPROGRESS
47 # define EINPROGRESS  WSAEINPROGRESS
48 #endif
49 #ifndef ENETUNREACH
50 # define ENETUNREACH  WSAENETUNREACH
51 #endif
52 #ifndef ENOTCONN
53 # define ENOTCONN     WSAENOTCONN
54 #endif
55 #ifndef EWOULDBLOCK
56 # define EWOULDBLOCK  WSAEWOULDBLOCK
57 #endif
58 
59 #if defined(_WIN64)
60 /* On w64, setjmp is implemented by _setjmp which needs a second parameter.
61  * If this parameter is NULL, longjump does no stack unwinding.
62  * That is what we need for QEMU. Passing the value of register rsp (default)
63  * lets longjmp try a stack unwinding which will crash with generated code. */
64 
65 #if defined(_MSC_VER) // MSVC
66 
67 // See qemu/include/utils/setjmp-wrapper-win32.asm for details.
68 extern int _setjmp_wrapper(jmp_buf);
69 
70 # undef setjmp
71 # define setjmp(env) _setjmp_wrapper(env)
72 
73 #else // MinGW
74 
75 // Original QEMU patch.
76 # undef setjmp
77 # define setjmp(env) _setjmp(env, NULL)
78 #endif
79 
80 #endif
81 /* QEMU uses sigsetjmp()/siglongjmp() as the portable way to specify
82  * "longjmp and don't touch the signal masks". Since we know that the
83  * savemask parameter will always be zero we can safely define these
84  * in terms of setjmp/longjmp on Win32.
85  */
86 #define sigjmp_buf jmp_buf
87 #define sigsetjmp(env, savemask) setjmp(env)
88 #define siglongjmp(env, val) longjmp(env, val)
89 
90 size_t getpagesize(void);
91 
92 #if !defined(EPROTONOSUPPORT)
93 # define EPROTONOSUPPORT EINVAL
94 #endif
95 
96 #endif
97