sortix-mirror/ports/qemu/qemu.patch
Jonas 'Sortie' Termansen 9588b0d3db Add ports to the Sortix repository.
This change imports the ports collection from the former porttix and srctix
repositories and converts them to port(5) files with metadata pointing to
the upstream release tarballs with patches checked into this repository.
Ports are now developed and versioned along with the operating system and
are automatically built per the PACKAGES environment variable. The patches
are licensed under the same license as the relevant ports.

Tix has gained support for the new port(5) format. tix-port(8) is the new
high level ports build even point that handles downloading pstream releases
into the new mirror cache directory, applying the patches, building the port
with the lower-level tix-build(8), and finally installing the binary
package. The new tix-vars(8) program parses port(5) files and the new
tix-rmdiff(8) program produces input for tix-rmpatch(8).

The old doc/ directory is discontinued in favor of manual pages documenting
the new ports system.

The obsolete porttix-create(8) and srctix-create(8) programs are removed.
2022-06-13 22:29:53 +02:00

1279 lines
37 KiB
Diff

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 <sys/diskslice.h>
#endif
+#include <sys/ioctl.h>
+
#ifdef CONFIG_XFS
#include <xfs/xfs.h>
#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 <curses.h>
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 <curl/curl.h>
@@ -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 <sys/types.h> */
+#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 <sys/uio.h>
+#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 <sys/ioctl.h>
#include <sys/wait.h>
#include <sys/socket.h>
+#if __has_include(<net/if.h>)
#include <net/if.h>
+#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 <sys/resource.h>
#include <sys/socket.h>
#include <netinet/in.h>
+/* PATCH: Until Sortix networking is merged. */
+#if __has_include(<net/if.h>)
#include <net/if.h>
+#endif
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/select.h>
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(<net/if.h>)
#include <net/if.h>
#endif
+#if __has_include(<sys/dnsconfig.h>)
+#include <sys/dnsconfig.h>
+#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(<sys/dnsconfig.h>)
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(<sys/dnsconfig.h>)
+
+/* 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(<net/if.h>)
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 <png.h>
#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 <jpeglib.h>
#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 <libgen.h>
-#include <sys/signal.h>
+#include <signal.h>
#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 <sys/param.h>
#include <dirent.h>
#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 <termios.h>
# include <stropts.h>
+#elif defined(__sortix__)
+# include <termios.h>
+# include <pty.h>
#else
# include <termios.h>
#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)
{