Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 8 May 2015 23:29:43 +0000 (UTC)
From:      Glen Barber <gjb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r282671 - in projects/release-arm-redux: . bin/date contrib/netcat lib/libc/gen lib/libvmmapi libexec/rtld-elf share/man/man4 share/man/man9 share/mk sys/amd64/include sys/amd64/vmm sys...
Message-ID:  <201505082329.t48NThWX075705@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gjb
Date: Fri May  8 23:29:42 2015
New Revision: 282671
URL: https://svnweb.freebsd.org/changeset/base/282671

Log:
  MFH: r282537-r282670
  
  Sponsored by:	The FreeBSD Foundation

Added:
  projects/release-arm-redux/sys/arm/broadcom/bcm2835/bcm2836_mp.c
     - copied unchanged from r282670, head/sys/arm/broadcom/bcm2835/bcm2836_mp.c
  projects/release-arm-redux/sys/arm64/arm64/busdma_bounce.c
     - copied unchanged from r282670, head/sys/arm64/arm64/busdma_bounce.c
  projects/release-arm-redux/sys/arm64/include/bus_dma_impl.h
     - copied unchanged from r282670, head/sys/arm64/include/bus_dma_impl.h
  projects/release-arm-redux/sys/xen/xenmem/
     - copied from r282670, head/sys/xen/xenmem/
