Annotation of qemu/oslib-win32.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * os-win32.c
        !             3:  *
        !             4:  * Copyright (c) 2003-2008 Fabrice Bellard
        !             5:  * Copyright (c) 2010 Red Hat, Inc.
        !             6:  *
        !             7:  * QEMU library functions for win32 which are shared between QEMU and
        !             8:  * the QEMU tools.
        !             9:  *
        !            10:  * Permission is hereby granted, free of charge, to any person obtaining a copy
        !            11:  * of this software and associated documentation files (the "Software"), to deal
        !            12:  * in the Software without restriction, including without limitation the rights
        !            13:  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        !            14:  * copies of the Software, and to permit persons to whom the Software is
        !            15:  * furnished to do so, subject to the following conditions:
        !            16:  *
        !            17:  * The above copyright notice and this permission notice shall be included in
        !            18:  * all copies or substantial portions of the Software.
        !            19:  *
        !            20:  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        !            21:  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        !            22:  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
        !            23:  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        !            24:  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        !            25:  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
        !            26:  * THE SOFTWARE.
        !            27:  */
        !            28: #include <windows.h>
        !            29: #include "config-host.h"
        !            30: #include "sysemu.h"
        !            31: #include "trace.h"
        !            32: #include "qemu_socket.h"
        !            33: 
        !            34: void *qemu_oom_check(void *ptr)
        !            35: {
        !            36:     if (ptr == NULL) {
        !            37:         fprintf(stderr, "Failed to allocate memory: %lu\n", GetLastError());
        !            38:         abort();
        !            39:     }
        !            40:     return ptr;
        !            41: }
        !            42: 
        !            43: void *qemu_memalign(size_t alignment, size_t size)
        !            44: {
        !            45:     void *ptr;
        !            46: 
        !            47:     if (!size) {
        !            48:         abort();
        !            49:     }
        !            50:     ptr = qemu_oom_check(VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE));
        !            51:     trace_qemu_memalign(alignment, size, ptr);
        !            52:     return ptr;
        !            53: }
        !            54: 
        !            55: void *qemu_vmalloc(size_t size)
        !            56: {
        !            57:     void *ptr;
        !            58: 
        !            59:     /* FIXME: this is not exactly optimal solution since VirtualAlloc
        !            60:        has 64Kb granularity, but at least it guarantees us that the
        !            61:        memory is page aligned. */
        !            62:     if (!size) {
        !            63:         abort();
        !            64:     }
        !            65:     ptr = qemu_oom_check(VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE));
        !            66:     trace_qemu_vmalloc(size, ptr);
        !            67:     return ptr;
        !            68: }
        !            69: 
        !            70: void qemu_vfree(void *ptr)
        !            71: {
        !            72:     trace_qemu_vfree(ptr);
        !            73:     VirtualFree(ptr, 0, MEM_RELEASE);
        !            74: }
        !            75: 
        !            76: void socket_set_nonblock(int fd)
        !            77: {
        !            78:     unsigned long opt = 1;
        !            79:     ioctlsocket(fd, FIONBIO, &opt);
        !            80: }
        !            81: 
        !            82: int inet_aton(const char *cp, struct in_addr *ia)
        !            83: {
        !            84:     uint32_t addr = inet_addr(cp);
        !            85:     if (addr == 0xffffffff) {
        !            86:        return 0;
        !            87:     }
        !            88:     ia->s_addr = addr;
        !            89:     return 1;
        !            90: }
        !            91: 
        !            92: void qemu_set_cloexec(int fd)
        !            93: {
        !            94: }
        !            95: 
        !            96: /* mingw32 needs ffs for compilations without optimization. */
        !            97: int ffs(int i)
        !            98: {
        !            99:     /* Use gcc's builtin ffs. */
        !           100:     return __builtin_ffs(i);
        !           101: }
        !           102: 
        !           103: /* Offset between 1/1/1601 and 1/1/1970 in 100 nanosec units */
        !           104: #define _W32_FT_OFFSET (116444736000000000ULL)
        !           105: 
        !           106: int qemu_gettimeofday(qemu_timeval *tp)
        !           107: {
        !           108:   union {
        !           109:     unsigned long long ns100; /*time since 1 Jan 1601 in 100ns units */
        !           110:     FILETIME ft;
        !           111:   }  _now;
        !           112: 
        !           113:   if(tp) {
        !           114:       GetSystemTimeAsFileTime (&_now.ft);
        !           115:       tp->tv_usec=(long)((_now.ns100 / 10ULL) % 1000000ULL );
        !           116:       tp->tv_sec= (long)((_now.ns100 - _W32_FT_OFFSET) / 10000000ULL);
        !           117:   }
        !           118:   /* Always return 0 as per Open Group Base Specifications Issue 6.
        !           119:      Do not set errno on error.  */
        !           120:   return 0;
        !           121: }

unix.superglobalmegacorp.com