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>