diff -Paur --no-dereference -- qemu.upstream/block/raw-posix.c qemu/block/raw-posix.c --- qemu.upstream/block/raw-posix.c +++ qemu/block/raw-posix.c @@ -94,6 +94,8 @@ #include #endif +#include + #ifdef CONFIG_XFS #include #endif diff -Paur --no-dereference -- qemu.upstream/configure qemu/configure --- qemu.upstream/configure +++ qemu/configure @@ -246,12 +246,13 @@ LDFLAGS_SHARED="-shared" modules="no" prefix="/usr/local" +exec_prefix="/usr/local" mandir="\${prefix}/share/man" datadir="\${prefix}/share" qemu_docdir="\${prefix}/share/doc/qemu" -bindir="\${prefix}/bin" -libdir="\${prefix}/lib" -libexecdir="\${prefix}/libexec" +bindir="\${exec_prefix}/bin" +libdir="\${exec_prefix}/lib" +libexecdir="\${exec_prefix}/libexec" includedir="\${prefix}/include" sysconfdir="\${prefix}/etc" local_statedir="\${prefix}/var" @@ -261,6 +262,7 @@ bsd="no" linux="no" solaris="no" +sortix="no" profiler="no" cocoa="no" softmmu="yes" @@ -320,6 +322,9 @@ numa="" tcmalloc="no" jemalloc="no" +param_build= +param_host= +param_target= # parse CC options first for opt do @@ -345,16 +350,29 @@ ;; --disable-debug-info) debug_info="no" ;; + --build=*) param_build="$optarg" + ;; + --host=*) param_host="$optarg" + ;; + --target=*) param_target="$optarg" + ;; esac done # OS specific # Using uname is really, really broken. Once we have the right set of checks # we can eliminate its usage altogether. +if test -n "${CC_FOR_BUILD}"; then + host_cc="${CC_FOR_BUILD}" +fi + # Preferred compiler: # ${CC} (if set) # ${cross_prefix}gcc (if cross-prefix specified) # system compiler +if [ x"${param_build}]" != x"${param_host}" ]; then + cross_prefix="${param_host}-" +fi if test -z "${CC}${cross_prefix}"; then cc="$host_cc" else @@ -381,8 +399,8 @@ "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@" } pkg_config=query_pkg_config -sdl_config="${SDL_CONFIG-${cross_prefix}sdl-config}" -sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}" +sdl_config="${pkg_config} sdl" +sdl2_config="${pkg_config} sdl2" # If the user hasn't specified ARFLAGS, default to 'rv', just as make does. ARFLAGS="${ARFLAGS-rv}" @@ -443,6 +461,8 @@ targetos='SunOS' elif check_define __HAIKU__ ; then targetos='Haiku' +elif check_define __sortix__ ; then + targetos='Sortix' else targetos=$(uname -s) fi @@ -666,6 +686,10 @@ QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS $QEMU_CFLAGS" LIBS="-lposix_error_mapper -lnetwork $LIBS" ;; +Sortix*) + audio_possible_drivers="sdl" + sortix="yes" +;; *) audio_drv_list="oss" audio_possible_drivers="oss alsa sdl pa" @@ -731,6 +755,8 @@ ;; --prefix=*) prefix="$optarg" ;; + --exec-prefix=*) exec_prefix="$optarg" + ;; --interp-prefix=*) interp_prefix="$optarg" ;; --source-path=*) @@ -1150,6 +1176,12 @@ ;; --enable-jemalloc) jemalloc="yes" ;; + --build=*) + ;; + --host=*) + ;; + --target=*) + ;; *) echo "ERROR: unknown option $opt" echo "Try '$0 --help' for more information" @@ -1162,13 +1194,7 @@ error_exit "Python not found. Use --python=/path/to/python" fi -# Note that if the Python conditional here evaluates True we will exit -# with status 1 which is a shell 'false' value. -if ! $python -c 'import sys; sys.exit(sys.version_info < (2,6) or sys.version_info >= (3,))'; then - error_exit "Cannot use '$python', Python 2.6 or later is required." \ - "Note that Python 3 or later is not yet supported." \ - "Use --python=/path/to/python to specify a supported Python." -fi +# PATCH: qemu has been patched to work with both Python 2 and 3. # Suppress writing compiled files python="$python -B" @@ -2288,14 +2314,15 @@ fi has_libgcrypt_config() { - if ! has "libgcrypt-config" + return 1 + if ! has "false" then return 1 fi if test -n "$cross_prefix" then - host=$(libgcrypt-config --host) + host=$(false --host) if test "$host-" != $cross_prefix then return 1 @@ -2307,9 +2334,9 @@ if test "$gcrypt" != "no"; then if has_libgcrypt_config; then - gcrypt_cflags=$(libgcrypt-config --cflags) - gcrypt_libs=$(libgcrypt-config --libs) - # Debian has remove -lgpg-error from libgcrypt-config + gcrypt_cflags=$(false --cflags) + gcrypt_libs=$(false --libs) + # Debian has remove -lgpg-error from false # as it "spreads unnecessary dependencies" which in # turn breaks static builds... if test "$static" = "yes" @@ -2438,8 +2465,7 @@ ########################################## # SDL probe -# Look for sdl configuration program (pkg-config or sdl-config). Try -# sdl-config even without cross prefix, and favour pkg-config over sdl-config. +# Look for sdl configuration program (pkg-config). if test "$sdlabi" = ""; then if $pkg_config --exists "sdl"; then @@ -2478,9 +2504,6 @@ fi sdl=no fi -if test -n "$cross_prefix" && test "$(basename "$sdlconfig")" = sdl-config; then - echo warning: using "\"$sdlconfig\"" to detect cross-compiled sdl >&2 -fi sdl_too_old=no if test "$sdl" != "no" ; then @@ -2505,8 +2528,8 @@ # static link with sdl ? (note: sdl.pc's --static --libs is broken) if test "$sdl" = "yes" -a "$static" = "yes" ; then if test $? = 0 && echo $sdl_libs | grep -- -laa > /dev/null; then - sdl_libs="$sdl_libs $(aalib-config --static-libs 2>/dev/null)" - sdl_cflags="$sdl_cflags $(aalib-config --cflags 2>/dev/null)" + sdl_libs="$sdl_libs $(false --static-libs 2>/dev/null)" + sdl_cflags="$sdl_cflags $(false --cflags 2>/dev/null)" fi if compile_prog "$sdl_cflags" "$sdl_libs" ; then : @@ -2893,9 +2916,8 @@ cat > $TMPC << EOF #include int main(void) { - const char *s = curses_version(); - resize_term(0, 0); - return s != 0; + /* PATCH: The old NetBSD libcurses on Sortix doesn't have these functions. */ + return 0; } EOF IFS=: @@ -2924,7 +2946,7 @@ if $pkg_config libcurl --exists; then curlconfig="$pkg_config libcurl" else - curlconfig=curl-config + curlconfig=false fi cat > $TMPC << EOF #include @@ -3970,7 +3992,7 @@ fi if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \ - "$aix" != "yes" -a "$haiku" != "yes" ; then + "$aix" != "yes" -a "$haiku" != "yes" -a "$sortix" != "yes" ; then libs_softmmu="-lutil $libs_softmmu" fi @@ -5006,6 +5028,9 @@ if test "$haiku" = "yes" ; then echo "CONFIG_HAIKU=y" >> $config_host_mak fi +if test "$sortix" = "yes" ; then + echo "CONFIG_SORTIX=y" >> $config_host_mak +fi if test "$static" = "yes" ; then echo "CONFIG_STATIC=y" >> $config_host_mak fi diff -Paur --no-dereference -- qemu.upstream/cpus.c qemu/cpus.c --- qemu.upstream/cpus.c +++ qemu/cpus.c @@ -1119,8 +1119,15 @@ current_cpu = NULL; qemu_mutex_unlock_iothread(); do { +/* PATCH: Sortix doesn't have sigwait() yet. */ +#ifdef __sortix__ + sleep(1); + r = -1; + errno = EAGAIN; +#else int sig; r = sigwait(&waitset, &sig); +#endif } while (r == -1 && (errno == EAGAIN || errno == EINTR)); if (r == -1) { perror("sigwait"); @@ -1204,7 +1211,11 @@ return; } cpu->thread_kicked = true; +#if defined(__sortix__) + err = ENOSYS; +#else err = pthread_kill(cpu->thread->thread, SIG_IPI); +#endif if (err) { fprintf(stderr, "qemu:%s: %s", __func__, strerror(err)); exit(1); diff -Paur --no-dereference -- qemu.upstream/hw/audio/fmopl.c qemu/hw/audio/fmopl.c --- qemu.upstream/hw/audio/fmopl.c +++ qemu/hw/audio/fmopl.c @@ -499,7 +499,7 @@ static inline void OPL_CALC_RH( OPL_CH *CH ) { UINT32 env_tam,env_sd,env_top,env_hh; - int whitenoise = (rand()&1)*(WHITE_NOISE_db/EG_STEP); + int whitenoise = (arc4random()&1)*(WHITE_NOISE_db/EG_STEP); INT32 tone8; OPL_SLOT *SLOT; diff -Paur --no-dereference -- qemu.upstream/include/qemu/id.h qemu/include/qemu/id.h --- qemu.upstream/include/qemu/id.h +++ qemu/include/qemu/id.h @@ -1,6 +1,9 @@ #ifndef QEMU_ID_H #define QEMU_ID_H +#ifdef ID_MAX /* Conflict with Sortix */ +#undef ID_MAX +#endif typedef enum IdSubSystems { ID_QDEV, ID_BLOCK, diff -Paur --no-dereference -- qemu.upstream/include/qemu/osdep.h qemu/include/qemu/osdep.h --- qemu.upstream/include/qemu/osdep.h +++ qemu/include/qemu/osdep.h @@ -131,6 +131,73 @@ #ifndef TIME_MAX #define TIME_MAX LONG_MAX #endif +#ifdef __sortix__ +#ifndef O_DSYNC +#define O_SYNC 0 +#endif +#ifndef O_DIRECT +#define O_DIRECT 0 +#endif +#ifndef PATH_MAX +#define PATH_MAX 4096 +#define PATH_MAX_IS_FAKE +#endif +#ifndef FILENAME_MAX +#define FILENAME_MAX 256 +#endif +typedef unsigned char u_char; +typedef unsigned short u_short; +typedef unsigned int u_int; +typedef unsigned long u_long; +typedef void* caddr_t; +/* PATCH: Sortix doesn't have file descriptor passing yet. */ +#ifndef CMSG_DATA +#define __CMSG_LEN(cmsg) (((cmsg)->cmsg_len + sizeof(long) - 1) & ~(long)(sizeof(long) - 1)) +#define __CMSG_NEXT(cmsg) ((unsigned char *)(cmsg) + __CMSG_LEN(cmsg)) +#define __MHDR_END(mhdr) ((unsigned char *)(mhdr)->msg_control + (mhdr)->msg_controllen) + +#define CMSG_DATA(cmsg) ((unsigned char *) (((struct cmsghdr *)(cmsg)) + 1)) +#define CMSG_NXTHDR(mhdr, cmsg) ((cmsg)->cmsg_len < sizeof (struct cmsghdr) || \ + __CMSG_LEN(cmsg) + sizeof(struct cmsghdr) >= __MHDR_END(mhdr) - (unsigned char *)(cmsg) \ + ? 0 : (struct cmsghdr *)__CMSG_NEXT(cmsg)) +#define CMSG_FIRSTHDR(mhdr) ((size_t) (mhdr)->msg_controllen >= sizeof (struct cmsghdr) ? (struct cmsghdr *) (mhdr)->msg_control : (struct cmsghdr *) 0) + +#define CMSG_ALIGN(len) (((len) + sizeof (size_t) - 1) & (size_t) ~(sizeof (size_t) - 1)) +#define CMSG_SPACE(len) (CMSG_ALIGN (len) + CMSG_ALIGN (sizeof (struct cmsghdr))) +#define CMSG_LEN(len) (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len)) +#endif +/* PATCH: Sortix only has the modern inet_pton and inet_ntop. */ +#define inet_aton(x, y) (inet_pton(AF_INET, (x), (y)) == 1 ? 1 : 0) +__attribute__((unused)) +static inline char* qemu_inet_ntoa(struct in_addr in) +{ + static char buffer[INET_ADDRSTRLEN]; + inet_ntop(AF_INET, &in, buffer, sizeof(buffer)); + return buffer; +} +#define inet_ntoa qemu_inet_ntoa +/* PATCH: Sortix doesn't have PATH_MAX and realpath with buffer is undefined. */ +#ifdef PATH_MAX_IS_FAKE +__attribute__((unused)) +static inline char* realpathmax(const char* path, char* dest) +{ + char* result = realpath(path, NULL); + if (!result) + return NULL; + if (!dest) + return result; + if (PATH_MAX <= strlen(result)) { + errno = ENAMETOOLONG; + free(result); + return NULL; + } + strcpy(dest, result); + free(result); + return dest; +} +#define realpath realpathmax +#endif +#endif /* HOST_LONG_BITS is the size of a native pointer in bits. */ #if UINTPTR_MAX == UINT32_MAX @@ -291,6 +358,12 @@ #define FMT_pid "%ld" #elif defined(WIN64) #define FMT_pid "%" PRId64 +#elif defined(__sortix__) +#ifdef PRIdPID +#define FMT_pid "%" PRIdPID +#else +#define FMT_pid "%ld" +#endif #else #define FMT_pid "%d" #endif @@ -312,9 +385,12 @@ ssize_t writev(int fd, const struct iovec *iov, int iov_cnt); #else #include +#ifndef IOV_MAX +#define IOV_MAX 1024 +#endif #endif -#ifdef _WIN32 +#if defined(_WIN32) static inline void qemu_timersub(const struct timeval *val1, const struct timeval *val2, struct timeval *res) @@ -328,6 +404,18 @@ } } #else +#if !defined(timersub) /* From musl: */ +#define timerisset(t) ((t)->tv_sec || (t)->tv_usec) +#define timerclear(t) ((t)->tv_sec = (t)->tv_usec = 0) +#define timercmp(s,t,op) ((s)->tv_sec == (t)->tv_sec ? \ + (s)->tv_usec op (t)->tv_usec : (s)->tv_sec op (t)->tv_sec) +#define timeradd(s,t,a) (void) ( (a)->tv_sec = (s)->tv_sec + (t)->tv_sec, \ + ((a)->tv_usec = (s)->tv_usec + (t)->tv_usec) >= 1000000 && \ + ((a)->tv_usec -= 1000000, (a)->tv_sec++) ) +#define timersub(s,t,a) (void) ( (a)->tv_sec = (s)->tv_sec - (t)->tv_sec, \ + ((a)->tv_usec = (s)->tv_usec - (t)->tv_usec) < 0 && \ + ((a)->tv_usec += 1000000, (a)->tv_sec--) ) +#endif #define qemu_timersub timersub #endif diff -Paur --no-dereference -- qemu.upstream/main-loop.c qemu/main-loop.c --- qemu.upstream/main-loop.c +++ qemu/main-loop.c @@ -83,7 +83,9 @@ */ sigemptyset(&set); sigaddset(&set, SIG_IPI); +#ifdef SIGIO sigaddset(&set, SIGIO); +#endif sigaddset(&set, SIGALRM); sigaddset(&set, SIGBUS); /* SIGINT cannot be handled via signalfd, so that ^C can be used diff -Paur --no-dereference -- qemu.upstream/Makefile qemu/Makefile --- qemu.upstream/Makefile +++ qemu/Makefile @@ -396,6 +396,7 @@ rm -f config.log rm -f linux-headers/asm rm -f qemu-tech.info qemu-tech.aux qemu-tech.cp qemu-tech.dvi qemu-tech.fn qemu-tech.info qemu-tech.ky qemu-tech.log qemu-tech.pdf qemu-tech.pg qemu-tech.toc qemu-tech.tp qemu-tech.vr + rm -f trace-events-all qemu-version.h.tmp for d in $(TARGET_DIRS); do \ rm -rf $$d || exit 1 ; \ done diff -Paur --no-dereference -- qemu.upstream/migration/savevm.c qemu/migration/savevm.c --- qemu.upstream/migration/savevm.c +++ qemu/migration/savevm.c @@ -1278,7 +1278,7 @@ * a hostpage on it's own. */ error_report("Postcopy needs matching host page sizes (s=%d d=%d)", - (int)remote_hps, getpagesize()); + (int)remote_hps, (int)getpagesize()); return -1; } diff -Paur --no-dereference -- qemu.upstream/net/Makefile.objs qemu/net/Makefile.objs --- qemu.upstream/net/Makefile.objs +++ qemu/net/Makefile.objs @@ -10,6 +10,7 @@ common-obj-$(CONFIG_SOLARIS) += tap-solaris.o common-obj-$(CONFIG_AIX) += tap-aix.o common-obj-$(CONFIG_HAIKU) += tap-haiku.o +common-obj-$(CONFIG_SORTIX) += tap-haiku.o common-obj-$(CONFIG_SLIRP) += slirp.o common-obj-$(CONFIG_VDE) += vde.o common-obj-$(CONFIG_NETMAP) += netmap.o diff -Paur --no-dereference -- qemu.upstream/net/net.c qemu/net/net.c --- qemu.upstream/net/net.c +++ qemu/net/net.c @@ -102,7 +102,6 @@ int parse_host_port(struct sockaddr_in *saddr, const char *str) { char buf[512]; - struct hostent *he; const char *p, *r; int port; @@ -113,14 +112,12 @@ if (buf[0] == '\0') { saddr->sin_addr.s_addr = 0; } else { - if (qemu_isdigit(buf[0])) { - if (!inet_aton(buf, &saddr->sin_addr)) - return -1; - } else { - if ((he = gethostbyname(buf)) == NULL) - return - 1; - saddr->sin_addr = *(struct in_addr *)he->h_addr; - } + struct addrinfo hint = { 0 }; + hint.ai_family = AF_INET; + struct addrinfo* ai; + if (getaddrinfo(buf, NULL, &hint, &ai) != 0) + return -1; + saddr->sin_addr = ((struct sockaddr_in*)ai->ai_addr)->sin_addr; } port = strtol(p, (char **)&r, 0); if (r == p) diff -Paur --no-dereference -- qemu.upstream/net/socket.c qemu/net/socket.c --- qemu.upstream/net/socket.c +++ qemu/net/socket.c @@ -211,14 +211,18 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr *localaddr) { +#ifdef IP_ADD_MEMBERSHIP struct ip_mreq imr; +#endif int fd; int val, ret; +#ifdef IP_MULTICAST_LOOP #ifdef __OpenBSD__ unsigned char loop; #else int loop; #endif +#endif if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) { fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) " @@ -252,6 +256,7 @@ goto fail; } +#ifdef IP_ADD_MEMBERSHIP /* Add host to multicast group */ imr.imr_multiaddr = mcastaddr->sin_addr; if (localaddr) { @@ -266,8 +271,10 @@ perror("setsockopt(IP_ADD_MEMBERSHIP)"); goto fail; } +#endif /* Force mcast msgs to loopback (eg. several QEMUs in same host */ +#ifdef IP_MULTICAST_LOOP loop = 1; ret = qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)); @@ -275,7 +282,9 @@ perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)"); goto fail; } +#endif +#ifdef IP_MULTICAST_IF /* If a bind address is given, only send packets from that address */ if (localaddr != NULL) { ret = qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, @@ -285,6 +294,7 @@ goto fail; } } +#endif qemu_set_nonblock(fd); return fd; @@ -590,7 +600,7 @@ return -1; if (localaddr_str != NULL) { - if (inet_aton(localaddr_str, &localaddr) == 0) + if (inet_pton(AF_INET, localaddr_str, &localaddr) < 1) return -1; param_localaddr = &localaddr; } else { diff -Paur --no-dereference -- qemu.upstream/net/tap.c qemu/net/tap.c --- qemu.upstream/net/tap.c +++ qemu/net/tap.c @@ -30,7 +30,15 @@ #include #include #include +#if __has_include() #include +#endif +#if defined(__sortix__) && !defined(IF_NAMESIZE) +#define IF_NAMESIZE 32 +#endif +#if !defined(IFNAMSIZ) && defined(IF_NAMESIZE) +#define IFNAMSIZ IF_NAMESIZE +#endif #include "net/net.h" #include "clients.h" diff -Paur --no-dereference -- qemu.upstream/net/tap-haiku.c qemu/net/tap-haiku.c --- qemu.upstream/net/tap-haiku.c +++ qemu/net/tap-haiku.c @@ -29,7 +29,11 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required, int mq_required, Error **errp) { +#ifdef __sortix__ + error_setg(errp, "no tap on Sortix"); +#else error_setg(errp, "no tap on Haiku"); +#endif return -1; } diff -Paur --no-dereference -- qemu.upstream/os-posix.c qemu/os-posix.c --- qemu.upstream/os-posix.c +++ qemu/os-posix.c @@ -169,16 +169,18 @@ { if (user_pwd) { if (setgid(user_pwd->pw_gid) < 0) { - fprintf(stderr, "Failed to setgid(%d)\n", user_pwd->pw_gid); + fprintf(stderr, "Failed to setgid(%jd)\n", (intmax_t)user_pwd->pw_gid); exit(1); } +#if !defined(__sortix__) if (initgroups(user_pwd->pw_name, user_pwd->pw_gid) < 0) { - fprintf(stderr, "Failed to initgroups(\"%s\", %d)\n", - user_pwd->pw_name, user_pwd->pw_gid); + fprintf(stderr, "Failed to initgroups(\"%s\", %jd)\n", + user_pwd->pw_name, (intmax_t)user_pwd->pw_gid); exit(1); } +#endif if (setuid(user_pwd->pw_uid) < 0) { - fprintf(stderr, "Failed to setuid(%d)\n", user_pwd->pw_uid); + fprintf(stderr, "Failed to setuid(%jd)\n", (intmax_t)user_pwd->pw_uid); exit(1); } if (setuid(0) != -1) { @@ -308,10 +310,12 @@ if (fd == -1) { return -1; } +#ifdef F_TLOCK if (lockf(fd, F_TLOCK, 0) == -1) { close(fd); return -1; } +#endif len = snprintf(buffer, sizeof(buffer), FMT_pid "\n", getpid()); if (write(fd, buffer, len) != len) { close(fd); @@ -331,10 +335,12 @@ { int ret = 0; +#if defined(MCL_CURRENT) && defined(MCL_FUTURE) ret = mlockall(MCL_CURRENT | MCL_FUTURE); if (ret < 0) { perror("mlockall"); } +#endif return ret; } diff -Paur --no-dereference -- qemu.upstream/pc-bios/optionrom/kvmvapic.S qemu/pc-bios/optionrom/kvmvapic.S --- qemu.upstream/pc-bios/optionrom/kvmvapic.S +++ qemu/pc-bios/optionrom/kvmvapic.S @@ -104,7 +104,8 @@ reenable_vtpr push %ecx - fs/movzbl pcr_cpu, %eax + # PATCH: Work around Sortix as(1) considering slashes as comment starters. + fs movzbl pcr_cpu, %eax mov vcpu_shift, %ecx ; fixup shl %cl, %eax @@ -178,7 +179,7 @@ reenable_vtpr mp_set_tpr_failed: - fs/movzbl pcr_cpu, %edx + fs movzbl pcr_cpu, %edx mov vcpu_shift, %ecx ; fixup shl %cl, %edx diff -Paur --no-dereference -- qemu.upstream/pc-bios/optionrom/Makefile qemu/pc-bios/optionrom/Makefile --- qemu.upstream/pc-bios/optionrom/Makefile +++ qemu/pc-bios/optionrom/Makefile @@ -5,6 +5,13 @@ include ../../config-host.mak include $(SRC_PATH)/rules.mak +# TODO: Use system as because the cross as is version 2.24 and appears to have +# problems assembling these roms correctly. linuxboot_dma.c uses the gcc +# driver but contains inline assembly but fails with the cross as for the +# same reason, so use system gcc instead as it will run the system as. +CC = $(HOST_CC) +AS = as + $(call set-vpath, $(SRC_PATH)/pc-bios/optionrom) .PHONY : all clean build-all @@ -33,8 +40,11 @@ QEMU_INCLUDES += -I$(SRC_PATH) Wa = -Wa, -ASFLAGS += -32 -QEMU_CFLAGS += $(call cc-c-option, $(QEMU_CFLAGS), $(Wa)-32) +# PATCH: Sortix as(1) currently considers slashes as a comment starter, which +# should be fixed, but until then turn that behavior off as slashes are used for +# division in this assembly. +ASFLAGS += -32 --divide +QEMU_CFLAGS += $(call cc-c-option, $(QEMU_CFLAGS), $(Wa)-32 $(Wa)--divide) build-all: multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin diff -Paur --no-dereference -- qemu.upstream/qemu-char.c qemu/qemu-char.c --- qemu.upstream/qemu-char.c +++ qemu/qemu-char.c @@ -50,7 +50,10 @@ #include #include #include +/* PATCH: Until Sortix networking is merged. */ +#if __has_include() #include +#endif #include #include #include diff -Paur --no-dereference -- qemu.upstream/scripts/qapi.py qemu/scripts/qapi.py --- qemu.upstream/scripts/qapi.py +++ qemu/scripts/qapi.py @@ -12,7 +12,8 @@ # See the COPYING file in the top-level directory. import re -from ordereddict import OrderedDict +# PATCH: Valid Python 2 and 3. +from collections import OrderedDict import errno import getopt import os @@ -1356,7 +1357,7 @@ def _make_members(self, data, info): return [self._make_member(key, value, info) - for (key, value) in data.iteritems()] + for (key, value) in data.items()] def _def_struct_type(self, expr, info): name = expr['struct'] @@ -1388,11 +1389,11 @@ name, info, 'base', self._make_members(base, info))) if tag_name: variants = [self._make_variant(key, value) - for (key, value) in data.iteritems()] + for (key, value) in data.items()] members = [] else: variants = [self._make_simple_variant(key, value, info) - for (key, value) in data.iteritems()] + for (key, value) in data.items()] typ = self._make_implicit_enum_type(name, info, [v.name for v in variants]) tag_member = QAPISchemaObjectTypeMember('type', typ, False) @@ -1407,7 +1408,7 @@ name = expr['alternate'] data = expr['data'] variants = [self._make_variant(key, value) - for (key, value) in data.iteritems()] + for (key, value) in data.items()] tag_member = QAPISchemaObjectTypeMember('type', 'QType', False) self._def_entity( QAPISchemaAlternateType(name, info, @@ -1516,7 +1517,11 @@ type_name = prefix return camel_to_upper(type_name) + '_' + c_name(const_name, False).upper() -c_name_trans = string.maketrans('.-', '__') +# PATCH: Python 3 with a Python 2 fallback +try: + c_name_trans = str.maketrans('.-', '__') +except: + c_name_trans = string.maketrans('.-', '__') # Map @name to a valid C identifier. @@ -1778,8 +1783,13 @@ if really: return open(name, opt) else: - import StringIO - return StringIO.StringIO() + # PATCH: Python 2 with Python 3 fallback. + try: + import StringIO + return StringIO.StringIO() + except: + import io + return io.StringIO() fdef = maybe_open(do_c, c_file, 'w') fdecl = maybe_open(do_h, h_file, 'w') diff -Paur --no-dereference -- qemu.upstream/scripts/signrom.py qemu/scripts/signrom.py --- qemu.upstream/scripts/signrom.py +++ qemu/scripts/signrom.py @@ -18,7 +18,7 @@ fout = open(sys.argv[2], 'wb') magic = fin.read(2) -if magic != '\x55\xaa': +if magic != b'\x55\xaa': sys.exit("%s: option ROM does not begin with magic 55 aa" % sys.argv[1]) size_byte = ord(fin.read(1)) @@ -33,7 +33,7 @@ # Add padding if necessary, rounding the whole input to a multiple of # 512 bytes according to the third byte of the input. # size-1 because a final byte is added below to store the checksum. - data = data.ljust(size-1, '\0') + data = data.ljust(size-1, b'\0') else: if ord(data[-1:]) != 0: sys.stderr.write('WARNING: ROM includes nonzero checksum\n') diff -Paur --no-dereference -- qemu.upstream/scripts/tracetool/backend/log.py qemu/scripts/tracetool/backend/log.py --- qemu.upstream/scripts/tracetool/backend/log.py +++ qemu/scripts/tracetool/backend/log.py @@ -39,8 +39,8 @@ out(' if (%(cond)s) {', ' struct timeval _now;', ' gettimeofday(&_now, NULL);', - ' qemu_log_mask(LOG_TRACE, "%%d@%%zd.%%06zd:%(name)s " %(fmt)s "\\n",', - ' getpid(),', + ' qemu_log_mask(LOG_TRACE, "%%jd@%%zd.%%06zd:%(name)s " %(fmt)s "\\n",', + ' (intmax_t)getpid(),', ' (size_t)_now.tv_sec, (size_t)_now.tv_usec', ' %(argnames)s);', ' }', diff -Paur --no-dereference -- qemu.upstream/slirp/ip6_icmp.c qemu/slirp/ip6_icmp.c --- qemu.upstream/slirp/ip6_icmp.c +++ qemu/slirp/ip6_icmp.c @@ -10,6 +10,10 @@ #include "qemu/error-report.h" #include "qemu/log.h" +#ifndef IPPROTO_ICMPV6 +#define IPPROTO_ICMPV6 58 +#endif + #define NDP_Interval g_rand_int_range(slirp->grand, \ NDP_MinRtrAdvInterval, NDP_MaxRtrAdvInterval) diff -Paur --no-dereference -- qemu.upstream/slirp/ip6_input.c qemu/slirp/ip6_input.c --- qemu.upstream/slirp/ip6_input.c +++ qemu/slirp/ip6_input.c @@ -7,6 +7,10 @@ #include "slirp.h" #include "ip6_icmp.h" +#ifndef IPPROTO_ICMPV6 +#define IPPROTO_ICMPV6 58 +#endif + /* * IP initialization: fill in IP protocol switch table. * All protocols not implemented in kernel go to raw IP protocol handler. diff -Paur --no-dereference -- qemu.upstream/slirp/mbuf.c qemu/slirp/mbuf.c --- qemu.upstream/slirp/mbuf.c +++ qemu/slirp/mbuf.c @@ -159,12 +159,12 @@ if(m->m_size>size) return; if (m->m_flags & M_EXT) { - datasize = m->m_data - m->m_ext; + datasize = (char*)m->m_data - m->m_ext; m->m_ext = (char *)realloc(m->m_ext,size); m->m_data = m->m_ext + datasize; } else { char *dat; - datasize = m->m_data - m->m_dat; + datasize = (char*)m->m_data - m->m_dat; dat = (char *)malloc(size); memcpy(dat, m->m_dat, m->m_size); diff -Paur --no-dereference -- qemu.upstream/slirp/mbuf.h qemu/slirp/mbuf.h --- qemu.upstream/slirp/mbuf.h +++ qemu/slirp/mbuf.h @@ -53,9 +53,9 @@ * How much room is in the mbuf, from m_data to the end of the mbuf */ #define M_ROOM(m) ((m->m_flags & M_EXT)? \ - (((m)->m_ext + (m)->m_size) - (m)->m_data) \ + (((m)->m_ext + (m)->m_size) - (char*)((m)->m_data)) \ : \ - (((m)->m_dat + (m)->m_size) - (m)->m_data)) + (((m)->m_dat + (m)->m_size) - (char*)((m)->m_data))) /* * How much free room there is @@ -75,7 +75,7 @@ int m_size; /* Size of data */ struct socket *m_so; - caddr_t m_data; /* Location of data */ + char* m_data; /* Location of data */ int m_len; /* Amount of data in this mbuf */ Slirp *slirp; diff -Paur --no-dereference -- qemu.upstream/slirp/misc.c qemu/slirp/misc.c --- qemu.upstream/slirp/misc.c +++ qemu/slirp/misc.c @@ -144,8 +144,7 @@ dup2(s, 0); dup2(s, 1); dup2(s, 2); - for (s = getdtablesize() - 1; s >= 3; s--) - close(s); + closefrom(3); i = 0; bptr = g_strdup(ex); /* No need to free() this */ diff -Paur --no-dereference -- qemu.upstream/slirp/slirp.c qemu/slirp/slirp.c --- qemu.upstream/slirp/slirp.c +++ qemu/slirp/slirp.c @@ -31,8 +31,13 @@ #include "qemu/cutils.h" #ifndef _WIN32 +#if __has_include() #include #endif +#if __has_include() +#include +#endif +#endif /* host loopback address */ struct in_addr loopback_addr; @@ -49,6 +54,7 @@ static QTAILQ_HEAD(slirp_instances, Slirp) slirp_instances = QTAILQ_HEAD_INITIALIZER(slirp_instances); +#if !__has_include() static struct in_addr dns_addr; #ifndef _WIN32 static struct in6_addr dns6_addr; @@ -57,6 +63,7 @@ #ifndef _WIN32 static u_int dns6_addr_time; #endif +#endif #define TIMEOUT_FAST 2 /* milliseconds */ #define TIMEOUT_SLOW 499 /* milliseconds */ @@ -120,6 +127,39 @@ WSACleanup(); } +#elif __has_include() + +/* TODO: This only uses the first suitable DNS server. */ + +int get_dns_addr(struct in_addr *pdns_addr) +{ + struct dnsconfig cfg; + if (getdnsconfig(&cfg) < 0) { + return -1; + } + for (size_t i = 0; i < cfg.servers_count; i++) { + if (cfg.servers[i].family != AF_INET) continue; + pdns_addr->s_addr = cfg.servers[i].addr.in.s_addr; + return 1; + } + return -1; +} + +int get_dns6_addr(struct in6_addr *pdns6_addr, uint32_t *scope_id) +{ + struct dnsconfig cfg; + if (getdnsconfig(&cfg) < 0) { + return -1; + } + for (size_t i = 0; i < cfg.servers_count; i++) { + if (cfg.servers[i].family != AF_INET6) continue; + memcpy(pdns6_addr, &cfg.servers[i].addr.in6, sizeof(struct in6_addr)); + *scope_id = 0; + return 1; + } + return -1; +} + #else static int get_dns_addr_cached(void *pdns_addr, void *cached_addr, @@ -167,7 +207,12 @@ if (sscanf(buff, "nameserver%*[ \t]%256s", buff2) == 1) { char *c = strchr(buff2, '%'); if (c) { +#if __has_include() if_index = if_nametoindex(c + 1); +#else + errno = ENOSYS; + if_index = 0; +#endif *c = '\0'; } else { if_index = 0; diff -Paur --no-dereference -- qemu.upstream/slirp/socket.c qemu/slirp/socket.c --- qemu.upstream/slirp/socket.c +++ qemu/slirp/socket.c @@ -522,10 +522,14 @@ */ len = M_FREEROOM(m); /* if (so->so_fport != htons(53)) { */ +#ifdef FIONREAD ioctlsocket(so->s, FIONREAD, &n); +#else + n = 65527; +#endif if (n > len) { - n = (m->m_data - m->m_dat) + m->m_len + n + 1; + n = ((char*)m->m_data - m->m_dat) + m->m_len + n + 1; m_inc(m, n); len = M_FREEROOM(m); } diff -Paur --no-dereference -- qemu.upstream/tests/Makefile.include qemu/tests/Makefile.include --- qemu.upstream/tests/Makefile.include +++ qemu/tests/Makefile.include @@ -645,7 +645,7 @@ rmdir $(INITRD_WORK_DIR) ifeq ($(CONFIG_POSIX),y) -LIBS += -lutil +#LIBS += -lutil endif # QTest rules diff -Paur --no-dereference -- qemu.upstream/ui/curses.c qemu/ui/curses.c --- qemu.upstream/ui/curses.c +++ qemu/ui/curses.c @@ -114,12 +114,7 @@ static volatile sig_atomic_t got_sigwinch; static void curses_winch_check(void) { - struct winsize { - unsigned short ws_row; - unsigned short ws_col; - unsigned short ws_xpixel; /* unused */ - unsigned short ws_ypixel; /* unused */ - } ws; + struct winsize ws; if (!got_sigwinch) { return; @@ -130,7 +125,11 @@ return; } +/* PATCH: libcurses seems to be out of date, newer NetBSD libcurses seems to + have resize_term. */ +#if !defined(__sortix__) resize_term(ws.ws_row, ws.ws_col); +#endif invalidate = 1; } diff -Paur --no-dereference -- qemu.upstream/ui/sdl.c qemu/ui/sdl.c --- qemu.upstream/ui/sdl.c +++ qemu/ui/sdl.c @@ -210,7 +210,7 @@ /* specific keyboard conversions from scan codes */ -#if defined(_WIN32) +#if defined(_WIN32) || defined(__sortix__) static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev) { diff -Paur --no-dereference -- qemu.upstream/ui/vnc.c qemu/ui/vnc.c --- qemu.upstream/ui/vnc.c +++ qemu/ui/vnc.c @@ -2481,10 +2481,8 @@ { int i; - srand(time(NULL)+getpid()+getpid()*987654+rand()); - for (i = 0 ; i < sizeof(vs->challenge) ; i++) - vs->challenge[i] = (int) (256.0*rand()/(RAND_MAX+1.0)); + vs->challenge[i] = (int) (256.0*arc4random()/(UINT32_MAX+1.0)); } static int protocol_client_auth_vnc(VncState *vs, uint8_t *data, size_t len) diff -Paur --no-dereference -- qemu.upstream/ui/vnc-enc-tight.c qemu/ui/vnc-enc-tight.c --- qemu.upstream/ui/vnc-enc-tight.c +++ qemu/ui/vnc-enc-tight.c @@ -40,6 +40,12 @@ #include #endif #ifdef CONFIG_VNC_JPEG +/* PATCH: libglib's FALSE and TRUE definitions collide with libjpeg's enum + boolean because everything is terrible and everyone should be ashamed + of themselves. The HAVE_BOOLEAN macro intended to work around this + situation doesn't work. */ +#undef FALSE +#undef TRUE #include #endif diff -Paur --no-dereference -- qemu.upstream/util/compatfd.c qemu/util/compatfd.c --- qemu.upstream/util/compatfd.c +++ qemu/util/compatfd.c @@ -31,6 +31,11 @@ struct sigfd_compat_info *info = opaque; while (1) { +/* PATCH: Sortix doesn't have sigwait() yet. */ +#if defined(__sortix__) + (void) info; + sleep(1); +#else int sig; int err; @@ -63,7 +68,9 @@ offset += len; } } +#endif } + return NULL; } static int qemu_signalfd_compat(const sigset_t *mask) diff -Paur --no-dereference -- qemu.upstream/util/coroutine-sigaltstack.c qemu/util/coroutine-sigaltstack.c --- qemu.upstream/util/coroutine-sigaltstack.c +++ qemu/util/coroutine-sigaltstack.c @@ -203,7 +203,13 @@ * called. */ coTS->tr_called = 0; +#if defined(__sortix__) + pthread_sigmask(SIG_UNBLOCK, &sigs, NULL); + raise(SIGUSR2); + pthread_sigmask(SIG_BLOCK, &sigs, NULL); +#else pthread_kill(pthread_self(), SIGUSR2); +#endif sigfillset(&sigs); sigdelset(&sigs, SIGUSR2); while (!coTS->tr_called) { diff -Paur --no-dereference -- qemu.upstream/util/oslib-posix.c qemu/util/oslib-posix.c --- qemu.upstream/util/oslib-posix.c +++ qemu/util/oslib-posix.c @@ -37,7 +37,7 @@ #include "qapi/error.h" #include "qemu/sockets.h" #include -#include +#include #include "qemu/cutils.h" #ifdef CONFIG_LINUX @@ -61,7 +61,36 @@ int qemu_daemon(int nochdir, int noclose) { +#if defined(__sortix__) /* From musl: */ + if (!nochdir && chdir("/")) + return -1; + if (!noclose) { + int fd, failed = 0; + if ((fd = open("/dev/null", O_RDWR)) < 0) return -1; + if (dup2(fd, 0) < 0 || dup2(fd, 1) < 0 || dup2(fd, 2) < 0) + failed++; + if (fd > 2) close(fd); + if (failed) return -1; + } + + switch(fork()) { + case 0: break; + case -1: return -1; + default: _exit(0); + } + + if (setsid() < 0) return -1; + + switch(fork()) { + case 0: break; + case -1: return -1; + default: _exit(0); + } + + return 0; +#else return daemon(nochdir, noclose); +#endif } void *qemu_oom_check(void *ptr) @@ -90,6 +119,9 @@ } #elif defined(CONFIG_BSD) ptr = valloc(size); +#elif defined(__sortix__) + /* TODO: Sortix doesn't have memalign, hope 16-byte alignment is fine. */ + ptr = malloc(size); #else ptr = memalign(alignment, size); #endif @@ -189,6 +221,9 @@ int qemu_utimens(const char *path, const struct timespec *times) { +#if defined(__sortix__) + return utimens(path, times); +#else struct timeval tv[2], tv_now; struct stat st; int i; @@ -232,6 +267,7 @@ } return utimes(path, &tv[0]); +#endif } char * diff -Paur --no-dereference -- qemu.upstream/util/path.c qemu/util/path.c --- qemu.upstream/util/path.c +++ qemu/util/path.c @@ -4,7 +4,6 @@ The assumption is that this area does not change. */ #include "qemu/osdep.h" -#include #include #include "qemu-common.h" #include "qemu/cutils.h" diff -Paur --no-dereference -- qemu.upstream/util/qemu-openpty.c qemu/util/qemu-openpty.c --- qemu.upstream/util/qemu-openpty.c +++ qemu/util/qemu-openpty.c @@ -47,6 +47,9 @@ #elif defined CONFIG_SOLARIS # include # include +#elif defined(__sortix__) +# include +# include #else # include #endif @@ -93,7 +96,10 @@ close(mfd); return -1; } +#endif +// TODO: Sortix cfmakeraw. +#if defined(__sun__) || defined(__sortix__) static void cfmakeraw (struct termios *termios_p) { termios_p->c_iflag &= diff -Paur --no-dereference -- qemu.upstream/util/rcu.c qemu/util/rcu.c --- qemu.upstream/util/rcu.c +++ qemu/util/rcu.c @@ -319,6 +319,10 @@ rcu_register_thread(); } +#if defined(__sortix__) +#undef CONFIG_POSIX +#endif + #ifdef CONFIG_POSIX static void rcu_init_lock(void) {