[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2] Basic Illumos support
From: |
Lee Essen |
Subject: |
[Qemu-devel] [PATCH v2] Basic Illumos support |
Date: |
Sat, 17 Mar 2012 08:04:44 +0000 |
(third email attempt, apologies if you get duplicates)
This patch adds some basic constructs to better support Illumos/Solaris.
I've kept away from kvm, configure etc. This just covers making sure the
right libs are used, and the code is Solaris/Illumos compatible.
In qemu-timer.c there are lots of __linux__ || __sun__ constructs, I wanted
to make sure I didn't alter the linux behaviour and this seemed the safest
way to do it.
Signed-off-by: Lee Essen <address@hidden>
---
configure | 1 +
cpus.c | 4 +++-
qemu-timer.c | 14 +++++++++-----
qga/channel-posix.c | 16 ++++++++++++++++
qga/commands-posix.c | 9 +++++++++
5 files changed, 38 insertions(+), 6 deletions(-)
diff --git a/configure b/configure
index afe7395..68cc3a7 100755
--- a/configure
+++ b/configure
@@ -471,6 +471,7 @@ SunOS)
QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
QEMU_CFLAGS="-std=gnu99 $QEMU_CFLAGS"
LIBS="-lsocket -lnsl -lresolv $LIBS"
+ libs_qga="-lsocket -lxnet $lib_qga"
;;
AIX)
aix="yes"
diff --git a/cpus.c b/cpus.c
index 25ba621..6550f22 100644
--- a/cpus.c
+++ b/cpus.c
@@ -455,7 +455,7 @@ static void cpu_signal(int sig)
exit_request = 1;
}
-#ifdef CONFIG_LINUX
+#if defined(CONFIG_LINUX) || defined(CONFIG_SOLARIS)
static void sigbus_reraise(void)
{
sigset_t set;
@@ -491,7 +491,9 @@ static void qemu_init_sigbus(void)
action.sa_sigaction = (void (*)(int, siginfo_t*, void*))sigbus_handler;
sigaction(SIGBUS, &action, NULL);
+#if defined(CONFIG_LINUX)
prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_EARLY, 0, 0);
+#endif
}
static void qemu_kvm_eat_signals(CPUArchState *env)
diff --git a/qemu-timer.c b/qemu-timer.c
index d7f56e5..48817c9 100644
--- a/qemu-timer.c
+++ b/qemu-timer.c
@@ -77,7 +77,7 @@ struct qemu_alarm_timer {
int (*start)(struct qemu_alarm_timer *t);
void (*stop)(struct qemu_alarm_timer *t);
void (*rearm)(struct qemu_alarm_timer *t, int64_t nearest_delta_ns);
-#if defined(__linux__)
+#if defined(__linux__) || defined(__sun__)
int fd;
timer_t timer;
#elif defined(_WIN32)
@@ -165,7 +165,7 @@ static int unix_start_timer(struct qemu_alarm_timer *t);
static void unix_stop_timer(struct qemu_alarm_timer *t);
static void unix_rearm_timer(struct qemu_alarm_timer *t, int64_t delta);
-#ifdef __linux__
+#if defined(__linux__) || defined(__sun__)
static int dynticks_start_timer(struct qemu_alarm_timer *t);
static void dynticks_stop_timer(struct qemu_alarm_timer *t);
@@ -177,7 +177,7 @@ static void dynticks_rearm_timer(struct qemu_alarm_timer
*t, int64_t delta
static struct qemu_alarm_timer alarm_timers[] = {
#ifndef _WIN32
-#ifdef __linux__
+#if defined(__linux__) || defined(__sun__)
{"dynticks", dynticks_start_timer,
dynticks_stop_timer, dynticks_rearm_timer},
#endif
@@ -502,7 +502,7 @@ static void host_alarm_handler(int host_signum)
}
}
-#if defined(__linux__)
+#if defined(__linux__) || defined(__sun__)
#include "compatfd.h"
@@ -533,7 +533,11 @@ static int dynticks_start_timer(struct qemu_alarm_timer *t)
#endif /* SIGEV_THREAD_ID */
ev.sigev_signo = SIGALRM;
+#if defined(__sun__)
+ if (timer_create(CLOCK_HIGHRES, &ev, &host_timer)) {
+#else
if (timer_create(CLOCK_REALTIME, &ev, &host_timer)) {
+#endif
perror("timer_create");
/* disable dynticks */
@@ -585,7 +589,7 @@ static void dynticks_rearm_timer(struct qemu_alarm_timer *t,
}
}
-#endif /* defined(__linux__) */
+#endif /* defined(__linux__) || defined(__sun__) */
#if !defined(_WIN32)
diff --git a/qga/channel-posix.c b/qga/channel-posix.c
index 40f7658..86245c1 100644
--- a/qga/channel-posix.c
+++ b/qga/channel-posix.c
@@ -3,6 +3,10 @@
#include "qemu_socket.h"
#include "qga/channel.h"
+#ifdef CONFIG_SOLARIS
+#include <sys/stropts.h>
+#endif
+
#define GA_CHANNEL_BAUDRATE_DEFAULT B38400 /* for isa-serial channels */
struct GAChannel {
@@ -123,7 +127,19 @@ static gboolean ga_channel_open(GAChannel *c, const gchar
*path, GAChanne
switch (c->method) {
case GA_CHANNEL_VIRTIO_SERIAL: {
+#ifdef CONFIG_SOLARIS
+ int fd = qemu_open(path, O_RDWR | O_NONBLOCK);
+ if (fd == -1) {
+ g_critical("error opening channel: %s", strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+ if (ioctl(fd, I_SETSIG, S_OUTPUT | S_INPUT | S_HIPRI) < 0) {
+ g_critical("error with setsig on channel: %s", strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+#else
int fd = qemu_open(path, O_RDWR | O_NONBLOCK | O_ASYNC);
+#endif
if (fd == -1) {
g_critical("error opening channel: %s", strerror(errno));
exit(EXIT_FAILURE);
diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index 7b2be2f..67531aa 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -35,6 +35,11 @@
#include "qemu-queue.h"
#include "host-utils.h"
+#if defined(__sun__)
+#include <sys/sockio.h>
+extern char **environ;
+#endif
+
static void reopen_fd_to_null(int fd)
{
int nullfd;
@@ -807,7 +812,11 @@ GuestNetworkInterfaceList
*qmp_guest_network_get_interfaces(Error **errp)
goto error;
}
+#if defined(__sun__)
+ mac_addr = (unsigned char *) &ifr.ifr_enaddr;
+#else
mac_addr = (unsigned char *) &ifr.ifr_hwaddr.sa_data;
+#endif
if (asprintf(&info->value->hardware_address,
"%02x:%02x:%02x:%02x:%02x:%02x",
- [Qemu-devel] [PATCH v2] Basic Illumos support,
Lee Essen <=