svn commit: r360226 - in head/emulators/qemu-devel: . files
Juergen Lock
nox at FreeBSD.org
Wed Jul 2 17:16:17 UTC 2014
Author: nox
Date: Wed Jul 2 17:16:16 2014
New Revision: 360226
URL: http://svnweb.freebsd.org/changeset/ports/360226
QAT: https://qat.redports.org/buildarchive/r360226/
Log:
- bsd-user: Implement getvfsbyname(3) that popped up in ports builds
and used by tar. [1]
- bsd-user: Fix crashes in sysctl.kern.proc in 32bit envs on 64bit. [1]
- Bump PORTREVISION.
Submitted by: sson [1]
Added:
head/emulators/qemu-devel/files/extra-patch-getvfsbyname (contents, props changed)
head/emulators/qemu-devel/files/extra-patch-kernproc (contents, props changed)
Modified:
head/emulators/qemu-devel/Makefile
Modified: head/emulators/qemu-devel/Makefile
==============================================================================
--- head/emulators/qemu-devel/Makefile Wed Jul 2 17:06:51 2014 (r360225)
+++ head/emulators/qemu-devel/Makefile Wed Jul 2 17:16:16 2014 (r360226)
@@ -3,7 +3,7 @@
PORTNAME= qemu
PORTVERSION= 2.0.0
-PORTREVISION= 6
+PORTREVISION= 7
CATEGORIES= emulators
MASTER_SITES= http://wiki.qemu.org/download/:release \
LOCAL/nox:snapshot
@@ -70,6 +70,8 @@ EXTRA_PATCHES+= ${FILESDIR}/extra-patch-
EXTRA_PATCHES+= ${FILESDIR}/extra-patch-bsd-user-x86_64-target_arch_vmparam.h
EXTRA_PATCHES+= ${FILESDIR}/extra-patch-target_siginfo
EXTRA_PATCHES+= ${FILESDIR}/extra-patch-bsd-user-arm-signal
+EXTRA_PATCHES+= ${FILESDIR}/extra-patch-getvfsbyname
+EXTRA_PATCHES+= ${FILESDIR}/extra-patch-kernproc
.endif
CONFIGURE_ARGS+= --extra-ldflags=-L${LOCALBASE}/lib
Added: head/emulators/qemu-devel/files/extra-patch-getvfsbyname
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/emulators/qemu-devel/files/extra-patch-getvfsbyname Wed Jul 2 17:16:16 2014 (r360226)
@@ -0,0 +1,153 @@
+diff --git a/bsd-user/freebsd/os-sys.c b/bsd-user/freebsd/os-sys.c
+index 6012562..87a6aa7 100644
+--- a/bsd-user/freebsd/os-sys.c
++++ b/bsd-user/freebsd/os-sys.c
+@@ -1,7 +1,7 @@
+ /*
+ * FreeBSD sysctl() and sysarch() system call emulation
+ *
+- * Copyright (c) 2013 Stacey D. Son
++ * Copyright (c) 2013-14 Stacey D. Son
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+@@ -19,6 +19,7 @@
+
+ #include <sys/types.h>
+ #include <sys/param.h>
++#include <sys/mount.h>
+ #include <sys/sysctl.h>
+ #include <string.h>
+
+@@ -28,6 +29,59 @@
+ #include "target_os_vmparam.h"
+
+ /*
++ * XXX The following should maybe go some place else. Also, see the note
++ * about using "thunk" for sysctl's that pass data using structures.
++ */
++/* From sys/mount.h: */
++#define TARGET_MFSNAMELEN 16 /* length of type name including null */
++struct target_xvfsconf {
++ abi_ulong vfc_vfsops; /* filesystem op vector - not used */
++ char vfc_name[TARGET_MFSNAMELEN]; /* filesystem type name */
++ int32_t vfc_typenum; /* historic fs type number */
++ int32_t vfc_refcount; /* number mounted of this type */
++ int32_t vfc_flags; /* permanent flags */
++ abi_ulong vfc_next; /* next int list - not used */
++};
++
++/* vfc_flag definitions */
++#define TARGET_VFCF_STATIC 0x00010000 /* statically compiled into kernel */
++#define TARGET_VFCF_NETWORK 0x00020000 /* may get data over the network */
++#define TARGET_VFCF_READONLY 0x00040000 /* writes are not implemented */
++#define TARGET_VFCF_SYNTHETIC 0x00080000 /* doesn't represent real files */
++#define TARGET_VFCF_LOOPBACK 0x00100000 /* aliases some other mounted FS */
++#define TARGET_VFCF_UNICODE 0x00200000 /* stores file names as Unicode */
++#define TARGET_VFCF_JAIL 0x00400000 /* can be mounted within a jail */
++#define TARGET_VFCF_DELEGADMIN 0x00800000 /* supports delegated admin */
++#define TARGET_VFCF_SBDRY 0x01000000 /* defer stop requests */
++
++static int
++host_to_target_vfc_flags(int flags)
++{
++ int ret = 0;
++
++ if (flags & VFCF_STATIC)
++ ret |= TARGET_VFCF_STATIC;
++ if (flags & VFCF_NETWORK)
++ ret |= TARGET_VFCF_NETWORK;
++ if (flags & VFCF_READONLY)
++ ret |= TARGET_VFCF_READONLY;
++ if (flags & VFCF_SYNTHETIC)
++ ret |= TARGET_VFCF_SYNTHETIC;
++ if (flags & VFCF_LOOPBACK)
++ ret |= TARGET_VFCF_LOOPBACK;
++ if (flags & VFCF_UNICODE)
++ ret |= TARGET_VFCF_UNICODE;
++ if (flags & VFCF_JAIL)
++ ret |= TARGET_VFCF_JAIL;
++ if (flags & VFCF_DELEGADMIN)
++ ret |= TARGET_VFCF_DELEGADMIN;
++ if (flags & VFCF_SBDRY)
++ ret |= TARGET_VFCF_SBDRY;
++
++ return ret;
++}
++
++/*
+ * XXX this uses the undocumented oidfmt interface to find the kind of
+ * a requested sysctl, see /sys/kern/kern_sysctl.c:sysctl_sysctl_oidfmt()
+ * (compare to src/sbin/sysctl/sysctl.c)
+@@ -161,6 +215,7 @@ abi_long do_freebsd_sysctl(CPUArchState *env, abi_ulong namep, int32_t namelen,
+ oidfmt(snamep, namelen, NULL, &kind);
+
+ /* Handle some arch/emulator dependent sysctl()'s here. */
++ /* XXX sysctl()'s that pass structs should use thunk like ioctl(). */
+ switch (snamep[0]) {
+ case CTL_KERN:
+ switch (snamep[1]) {
+@@ -212,6 +267,63 @@ abi_long do_freebsd_sysctl(CPUArchState *env, abi_ulong namep, int32_t namelen,
+ }
+ break;
+
++ case CTL_VFS:
++ {
++ static int oid_vfs_conflist;
++
++ if (!oid_vfs_conflist) {
++ int real_oid[CTL_MAXNAME+2];
++ size_t len = sizeof(real_oid) / sizeof(int);
++
++ if (sysctlnametomib("vfs.conflist", real_oid, &len) >= 0)
++ oid_vfs_conflist = real_oid[1];
++ }
++
++ if (oid_vfs_conflist && snamep[1] == oid_vfs_conflist) {
++ struct xvfsconf *xvfsp;
++ struct target_xvfsconf *txp;
++ int cnt, i;
++
++ if (sysctlbyname("vfs.conflist", NULL, &holdlen, NULL, 0) < 0) {
++ ret = -1;
++ goto out;
++ }
++ cnt = holdlen / sizeof(struct xvfsconf);
++ if (!holdp) {
++ holdlen = cnt * sizeof(struct target_xvfsconf);
++ ret = 0;
++ goto out;
++ }
++ xvfsp = (struct xvfsconf *)g_malloc(holdlen);
++ if (xvfsp == NULL) {
++ ret = -TARGET_ENOMEM;
++ goto out;
++ }
++ if (sysctlbyname("vfs.conflist", xvfsp, &holdlen, NULL, 0) < 0){
++ g_free(xvfsp);
++ ret = -1;
++ goto out;
++ }
++ cnt = holdlen / sizeof(struct xvfsconf);
++ holdlen = cnt * sizeof(struct target_xvfsconf);
++ txp = (struct target_xvfsconf *)holdp;
++ for (i = 0; i < cnt; i++) {
++ txp[i].vfc_vfsops = 0;
++ strlcpy(txp[i].vfc_name, xvfsp[i].vfc_name,
++ TARGET_MFSNAMELEN);
++ txp[i].vfc_typenum = tswap32(xvfsp[i].vfc_typenum);
++ txp[i].vfc_refcount = tswap32(xvfsp[i].vfc_refcount);
++ txp[i].vfc_flags = tswap32(
++ host_to_target_vfc_flags(xvfsp[i].vfc_flags));
++ txp[i].vfc_next = 0;
++ }
++ g_free(xvfsp);
++ ret = 0;
++ goto out;
++ }
++ }
++ break;
++
+ case CTL_HW:
+ switch (snamep[1]) {
+ case HW_MACHINE:
Added: head/emulators/qemu-devel/files/extra-patch-kernproc
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/emulators/qemu-devel/files/extra-patch-kernproc Wed Jul 2 17:16:16 2014 (r360226)
@@ -0,0 +1,13 @@
+diff --git a/bsd-user/bsdload.c b/bsd-user/bsdload.c
+index 28a8bba..a1d8747 100644
+--- a/bsd-user/bsdload.c
++++ b/bsd-user/bsdload.c
+@@ -228,7 +228,7 @@ int loader_exec(const char * filename, char ** argv, char ** envp,
+ bprm->fullpath = g_strdup(fullpath);
+ } else {
+ retval = open(execname, O_RDONLY);
+- bprm->fullpath = NULL;
++ bprm->fullpath = g_strdup(execname);
+ }
+ if (execname) {
+ g_free((void *)execname);
More information about the svn-ports-all
mailing list