Home | History | Annotate | Download | only in qemu
      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 #if 0 /* in sockets.c */
     77 void socket_set_nonblock(int fd)
     78 {
     79     unsigned long opt = 1;
     80     ioctlsocket(fd, FIONBIO, &opt);
     81 }
     82 #endif
     83 
     84 int inet_aton(const char *cp, struct in_addr *ia)
     85 {
     86     uint32_t addr = inet_addr(cp);
     87     if (addr == 0xffffffff) {
     88 	return 0;
     89     }
     90     ia->s_addr = addr;
     91     return 1;
     92 }
     93 
     94 void qemu_set_cloexec(int fd)
     95 {
     96 }
     97 
     98 /* Offset between 1/1/1601 and 1/1/1970 in 100 nanosec units */
     99 #define _W32_FT_OFFSET (116444736000000000ULL)
    100 
    101 int qemu_gettimeofday(qemu_timeval *tp)
    102 {
    103   union {
    104     unsigned long long ns100; /*time since 1 Jan 1601 in 100ns units */
    105     FILETIME ft;
    106   }  _now;
    107 
    108   if(tp) {
    109       GetSystemTimeAsFileTime (&_now.ft);
    110       tp->tv_usec=(long)((_now.ns100 / 10ULL) % 1000000ULL );
    111       tp->tv_sec= (long)((_now.ns100 - _W32_FT_OFFSET) / 10000000ULL);
    112   }
    113   /* Always return 0 as per Open Group Base Specifications Issue 6.
    114      Do not set errno on error.  */
    115   return 0;
    116 }
    117