File:  [Qemu by Fabrice Bellard] / qemu / oslib-win32.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 18:34:15 2018 UTC (3 years, 1 month ago) by root
Branches: qemu, MAIN
CVS tags: qemu0150, qemu0141, qemu0140, HEAD
qemu 0.14.0

    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