From owner-svn-src-projects@FreeBSD.ORG Wed Nov 27 14:00:57 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id B96FDC5B; Wed, 27 Nov 2013 14:00:57 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 9A4B22203; Wed, 27 Nov 2013 14:00:57 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id rARE0vTh089285; Wed, 27 Nov 2013 14:00:57 GMT (envelope-from markm@svn.freebsd.org) Received: (from markm@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id rARE0qEo089253; Wed, 27 Nov 2013 14:00:52 GMT (envelope-from markm@svn.freebsd.org) Message-Id: <201311271400.rARE0qEo089253@svn.freebsd.org> From: Mark Murray Date: Wed, 27 Nov 2013 14:00:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r258682 - in projects/random_number_generator: . contrib/gcclibs/libcpp contrib/gdb/gdb etc/mtree release sbin/ipfw sbin/sysctl share/man/man4 share/mk sys/amd64/include sys/boot/fdt/dt... X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 27 Nov 2013 14:00:57 -0000 Author: markm Date: Wed Nov 27 14:00:52 2013 New Revision: 258682 URL: http://svnweb.freebsd.org/changeset/base/258682 Log: MFC - tracking commit. Modified: projects/random_number_generator/UPDATING projects/random_number_generator/contrib/gcclibs/libcpp/errors.c projects/random_number_generator/contrib/gdb/gdb/amd64fbsd-nat.c projects/random_number_generator/etc/mtree/BSD.var.dist projects/random_number_generator/release/Makefile projects/random_number_generator/sbin/ipfw/ipfw2.c projects/random_number_generator/sbin/sysctl/sysctl.c projects/random_number_generator/share/man/man4/Makefile projects/random_number_generator/share/man/man4/u3g.4 projects/random_number_generator/share/mk/bsd.own.mk projects/random_number_generator/sys/amd64/include/pcb.h projects/random_number_generator/sys/amd64/include/segments.h projects/random_number_generator/sys/boot/fdt/dts/rpi.dts projects/random_number_generator/sys/compat/freebsd32/freebsd32.h projects/random_number_generator/sys/dev/sfxge/common/siena_nic.c projects/random_number_generator/sys/fs/nfsclient/nfs_kdtrace.h projects/random_number_generator/sys/kern/kern_proc.c projects/random_number_generator/sys/net/vnet.c projects/random_number_generator/sys/sys/sysctl.h projects/random_number_generator/sys/sys/user.h projects/random_number_generator/usr.sbin/bhyve/uart_emul.c projects/random_number_generator/usr.sbin/bhyveload/bhyveload.8 projects/random_number_generator/usr.sbin/bhyveload/bhyveload.c Directory Properties: projects/random_number_generator/ (props changed) projects/random_number_generator/contrib/gdb/ (props changed) projects/random_number_generator/sbin/ (props changed) projects/random_number_generator/sbin/ipfw/ (props changed) projects/random_number_generator/share/man/man4/ (props changed) projects/random_number_generator/sys/ (props changed) projects/random_number_generator/sys/boot/ (props changed) projects/random_number_generator/usr.sbin/bhyve/ (props changed) projects/random_number_generator/usr.sbin/bhyveload/ (props changed) Modified: projects/random_number_generator/UPDATING ============================================================================== --- projects/random_number_generator/UPDATING Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/UPDATING Wed Nov 27 14:00:52 2013 (r258682) @@ -31,6 +31,13 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 11 disable the most expensive debugging functionality run "ln -s 'abort:false,junk:false' /etc/malloc.conf".) +20131126: + WITH_LIB32 has been changed to WITHOUT_LIB32 by default. You + can set WITH_LIB32=yes in make.conf or src.conf, or if you need + to do a quick 32 bit library build you can do a 'make build32' + and 'make install32' as a separate step AFTER doing a + buildworld/installworld. + 20131108: The WITHOUT_ATF build knob has been removed and its functionality has been subsumed into the more generic WITHOUT_TESTS. If you were Modified: projects/random_number_generator/contrib/gcclibs/libcpp/errors.c ============================================================================== --- projects/random_number_generator/contrib/gcclibs/libcpp/errors.c Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/contrib/gcclibs/libcpp/errors.c Wed Nov 27 14:00:52 2013 (r258682) @@ -153,7 +153,20 @@ cpp_error (cpp_reader * pfile, int level } else { - src_loc = pfile->cur_token[-1].src_loc; + /* Find actual previous token. */ + cpp_token *t; + + if (pfile->cur_token != pfile->cur_run->base) + t = pfile->cur_token - 1; + else + { + if (pfile->cur_run->prev != NULL) + t = pfile->cur_run->prev->limit; + else + t = NULL; + } + /* Retrieve corresponding source location, unless we failed. */ + src_loc = t ? t->src_loc : 0; } if (_cpp_begin_message (pfile, level, src_loc, 0)) Modified: projects/random_number_generator/contrib/gdb/gdb/amd64fbsd-nat.c ============================================================================== --- projects/random_number_generator/contrib/gdb/gdb/amd64fbsd-nat.c Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/contrib/gdb/gdb/amd64fbsd-nat.c Wed Nov 27 14:00:52 2013 (r258682) @@ -29,6 +29,7 @@ #include #include #include +#include #include #ifdef HAVE_SYS_PROCFS_H @@ -212,24 +213,23 @@ Please report this to . SC_RBP_OFFSET = offset; - /* FreeBSD provides a kern.ps_strings sysctl that we can use to + /* FreeBSD provides a kern.proc.sigtramp sysctl that we can use to locate the sigtramp. That way we can still recognize a sigtramp - if its location is changed in a new kernel. Of course this is - still based on the assumption that the sigtramp is placed - directly under the location where the program arguments and - environment can be found. */ + if its location is changed in a new kernel. */ { - int mib[2]; - long ps_strings; + int mib[4]; + struct kinfo_sigtramp kst; size_t len; mib[0] = CTL_KERN; - mib[1] = KERN_PS_STRINGS; - len = sizeof (ps_strings); - if (sysctl (mib, 2, &ps_strings, &len, NULL, 0) == 0) + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_SIGTRAMP; + mib[3] = getpid(); + len = sizeof (kst); + if (sysctl (mib, sizeof(mib) / sizeof(mib[0]), &kst, &len, NULL, 0) == 0) { - amd64fbsd_sigtramp_start_addr = ps_strings - 32; - amd64fbsd_sigtramp_end_addr = ps_strings; + amd64fbsd_sigtramp_start_addr = kst.ksigtramp_start; + amd64fbsd_sigtramp_end_addr = kst.ksigtramp_end; } } } Modified: projects/random_number_generator/etc/mtree/BSD.var.dist ============================================================================== --- projects/random_number_generator/etc/mtree/BSD.var.dist Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/etc/mtree/BSD.var.dist Wed Nov 27 14:00:52 2013 (r258682) @@ -28,7 +28,7 @@ /set gname=wheel backups .. - cache + cache mode=0755 .. crash .. Modified: projects/random_number_generator/release/Makefile ============================================================================== --- projects/random_number_generator/release/Makefile Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/release/Makefile Wed Nov 27 14:00:52 2013 (r258682) @@ -4,6 +4,7 @@ # # User-driven targets: # cdrom: Builds release CD-ROM media (disc1.iso) +# dvdrom: Builds release DVD-ROM media (dvd1.iso) # memstick: Builds memory stick image (memstick.img) # mini-memstick: Builds minimal memory stick image (mini-memstick.img) # ftp: Sets up FTP distribution area (ftp) @@ -18,6 +19,7 @@ # NOPORTS: if set, do not distribute ports tree # NOSRC: if set, do not distribute source tree # NODOC: if set, do not generate release documentation +# NODVD: if set, do not generate dvd1.iso # TARGET/TARGET_ARCH: architecture of built release # Modified: projects/random_number_generator/sbin/ipfw/ipfw2.c ============================================================================== --- projects/random_number_generator/sbin/ipfw/ipfw2.c Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/sbin/ipfw/ipfw2.c Wed Nov 27 14:00:52 2013 (r258682) @@ -4274,13 +4274,24 @@ table_fill_xentry(char *arg, ipfw_table_ addrlen = sizeof(struct in6_addr); } else { /* Port or any other key */ - key = strtol(arg, &p, 10); /* Skip non-base 10 entries like 'fa1' */ - if (p != arg) { + key = strtol(arg, &p, 10); + if (*p == '\0') { pkey = (uint32_t *)paddr; *pkey = htonl(key); type = IPFW_TABLE_CIDR; + masklen = 32; addrlen = sizeof(uint32_t); + } else if ((p != arg) && (*p == '.')) { + /* + * Warn on IPv4 address strings + * which are "valid" for inet_aton() but not + * in inet_pton(). + * + * Typical examples: '10.5' or '10.0.0.05' + */ + errx(EX_DATAERR, + "Invalid IPv4 address: %s", arg); } } } Modified: projects/random_number_generator/sbin/sysctl/sysctl.c ============================================================================== --- projects/random_number_generator/sbin/sysctl/sysctl.c Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/sbin/sysctl/sysctl.c Wed Nov 27 14:00:52 2013 (r258682) @@ -201,7 +201,7 @@ parse(const char *string, int lineno) cp = buf; if (snprintf(buf, BUFSIZ, "%s", string) >= BUFSIZ) { - warn("oid too long: '%s'%s", string, line); + warnx("oid too long: '%s'%s", string, line); return (1); } bufp = strsep(&cp, "=:"); @@ -260,7 +260,7 @@ parse(const char *string, int lineno) } } else { if ((kind & CTLTYPE) == CTLTYPE_NODE) { - warn("oid '%s' isn't a leaf node%s", bufp, line); + warnx("oid '%s' isn't a leaf node%s", bufp, line); return (1); } Modified: projects/random_number_generator/share/man/man4/Makefile ============================================================================== --- projects/random_number_generator/share/man/man4/Makefile Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/share/man/man4/Makefile Wed Nov 27 14:00:52 2013 (r258682) @@ -157,6 +157,8 @@ MAN= aac.4 \ gif.4 \ gpib.4 \ gpio.4 \ + gpioiic.4 \ + gpioled.4 \ gre.4 \ h_ertt.4 \ hatm.4 \ Modified: projects/random_number_generator/share/man/man4/u3g.4 ============================================================================== --- projects/random_number_generator/share/man/man4/u3g.4 Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/share/man/man4/u3g.4 Wed Nov 27 14:00:52 2013 (r258682) @@ -103,10 +103,6 @@ and .Xr usb_quirk 4 , .Xr devd 8 , .Xr usbconfig 8 -.Sh BUGS -The automatic mode switch from disk mode to modem mode does not work unless -the driver is either built into the kernel or loaded before the device is -connected. .Sh HISTORY The .Nm @@ -125,3 +121,7 @@ driver was written by and .An Nick Hibma Aq n_hibma@FreeBSD.org . Hardware for testing was provided by AnyWi Technologies, Leiden, NL. +.Sh BUGS +The automatic mode switch from disk mode to modem mode does not work unless +the driver is either built into the kernel or loaded before the device is +connected. Modified: projects/random_number_generator/share/mk/bsd.own.mk ============================================================================== --- projects/random_number_generator/share/mk/bsd.own.mk Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/share/mk/bsd.own.mk Wed Nov 27 14:00:52 2013 (r258682) @@ -303,7 +303,6 @@ __DEFAULT_YES_OPTIONS = \ LDNS \ LDNS_UTILS \ LEGACY_CONSOLE \ - LIB32 \ LIBPTHREAD \ LIBTHR \ LOCALES \ @@ -369,6 +368,7 @@ __DEFAULT_NO_OPTIONS = \ GPL_DTC \ HESIOD \ INSTALL_AS_USER \ + LIB32 \ LLDB \ NAND \ OFED \ Modified: projects/random_number_generator/sys/amd64/include/pcb.h ============================================================================== --- projects/random_number_generator/sys/amd64/include/pcb.h Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/sys/amd64/include/pcb.h Wed Nov 27 14:00:52 2013 (r258682) @@ -43,6 +43,7 @@ #include #include +#ifdef __amd64__ struct pcb { register_t pcb_r15; register_t pcb_r14; @@ -105,6 +106,7 @@ struct pcb { uint64_t pcb_pad[3]; }; +#endif #ifdef _KERNEL struct trapframe; Modified: projects/random_number_generator/sys/amd64/include/segments.h ============================================================================== --- projects/random_number_generator/sys/amd64/include/segments.h Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/sys/amd64/include/segments.h Wed Nov 27 14:00:52 2013 (r258682) @@ -82,8 +82,8 @@ struct soft_segment_descriptor { * region descriptors, used to load gdt/idt tables before segments yet exist. */ struct region_descriptor { - unsigned long rd_limit:16; /* segment extent */ - unsigned long rd_base:64 __packed; /* base address */ + uint64_t rd_limit:16; /* segment extent */ + uint64_t rd_base:64 __packed; /* base address */ } __packed; #ifdef _KERNEL Modified: projects/random_number_generator/sys/boot/fdt/dts/rpi.dts ============================================================================== --- projects/random_number_generator/sys/boot/fdt/dts/rpi.dts Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/sys/boot/fdt/dts/rpi.dts Wed Nov 27 14:00:52 2013 (r258682) @@ -316,7 +316,7 @@ ok { label = "ok"; - gpios = <&gpio 16 1>; + gpios = <&gpio 16 2 0>; /* Don't change this - it configures * how the led driver determines if Modified: projects/random_number_generator/sys/compat/freebsd32/freebsd32.h ============================================================================== --- projects/random_number_generator/sys/compat/freebsd32/freebsd32.h Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/sys/compat/freebsd32/freebsd32.h Wed Nov 27 14:00:52 2013 (r258682) @@ -362,6 +362,12 @@ struct kinfo_proc32 { int ki_tdflags; }; +struct kinfo_sigtramp32 { + uint32_t ksigtramp_start; + uint32_t ksigtramp_end; + uint32_t ksigtramp_spare[4]; +}; + struct kld32_file_stat_1 { int version; /* set to sizeof(struct kld_file_stat_1) */ char name[MAXPATHLEN]; Modified: projects/random_number_generator/sys/dev/sfxge/common/siena_nic.c ============================================================================== --- projects/random_number_generator/sys/dev/sfxge/common/siena_nic.c Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/sys/dev/sfxge/common/siena_nic.c Wed Nov 27 14:00:52 2013 (r258682) @@ -589,6 +589,7 @@ siena_nic_probe( unsigned int mask; int rc; + mask = 0; /* XXX: pacify gcc */ EFSYS_ASSERT3U(enp->en_family, ==, EFX_FAMILY_SIENA); /* Read clear any assertion state */ Modified: projects/random_number_generator/sys/fs/nfsclient/nfs_kdtrace.h ============================================================================== --- projects/random_number_generator/sys/fs/nfsclient/nfs_kdtrace.h Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/sys/fs/nfsclient/nfs_kdtrace.h Wed Nov 27 14:00:52 2013 (r258682) @@ -32,9 +32,6 @@ #ifndef _NFSCL_NFS_KDTRACE_H_ #define _NFSCL_NFS_KDTRACE_H_ -#ifdef KDTRACE_HOOKS -#include - /* * Definitions for NFS access cache probes. */ @@ -43,6 +40,17 @@ extern uint32_t nfscl_accesscache_get_hi extern uint32_t nfscl_accesscache_get_miss_id; extern uint32_t nfscl_accesscache_load_done_id; +/* + * Definitions for NFS attribute cache probes. + */ +extern uint32_t nfscl_attrcache_flush_done_id; +extern uint32_t nfscl_attrcache_get_hit_id; +extern uint32_t nfscl_attrcache_get_miss_id; +extern uint32_t nfscl_attrcache_load_done_id; + +#ifdef KDTRACE_HOOKS +#include + #define KDTRACE_NFS_ACCESSCACHE_FLUSH_DONE(vp) do { \ if (dtrace_nfscl_accesscache_flush_done_probe != NULL) \ (dtrace_nfscl_accesscache_flush_done_probe)( \ @@ -70,14 +78,6 @@ extern uint32_t nfscl_accesscache_load_d (rmode), (error)); \ } while (0) -/* - * Definitions for NFS attribute cache probes. - */ -extern uint32_t nfscl_attrcache_flush_done_id; -extern uint32_t nfscl_attrcache_get_hit_id; -extern uint32_t nfscl_attrcache_get_miss_id; -extern uint32_t nfscl_attrcache_load_done_id; - #define KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp) do { \ if (dtrace_nfscl_attrcache_flush_done_probe != NULL) \ (dtrace_nfscl_attrcache_flush_done_probe)( \ Modified: projects/random_number_generator/sys/kern/kern_proc.c ============================================================================== --- projects/random_number_generator/sys/kern/kern_proc.c Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/sys/kern/kern_proc.c Wed Nov 27 14:00:52 2013 (r258682) @@ -2631,6 +2631,60 @@ errout: return (error); } +static int +sysctl_kern_proc_sigtramp(SYSCTL_HANDLER_ARGS) +{ + int *name = (int *)arg1; + u_int namelen = arg2; + struct proc *p; + struct kinfo_sigtramp kst; + const struct sysentvec *sv; + int error; +#ifdef COMPAT_FREEBSD32 + struct kinfo_sigtramp32 kst32; +#endif + + if (namelen != 1) + return (EINVAL); + + error = pget((pid_t)name[0], PGET_CANDEBUG, &p); + if (error != 0) + return (error); + sv = p->p_sysent; +#ifdef COMPAT_FREEBSD32 + if ((req->flags & SCTL_MASK32) != 0) { + bzero(&kst32, sizeof(kst32)); + if (SV_PROC_FLAG(p, SV_ILP32)) { + if (sv->sv_sigcode_base != 0) { + kst32.ksigtramp_start = sv->sv_sigcode_base; + kst32.ksigtramp_end = sv->sv_sigcode_base + + *sv->sv_szsigcode; + } else { + kst32.ksigtramp_start = sv->sv_psstrings - + *sv->sv_szsigcode; + kst32.ksigtramp_end = sv->sv_psstrings; + } + } + PROC_UNLOCK(p); + error = SYSCTL_OUT(req, &kst32, sizeof(kst32)); + return (error); + } +#endif + bzero(&kst, sizeof(kst)); + if (sv->sv_sigcode_base != 0) { + kst.ksigtramp_start = (char *)sv->sv_sigcode_base; + kst.ksigtramp_end = (char *)sv->sv_sigcode_base + + *sv->sv_szsigcode; + } else { + kst.ksigtramp_start = (char *)sv->sv_psstrings - + *sv->sv_szsigcode; + kst.ksigtramp_end = (char *)sv->sv_psstrings; + } + PROC_UNLOCK(p); + error = SYSCTL_OUT(req, &kst, sizeof(kst)); + return (error); +} + SYSCTL_NODE(_kern, KERN_PROC, proc, CTLFLAG_RD, 0, "Process table"); SYSCTL_PROC(_kern_proc, KERN_PROC_ALL, all, CTLFLAG_RD|CTLTYPE_STRUCT| @@ -2739,3 +2793,7 @@ static SYSCTL_NODE(_kern_proc, KERN_PROC static SYSCTL_NODE(_kern_proc, KERN_PROC_OSREL, osrel, CTLFLAG_RW | CTLFLAG_ANYBODY | CTLFLAG_MPSAFE, sysctl_kern_proc_osrel, "Process binary osreldate"); + +static SYSCTL_NODE(_kern_proc, KERN_PROC_SIGTRAMP, sigtramp, CTLFLAG_RD | + CTLFLAG_MPSAFE, sysctl_kern_proc_sigtramp, + "Process signal trampoline location"); Modified: projects/random_number_generator/sys/net/vnet.c ============================================================================== --- projects/random_number_generator/sys/net/vnet.c Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/sys/net/vnet.c Wed Nov 27 14:00:52 2013 (r258682) @@ -216,7 +216,7 @@ SDT_PROBE_DEFINE2(vnet, functions, vnet_ "int", "struct vnet *"); SDT_PROBE_DEFINE2(vnet, functions, vnet_destroy, entry, "int", "struct vnet *"); -SDT_PROBE_DEFINE1(vnet, functions, vnet_destroy, entry, +SDT_PROBE_DEFINE1(vnet, functions, vnet_destroy, return, "int"); #ifdef DDB Modified: projects/random_number_generator/sys/sys/sysctl.h ============================================================================== --- projects/random_number_generator/sys/sys/sysctl.h Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/sys/sys/sysctl.h Wed Nov 27 14:00:52 2013 (r258682) @@ -530,6 +530,7 @@ SYSCTL_ALLOWED_TYPES(UINT64, uint64_t *a #define KERN_PROC_PS_STRINGS 38 /* get ps_strings location */ #define KERN_PROC_UMASK 39 /* process umask */ #define KERN_PROC_OSREL 40 /* osreldate for process binary */ +#define KERN_PROC_SIGTRAMP 41 /* signal trampoline location */ /* * KERN_IPC identifiers Modified: projects/random_number_generator/sys/sys/user.h ============================================================================== --- projects/random_number_generator/sys/sys/user.h Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/sys/sys/user.h Wed Nov 27 14:00:52 2013 (r258682) @@ -498,6 +498,12 @@ struct kinfo_kstack { int _kkst_ispare[16]; /* Space for more stuff. */ }; +struct kinfo_sigtramp { + void *ksigtramp_start; + void *ksigtramp_end; + void *ksigtramp_spare[4]; +}; + #ifdef _KERNEL /* Flags for kern_proc_out function. */ #define KERN_PROC_NOTHREADS 0x1 Modified: projects/random_number_generator/usr.sbin/bhyve/uart_emul.c ============================================================================== --- projects/random_number_generator/usr.sbin/bhyve/uart_emul.c Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/usr.sbin/bhyve/uart_emul.c Wed Nov 27 14:00:52 2013 (r258682) @@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -67,6 +68,7 @@ __FBSDID("$FreeBSD$"); #define FIFOSZ 16 static bool uart_stdio; /* stdio in use for i/o */ +static struct termios tio_stdio_orig; static struct { int baseaddr; @@ -87,6 +89,12 @@ struct fifo { int size; /* size of the fifo */ }; +struct ttyfd { + bool opened; + int fd; /* tty device file descriptor */ + struct termios tio_orig, tio_new; /* I/O Terminals */ +}; + struct uart_softc { pthread_mutex_t mtx; /* protects all softc elements */ uint8_t data; /* Data register (R/W) */ @@ -103,8 +111,7 @@ struct uart_softc { struct fifo rxfifo; - bool opened; - bool stdio; + struct ttyfd tty; bool thre_int_pending; /* THRE interrupt pending */ void *arg; @@ -114,38 +121,41 @@ struct uart_softc { static void uart_drain(int fd, enum ev_type ev, void *arg); -static struct termios tio_orig, tio_new; /* I/O Terminals */ - static void ttyclose(void) { - tcsetattr(STDIN_FILENO, TCSANOW, &tio_orig); + tcsetattr(STDIN_FILENO, TCSANOW, &tio_stdio_orig); } static void -ttyopen(void) +ttyopen(struct ttyfd *tf) { - tcgetattr(STDIN_FILENO, &tio_orig); + tcgetattr(tf->fd, &tf->tio_orig); - cfmakeraw(&tio_new); - tcsetattr(STDIN_FILENO, TCSANOW, &tio_new); + tf->tio_new = tf->tio_orig; + cfmakeraw(&tf->tio_new); + tf->tio_new.c_cflag |= CLOCAL; + tcsetattr(tf->fd, TCSANOW, &tf->tio_new); - atexit(ttyclose); + if (tf->fd == STDIN_FILENO) { + tio_stdio_orig = tf->tio_orig; + atexit(ttyclose); + } } static bool -tty_char_available(void) +tty_char_available(struct ttyfd *tf) { fd_set rfds; struct timeval tv; FD_ZERO(&rfds); - FD_SET(STDIN_FILENO, &rfds); + FD_SET(tf->fd, &rfds); tv.tv_sec = 0; tv.tv_usec = 0; - if (select(STDIN_FILENO + 1, &rfds, NULL, NULL, &tv) > 0 ) { + if (select(tf->fd + 1, &rfds, NULL, NULL, &tv) > 0 ) { return (true); } else { return (false); @@ -153,12 +163,12 @@ tty_char_available(void) } static int -ttyread(void) +ttyread(struct ttyfd *tf) { char rb; - if (tty_char_available()) { - read(STDIN_FILENO, &rb, 1); + if (tty_char_available(tf)) { + read(tf->fd, &rb, 1); return (rb & 0xff); } else { return (-1); @@ -166,10 +176,10 @@ ttyread(void) } static void -ttywrite(unsigned char wb) +ttywrite(struct ttyfd *tf, unsigned char wb) { - (void)write(STDIN_FILENO, &wb, 1); + (void)write(tf->fd, &wb, 1); } static void @@ -226,10 +236,8 @@ uart_opentty(struct uart_softc *sc) { struct mevent *mev; - assert(!sc->opened && sc->stdio); - - ttyopen(); - mev = mevent_add(STDIN_FILENO, EVF_READ, uart_drain, sc); + ttyopen(&sc->tty); + mev = mevent_add(sc->tty.fd, EVF_READ, uart_drain, sc); assert(mev); } @@ -294,7 +302,7 @@ uart_drain(int fd, enum ev_type ev, void sc = arg; - assert(fd == STDIN_FILENO); + assert(fd == sc->tty.fd); assert(ev == EVF_READ); /* @@ -305,10 +313,10 @@ uart_drain(int fd, enum ev_type ev, void pthread_mutex_lock(&sc->mtx); if ((sc->mcr & MCR_LOOPBACK) != 0) { - (void) ttyread(); + (void) ttyread(&sc->tty); } else { while (fifo_available(&sc->rxfifo) && - ((ch = ttyread()) != -1)) { + ((ch = ttyread(&sc->tty)) != -1)) { fifo_putchar(&sc->rxfifo, ch); } uart_toggle_intr(sc); @@ -323,12 +331,6 @@ uart_write(struct uart_softc *sc, int of int fifosz; uint8_t msr; - /* Open terminal */ - if (!sc->opened && sc->stdio) { - uart_opentty(sc); - sc->opened = true; - } - pthread_mutex_lock(&sc->mtx); /* @@ -351,8 +353,8 @@ uart_write(struct uart_softc *sc, int of if (sc->mcr & MCR_LOOPBACK) { if (fifo_putchar(&sc->rxfifo, value) != 0) sc->lsr |= LSR_OE; - } else if (sc->stdio) { - ttywrite(value); + } else if (sc->tty.opened) { + ttywrite(&sc->tty, value); } /* else drop on floor */ sc->thre_int_pending = true; break; @@ -459,12 +461,6 @@ uart_read(struct uart_softc *sc, int off { uint8_t iir, intr_reason, reg; - /* Open terminal */ - if (!sc->opened && sc->stdio) { - uart_opentty(sc); - sc->opened = true; - } - pthread_mutex_lock(&sc->mtx); /* @@ -581,19 +577,47 @@ uart_init(uart_intr_func_t intr_assert, return (sc); } +static int +uart_tty_backend(struct uart_softc *sc, const char *opts) +{ + int fd; + int retval; + + retval = -1; + + fd = open(opts, O_RDWR); + if (fd > 0 && isatty(fd)) { + sc->tty.fd = fd; + sc->tty.opened = true; + retval = 0; + } + + return (retval); +} + int uart_set_backend(struct uart_softc *sc, const char *opts) { - /* - * XXX one stdio backend supported at this time. - */ + int retval; + + retval = -1; + if (opts == NULL) return (0); - if (strcmp("stdio", opts) == 0 && !uart_stdio) { - sc->stdio = true; - uart_stdio = true; - return (0); - } else - return (-1); + if (strcmp("stdio", opts) == 0) { + if (!uart_stdio) { + sc->tty.fd = STDIN_FILENO; + sc->tty.opened = true; + uart_stdio = true; + retval = 0; + } + } else if (uart_tty_backend(sc, opts) == 0) { + retval = 0; + } + + if (retval == 0) + uart_opentty(sc); + + return (retval); } Modified: projects/random_number_generator/usr.sbin/bhyveload/bhyveload.8 ============================================================================== --- projects/random_number_generator/usr.sbin/bhyveload/bhyveload.8 Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/usr.sbin/bhyveload/bhyveload.8 Wed Nov 27 14:00:52 2013 (r258682) @@ -39,6 +39,7 @@ guest inside a bhyve virtual machine .Op Fl d Ar disk-path .Op Fl h Ar host-path .Op Fl e Ar name=value +.Op Fl c Ar cons-dev .Ar vmname .Sh DESCRIPTION .Nm @@ -100,6 +101,16 @@ to .Pp The option may be used more than once to set more than one environment variable. +.It Fl c Ar cons-dev +.Ar cons-dev +is a +.Xr tty 4 +device to use for +.Nm +terminal I/O. +.Pp +The text string "stdio" is also accepted and selects the use of +unbuffered standard I/O. This is the default value. .El .Sh EXAMPLES To create a virtual machine named @@ -109,10 +120,23 @@ that boots off the ISO image and has 1GB memory allocated to it: .Pp .Dl "bhyveload -m 1G -d /freebsd/release.iso freebsd-vm" +.Pp +To create a virtual machine named +.Ar test-vm +with 256MB of memory allocated, the guest root filesystem under the host +directory +.Pa /user/images/test +and terminal I/O sent to the +.Xr nmdm 4 +device +.Pa /dev/nmdm1B +.Pp +.Dl "bhyveload -m 256MB -h /usr/images/test -c /dev/nmdm1B test-vm .Sh SEE ALSO .Xr bhyve 4 , .Xr bhyve 8 , .Xr loader 8 , +.Xr nmdm 4, .Xr vmm 4 .Sh HISTORY .Nm Modified: projects/random_number_generator/usr.sbin/bhyveload/bhyveload.c ============================================================================== --- projects/random_number_generator/usr.sbin/bhyveload/bhyveload.c Wed Nov 27 13:46:11 2013 (r258681) +++ projects/random_number_generator/usr.sbin/bhyveload/bhyveload.c Wed Nov 27 14:00:52 2013 (r258682) @@ -88,9 +88,10 @@ __FBSDID("$FreeBSD$"); #define GB (1024 * 1024 * 1024UL) #define BSP 0 -static char *host_base = "/"; +static char *host_base; static struct termios term, oldterm; static int disk_fd = -1; +static int consin_fd, consout_fd; static char *vmname, *progname; static struct vmctx *ctx; @@ -108,7 +109,7 @@ cb_putc(void *arg, int ch) { char c = ch; - write(1, &c, 1); + (void) write(consout_fd, &c, 1); } static int @@ -116,7 +117,7 @@ cb_getc(void *arg) { char c; - if (read(0, &c, 1) == 1) + if (read(consin_fd, &c, 1) == 1) return (c); return (-1); } @@ -126,7 +127,7 @@ cb_poll(void *arg) { int n; - if (ioctl(0, FIONREAD, &n) >= 0) + if (ioctl(consin_fd, FIONREAD, &n) >= 0) return (n > 0); return (0); } @@ -488,7 +489,7 @@ static void cb_exit(void *arg, int v) { - tcsetattr(0, TCSAFLUSH, &oldterm); + tcsetattr(consout_fd, TCSAFLUSH, &oldterm); exit(v); } @@ -564,13 +565,45 @@ static struct loader_callbacks cb = { .getenv = cb_getenv, }; +static int +altcons_open(char *path) +{ + struct stat sb; + int err; + int fd; + + /* + * Allow stdio to be passed in so that the same string + * can be used for the bhyveload console and bhyve com-port + * parameters + */ + if (!strcmp(path, "stdio")) + return (0); + + err = stat(path, &sb); + if (err == 0) { + if (!S_ISCHR(sb.st_mode)) + err = ENOTSUP; + else { + fd = open(path, O_RDWR | O_NONBLOCK); + if (fd < 0) + err = errno; + else + consin_fd = consout_fd = fd; + } + } + + return (err); +} + static void usage(void) { fprintf(stderr, "usage: %s [-m mem-size] [-d ] [-h ]\n" - " %*s [-e ] \n", progname, + " %*s [-e ] [-c ] \n", + progname, (int)strlen(progname), ""); exit(1); } @@ -589,8 +622,16 @@ main(int argc, char** argv) mem_size = 256 * MB; disk_image = NULL; - while ((opt = getopt(argc, argv, "d:e:h:m:")) != -1) { + consin_fd = STDIN_FILENO; + consout_fd = STDOUT_FILENO; + + while ((opt = getopt(argc, argv, "c:d:e:h:m:")) != -1) { switch (opt) { + case 'c': + error = altcons_open(optarg); + if (error != 0) + errx(EX_USAGE, "Could not open '%s'", optarg); + break; case 'd': disk_image = optarg; break; @@ -640,11 +681,13 @@ main(int argc, char** argv) exit(1); } - tcgetattr(0, &term); + tcgetattr(consout_fd, &term); oldterm = term; - term.c_lflag &= ~(ICANON|ECHO); - term.c_iflag &= ~ICRNL; - tcsetattr(0, TCSAFLUSH, &term); + cfmakeraw(&term); + term.c_cflag |= CLOCAL; + + tcsetattr(consout_fd, TCSAFLUSH, &term); + h = dlopen("/boot/userboot.so", RTLD_LOCAL); if (!h) { printf("%s\n", dlerror());