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...
Glen Barber
gjb at FreeBSD.org
Fri May 8 23:29:49 UTC 2015
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 at 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 at 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 ***
More information about the svn-src-projects
mailing list