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...
Mark Murray
markm at FreeBSD.org
Wed Nov 27 14:00:57 UTC 2013
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 <sys/types.h>
#include <sys/ptrace.h>
#include <sys/sysctl.h>
+#include <sys/user.h>
#include <machine/reg.h>
#ifdef HAVE_SYS_PROCFS_H
@@ -212,24 +213,23 @@ Please report this to <bug-gdb at gnu.org>.
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 at 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 <machine/fpu.h>
#include <machine/segments.h>
+#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 <sys/dtrace_bsd.h>
-
/*
* 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 <sys/dtrace_bsd.h>
+
#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 <stdio.h>
#include <stdlib.h>
#include <assert.h>
+#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <stdbool.h>
@@ -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 <disk-path>] [-h <host-path>]\n"
- " %*s [-e <name=value>] <vmname>\n", progname,
+ " %*s [-e <name=value>] [-c <console-device>] <vmname>\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());
More information about the svn-src-projects
mailing list