Modified:
  projects/release-arm-redux/ObsoleteFiles.inc
  projects/release-arm-redux/bin/date/date.1
  projects/release-arm-redux/bin/date/date.c
  projects/release-arm-redux/contrib/netcat/netcat.c
  projects/release-arm-redux/lib/libc/gen/directory.3
  projects/release-arm-redux/lib/libc/gen/telldir.c
  projects/release-arm-redux/lib/libvmmapi/vmmapi.c
  projects/release-arm-redux/lib/libvmmapi/vmmapi.h
  projects/release-arm-redux/libexec/rtld-elf/debug.h
  projects/release-arm-redux/libexec/rtld-elf/rtld.c
  projects/release-arm-redux/share/man/man4/usb_quirk.4
  projects/release-arm-redux/share/man/man9/Makefile
  projects/release-arm-redux/share/man/man9/namei.9
  projects/release-arm-redux/share/mk/src.libnames.mk
  projects/release-arm-redux/sys/amd64/include/vmm.h   (contents, props changed)
  projects/release-arm-redux/sys/amd64/include/vmm_instruction_emul.h   (contents, props changed)
  projects/release-arm-redux/sys/amd64/vmm/vmm.c
  projects/release-arm-redux/sys/amd64/vmm/vmm_dev.c
  projects/release-arm-redux/sys/amd64/vmm/vmm_instruction_emul.c
  projects/release-arm-redux/sys/arm/amlogic/aml8726/aml8726_pic.c
  projects/release-arm-redux/sys/arm/arm/machdep.c
  projects/release-arm-redux/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c
  projects/release-arm-redux/sys/arm/broadcom/bcm2835/bcm2836.c
  projects/release-arm-redux/sys/arm/broadcom/bcm2835/files.bcm2836
  projects/release-arm-redux/sys/arm/broadcom/bcm2835/std.bcm2836
  projects/release-arm-redux/sys/arm/conf/AML8726
  projects/release-arm-redux/sys/arm/conf/APALIS-IMX6
  projects/release-arm-redux/sys/arm/conf/ARMADAXP
  projects/release-arm-redux/sys/arm/conf/ARNDALE
  projects/release-arm-redux/sys/arm/conf/ARNDALE-OCTA
  projects/release-arm-redux/sys/arm/conf/ATMEL
  projects/release-arm-redux/sys/arm/conf/AVILA
  projects/release-arm-redux/sys/arm/conf/BEAGLEBONE
  projects/release-arm-redux/sys/arm/conf/BWCT
  projects/release-arm-redux/sys/arm/conf/CAMBRIA
  projects/release-arm-redux/sys/arm/conf/CHROMEBOOK
  projects/release-arm-redux/sys/arm/conf/CHROMEBOOK-PEACH-PIT
  projects/release-arm-redux/sys/arm/conf/CHROMEBOOK-SNOW
  projects/release-arm-redux/sys/arm/conf/CHROMEBOOK-SPRING
  projects/release-arm-redux/sys/arm/conf/CNS11XXNAS
  projects/release-arm-redux/sys/arm/conf/COLIBRI-VF50
  projects/release-arm-redux/sys/arm/conf/COSMIC
  projects/release-arm-redux/sys/arm/conf/CRB
  projects/release-arm-redux/sys/arm/conf/CUBIEBOARD
  projects/release-arm-redux/sys/arm/conf/CUBIEBOARD2
  projects/release-arm-redux/sys/arm/conf/DB-78XXX
  projects/release-arm-redux/sys/arm/conf/DB-88F5XXX
  projects/release-arm-redux/sys/arm/conf/DB-88F6XXX
  projects/release-arm-redux/sys/arm/conf/DIGI-CCWMX53
  projects/release-arm-redux/sys/arm/conf/DOCKSTAR
  projects/release-arm-redux/sys/arm/conf/DREAMPLUG-1001
  projects/release-arm-redux/sys/arm/conf/EA3250
  projects/release-arm-redux/sys/arm/conf/EB9200
  projects/release-arm-redux/sys/arm/conf/EFIKA_MX
  projects/release-arm-redux/sys/arm/conf/EP80219
  projects/release-arm-redux/sys/arm/conf/ETHERNUT5
  projects/release-arm-redux/sys/arm/conf/EXYNOS5.common
  projects/release-arm-redux/sys/arm/conf/EXYNOS5250
  projects/release-arm-redux/sys/arm/conf/EXYNOS5420
  projects/release-arm-redux/sys/arm/conf/GUMSTIX
  projects/release-arm-redux/sys/arm/conf/HL200
  projects/release-arm-redux/sys/arm/conf/HL201
  projects/release-arm-redux/sys/arm/conf/IMX53
  projects/release-arm-redux/sys/arm/conf/IMX53-QSB
  projects/release-arm-redux/sys/arm/conf/IMX6
  projects/release-arm-redux/sys/arm/conf/IQ31244
  projects/release-arm-redux/sys/arm/conf/KB920X
  projects/release-arm-redux/sys/arm/conf/LN2410SBC
  projects/release-arm-redux/sys/arm/conf/NSLU
  projects/release-arm-redux/sys/arm/conf/PANDABOARD
  projects/release-arm-redux/sys/arm/conf/QILA9G20
  projects/release-arm-redux/sys/arm/conf/QUARTZ
  projects/release-arm-redux/sys/arm/conf/RADXA
  projects/release-arm-redux/sys/arm/conf/RADXA-LITE
  projects/release-arm-redux/sys/arm/conf/RK3188
  projects/release-arm-redux/sys/arm/conf/RPI-B
  projects/release-arm-redux/sys/arm/conf/RPI2
  projects/release-arm-redux/sys/arm/conf/SAM9260EK
  projects/release-arm-redux/sys/arm/conf/SAM9G20EK
  projects/release-arm-redux/sys/arm/conf/SAM9X25EK
  projects/release-arm-redux/sys/arm/conf/SHEEVAPLUG
  projects/release-arm-redux/sys/arm/conf/SN9G45
  projects/release-arm-redux/sys/arm/conf/SOCKIT.common
  projects/release-arm-redux/sys/arm/conf/TS7800
  projects/release-arm-redux/sys/arm/conf/VERSATILEPB
  projects/release-arm-redux/sys/arm/conf/VIRT
  projects/release-arm-redux/sys/arm/conf/VYBRID
  projects/release-arm-redux/sys/arm/conf/ZEDBOARD
  projects/release-arm-redux/sys/arm/include/armreg.h
  projects/release-arm-redux/sys/arm/include/cpu-v6.h
  projects/release-arm-redux/sys/arm/include/pl310.h
  projects/release-arm-redux/sys/arm/include/sysreg.h
  projects/release-arm-redux/sys/arm64/arm64/busdma_machdep.c
  projects/release-arm-redux/sys/boot/arm/uboot/ldscript.arm
  projects/release-arm-redux/sys/boot/fdt/dts/arm/odroidc1.dts
  projects/release-arm-redux/sys/boot/fdt/dts/arm/rpi2.dts
  projects/release-arm-redux/sys/boot/fdt/dts/arm/vsatv102-m6.dts
  projects/release-arm-redux/sys/cam/ctl/ctl_backend_block.c
  projects/release-arm-redux/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c
  projects/release-arm-redux/sys/conf/NOTES
  projects/release-arm-redux/sys/conf/files
  projects/release-arm-redux/sys/conf/files.arm64
  projects/release-arm-redux/sys/conf/options
  projects/release-arm-redux/sys/dev/acpica/acpi.c
  projects/release-arm-redux/sys/dev/acpica/acpi_timer.c
  projects/release-arm-redux/sys/dev/hwpmc/hwpmc_amd.c
  projects/release-arm-redux/sys/dev/hwpmc/hwpmc_core.c
  projects/release-arm-redux/sys/dev/hwpmc/hwpmc_intel.c
  projects/release-arm-redux/sys/dev/hwpmc/hwpmc_logging.c
  projects/release-arm-redux/sys/dev/hwpmc/hwpmc_mips.c
  projects/release-arm-redux/sys/dev/hwpmc/hwpmc_mips24k.c
  projects/release-arm-redux/sys/dev/hwpmc/hwpmc_mod.c
  projects/release-arm-redux/sys/dev/hwpmc/hwpmc_mpc7xxx.c
  projects/release-arm-redux/sys/dev/hwpmc/hwpmc_octeon.c
  projects/release-arm-redux/sys/dev/hwpmc/hwpmc_piv.c
  projects/release-arm-redux/sys/dev/hwpmc/hwpmc_ppc970.c
  projects/release-arm-redux/sys/dev/hwpmc/hwpmc_ppro.c
  projects/release-arm-redux/sys/dev/hwpmc/hwpmc_soft.c
  projects/release-arm-redux/sys/dev/hwpmc/hwpmc_tsc.c
  projects/release-arm-redux/sys/dev/hwpmc/hwpmc_uncore.c
  projects/release-arm-redux/sys/dev/hwpmc/hwpmc_xscale.c
  projects/release-arm-redux/sys/dev/iicbus/iicbus.c
  projects/release-arm-redux/sys/dev/sound/pcm/channel.c
  projects/release-arm-redux/sys/dev/sound/pcm/channel.h
  projects/release-arm-redux/sys/dev/sound/pcm/feeder_chain.c
  projects/release-arm-redux/sys/dev/sound/pcm/sound.h
  projects/release-arm-redux/sys/dev/sound/usb/uaudio.c
  projects/release-arm-redux/sys/dev/usb/quirk/usb_quirk.c
  projects/release-arm-redux/sys/dev/usb/quirk/usb_quirk.h
  projects/release-arm-redux/sys/dev/usb/usb_device.c
  projects/release-arm-redux/sys/dev/usb/usb_msctest.c
  projects/release-arm-redux/sys/dev/usb/usb_msctest.h
  projects/release-arm-redux/sys/dev/usb/usbdevs
  projects/release-arm-redux/sys/dev/usb/wlan/if_urtwn.c
  projects/release-arm-redux/sys/dev/usb/wlan/if_urtwnreg.h
  projects/release-arm-redux/sys/dev/vt/vt.h
  projects/release-arm-redux/sys/dev/vt/vt_core.c
  projects/release-arm-redux/sys/dev/xen/blkback/blkback.c
  projects/release-arm-redux/sys/dev/xen/grant_table/grant_table.c
  projects/release-arm-redux/sys/dev/xen/netback/netback.c
  projects/release-arm-redux/sys/dev/xen/privcmd/privcmd.c
  projects/release-arm-redux/sys/kern/kern_fork.c
  projects/release-arm-redux/sys/kern/uipc_mbuf.c
  projects/release-arm-redux/sys/netinet6/ip6_ipsec.c
  projects/release-arm-redux/sys/netinet6/ip6_output.c
  projects/release-arm-redux/sys/sys/param.h
  projects/release-arm-redux/sys/sys/pmc.h
  projects/release-arm-redux/sys/vm/default_pager.c
  projects/release-arm-redux/sys/vm/device_pager.c
  projects/release-arm-redux/sys/vm/phys_pager.c
  projects/release-arm-redux/sys/vm/sg_pager.c
  projects/release-arm-redux/sys/vm/swap_pager.c
  projects/release-arm-redux/sys/vm/vm_meter.c
  projects/release-arm-redux/sys/vm/vm_object.c
  projects/release-arm-redux/sys/vm/vm_phys.c
  projects/release-arm-redux/sys/vm/vm_phys.h
  projects/release-arm-redux/sys/x86/acpica/srat.c
  projects/release-arm-redux/sys/x86/xen/xenpv.c
  projects/release-arm-redux/sys/xen/xen-os.h
  projects/release-arm-redux/tools/build/mk/OptionalObsoleteFiles.inc
  projects/release-arm-redux/usr.bin/checknr/checknr.c
  projects/release-arm-redux/usr.bin/col/col.c
  projects/release-arm-redux/usr.bin/netstat/if.c
  projects/release-arm-redux/usr.sbin/bhyve/inout.c
  projects/release-arm-redux/usr.sbin/bhyve/pci_ahci.c
  projects/release-arm-redux/usr.sbin/bhyve/pci_virtio_net.c
  projects/release-arm-redux/usr.sbin/bhyve/task_switch.c
  projects/release-arm-redux/usr.sbin/pmcstat/pmcstat.8
  projects/release-arm-redux/usr.sbin/pmcstat/pmcstat.c
Directory Properties:
  projects/release-arm-redux/   (props changed)
  projects/release-arm-redux/contrib/netcat/   (props changed)
  projects/release-arm-redux/lib/libc/   (props changed)
  projects/release-arm-redux/lib/libvmmapi/   (props changed)
  projects/release-arm-redux/share/   (props changed)
  projects/release-arm-redux/share/man/man4/   (props changed)
  projects/release-arm-redux/sys/   (props changed)
  projects/release-arm-redux/sys/amd64/vmm/   (props changed)
  projects/release-arm-redux/sys/boot/   (props changed)
  projects/release-arm-redux/sys/cddl/contrib/opensolaris/   (props changed)
  projects/release-arm-redux/sys/conf/   (props changed)
  projects/release-arm-redux/usr.sbin/bhyve/   (props changed)

