19c17d615SPaolo Bonzini /*
29c17d615SPaolo Bonzini * win32 specific declarations
39c17d615SPaolo Bonzini *
49c17d615SPaolo Bonzini * Copyright (c) 2003-2008 Fabrice Bellard
59c17d615SPaolo Bonzini * Copyright (c) 2010 Jes Sorensen <Jes.Sorensen@redhat.com>
69c17d615SPaolo Bonzini *
79c17d615SPaolo Bonzini * Permission is hereby granted, free of charge, to any person obtaining a copy
89c17d615SPaolo Bonzini * of this software and associated documentation files (the "Software"), to deal
99c17d615SPaolo Bonzini * in the Software without restriction, including without limitation the rights
109c17d615SPaolo Bonzini * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
119c17d615SPaolo Bonzini * copies of the Software, and to permit persons to whom the Software is
129c17d615SPaolo Bonzini * furnished to do so, subject to the following conditions:
139c17d615SPaolo Bonzini *
149c17d615SPaolo Bonzini * The above copyright notice and this permission notice shall be included in
159c17d615SPaolo Bonzini * all copies or substantial portions of the Software.
169c17d615SPaolo Bonzini *
179c17d615SPaolo Bonzini * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
189c17d615SPaolo Bonzini * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
199c17d615SPaolo Bonzini * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
209c17d615SPaolo Bonzini * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
219c17d615SPaolo Bonzini * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
229c17d615SPaolo Bonzini * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
239c17d615SPaolo Bonzini * THE SOFTWARE.
249c17d615SPaolo Bonzini */
259c17d615SPaolo Bonzini
269c17d615SPaolo Bonzini #ifndef QEMU_OS_WIN32_H
279c17d615SPaolo Bonzini #define QEMU_OS_WIN32_H
289c17d615SPaolo Bonzini
299c17d615SPaolo Bonzini #include <winsock2.h>
301834ed3aSPaolo Bonzini #include <windows.h>
31a2d96af4SDaniel P. Berrange #include <ws2tcpip.h>
32f5fd677aSMarc-André Lureau #include "qemu/typedefs.h"
339c17d615SPaolo Bonzini
34d409373bSBin Meng #ifdef HAVE_AFUNIX_H
35d409373bSBin Meng #include <afunix.h>
36d409373bSBin Meng #else
37d409373bSBin Meng /*
38d409373bSBin Meng * Fallback definitions of things we need in afunix.h, if not available from
39d409373bSBin Meng * the used Windows SDK or MinGW headers.
40d409373bSBin Meng */
41d409373bSBin Meng #define UNIX_PATH_MAX 108
42d409373bSBin Meng
43d409373bSBin Meng typedef struct sockaddr_un {
44d409373bSBin Meng ADDRESS_FAMILY sun_family;
45d409373bSBin Meng char sun_path[UNIX_PATH_MAX];
46d409373bSBin Meng } SOCKADDR_UN, *PSOCKADDR_UN;
47d409373bSBin Meng
48d409373bSBin Meng #define SIO_AF_UNIX_GETPEERPID _WSAIOR(IOC_VENDOR, 256)
49d409373bSBin Meng #endif
50d409373bSBin Meng
51415a9fb8SPeter Maydell #ifdef __cplusplus
52415a9fb8SPeter Maydell extern "C" {
53415a9fb8SPeter Maydell #endif
54415a9fb8SPeter Maydell
55dbd672c8SPierrick Bouvier #if defined(__aarch64__)
56dbd672c8SPierrick Bouvier /*
57dbd672c8SPierrick Bouvier * On windows-arm64, setjmp is available in only one variant, and longjmp always
58dbd672c8SPierrick Bouvier * does stack unwinding. This crash with generated code.
59dbd672c8SPierrick Bouvier * Thus, we use another implementation of setjmp (not windows one), coming from
60dbd672c8SPierrick Bouvier * mingw, which never performs stack unwinding.
61dbd672c8SPierrick Bouvier */
62dbd672c8SPierrick Bouvier #undef setjmp
63dbd672c8SPierrick Bouvier #undef longjmp
64dbd672c8SPierrick Bouvier /*
65dbd672c8SPierrick Bouvier * These functions are not declared in setjmp.h because __aarch64__ defines
66dbd672c8SPierrick Bouvier * setjmp to _setjmpex instead. However, they are still defined in libmingwex.a,
67dbd672c8SPierrick Bouvier * which gets linked automatically.
68dbd672c8SPierrick Bouvier */
69f703f1efSPhilippe Mathieu-Daudé int __mingw_setjmp(jmp_buf);
70f703f1efSPhilippe Mathieu-Daudé void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int);
71dbd672c8SPierrick Bouvier #define setjmp(env) __mingw_setjmp(env)
72dbd672c8SPierrick Bouvier #define longjmp(env, val) __mingw_longjmp(env, val)
73dbd672c8SPierrick Bouvier #elif defined(_WIN64)
74dbd672c8SPierrick Bouvier /*
75dbd672c8SPierrick Bouvier * On windows-x64, setjmp is implemented by _setjmp which needs a second parameter.
769c17d615SPaolo Bonzini * If this parameter is NULL, longjump does no stack unwinding.
779c17d615SPaolo Bonzini * That is what we need for QEMU. Passing the value of register rsp (default)
78dbd672c8SPierrick Bouvier * lets longjmp try a stack unwinding which will crash with generated code.
79dbd672c8SPierrick Bouvier */
809c17d615SPaolo Bonzini # undef setjmp
819c17d615SPaolo Bonzini # define setjmp(env) _setjmp(env, NULL)
82dbd672c8SPierrick Bouvier #endif /* __aarch64__ */
836ab7e546SPeter Maydell /* QEMU uses sigsetjmp()/siglongjmp() as the portable way to specify
846ab7e546SPeter Maydell * "longjmp and don't touch the signal masks". Since we know that the
856ab7e546SPeter Maydell * savemask parameter will always be zero we can safely define these
866ab7e546SPeter Maydell * in terms of setjmp/longjmp on Win32.
876ab7e546SPeter Maydell */
886ab7e546SPeter Maydell #define sigjmp_buf jmp_buf
896ab7e546SPeter Maydell #define sigsetjmp(env, savemask) setjmp(env)
906ab7e546SPeter Maydell #define siglongjmp(env, val) longjmp(env, val)
919c17d615SPaolo Bonzini
929c17d615SPaolo Bonzini /* Missing POSIX functions. Don't use MinGW-w64 macros. */
937c3afc85SYonggang Luo #ifndef _POSIX_THREAD_SAFE_FUNCTIONS
949c17d615SPaolo Bonzini #undef gmtime_r
959c17d615SPaolo Bonzini struct tm *gmtime_r(const time_t *timep, struct tm *result);
969c17d615SPaolo Bonzini #undef localtime_r
979c17d615SPaolo Bonzini struct tm *localtime_r(const time_t *timep, struct tm *result);
987c3afc85SYonggang Luo #endif /* _POSIX_THREAD_SAFE_FUNCTIONS */
999c17d615SPaolo Bonzini
os_setup_signal_handling(void)1009c17d615SPaolo Bonzini static inline void os_setup_signal_handling(void) {}
os_daemonize(void)1019c17d615SPaolo Bonzini static inline void os_daemonize(void) {}
os_setup_post(void)1029c17d615SPaolo Bonzini static inline void os_setup_post(void) {}
os_set_proc_name(const char * dummy)1039c17d615SPaolo Bonzini static inline void os_set_proc_name(const char *dummy) {}
104327adeecSMarc-André Lureau void os_set_line_buffering(void);
105327adeecSMarc-André Lureau void os_setup_early_signal_handling(void);
1069c17d615SPaolo Bonzini
107a28c2f2dSStefan Weil int getpagesize(void);
10838183310SPaolo Bonzini
1099c17d615SPaolo Bonzini #if !defined(EPROTONOSUPPORT)
1109c17d615SPaolo Bonzini # define EPROTONOSUPPORT EINVAL
1119c17d615SPaolo Bonzini #endif
1129c17d615SPaolo Bonzini
os_set_daemonize(bool d)113f22ac472SHanna Reitz static inline int os_set_daemonize(bool d)
114f22ac472SHanna Reitz {
115f22ac472SHanna Reitz if (d) {
116f22ac472SHanna Reitz return -ENOTSUP;
117f22ac472SHanna Reitz }
118f22ac472SHanna Reitz return 0;
119f22ac472SHanna Reitz }
120f22ac472SHanna Reitz
is_daemonized(void)1219c17d615SPaolo Bonzini static inline bool is_daemonized(void)
1229c17d615SPaolo Bonzini {
1239c17d615SPaolo Bonzini return false;
1249c17d615SPaolo Bonzini }
1259c17d615SPaolo Bonzini
os_mlock(void)126888a6bc6SSatoru Moriya static inline int os_mlock(void)
127888a6bc6SSatoru Moriya {
128888a6bc6SSatoru Moriya return -ENOSYS;
129888a6bc6SSatoru Moriya }
130888a6bc6SSatoru Moriya
os_setup_limits(void)131*03e471c4SFiona Ebner static inline void os_setup_limits(void)
132*03e471c4SFiona Ebner {
133*03e471c4SFiona Ebner return;
134*03e471c4SFiona Ebner }
135*03e471c4SFiona Ebner
1361aad8104SPeter Maydell #define fsync _commit
1371aad8104SPeter Maydell
1381aad8104SPeter Maydell #if !defined(lseek)
1391aad8104SPeter Maydell # define lseek _lseeki64
1401aad8104SPeter Maydell #endif
1411aad8104SPeter Maydell
1421aad8104SPeter Maydell int qemu_ftruncate64(int, int64_t);
1431aad8104SPeter Maydell
1441aad8104SPeter Maydell #if !defined(ftruncate)
1451aad8104SPeter Maydell # define ftruncate qemu_ftruncate64
1461aad8104SPeter Maydell #endif
1471aad8104SPeter Maydell
realpath(const char * path,char * resolved_path)1481aad8104SPeter Maydell static inline char *realpath(const char *path, char *resolved_path)
1491aad8104SPeter Maydell {
1501aad8104SPeter Maydell _fullpath(resolved_path, path, _MAX_PATH);
1511aad8104SPeter Maydell return resolved_path;
1521aad8104SPeter Maydell }
1531aad8104SPeter Maydell
1546391c772SRichard Henderson /*
1556391c772SRichard Henderson * Older versions of MinGW do not import _lock_file and _unlock_file properly.
1566391c772SRichard Henderson * This was fixed for v6.0.0 with commit b48e3ac8969d.
1571ee73216SRichard Henderson */
qemu_flockfile(FILE * f)1581ee73216SRichard Henderson static inline void qemu_flockfile(FILE *f)
1591ee73216SRichard Henderson {
1606391c772SRichard Henderson #ifdef HAVE__LOCK_FILE
1616391c772SRichard Henderson _lock_file(f);
1626391c772SRichard Henderson #endif
1631ee73216SRichard Henderson }
1641ee73216SRichard Henderson
qemu_funlockfile(FILE * f)1651ee73216SRichard Henderson static inline void qemu_funlockfile(FILE *f)
1661ee73216SRichard Henderson {
1676391c772SRichard Henderson #ifdef HAVE__LOCK_FILE
1686391c772SRichard Henderson _unlock_file(f);
1696391c772SRichard Henderson #endif
1701ee73216SRichard Henderson }
171a2d96af4SDaniel P. Berrange
172f5fd677aSMarc-André Lureau /* Helper for WSAEventSelect, to report errors */
173abe34282SMarc-André Lureau bool qemu_socket_select(int sockfd, WSAEVENT hEventObject,
174f5fd677aSMarc-André Lureau long lNetworkEvents, Error **errp);
175f5fd677aSMarc-André Lureau
176abe34282SMarc-André Lureau bool qemu_socket_unselect(int sockfd, Error **errp);
177a4aafea2SMarc-André Lureau
178f3ab43acSMarc-André Lureau /* We wrap all the sockets functions so that we can set errno based on
179f3ab43acSMarc-André Lureau * WSAGetLastError(), and use file-descriptors instead of SOCKET.
180a2d96af4SDaniel P. Berrange */
181a2d96af4SDaniel P. Berrange
182f3ab43acSMarc-André Lureau /*
183f3ab43acSMarc-André Lureau * qemu_close_socket_osfhandle:
184f3ab43acSMarc-André Lureau * @fd: a file descriptor associated with a SOCKET
185f3ab43acSMarc-André Lureau *
186f3ab43acSMarc-André Lureau * Close only the C run-time file descriptor, leave the SOCKET opened.
187f3ab43acSMarc-André Lureau *
188f3ab43acSMarc-André Lureau * Returns zero on success. On error, -1 is returned, and errno is set to
189f3ab43acSMarc-André Lureau * indicate the error.
190f3ab43acSMarc-André Lureau */
191f3ab43acSMarc-André Lureau int qemu_close_socket_osfhandle(int fd);
192f3ab43acSMarc-André Lureau
19325657fc6SMarc-André Lureau #undef close
19425657fc6SMarc-André Lureau #define close qemu_close_wrap
19525657fc6SMarc-André Lureau int qemu_close_wrap(int fd);
19625657fc6SMarc-André Lureau
197a2d96af4SDaniel P. Berrange #undef connect
198a2d96af4SDaniel P. Berrange #define connect qemu_connect_wrap
199a2d96af4SDaniel P. Berrange int qemu_connect_wrap(int sockfd, const struct sockaddr *addr,
200a2d96af4SDaniel P. Berrange socklen_t addrlen);
201a2d96af4SDaniel P. Berrange
202a2d96af4SDaniel P. Berrange #undef listen
203a2d96af4SDaniel P. Berrange #define listen qemu_listen_wrap
204a2d96af4SDaniel P. Berrange int qemu_listen_wrap(int sockfd, int backlog);
205a2d96af4SDaniel P. Berrange
206a2d96af4SDaniel P. Berrange #undef bind
207a2d96af4SDaniel P. Berrange #define bind qemu_bind_wrap
208a2d96af4SDaniel P. Berrange int qemu_bind_wrap(int sockfd, const struct sockaddr *addr,
209a2d96af4SDaniel P. Berrange socklen_t addrlen);
210a2d96af4SDaniel P. Berrange
211a2d96af4SDaniel P. Berrange #undef socket
212a2d96af4SDaniel P. Berrange #define socket qemu_socket_wrap
213a2d96af4SDaniel P. Berrange int qemu_socket_wrap(int domain, int type, int protocol);
214a2d96af4SDaniel P. Berrange
215a2d96af4SDaniel P. Berrange #undef accept
216a2d96af4SDaniel P. Berrange #define accept qemu_accept_wrap
217a2d96af4SDaniel P. Berrange int qemu_accept_wrap(int sockfd, struct sockaddr *addr,
218a2d96af4SDaniel P. Berrange socklen_t *addrlen);
219a2d96af4SDaniel P. Berrange
220a2d96af4SDaniel P. Berrange #undef shutdown
221a2d96af4SDaniel P. Berrange #define shutdown qemu_shutdown_wrap
222a2d96af4SDaniel P. Berrange int qemu_shutdown_wrap(int sockfd, int how);
223a2d96af4SDaniel P. Berrange
224a2d96af4SDaniel P. Berrange #undef ioctlsocket
225a2d96af4SDaniel P. Berrange #define ioctlsocket qemu_ioctlsocket_wrap
226a2d96af4SDaniel P. Berrange int qemu_ioctlsocket_wrap(int fd, int req, void *val);
227a2d96af4SDaniel P. Berrange
228a2d96af4SDaniel P. Berrange #undef getsockopt
229a2d96af4SDaniel P. Berrange #define getsockopt qemu_getsockopt_wrap
230a2d96af4SDaniel P. Berrange int qemu_getsockopt_wrap(int sockfd, int level, int optname,
231a2d96af4SDaniel P. Berrange void *optval, socklen_t *optlen);
232a2d96af4SDaniel P. Berrange
233a2d96af4SDaniel P. Berrange #undef setsockopt
234a2d96af4SDaniel P. Berrange #define setsockopt qemu_setsockopt_wrap
235a2d96af4SDaniel P. Berrange int qemu_setsockopt_wrap(int sockfd, int level, int optname,
236a2d96af4SDaniel P. Berrange const void *optval, socklen_t optlen);
237a2d96af4SDaniel P. Berrange
238a2d96af4SDaniel P. Berrange #undef getpeername
239a2d96af4SDaniel P. Berrange #define getpeername qemu_getpeername_wrap
240a2d96af4SDaniel P. Berrange int qemu_getpeername_wrap(int sockfd, struct sockaddr *addr,
241a2d96af4SDaniel P. Berrange socklen_t *addrlen);
242a2d96af4SDaniel P. Berrange
243a2d96af4SDaniel P. Berrange #undef getsockname
244a2d96af4SDaniel P. Berrange #define getsockname qemu_getsockname_wrap
245a2d96af4SDaniel P. Berrange int qemu_getsockname_wrap(int sockfd, struct sockaddr *addr,
246a2d96af4SDaniel P. Berrange socklen_t *addrlen);
247a2d96af4SDaniel P. Berrange
248a2d96af4SDaniel P. Berrange #undef send
249a2d96af4SDaniel P. Berrange #define send qemu_send_wrap
250a2d96af4SDaniel P. Berrange ssize_t qemu_send_wrap(int sockfd, const void *buf, size_t len, int flags);
251a2d96af4SDaniel P. Berrange
252a2d96af4SDaniel P. Berrange #undef sendto
253a2d96af4SDaniel P. Berrange #define sendto qemu_sendto_wrap
254a2d96af4SDaniel P. Berrange ssize_t qemu_sendto_wrap(int sockfd, const void *buf, size_t len, int flags,
255a2d96af4SDaniel P. Berrange const struct sockaddr *addr, socklen_t addrlen);
256a2d96af4SDaniel P. Berrange
257a2d96af4SDaniel P. Berrange #undef recv
258a2d96af4SDaniel P. Berrange #define recv qemu_recv_wrap
259a2d96af4SDaniel P. Berrange ssize_t qemu_recv_wrap(int sockfd, void *buf, size_t len, int flags);
260a2d96af4SDaniel P. Berrange
261a2d96af4SDaniel P. Berrange #undef recvfrom
262a2d96af4SDaniel P. Berrange #define recvfrom qemu_recvfrom_wrap
263a2d96af4SDaniel P. Berrange ssize_t qemu_recvfrom_wrap(int sockfd, void *buf, size_t len, int flags,
264a2d96af4SDaniel P. Berrange struct sockaddr *addr, socklen_t *addrlen);
265a2d96af4SDaniel P. Berrange
266d89f30b4SMarc-André Lureau EXCEPTION_DISPOSITION
267d89f30b4SMarc-André Lureau win32_close_exception_handler(struct _EXCEPTION_RECORD*, void*,
268d89f30b4SMarc-André Lureau struct _CONTEXT*, void*);
269d89f30b4SMarc-André Lureau
27009b4c198SMarc-André Lureau void *qemu_win32_map_alloc(size_t size, HANDLE *h, Error **errp);
27109b4c198SMarc-André Lureau void qemu_win32_map_free(void *ptr, HANDLE h, Error **errp);
27209b4c198SMarc-André Lureau
273415a9fb8SPeter Maydell #ifdef __cplusplus
274415a9fb8SPeter Maydell }
275415a9fb8SPeter Maydell #endif
276415a9fb8SPeter Maydell
2779c17d615SPaolo Bonzini #endif
278