mirror of
https://gitlab.redox-os.org/redox-os/redox.git
synced 2026-06-26 23:04:19 +08:00
WIP: Qemu
This commit is contained in:
parent
26d207c535
commit
4e37d54d8f
43
recipes/qemu/recipe.sh
Normal file
43
recipes/qemu/recipe.sh
Normal file
@ -0,0 +1,43 @@
|
||||
VERSION=3.1.0
|
||||
TAR=https://download.qemu.org/qemu-$VERSION.tar.xz
|
||||
BUILD_DEPENDS=(curl glib libiconv libpng pcre pixman sdl zlib)
|
||||
|
||||
function recipe_version {
|
||||
echo "$VERSION"
|
||||
skip=1
|
||||
}
|
||||
|
||||
function recipe_update {
|
||||
echo "skipping update"
|
||||
skip=1
|
||||
}
|
||||
|
||||
function recipe_build {
|
||||
sysroot="$(realpath ../sysroot)"
|
||||
export CFLAGS="-I$sysroot/include"
|
||||
export CPPFLAGS="-I$sysroot/include"
|
||||
export LDFLAGS="-L$sysroot/lib"
|
||||
./configure \
|
||||
--host="${HOST}" \
|
||||
--prefix=/
|
||||
make -j"$(nproc)"
|
||||
skip=1
|
||||
}
|
||||
|
||||
function recipe_test {
|
||||
echo "skipping test"
|
||||
skip=1
|
||||
}
|
||||
|
||||
function recipe_clean {
|
||||
make clean
|
||||
skip=1
|
||||
}
|
||||
|
||||
function recipe_stage {
|
||||
#export LLVM_CONFIG="x86_64-unknown-redox-llvm-config"
|
||||
dest="$(realpath $1)"
|
||||
make DESTDIR="$dest" install
|
||||
rm -f "$dest/lib/"*.la
|
||||
skip=1
|
||||
}
|
||||
308
recipes/qemu/redox.patch
Normal file
308
recipes/qemu/redox.patch
Normal file
@ -0,0 +1,308 @@
|
||||
diff -ruwN source/block/file-posix.c source-new/block/file-posix.c
|
||||
--- source/block/file-posix.c 2019-01-13 08:23:04.772397346 -0700
|
||||
+++ source-new/block/file-posix.c 2019-01-13 10:40:35.102453914 -0700
|
||||
@@ -258,6 +258,7 @@
|
||||
int i;
|
||||
|
||||
errno = ENOTSUP;
|
||||
+#if !defined(__redox__)
|
||||
static const unsigned long ioctl_list[] = {
|
||||
#ifdef BLKSSZGET
|
||||
BLKSSZGET,
|
||||
@@ -277,6 +278,7 @@
|
||||
success = true;
|
||||
}
|
||||
}
|
||||
+#endif
|
||||
|
||||
return success ? 0 : -errno;
|
||||
}
|
||||
@@ -1154,6 +1156,9 @@
|
||||
|
||||
static ssize_t handle_aiocb_ioctl(RawPosixAIOData *aiocb)
|
||||
{
|
||||
+#if defined(__redox__)
|
||||
+ return -ENOTSUP
|
||||
+#else
|
||||
int ret;
|
||||
|
||||
ret = ioctl(aiocb->aio_fildes, aiocb->aio_ioctl_cmd, aiocb->aio_ioctl_buf);
|
||||
@@ -1162,6 +1167,7 @@
|
||||
}
|
||||
|
||||
return 0;
|
||||
+#endif
|
||||
}
|
||||
|
||||
static ssize_t handle_aiocb_flush(RawPosixAIOData *aiocb)
|
||||
diff -ruwN source/configure source-new/configure
|
||||
--- source/configure 2018-12-11 10:44:34.000000000 -0700
|
||||
+++ source-new/configure 2019-01-12 15:11:33.069669757 -0700
|
||||
@@ -649,6 +649,8 @@
|
||||
targetos='NetBSD'
|
||||
elif check_define __APPLE__; then
|
||||
targetos='Darwin'
|
||||
+elif check_define __redox__; then
|
||||
+ targetos='Redox'
|
||||
else
|
||||
# This is a fatal error, but don't report it yet, because we
|
||||
# might be going to just print the --help text, or it might
|
||||
@@ -3500,7 +3502,7 @@
|
||||
EOF
|
||||
|
||||
if ! compile_prog "$CFLAGS" "$LIBS" ; then
|
||||
- error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
|
||||
+ echo "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
|
||||
"You probably need to set PKG_CONFIG_LIBDIR"\
|
||||
"to point to the right pkg-config files for your"\
|
||||
"build target"
|
||||
diff -ruwN source/include/qom/cpu.h source-new/include/qom/cpu.h
|
||||
--- source/include/qom/cpu.h 2018-12-11 10:44:34.000000000 -0700
|
||||
+++ source-new/include/qom/cpu.h 2019-01-12 15:14:15.442350500 -0700
|
||||
@@ -30,6 +30,10 @@
|
||||
#include "qemu/queue.h"
|
||||
#include "qemu/thread.h"
|
||||
|
||||
+#if defined(__redox__)
|
||||
+#define sigjmp_buf jmp_buf
|
||||
+#endif
|
||||
+
|
||||
typedef int (*WriteCoreDumpFunction)(const void *buf, size_t size,
|
||||
void *opaque);
|
||||
|
||||
diff -ruwN source/io/channel-socket.c source-new/io/channel-socket.c
|
||||
--- source/io/channel-socket.c 2018-12-11 10:44:34.000000000 -0700
|
||||
+++ source-new/io/channel-socket.c 2019-01-13 08:54:26.951009516 -0700
|
||||
@@ -407,7 +407,7 @@
|
||||
}
|
||||
|
||||
|
||||
-#ifndef WIN32
|
||||
+#if !defined(WIN32) && !defined(__redox__)
|
||||
static void qio_channel_socket_copy_fds(struct msghdr *msg,
|
||||
int **fds, size_t *nfds)
|
||||
{
|
||||
@@ -554,7 +554,7 @@
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
-#else /* WIN32 */
|
||||
+#else /* WIN32 or __redox__ */
|
||||
static ssize_t qio_channel_socket_readv(QIOChannel *ioc,
|
||||
const struct iovec *iov,
|
||||
size_t niov,
|
||||
diff -ruwN source/util/compatfd.c source-new/util/compatfd.c
|
||||
--- source/util/compatfd.c 2018-12-11 10:44:35.000000000 -0700
|
||||
+++ source-new/util/compatfd.c 2019-01-12 16:24:40.146857753 -0700
|
||||
@@ -17,7 +17,9 @@
|
||||
#include "qemu-common.h"
|
||||
#include "qemu/thread.h"
|
||||
|
||||
+#if defined(CONFIG_SIGNALFD)
|
||||
#include <sys/syscall.h>
|
||||
+#endif
|
||||
|
||||
struct sigfd_compat_info
|
||||
{
|
||||
diff -ruwN source/util/coroutine-sigaltstack.c source-new/util/coroutine-sigaltstack.c
|
||||
--- source/util/coroutine-sigaltstack.c 2018-12-11 10:44:35.000000000 -0700
|
||||
+++ source-new/util/coroutine-sigaltstack.c 2019-01-13 10:38:32.279965167 -0700
|
||||
@@ -30,6 +30,12 @@
|
||||
#include "qemu-common.h"
|
||||
#include "qemu/coroutine_int.h"
|
||||
|
||||
+#if defined(__redox__)
|
||||
+#define sigjmp_buf jmp_buf
|
||||
+#define sigsetjmp(env, savesigs) setjmp(env)
|
||||
+#define siglongjmp longjmp
|
||||
+#endif
|
||||
+
|
||||
typedef struct {
|
||||
Coroutine base;
|
||||
void *stack;
|
||||
@@ -288,4 +294,3 @@
|
||||
|
||||
return s && s->current->caller;
|
||||
}
|
||||
-
|
||||
diff -ruwN source/util/iov.c source-new/util/iov.c
|
||||
--- source/util/iov.c 2018-12-11 10:44:35.000000000 -0700
|
||||
+++ source-new/util/iov.c 2019-01-12 16:32:12.067228460 -0700
|
||||
@@ -95,7 +95,7 @@
|
||||
static ssize_t
|
||||
do_send_recv(int sockfd, struct iovec *iov, unsigned iov_cnt, bool do_send)
|
||||
{
|
||||
-#ifdef CONFIG_POSIX
|
||||
+#if defined(CONFIG_POSIX) && !defined(__redox__)
|
||||
ssize_t ret;
|
||||
struct msghdr msg;
|
||||
memset(&msg, 0, sizeof(msg));
|
||||
diff -ruwN source/util/main-loop.c source-new/util/main-loop.c
|
||||
--- source/util/main-loop.c 2018-12-11 10:44:35.000000000 -0700
|
||||
+++ source-new/util/main-loop.c 2019-01-13 10:37:48.544674956 -0700
|
||||
@@ -35,6 +35,10 @@
|
||||
#include "block/aio.h"
|
||||
#include "qemu/error-report.h"
|
||||
|
||||
+#if defined(__redox__)
|
||||
+#define pthread_sigmask sigprocmask
|
||||
+#endif
|
||||
+
|
||||
#ifndef _WIN32
|
||||
|
||||
/* If we have signalfd, we mask out the signals we want to handle and then
|
||||
@@ -63,9 +67,12 @@
|
||||
}
|
||||
|
||||
sigaction(info.ssi_signo, NULL, &action);
|
||||
+#if !defined(__redox__)
|
||||
if ((action.sa_flags & SA_SIGINFO) && action.sa_sigaction) {
|
||||
sigaction_invoke(&action, &info);
|
||||
- } else if (action.sa_handler) {
|
||||
+ } else
|
||||
+#endif
|
||||
+ if (action.sa_handler) {
|
||||
action.sa_handler(info.ssi_signo);
|
||||
}
|
||||
}
|
||||
diff -ruwN source/util/osdep.c source-new/util/osdep.c
|
||||
--- source/util/osdep.c 2018-12-11 10:44:35.000000000 -0700
|
||||
+++ source-new/util/osdep.c 2019-01-13 09:31:50.920247468 -0700
|
||||
@@ -138,10 +138,12 @@
|
||||
goto fail;
|
||||
}
|
||||
|
||||
+#if !defined(__redox__)
|
||||
if ((flags & O_SYNC) != (dup_flags & O_SYNC)) {
|
||||
errno = EINVAL;
|
||||
goto fail;
|
||||
}
|
||||
+#endif
|
||||
|
||||
/* Set/unset flags that we can with fcntl */
|
||||
if (fcntl(ret, F_SETFL, flags) == -1) {
|
||||
@@ -236,6 +238,9 @@
|
||||
|
||||
static int qemu_lock_fcntl(int fd, int64_t start, int64_t len, int fl_type)
|
||||
{
|
||||
+#if defined(__redox__)
|
||||
+ return 0;
|
||||
+#else
|
||||
int ret;
|
||||
struct flock fl = {
|
||||
.l_whence = SEEK_SET,
|
||||
@@ -248,6 +253,7 @@
|
||||
ret = fcntl(fd, fcntl_op_setlk, &fl);
|
||||
} while (ret == -1 && errno == EINTR);
|
||||
return ret == -1 ? -errno : 0;
|
||||
+#endif
|
||||
}
|
||||
|
||||
int qemu_lock_fd(int fd, int64_t start, int64_t len, bool exclusive)
|
||||
@@ -262,6 +268,9 @@
|
||||
|
||||
int qemu_lock_fd_test(int fd, int64_t start, int64_t len, bool exclusive)
|
||||
{
|
||||
+#if defined(__redox__)
|
||||
+ return 0;
|
||||
+#else
|
||||
int ret;
|
||||
struct flock fl = {
|
||||
.l_whence = SEEK_SET,
|
||||
@@ -276,6 +285,7 @@
|
||||
} else {
|
||||
return fl.l_type == F_UNLCK ? 0 : -EAGAIN;
|
||||
}
|
||||
+#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
diff -ruwN source/util/oslib-posix.c source-new/util/oslib-posix.c
|
||||
--- source/util/oslib-posix.c 2018-12-11 10:44:35.000000000 -0700
|
||||
+++ source-new/util/oslib-posix.c 2019-01-12 16:34:05.703955117 -0700
|
||||
@@ -36,9 +36,17 @@
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/sockets.h"
|
||||
#include <libgen.h>
|
||||
+#if !defined(__redox__)
|
||||
#include <sys/signal.h>
|
||||
+#endif
|
||||
#include "qemu/cutils.h"
|
||||
|
||||
+#if defined(__redox__)
|
||||
+#define pthread_sigmask sigprocmask
|
||||
+#define sigsetjmp(env, savesigs) setjmp(env)
|
||||
+#define siglongjmp longjmp
|
||||
+#endif
|
||||
+
|
||||
#ifdef CONFIG_LINUX
|
||||
#include <sys/syscall.h>
|
||||
#endif
|
||||
@@ -95,12 +103,13 @@
|
||||
|
||||
while (1) {
|
||||
struct stat a, b;
|
||||
+#if !defined(__redox__)
|
||||
struct flock lock = {
|
||||
.l_type = F_WRLCK,
|
||||
.l_whence = SEEK_SET,
|
||||
.l_len = 0,
|
||||
};
|
||||
-
|
||||
+#endif
|
||||
fd = qemu_open(path, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
|
||||
if (fd == -1) {
|
||||
error_setg_errno(errp, errno, "Cannot open pid file");
|
||||
@@ -112,10 +121,12 @@
|
||||
goto fail_close;
|
||||
}
|
||||
|
||||
+#if !defined(__redox__)
|
||||
if (fcntl(fd, F_SETLK, &lock)) {
|
||||
error_setg_errno(errp, errno, "Cannot lock pid file");
|
||||
goto fail_close;
|
||||
}
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* Now make sure the path we locked is the same one that now
|
||||
@@ -420,7 +431,11 @@
|
||||
|
||||
static inline int get_memset_num_threads(int smp_cpus)
|
||||
{
|
||||
+#if defined(__redox__)
|
||||
+ long host_procs = 1;
|
||||
+#else
|
||||
long host_procs = sysconf(_SC_NPROCESSORS_ONLN);
|
||||
+#endif
|
||||
int ret = 1;
|
||||
|
||||
if (host_procs > 0) {
|
||||
@@ -682,6 +697,7 @@
|
||||
void sigaction_invoke(struct sigaction *action,
|
||||
struct qemu_signalfd_siginfo *info)
|
||||
{
|
||||
+#if !defined(__redox__)
|
||||
siginfo_t si = {};
|
||||
si.si_signo = info->ssi_signo;
|
||||
si.si_errno = info->ssi_errno;
|
||||
@@ -708,4 +724,5 @@
|
||||
si.si_uid = info->ssi_uid;
|
||||
}
|
||||
action->sa_sigaction(info->ssi_signo, &si, NULL);
|
||||
+#endif
|
||||
}
|
||||
diff -ruwN source/util/qemu-progress.c source-new/util/qemu-progress.c
|
||||
--- source/util/qemu-progress.c 2018-12-11 10:44:35.000000000 -0700
|
||||
+++ source-new/util/qemu-progress.c 2019-01-13 10:34:53.704639662 -0700
|
||||
@@ -25,6 +25,10 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu-common.h"
|
||||
|
||||
+#if defined(__redox__)
|
||||
+#define pthread_sigmask sigprocmask
|
||||
+#endif
|
||||
+
|
||||
struct progress_state {
|
||||
float current;
|
||||
float last_print;
|
||||
Loading…
Reference in New Issue
Block a user