Modified: projects/release-arm-redux/ObsoleteFiles.inc
==============================================================================
--- projects/release-arm-redux/ObsoleteFiles.inc	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/ObsoleteFiles.inc	Fri May  8 23:29:42 2015	(r282671)
@@ -38,6 +38,8 @@
 #   xargs -n1 | sort | uniq -d;
 # done
 
+# 20150506
+OLD_FILES+=usr/share/man/man9/NDHASGIANT.9.gz
 # 20150504
 OLD_LIBS+=usr/lib32/private/libatf-c++.so.2
 OLD_LIBS+=usr/lib32/private/libbsdstat.so.1
@@ -430,10 +432,6 @@ OLD_FILES+=usr/lib/debug/usr/lib32/i18n
 OLD_FILES+=usr/lib/debug/usr/lib32/private
 # 20141015: OpenSSL 1.0.1j import
 OLD_FILES+=usr/share/openssl/man/man3/CMS_sign_add1_signer.3.gz
-.if ${MK_GCC} == "no"
-# 20141009: gperf disabled by default
-OLD_FILES+=usr/bin/gperf
-.endif
 # 20140922: sleepq_calc_signal_retval.9 and sleepq_catch_signals.9 removed
 OLD_FILES+=usr/share/man/man9/sleepq_calc_signal_retval.9.gz
 OLD_FILES+=usr/share/man/man9/sleepq_catch_signals.9.gz

Modified: projects/release-arm-redux/bin/date/date.1
==============================================================================
--- projects/release-arm-redux/bin/date/date.1	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/bin/date/date.1	Fri May  8 23:29:42 2015	(r282671)
@@ -32,7 +32,7 @@
 .\"     @(#)date.1	8.3 (Berkeley) 4/28/95
 .\" $FreeBSD$
 .\"
-.Dd April 26, 2014
+.Dd May 7, 2015
 .Dt DATE 1
 .Os
 .Sh NAME
@@ -41,7 +41,7 @@
 .Sh SYNOPSIS
 .Nm
 .Op Fl jRu
-.Op Fl r Ar seconds
+.Op Fl r Ar seconds | Ar filename
 .Oo
 .Fl v
 .Sm off
@@ -150,6 +150,9 @@ is the number of seconds since the Epoch
 see
 .Xr time 3 ) ,
 and can be specified in decimal, octal, or hex.
+.It Fl r Ar filename
+Print the date and time of the last modification of
+.Ar filename .
 .It Fl t Ar minutes_west
 Set the system's value for minutes west of
 .Tn GMT .

Modified: projects/release-arm-redux/bin/date/date.c
==============================================================================
--- projects/release-arm-redux/bin/date/date.c	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/bin/date/date.c	Fri May  8 23:29:42 2015	(r282671)
@@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
 #include <sys/time.h>
+#include <sys/stat.h>
 
 #include <ctype.h>
 #include <err.h>
@@ -85,6 +86,7 @@ main(int argc, char *argv[])
 	struct vary *v;
 	const struct vary *badv;
 	struct tm lt;
+	struct stat sb;
 
 	v = NULL;
 	fmt = NULL;
@@ -116,8 +118,12 @@ main(int argc, char *argv[])
 		case 'r':		/* user specified seconds */
 			rflag = 1;
 			tval = strtoq(optarg, &tmp, 0);
-			if (*tmp != 0)
-				usage();
+			if (*tmp != 0) {
+				if (stat(optarg, &sb) == 0)
+					tval = sb.st_mtim.tv_sec;
+				else
+					usage();
+			}
 			break;
 		case 't':		/* minutes west of UTC */
 					/* error check; don't allow "PST" */

Modified: projects/release-arm-redux/contrib/netcat/netcat.c
==============================================================================
--- projects/release-arm-redux/contrib/netcat/netcat.c	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/contrib/netcat/netcat.c	Fri May  8 23:29:42 2015	(r282671)
@@ -1,4 +1,4 @@
-/* $OpenBSD: netcat.c,v 1.122 2014/07/20 01:38:40 guenther Exp $ */
+/* $OpenBSD: netcat.c,v 1.127 2015/02/14 22:40:22 jca Exp $ */
 /*
  * Copyright (c) 2001 Eric Jackson <ericj@monkey.org>
  *
@@ -42,7 +42,6 @@
 #include <sys/un.h>
 
 #include <netinet/in.h>
-#include <netinet/in_systm.h>
 #ifdef IPSEC
 #include <netipsec/ipsec.h>
 #endif
@@ -73,6 +72,12 @@
 #define PORT_MAX_LEN	6
 #define UNIX_DG_TMP_SOCKET_SIZE	19
 
+#define POLL_STDIN 0
+#define POLL_NETOUT 1
+#define POLL_NETIN 2
+#define POLL_STDOUT 3
+#define BUFSIZE 16384
+
 /* Command Line Options */
 int	dflag;					/* detached, no stdin */
 int	Fflag;					/* fdpass sock to stdout */
@@ -117,10 +122,12 @@ int	udptest(int);
 int	unix_bind(char *);
 int	unix_connect(char *);
 int	unix_listen(char *);
-void	set_common_sockopts(int);
+void	set_common_sockopts(int, int);
 int	map_tos(char *, int *);
 void	report_connect(const struct sockaddr *, socklen_t);
 void	usage(int);
+ssize_t drainbuf(int, unsigned char *, size_t *);
+ssize_t fillbuf(int, unsigned char *, size_t *);
 
 #ifdef IPSEC
 void	add_ipsec_policy(int, char *);
@@ -436,7 +443,7 @@ main(int argc, char *argv[])
 				    &len);
 				if (connfd == -1) {
 					/* For now, all errnos are fatal */
-   					err(1, "accept");
+					err(1, "accept");
 				}
 				if (vflag)
 					report_connect((struct sockaddr *)&cliaddr, len);
@@ -663,7 +670,7 @@ remote_connect(const char *host, const c
 			freeaddrinfo(ares);
 		}
 
-		set_common_sockopts(s);
+		set_common_sockopts(s, res0->ai_family);
 
 		if (timeout_connect(s, res0->ai_addr, res0->ai_addrlen) == 0)
 			break;
@@ -767,6 +774,8 @@ local_listen(char *host, char *port, str
 				err(1, "disable TCP options");
 		}
 
+		set_common_sockopts(s, res0->ai_family);
+
 		if (bind(s, (struct sockaddr *)res0->ai_addr,
 		    res0->ai_addrlen) == 0)
 			break;
