From patchwork Sun Oct 11 23:31:23 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Juergen Lock X-Patchwork-Id: 35725 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 6EF85B7B88 for ; Mon, 12 Oct 2009 10:35:37 +1100 (EST) Received: from localhost ([127.0.0.1]:35950 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Mx7ws-0002rQ-6Z for incoming@patchwork.ozlabs.org; Sun, 11 Oct 2009 19:35:34 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Mx7wO-0002rI-04 for qemu-devel@nongnu.org; Sun, 11 Oct 2009 19:35:04 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Mx7wM-0002qu-LX for qemu-devel@nongnu.org; Sun, 11 Oct 2009 19:35:02 -0400 Received: from [199.232.76.173] (port=34560 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Mx7wM-0002qr-Eu for qemu-devel@nongnu.org; Sun, 11 Oct 2009 19:35:02 -0400 Received: from gelbbaer.kn-bremen.de ([78.46.108.116]:36925 helo=smtp.kn-bremen.de) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Mx7wL-00089r-Lr for qemu-devel@nongnu.org; Sun, 11 Oct 2009 19:35:02 -0400 Received: by smtp.kn-bremen.de (Postfix, from userid 10) id E722B1E00363; Mon, 12 Oct 2009 01:35:00 +0200 (CEST) Received: from triton8.kn-bremen.de (noident@localhost [127.0.0.1]) by triton8.kn-bremen.de (8.14.3/8.14.3) with ESMTP id n9BNVOSw059536; Mon, 12 Oct 2009 01:31:24 +0200 (CEST) (envelope-from nox@triton8.kn-bremen.de) Received: (from nox@localhost) by triton8.kn-bremen.de (8.14.3/8.14.3/Submit) id n9BNVNSt059535; Mon, 12 Oct 2009 01:31:23 +0200 (CEST) (envelope-from nox) From: Juergen Lock Date: Mon, 12 Oct 2009 01:31:23 +0200 To: Aleksej Saushev Subject: Re: [Qemu-devel] [diff] BSD support (NetBSD, FreeBSD, Dragonfly) Message-ID: <20091011233123.GA56231@triton8.kn-bremen.de> References: <87iqelzx5h.fsf@inbox.ru> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <87iqelzx5h.fsf@inbox.ru> User-Agent: Mutt/1.5.20 (2009-06-14) X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) Cc: qemu-devel@nongnu.org X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org On Sun, Oct 11, 2009 at 08:57:14PM +0400, Aleksej Saushev wrote: > Hello! Hi! > > qemu 0.11.0 doesn't build on NetBSD out of the box, > it doesn't on FreeBSD and Dragonfly either. > > --- exec.c.orig 2009-09-23 23:01:32.000000000 +0400 > +++ exec.c 2009-09-30 14:03:55.000000000 +0400 > @@ -464,7 +464,7 @@ > exit(1); > } > } > -#elif defined(__FreeBSD__) || defined(__DragonFly__) > +#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) > { > int flags; > void *addr = NULL; > --- osdep.c.orig 2009-09-23 23:01:32.000000000 +0400 > +++ osdep.c 2009-09-30 14:05:39.000000000 +0400 > @@ -110,7 +110,7 @@ > void *ptr; > > /* no need (?) for a dummy file on OpenBSD/FreeBSD */ > -#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) > +#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) > int map_anon = MAP_ANON; > #else > int map_anon = 0; > @@ -181,7 +181,7 @@ > } > size = (size + 4095) & ~4095; > ftruncate(phys_ram_fd, phys_ram_size + size); > -#endif /* !(__OpenBSD__ || __FreeBSD__ || __DragonFly__) */ > +#endif /* !(__OpenBSD__ || __FreeBSD__ || __DragonFly__ || __NetBSD__) */ > ptr = mmap(NULL, > size, > PROT_WRITE | PROT_READ, map_anon | MAP_SHARED, While you are patching this code... There's a bug here that I've mentioned before: size needs to be rounded up on the BSDs too, at least if you want to use kqemu: (which this oode is for.) Signed-off-by: Juergen Lock (Btw you need to post such a line too when submitting patches, I can't find the relevant thread from the qemu list now but I found at least this: http://kerneltrap.org/node/3180 ) Cheers, Juergen [1] See this thread: http://lists.freebsd.org/pipermail/freebsd-emulation/2009-October/006953.html --- a/qemu/osdep.c +++ b/qemu/osdep.c @@ -110,7 +110,7 @@ void *ptr; /* no need (?) for a dummy file on OpenBSD/FreeBSD */ -#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) +#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) int map_anon = MAP_ANON; #else int map_anon = 0; @@ -179,9 +179,11 @@ } unlink(phys_ram_file); } +#endif /* !(__OpenBSD__ || __FreeBSD__ || __DragonFly__ || __NetBSD__) */ size = (size + 4095) & ~4095; +#if !defined(__OpenBSD__) && !defined(__FreeBSD__) && !defined(__DragonFly__) || defined(__NetBSD__) ftruncate(phys_ram_fd, phys_ram_size + size); -#endif /* !(__OpenBSD__ || __FreeBSD__ || __DragonFly__) */ +#endif /* !(__OpenBSD__ || __FreeBSD__ || __DragonFly__ || __NetBSD__) */ ptr = mmap(NULL, size, PROT_WRITE | PROT_READ, map_anon | MAP_SHARED, (Otoh kqemu has been removed in qemu git now so this can't be committed anyway...) > --- vl.c.orig 2009-09-23 23:01:32.000000000 +0400 > +++ vl.c 2009-09-30 14:10:21.000000000 +0400 > @@ -567,7 +567,7 @@ > { > use_rt_clock = 0; > #if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \ > - || defined(__DragonFly__) > + || defined(__DragonFly__) || defined(__NetBSD__) > { > struct timespec ts; > if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { > @@ -580,7 +580,7 @@ > static int64_t get_clock(void) > { > #if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \ > - || defined(__DragonFly__) > + || defined(__DragonFly__) || defined(__NetBSD__) > if (use_rt_clock) { > struct timespec ts; > clock_gettime(CLOCK_MONOTONIC, &ts); > --- cpu-exec.c.orig 2009-09-23 23:01:32.000000000 +0400 > +++ cpu-exec.c 2009-09-30 14:18:16.000000000 +0400 > @@ -1247,6 +1247,20 @@ > # define TRAP_sig(context) ((context)->uc_mcontext->es.trapno) > # define ERROR_sig(context) ((context)->uc_mcontext->es.err) > # define MASK_sig(context) ((context)->uc_sigmask) > +#elif defined (__NetBSD__) > +# include > + > +# define EIP_sig(context) ((context)->uc_mcontext.__gregs[_REG_EIP]) > +# define TRAP_sig(context) ((context)->uc_mcontext.__gregs[_REG_TRAPNO]) > +# define ERROR_sig(context) ((context)->uc_mcontext.__gregs[_REG_ERR]) > +# define MASK_sig(context) ((context)->uc_sigmask) > +#elif defined (__FreeBSD__) || defined(__DragonFly__) > +# include > + > +# define EIP_sig(context) (*((unsigned long*)&(context)->uc_mcontext.mc_eip)) > +# define TRAP_sig(context) ((context)->uc_mcontext.mc_trapno) > +# define ERROR_sig(context) ((context)->uc_mcontext.mc_err) > +# define MASK_sig(context) ((context)->uc_sigmask) > #elif defined(__OpenBSD__) > # define EIP_sig(context) ((context)->sc_eip) > # define TRAP_sig(context) ((context)->sc_trapno) > @@ -1263,7 +1277,9 @@ > void *puc) > { > siginfo_t *info = pinfo; > -#if defined(__OpenBSD__) > +#if defined(__NetBSD__) || defined (__FreeBSD__) || defined(__DragonFly__) > + ucontext_t *uc = puc; > +#elif defined(__OpenBSD__) > struct sigcontext *uc = puc; > #else > struct ucontext *uc = puc; > > And I had a simpler (FreeBSD-only) version of this diff in my bsd-user patches [1], so I took yours instead and added amd64 code: --- a/qemu/cpu-exec.c +++ b/qemu/cpu-exec.c @@ -805,6 +805,20 @@ static inline int handle_cpu_signal(unsi # define TRAP_sig(context) ((context)->uc_mcontext->es.trapno) # define ERROR_sig(context) ((context)->uc_mcontext->es.err) # define MASK_sig(context) ((context)->uc_sigmask) +#elif defined (__NetBSD__) +# include + +# define EIP_sig(context) ((context)->uc_mcontext.__gregs[_REG_EIP]) +# define TRAP_sig(context) ((context)->uc_mcontext.__gregs[_REG_TRAPNO]) +# define ERROR_sig(context) ((context)->uc_mcontext.__gregs[_REG_ERR]) +# define MASK_sig(context) ((context)->uc_sigmask) +#elif defined (__FreeBSD__) || defined(__DragonFly__) +# include + +# define EIP_sig(context) (*((unsigned long*)&(context)->uc_mcontext.mc_eip)) +# define TRAP_sig(context) ((context)->uc_mcontext.mc_trapno) +# define ERROR_sig(context) ((context)->uc_mcontext.mc_err) +# define MASK_sig(context) ((context)->uc_sigmask) #elif defined(__OpenBSD__) # define EIP_sig(context) ((context)->sc_eip) # define TRAP_sig(context) ((context)->sc_trapno) @@ -821,7 +835,9 @@ int cpu_signal_handler(int host_signum, void *puc) { siginfo_t *info = pinfo; -#if defined(__OpenBSD__) +#if defined(__NetBSD__) || defined (__FreeBSD__) || defined(__DragonFly__) + ucontext_t *uc = puc; +#elif defined(__OpenBSD__) struct sigcontext *uc = puc; #else struct ucontext *uc = puc; @@ -855,6 +871,13 @@ int cpu_signal_handler(int host_signum, #define TRAP_sig(context) ((context)->sc_trapno) #define ERROR_sig(context) ((context)->sc_err) #define MASK_sig(context) ((context)->sc_mask) +#elif defined (__FreeBSD__) || defined(__DragonFly__) +#include + +#define PC_sig(context) (*((unsigned long*)&(context)->uc_mcontext.mc_rip)) +#define TRAP_sig(context) ((context)->uc_mcontext.mc_trapno) +#define ERROR_sig(context) ((context)->uc_mcontext.mc_err) +#define MASK_sig(context) ((context)->uc_sigmask) #else #define PC_sig(context) ((context)->uc_mcontext.gregs[REG_RIP]) #define TRAP_sig(context) ((context)->uc_mcontext.gregs[REG_TRAPNO]) @@ -867,7 +890,7 @@ int cpu_signal_handler(int host_signum, { siginfo_t *info = pinfo; unsigned long pc; -#ifdef __NetBSD__ +#if defined(__NetBSD__) || defined (__FreeBSD__) || defined(__DragonFly__) ucontext_t *uc = puc; #elif defined(__OpenBSD__) struct sigcontext *uc = puc;