xref: /openbmc/qemu/include/sysemu/os-win32.h (revision 8a768db1)
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  */
69dbd672c8SPierrick Bouvier int __mingw_setjmp(jmp_buf);
70dbd672c8SPierrick Bouvier 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 
1311aad8104SPeter Maydell #define fsync _commit
1321aad8104SPeter Maydell 
1331aad8104SPeter Maydell #if !defined(lseek)
1341aad8104SPeter Maydell # define lseek _lseeki64
1351aad8104SPeter Maydell #endif
1361aad8104SPeter Maydell 
1371aad8104SPeter Maydell int qemu_ftruncate64(int, int64_t);
1381aad8104SPeter Maydell 
1391aad8104SPeter Maydell #if !defined(ftruncate)
1401aad8104SPeter Maydell # define ftruncate qemu_ftruncate64
1411aad8104SPeter Maydell #endif
1421aad8104SPeter Maydell 
realpath(const char * path,char * resolved_path)1431aad8104SPeter Maydell static inline char *realpath(const char *path, char *resolved_path)
1441aad8104SPeter Maydell {
1451aad8104SPeter Maydell     _fullpath(resolved_path, path, _MAX_PATH);
1461aad8104SPeter Maydell     return resolved_path;
1471aad8104SPeter Maydell }
1481aad8104SPeter Maydell 
1496391c772SRichard Henderson /*
1506391c772SRichard Henderson  * Older versions of MinGW do not import _lock_file and _unlock_file properly.
1516391c772SRichard Henderson  * This was fixed for v6.0.0 with commit b48e3ac8969d.
1521ee73216SRichard Henderson  */
qemu_flockfile(FILE * f)1531ee73216SRichard Henderson static inline void qemu_flockfile(FILE *f)
1541ee73216SRichard Henderson {
1556391c772SRichard Henderson #ifdef HAVE__LOCK_FILE
1566391c772SRichard Henderson     _lock_file(f);
1576391c772SRichard Henderson #endif
1581ee73216SRichard Henderson }
1591ee73216SRichard Henderson 
qemu_funlockfile(FILE * f)1601ee73216SRichard Henderson static inline void qemu_funlockfile(FILE *f)
1611ee73216SRichard Henderson {
1626391c772SRichard Henderson #ifdef HAVE__LOCK_FILE
1636391c772SRichard Henderson     _unlock_file(f);
1646391c772SRichard Henderson #endif
1651ee73216SRichard Henderson }
166a2d96af4SDaniel P. Berrange 
167f5fd677aSMarc-André Lureau /* Helper for WSAEventSelect, to report errors */
168abe34282SMarc-André Lureau bool qemu_socket_select(int sockfd, WSAEVENT hEventObject,
169f5fd677aSMarc-André Lureau                         long lNetworkEvents, Error **errp);
170f5fd677aSMarc-André Lureau 
171abe34282SMarc-André Lureau bool qemu_socket_unselect(int sockfd, Error **errp);
172a4aafea2SMarc-André Lureau 
173f3ab43acSMarc-André Lureau /* We wrap all the sockets functions so that we can set errno based on
174f3ab43acSMarc-André Lureau  * WSAGetLastError(), and use file-descriptors instead of SOCKET.
175a2d96af4SDaniel P. Berrange  */
176a2d96af4SDaniel P. Berrange 
177f3ab43acSMarc-André Lureau /*
178f3ab43acSMarc-André Lureau  * qemu_close_socket_osfhandle:
179f3ab43acSMarc-André Lureau  * @fd: a file descriptor associated with a SOCKET
180f3ab43acSMarc-André Lureau  *
181f3ab43acSMarc-André Lureau  * Close only the C run-time file descriptor, leave the SOCKET opened.
182f3ab43acSMarc-André Lureau  *
183f3ab43acSMarc-André Lureau  * Returns zero on success. On error, -1 is returned, and errno is set to
184f3ab43acSMarc-André Lureau  * indicate the error.
185f3ab43acSMarc-André Lureau  */
186f3ab43acSMarc-André Lureau int qemu_close_socket_osfhandle(int fd);
187f3ab43acSMarc-André Lureau 
18825657fc6SMarc-André Lureau #undef close
18925657fc6SMarc-André Lureau #define close qemu_close_wrap
19025657fc6SMarc-André Lureau int qemu_close_wrap(int fd);
19125657fc6SMarc-André Lureau 
192a2d96af4SDaniel P. Berrange #undef connect
193a2d96af4SDaniel P. Berrange #define connect qemu_connect_wrap
194a2d96af4SDaniel P. Berrange int qemu_connect_wrap(int sockfd, const struct sockaddr *addr,
195a2d96af4SDaniel P. Berrange                       socklen_t addrlen);
196a2d96af4SDaniel P. Berrange 
197a2d96af4SDaniel P. Berrange #undef listen
198a2d96af4SDaniel P. Berrange #define listen qemu_listen_wrap
199a2d96af4SDaniel P. Berrange int qemu_listen_wrap(int sockfd, int backlog);
200a2d96af4SDaniel P. Berrange 
201a2d96af4SDaniel P. Berrange #undef bind
202a2d96af4SDaniel P. Berrange #define bind qemu_bind_wrap
203a2d96af4SDaniel P. Berrange int qemu_bind_wrap(int sockfd, const struct sockaddr *addr,
204a2d96af4SDaniel P. Berrange                    socklen_t addrlen);
205a2d96af4SDaniel P. Berrange 
206a2d96af4SDaniel P. Berrange #undef socket
207a2d96af4SDaniel P. Berrange #define socket qemu_socket_wrap
208a2d96af4SDaniel P. Berrange int qemu_socket_wrap(int domain, int type, int protocol);
209a2d96af4SDaniel P. Berrange 
210a2d96af4SDaniel P. Berrange #undef accept
211a2d96af4SDaniel P. Berrange #define accept qemu_accept_wrap
212a2d96af4SDaniel P. Berrange int qemu_accept_wrap(int sockfd, struct sockaddr *addr,
213a2d96af4SDaniel P. Berrange                      socklen_t *addrlen);
214a2d96af4SDaniel P. Berrange 
215a2d96af4SDaniel P. Berrange #undef shutdown
216a2d96af4SDaniel P. Berrange #define shutdown qemu_shutdown_wrap
217a2d96af4SDaniel P. Berrange int qemu_shutdown_wrap(int sockfd, int how);
218a2d96af4SDaniel P. Berrange 
219a2d96af4SDaniel P. Berrange #undef ioctlsocket
220a2d96af4SDaniel P. Berrange #define ioctlsocket qemu_ioctlsocket_wrap
221a2d96af4SDaniel P. Berrange int qemu_ioctlsocket_wrap(int fd, int req, void *val);
222a2d96af4SDaniel P. Berrange 
223a2d96af4SDaniel P. Berrange #undef getsockopt
224a2d96af4SDaniel P. Berrange #define getsockopt qemu_getsockopt_wrap
225a2d96af4SDaniel P. Berrange int qemu_getsockopt_wrap(int sockfd, int level, int optname,
226a2d96af4SDaniel P. Berrange                          void *optval, socklen_t *optlen);
227a2d96af4SDaniel P. Berrange 
228a2d96af4SDaniel P. Berrange #undef setsockopt
229a2d96af4SDaniel P. Berrange #define setsockopt qemu_setsockopt_wrap
230a2d96af4SDaniel P. Berrange int qemu_setsockopt_wrap(int sockfd, int level, int optname,
231a2d96af4SDaniel P. Berrange                          const void *optval, socklen_t optlen);
232a2d96af4SDaniel P. Berrange 
233a2d96af4SDaniel P. Berrange #undef getpeername
234a2d96af4SDaniel P. Berrange #define getpeername qemu_getpeername_wrap
235a2d96af4SDaniel P. Berrange int qemu_getpeername_wrap(int sockfd, struct sockaddr *addr,
236a2d96af4SDaniel P. Berrange                           socklen_t *addrlen);
237a2d96af4SDaniel P. Berrange 
238a2d96af4SDaniel P. Berrange #undef getsockname
239a2d96af4SDaniel P. Berrange #define getsockname qemu_getsockname_wrap
240a2d96af4SDaniel P. Berrange int qemu_getsockname_wrap(int sockfd, struct sockaddr *addr,
241a2d96af4SDaniel P. Berrange                           socklen_t *addrlen);
242a2d96af4SDaniel P. Berrange 
243a2d96af4SDaniel P. Berrange #undef send
244a2d96af4SDaniel P. Berrange #define send qemu_send_wrap
245a2d96af4SDaniel P. Berrange ssize_t qemu_send_wrap(int sockfd, const void *buf, size_t len, int flags);
246a2d96af4SDaniel P. Berrange 
247a2d96af4SDaniel P. Berrange #undef sendto
248a2d96af4SDaniel P. Berrange #define sendto qemu_sendto_wrap
249a2d96af4SDaniel P. Berrange ssize_t qemu_sendto_wrap(int sockfd, const void *buf, size_t len, int flags,
250a2d96af4SDaniel P. Berrange                          const struct sockaddr *addr, socklen_t addrlen);
251a2d96af4SDaniel P. Berrange 
252a2d96af4SDaniel P. Berrange #undef recv
253a2d96af4SDaniel P. Berrange #define recv qemu_recv_wrap
254a2d96af4SDaniel P. Berrange ssize_t qemu_recv_wrap(int sockfd, void *buf, size_t len, int flags);
255a2d96af4SDaniel P. Berrange 
256a2d96af4SDaniel P. Berrange #undef recvfrom
257a2d96af4SDaniel P. Berrange #define recvfrom qemu_recvfrom_wrap
258a2d96af4SDaniel P. Berrange ssize_t qemu_recvfrom_wrap(int sockfd, void *buf, size_t len, int flags,
259a2d96af4SDaniel P. Berrange                            struct sockaddr *addr, socklen_t *addrlen);
260a2d96af4SDaniel P. Berrange 
261d89f30b4SMarc-André Lureau EXCEPTION_DISPOSITION
262d89f30b4SMarc-André Lureau win32_close_exception_handler(struct _EXCEPTION_RECORD*, void*,
263d89f30b4SMarc-André Lureau                               struct _CONTEXT*, void*);
264d89f30b4SMarc-André Lureau 
265*09b4c198SMarc-André Lureau void *qemu_win32_map_alloc(size_t size, HANDLE *h, Error **errp);
266*09b4c198SMarc-André Lureau void qemu_win32_map_free(void *ptr, HANDLE h, Error **errp);
267*09b4c198SMarc-André Lureau 
268415a9fb8SPeter Maydell #ifdef __cplusplus
269415a9fb8SPeter Maydell }
270415a9fb8SPeter Maydell #endif
271415a9fb8SPeter Maydell 
2729c17d615SPaolo Bonzini #endif
273