@@ -790,68 +799,224 @@ local_listen(char *host, char *port, str
  * Loop that polls on the network file descriptor and stdin.
  */
 void
-readwrite(int nfd)
+readwrite(int net_fd)
 {
-	struct pollfd pfd[2];
-	unsigned char buf[16 * 1024];
-	int n, wfd = fileno(stdin);
-	int lfd = fileno(stdout);
-	int plen;
-
-	plen = sizeof(buf);
-
-	/* Setup Network FD */
-	pfd[0].fd = nfd;
-	pfd[0].events = POLLIN;
-
-	/* Set up STDIN FD. */
-	pfd[1].fd = wfd;
-	pfd[1].events = POLLIN;
+	struct pollfd pfd[4];
+	int stdin_fd = STDIN_FILENO;
+	int stdout_fd = STDOUT_FILENO;
+	unsigned char netinbuf[BUFSIZE];
+	size_t netinbufpos = 0;
+	unsigned char stdinbuf[BUFSIZE];
+	size_t stdinbufpos = 0;
+	int n, num_fds;
+	ssize_t ret;
+
+	/* don't read from stdin if requested */
+	if (dflag)
+		stdin_fd = -1;
+
+	/* stdin */
+	pfd[POLL_STDIN].fd = stdin_fd;
+	pfd[POLL_STDIN].events = POLLIN;
+
+	/* network out */
+	pfd[POLL_NETOUT].fd = net_fd;
+	pfd[POLL_NETOUT].events = 0;
+
+	/* network in */
+	pfd[POLL_NETIN].fd = net_fd;
+	pfd[POLL_NETIN].events = POLLIN;
+
+	/* stdout */
+	pfd[POLL_STDOUT].fd = stdout_fd;
+	pfd[POLL_STDOUT].events = 0;
+
+	while (1) {
+		/* both inputs are gone, buffers are empty, we are done */
+		if (pfd[POLL_STDIN].fd == -1 && pfd[POLL_NETIN].fd == -1
+		    && stdinbufpos == 0 && netinbufpos == 0) {
+			close(net_fd);
+			return;
+		}
+		/* both outputs are gone, we can't continue */
+		if (pfd[POLL_NETOUT].fd == -1 && pfd[POLL_STDOUT].fd == -1) {
+			close(net_fd);
+			return;
+		}
+		/* listen and net in gone, queues empty, done */
+		if (lflag && pfd[POLL_NETIN].fd == -1
+		    && stdinbufpos == 0 && netinbufpos == 0) {
+			close(net_fd);
+			return;
+		}
 
-	while (pfd[0].fd != -1) {
+		/* help says -i is for "wait between lines sent". We read and
+		 * write arbitrary amounts of data, and we don't want to start
+		 * scanning for newlines, so this is as good as it gets */
 		if (iflag)
 			sleep(iflag);
 
-		if ((n = poll(pfd, 2 - dflag, timeout)) < 0) {
-			int saved_errno = errno;
-			close(nfd);
-			errc(1, saved_errno, "Polling Error");
+		/* poll */
+		num_fds = poll(pfd, 4, timeout);
+
+		/* treat poll errors */
+		if (num_fds == -1) {
+			close(net_fd);
+			err(1, "polling error");
 		}
 
-		if (n == 0)
+		/* timeout happened */
+		if (num_fds == 0)
 			return;
 
-		if (pfd[0].revents & POLLIN) {
-			if ((n = read(nfd, buf, plen)) < 0)
-				return;
-			else if (n == 0) {
-				shutdown(nfd, SHUT_RD);
-				pfd[0].fd = -1;
-				pfd[0].events = 0;
-			} else {
-				if (tflag)
-					atelnet(nfd, buf, n);
-				if (atomicio(vwrite, lfd, buf, n) != n)
-					return;
+		/* treat socket error conditions */
+		for (n = 0; n < 4; n++) {
+			if (pfd[n].revents & (POLLERR|POLLNVAL)) {
+				pfd[n].fd = -1;
 			}
 		}
+		/* reading is possible after HUP */
+		if (pfd[POLL_STDIN].events & POLLIN &&
+		    pfd[POLL_STDIN].revents & POLLHUP &&
+		    ! (pfd[POLL_STDIN].revents & POLLIN))
+				pfd[POLL_STDIN].fd = -1;
+
+		if (pfd[POLL_NETIN].events & POLLIN &&
+		    pfd[POLL_NETIN].revents & POLLHUP &&
+		    ! (pfd[POLL_NETIN].revents & POLLIN))
+				pfd[POLL_NETIN].fd = -1;
+
+		if (pfd[POLL_NETOUT].revents & POLLHUP) {
+			if (Nflag)
+				shutdown(pfd[POLL_NETOUT].fd, SHUT_WR);
+			pfd[POLL_NETOUT].fd = -1;
+		}
+		/* if HUP, stop watching stdout */
+		if (pfd[POLL_STDOUT].revents & POLLHUP)
+			pfd[POLL_STDOUT].fd = -1;
+		/* if no net out, stop watching stdin */
+		if (pfd[POLL_NETOUT].fd == -1)
+			pfd[POLL_STDIN].fd = -1;
+		/* if no stdout, stop watching net in */
+		if (pfd[POLL_STDOUT].fd == -1) {
+			if (pfd[POLL_NETIN].fd != -1)
+				shutdown(pfd[POLL_NETIN].fd, SHUT_RD);
+			pfd[POLL_NETIN].fd = -1;
+		}
 
-		if (!dflag && pfd[1].revents & POLLIN) {
-			if ((n = read(wfd, buf, plen)) < 0)
-				return;
-			else if (n == 0) {
-				if (Nflag)
-					shutdown(nfd, SHUT_WR);
-				pfd[1].fd = -1;
-				pfd[1].events = 0;
-			} else {
-				if (atomicio(vwrite, nfd, buf, n) != n)
-					return;
+		/* try to read from stdin */
+		if (pfd[POLL_STDIN].revents & POLLIN && stdinbufpos < BUFSIZE) {
+			ret = fillbuf(pfd[POLL_STDIN].fd, stdinbuf,
+			    &stdinbufpos);
+			/* error or eof on stdin - remove from pfd */
+			if (ret == 0 || ret == -1)
+				pfd[POLL_STDIN].fd = -1;
+			/* read something - poll net out */
+			if (stdinbufpos > 0)
+				pfd[POLL_NETOUT].events = POLLOUT;
+			/* filled buffer - remove self from polling */
+			if (stdinbufpos == BUFSIZE)
+				pfd[POLL_STDIN].events = 0;
+		}
+		/* try to write to network */
+		if (pfd[POLL_NETOUT].revents & POLLOUT && stdinbufpos > 0) {
+			ret = drainbuf(pfd[POLL_NETOUT].fd, stdinbuf,
+			    &stdinbufpos);
+			if (ret == -1)
+				pfd[POLL_NETOUT].fd = -1;
+			/* buffer empty - remove self from polling */
+			if (stdinbufpos == 0)
+				pfd[POLL_NETOUT].events = 0;
+			/* buffer no longer full - poll stdin again */
+			if (stdinbufpos < BUFSIZE)
+				pfd[POLL_STDIN].events = POLLIN;
+		}
+		/* try to read from network */
+		if (pfd[POLL_NETIN].revents & POLLIN && netinbufpos < BUFSIZE) {
+			ret = fillbuf(pfd[POLL_NETIN].fd, netinbuf,
+			    &netinbufpos);
+			if (ret == -1)
+				pfd[POLL_NETIN].fd = -1;
+			/* eof on net in - remove from pfd */
+			if (ret == 0) {
+				shutdown(pfd[POLL_NETIN].fd, SHUT_RD);
+				pfd[POLL_NETIN].fd = -1;
 			}
+			/* read something - poll stdout */
+			if (netinbufpos > 0)
+				pfd[POLL_STDOUT].events = POLLOUT;
+			/* filled buffer - remove self from polling */
+			if (netinbufpos == BUFSIZE)
+				pfd[POLL_NETIN].events = 0;
+			/* handle telnet */
+			if (tflag)
+				atelnet(pfd[POLL_NETIN].fd, netinbuf,
+				    netinbufpos);
+		}
+		/* try to write to stdout */
+		if (pfd[POLL_STDOUT].revents & POLLOUT && netinbufpos > 0) {
+			ret = drainbuf(pfd[POLL_STDOUT].fd, netinbuf,
+			    &netinbufpos);
+			if (ret == -1)
+				pfd[POLL_STDOUT].fd = -1;
+			/* buffer empty - remove self from polling */
+			if (netinbufpos == 0)
+				pfd[POLL_STDOUT].events = 0;
+			/* buffer no longer full - poll net in again */
+			if (netinbufpos < BUFSIZE)
+				pfd[POLL_NETIN].events = POLLIN;
+		}
+
+		/* stdin gone and queue empty? */
+		if (pfd[POLL_STDIN].fd == -1 && stdinbufpos == 0) {
+			if (pfd[POLL_NETOUT].fd != -1 && Nflag)
+				shutdown(pfd[POLL_NETOUT].fd, SHUT_WR);
+			pfd[POLL_NETOUT].fd = -1;
+		}
+		/* net in gone and queue empty? */
+		if (pfd[POLL_NETIN].fd == -1 && netinbufpos == 0) {
+			pfd[POLL_STDOUT].fd = -1;
 		}
 	}
 }
 
+ssize_t
+drainbuf(int fd, unsigned char *buf, size_t *bufpos)
+{
+	ssize_t n;
+	ssize_t adjust;
+
+	n = write(fd, buf, *bufpos);
+	/* don't treat EAGAIN, EINTR as error */
+	if (n == -1 && (errno == EAGAIN || errno == EINTR))
+		n = -2;
+	if (n <= 0)
+		return n;
+	/* adjust buffer */
+	adjust = *bufpos - n;
+	if (adjust > 0)
+		memmove(buf, buf + n, adjust);
+	*bufpos -= n;
+	return n;
+}
+
+
+ssize_t
+fillbuf(int fd, unsigned char *buf, size_t *bufpos)
+{
+	size_t num = BUFSIZE - *bufpos;
+	ssize_t n;
+
+	n = read(fd, buf + *bufpos, num);
+	/* don't treat EAGAIN, EINTR as error */
+	if (n == -1 && (errno == EAGAIN || errno == EINTR))
+		n = -2;
+	if (n <= 0)
+		return n;
+	*bufpos += n;
+	return n;
+}
+
 /*
  * fdpass()
  * Pass the connected file descriptor to stdout and exit.
@@ -1025,7 +1190,7 @@ udptest(int s)
 }
 
 void
-set_common_sockopts(int s)
+set_common_sockopts(int s, int af)
 {
 	int x = 1;
 
@@ -1040,8 +1205,17 @@ set_common_sockopts(int s)
 			err(1, NULL);
 	}
 	if (Tflag != -1) {
-		if (setsockopt(s, IPPROTO_IP, IP_TOS,
-		    &Tflag, sizeof(Tflag)) == -1)
+		int proto, option;
+
+		if (af == AF_INET6) {
+			proto = IPPROTO_IPV6;
+			option = IPV6_TCLASS;
+		} else {
+			proto = IPPROTO_IP;
+			option = IP_TOS;
+		}
+
+		if (setsockopt(s, proto, option, &Tflag, sizeof(Tflag)) == -1)
 			err(1, "set IP ToS");
 	}
 	if (Iflag) {

Modified: projects/release-arm-redux/lib/libc/gen/directory.3
==============================================================================
--- projects/release-arm-redux/lib/libc/gen/directory.3	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/lib/libc/gen/directory.3	Fri May  8 23:29:42 2015	(r282671)
@@ -28,7 +28,7 @@
 .\"     @(#)directory.3	8.1 (Berkeley) 6/4/93
 .\" $FreeBSD$
 .\"
-.Dd July 28, 2014
+.Dd May 6, 2015
 .Dt DIRECTORY 3
 .Os
 .Sh NAME
@@ -263,12 +263,6 @@ function appeared in
 function appeared in
 .Fx 10.0 .
 .Sh BUGS
-The invalidation of
-.Fn telldir
-tokens when calling
-.Fn seekdir
-is non-standard. This is a compile time option.
-.Pp
 The behaviour of
 .Fn telldir
 and

Modified: projects/release-arm-redux/lib/libc/gen/telldir.c
==============================================================================
--- projects/release-arm-redux/lib/libc/gen/telldir.c	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/lib/libc/gen/telldir.c	Fri May  8 23:29:42 2015	(r282671)
@@ -101,11 +101,12 @@ _seekdir(dirp, loc)
 		return;
 	if (lp->loc_loc == dirp->dd_loc && lp->loc_seek == dirp->dd_seek)
 		return;
-	/* If it's within the same chunk of data, don't bother reloading */
+
+	/* If it's within the same chunk of data, don't bother reloading. */
 	if (lp->loc_seek == dirp->dd_seek) {
 		/*
 		 * If we go back to 0 don't make the next readdir
-		 * trigger a call to getdirentries()
+		 * trigger a call to getdirentries().
 		 */
 		if (lp->loc_loc == 0)
 			dirp->dd_flags |= __DTF_SKIPREAD;
@@ -124,10 +125,13 @@ _seekdir(dirp, loc)
 }
 
 /*
- * when we do a read and cross a boundary, any telldir we
- * just did will have wrong information in it.
- * We need to move it from "beyond the end of the previous chunk"
- * to "the beginning of the new chunk"
+ * After readdir returns the last entry in a block, a call to telldir
+ * returns a location that is after the end of that last entry.
+ * However, that location doesn't refer to a valid directory entry.
+ * Ideally, the call to telldir would return a location that refers to
+ * the first entry in the next block.  That location is not known
+ * until the next block is read, so readdir calls this function after
+ * fetching a new block to fix any such telldir locations.
  */
 void
 _fixtelldir(DIR *dirp, long oldseek, long oldloc)

Modified: projects/release-arm-redux/lib/libvmmapi/vmmapi.c
==============================================================================
--- projects/release-arm-redux/lib/libvmmapi/vmmapi.c	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/lib/libvmmapi/vmmapi.c	Fri May  8 23:29:42 2015	(r282671)
@@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$");
 #include <machine/specialreg.h>
 #include <machine/param.h>
 
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <assert.h>
@@ -958,9 +959,9 @@ vm_get_hpet_capabilities(struct vmctx *c
 	return (error);
 }
 
-static int
-gla2gpa(struct vmctx *ctx, int vcpu, struct vm_guest_paging *paging,
-    uint64_t gla, int prot, int *fault, uint64_t *gpa)
+int
+vm_gla2gpa(struct vmctx *ctx, int vcpu, struct vm_guest_paging *paging,
+    uint64_t gla, int prot, uint64_t *gpa, int *fault)
 {
 	struct vm_gla2gpa gg;
 	int error;
@@ -979,29 +980,18 @@ gla2gpa(struct vmctx *ctx, int vcpu, str
 	return (error);
 }
 
-int
-vm_gla2gpa(struct vmctx *ctx, int vcpu, struct vm_guest_paging *paging,
-    uint64_t gla, int prot, uint64_t *gpa)
-{
-	int error, fault;
-
-	error = gla2gpa(ctx, vcpu, paging, gla, prot, &fault, gpa);
-	if (fault)
-		error = fault;
-	return (error);
-}
-
 #ifndef min
 #define	min(a,b)	(((a) < (b)) ? (a) : (b))
 #endif
 
 int
 vm_copy_setup(struct vmctx *ctx, int vcpu, struct vm_guest_paging *paging,
-    uint64_t gla, size_t len, int prot, struct iovec *iov, int iovcnt)
+    uint64_t gla, size_t len, int prot, struct iovec *iov, int iovcnt,
+    int *fault)
 {
 	void *va;
 	uint64_t gpa;
-	int error, fault, i, n, off;
+	int error, i, n, off;
 
 	for (i = 0; i < iovcnt; i++) {
 		iov[i].iov_base = 0;
@@ -1010,18 +1000,16 @@ vm_copy_setup(struct vmctx *ctx, int vcp
 
 	while (len) {
 		assert(iovcnt > 0);
-		error = gla2gpa(ctx, vcpu, paging, gla, prot, &fault, &gpa);
-		if (error)
-			return (-1);
-		if (fault)
-			return (1);
+		error = vm_gla2gpa(ctx, vcpu, paging, gla, prot, &gpa, fault);
+		if (error || *fault)
+			return (error);
 
 		off = gpa & PAGE_MASK;
 		n = min(len, PAGE_SIZE - off);
 
 		va = vm_map_gpa(ctx, gpa, n);
 		if (va == NULL)
-			return (-1);
+			return (EFAULT);
 
 		iov->iov_base = va;
 		iov->iov_len = n;

Modified: projects/release-arm-redux/lib/libvmmapi/vmmapi.h
==============================================================================
--- projects/release-arm-redux/lib/libvmmapi/vmmapi.h	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/lib/libvmmapi/vmmapi.h	Fri May  8 23:29:42 2015	(r282671)
@@ -64,7 +64,7 @@ int	vm_setup_memory(struct vmctx *ctx, s
 void	*vm_map_gpa(struct vmctx *ctx, vm_paddr_t gaddr, size_t len);
 int	vm_get_gpa_pmap(struct vmctx *, uint64_t gpa, uint64_t *pte, int *num);
 int	vm_gla2gpa(struct vmctx *, int vcpuid, struct vm_guest_paging *paging,
-		   uint64_t gla, int prot, uint64_t *gpa);
+		   uint64_t gla, int prot, uint64_t *gpa, int *fault);
 uint32_t vm_get_lowmem_limit(struct vmctx *ctx);
 void	vm_set_lowmem_limit(struct vmctx *ctx, uint32_t limit);
 void	vm_set_memflags(struct vmctx *ctx, int flags);
@@ -131,10 +131,15 @@ int	vm_get_hpet_capabilities(struct vmct
 /*
  * Translate the GLA range [gla,gla+len) into GPA segments in 'iov'.
  * The 'iovcnt' should be big enough to accomodate all GPA segments.
- * Returns 0 on success, 1 on a guest fault condition and -1 otherwise.
+ *
+ * retval	fault		Interpretation
+ *   0		  0		Success
+ *   0		  1		An exception was injected into the guest
+ * EFAULT	 N/A		Error
  */
 int	vm_copy_setup(struct vmctx *ctx, int vcpu, struct vm_guest_paging *pg,
-	    uint64_t gla, size_t len, int prot, struct iovec *iov, int iovcnt);
+	    uint64_t gla, size_t len, int prot, struct iovec *iov, int iovcnt,
+	    int *fault);
 void	vm_copyin(struct vmctx *ctx, int vcpu, struct iovec *guest_iov,
 	    void *host_dst, size_t len);
 void	vm_copyout(struct vmctx *ctx, int vcpu, const void *host_src,

Modified: projects/release-arm-redux/libexec/rtld-elf/debug.h
==============================================================================
--- projects/release-arm-redux/libexec/rtld-elf/debug.h	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/libexec/rtld-elf/debug.h	Fri May  8 23:29:42 2015	(r282671)
@@ -32,10 +32,6 @@
 #ifndef DEBUG_H
 #define DEBUG_H 1
 
-#ifndef __GNUC__
-#error "This file must be compiled with GCC"
-#endif
-
 #include <sys/cdefs.h>
 
 #include <string.h>

Modified: projects/release-arm-redux/libexec/rtld-elf/rtld.c
==============================================================================
--- projects/release-arm-redux/libexec/rtld-elf/rtld.c	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/libexec/rtld-elf/rtld.c	Fri May  8 23:29:42 2015	(r282671)
@@ -34,10 +34,6 @@
  * John Polstra <jdp@polstra.com>.
  */
 
-#ifndef __GNUC__
-#error "GCC is needed to compile this file"
-#endif
-
 #include <sys/param.h>
 #include <sys/mount.h>
 #include <sys/mman.h>

Modified: projects/release-arm-redux/share/man/man4/usb_quirk.4
==============================================================================
--- projects/release-arm-redux/share/man/man4/usb_quirk.4	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/share/man/man4/usb_quirk.4	Fri May  8 23:29:42 2015	(r282671)
@@ -16,7 +16,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd April 21, 2013
+.Dd May 7, 2015
 .Dt USB_QUIRK 4
 .Os
 .Sh NAME
@@ -170,6 +170,9 @@ ejects after Huawei SCSI command
 .It UQ_MSC_EJECT_TCT
 ejects after TCT SCSI command
 .Dv 0x06f504025270
+.It UQ_MSC_DYMO_EJECT
+ejects after HID command
+.Dv 0x1b5a01
 .El
 .Pp
 See

Modified: projects/release-arm-redux/share/man/man9/Makefile
==============================================================================
--- projects/release-arm-redux/share/man/man9/Makefile	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/share/man/man9/Makefile	Fri May  8 23:29:42 2015	(r282671)
@@ -1113,7 +1113,6 @@ MLINKS+=mutex.9 mtx_assert.9 \
 	mutex.9 mtx_unlock_spin.9 \
 	mutex.9 mtx_unlock_spin_flags.9
 MLINKS+=namei.9 NDFREE.9 \
-	namei.9 NDHASGIANT.9 \
 	namei.9 NDINIT.9
 MLINKS+=netisr.9 netisr_clearqdrops.9 \
 	netisr.9 netisr_default_flow2cpu.9 \

Modified: projects/release-arm-redux/share/man/man9/namei.9
==============================================================================
--- projects/release-arm-redux/share/man/man9/namei.9	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/share/man/man9/namei.9	Fri May  8 23:29:42 2015	(r282671)
@@ -33,14 +33,13 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 1, 2012
+.Dd May 6, 2015
 .Dt NAMEI 9
 .Os
 .Sh NAME
 .Nm namei ,
 .Nm NDINIT ,
 .Nm NDFREE ,
-.Nm NDHASGIANT
 .Nd pathname translation and lookup operations
 .Sh SYNOPSIS
 .In sys/param.h
@@ -55,8 +54,6 @@
 .Fc
 .Ft void
 .Fn NDFREE "struct nameidata *ndp" "const uint flags"
-.Ft int
-.Fn NDHASGIANT "struct nameidata *ndp"
 .Sh DESCRIPTION
 The
 .Nm
@@ -73,16 +70,6 @@ or
 depending on whether the
 .Dv LOCKLEAF
 flag was specified or not.
-If the
-.Va Giant
-lock is required,
-.Nm
-will acquire it if the caller indicates it is
-.Dv MPSAFE ,
-in which case the caller must later release
-.Va Giant
-based on the results of
-.Fn NDHASGIANT .
 .Pp
 The
 .Fn NDINIT
@@ -362,6 +349,3 @@ In order to solve this for the cases whe
 and
 .Dv LOCKLEAF
 are used, it is necessary to resort to recursive locking.
-.Pp
-Non-MPSAFE file systems exist, requiring callers to conditionally unlock
-.Va Giant .

Modified: projects/release-arm-redux/share/mk/src.libnames.mk
==============================================================================
--- projects/release-arm-redux/share/mk/src.libnames.mk	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/share/mk/src.libnames.mk	Fri May  8 23:29:42 2015	(r282671)
@@ -24,7 +24,7 @@ _PRIVATELIBS=	\
 		ucl \
 		unbound
 
-_INTERNALIBS=	\
+_INTERNALLIBS=	\
 		amu \
 		bsnmptools \
 		cron \
@@ -49,7 +49,7 @@ _INTERNALIBS=	\
 
 _LIBRARIES=	\
 		${_PRIVATELIBS} \
-		${_INTERNALIBS} \
+		${_INTERNALLIBS} \
 		alias \
 		archive \
 		asn1 \
@@ -243,7 +243,7 @@ LIB${_l:tu}?=	${DESTDIR}${LIBDIR}/libpri
 .endfor
 
 .for _l in ${_LIBRARIES}
-.if ${_INTERNALIBS:M${_l}}
+.if ${_INTERNALLIBS:M${_l}}
 LDADD_${_l}_L+=		-L${LIB${_l:tu}DIR}
 .endif
 DPADD_${_l}?=	${LIB${_l:tu}}

Modified: projects/release-arm-redux/sys/amd64/include/vmm.h
==============================================================================
--- projects/release-arm-redux/sys/amd64/include/vmm.h	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/sys/amd64/include/vmm.h	Fri May  8 23:29:42 2015	(r282671)
@@ -276,7 +276,13 @@ vcpu_is_running(struct vm *vm, int vcpu,
 static int __inline
 vcpu_should_yield(struct vm *vm, int vcpu)
 {
-	return (curthread->td_flags & (TDF_ASTPENDING | TDF_NEEDRESCHED));
+
+	if (curthread->td_flags & (TDF_ASTPENDING | TDF_NEEDRESCHED))
+		return (1);
+	else if (curthread->td_owepreempt)
+		return (1);
+	else
+		return (0);
 }
 #endif
 
@@ -345,9 +351,10 @@ struct vm_copyinfo {
  * at 'gla' and 'len' bytes long. The 'prot' should be set to PROT_READ for
  * a copyin or PROT_WRITE for a copyout. 
  *
- * Returns 0 on success.
- * Returns 1 if an exception was injected into the guest.
- * Returns -1 otherwise.
+ * retval	is_fault	Intepretation
+ *   0		   0		Success
+ *   0		   1		An exception was injected into the guest
+ * EFAULT	  N/A		Unrecoverable error
  *
  * The 'copyinfo[]' can be passed to 'vm_copyin()' or 'vm_copyout()' only if
  * the return value is 0. The 'copyinfo[]' resources should be freed by calling
@@ -355,7 +362,7 @@ struct vm_copyinfo {
  */
 int vm_copy_setup(struct vm *vm, int vcpuid, struct vm_guest_paging *paging,
     uint64_t gla, size_t len, int prot, struct vm_copyinfo *copyinfo,
-    int num_copyinfo);
+    int num_copyinfo, int *is_fault);
 void vm_copy_teardown(struct vm *vm, int vcpuid, struct vm_copyinfo *copyinfo,
     int num_copyinfo);
 void vm_copyin(struct vm *vm, int vcpuid, struct vm_copyinfo *copyinfo,

Modified: projects/release-arm-redux/sys/amd64/include/vmm_instruction_emul.h
==============================================================================
--- projects/release-arm-redux/sys/amd64/include/vmm_instruction_emul.h	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/sys/amd64/include/vmm_instruction_emul.h	Fri May  8 23:29:42 2015	(r282671)
@@ -81,17 +81,19 @@ int vie_calculate_gla(enum vm_cpu_mode c
  */
 int vmm_fetch_instruction(struct vm *vm, int cpuid,
 			  struct vm_guest_paging *guest_paging,
-			  uint64_t rip, int inst_length, struct vie *vie);
+			  uint64_t rip, int inst_length, struct vie *vie,
+			  int *is_fault);
 
 /*
  * Translate the guest linear address 'gla' to a guest physical address.
  *
- * Returns 0 on success and '*gpa' contains the result of the translation.
- * Returns 1 if an exception was injected into the guest.
- * Returns -1 otherwise.
+ * retval	is_fault	Interpretation
+ *   0		   0		'gpa' contains result of the translation
+ *   0		   1		An exception was injected into the guest
+ * EFAULT	  N/A		An unrecoverable hypervisor error occurred
  */
 int vm_gla2gpa(struct vm *vm, int vcpuid, struct vm_guest_paging *paging,
-    uint64_t gla, int prot, uint64_t *gpa);
+    uint64_t gla, int prot, uint64_t *gpa, int *is_fault);
 
 void vie_init(struct vie *vie, const char *inst_bytes, int inst_length);
 

Modified: projects/release-arm-redux/sys/amd64/vmm/vmm.c
==============================================================================
--- projects/release-arm-redux/sys/amd64/vmm/vmm.c	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/sys/amd64/vmm/vmm.c	Fri May  8 23:29:42 2015	(r282671)
@@ -1256,7 +1256,7 @@ vm_handle_inst_emul(struct vm *vm, int v
 	mem_region_read_t mread;
 	mem_region_write_t mwrite;
 	enum vm_cpu_mode cpu_mode;
-	int cs_d, error, length;
+	int cs_d, error, fault, length;
 
 	vcpu = &vm->vcpu[vcpuid];
 	vme = &vcpu->exitinfo;
@@ -1279,19 +1279,15 @@ vm_handle_inst_emul(struct vm *vm, int v
 		 */
 		length = vme->inst_length ? vme->inst_length : VIE_INST_SIZE;
 		error = vmm_fetch_instruction(vm, vcpuid, paging, vme->rip +
-		    cs_base, length, vie);
+		    cs_base, length, vie, &fault);
 	} else {
 		/*
 		 * The instruction bytes have already been copied into 'vie'
 		 */
-		error = 0;
+		error = fault = 0;
 	}
-	if (error == 1)
-		return (0);		/* Resume guest to handle page fault */
-	else if (error == -1)
-		return (EFAULT);
-	else if (error != 0)
-		panic("%s: vmm_fetch_instruction error %d", __func__, error);
+	if (error || fault)
+		return (error);
 
 	if (vmm_decode_instruction(vm, vcpuid, gla, cpu_mode, cs_d, vie) != 0) {
 		VCPU_CTR1(vm, vcpuid, "Error decoding instruction at %#lx",
@@ -2323,7 +2319,7 @@ vm_copy_teardown(struct vm *vm, int vcpu
 int
 vm_copy_setup(struct vm *vm, int vcpuid, struct vm_guest_paging *paging,
     uint64_t gla, size_t len, int prot, struct vm_copyinfo *copyinfo,
-    int num_copyinfo)
+    int num_copyinfo, int *fault)
 {
 	int error, idx, nused;
 	size_t n, off, remaining;
@@ -2336,8 +2332,8 @@ vm_copy_setup(struct vm *vm, int vcpuid,
 	remaining = len;
 	while (remaining > 0) {
 		KASSERT(nused < num_copyinfo, ("insufficient vm_copyinfo"));
-		error = vm_gla2gpa(vm, vcpuid, paging, gla, prot, &gpa);
-		if (error)
+		error = vm_gla2gpa(vm, vcpuid, paging, gla, prot, &gpa, fault);
+		if (error || *fault)
 			return (error);
 		off = gpa & PAGE_MASK;
 		n = min(remaining, PAGE_SIZE - off);
@@ -2359,8 +2355,9 @@ vm_copy_setup(struct vm *vm, int vcpuid,
 
 	if (idx != nused) {
 		vm_copy_teardown(vm, vcpuid, copyinfo, num_copyinfo);
-		return (-1);
+		return (EFAULT);
 	} else {
+		*fault = 0;
 		return (0);
 	}
 }

Modified: projects/release-arm-redux/sys/amd64/vmm/vmm_dev.c
==============================================================================
--- projects/release-arm-redux/sys/amd64/vmm/vmm_dev.c	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/sys/amd64/vmm/vmm_dev.c	Fri May  8 23:29:42 2015	(r282671)
@@ -441,19 +441,9 @@ vmmdev_ioctl(struct cdev *cdev, u_long c
 		CTASSERT(PROT_EXEC == VM_PROT_EXECUTE);
 		gg = (struct vm_gla2gpa *)data;
 		error = vm_gla2gpa(sc->vm, gg->vcpuid, &gg->paging, gg->gla,
-		    gg->prot, &gg->gpa);
-		KASSERT(error == 0 || error == 1 || error == -1,
+		    gg->prot, &gg->gpa, &gg->fault);
+		KASSERT(error == 0 || error == EFAULT,
 		    ("%s: vm_gla2gpa unknown error %d", __func__, error));
-		if (error >= 0) {
-			/*
-			 * error = 0: the translation was successful
-			 * error = 1: a fault was injected into the guest
-			 */
-			gg->fault = error;
-			error = 0;
-		} else {
-			error = EFAULT;
-		}
 		break;
 	}
 	case VM_ACTIVATE_CPU:

Modified: projects/release-arm-redux/sys/amd64/vmm/vmm_instruction_emul.c
==============================================================================
--- projects/release-arm-redux/sys/amd64/vmm/vmm_instruction_emul.c	Fri May  8 22:22:51 2015	(r282670)
+++ projects/release-arm-redux/sys/amd64/vmm/vmm_instruction_emul.c	Fri May  8 23:29:42 2015	(r282671)
@@ -597,13 +597,11 @@ emulate_movx(void *vm, int vcpuid, uint6
 
 /*
  * Helper function to calculate and validate a linear address.
- *
- * Returns 0 on success and 1 if an exception was injected into the guest.
  */
 static int
 get_gla(void *vm, int vcpuid, struct vie *vie, struct vm_guest_paging *paging,
     int opsize, int addrsize, int prot, enum vm_reg_name seg,
-    enum vm_reg_name gpr, uint64_t *gla)
+    enum vm_reg_name gpr, uint64_t *gla, int *fault)
 {
 	struct seg_desc desc;
 	uint64_t cr0, val, rflags;
@@ -629,7 +627,7 @@ get_gla(void *vm, int vcpuid, struct vie
 			vm_inject_ss(vm, vcpuid, 0);
 		else
 			vm_inject_gp(vm, vcpuid);
-		return (1);
+		goto guest_fault;
 	}
 
 	if (vie_canonical_check(paging->cpu_mode, *gla)) {
@@ -637,14 +635,19 @@ get_gla(void *vm, int vcpuid, struct vie
 			vm_inject_ss(vm, vcpuid, 0);
 		else
 			vm_inject_gp(vm, vcpuid);
-		return (1);
+		goto guest_fault;
 	}
 
 	if (vie_alignment_check(paging->cpl, opsize, cr0, rflags, *gla)) {
 		vm_inject_ac(vm, vcpuid, 0);
-		return (1);
+		goto guest_fault;
 	}
 
+	*fault = 0;
+	return (0);
+
+guest_fault:
+	*fault = 1;
 	return (0);
 }
 
@@ -660,7 +663,7 @@ emulate_movs(void *vm, int vcpuid, uint6
 #endif
 	uint64_t dstaddr, srcaddr, dstgpa, srcgpa, val;
 	uint64_t rcx, rdi, rsi, rflags;
-	int error, opsize, seg, repeat;
+	int error, fault, opsize, seg, repeat;
 
 	opsize = (vie->op.op_byte == 0xA4) ? 1 : vie->opsize;
 	val = 0;
@@ -683,8 +686,10 @@ emulate_movs(void *vm, int vcpuid, uint6
 		 * The count register is %rcx, %ecx or %cx depending on the
 		 * address size of the instruction.
 		 */
-		if ((rcx & vie_size2mask(vie->addrsize)) == 0)
-			return (0);
+		if ((rcx & vie_size2mask(vie->addrsize)) == 0) {
+			error = 0;
+			goto done;
+		}
 	}
 
 	/*
@@ -705,13 +710,16 @@ emulate_movs(void *vm, int vcpuid, uint6
 
 	seg = vie->segment_override ? vie->segment_register : VM_REG_GUEST_DS;
 	error = get_gla(vm, vcpuid, vie, paging, opsize, vie->addrsize,
-	    PROT_READ, seg, VM_REG_GUEST_RSI, &srcaddr);
-	if (error)
+	    PROT_READ, seg, VM_REG_GUEST_RSI, &srcaddr, &fault);
+	if (error || fault)
 		goto done;
 
 	error = vm_copy_setup(vm, vcpuid, paging, srcaddr, opsize, PROT_READ,
-	    copyinfo, nitems(copyinfo));
+	    copyinfo, nitems(copyinfo), &fault);
 	if (error == 0) {
+		if (fault)

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201505082329.t48NThWX075705>