Merge ^/head r285341 through r285792.
This commit is contained in:
commit
8d0f10857a
@ -99,6 +99,8 @@ OLD_FILES+=usr/lib/clang/3.6.1/lib/freebsd/libclang_rt.ubsan_cxx-x86_64.a
|
||||
OLD_DIRS+=usr/lib/clang/3.6.1/lib/freebsd
|
||||
OLD_DIRS+=usr/lib/clang/3.6.1/lib
|
||||
OLD_DIRS+=usr/lib/clang/3.6.1
|
||||
# 20150719: Remove libarchive.pc
|
||||
OLD_FILES+=usr/libdata/pkgconfig/libarchive.pc
|
||||
# 20150705: Rename DTrace provider man pages.
|
||||
OLD_FILES+=usr/share/man/man4/dtrace-io.4.gz
|
||||
OLD_FILES+=usr/share/man/man4/dtrace-ip.4.gz
|
||||
|
10
UPDATING
10
UPDATING
@ -92,7 +92,7 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 11.x IS SLOW:
|
||||
20150616:
|
||||
FreeBSD's old make (fmake) has been removed from the system. It is
|
||||
available as the devel/fmake port or via pkg install fmake.
|
||||
|
||||
|
||||
20150615:
|
||||
The fix for the issue described in the 20150614 sendmail entry
|
||||
below has been been committed in revision 284436. The work
|
||||
@ -115,7 +115,7 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 11.x IS SLOW:
|
||||
this interoperability, sendmail can be configured to use a
|
||||
2048 bit DH parameter by:
|
||||
|
||||
1. Edit /etc/mail/`hostname`.mc
|
||||
1. Edit /etc/mail/`hostname`.mc
|
||||
2. If a setting for confDH_PARAMETERS does not exist or
|
||||
exists and is set to a string beginning with '5',
|
||||
replace it with '2'.
|
||||
@ -228,7 +228,7 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 11.x IS SLOW:
|
||||
using a local socket. Users who have already enabled the
|
||||
local_unbound service should regenerate their configuration
|
||||
by running "service local_unbound setup" as root.
|
||||
|
||||
|
||||
20150102:
|
||||
The GNU texinfo and GNU info pages have been removed.
|
||||
To be able to view GNU info pages please install texinfo from ports.
|
||||
@ -619,7 +619,7 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 11.x IS SLOW:
|
||||
The GNU Compiler Collection and C++ standard library (libstdc++)
|
||||
are no longer built by default on platforms where clang is the system
|
||||
compiler. You can enable them with the WITH_GCC and WITH_GNUCXX
|
||||
options in src.conf.
|
||||
options in src.conf.
|
||||
|
||||
20130905:
|
||||
The PROCDESC kernel option is now part of the GENERIC kernel
|
||||
@ -973,7 +973,7 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 11.x IS SLOW:
|
||||
20120727:
|
||||
The sparc64 ZFS loader has been changed to no longer try to auto-
|
||||
detect ZFS providers based on diskN aliases but now requires these
|
||||
to be explicitly listed in the OFW boot-device environment variable.
|
||||
to be explicitly listed in the OFW boot-device environment variable.
|
||||
|
||||
20120712:
|
||||
The OpenSSL has been upgraded to 1.0.1c. Any binaries requiring
|
||||
|
@ -416,6 +416,7 @@ if necessary, to a 1MiB boundary:
|
||||
.Sh SEE ALSO
|
||||
.Xr cp 1 ,
|
||||
.Xr mt 1 ,
|
||||
.Xr recoverdisk 1 ,
|
||||
.Xr tr 1 ,
|
||||
.Xr geom 4
|
||||
.Sh STANDARDS
|
||||
|
@ -5,12 +5,12 @@
|
||||
|
||||
PROG= ls
|
||||
SRCS= cmp.c ls.c print.c util.c
|
||||
LIBADD= util
|
||||
LIBADD= util xo
|
||||
|
||||
.if !defined(RELEASE_CRUNCH) && \
|
||||
${MK_LS_COLORS} != no
|
||||
CFLAGS+= -DCOLORLS
|
||||
LIBADD+= termcapw xo
|
||||
LIBADD+= termcapw
|
||||
.endif
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
11
bin/ls/ls.c
11
bin/ls/ls.c
@ -119,7 +119,7 @@ static int f_nofollow; /* don't follow symbolic link arguments */
|
||||
int f_nonprint; /* show unprintables as ? */
|
||||
static int f_nosort; /* don't sort output */
|
||||
int f_notabs; /* don't use tab-separated multi-col output */
|
||||
static int f_numericonly; /* don't convert uid/gid to name */
|
||||
int f_numericonly; /* don't convert uid/gid to name */
|
||||
int f_octal; /* show unprintables as \xxx */
|
||||
int f_octal_escape; /* like f_octal but use C escapes if possible */
|
||||
static int f_recursive; /* ls subdirectories also */
|
||||
@ -158,6 +158,7 @@ main(int argc, char *argv[])
|
||||
struct winsize win;
|
||||
int ch, fts_options, notused;
|
||||
char *p;
|
||||
const char *errstr = NULL;
|
||||
#ifdef COLORLS
|
||||
char termcapbuf[1024]; /* termcap definition buffer */
|
||||
char tcapbuf[512]; /* capability buffer */
|
||||
@ -170,7 +171,7 @@ main(int argc, char *argv[])
|
||||
if (isatty(STDOUT_FILENO)) {
|
||||
termwidth = 80;
|
||||
if ((p = getenv("COLUMNS")) != NULL && *p != '\0')
|
||||
termwidth = atoi(p);
|
||||
termwidth = strtonum(p, 0, INT_MAX, &errstr);
|
||||
else if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &win) != -1 &&
|
||||
win.ws_col > 0)
|
||||
termwidth = win.ws_col;
|
||||
@ -180,9 +181,12 @@ main(int argc, char *argv[])
|
||||
/* retrieve environment variable, in case of explicit -C */
|
||||
p = getenv("COLUMNS");
|
||||
if (p)
|
||||
termwidth = atoi(p);
|
||||
termwidth = strtonum(p, 0, INT_MAX, &errstr);
|
||||
}
|
||||
|
||||
if (errstr)
|
||||
termwidth = 80;
|
||||
|
||||
fts_options = FTS_PHYSICAL;
|
||||
if (getenv("LS_SAMESORT"))
|
||||
f_samesort = 1;
|
||||
@ -191,6 +195,7 @@ main(int argc, char *argv[])
|
||||
if (argc < 0)
|
||||
return (1);
|
||||
xo_set_flags(NULL, XOF_COLUMNS);
|
||||
xo_set_version(LS_XO_VERSION);
|
||||
|
||||
while ((ch = getopt(argc, argv,
|
||||
"1ABCD:FGHILPRSTUWXZabcdfghiklmnopqrstuwxy,")) != -1) {
|
||||
|
@ -37,6 +37,8 @@
|
||||
|
||||
#define HUMANVALSTR_LEN 5
|
||||
|
||||
#define LS_XO_VERSION "1"
|
||||
|
||||
extern long blocksize; /* block size units */
|
||||
|
||||
extern int f_accesstime; /* use time of last access */
|
||||
@ -58,6 +60,7 @@ extern int f_statustime; /* use time of last mode change */
|
||||
extern int f_thousands; /* show file sizes with thousands separators */
|
||||
extern char *f_timeformat; /* user-specified time format */
|
||||
extern int f_notabs; /* don't use tab-separated multi-col output */
|
||||
extern int f_numericonly; /* don't convert uid/gid to name */
|
||||
extern int f_type; /* add type character for non-regular files */
|
||||
#ifdef COLORLS
|
||||
extern int f_color; /* add type in color for non-regular files */
|
||||
|
@ -171,7 +171,7 @@ printlong(const DISPLAY *dp)
|
||||
|
||||
xo_open_list("entry");
|
||||
for (p = dp->list; p; p = p->fts_link) {
|
||||
char *name;
|
||||
char *name, *type;
|
||||
if (IS_NOPRINT(p))
|
||||
continue;
|
||||
xo_open_instance("entry");
|
||||
@ -180,22 +180,46 @@ printlong(const DISPLAY *dp)
|
||||
if (name)
|
||||
xo_emit("{ke:name/%hs}", name);
|
||||
if (f_inode)
|
||||
xo_emit("{:inode/%*ju} ",
|
||||
xo_emit("{t:inode/%*ju} ",
|
||||
dp->s_inode, (uintmax_t)sp->st_ino);
|
||||
if (f_size)
|
||||
xo_emit("{:blocks/%*jd} ",
|
||||
xo_emit("{t:blocks/%*jd} ",
|
||||
dp->s_block, howmany(sp->st_blocks, blocksize));
|
||||
strmode(sp->st_mode, buf);
|
||||
aclmode(buf, p);
|
||||
np = p->fts_pointer;
|
||||
xo_attr("value", "%03o", (int) sp->st_mode & ALLPERMS);
|
||||
xo_emit("{t:mode/%s} {:links/%*u} {:user/%-*s} {:group/%-*s} ",
|
||||
buf, dp->s_nlink, sp->st_nlink,
|
||||
dp->s_user, np->user, dp->s_group, np->group);
|
||||
if (f_numericonly) {
|
||||
xo_emit("{t:mode/%s}{e:mode_octal/%03o} {t:links/%*u} {td:user/%-*s}{e:user/%ju} {td:group/%-*s}{e:group/%ju} ",
|
||||
buf, (int) sp->st_mode & ALLPERMS, dp->s_nlink, sp->st_nlink,
|
||||
dp->s_user, np->user, sp->st_uid, dp->s_group, np->group, sp->st_gid);
|
||||
} else {
|
||||
xo_emit("{t:mode/%s}{e:mode_octal/%03o} {t:links/%*u} {t:user/%-*s} {t:group/%-*s} ",
|
||||
buf, (int) sp->st_mode & ALLPERMS, dp->s_nlink, sp->st_nlink,
|
||||
dp->s_user, np->user, dp->s_group, np->group);
|
||||
}
|
||||
if (S_ISBLK(sp->st_mode))
|
||||
asprintf(&type, "block");
|
||||
if (S_ISCHR(sp->st_mode))
|
||||
asprintf(&type, "character");
|
||||
if (S_ISDIR(sp->st_mode))
|
||||
asprintf(&type, "directory");
|
||||
if (S_ISFIFO(sp->st_mode))
|
||||
asprintf(&type, "fifo");
|
||||
if (S_ISLNK(sp->st_mode))
|
||||
asprintf(&type, "symlink");
|
||||
if (S_ISREG(sp->st_mode))
|
||||
asprintf(&type, "regular");
|
||||
if (S_ISSOCK(sp->st_mode))
|
||||
asprintf(&type, "socket");
|
||||
if (S_ISWHT(sp->st_mode))
|
||||
asprintf(&type, "whiteout");
|
||||
xo_emit("{e:type/%s}", type);
|
||||
free(type);
|
||||
if (f_flags)
|
||||
xo_emit("{:flags/%-*s} ", dp->s_flags, np->flags);
|
||||
if (f_label)
|
||||
xo_emit("{:label/%-*s} ", dp->s_label, np->label);
|
||||
xo_emit("{t:label/%-*s} ", dp->s_label, np->label);
|
||||
if (S_ISCHR(sp->st_mode) || S_ISBLK(sp->st_mode))
|
||||
printdev(dp->s_size, sp->st_rdev);
|
||||
else
|
||||
@ -238,6 +262,7 @@ printstream(const DISPLAY *dp)
|
||||
FTSENT *p;
|
||||
int chcnt;
|
||||
|
||||
xo_open_list("entry");
|
||||
for (p = dp->list, chcnt = 0; p; p = p->fts_link) {
|
||||
if (p->fts_number == NO_PRINT)
|
||||
continue;
|
||||
@ -247,12 +272,15 @@ printstream(const DISPLAY *dp)
|
||||
xo_emit("\n");
|
||||
chcnt = 0;
|
||||
}
|
||||
xo_open_instance("file");
|
||||
chcnt += printaname(p, dp->s_inode, dp->s_block);
|
||||
xo_close_instance("file");
|
||||
if (p->fts_link) {
|
||||
xo_emit(", ");
|
||||
chcnt += 2;
|
||||
}
|
||||
}
|
||||
xo_close_list("entry");
|
||||
if (chcnt)
|
||||
xo_emit("\n");
|
||||
}
|
||||
@ -369,10 +397,10 @@ printaname(const FTSENT *p, u_long inodefield, u_long sizefield)
|
||||
sp = p->fts_statp;
|
||||
chcnt = 0;
|
||||
if (f_inode)
|
||||
chcnt += xo_emit("{:inode/%*ju} ",
|
||||
chcnt += xo_emit("{t:inode/%*ju} ",
|
||||
(int)inodefield, (uintmax_t)sp->st_ino);
|
||||
if (f_size)
|
||||
chcnt += xo_emit("{:size/%*jd} ",
|
||||
chcnt += xo_emit("{t:size/%*jd} ",
|
||||
(int)sizefield, howmany(sp->st_blocks, blocksize));
|
||||
#ifdef COLORLS
|
||||
if (f_color)
|
||||
@ -425,9 +453,11 @@ printtime(const char *field, time_t ftime)
|
||||
format = d_first ? "%e %b %Y" : "%b %e %Y";
|
||||
strftime(longstring, sizeof(longstring), format, localtime(&ftime));
|
||||
|
||||
snprintf(fmt, sizeof(fmt), "{:%s/%%hs} ", field);
|
||||
snprintf(fmt, sizeof(fmt), "{d:%s/%%hs} ", field);
|
||||
xo_attr("value", "%ld", (long) ftime);
|
||||
xo_emit(fmt, longstring);
|
||||
snprintf(fmt, sizeof(fmt), "{en:%s/%%ld} ", field);
|
||||
xo_emit(fmt, (long) ftime);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -738,9 +738,9 @@ Display information on all system processes:
|
||||
.Xr procstat 1 ,
|
||||
.Xr w 1 ,
|
||||
.Xr kvm 3 ,
|
||||
.Xr libxo 3
|
||||
.Xr libxo 3 ,
|
||||
.Xr strftime 3 ,
|
||||
.Xr xo_parse_args 3
|
||||
.Xr xo_parse_args 3 ,
|
||||
.Xr mac 4 ,
|
||||
.Xr procfs 5 ,
|
||||
.Xr pstat 8 ,
|
||||
|
@ -32,7 +32,7 @@
|
||||
.\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd April 18, 2015
|
||||
.Dd July 11, 2015
|
||||
.Dt SH 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -2846,6 +2846,4 @@ The
|
||||
utility does not recognize multibyte characters other than UTF-8.
|
||||
Splitting using
|
||||
.Va IFS
|
||||
and the line editing library
|
||||
.Xr editline 3
|
||||
do not recognize multibyte characters.
|
||||
does not recognize multibyte characters.
|
||||
|
@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@ -61,7 +62,7 @@ main(int argc, char *argv[])
|
||||
struct info i;
|
||||
enum FMT fmt;
|
||||
int ch;
|
||||
const char *file;
|
||||
const char *file, *errstr = NULL;
|
||||
|
||||
fmt = NOTSET;
|
||||
i.fd = STDIN_FILENO;
|
||||
@ -130,7 +131,9 @@ args: argc -= optind;
|
||||
if (isdigit(**argv)) {
|
||||
speed_t speed;
|
||||
|
||||
speed = atoi(*argv);
|
||||
speed = strtonum(*argv, 0, UINT_MAX, &errstr);
|
||||
if (errstr)
|
||||
err(1, "speed");
|
||||
cfsetospeed(&i.t, speed);
|
||||
cfsetispeed(&i.t, speed);
|
||||
i.set = 1;
|
||||
|
@ -196,17 +196,17 @@ static ls_event_info_t g_event_info[LS_MAX_EVENTS] = {
|
||||
"lockstat:::spin-release", NULL,
|
||||
"lockstat:::spin-acquire" },
|
||||
{ 'H', "Lock", "R/W writer hold", "nsec",
|
||||
"lockstat::rw_wunlock:rw-release", NULL,
|
||||
"lockstat::rw_wlock:rw-acquire" },
|
||||
"lockstat:::rw-release", "arg1 == 0",
|
||||
"lockstat:::rw-acquire" },
|
||||
{ 'H', "Lock", "R/W reader hold", "nsec",
|
||||
"lockstat::rw_runlock:rw-release", NULL,
|
||||
"lockstat::rw_rlock:rw-acquire" },
|
||||
"lockstat:::rw-release", "arg1 == 1",
|
||||
"lockstat:::rw-acquire" },
|
||||
{ 'H', "Lock", "SX shared hold", "nsec",
|
||||
"lockstat::sx_sunlock:sx-release", NULL,
|
||||
"lockstat::sx_slock:sx-acquire" },
|
||||
"lockstat:::sx-release", "arg1 == 0",
|
||||
"lockstat:::sx-acquire" },
|
||||
{ 'H', "Lock", "SX exclusive hold", "nsec",
|
||||
"lockstat::sx_xunlock:sx-release", NULL,
|
||||
"lockstat::sx_xlock:sx-acquire" },
|
||||
"lockstat:::sx-release", "arg1 == 1",
|
||||
"lockstat:::sx-acquire" },
|
||||
{ 'H', "Lock", "Unknown event (type 38)", "units" },
|
||||
{ 'H', "Lock", "Unknown event (type 39)", "units" },
|
||||
{ 'H', "Lock", "Unknown event (type 40)", "units" },
|
||||
|
@ -49487,9 +49487,9 @@ static void walIndexWriteHdr(Wal *pWal){
|
||||
pWal->hdr.isInit = 1;
|
||||
pWal->hdr.iVersion = WALINDEX_MAX_VERSION;
|
||||
walChecksumBytes(1, (u8*)&pWal->hdr, nCksum, 0, pWal->hdr.aCksum);
|
||||
memcpy((void *)&aHdr[1], (void *)&pWal->hdr, sizeof(WalIndexHdr));
|
||||
memcpy((void *)&aHdr[1], (const void *)&pWal->hdr, sizeof(WalIndexHdr));
|
||||
walShmBarrier(pWal);
|
||||
memcpy((void *)&aHdr[0], (void *)&pWal->hdr, sizeof(WalIndexHdr));
|
||||
memcpy((void *)&aHdr[0], (const void *)&pWal->hdr, sizeof(WalIndexHdr));
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1001,6 +1001,23 @@ main(int ac, char **av)
|
||||
shorthost[strcspn(thishost, ".")] = '\0';
|
||||
snprintf(portstr, sizeof(portstr), "%d", options.port);
|
||||
|
||||
/* Find canonic host name. */
|
||||
if (strchr(host, '.') == 0) {
|
||||
struct addrinfo hints;
|
||||
struct addrinfo *ai = NULL;
|
||||
int errgai;
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = options.address_family;
|
||||
hints.ai_flags = AI_CANONNAME;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
errgai = getaddrinfo(host, NULL, &hints, &ai);
|
||||
if (errgai == 0) {
|
||||
if (ai->ai_canonname != NULL)
|
||||
host = xstrdup(ai->ai_canonname);
|
||||
freeaddrinfo(ai);
|
||||
}
|
||||
}
|
||||
|
||||
if (options.local_command != NULL) {
|
||||
debug3("expanding LocalCommand: %s", options.local_command);
|
||||
cp = options.local_command;
|
||||
|
@ -357,8 +357,12 @@ if [ -z "${source_periodic_confs_defined}" ]; then
|
||||
*) return 0 ;;
|
||||
esac
|
||||
;;
|
||||
'')
|
||||
# Script run manually.
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
echo "ASSERTION FAILED: Unexpected value for " \
|
||||
echo "ASSERTION FAILED: Unexpected value for" \
|
||||
"\$PERIODIC: '$PERIODIC'" >&2
|
||||
exit 127
|
||||
;;
|
||||
|
@ -296,7 +296,6 @@ detach 10 {
|
||||
# Button: Button pressed (0 for power, 1 for sleep)
|
||||
# CMBAT: ACPI battery events
|
||||
# Lid: Lid state (0 is closed, 1 is open)
|
||||
# RCTL: Resource limits
|
||||
# Suspend, Resume: Suspend and resume notification
|
||||
# Thermal: ACPI thermal zone events
|
||||
#
|
||||
|
@ -16,7 +16,7 @@ SUBDIR+= libssp
|
||||
SUBDIR+= tests
|
||||
.endif
|
||||
|
||||
.if ${MK_GDB} != "no"
|
||||
.if ${MK_BINUTILS} != "no" && ${MK_GDB} != "no"
|
||||
SUBDIR+= libreadline
|
||||
.endif
|
||||
|
||||
|
@ -16,6 +16,8 @@ SUBDIR= ${_binutils} \
|
||||
sdiff \
|
||||
${_tests}
|
||||
|
||||
SUBDIR_DEPEND_gdb= ${_binutils}
|
||||
|
||||
.if ${MK_CXX} != "no"
|
||||
.if ${MK_GCC} != "no"
|
||||
_gperf= gperf
|
||||
@ -39,13 +41,14 @@ _tests= tests
|
||||
|
||||
.if ${MK_BINUTILS} != "no"
|
||||
_binutils= binutils
|
||||
.endif
|
||||
.if ${MK_GCC} != "no"
|
||||
_cc= cc
|
||||
.endif
|
||||
.if ${MK_GDB} != "no"
|
||||
_gdb= gdb
|
||||
.endif
|
||||
.endif
|
||||
|
||||
.if ${MK_GCC} != "no"
|
||||
_cc= cc
|
||||
.endif
|
||||
|
||||
SUBDIR_PARALLEL=
|
||||
|
||||
|
@ -37,12 +37,6 @@ CFLAGS+= -DPPMD_32BIT
|
||||
.endif
|
||||
NO_WCAST_ALIGN.clang=
|
||||
|
||||
.ifndef COMPAT_32BIT
|
||||
beforeinstall:
|
||||
${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
|
||||
${.CURDIR}/libarchive.pc ${DESTDIR}${LIBDATADIR}/pkgconfig
|
||||
.endif
|
||||
|
||||
.PATH: ${LIBARCHIVEDIR}/libarchive
|
||||
|
||||
# Headers to be installed in /usr/include
|
||||
|
@ -1,12 +0,0 @@
|
||||
# $FreeBSD$
|
||||
prefix=/usr
|
||||
exec_prefix=${prefix}
|
||||
libdir=${exec_prefix}/lib
|
||||
includedir=${prefix}/include
|
||||
|
||||
Name: libarchive
|
||||
Description: library that can create and read several streaming archive formats
|
||||
Version: 3.1.2
|
||||
Cflags: -I${includedir}
|
||||
Libs: -L${libdir} -larchive
|
||||
Libs.private: -lz -lbz2 -llzma -lbsdxml -lcrypto
|
@ -28,6 +28,7 @@ FBSD_1.0 {
|
||||
vfork;
|
||||
brk;
|
||||
sbrk;
|
||||
makecontext;
|
||||
};
|
||||
|
||||
FBSDprivate_1.0 {
|
||||
@ -35,4 +36,5 @@ FBSDprivate_1.0 {
|
||||
_end;
|
||||
curbrk;
|
||||
minbrk;
|
||||
__makecontext;
|
||||
};
|
||||
|
@ -1,10 +1,12 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SRCS+= fabs.S \
|
||||
SRCS+= _ctx_start.S \
|
||||
fabs.S \
|
||||
flt_rounds.c \
|
||||
fpgetmask.c \
|
||||
fpsetmask.c \
|
||||
ldexp.c \
|
||||
makecontext.c \
|
||||
_setjmp.S \
|
||||
_set_tp.c \
|
||||
setjmp.S \
|
||||
|
38
lib/libc/aarch64/gen/_ctx_start.S
Normal file
38
lib/libc/aarch64/gen/_ctx_start.S
Normal file
@ -0,0 +1,38 @@
|
||||
/*-
|
||||
* Copyright (c) 2015 The FreeBSD Foundation
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by Andrew Turner under
|
||||
* sponsorship from the FreeBSD Foundation.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <machine/asm.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
ENTRY(_ctx_start)
|
||||
blr x19 /* Call func from makecontext */
|
||||
mov x0, x20 /* Load ucp saved in makecontext */
|
||||
bl _C_LABEL(ctx_done)
|
||||
bl _C_LABEL(abort)
|
||||
END(_ctx_start)
|
86
lib/libc/aarch64/gen/makecontext.c
Normal file
86
lib/libc/aarch64/gen/makecontext.c
Normal file
@ -0,0 +1,86 @@
|
||||
/*-
|
||||
* Copyright (c) 2015 The FreeBSD Foundation
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by Andrew Turner under
|
||||
* sponsorship from the FreeBSD Foundation.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <machine/armreg.h>
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <ucontext.h>
|
||||
|
||||
void _ctx_start(void);
|
||||
|
||||
void
|
||||
ctx_done(ucontext_t *ucp)
|
||||
{
|
||||
|
||||
if (ucp->uc_link == NULL) {
|
||||
exit(0);
|
||||
} else {
|
||||
setcontext((const ucontext_t *)ucp->uc_link);
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
__weak_reference(__makecontext, makecontext);
|
||||
|
||||
void
|
||||
__makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...)
|
||||
{
|
||||
struct gpregs *gp;
|
||||
va_list ap;
|
||||
int i;
|
||||
|
||||
/* A valid context is required. */
|
||||
if (ucp == NULL)
|
||||
return;
|
||||
|
||||
if ((argc < 0) || (argc > 8))
|
||||
return;
|
||||
|
||||
gp = &ucp->uc_mcontext.mc_gpregs;
|
||||
|
||||
va_start(ap, argc);
|
||||
/* Pass up to eight arguments in x0-7. */
|
||||
for (i = 0; i < argc && i < 8; i++)
|
||||
gp->gp_x[i] = va_arg(ap, uint64_t);
|
||||
va_end(ap);
|
||||
|
||||
/* Set the stack */
|
||||
gp->gp_sp = STACKALIGN(ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size);
|
||||
/* Arrange for return via the trampoline code. */
|
||||
gp->gp_elr = (__register_t)_ctx_start;
|
||||
gp->gp_x[19] = (__register_t)func;
|
||||
gp->gp_x[20] = (__register_t)ucp;
|
||||
}
|
@ -28,7 +28,7 @@
|
||||
.\" @(#)syslog.3 8.1 (Berkeley) 6/4/93
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd December 30, 2004
|
||||
.Dd July 21, 2015
|
||||
.Dt SYSLOG 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -292,4 +292,4 @@ for later interpolation by
|
||||
.Pp
|
||||
Always use the proper secure idiom:
|
||||
.Pp
|
||||
.Dl syslog("%s", string);
|
||||
.Dl syslog(priority, "%s", string);
|
||||
|
@ -25,7 +25,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd July 29, 2004
|
||||
.Dd July 07, 2015
|
||||
.Dt WORDEXP 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -202,5 +202,5 @@ but it does not use the same parser so it may be fooled.
|
||||
.Pp
|
||||
The current
|
||||
.Fn wordexp
|
||||
implementation does not recognize multibyte characters, since the
|
||||
shell (which it invokes to perform expansions) does not.
|
||||
implementation does not recognize multibyte characters other than UTF-8, since
|
||||
the shell (which it invokes to perform expansions) does not.
|
||||
|
@ -235,6 +235,7 @@ MAN+= abort2.2 \
|
||||
nanosleep.2 \
|
||||
nfssvc.2 \
|
||||
ntp_adjtime.2 \
|
||||
numa_getaffinity.2 \
|
||||
open.2 \
|
||||
pathconf.2 \
|
||||
pdfork.2 \
|
||||
@ -395,6 +396,7 @@ MLINKS+=mount.2 nmount.2 \
|
||||
MLINKS+=mq_receive.2 mq_timedreceive.2
|
||||
MLINKS+=mq_send.2 mq_timedsend.2
|
||||
MLINKS+=ntp_adjtime.2 ntp_gettime.2
|
||||
MLINKS+=numa_getaffinity.2 numa_setaffinity.2
|
||||
MLINKS+=open.2 openat.2
|
||||
MLINKS+=pathconf.2 fpathconf.2
|
||||
MLINKS+=pathconf.2 lpathconf.2
|
||||
|
@ -400,6 +400,8 @@ FBSD_1.4 {
|
||||
futimens;
|
||||
ppoll;
|
||||
utimensat;
|
||||
numa_setaffinity;
|
||||
numa_getaffinity;
|
||||
};
|
||||
|
||||
FBSDprivate_1.0 {
|
||||
|
@ -28,7 +28,7 @@
|
||||
.\" @(#)madvise.2 8.1 (Berkeley) 6/9/93
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd January 30, 2014
|
||||
.Dd July 12, 2015
|
||||
.Dt MADVISE 2
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -79,9 +79,9 @@ pages in from backing store, but quickly map the pages already in memory
|
||||
into the calling process.
|
||||
.It Dv MADV_DONTNEED
|
||||
Allows the VM system to decrease the in-memory priority
|
||||
of pages in the specified range.
|
||||
Additionally future references to
|
||||
this address range will incur a page fault.
|
||||
of pages in the specified address range.
|
||||
Consequently, future references to this address range are more likely
|
||||
to incur a page fault.
|
||||
.It Dv MADV_FREE
|
||||
Gives the VM system the freedom to free pages,
|
||||
and tells the system that information in the specified page range
|
||||
|
197
lib/libc/sys/numa_getaffinity.2
Normal file
197
lib/libc/sys/numa_getaffinity.2
Normal file
@ -0,0 +1,197 @@
|
||||
.\" Copyright (c) 2008 Christian Brueffer
|
||||
.\" Copyright (c) 2008 Jeffrey Roberson
|
||||
.\" Copyright (c) 2015 Adrian Chadd
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd May 7, 2015
|
||||
.Dt NUMA_GETAFFINITY 2
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm numa_getaffinity ,
|
||||
.Nm numa_setaffinity
|
||||
.Nd manage NUMA affinity
|
||||
.Sh LIBRARY
|
||||
.Lb libc
|
||||
.Sh SYNOPSIS
|
||||
.In sys/param.h
|
||||
.In sys/numa.h
|
||||
.Ft int
|
||||
.Fn numa_getaffinity "cpuwhich_t which" "id_t id" "struct vm_domain_policy_entry *policy"
|
||||
.Ft int
|
||||
.Fn numa_setaffinity "cpuwhich_t which" "id_t id" "const struct vm_domain_policy_entry *policy"
|
||||
.Sh DESCRIPTION
|
||||
.Fn numa_getaffinity
|
||||
and
|
||||
.Fn numa_setaffinity
|
||||
allow the manipulation of NUMA policies available to processes and threads.
|
||||
These functions may manipulate NUMA policies that contain many processes
|
||||
or affect only a single object.
|
||||
.Pp
|
||||
Valid values for the
|
||||
.Fa which
|
||||
argument are documented in
|
||||
.Xr cpuset 2 .
|
||||
These arguments specify which object set are used.
|
||||
Only
|
||||
.Dv CPU_WHICH_TID
|
||||
and
|
||||
.Dv CPU_WHICH_PID
|
||||
can be manipulated.
|
||||
.Pp
|
||||
The
|
||||
.Fa policy
|
||||
entry contains a vm_domain_policy_entry with the following fields:
|
||||
.Bd -literal
|
||||
struct vm_domain_policy_entry {
|
||||
vm_domain_policy_type_t policy; /* VM policy */
|
||||
int domain; /* VM domain, if applicable */
|
||||
}
|
||||
.Ed
|
||||
.Fa vm_domain_policy_type_t policy
|
||||
is one these:
|
||||
.Bl -tag -width VM_POLICY_NONE
|
||||
.It Dv VM_POLICY_NONE
|
||||
Reset the domain back to none.
|
||||
Any parent object NUMA domain policy will apply.
|
||||
The only valid value for
|
||||
.Dv domain
|
||||
is -1.
|
||||
.It Dv VM_POLICY_ROUND_ROBIN
|
||||
Select round-robin policy.
|
||||
Pages will be allocated round-robin from each VM domain in order.
|
||||
The only valid value for
|
||||
.Dv domain
|
||||
is -1.
|
||||
.It Dv VM_POLICY_FIXED_DOMAIN
|
||||
Select fixed-domain only policy.
|
||||
Pages will be allocated from the given
|
||||
.Dv domain
|
||||
which must be set to a valid VM domain.
|
||||
Pages will not be allocated from another domain if
|
||||
.Dv domain
|
||||
is out of free pages.
|
||||
.It Dv VM_POLICY_FIXED_DOMAIN_ROUND_ROBIN
|
||||
Select fixed-domain only policy.
|
||||
Pages will be allocated from
|
||||
.Dv domain
|
||||
which must be set to a valid VM domain.
|
||||
If page allocation fails, pages will be round-robin
|
||||
allocated from another domain if
|
||||
.Dv domain
|
||||
is out of free pages.
|
||||
.It Dv VM_POLICY_FIRST_TOUCH
|
||||
Select first-touch policy.
|
||||
Pages will be allocated from the NUMA domain which the thread
|
||||
is currently scheduled upon.
|
||||
Pages will not be allocated from another domain if the current domain
|
||||
is out of free pages.
|
||||
The only valid value for
|
||||
.Dv domain
|
||||
is -1.
|
||||
.It Dv VM_POLICY_FIRST_TOUCH_ROUND_ROBIN
|
||||
Select first-touch policy.
|
||||
Pages will be allocated from the NUMA domain which the thread
|
||||
is currently scheduled upon.
|
||||
Pages will be allocated round-robin from another domain if the
|
||||
current domain is out of free pages.
|
||||
The only valid value for
|
||||
.Dv domain
|
||||
is -1.
|
||||
.El
|
||||
.Pp
|
||||
Note that the VM might assign some pages from other domains.
|
||||
For example, if an existing page allocation is covered by a superpage
|
||||
allocation.
|
||||
.Pp
|
||||
.Fn numa_getaffinity
|
||||
retrieves the
|
||||
NUMA policy from the object specified by
|
||||
.Fa which
|
||||
and
|
||||
.Fa id
|
||||
and stores it in the space provided by
|
||||
.Fa policy .
|
||||
.Pp
|
||||
.Fn numa_setaffinity
|
||||
attempts to set the NUMA policy for the object specified by
|
||||
.Fa which
|
||||
and
|
||||
.Fa id
|
||||
to the policy in
|
||||
.Fa policy .
|
||||
.Sh RETURN VALUES
|
||||
.Rv -std
|
||||
.Sh ERRORS
|
||||
.Va errno
|
||||
can contain these error codes:
|
||||
.Bl -tag -width Er
|
||||
.It Bq Er EINVAL
|
||||
The
|
||||
.Fa level
|
||||
or
|
||||
.Fa which
|
||||
argument was not a valid value.
|
||||
.It Bq Er EINVAL
|
||||
The
|
||||
.Fa policy
|
||||
argument specified when calling
|
||||
.Fn numa_setaffinity
|
||||
did not contain a valid policy.
|
||||
.It Bq Er EFAULT
|
||||
The policy pointer passed was invalid.
|
||||
.It Bq Er ESRCH
|
||||
The object specified by the
|
||||
.Fa id
|
||||
and
|
||||
.Fa which
|
||||
arguments could not be found.
|
||||
.It Bq Er ERANGE
|
||||
The
|
||||
.Fa domain
|
||||
in the given policy
|
||||
was out of the range of possible VM domains available.
|
||||
.It Bq Er EPERM
|
||||
The calling process did not have the credentials required to complete the
|
||||
operation.
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr cpuset 1 ,
|
||||
.Xr numactl 1 ,
|
||||
.Xr cpuset 2 ,
|
||||
.Xr cpuset_getaffinity 2 ,
|
||||
.Xr cpuset_getid 2 ,
|
||||
.Xr cpuset_setaffinity 2 ,
|
||||
.Xr cpuset_setid 2 ,
|
||||
.Xr pthread_affinity_np 3 ,
|
||||
.Xr pthread_attr_affinity_np 3 ,
|
||||
.Xr numa 4
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
family of system calls first appeared in
|
||||
.Fx 11.0 .
|
||||
.Sh AUTHORS
|
||||
.An Adrian Chadd Aq Mt adrian@FreeBSD.org
|
@ -362,6 +362,15 @@ field set to
|
||||
and the
|
||||
.Fa si_pid
|
||||
field set to the process ID of the process reporting status.
|
||||
For the exited process, the
|
||||
.Fa si_status
|
||||
field of the
|
||||
.Dv siginfo_t
|
||||
structure contains the full 32 bit exit status passed to
|
||||
.Xr _exit 2 ;
|
||||
the
|
||||
.Fa status
|
||||
argument of other calls only returns 8 lowest bits of the exit status.
|
||||
.Pp
|
||||
When the
|
||||
.Dv WNOHANG
|
||||
@ -656,13 +665,6 @@ is an extension;
|
||||
.Tn POSIX
|
||||
only permits this flag with
|
||||
.Fn waitid .
|
||||
.Pp
|
||||
.Tn POSIX
|
||||
requires
|
||||
.Fn waitid
|
||||
to return the full 32 bits passed to
|
||||
.Xr _exit 2 ;
|
||||
this implementation only returns 8 bits like the other calls.
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Fn wait
|
||||
|
@ -12,9 +12,7 @@ NETBSD_ATF_TESTS_C+= clock_gettime_test
|
||||
NETBSD_ATF_TESTS_C+= connect_test
|
||||
NETBSD_ATF_TESTS_C+= dup_test
|
||||
NETBSD_ATF_TESTS_C+= fsync_test
|
||||
.if ${MACHINE} != "arm64" # ARM64TODO: Missing makecontext
|
||||
NETBSD_ATF_TESTS_C+= getcontext_test
|
||||
.endif
|
||||
NETBSD_ATF_TESTS_C+= getgroups_test
|
||||
NETBSD_ATF_TESTS_C+= getitimer_test
|
||||
NETBSD_ATF_TESTS_C+= getlogin_test
|
||||
|
@ -66,6 +66,8 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/tty.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/conf.h>
|
||||
#define _WANT_KW_EXITCODE
|
||||
#include <sys/wait.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
@ -389,7 +391,7 @@ kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p,
|
||||
kp->ki_siglist = proc.p_siglist;
|
||||
SIGSETOR(kp->ki_siglist, mtd.td_siglist);
|
||||
kp->ki_sigmask = mtd.td_sigmask;
|
||||
kp->ki_xstat = proc.p_xstat;
|
||||
kp->ki_xstat = KW_EXITCODE(proc.p_xexit, proc.p_xsig);
|
||||
kp->ki_acflag = proc.p_acflag;
|
||||
kp->ki_lock = proc.p_lock;
|
||||
if (proc.p_state != PRS_ZOMBIE) {
|
||||
|
@ -48,7 +48,8 @@ CLEANFILES+= md[245]hl.c md[245].ref md[245].3 mddriver \
|
||||
# in which case:
|
||||
# * macros are used to rename symbols to libcrypt internal names
|
||||
# * no weak aliases are generated
|
||||
CFLAGS+= -I${.CURDIR} -DWEAK_REFS
|
||||
CFLAGS+= -I${.CURDIR} -I${.CURDIR}/../../sys/crypto/sha2
|
||||
CFLAGS+= -DWEAK_REFS
|
||||
.PATH: ${.CURDIR}/${MACHINE_ARCH} ${.CURDIR}/../../sys/crypto/sha2
|
||||
|
||||
.if exists(${MACHINE_ARCH}/sha.S)
|
||||
|
@ -1,312 +0,0 @@
|
||||
/*-
|
||||
* Copyright 2005 Colin Percival
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/endian.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "sha256.h"
|
||||
|
||||
#if BYTE_ORDER == BIG_ENDIAN
|
||||
|
||||
/* Copy a vector of big-endian uint32_t into a vector of bytes */
|
||||
#define be32enc_vect(dst, src, len) \
|
||||
memcpy((void *)dst, (const void *)src, (size_t)len)
|
||||
|
||||
/* Copy a vector of bytes into a vector of big-endian uint32_t */
|
||||
#define be32dec_vect(dst, src, len) \
|
||||
memcpy((void *)dst, (const void *)src, (size_t)len)
|
||||
|
||||
#else /* BYTE_ORDER != BIG_ENDIAN */
|
||||
|
||||
/*
|
||||
* Encode a length len/4 vector of (uint32_t) into a length len vector of
|
||||
* (unsigned char) in big-endian form. Assumes len is a multiple of 4.
|
||||
*/
|
||||
static void
|
||||
be32enc_vect(unsigned char *dst, const uint32_t *src, size_t len)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < len / 4; i++)
|
||||
be32enc(dst + i * 4, src[i]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Decode a big-endian length len vector of (unsigned char) into a length
|
||||
* len/4 vector of (uint32_t). Assumes len is a multiple of 4.
|
||||
*/
|
||||
static void
|
||||
be32dec_vect(uint32_t *dst, const unsigned char *src, size_t len)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < len / 4; i++)
|
||||
dst[i] = be32dec(src + i * 4);
|
||||
}
|
||||
|
||||
#endif /* BYTE_ORDER != BIG_ENDIAN */
|
||||
|
||||
/* Elementary functions used by SHA256 */
|
||||
#define Ch(x, y, z) ((x & (y ^ z)) ^ z)
|
||||
#define Maj(x, y, z) ((x & (y | z)) | (y & z))
|
||||
#define SHR(x, n) (x >> n)
|
||||
#define ROTR(x, n) ((x >> n) | (x << (32 - n)))
|
||||
#define S0(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22))
|
||||
#define S1(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))
|
||||
#define s0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3))
|
||||
#define s1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10))
|
||||
|
||||
/* SHA256 round function */
|
||||
#define RND(a, b, c, d, e, f, g, h, k) \
|
||||
t0 = h + S1(e) + Ch(e, f, g) + k; \
|
||||
t1 = S0(a) + Maj(a, b, c); \
|
||||
d += t0; \
|
||||
h = t0 + t1;
|
||||
|
||||
/* Adjusted round function for rotating state */
|
||||
#define RNDr(S, W, i, k) \
|
||||
RND(S[(64 - i) % 8], S[(65 - i) % 8], \
|
||||
S[(66 - i) % 8], S[(67 - i) % 8], \
|
||||
S[(68 - i) % 8], S[(69 - i) % 8], \
|
||||
S[(70 - i) % 8], S[(71 - i) % 8], \
|
||||
W[i] + k)
|
||||
|
||||
/*
|
||||
* SHA256 block compression function. The 256-bit state is transformed via
|
||||
* the 512-bit input block to produce a new state.
|
||||
*/
|
||||
static void
|
||||
SHA256_Transform(uint32_t * state, const unsigned char block[64])
|
||||
{
|
||||
uint32_t W[64];
|
||||
uint32_t S[8];
|
||||
uint32_t t0, t1;
|
||||
int i;
|
||||
|
||||
/* 1. Prepare message schedule W. */
|
||||
be32dec_vect(W, block, 64);
|
||||
for (i = 16; i < 64; i++)
|
||||
W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
|
||||
|
||||
/* 2. Initialize working variables. */
|
||||
memcpy(S, state, 32);
|
||||
|
||||
/* 3. Mix. */
|
||||
RNDr(S, W, 0, 0x428a2f98);
|
||||
RNDr(S, W, 1, 0x71374491);
|
||||
RNDr(S, W, 2, 0xb5c0fbcf);
|
||||
RNDr(S, W, 3, 0xe9b5dba5);
|
||||
RNDr(S, W, 4, 0x3956c25b);
|
||||
RNDr(S, W, 5, 0x59f111f1);
|
||||
RNDr(S, W, 6, 0x923f82a4);
|
||||
RNDr(S, W, 7, 0xab1c5ed5);
|
||||
RNDr(S, W, 8, 0xd807aa98);
|
||||
RNDr(S, W, 9, 0x12835b01);
|
||||
RNDr(S, W, 10, 0x243185be);
|
||||
RNDr(S, W, 11, 0x550c7dc3);
|
||||
RNDr(S, W, 12, 0x72be5d74);
|
||||
RNDr(S, W, 13, 0x80deb1fe);
|
||||
RNDr(S, W, 14, 0x9bdc06a7);
|
||||
RNDr(S, W, 15, 0xc19bf174);
|
||||
RNDr(S, W, 16, 0xe49b69c1);
|
||||
RNDr(S, W, 17, 0xefbe4786);
|
||||
RNDr(S, W, 18, 0x0fc19dc6);
|
||||
RNDr(S, W, 19, 0x240ca1cc);
|
||||
RNDr(S, W, 20, 0x2de92c6f);
|
||||
RNDr(S, W, 21, 0x4a7484aa);
|
||||
RNDr(S, W, 22, 0x5cb0a9dc);
|
||||
RNDr(S, W, 23, 0x76f988da);
|
||||
RNDr(S, W, 24, 0x983e5152);
|
||||
RNDr(S, W, 25, 0xa831c66d);
|
||||
RNDr(S, W, 26, 0xb00327c8);
|
||||
RNDr(S, W, 27, 0xbf597fc7);
|
||||
RNDr(S, W, 28, 0xc6e00bf3);
|
||||
RNDr(S, W, 29, 0xd5a79147);
|
||||
RNDr(S, W, 30, 0x06ca6351);
|
||||
RNDr(S, W, 31, 0x14292967);
|
||||
RNDr(S, W, 32, 0x27b70a85);
|
||||
RNDr(S, W, 33, 0x2e1b2138);
|
||||
RNDr(S, W, 34, 0x4d2c6dfc);
|
||||
RNDr(S, W, 35, 0x53380d13);
|
||||
RNDr(S, W, 36, 0x650a7354);
|
||||
RNDr(S, W, 37, 0x766a0abb);
|
||||
RNDr(S, W, 38, 0x81c2c92e);
|
||||
RNDr(S, W, 39, 0x92722c85);
|
||||
RNDr(S, W, 40, 0xa2bfe8a1);
|
||||
RNDr(S, W, 41, 0xa81a664b);
|
||||
RNDr(S, W, 42, 0xc24b8b70);
|
||||
RNDr(S, W, 43, 0xc76c51a3);
|
||||
RNDr(S, W, 44, 0xd192e819);
|
||||
RNDr(S, W, 45, 0xd6990624);
|
||||
RNDr(S, W, 46, 0xf40e3585);
|
||||
RNDr(S, W, 47, 0x106aa070);
|
||||
RNDr(S, W, 48, 0x19a4c116);
|
||||
RNDr(S, W, 49, 0x1e376c08);
|
||||
RNDr(S, W, 50, 0x2748774c);
|
||||
RNDr(S, W, 51, 0x34b0bcb5);
|
||||
RNDr(S, W, 52, 0x391c0cb3);
|
||||
RNDr(S, W, 53, 0x4ed8aa4a);
|
||||
RNDr(S, W, 54, 0x5b9cca4f);
|
||||
RNDr(S, W, 55, 0x682e6ff3);
|
||||
RNDr(S, W, 56, 0x748f82ee);
|
||||
RNDr(S, W, 57, 0x78a5636f);
|
||||
RNDr(S, W, 58, 0x84c87814);
|
||||
RNDr(S, W, 59, 0x8cc70208);
|
||||
RNDr(S, W, 60, 0x90befffa);
|
||||
RNDr(S, W, 61, 0xa4506ceb);
|
||||
RNDr(S, W, 62, 0xbef9a3f7);
|
||||
RNDr(S, W, 63, 0xc67178f2);
|
||||
|
||||
/* 4. Mix local working variables into global state */
|
||||
for (i = 0; i < 8; i++)
|
||||
state[i] += S[i];
|
||||
}
|
||||
|
||||
static unsigned char PAD[64] = {
|
||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
/* Add padding and terminating bit-count. */
|
||||
static void
|
||||
SHA256_Pad(SHA256_CTX * ctx)
|
||||
{
|
||||
unsigned char len[8];
|
||||
uint32_t r, plen;
|
||||
|
||||
/*
|
||||
* Convert length to a vector of bytes -- we do this now rather
|
||||
* than later because the length will change after we pad.
|
||||
*/
|
||||
be64enc(len, ctx->count);
|
||||
|
||||
/* Add 1--64 bytes so that the resulting length is 56 mod 64 */
|
||||
r = (ctx->count >> 3) & 0x3f;
|
||||
plen = (r < 56) ? (56 - r) : (120 - r);
|
||||
SHA256_Update(ctx, PAD, (size_t)plen);
|
||||
|
||||
/* Add the terminating bit-count */
|
||||
SHA256_Update(ctx, len, 8);
|
||||
}
|
||||
|
||||
/* SHA-256 initialization. Begins a SHA-256 operation. */
|
||||
void
|
||||
SHA256_Init(SHA256_CTX * ctx)
|
||||
{
|
||||
|
||||
/* Zero bits processed so far */
|
||||
ctx->count = 0;
|
||||
|
||||
/* Magic initialization constants */
|
||||
ctx->state[0] = 0x6A09E667;
|
||||
ctx->state[1] = 0xBB67AE85;
|
||||
ctx->state[2] = 0x3C6EF372;
|
||||
ctx->state[3] = 0xA54FF53A;
|
||||
ctx->state[4] = 0x510E527F;
|
||||
ctx->state[5] = 0x9B05688C;
|
||||
ctx->state[6] = 0x1F83D9AB;
|
||||
ctx->state[7] = 0x5BE0CD19;
|
||||
}
|
||||
|
||||
/* Add bytes into the hash */
|
||||
void
|
||||
SHA256_Update(SHA256_CTX * ctx, const void *in, size_t len)
|
||||
{
|
||||
uint64_t bitlen;
|
||||
uint32_t r;
|
||||
const unsigned char *src = in;
|
||||
|
||||
/* Number of bytes left in the buffer from previous updates */
|
||||
r = (ctx->count >> 3) & 0x3f;
|
||||
|
||||
/* Convert the length into a number of bits */
|
||||
bitlen = len << 3;
|
||||
|
||||
/* Update number of bits */
|
||||
ctx->count += bitlen;
|
||||
|
||||
/* Handle the case where we don't need to perform any transforms */
|
||||
if (len < 64 - r) {
|
||||
memcpy(&ctx->buf[r], src, len);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Finish the current block */
|
||||
memcpy(&ctx->buf[r], src, 64 - r);
|
||||
SHA256_Transform(ctx->state, ctx->buf);
|
||||
src += 64 - r;
|
||||
len -= 64 - r;
|
||||
|
||||
/* Perform complete blocks */
|
||||
while (len >= 64) {
|
||||
SHA256_Transform(ctx->state, src);
|
||||
src += 64;
|
||||
len -= 64;
|
||||
}
|
||||
|
||||
/* Copy left over data into buffer */
|
||||
memcpy(ctx->buf, src, len);
|
||||
}
|
||||
|
||||
/*
|
||||
* SHA-256 finalization. Pads the input data, exports the hash value,
|
||||
* and clears the context state.
|
||||
*/
|
||||
void
|
||||
SHA256_Final(unsigned char digest[32], SHA256_CTX * ctx)
|
||||
{
|
||||
|
||||
/* Add padding */
|
||||
SHA256_Pad(ctx);
|
||||
|
||||
/* Write the hash */
|
||||
be32enc_vect(digest, ctx->state, 32);
|
||||
|
||||
/* Clear the context state */
|
||||
memset((void *)ctx, 0, sizeof(*ctx));
|
||||
}
|
||||
|
||||
#ifdef WEAK_REFS
|
||||
/* When building libmd, provide weak references. Note: this is not
|
||||
activated in the context of compiling these sources for internal
|
||||
use in libcrypt.
|
||||
*/
|
||||
#undef SHA256_Init
|
||||
__weak_reference(_libmd_SHA256_Init, SHA256_Init);
|
||||
#undef SHA256_Update
|
||||
__weak_reference(_libmd_SHA256_Update, SHA256_Update);
|
||||
#undef SHA256_Final
|
||||
__weak_reference(_libmd_SHA256_Final, SHA256_Final);
|
||||
#undef SHA256_Transform
|
||||
__weak_reference(_libmd_SHA256_Transform, SHA256_Transform);
|
||||
#endif
|
@ -137,15 +137,13 @@ libusb20_parse_config_desc(const void *config_desc)
|
||||
* Make a copy of the config descriptor, so that the caller can free
|
||||
* the inital config descriptor pointer!
|
||||
*/
|
||||
ptr = (void *)(lub_endpoint + nendpoint);
|
||||
memcpy(LIBUSB20_ADD_BYTES(ptr, 0), config_desc, pcdesc.len);
|
||||
memcpy((void *)(lub_endpoint + nendpoint), config_desc, pcdesc.len);
|
||||
|
||||
ptr = (const void *)(lub_endpoint + nendpoint);
|
||||
pcdesc.ptr = LIBUSB20_ADD_BYTES(ptr, 0);
|
||||
config_desc = LIBUSB20_ADD_BYTES(ptr, 0);
|
||||
|
||||
/* init config structure */
|
||||
|
||||
ptr = config_desc;
|
||||
|
||||
LIBUSB20_INIT(LIBUSB20_CONFIG_DESC, &lub_config->desc);
|
||||
|
||||
if (libusb20_me_decode(ptr, ptr[0], &lub_config->desc)) {
|
||||
|
@ -24,7 +24,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd May 27, 2013
|
||||
.Dd Jul 14, 2015
|
||||
.Dt CACOS 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -98,11 +98,7 @@ functions perform the same operations in
|
||||
.Fa float
|
||||
precision.
|
||||
.Pp
|
||||
.ie '\*[.T]'utf8'
|
||||
. ds Un \[cu]
|
||||
.el
|
||||
. ds Un U
|
||||
.
|
||||
.ds Un \[cu]
|
||||
There is no universal convention for defining the principal values of
|
||||
these functions. The following table gives the branch cuts, and the
|
||||
corresponding ranges for the return values, adopted by the C language.
|
||||
|
@ -6,8 +6,7 @@
|
||||
#
|
||||
|
||||
VAGRANT_IMG?= ${.OBJDIR}/vagrant.vmdk
|
||||
VAGRANT_UPLOAD_TGTS= vagrant-check-depends \
|
||||
atlas-do-upload
|
||||
VAGRANT_UPLOAD_TGTS= vagrant-check-depends
|
||||
CLEANFILES+= ${VAGRANT_UPLOAD_TGTS}
|
||||
|
||||
.if defined(VAGRANT_UPLOAD_CONF) && !empty(VAGRANT_UPLOAD_CONF)
|
||||
@ -18,16 +17,20 @@ ATLAS${VAR}:= ${VAGRANT${VAR}}
|
||||
.endif
|
||||
|
||||
.if ${BRANCH} == "STABLE" || ${BRANCH} == "CURRENT" || ${BRANCH} == "PRERELEASE"
|
||||
SNAPSHOT_DATE!= date +-%Y-%m-%d
|
||||
SNAPSHOT_DATE!= date +%Y%m%d
|
||||
.endif
|
||||
|
||||
VAGRANT_VERSION?= ${REVISION}-${BRANCH}${SNAPSHOT_DATE}
|
||||
VAGRANT_VERSION!= date +%Y.%m.%d
|
||||
VAGRANT_TARGET:= ${OSRELEASE}-${SNAPSHOT_DATE}
|
||||
.if !empty(CLOUDWARE)
|
||||
. for _PROVIDER in ${CLOUDWARE}
|
||||
. if ${_PROVIDER:MVAGRANT*}
|
||||
VAGRANT_PROVIDERS+= ${_PROVIDER:S/VAGRANT-//:tl}
|
||||
. endif
|
||||
. endfor
|
||||
.endif
|
||||
VAGRANT_PROVIDERS?= vmware virtualbox
|
||||
|
||||
VAGRANT_TARGET:= ${OSRELEASE}${SNAPSHOT_DATE}.box
|
||||
VAGRANT_PROVIDERS?= vmware_desktop
|
||||
#VAGRANT_PROVIDERS+= virtualbox
|
||||
|
||||
vagrant-upload: ${VAGRANT_UPLOAD_TGTS}
|
||||
|
||||
vagrant-check-depends:
|
||||
.for VAR in _KEY _USERNAME _VERSION
|
||||
@ -47,48 +50,73 @@ vagrant-check-depends:
|
||||
. endif
|
||||
.endif
|
||||
|
||||
vagrant-do-package: cw-vagrant
|
||||
|
||||
vagrant-do-package-vmware: vagrant-create-vmware-vmx vagrant-do-package
|
||||
@cd ${.OBJDIR} && echo '{"provider":"vmware_desktop"}' > metadata.json
|
||||
cd ${.OBJDIR} && tar -czf ${VAGRANT_TARGET} metadata.json vagrant.vmx vagrant.vmdk
|
||||
touch ${.OBJDIR}/${.TARGET}
|
||||
|
||||
atlas-do-upload: vagrant-do-package-vmware
|
||||
.for PROVIDER in ${VAGRANT_PROVIDERS}
|
||||
${.CURDIR}/scripts/atlas-upload.sh -b FreeBSD-${REVISION}-${BRANCH} -f ${VAGRANT_TARGET} -p ${PROVIDER} -k ${VAGRANT_KEY} -u ${VAGRANT_USERNAME} -v ${VAGRANT_VERSION}
|
||||
.endfor
|
||||
touch ${.OBJDIR}/${.TARGET}
|
||||
CLEANFILES+= vagrant-do-package-${PROVIDER} ${VAGRANT_TARGET}.${PROVIDER}.box
|
||||
CLEANDIRS+= ${PROVIDER}
|
||||
VAGRANT_UPLOAD_TGTS+= vagrant-do-upload-${PROVIDER}
|
||||
|
||||
vagrant-create-vmware-vmx:
|
||||
@cd ${.OBJDIR} && echo '.encoding = "UTF-8"' > vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'bios.bootorder = "hdd,CDROM"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'checkpoint.vmstate = ""' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'cleanshutdown = "TRUE"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'config.version = "8"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'displayname = "${VAGRANT_TARGET}"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'ethernet0.addresstype = "generated"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'ethernet0.bsdname = "en0"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'ethernet0.connectiontype = "nat"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'ethernet0.displayname = "Ethernet"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'ethernet0.linkstatepropagation.enable = "FALSE"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'ethernet0.pcislotnumber = "33"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'ethernet0.present = "TRUE"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'ethernet0.virtualdev = "e1000"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'ethernet0.wakeonpcktrcv = "FALSE"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'floppy0.present = "FALSE"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'guestos = "freebsd-64"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'gui.fullscreenatpoweron = "FALSE"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'gui.viewmodeatpoweron = "windowed"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'memsize = "512"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'sound.startconnected = "FALSE"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'softpoweroff = "TRUE"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'scsi0.pcislotnumber = "16"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'scsi0.present = "TRUE"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'scsi0.virtualdev = "lsilogic"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'scsi0:0.filename = "vagrant.vmdk"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'scsi0:0.present = "TRUE"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'tools.synctime = "TRUE"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'usb.present = "FALSE"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'virtualhw.productcompatibility = "hosted"' >> vagrant.vmx
|
||||
@cd ${.OBJDIR} && echo 'virtualhw.version = "9"' >> vagrant.vmx
|
||||
${PROVIDER}:
|
||||
@mkdir -p ${PROVIDER}
|
||||
|
||||
${VAGRANT_TARGET}.${PROVIDER}.box: ${PROVIDER} cw-vagrant-${PROVIDER} vagrant-create-${PROVIDER}-metadata
|
||||
@echo "==> PACKAGING: ${VAGRANT_TARGET}.${PROVIDER}.box in `pwd`"
|
||||
@cp vagrant-${PROVIDER}.vmdk ${PROVIDER}/vagrant.vmdk
|
||||
. if ${PROVIDER} == "virtualbox"
|
||||
@(cd ${.OBJDIR}/${PROVIDER} && echo '{"provider":"${PROVIDER}"}' > metadata.json)
|
||||
@(cd ${.OBJDIR}/${PROVIDER} && tar -czf ../${VAGRANT_TARGET}.${PROVIDER}.box metadata.json box.ovf vagrant.vmdk)
|
||||
. elif ${PROVIDER} == "vmware"
|
||||
@(cd ${.OBJDIR}/${PROVIDER} && echo '{"provider":"${PROVIDER}_desktop"}' > metadata.json)
|
||||
@(cd ${.OBJDIR}/${PROVIDER} && tar -czf ../${VAGRANT_TARGET}.${PROVIDER}.box metadata.json vagrant.vmx vagrant.vmdk)
|
||||
. endif
|
||||
|
||||
CLEANFILES+= vagrant-do-upload-${PROVIDER}
|
||||
vagrant-do-upload-${PROVIDER}: ${VAGRANT_TARGET}.${PROVIDER}.box
|
||||
. if ${PROVIDER} == "virtualbox"
|
||||
${.CURDIR}/scripts/atlas-upload.sh -b ${TYPE}-${REVISION}-${BRANCH} -f ${VAGRANT_TARGET}.${PROVIDER}.box -p ${PROVIDER} -k ${VAGRANT_KEY} -u ${VAGRANT_USERNAME} -v ${VAGRANT_VERSION}
|
||||
. elif ${PROVIDER} == "vmware"
|
||||
${.CURDIR}/scripts/atlas-upload.sh -b ${TYPE}-${REVISION}-${BRANCH} -f ${VAGRANT_TARGET}.${PROVIDER}.box -p ${PROVIDER}_desktop -k ${VAGRANT_KEY} -u ${VAGRANT_USERNAME} -v ${VAGRANT_VERSION}
|
||||
. endif
|
||||
touch ${.OBJDIR}/${.TARGET}
|
||||
.endfor
|
||||
|
||||
vagrant-upload: ${VAGRANT_UPLOAD_TGTS}
|
||||
|
||||
vagrant-create-virtualbox-metadata: virtualbox/box.ovf
|
||||
|
||||
virtualbox/box.ovf: ${.CURDIR}/scripts/box.ovf
|
||||
cp ${.ALLSRC} virtualbox/
|
||||
|
||||
vmware/vagrant.vmx:
|
||||
@(cd vmware && echo '.encoding = "UTF-8"' > vagrant.vmx)
|
||||
@(cd vmware && echo 'bios.bootorder = "hdd,CDROM"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'checkpoint.vmstate = ""' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'cleanshutdown = "TRUE"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'config.version = "8"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'displayname = "${VAGRANT_TARGET}"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'ethernet0.addresstype = "generated"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'ethernet0.bsdname = "en0"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'ethernet0.connectiontype = "nat"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'ethernet0.displayname = "Ethernet"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'ethernet0.linkstatepropagation.enable = "FALSE"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'ethernet0.pcislotnumber = "33"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'ethernet0.present = "TRUE"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'ethernet0.virtualdev = "e1000"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'ethernet0.wakeonpcktrcv = "FALSE"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'floppy0.present = "FALSE"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'guestos = "freebsd-64"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'gui.fullscreenatpoweron = "FALSE"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'gui.viewmodeatpoweron = "windowed"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'memsize = "512"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'sound.startconnected = "FALSE"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'softpoweroff = "TRUE"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'scsi0.pcislotnumber = "16"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'scsi0.present = "TRUE"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'scsi0.virtualdev = "lsilogic"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'scsi0:0.filename = "vagrant.vmdk"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'scsi0:0.present = "TRUE"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'tools.synctime = "TRUE"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'usb.present = "FALSE"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'virtualhw.productcompatibility = "hosted"' >> vagrant.vmx)
|
||||
@(cd vmware && echo 'virtualhw.version = "9"' >> vagrant.vmx)
|
||||
|
||||
vagrant-create-vmware-metadata: vmware/vagrant.vmx
|
||||
|
@ -19,7 +19,8 @@ CLOUDWARE?= AZURE \
|
||||
EC2 \
|
||||
GCE \
|
||||
OPENSTACK \
|
||||
VAGRANT
|
||||
VAGRANT-VIRTUALBOX \
|
||||
VAGRANT-VMWARE
|
||||
AZURE_FORMAT= vhdf
|
||||
AZURE_DESC= Microsoft Azure platform image
|
||||
AZURE_DISK= ${OSRELEASE}.${AZURE_FORMAT}
|
||||
@ -32,9 +33,12 @@ GCE_DISK= disk.${GCE_FORMAT}
|
||||
OPENSTACK_FORMAT=qcow2
|
||||
OPENSTACK_DESC= OpenStack platform image
|
||||
OPENSTACK_DISK= ${OSRELEASE}.${OPENSTACK_FORMAT}
|
||||
VAGRANT_FORMAT= vmdk
|
||||
VAGRANT_DESC= Vagrant Image
|
||||
VAGRANT_DISK= ${OSRELEASE}.${VAGRANT_FORMAT}
|
||||
VAGRANT-VIRTUALBOX_FORMAT= vmdk
|
||||
VAGRANT-VIRTUALBOX_DESC= Vagrant Image for VirtualBox
|
||||
VAGRANT-VIRTUALBOX_DISK= ${OSRELEASE}.vbox.${VAGRANT_FORMAT}
|
||||
VAGRANT-VMWARE_FORMAT= vmdk
|
||||
VAGRANT-VMWARE_DESC= Vagrant Image for VMWare
|
||||
VAGRANT-VMWARE_DISK= ${OSRELEASE}.vmware.${VAGRANT_FORMAT}
|
||||
|
||||
.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) && !empty(CLOUDWARE)
|
||||
. for _CW in ${CLOUDWARE}
|
||||
|
@ -295,6 +295,11 @@
|
||||
has been updated to support <acronym>UTF</acronym>-8, which
|
||||
additionally provides unicode support to &man.sh.1;.</para>
|
||||
|
||||
<para revision="276893" contrib="sponsor" sponsor="&ff;">The
|
||||
&man.mkimg.1; utility has been updated to support the
|
||||
<acronym>MBR</acronym> <acronym>EFI</acronym> partition
|
||||
type.</para>
|
||||
|
||||
<para revision="277166" arch="powerpc">The &man.ptrace.2; system
|
||||
call has been updated include support for Altivec registers on
|
||||
&os;/&arch.powerpc;.</para>
|
||||
@ -306,6 +311,15 @@
|
||||
devices. The &man.devctl.8; utility uses the new
|
||||
&man.devctl.3; library.</para>
|
||||
|
||||
<para revision="279122" contrib="sponsor"
|
||||
sponsor="&juniper;">The &man.netstat.1; utility has been
|
||||
updated to link against the &man.libxo.3; shared
|
||||
library.</para>
|
||||
|
||||
<para revision="279139">A new flag, <literal>-c</literal>, has
|
||||
been added to the &man.mkimg.1; utility, which allows
|
||||
specifying the capacity of the target disk image.</para>
|
||||
|
||||
<para revision="279315" contrib="sponsor" sponsor="&ff;">The
|
||||
&man.uefisign.8; utility has been added.</para>
|
||||
|
||||
@ -314,11 +328,6 @@
|
||||
been updated to prevent fetching updated binary patches when
|
||||
a previous upgrade has not been thoroughly completed.</para>
|
||||
|
||||
<para revision="279122" contrib="sponsor"
|
||||
sponsor="&juniper;">The &man.netstat.1; utility has been
|
||||
updated to link against the &man.libxo.3; shared
|
||||
library.</para>
|
||||
|
||||
<para revision="280870">A regression in the &man.libarchive.3;
|
||||
library that would prevent a directory from being included in
|
||||
the archive when <literal>--one-file-system</literal> is used
|
||||
@ -331,16 +340,22 @@
|
||||
directory traversal when extracting an archive, similar to
|
||||
&man.tar.1;.</para>
|
||||
|
||||
<para revision="281617">A race condition in &man.wc.1; that
|
||||
would cause final results to be sent to &man.stderr.4; when
|
||||
receiving the <literal>SIGINFO</literal> signal has been
|
||||
fixed.</para>
|
||||
|
||||
<para revision="282208" contrib="sponsor"
|
||||
sponsor="&multiplay;">The &man.chflags.1;, &man.chgrp.1;,
|
||||
&man.chmod.1;, and &man.chown.8; utilities now affect symbolic
|
||||
links when the <literal>-R</literal> flag is specified, as
|
||||
documented in &man.symlink.7;.</para>
|
||||
|
||||
<para revision="281617">A race condition in &man.wc.1; that
|
||||
would cause final results to be sent to &man.stderr.4; when
|
||||
receiving the <literal>SIGINFO</literal> signal has been
|
||||
fixed.</para>
|
||||
<para revision="282608">The &man.date.1; utility has been
|
||||
updated to print the modification time of the file passed as
|
||||
an argument to the <literal>-r</literal> flag, improving
|
||||
compatibility with the <acronym>GNU</acronym> &man.date.1;
|
||||
utility behavior.</para>
|
||||
|
||||
<para revision="283961">The &man.pw.8; utility has been updated
|
||||
with a new flag, <literal>-R</literal>, that sets the root
|
||||
@ -376,6 +391,10 @@
|
||||
sponsor="&scaleengine;">The &man.fstyp.8; utility has been
|
||||
updated to be able to detect &man.zfs.8; and &man.geli.8;
|
||||
filesystems.</para>
|
||||
|
||||
<para revision="285550">The &man.w.1; utility has been updated
|
||||
to display the full IPv6 remote address of the host from which
|
||||
a user is connected.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="userland-contrib">
|
||||
@ -385,9 +404,6 @@
|
||||
sponsor="&darpa_afrl;">&man.lldb.1; has been updated to
|
||||
upstream snapshot version r196259.</para>
|
||||
|
||||
<para revision="259626">Timezone data files have been updated to
|
||||
version 2013i.</para>
|
||||
|
||||
<para revision="260445">&man.byacc.1; has been updated to
|
||||
version 20140101.</para>
|
||||
|
||||
@ -407,9 +423,6 @@
|
||||
<application>Clang</application> have been updated to
|
||||
version 3.4.</para>
|
||||
|
||||
<para revision="276577"><application>file</application> has been
|
||||
updated to version 5.22.</para>
|
||||
|
||||
<para revision="275718">The <application>binutils</application>
|
||||
suite of utilities has been updated to include upstream
|
||||
patches that add new relocations for &arch.powerpc;
|
||||
@ -465,8 +478,8 @@
|
||||
&man.resolvconf.8; utility has been updated to version
|
||||
3.7.0.</para>
|
||||
|
||||
<para revision="284254"><application>bmake</application> has
|
||||
been updated to version 20150606.</para>
|
||||
<para revision="282613">The &man.nc.1; utility has been updated
|
||||
to the OpenBSD 5.7 version.</para>
|
||||
|
||||
<para revision="283092">The &man.acpi.4; subsystem has been
|
||||
updated to version 20150515.</para>
|
||||
@ -474,6 +487,12 @@
|
||||
<para revision="284237">The &man.file.1; utility has been
|
||||
updated to version 5.23.</para>
|
||||
|
||||
<para revision="284254"><application>bmake</application> has
|
||||
been updated to version 20150606.</para>
|
||||
|
||||
<para revision="284397">Timezone data files have been updated to
|
||||
version 2015e.</para>
|
||||
|
||||
<para revision="285229"><application>sendmail</application> has
|
||||
been updated to 8.15.2. Starting with &os; 11.0 and
|
||||
sendmail 8.15, sendmail uses uncompressed IPv6 addresses by
|
||||
@ -481,12 +500,12 @@
|
||||
example, instead of <quote>::1</quote>, it will be
|
||||
<quote>0:0:0:0:0:0:0:1</quote>. This permits a zero subnet to
|
||||
have a more specific match, such as different map entries for
|
||||
IPv6:0:0 vs IPv6:0. This change requires that configuration
|
||||
data (including maps, files, classes, custom ruleset, etc.)
|
||||
must use the same format, so make certain such configuration
|
||||
data is upgrading. As a very simple check search for patterns
|
||||
like 'IPv6:[0-9a-fA-F:]*::' and 'IPv6::'. To return to the
|
||||
old behavior, set the m4 option
|
||||
IPv6:0:0 versus IPv6:0. This change requires that
|
||||
configuration data (including maps, files, classes, custom
|
||||
ruleset, etc.) must use the same format, so make certain such
|
||||
configuration data is upgrading. As a very simple check
|
||||
search for patterns like 'IPv6:[0-9a-fA-F:]*::' and 'IPv6::'.
|
||||
To return to the old behavior, set the m4 option
|
||||
<literal>confUSE_COMPRESSED_IPV6_ADDRESSES</literal> or the cf
|
||||
option <literal>UseCompressedIPv6Addresses</literal>.</para>
|
||||
|
||||
@ -533,6 +552,11 @@
|
||||
If <literal>LOCALBASE</literal> is unset, it defaults to
|
||||
<filename class="directory">/usr/local</filename>.</para>
|
||||
|
||||
<para revision="273955">A new &man.rc.8; script,
|
||||
<filename>growfs</filename>, has been added, which will resize
|
||||
the root filesystem on boot if <filename>/firstboot</filename>
|
||||
exists.</para>
|
||||
|
||||
<para revision="275299">The <filename>mrouted</filename>
|
||||
&man.rc.8; script has been removed from the base system. An
|
||||
equivalent script is available from the <filename
|
||||
@ -553,6 +577,14 @@
|
||||
<filename>110.clean-tmps</filename> has been updated to avoid
|
||||
crossing filesystem mount boundaries when cleaning files in
|
||||
<filename class="directory">/tmp</filename>.</para>
|
||||
|
||||
<para revision="277216" contrib="sponsor" sponsor="&ff;">A new
|
||||
&man.periodic.8; script,
|
||||
<filename>510.status-world-kernel</filename>, has been added,
|
||||
which evaluates the running userland and kernel versions from
|
||||
the &man.uname.1; <literal>-U</literal> and
|
||||
<literal>-K</literal> arguments, and prints an error if the
|
||||
system userland and kernel are not in sync.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="userland-libraries">
|
||||
@ -592,6 +624,11 @@
|
||||
providing a wrapper around the &man.gpio.4; kernel
|
||||
interface.</para>
|
||||
|
||||
<para revision="275800" contrib="sponsor" sponsor="&ff;">The
|
||||
&man.procctl.2; system call has been updated to include
|
||||
a facility for non-&man.init.8; processes to be declared as
|
||||
the reaper of child processes and their decendants.</para>
|
||||
|
||||
<para revision="277610">The <literal>futimens()</literal> and
|
||||
<literal>utimensat()</literal> system calls have been
|
||||
added. See &man.utimensat.2; for more information.</para>
|
||||
@ -670,6 +707,14 @@
|
||||
and <literal>asttrapexit()</literal> functions instead of
|
||||
checking within addressed kernel space.</para>
|
||||
|
||||
<para revision="271917">A kernel panic triggered when destroying
|
||||
a &man.vnet.9; &man.jail.8; configured with &man.gif.4; has
|
||||
been fixed.</para>
|
||||
|
||||
<para revision="271918">A kernel panic triggered when destroying
|
||||
a &man.vnet.9; &man.jail.8; configured with &man.gre.4; has
|
||||
been fixed.</para>
|
||||
|
||||
<para revision="272089">A bug in &man.ipfw.4; that could
|
||||
potentially lead to a kernel panic when using &man.dummynet.4;
|
||||
at layer 2 has been fixed.</para>
|
||||
@ -732,6 +777,15 @@
|
||||
system.</para>
|
||||
</important>
|
||||
|
||||
<para revision="278338" arch="arm">A new module for creating
|
||||
<filename>rpi.dtb</filename> has been added for the Raspberry
|
||||
Pi.</para>
|
||||
|
||||
<para revision="278340" arch="arm">The
|
||||
<filename>rpi.dtb</filename> module is now installed to
|
||||
<filename class="directory">/boot/dtb/</filename> by
|
||||
default for the Raspberry Pi system.</para>
|
||||
|
||||
<para revision="279189" contrib="sponsor" sponsor="&ff;"
|
||||
arch="powerpc">Kernel support for Vector-Scalar eXtension
|
||||
(<acronym>VSX</acronym>) found on POWER7 and POWER8 hardware
|
||||
@ -742,6 +796,33 @@
|
||||
&powerpc; processors has been overhaulded to improve
|
||||
concurrency.</para>
|
||||
|
||||
<para revision="279824" arch="arm">A new module for creating
|
||||
the <filename>dtb</filename> module for AM335x systems has
|
||||
been added.</para>
|
||||
|
||||
<para revision="281495" contrib="sponsor" sponsor="&ff;">The
|
||||
<literal>PAE_TABLES</literal> kernel configuration option has
|
||||
been added for &os;/&arch.i386;, which instructs &man.pmap.9;
|
||||
to use <acronym>PAE</acronym> format for page tables.</para>
|
||||
|
||||
<para revision="282215">The <literal>SIFTR</literal> kernel
|
||||
configuration has been added, allowing building &man.siftr.4;
|
||||
statically into the kernel.</para>
|
||||
|
||||
<para revision="282731" arch="arm">The &arch.arm; boot loader,
|
||||
<filename>ubldr</filename>, is now relocatable. In addition,
|
||||
<filename>ubldr.bin</filename> is now created during build
|
||||
time, which is a stripped binary with an entry point of
|
||||
<literal>0</literal>, providing the ability to specify the
|
||||
load address by running <literal>go
|
||||
${loadaddr}</literal> in
|
||||
<literal>u-boot</literal>.</para>
|
||||
|
||||
<para revision="282921" contrib="sponsor" sponsor="&intelcorp;"
|
||||
arch="amd64,i386">The &man.nvd.4; and &man.nvme.4; drivers are
|
||||
now included in the <filename>GENERIC</filename> kernel
|
||||
configuration by default.</para>
|
||||
|
||||
<para revision="283959" contrib="sponsor"
|
||||
sponsor="&limelight;">A new kernel configuration option,
|
||||
<literal>EM_MULTIQUEUE</literal>, has been added which enables
|
||||
@ -841,6 +922,11 @@
|
||||
<para revision="280183">The <literal>drm</literal> code has
|
||||
been updated to match &linux; version 3.8.13.</para>
|
||||
|
||||
<para revision="281440">The &man.psm.4; driver has been updated
|
||||
to include improved support for newer Synaptics ®
|
||||
touchpads and the ClickPad ® mouse on newer
|
||||
Lenovo ™ laptops.</para>
|
||||
|
||||
<para revision="282783" arch="powerpc">Support for the Freescale
|
||||
<acronym>PCI</acronym> Root Complex device has been
|
||||
added.</para>
|
||||
@ -928,6 +1014,11 @@
|
||||
<para revision="272730">The &man.alc.4; driver has been updated
|
||||
to support AR816x and AR817x ethernet controllers.</para>
|
||||
|
||||
<para revision="272906">The &man.pfil.9; interface default hash
|
||||
has been changed from <literal>Jenkins</literal> to
|
||||
<literal>Murmur3</literal>, providing a 3-percent performance
|
||||
increase in packets-per-second.</para>
|
||||
|
||||
<para revision="273331">The &man.vxlan.4; driver has been added,
|
||||
which creates a virtual Layer 2 (Ethernet) network overlaid in
|
||||
a Layer 3 (IP/UDP) network. The &man.vxlan.4; driver is
|
||||
@ -939,9 +1030,20 @@
|
||||
been split into two separate modules, &man.gre.4; and
|
||||
&man.me.4;.</para>
|
||||
|
||||
<para revision="278551">The &man.ral.4; driver has been updated
|
||||
to support the RT5390 and RT5392 chipsets.</para>
|
||||
|
||||
<para revision="283514" contrib="sponsor"
|
||||
sponsor="&solarflare;">The &man.sfxge.4; driver has been
|
||||
updated to support Solarflare Flareon Ultra 7000-series
|
||||
chipsets.</para>
|
||||
|
||||
<para revision="283766" contrib="sponsor"
|
||||
sponsor="&limelight;">The &man.em.4; driver has been updated
|
||||
with improved transmission queue hang detection.</para>
|
||||
|
||||
<para revision="284125">The &man.cdce.4; driver has been updated
|
||||
to include support for the RTL8153 chipset.</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
@ -977,10 +1079,6 @@
|
||||
driver has been updated to correct performance counter
|
||||
sampling on G4 (MPC74xxx) and G5 class processors.</para>
|
||||
|
||||
<para revision="281713" arch="powerpc">The &man.hwpmc.4;
|
||||
driver has been updated to support the Freescale e500
|
||||
core.</para>
|
||||
|
||||
<para revision="275732" contrib="sponsor"
|
||||
sponsor="&ff;,&netgate;">The
|
||||
<application>OpenCrypto</application> framework has been
|
||||
@ -988,6 +1086,10 @@
|
||||
<literal>AES-GCM</literal> modes, both of which have also been
|
||||
added to the &man.aesni.4; driver.</para>
|
||||
|
||||
<para revision="281713" arch="powerpc">The &man.hwpmc.4;
|
||||
driver has been updated to support the Freescale e500
|
||||
core.</para>
|
||||
|
||||
<para revision="283766">The &man.ig4.4; driver has been added,
|
||||
providing support for the fourth generation &intel;
|
||||
<acronym>I2C</acronym> SMBus.</para>
|
||||
@ -1036,6 +1138,11 @@
|
||||
I/O, and uses hardware virtualization extensions for all other
|
||||
tasks, without the need for emulation.</para>
|
||||
|
||||
<para revision="273375">The &man.bhyve.8; hypervisor has been
|
||||
updated to support &amd; processors with
|
||||
<acronym>SVM</acronym> and <acronym>AMD-V</acronym> hardware
|
||||
extensions.</para>
|
||||
|
||||
<para revision="273515">The &man.virtio.console.4; driver has
|
||||
been added, which provides an interface to VirtIO console
|
||||
devices through a &man.tty.4; device.</para>
|
||||
@ -1083,6 +1190,16 @@
|
||||
<para revision="260921">The &man.nand.4; device is enabled for
|
||||
ARM devices by default.</para>
|
||||
|
||||
<para revision="266943" arch="arm">Support for the Exynos 5420
|
||||
Octa system has been added.</para>
|
||||
|
||||
<para revision="267390" arch="arm">The <acronym>SMP</acronym>
|
||||
option has been enabled for all Exynos 5 systems supported by
|
||||
&os;.</para>
|
||||
|
||||
<para revision="268838" arch="arm">Support for the Toradex
|
||||
Apalis i.MX6 development board has been added.</para>
|
||||
|
||||
<para revision="273264" arch="armv6">An issue that could cause
|
||||
instability when detecting <acronym>SD</acronym> cards on the
|
||||
Raspberry Pi <acronym>SOC</acronym> has been fixed.</para>
|
||||
@ -1092,6 +1209,17 @@
|
||||
frequency and voltage control on the Raspberry Pi
|
||||
<acronym>SOC</acronym>.</para>
|
||||
|
||||
<para revision="277042" arch="arm">Support to turn off the
|
||||
BeagleBone Black system with the &man.shutdown.8;
|
||||
<literal>-p</literal> flag or by invoking &man.poweroff.8; has
|
||||
been added.</para>
|
||||
|
||||
<para revision="277644" arch="arm">Audio transmission drivers
|
||||
have been added for Digital Audio Multiplexer
|
||||
(<acronym>AUDMUXM</acronym>), Smart Direct Memory Access
|
||||
Controller (<acronym>SDMA</acronym>), and Syncronous Serial
|
||||
Interface (<acronym>SSI</acronym>).</para>
|
||||
|
||||
<para revision="280259" contrib="sponsor" sponsor="&ff;">Initial
|
||||
support for the ARM AArch64 architecture has been
|
||||
added.</para>
|
||||
@ -1153,6 +1281,11 @@
|
||||
is administered with the &man.automount.8; userland utility,
|
||||
and the &man.automountd.8; and &man.autounmountd.8;
|
||||
daemons.</para>
|
||||
|
||||
<para revision="273849" contrib="sponsor" sponsor="&ff;">Support
|
||||
for the <literal>timeo</literal>, <literal>actimeo</literal>,
|
||||
<literal>noac</literal>, and <literal>proto</literal> options
|
||||
have been added to &man.mount.nfs.8;.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="storage-zfs">
|
||||
@ -1173,6 +1306,11 @@
|
||||
<para revision="267359">Support for the
|
||||
<literal>disklabel64</literal> partitioning scheme has been
|
||||
added to &man.gpart.8;.</para>
|
||||
|
||||
<para revision="282465">Support for the
|
||||
<literal>apple-boot</literal>, <literal>apple-hfs</literal>,
|
||||
and <literal>apple-ufs</literal> <acronym>MBR</acronym>
|
||||
partitioning schemes have been added to &man.gpart.8;.</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
@ -1185,6 +1323,15 @@
|
||||
<sect2 xml:id="boot-loader">
|
||||
<title>Boot Loader Changes</title>
|
||||
|
||||
<para revision="258431" contrib="sponsor" sponsor="&ff;">The
|
||||
memory test run at boot time on &os;/&arch.amd64; platforms
|
||||
has been disabled by default.</para>
|
||||
|
||||
<para revision="262955">A new &man.ttys.5; class,
|
||||
<literal>3wire</literal>, has been added. This is similar to
|
||||
the existing terminal classes, but does not have a defined
|
||||
baudrate.</para>
|
||||
|
||||
<para revision="274085">The &man.vt.4; driver has been made the
|
||||
default system console driver. The &man.syscons.4; driver is
|
||||
still available, and can be enabled by adding
|
||||
@ -1193,15 +1340,20 @@
|
||||
entering <literal>set kern.vty=sc</literal> at the
|
||||
&man.loader.8; prompt.</para>
|
||||
|
||||
<para revision="279950">Support for <literal>bzipfs</literal>
|
||||
has been added to the <acronym>EFI</acronym> loader.</para>
|
||||
|
||||
<para revision="281616">The boot loader has been updated to
|
||||
support entering the <acronym>GELI</acronym> passphrase before
|
||||
loading the kernel. To enable this behavior, add
|
||||
<literal>geom_eli_passphrase_prompt="YES"</literal> to
|
||||
&man.loader.conf.5;.</para>
|
||||
|
||||
<para revision="258431" contrib="sponsor" sponsor="&ff;">The
|
||||
memory test run at boot time on &os;/&arch.amd64; platforms
|
||||
has been disabled by default.</para>
|
||||
<para revision="284683" contrib="sponsor" sponsor="&ff;"
|
||||
arch="arm">The &man.ttys.5; file for &os;/&arch.arm; has been
|
||||
updated to enable <filename>ttyu1</filename>,
|
||||
<filename>ttyu2</filename>, and <filename>ttyu3</filename> by
|
||||
default, if the callin port is an active console port.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="boot-menu">
|
||||
@ -1369,6 +1521,18 @@
|
||||
Release Engineering build tools have been updated to include
|
||||
support for building &os;/&arch.arm64; virtual machine and
|
||||
memory stick installation images.</para>
|
||||
|
||||
<para revision="282693" contrib="sponsor" sponsor="&ff;">The
|
||||
Release Engineering build tools have been updated to support
|
||||
building &os;/&arch.arm; images without external utilities for
|
||||
supported boards where a corresponding
|
||||
<literal>u-boot</literal> port exists in the Ports
|
||||
Collection.</para>
|
||||
|
||||
<para revision="283307" contrib="sponsor" sponsor="&ff;">The
|
||||
&os;/&arch.i386; memory stick installation images are now
|
||||
created using the &man.mkimg.1; utility, matching the way
|
||||
the &os;/&arch.amd64; images are created.</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
</article>
|
||||
|
@ -27,6 +27,7 @@
|
||||
|
||||
<!ENTITY juniper "Juniper Networks, Inc.">
|
||||
|
||||
<!ENTITY intelcorp "Intel Corporation">
|
||||
<!ENTITY ix "iXsystems">
|
||||
|
||||
<!ENTITY limelight "Limelight Networks">
|
||||
@ -42,6 +43,7 @@
|
||||
|
||||
<!ENTITY sandvine "Sandvine, Inc.">
|
||||
<!ENTITY scaleengine "ScaleEngine, Inc.">
|
||||
<!ENTITY solarflare "Solarflare Communications, Inc.">
|
||||
<!ENTITY spectralogic "Spectra Logic">
|
||||
|
||||
<!ENTITY yandex "Yandex LLC">
|
||||
|
@ -532,7 +532,11 @@ do_links() { # rootdir varname
|
||||
# if no argument default to objdir/SHLIBDIRPREFIX for both
|
||||
find_progs() { # programs
|
||||
# logverbose "find_progs: called with $*"
|
||||
local i=`realpath ${o_objdir:-${_SHLIBDIRPREFIX}/..}`
|
||||
# rev.284898 removed _SHLIBDIRPREFIX so we need to reconstruct
|
||||
# its value in i1
|
||||
local i1=${_SHLIBDIRPREFIX:-${l_objtree}/${SRC}/tmp}
|
||||
local i=`realpath ${o_objdir:-${i1}/..}`
|
||||
|
||||
# default values for -L and -P
|
||||
local dir="-P $i"
|
||||
local ldir="-L $i"
|
||||
|
@ -28,20 +28,23 @@
|
||||
|
||||
ATLAS_API_URL=''
|
||||
ATLAS_UPLOAD_URL='https://binstore.hashicorp.com'
|
||||
VERSION_DESCRIPTION="FreeBSD Snapshot Build"
|
||||
DESCRIPTION="FreeBSD Snapshot Build"
|
||||
|
||||
usage() {
|
||||
echo "${0} usage:"
|
||||
echo "-b box-name -f box-to-upload -k api-key -p provider -u user -v version"
|
||||
echo "-b box-name -d 'box description' -f box-to-upload -k api-key -p provider -u user -v version"
|
||||
return 1
|
||||
}
|
||||
|
||||
main () {
|
||||
while getopts "b:f:k:p:u:v:" arg; do
|
||||
while getopts "b:d:f:k:p:u:v:" arg; do
|
||||
case "${arg}" in
|
||||
b)
|
||||
BOX="${OPTARG}"
|
||||
;;
|
||||
d)
|
||||
DESCRIPTION="${OPTARG}"
|
||||
;;
|
||||
f)
|
||||
FILE="${OPTARG}"
|
||||
;;
|
||||
@ -83,6 +86,7 @@ main () {
|
||||
echo "Creating box: ${BOX}"
|
||||
/usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/boxes -X POST -d "box[name]=${BOX}" -d "access_token=${KEY}" > /dev/null
|
||||
/usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX} -X PUT -d "box[is_private]=false" -d "access_token=${KEY}" > /dev/null
|
||||
/usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX} -X PUT -d "box[description]='${DESCRIPTION}'" -d "access_token=${KEY}" > /dev/null
|
||||
else
|
||||
echo "Box already exists"
|
||||
fi
|
||||
@ -97,7 +101,7 @@ main () {
|
||||
if [ $? != 0 ]; then
|
||||
echo "Creating version: ${VERSION}"
|
||||
/usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/versions -X POST -d "version[version]=${VERSION}" -d "access_token=${KEY}" > /dev/null
|
||||
/usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION} -X PUT -d "version[description]=${VERSION_DESCRIPTION}" -d "access_token=${KEY}" > /dev/null
|
||||
/usr/local/bin/curl -s https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION} -X PUT -d "version[description]=${DESCRIPTION}" -d "access_token=${KEY}" > /dev/null
|
||||
VERSIONRESULT=$(/usr/local/bin/curl -s "https://atlas.hashicorp.com/api/v1/box/${USERNAME}/${BOX}/version/${VERSION}?access_token=${KEY}")
|
||||
echo $VERSIONRESULT | grep "\"version\":\"${VERSION}\"" > /dev/null
|
||||
if [ $? != 0 ]; then
|
||||
|
226
release/scripts/box.ovf
Normal file
226
release/scripts/box.ovf
Normal file
@ -0,0 +1,226 @@
|
||||
<?xml version="1.0"?>
|
||||
<Envelope ovf:version="1.0" xml:lang="en-US" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:vbox="http://www.virtualbox.org/ovf/machine">
|
||||
<References>
|
||||
<File ovf:href="vagrant.vmdk" ovf:id="file1"/>
|
||||
</References>
|
||||
<DiskSection>
|
||||
<Info>List of the virtual disks used in the package</Info>
|
||||
<Disk ovf:capacity="10632560640" ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" vbox:uuid="e349f8b6-c400-4e7a-9825-598becab2f94"/>
|
||||
</DiskSection>
|
||||
<NetworkSection>
|
||||
<Info>Logical networks used in the package</Info>
|
||||
<Network ovf:name="NAT">
|
||||
<Description>Logical network used by this appliance.</Description>
|
||||
</Network>
|
||||
</NetworkSection>
|
||||
<VirtualSystem ovf:id="freebsd">
|
||||
<Info>A virtual machine</Info>
|
||||
<OperatingSystemSection ovf:id="78">
|
||||
<Info>The kind of installed guest operating system</Info>
|
||||
<Description>FreeBSD_64</Description>
|
||||
<vbox:OSType ovf:required="false">FreeBSD_64</vbox:OSType>
|
||||
</OperatingSystemSection>
|
||||
<VirtualHardwareSection>
|
||||
<Info>Virtual hardware requirements for a virtual machine</Info>
|
||||
<System>
|
||||
<vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
|
||||
<vssd:InstanceID>0</vssd:InstanceID>
|
||||
<vssd:VirtualSystemIdentifier>freebsd</vssd:VirtualSystemIdentifier>
|
||||
<vssd:VirtualSystemType>virtualbox-2.2</vssd:VirtualSystemType>
|
||||
</System>
|
||||
<Item>
|
||||
<rasd:Caption>1 virtual CPU</rasd:Caption>
|
||||
<rasd:Description>Number of virtual CPUs</rasd:Description>
|
||||
<rasd:ElementName>1 virtual CPU</rasd:ElementName>
|
||||
<rasd:InstanceID>1</rasd:InstanceID>
|
||||
<rasd:ResourceType>3</rasd:ResourceType>
|
||||
<rasd:VirtualQuantity>1</rasd:VirtualQuantity>
|
||||
</Item>
|
||||
<Item>
|
||||
<rasd:AllocationUnits>MegaBytes</rasd:AllocationUnits>
|
||||
<rasd:Caption>512 MB of memory</rasd:Caption>
|
||||
<rasd:Description>Memory Size</rasd:Description>
|
||||
<rasd:ElementName>512 MB of memory</rasd:ElementName>
|
||||
<rasd:InstanceID>2</rasd:InstanceID>
|
||||
<rasd:ResourceType>4</rasd:ResourceType>
|
||||
<rasd:VirtualQuantity>512</rasd:VirtualQuantity>
|
||||
</Item>
|
||||
<Item>
|
||||
<rasd:Address>0</rasd:Address>
|
||||
<rasd:Caption>ideController0</rasd:Caption>
|
||||
<rasd:Description>IDE Controller</rasd:Description>
|
||||
<rasd:ElementName>ideController0</rasd:ElementName>
|
||||
<rasd:InstanceID>3</rasd:InstanceID>
|
||||
<rasd:ResourceSubType>PIIX4</rasd:ResourceSubType>
|
||||
<rasd:ResourceType>5</rasd:ResourceType>
|
||||
</Item>
|
||||
<Item>
|
||||
<rasd:Address>1</rasd:Address>
|
||||
<rasd:Caption>ideController1</rasd:Caption>
|
||||
<rasd:Description>IDE Controller</rasd:Description>
|
||||
<rasd:ElementName>ideController1</rasd:ElementName>
|
||||
<rasd:InstanceID>4</rasd:InstanceID>
|
||||
<rasd:ResourceSubType>PIIX4</rasd:ResourceSubType>
|
||||
<rasd:ResourceType>5</rasd:ResourceType>
|
||||
</Item>
|
||||
<Item>
|
||||
<rasd:AddressOnParent>0</rasd:AddressOnParent>
|
||||
<rasd:Caption>disk1</rasd:Caption>
|
||||
<rasd:Description>Disk Image</rasd:Description>
|
||||
<rasd:ElementName>disk1</rasd:ElementName>
|
||||
<rasd:HostResource>/disk/vmdisk1</rasd:HostResource>
|
||||
<rasd:InstanceID>5</rasd:InstanceID>
|
||||
<rasd:Parent>3</rasd:Parent>
|
||||
<rasd:ResourceType>17</rasd:ResourceType>
|
||||
</Item>
|
||||
<Item>
|
||||
<rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
|
||||
<rasd:Caption>Ethernet adapter on 'NAT'</rasd:Caption>
|
||||
<rasd:Connection>NAT</rasd:Connection>
|
||||
<rasd:ElementName>Ethernet adapter on 'NAT'</rasd:ElementName>
|
||||
<rasd:InstanceID>6</rasd:InstanceID>
|
||||
<rasd:ResourceSubType>E1000</rasd:ResourceSubType>
|
||||
<rasd:ResourceType>10</rasd:ResourceType>
|
||||
</Item>
|
||||
</VirtualHardwareSection>
|
||||
<vbox:Machine ovf:required="false" version="1.12-macosx" uuid="{8b837be7-fa96-48fc-b119-e90cfa144456}" name="freebsd" OSType="FreeBSD_64" snapshotFolder="Snapshots" lastStateChange="2014-03-13T13:50:05Z">
|
||||
<ovf:Info>Complete VirtualBox machine configuration in VirtualBox format</ovf:Info>
|
||||
<ExtraData>
|
||||
<ExtraDataItem name="GUI/LastGuestSizeHint" value="720,400"/>
|
||||
<ExtraDataItem name="GUI/LastNormalWindowPosition" value="400,183,720,421"/>
|
||||
</ExtraData>
|
||||
<Hardware version="2">
|
||||
<CPU count="1" hotplug="false">
|
||||
<HardwareVirtEx enabled="true"/>
|
||||
<HardwareVirtExNestedPaging enabled="true"/>
|
||||
<HardwareVirtExVPID enabled="true"/>
|
||||
<HardwareVirtExUX enabled="true"/>
|
||||
<PAE enabled="true"/>
|
||||
<HardwareVirtExLargePages enabled="true"/>
|
||||
<HardwareVirtForce enabled="false"/>
|
||||
</CPU>
|
||||
<Memory RAMSize="512" PageFusion="false"/>
|
||||
<HID Pointing="PS2Mouse" Keyboard="PS2Keyboard"/>
|
||||
<HPET enabled="false"/>
|
||||
<Chipset type="PIIX3"/>
|
||||
<Boot>
|
||||
<Order position="1" device="HardDisk"/>
|
||||
<Order position="2" device="DVD"/>
|
||||
<Order position="3" device="None"/>
|
||||
<Order position="4" device="None"/>
|
||||
</Boot>
|
||||
<Display VRAMSize="8" monitorCount="1" accelerate3D="false" accelerate2DVideo="false"/>
|
||||
<VideoCapture/>
|
||||
<RemoteDisplay enabled="false" authType="Null"/>
|
||||
<BIOS>
|
||||
<ACPI enabled="true"/>
|
||||
<IOAPIC enabled="true"/>
|
||||
<Logo fadeIn="true" fadeOut="true" displayTime="0"/>
|
||||
<BootMenu mode="MessageAndMenu"/>
|
||||
<TimeOffset value="0"/>
|
||||
<PXEDebug enabled="false"/>
|
||||
</BIOS>
|
||||
<USBController enabled="false" enabledEhci="false"/>
|
||||
<Network>
|
||||
<Adapter slot="0" enabled="true" MACAddress="080027D14C66" cable="true" speed="0" type="82540EM">
|
||||
<DisabledModes/>
|
||||
<NAT>
|
||||
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
|
||||
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
|
||||
</NAT>
|
||||
</Adapter>
|
||||
<Adapter slot="1" enabled="false" MACAddress="080027058FF2" cable="true" speed="0" type="82540EM">
|
||||
<DisabledModes>
|
||||
<NAT>
|
||||
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
|
||||
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
|
||||
</NAT>
|
||||
</DisabledModes>
|
||||
</Adapter>
|
||||
<Adapter slot="2" enabled="false" MACAddress="08002763A181" cable="true" speed="0" type="82540EM">
|
||||
<DisabledModes>
|
||||
<NAT>
|
||||
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
|
||||
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
|
||||
</NAT>
|
||||
</DisabledModes>
|
||||
</Adapter>
|
||||
<Adapter slot="3" enabled="false" MACAddress="0800279C6D17" cable="true" speed="0" type="82540EM">
|
||||
<DisabledModes>
|
||||
<NAT>
|
||||
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
|
||||
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
|
||||
</NAT>
|
||||
</DisabledModes>
|
||||
</Adapter>
|
||||
<Adapter slot="4" enabled="false" MACAddress="08002760C885" cable="true" speed="0" type="82540EM">
|
||||
<DisabledModes>
|
||||
<NAT>
|
||||
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
|
||||
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
|
||||
</NAT>
|
||||
</DisabledModes>
|
||||
</Adapter>
|
||||
<Adapter slot="5" enabled="false" MACAddress="0800279ECE95" cable="true" speed="0" type="82540EM">
|
||||
<DisabledModes>
|
||||
<NAT>
|
||||
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
|
||||
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
|
||||
</NAT>
|
||||
</DisabledModes>
|
||||
</Adapter>
|
||||
<Adapter slot="6" enabled="false" MACAddress="08002730E8BE" cable="true" speed="0" type="82540EM">
|
||||
<DisabledModes>
|
||||
<NAT>
|
||||
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
|
||||
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
|
||||
</NAT>
|
||||
</DisabledModes>
|
||||
</Adapter>
|
||||
<Adapter slot="7" enabled="false" MACAddress="080027AD8EF8" cable="true" speed="0" type="82540EM">
|
||||
<DisabledModes>
|
||||
<NAT>
|
||||
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
|
||||
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
|
||||
</NAT>
|
||||
</DisabledModes>
|
||||
</Adapter>
|
||||
</Network>
|
||||
<UART>
|
||||
<Port slot="0" enabled="false" IOBase="0x3f8" IRQ="4" hostMode="Disconnected"/>
|
||||
<Port slot="1" enabled="false" IOBase="0x2f8" IRQ="3" hostMode="Disconnected"/>
|
||||
</UART>
|
||||
<LPT>
|
||||
<Port slot="0" enabled="false" IOBase="0x378" IRQ="7"/>
|
||||
<Port slot="1" enabled="false" IOBase="0x378" IRQ="7"/>
|
||||
</LPT>
|
||||
<AudioAdapter controller="AC97" driver="CoreAudio" enabled="false"/>
|
||||
<RTC localOrUTC="local"/>
|
||||
<SharedFolders/>
|
||||
<Clipboard mode="Disabled"/>
|
||||
<DragAndDrop mode="Disabled"/>
|
||||
<IO>
|
||||
<IoCache enabled="true" size="5"/>
|
||||
<BandwidthGroups/>
|
||||
</IO>
|
||||
<HostPci>
|
||||
<Devices/>
|
||||
</HostPci>
|
||||
<EmulatedUSB>
|
||||
<CardReader enabled="false"/>
|
||||
</EmulatedUSB>
|
||||
<Guest memoryBalloonSize="0"/>
|
||||
<GuestProperties>
|
||||
<GuestProperty name="/VirtualBox/HostInfo/GUI/LanguageID" value="en_US" timestamp="1394718154090069000" flags=""/>
|
||||
</GuestProperties>
|
||||
</Hardware>
|
||||
<StorageControllers>
|
||||
<StorageController name="IDE Controller" type="PIIX4" PortCount="2" useHostIOCache="true" Bootable="true">
|
||||
<AttachedDevice type="HardDisk" port="0" device="0">
|
||||
<Image uuid="{e349f8b6-c400-4e7a-9825-598becab2f94}"/>
|
||||
</AttachedDevice>
|
||||
</StorageController>
|
||||
</StorageControllers>
|
||||
</vbox:Machine>
|
||||
</VirtualSystem>
|
||||
</Envelope>
|
@ -112,10 +112,6 @@ arm_install_base() {
|
||||
>> ${CHROOTDIR}/${DESTDIR}/etc/fstab
|
||||
echo "md /tmp mfs rw,noatime,-s30m 0 0" \
|
||||
>> ${CHROOTDIR}/${DESTDIR}/etc/fstab
|
||||
echo "md /var/log mfs rw,noatime,-s15m 0 0" \
|
||||
>> ${CHROOTDIR}/${DESTDIR}/etc/fstab
|
||||
echo "md /var/tmp mfs rw,noatime,-s12m 0 0" \
|
||||
>> ${CHROOTDIR}/${DESTDIR}/etc/fstab
|
||||
|
||||
local hostname
|
||||
hostname="$(echo ${KERNEL} | tr '[:upper:]' '[:lower:]')"
|
||||
|
18
release/tools/vagrant-virtualbox.conf
Normal file
18
release/tools/vagrant-virtualbox.conf
Normal file
@ -0,0 +1,18 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
. ${WORLDDIR}/release/tools/vagrant.conf
|
||||
|
||||
export VM_EXTRA_PACKAGES="${VM_EXTRA_PACKAGES} virtualbox-ose-additions"
|
||||
|
||||
vm_extra_pre_umount () {
|
||||
# VirtualBox first boot pkgs
|
||||
echo 'firstboot_pkgs_list="sudo rsync virtualbox-ose-additions"' >> ${DESTDIR}/etc/rc.conf
|
||||
echo 'vboxguest_enable="YES"' >> ${DESTDIR}/etc/rc.conf
|
||||
echo 'vboxservice_enable="YES"' >> ${DESTDIR}/etc/rc.conf
|
||||
|
||||
# Setup the Vagrant common items
|
||||
vagrant_common
|
||||
}
|
22
release/tools/vagrant-vmware.conf
Normal file
22
release/tools/vagrant-vmware.conf
Normal file
@ -0,0 +1,22 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
. ${WORLDDIR}/release/tools/vagrant.conf
|
||||
|
||||
export VM_EXTRA_PACKAGES="${VM_EXTRA_PACKAGES} open-vm-tools-nox11"
|
||||
|
||||
vm_extra_pre_umount () {
|
||||
# VMWare first boot pkgs
|
||||
echo 'firstboot_pkgs_list="sudo rsync open-vm-tools-nox11"' >> ${DESTDIR}/etc/rc.conf
|
||||
|
||||
echo 'vmware_guest_vmblock_enable="YES"' >> ${DESTDIR}/etc/rc.conf
|
||||
echo 'vmware_guest_vmhgfs_enable="YES"' >> ${DESTDIR}/etc/rc.conf
|
||||
echo 'vmware_guest_vmmemctl_enable="YES"' >> ${DESTDIR}/etc/rc.conf
|
||||
echo 'vmware_guest_vmxnet_enable="YES"' >> ${DESTDIR}/etc/rc.conf
|
||||
echo 'vmware_guestd_enable="YES"' >> ${DESTDIR}/etc/rc.conf
|
||||
|
||||
# Setup the Vagrant common items
|
||||
vagrant_common
|
||||
}
|
@ -10,18 +10,15 @@ export VM_EXTRA_PACKAGES="firstboot-freebsd-update firstboot-pkgs"
|
||||
# Set to a list of third-party software to enable in rc.conf(5).
|
||||
export VM_RC_LIST="firstboot_freebsd_update firstboot_pkgs"
|
||||
|
||||
vm_extra_pre_umount() {
|
||||
vagrant_common () {
|
||||
# The firstboot_pkgs rc.d script will download the repository
|
||||
# catalogue and install or update pkg when the instance first
|
||||
# launches, so these files would just be replaced anyway; removing
|
||||
# them from the image allows it to boot faster.
|
||||
env ASSUME_ALWAYS_YES=yes pkg -c ${DESTDIR} clean -y -a
|
||||
env ASSUME_ALWAYS_YES=yes pkg -c ${DESTDIR} delete -f -y pkg
|
||||
rm ${DESTDIR}/var/db/pkg/repo-*.sqlite
|
||||
|
||||
# The size of the EC2 root disk can be configured at instance launch
|
||||
# time; expand our filesystem to fill the disk.
|
||||
echo 'growfs_enable="YES"' >> ${DESTDIR}/etc/rc.conf
|
||||
|
||||
# Vagrant instances use DHCP to get their network configuration.
|
||||
echo 'ifconfig_DEFAULT="SYNCDHCP"' >> ${DESTDIR}/etc/rc.conf
|
||||
|
||||
@ -36,9 +33,6 @@ vm_extra_pre_umount() {
|
||||
echo 'sendmail_outbound_enable="NO"' >> ${DESTDIR}/etc/rc.conf
|
||||
echo 'sendmail_msp_queue_enable="NO"' >> ${DESTDIR}/etc/rc.conf
|
||||
|
||||
# sudo is required
|
||||
echo 'firstboot_pkgs_list="sudo rsync"' >> ${DESTDIR}/etc/rc.conf
|
||||
|
||||
# Create the vagrant user with a password of vagrant
|
||||
/usr/sbin/pw -R ${DESTDIR} \
|
||||
groupadd vagrant -g 1001
|
||||
|
@ -41,7 +41,7 @@
|
||||
.\" ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
.\" SOFTWARE.
|
||||
.\"
|
||||
.Dd May 13, 2015
|
||||
.Dd July 11, 2015
|
||||
.Dt DEVD.CONF 5
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -332,10 +332,34 @@ Battery events.
|
||||
Lid state ($notify=0x00 is closed, 0x01 is open).
|
||||
.It Li PROCESSOR
|
||||
Processor state/configuration ($notify=0x81 is a change in available Cx states).
|
||||
.It Li Resume
|
||||
Resume notification.
|
||||
.It Li Suspend
|
||||
Suspend notification.
|
||||
.It Li Thermal
|
||||
Thermal zone events.
|
||||
.El
|
||||
.Pp
|
||||
.It Li CARP
|
||||
Events related to the
|
||||
.Xr carp 8
|
||||
protocol.
|
||||
.Bl -tag -width ".Sy Subsystem" -compact
|
||||
.It Sy Subsystem
|
||||
.It Ar vhid@interface
|
||||
The
|
||||
.Dq subsystem
|
||||
contains the actual CARP vhid and the name of the network interface
|
||||
on which the event took place.
|
||||
.Bl -tag -width ".Li MASTER" -compact
|
||||
.It Sy Type
|
||||
.It Li MASTER
|
||||
Node become the master for a virtual host.
|
||||
.It Li BACKUP
|
||||
Node become the backup for a virtual host.
|
||||
.El
|
||||
.El
|
||||
.Pp
|
||||
.It Li IFNET
|
||||
Events related to the network subsystem.
|
||||
.Bl -tag -width ".Sy Subsystem" -compact
|
||||
|
@ -24,7 +24,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd June 11, 2015
|
||||
.Dd July 18, 2015
|
||||
.Dt GMULTIPATH 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -107,10 +107,10 @@ When using the
|
||||
.Dq manual
|
||||
method, no metadata are stored on the devices, so the multipath
|
||||
device has to be configured by hand every time it is needed.
|
||||
Additional device paths also won't be detected automatically.
|
||||
Additional device paths also will not be detected automatically.
|
||||
The
|
||||
.Dq automatic
|
||||
method uses on-disk metadata to detect device and all it's paths.
|
||||
method uses on-disk metadata to detect device and all its paths.
|
||||
Metadata use the last sector of the underlying disk device and
|
||||
include device name and UUID.
|
||||
The UUID guarantees uniqueness in a shared storage environment
|
||||
@ -350,6 +350,14 @@ GEOM_MULTIPATH: da0 added to FRED
|
||||
GEOM_MULTIPATH: da0 is now active path in FRED
|
||||
GEOM_MULTIPATH: da2 added to FRED
|
||||
.Ed
|
||||
.Pp
|
||||
To load the
|
||||
.Nm
|
||||
module at boot time, add this entry to
|
||||
.Pa /boot/loader.conf :
|
||||
.Bd -literal -offset ident
|
||||
geom_multipath_load="YES"
|
||||
.Ed
|
||||
.Sh SEE ALSO
|
||||
.Xr geom 4 ,
|
||||
.Xr isp 4 ,
|
||||
|
@ -1106,14 +1106,11 @@ gpart_write_partcode(struct ggeom *gp, int idx, void *code, ssize_t size)
|
||||
|
||||
if (pp != NULL) {
|
||||
snprintf(dsf, sizeof(dsf), "/dev/%s", pp->lg_name);
|
||||
if (pp->lg_mediasize < size)
|
||||
errx(EXIT_FAILURE, "%s: not enough space", dsf);
|
||||
fd = open(dsf, O_WRONLY);
|
||||
if (fd == -1)
|
||||
err(EXIT_FAILURE, "%s", dsf);
|
||||
if (lseek(fd, size, SEEK_SET) != size)
|
||||
errx(EXIT_FAILURE, "%s: not enough space", dsf);
|
||||
if (lseek(fd, 0, SEEK_SET) != 0)
|
||||
err(EXIT_FAILURE, "%s", dsf);
|
||||
|
||||
/*
|
||||
* When writing to a disk device, the write must be
|
||||
* sector aligned and not write to any partial sectors,
|
||||
@ -1152,11 +1149,11 @@ gpart_write_partcode_vtoc8(struct ggeom *gp, int idx, void *code)
|
||||
if (pp->lg_sectorsize != sizeof(struct vtoc8))
|
||||
errx(EXIT_FAILURE, "%s: unexpected sector "
|
||||
"size (%d)\n", dsf, pp->lg_sectorsize);
|
||||
if (pp->lg_mediasize < VTOC_BOOTSIZE)
|
||||
continue;
|
||||
fd = open(dsf, O_WRONLY);
|
||||
if (fd == -1)
|
||||
err(EXIT_FAILURE, "%s", dsf);
|
||||
if (lseek(fd, VTOC_BOOTSIZE, SEEK_SET) != VTOC_BOOTSIZE)
|
||||
continue;
|
||||
/*
|
||||
* We ignore the first VTOC_BOOTSIZE bytes of boot code in
|
||||
* order to avoid overwriting the label.
|
||||
|
@ -24,7 +24,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd May 5, 2015
|
||||
.Dd July 14, 2015
|
||||
.Dt GPART 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -933,6 +933,12 @@ start-up script.
|
||||
See
|
||||
.Xr gptboot 8
|
||||
for more details.
|
||||
.It Cm lenovofix
|
||||
Setting this attribute overwrites the Protective MBR with a new one where
|
||||
the 0xee partition is the second, rather than the first record.
|
||||
This resolves a BIOS compatibility issue with some Lenovo models including the
|
||||
X220, T420, and T520, allowing them to boot from GPT partitioned disks
|
||||
without using EFI.
|
||||
.El
|
||||
.Pp
|
||||
The scheme-specific attributes for MBR:
|
||||
|
@ -24,7 +24,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd April 2, 2015
|
||||
.Dd July 14, 2015
|
||||
.Dt GGATEC 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -71,8 +71,8 @@ utility is a network client for the GEOM Gate class.
|
||||
It is responsible for the creation of
|
||||
.Nm ggate
|
||||
devices and forwarding I/O requests between the
|
||||
.Nm geom_gate.ko
|
||||
kernel module and the
|
||||
.Nm GEOM Gate
|
||||
kernel subsystem and the
|
||||
.Xr ggated 8
|
||||
network daemon.
|
||||
Available commands:
|
||||
@ -111,7 +111,7 @@ Do not use
|
||||
.Dv TCP_NODELAY
|
||||
option on TCP sockets.
|
||||
.It Fl o Cm ro | wo | rw
|
||||
Specify permission to use when opening the file or device: read-only
|
||||
Specify permissions to use when opening the file or device: read-only
|
||||
.Pq Cm ro ,
|
||||
write-only
|
||||
.Pq Cm wo ,
|
||||
@ -136,7 +136,7 @@ Default is 131072 (128kB).
|
||||
Sector size for
|
||||
.Nm ggate
|
||||
provider.
|
||||
If not specified, it is taken from device, or set to 512 bytes for files.
|
||||
If not specified, it is taken from the device, or set to 512 bytes for files.
|
||||
.It Fl t Ar timeout
|
||||
Number of seconds to wait before an I/O request will be canceled.
|
||||
Default is 0, which means no timeout.
|
||||
|
@ -447,6 +447,7 @@ g_gatec_create(void)
|
||||
/*
|
||||
* Ok, got both sockets, time to create provider.
|
||||
*/
|
||||
memset(&ggioc, 0, sizeof(ggioc));
|
||||
ggioc.gctl_version = G_GATE_VERSION;
|
||||
ggioc.gctl_mediasize = mediasize;
|
||||
ggioc.gctl_sectorsize = sectorsize;
|
||||
|
@ -24,7 +24,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd April 29, 2004
|
||||
.Dd July 14, 2015
|
||||
.Dt GGATED 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -43,14 +43,14 @@
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
utility is a network server for GEOM Gate class.
|
||||
utility is a network server for the GEOM Gate class.
|
||||
It runs on a server machine to service GEOM Gate requests from workers
|
||||
placed on a client machine.
|
||||
Keep in mind, that connection between
|
||||
Keep in mind, that connections between
|
||||
.Xr ggatec 8
|
||||
and
|
||||
.Nm
|
||||
is not encrypted.
|
||||
are not encrypted.
|
||||
.Pp
|
||||
Available options:
|
||||
.Bl -tag -width ".Ar exports\ file"
|
||||
@ -65,7 +65,7 @@ option on TCP sockets.
|
||||
.It Fl p Ar port
|
||||
Port on which
|
||||
.Nm
|
||||
listens for connection.
|
||||
listens for connections.
|
||||
Default is 3080.
|
||||
.It Fl R Ar rcvbuf
|
||||
Size of receive buffer to use.
|
||||
@ -74,7 +74,7 @@ Default is 131072 (128kB).
|
||||
Size of send buffer to use.
|
||||
Default is 131072 (128kB).
|
||||
.It Fl v
|
||||
Do not fork, run in foreground and print debug informations on standard
|
||||
Do not fork, run in foreground and print debug information on standard
|
||||
output.
|
||||
.It Ar "exports file"
|
||||
An alternate location for the exports file.
|
||||
|
@ -906,8 +906,8 @@ handshake(struct sockaddr *from, int sfd)
|
||||
|
||||
ex = exports_find(from, &cinit, conn);
|
||||
if (ex == NULL) {
|
||||
connection_remove(conn);
|
||||
sendfail(sfd, errno, NULL);
|
||||
connection_remove(conn);
|
||||
return (0);
|
||||
}
|
||||
if (conn->c_mediasize == 0) {
|
||||
|
@ -24,7 +24,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd April 9, 2015
|
||||
.Dd July 14, 2015
|
||||
.Dt GGATEL 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -62,7 +62,7 @@ It can be used as a replacement for
|
||||
devices or as a
|
||||
.Dq GEOMificator
|
||||
for non GEOM-aware devices, but it was mainly created as an example
|
||||
on how to use and how to communicate with the GEOM Gate kernel module.
|
||||
on how to use and how to communicate with the GEOM Gate kernel subsystem.
|
||||
.Pp
|
||||
Available commands:
|
||||
.Bl -tag -width ".Cm destroy"
|
||||
@ -82,7 +82,8 @@ providers.
|
||||
Take over a previously created provider and handle pending and future
|
||||
requests. This is useful if the initial
|
||||
.Nm
|
||||
process died. To prevent data loss, the given path must lead to the
|
||||
process died.
|
||||
To prevent data loss, the given path must lead to the
|
||||
regular file or device that was used to create the provider.
|
||||
.El
|
||||
.Pp
|
||||
@ -93,7 +94,7 @@ Forcibly destroy
|
||||
.Nm ggate
|
||||
provider (cancels all pending requests).
|
||||
.It Fl o Cm ro | wo | rw
|
||||
Specify permission to use when opening the file or device: read-only
|
||||
Specify permissions to use when opening the file or device: read-only
|
||||
.Pq Cm ro ,
|
||||
write-only
|
||||
.Pq Cm wo ,
|
||||
@ -105,7 +106,7 @@ Default is
|
||||
Sector size for
|
||||
.Nm ggate
|
||||
provider.
|
||||
If not specified, it is taken from device, or set to 512 bytes for files.
|
||||
If not specified, it is taken from the device, or set to 512 bytes for files.
|
||||
.It Fl t Ar timeout
|
||||
Number of seconds to wait before an I/O request will be canceled.
|
||||
0 means no timeout.
|
||||
@ -131,7 +132,7 @@ the
|
||||
.Dq Li fd0
|
||||
device and use
|
||||
.Xr gbde 8
|
||||
to encrypt data on a floppy.
|
||||
to encrypt data on a floppy disk.
|
||||
.Bd -literal -offset indent
|
||||
ggatel create -u 5 /dev/fd0
|
||||
gbde init /dev/ggate5
|
||||
|
@ -173,6 +173,7 @@ g_gatel_create(void)
|
||||
fd = open(path, g_gate_openflags(flags) | O_DIRECT | O_FSYNC);
|
||||
if (fd == -1)
|
||||
err(EXIT_FAILURE, "Cannot open %s", path);
|
||||
memset(&ggioc, 0, sizeof(ggioc));
|
||||
ggioc.gctl_version = G_GATE_VERSION;
|
||||
ggioc.gctl_unit = unit;
|
||||
ggioc.gctl_mediasize = g_gate_mediasize(fd);
|
||||
|
@ -28,7 +28,7 @@
|
||||
.\" @(#)newfs.8 8.6 (Berkeley) 5/3/95
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd October 1, 2013
|
||||
.Dd July 15, 2015
|
||||
.Dt NEWFS 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -152,7 +152,7 @@ The expected average number of files per directory on the file system.
|
||||
.It Fl i Ar bytes
|
||||
Specify the density of inodes in the file system.
|
||||
The default is to create an inode for every
|
||||
.Pq 4 * Ar frag-size
|
||||
.Pq 2 * Ar frag-size
|
||||
bytes of data space.
|
||||
If fewer inodes are desired, a larger number should be used;
|
||||
to create more inodes a smaller number should be given.
|
||||
@ -173,7 +173,7 @@ Clustering the metadata blocks speeds up random file access
|
||||
and decreases the running time of
|
||||
.Xr fsck 8 .
|
||||
By default
|
||||
.Xr newfs 8
|
||||
.Nm
|
||||
sets it to half of the space reserved to minfree.
|
||||
.It Fl l
|
||||
Enable multilabel MAC on the new file system.
|
||||
@ -228,7 +228,7 @@ for more details on how to set this option.
|
||||
The partition name (a..h) you want to use in case the underlying image
|
||||
is a file, so you do not have access to individual partitions through the
|
||||
filesystem.
|
||||
Can also be used with a device, e.g.
|
||||
Can also be used with a device, e.g.,
|
||||
.Nm
|
||||
.Fl p Ar f
|
||||
.Ar /dev/da1s3
|
||||
|
@ -1924,7 +1924,7 @@ pfctl_test_altqsupport(int dev, int opts)
|
||||
|
||||
if (ioctl(dev, DIOCGETALTQS, &pa)) {
|
||||
if (errno == ENODEV) {
|
||||
if (!(opts & PF_OPT_QUIET))
|
||||
if (opts & PF_OPT_VERBOSE)
|
||||
fprintf(stderr, "No ALTQ support in kernel\n"
|
||||
"ALTQ related functions disabled\n");
|
||||
return (0);
|
||||
|
@ -364,6 +364,7 @@ MAN= aac.4 \
|
||||
nsp.4 \
|
||||
${_ntb.4} \
|
||||
null.4 \
|
||||
numa.4 \
|
||||
${_nvd.4} \
|
||||
${_nvme.4} \
|
||||
${_nvram.4} \
|
||||
|
@ -23,7 +23,7 @@
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.Dd July 3, 2015
|
||||
.Dd July 11, 2015
|
||||
.Dt CTL 4
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -100,11 +100,14 @@ Defaults to 1.
|
||||
The number of outstanding commands to advertise to the iSCSI initiator.
|
||||
Technically, it is the difference between ExpCmdSN and MaxCmdSN fields
|
||||
in the iSCSI PDU.
|
||||
Defaults to 256.
|
||||
.It Va kern.cam.ctl.iscsi.ping_timeout
|
||||
The number of seconds to wait for the iSCSI initiator to respond to a NOP-In
|
||||
PDU.
|
||||
In the event that there is no response within that time the session gets
|
||||
forcibly terminated.
|
||||
Set to 0 to disable sending NOP-In PDUs.
|
||||
Defaults to 5.
|
||||
.Sh SEE ALSO
|
||||
.Xr ctladm 8 ,
|
||||
.Xr ctld 8 ,
|
||||
|
@ -23,7 +23,7 @@
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.Dd June 20, 2015
|
||||
.Dd July 11, 2015
|
||||
.Dt ISCSI 4
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -77,20 +77,25 @@ The number of seconds to wait for the target to respond to a NOP-Out
|
||||
PDU.
|
||||
In the event that there is no response within that time the session gets
|
||||
forcibly restarted.
|
||||
Set to 0 to disable sending NOP-Out PDUs.
|
||||
Defaults to 5.
|
||||
.It Va kern.iscsi.iscsid_timeout
|
||||
The number of seconds to wait for
|
||||
.Xr ctld 8
|
||||
.Xr iscsid 8
|
||||
to establish a session.
|
||||
After that time
|
||||
.Nm
|
||||
will abort and retry.
|
||||
Defaults to 60.
|
||||
.It Va kern.iscsi.login_timeout
|
||||
The number of seconds to wait for a login attempt to succeed.
|
||||
After that time
|
||||
.Nm
|
||||
will abort and retry.
|
||||
Defaults to 60.
|
||||
.It Va kern.iscsi.maxtags
|
||||
The maximum number of outstanding IO requests.
|
||||
Defaults to 255.
|
||||
.It Va kern.iscsi.fail_on_disconnection
|
||||
Controls the behavior after an iSCSI connection has been dropped due to
|
||||
network problems.
|
||||
|
172
share/man/man4/numa.4
Normal file
172
share/man/man4/numa.4
Normal file
@ -0,0 +1,172 @@
|
||||
.\" Copyright (c) 2015 Adrian Chadd <adrian@FreeBSD.org>
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd May 10, 2015
|
||||
.Dt NUMA 4
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm NUMA
|
||||
.Nd Non-Uniform Memory Access
|
||||
.Sh SYNOPSIS
|
||||
.Cd options SMP
|
||||
.Cd options MAXMEMDOM=16
|
||||
.Pp
|
||||
.In sys/numa.h
|
||||
.In sys/cpuset.h
|
||||
.In sys/bus.h
|
||||
.Sh DESCRIPTION
|
||||
Non-Uniform Memory Access is a computer architecture design which
|
||||
involves unequal costs between processors, memory and IO devices
|
||||
in a given system.
|
||||
.Pp
|
||||
In a
|
||||
.Nm
|
||||
architecture, the latency to access specific memory or IO devices
|
||||
depends upon which processor the memory or device is attached to.
|
||||
Accessing memory local to a processor is faster than accessing memory
|
||||
that is connected to one of the other processors.
|
||||
.Pp
|
||||
.Nm
|
||||
is enabled when the
|
||||
.Cd MAXMEMDOM
|
||||
option is used in a kernel configuration
|
||||
file and is set to a value greater than 1.
|
||||
.Pp
|
||||
Thread and process
|
||||
.Nm
|
||||
policies are controlled with the
|
||||
.Xr numa_setaffinity 2
|
||||
and
|
||||
.Xr numa_getaffinity 2
|
||||
syscalls.
|
||||
.Pp
|
||||
The
|
||||
.Xr numactl 1
|
||||
tool is available for starting processes with a non-default
|
||||
policy, or to change the policy of an existing thread or process.
|
||||
.Pp
|
||||
Systems with non-uniform access to I/O devices may mark those devices
|
||||
with the local VM domain identifier.
|
||||
Drivers can find out their local domain information by calling
|
||||
.Xr bus_get_domain 9 .
|
||||
.Ss MIB Variables
|
||||
The operation of
|
||||
.Nm
|
||||
is controlled and exposes information with these
|
||||
.Xr sysctl 8
|
||||
MIB variables:
|
||||
.Pp
|
||||
.Bl -tag -width indent -compact
|
||||
.It Va vm.ndomains
|
||||
The number of VM domains which have been detected.
|
||||
.Pp
|
||||
.It Va vm.default_policy
|
||||
The default VM domain allocation policy.
|
||||
Defaults to "first-touch-rr".
|
||||
The valid values are "first-touch", "first-touch-rr",
|
||||
"rr", where "rr" is a short-hand for "round-robin."
|
||||
See
|
||||
.Xr numa_setaffinity 2
|
||||
for more information about the available policies.
|
||||
.Pp
|
||||
.It Va vm.phys_locality
|
||||
A table indicating the relative cost of each VM domain to each other.
|
||||
A value of 10 indicates equal cost.
|
||||
A value of -1 means the locality map is not available or no
|
||||
locality information is available.
|
||||
.Pp
|
||||
.It Va vm.phys_segs
|
||||
The map of physical memory, grouped by VM domain.
|
||||
.El
|
||||
.Sh IMPLEMENTATION NOTES
|
||||
The current
|
||||
.Nm
|
||||
implementation is VM-focused.
|
||||
The hardware
|
||||
.Nm
|
||||
domains are mapped into a contiguous, non-sparse
|
||||
VM domain space, starting from 0.
|
||||
Thus, VM domain information (for example, the domain identifier) is not
|
||||
necessarily the same as is found in the hardware specific information.
|
||||
.Pp
|
||||
The
|
||||
.Nm
|
||||
allocation policies are implemented as a policy and iterator in
|
||||
.Pa sys/vm/vm_domain.c
|
||||
and
|
||||
.Pa sys/vm/vm_domain.h .
|
||||
Policy information is available in both struct thread and struct proc.
|
||||
Processes inherit
|
||||
.Nm
|
||||
policy from parent processes and threads inherit
|
||||
.Nm
|
||||
policy from parent threads.
|
||||
Note that threads do not explicitly inherit their
|
||||
.Nm
|
||||
policy from processes.
|
||||
Instead, if no thread policy is set, the system
|
||||
will fall back to the process policy.
|
||||
.Pp
|
||||
For now,
|
||||
.Nm
|
||||
domain policies only influence physical page allocation in
|
||||
.Pa sys/vm/vm_phys.c .
|
||||
This is useful for userland memory allocation, but not for kernel
|
||||
and driver memory allocation.
|
||||
These features will be implemented in future work.
|
||||
.Sh SEE ALSO
|
||||
.Xr numactl 1 ,
|
||||
.Xr numa_getaffinity 2 ,
|
||||
.Xr numa_setaffinity 2 ,
|
||||
.Xr bus_get_domain 9
|
||||
.Sh HISTORY
|
||||
.Nm
|
||||
first appeared in
|
||||
.Fx 9.0
|
||||
as a first-touch allocation policy with a fail-over to round-robin allocation
|
||||
and was not configurable.
|
||||
It was then modified in
|
||||
.Fx 10.0
|
||||
to implement a round-robin allocation policy and was also not configurable.
|
||||
.Pp
|
||||
The
|
||||
.Xr numa_getaffinity 2
|
||||
and
|
||||
.Xr numa_setaffinity 2
|
||||
syscalls first appeared in
|
||||
.Fx 11.0 .
|
||||
.Pp
|
||||
The
|
||||
.Xr numactl 1
|
||||
tool first appeared in
|
||||
.Fx 11.0 .
|
||||
.Sh AUTHORS
|
||||
This manual page written by
|
||||
.An Adrian Chadd Aq Mt adrian@FreeBSD.org .
|
||||
.Sh NOTES
|
||||
No statistics are kept to indicate how often
|
||||
.Nm
|
||||
allocation policies succeed or fail.
|
@ -25,7 +25,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd July 3, 2015
|
||||
.Dd July 19, 2015
|
||||
.Dt PROTO 4
|
||||
.Os
|
||||
.\"
|
||||
@ -47,6 +47,12 @@ module at boot time, place the following line in
|
||||
.Bd -literal -offset indent
|
||||
proto_load="YES"
|
||||
.Ed
|
||||
.Pp
|
||||
To have the driver attach to a device instead of its regular driver,
|
||||
mention it in the list of devices assigned to the following loader variable:
|
||||
.Bd -ragged -offset indent
|
||||
hw.proto.attach="desc[,desc]"
|
||||
.Ed
|
||||
.\"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
|
@ -62,7 +62,7 @@ This sysctl will not return
|
||||
random bytes unless
|
||||
the
|
||||
.Xr random 4
|
||||
is seeded.
|
||||
device is seeded.
|
||||
.Pp
|
||||
This initial seeding
|
||||
of random number generators
|
||||
|
@ -1281,6 +1281,7 @@ MLINKS+=psignal.9 gsignal.9 \
|
||||
MLINKS+=random.9 arc4rand.9 \
|
||||
random.9 arc4random.9 \
|
||||
random.9 read_random.9 \
|
||||
random.9 read_random_uio.9 \
|
||||
random.9 srandom.9
|
||||
MLINKS+=refcount.9 refcount_acquire.9 \
|
||||
refcount.9 refcount_init.9 \
|
||||
|
@ -17,7 +17,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd July 8, 2015
|
||||
.Dd July 10, 2015
|
||||
.Dt CRYPTO 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -40,6 +40,8 @@
|
||||
.Ft void
|
||||
.Fn crypto_kdone "struct cryptkop *"
|
||||
.Ft int
|
||||
.Fn crypto_find_driver "const char *"
|
||||
.Ft int
|
||||
.Fn crypto_newsession "uint64_t *" "struct cryptoini *" int
|
||||
.Ft int
|
||||
.Fn crypto_freesession uint64_t
|
||||
@ -157,15 +159,28 @@ was a fatal error in verifying the arguments).
|
||||
For session initialization and teardown there is no callback mechanism used.
|
||||
.Pp
|
||||
The
|
||||
.Fn crypto_find_driver
|
||||
function may be called to return the specific id of the provided name.
|
||||
If the specified driver could not be found, the returned id is -1.
|
||||
.Pp
|
||||
The
|
||||
.Fn crypto_newsession
|
||||
routine is called by consumers of cryptographic services (such as the
|
||||
.Xr ipsec 4
|
||||
stack) that wish to establish a new session with the framework.
|
||||
On success, the first argument will contain the Session Identifier (SID).
|
||||
The second argument contains all the necessary information for
|
||||
the driver to establish the session.
|
||||
The third argument indicates whether a
|
||||
hardware driver (1) should be used or not (0).
|
||||
The third argument is either a specific driver id, or one or both
|
||||
of
|
||||
.Dv CRYPTOCAP_F_HARDWARE ,
|
||||
to select hardware devices,
|
||||
or
|
||||
.Dv CRYPTOCAP_F_SOFTWARE ,
|
||||
to select software devices.
|
||||
If both are specified, a hardware device will be returned
|
||||
before a software device will be.
|
||||
On success, the value pointed to by the first argument will be the
|
||||
Session IDentifier (SID).
|
||||
The various fields in the
|
||||
.Vt cryptoini
|
||||
structure are:
|
||||
|
@ -66,7 +66,7 @@
|
||||
.Ft int
|
||||
.Fn nvlist_error "const nvlist_t *nvl"
|
||||
.Ft void
|
||||
.Fn nvlist_set_error "nvlist_t *nvl, int error"
|
||||
.Fn nvlist_set_error "nvlist_t *nvl" "int error"
|
||||
.Ft bool
|
||||
.Fn nvlist_empty "const nvlist_t *nvl"
|
||||
.Ft int
|
||||
@ -76,9 +76,9 @@
|
||||
.Fn nvlist_clone "const nvlist_t *nvl"
|
||||
.\"
|
||||
.Ft void
|
||||
.Fn nvlist_dump "const nvlist_t *nvl, int fd"
|
||||
.Fn nvlist_dump "const nvlist_t *nvl" "int fd"
|
||||
.Ft void
|
||||
.Fn nvlist_fdump "const nvlist_t *nvl, FILE *fp"
|
||||
.Fn nvlist_fdump "const nvlist_t *nvl" "FILE *fp"
|
||||
.\"
|
||||
.Ft size_t
|
||||
.Fn nvlist_size "const nvlist_t *nvl"
|
||||
|
@ -26,7 +26,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\" "
|
||||
.Dd June 30, 2015
|
||||
.Dd July 16, 2015
|
||||
.Dt RANDOM 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -34,6 +34,7 @@
|
||||
.Nm arc4random ,
|
||||
.Nm random ,
|
||||
.Nm read_random ,
|
||||
.Nm read_random_uio ,
|
||||
.Nm srandom
|
||||
.Nd supply pseudo-random numbers
|
||||
.Sh SYNOPSIS
|
||||
@ -50,6 +51,8 @@
|
||||
.In sys/random.h
|
||||
.Ft int
|
||||
.Fn read_random "void *buffer" "int count"
|
||||
.Ft int
|
||||
.Fn read_random_uio "struct uio *uio" "bool nonblock"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Fn random
|
||||
@ -117,11 +120,27 @@ necessary to know
|
||||
that no entropy
|
||||
has been returned.
|
||||
.Pp
|
||||
The
|
||||
.Fn read_random_uio
|
||||
function behaves identically to
|
||||
.Xr read 2
|
||||
on
|
||||
.Pa /dev/random .
|
||||
The
|
||||
.Fa uio
|
||||
argument points to a buffer where random data should be stored.
|
||||
This function only returns data if the random device is seeded.
|
||||
It blocks if unseeded,
|
||||
except when the
|
||||
.Fa nonblock
|
||||
argument is true.
|
||||
.Pp
|
||||
All the bits returned by
|
||||
.Fn random ,
|
||||
.Fn arc4rand
|
||||
.Fn arc4rand ,
|
||||
.Fn read_random ,
|
||||
and
|
||||
.Fn read_random
|
||||
.Fn read_random_uio
|
||||
are usable.
|
||||
For example,
|
||||
.Sq Li random()&01
|
||||
@ -168,6 +187,22 @@ The
|
||||
function returns
|
||||
the number of bytes placed in
|
||||
.Fa buffer .
|
||||
.Pp
|
||||
.Fn read_random_uio
|
||||
returns zero when successful,
|
||||
otherwise an error code is returned.
|
||||
.Sh ERRORS
|
||||
.Fn read_random_uio
|
||||
may fail if:
|
||||
.Bl -tag -width Er
|
||||
.It Bq Er EFAULT
|
||||
.Fa uio
|
||||
points to an invalid memory region.
|
||||
.It Bq Er EWOULDBLOCK
|
||||
The random device is unseeded and
|
||||
.Fa nonblock
|
||||
is true.
|
||||
.El
|
||||
.Sh AUTHORS
|
||||
.An Dan Moschuk
|
||||
wrote
|
||||
|
@ -25,7 +25,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd June 30, 2015
|
||||
.Dd July 13, 2015
|
||||
.Dt RANDOM_HARVEST 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -96,7 +96,7 @@ from harvesting,
|
||||
as they are high-rate
|
||||
sources.
|
||||
Some entropy is sacrificed,
|
||||
but the hig rate of supply
|
||||
but the high rate of supply
|
||||
will compensate for this.
|
||||
.Pp
|
||||
The
|
||||
@ -121,7 +121,7 @@ and pass this in
|
||||
.Fa bits .
|
||||
.Pp
|
||||
Interrupt harvesting has been
|
||||
in part simplified simplified
|
||||
in part simplified
|
||||
for the kernel programmer.
|
||||
If a device driver registers an interrupt handler
|
||||
with
|
||||
|
@ -52,17 +52,8 @@ __FBSDID("$FreeBSD$");
|
||||
#include <ddb/db_sym.h>
|
||||
#include <ddb/db_variables.h>
|
||||
|
||||
static db_varfcn_t db_dr0;
|
||||
static db_varfcn_t db_dr1;
|
||||
static db_varfcn_t db_dr2;
|
||||
static db_varfcn_t db_dr3;
|
||||
static db_varfcn_t db_dr4;
|
||||
static db_varfcn_t db_dr5;
|
||||
static db_varfcn_t db_dr6;
|
||||
static db_varfcn_t db_dr7;
|
||||
static db_varfcn_t db_frame;
|
||||
static db_varfcn_t db_rsp;
|
||||
static db_varfcn_t db_ss;
|
||||
static db_varfcn_t db_frame_seg;
|
||||
|
||||
CTASSERT(sizeof(struct dbreg) == sizeof(((struct pcpu *)NULL)->pc_dbreg));
|
||||
|
||||
@ -71,17 +62,17 @@ CTASSERT(sizeof(struct dbreg) == sizeof(((struct pcpu *)NULL)->pc_dbreg));
|
||||
*/
|
||||
#define DB_OFFSET(x) (db_expr_t *)offsetof(struct trapframe, x)
|
||||
struct db_variable db_regs[] = {
|
||||
{ "cs", DB_OFFSET(tf_cs), db_frame },
|
||||
{ "ds", DB_OFFSET(tf_ds), db_frame },
|
||||
{ "es", DB_OFFSET(tf_es), db_frame },
|
||||
{ "fs", DB_OFFSET(tf_fs), db_frame },
|
||||
{ "gs", DB_OFFSET(tf_gs), db_frame },
|
||||
{ "ss", NULL, db_ss },
|
||||
{ "cs", DB_OFFSET(tf_cs), db_frame_seg },
|
||||
{ "ds", DB_OFFSET(tf_ds), db_frame_seg },
|
||||
{ "es", DB_OFFSET(tf_es), db_frame_seg },
|
||||
{ "fs", DB_OFFSET(tf_fs), db_frame_seg },
|
||||
{ "gs", DB_OFFSET(tf_gs), db_frame_seg },
|
||||
{ "ss", DB_OFFSET(tf_ss), db_frame_seg },
|
||||
{ "rax", DB_OFFSET(tf_rax), db_frame },
|
||||
{ "rcx", DB_OFFSET(tf_rcx), db_frame },
|
||||
{ "rdx", DB_OFFSET(tf_rdx), db_frame },
|
||||
{ "rbx", DB_OFFSET(tf_rbx), db_frame },
|
||||
{ "rsp", NULL, db_rsp },
|
||||
{ "rsp", DB_OFFSET(tf_rsp), db_frame },
|
||||
{ "rbp", DB_OFFSET(tf_rbp), db_frame },
|
||||
{ "rsi", DB_OFFSET(tf_rsi), db_frame },
|
||||
{ "rdi", DB_OFFSET(tf_rdi), db_frame },
|
||||
@ -95,46 +86,23 @@ struct db_variable db_regs[] = {
|
||||
{ "r15", DB_OFFSET(tf_r15), db_frame },
|
||||
{ "rip", DB_OFFSET(tf_rip), db_frame },
|
||||
{ "rflags", DB_OFFSET(tf_rflags), db_frame },
|
||||
#define DB_N_SHOW_REGS 24 /* Don't show registers after here. */
|
||||
{ "dr0", NULL, db_dr0 },
|
||||
{ "dr1", NULL, db_dr1 },
|
||||
{ "dr2", NULL, db_dr2 },
|
||||
{ "dr3", NULL, db_dr3 },
|
||||
{ "dr4", NULL, db_dr4 },
|
||||
{ "dr5", NULL, db_dr5 },
|
||||
{ "dr6", NULL, db_dr6 },
|
||||
{ "dr7", NULL, db_dr7 },
|
||||
};
|
||||
struct db_variable *db_eregs = db_regs + DB_N_SHOW_REGS;
|
||||
struct db_variable *db_eregs = db_regs + nitems(db_regs);
|
||||
|
||||
#define DB_DRX_FUNC(reg) \
|
||||
static int \
|
||||
db_ ## reg (vp, valuep, op) \
|
||||
struct db_variable *vp; \
|
||||
db_expr_t * valuep; \
|
||||
int op; \
|
||||
{ \
|
||||
if (op == DB_VAR_GET) \
|
||||
*valuep = r ## reg (); \
|
||||
else \
|
||||
load_ ## reg (*valuep); \
|
||||
return (1); \
|
||||
}
|
||||
|
||||
DB_DRX_FUNC(dr0)
|
||||
DB_DRX_FUNC(dr1)
|
||||
DB_DRX_FUNC(dr2)
|
||||
DB_DRX_FUNC(dr3)
|
||||
DB_DRX_FUNC(dr4)
|
||||
DB_DRX_FUNC(dr5)
|
||||
DB_DRX_FUNC(dr6)
|
||||
DB_DRX_FUNC(dr7)
|
||||
|
||||
static __inline long
|
||||
get_rsp(struct trapframe *tf)
|
||||
static int
|
||||
db_frame_seg(struct db_variable *vp, db_expr_t *valuep, int op)
|
||||
{
|
||||
return ((ISPL(tf->tf_cs)) ? tf->tf_rsp :
|
||||
(db_expr_t)tf + offsetof(struct trapframe, tf_rsp));
|
||||
uint16_t *reg;
|
||||
|
||||
if (kdb_frame == NULL)
|
||||
return (0);
|
||||
|
||||
reg = (uint16_t *)((uintptr_t)kdb_frame + (db_expr_t)vp->valuep);
|
||||
if (op == DB_VAR_GET)
|
||||
*valuep = *reg;
|
||||
else
|
||||
*reg = *valuep;
|
||||
return (1);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -153,34 +121,6 @@ db_frame(struct db_variable *vp, db_expr_t *valuep, int op)
|
||||
return (1);
|
||||
}
|
||||
|
||||
static int
|
||||
db_rsp(struct db_variable *vp, db_expr_t *valuep, int op)
|
||||
{
|
||||
|
||||
if (kdb_frame == NULL)
|
||||
return (0);
|
||||
|
||||
if (op == DB_VAR_GET)
|
||||
*valuep = get_rsp(kdb_frame);
|
||||
else if (ISPL(kdb_frame->tf_cs))
|
||||
kdb_frame->tf_rsp = *valuep;
|
||||
return (1);
|
||||
}
|
||||
|
||||
static int
|
||||
db_ss(struct db_variable *vp, db_expr_t *valuep, int op)
|
||||
{
|
||||
|
||||
if (kdb_frame == NULL)
|
||||
return (0);
|
||||
|
||||
if (op == DB_VAR_GET)
|
||||
*valuep = (ISPL(kdb_frame->tf_cs)) ? kdb_frame->tf_ss : rss();
|
||||
else if (ISPL(kdb_frame->tf_cs))
|
||||
kdb_frame->tf_ss = *valuep;
|
||||
return (1);
|
||||
}
|
||||
|
||||
#define NORMAL 0
|
||||
#define TRAP 1
|
||||
#define INTERRUPT 2
|
||||
@ -188,9 +128,7 @@ db_ss(struct db_variable *vp, db_expr_t *valuep, int op)
|
||||
#define TRAP_INTERRUPT 5
|
||||
|
||||
static void db_nextframe(struct amd64_frame **, db_addr_t *, struct thread *);
|
||||
static int db_numargs(struct amd64_frame *);
|
||||
static void db_print_stack_entry(const char *, int, char **, long *, db_addr_t,
|
||||
void *);
|
||||
static void db_print_stack_entry(const char *, db_addr_t, void *);
|
||||
static void decode_syscall(int, struct thread *);
|
||||
|
||||
static const char * watchtype_str(int type);
|
||||
@ -198,62 +136,11 @@ int amd64_set_watch(int watchnum, unsigned long watchaddr, int size,
|
||||
int access, struct dbreg *d);
|
||||
int amd64_clr_watch(int watchnum, struct dbreg *d);
|
||||
|
||||
/*
|
||||
* Figure out how many arguments were passed into the frame at "fp".
|
||||
*/
|
||||
static int
|
||||
db_numargs(fp)
|
||||
struct amd64_frame *fp;
|
||||
{
|
||||
#if 1
|
||||
return (0); /* regparm, needs dwarf2 info */
|
||||
#else
|
||||
long *argp;
|
||||
int inst;
|
||||
int args;
|
||||
|
||||
argp = (long *)db_get_value((long)&fp->f_retaddr, 8, FALSE);
|
||||
/*
|
||||
* XXX etext is wrong for LKMs. We should attempt to interpret
|
||||
* the instruction at the return address in all cases. This
|
||||
* may require better fault handling.
|
||||
*/
|
||||
if (argp < (long *)btext || argp >= (long *)etext) {
|
||||
args = 5;
|
||||
} else {
|
||||
inst = db_get_value((long)argp, 4, FALSE);
|
||||
if ((inst & 0xff) == 0x59) /* popl %ecx */
|
||||
args = 1;
|
||||
else if ((inst & 0xffff) == 0xc483) /* addl $Ibs, %esp */
|
||||
args = ((inst >> 16) & 0xff) / 4;
|
||||
else
|
||||
args = 5;
|
||||
}
|
||||
return (args);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
db_print_stack_entry(name, narg, argnp, argp, callpc, frame)
|
||||
const char *name;
|
||||
int narg;
|
||||
char **argnp;
|
||||
long *argp;
|
||||
db_addr_t callpc;
|
||||
void *frame;
|
||||
db_print_stack_entry(const char *name, db_addr_t callpc, void *frame)
|
||||
{
|
||||
db_printf("%s(", name);
|
||||
#if 0
|
||||
while (narg) {
|
||||
if (argnp)
|
||||
db_printf("%s=", *argnp++);
|
||||
db_printf("%lr", (long)db_get_value((long)argp, 8, FALSE));
|
||||
argp++;
|
||||
if (--narg != 0)
|
||||
db_printf(",");
|
||||
}
|
||||
#endif
|
||||
db_printf(") at ");
|
||||
|
||||
db_printf("%s() at ", name != NULL ? name : "??");
|
||||
db_printsym(callpc, DB_STGY_PROC);
|
||||
if (frame != NULL)
|
||||
db_printf("/frame 0x%lx", (register_t)frame);
|
||||
@ -348,7 +235,7 @@ db_nextframe(struct amd64_frame **fp, db_addr_t *ip, struct thread *td)
|
||||
return;
|
||||
}
|
||||
|
||||
db_print_stack_entry(name, 0, 0, 0, rip, &(*fp)->f_frame);
|
||||
db_print_stack_entry(name, rip, &(*fp)->f_frame);
|
||||
|
||||
/*
|
||||
* Point to base of trapframe which is just above the
|
||||
@ -357,7 +244,7 @@ db_nextframe(struct amd64_frame **fp, db_addr_t *ip, struct thread *td)
|
||||
tf = (struct trapframe *)((long)*fp + 16);
|
||||
|
||||
if (INKERNEL((long) tf)) {
|
||||
rsp = get_rsp(tf);
|
||||
rsp = tf->tf_rsp;
|
||||
rip = tf->tf_rip;
|
||||
rbp = tf->tf_rbp;
|
||||
switch (frame_type) {
|
||||
@ -384,17 +271,13 @@ db_nextframe(struct amd64_frame **fp, db_addr_t *ip, struct thread *td)
|
||||
}
|
||||
|
||||
static int
|
||||
db_backtrace(struct thread *td, struct trapframe *tf,
|
||||
struct amd64_frame *frame, db_addr_t pc, int count)
|
||||
db_backtrace(struct thread *td, struct trapframe *tf, struct amd64_frame *frame,
|
||||
db_addr_t pc, register_t sp, int count)
|
||||
{
|
||||
struct amd64_frame *actframe;
|
||||
#define MAXNARG 16
|
||||
char *argnames[MAXNARG], **argnp = NULL;
|
||||
const char *name;
|
||||
long *argp;
|
||||
db_expr_t offset;
|
||||
c_db_sym_t sym;
|
||||
int narg;
|
||||
boolean_t first;
|
||||
|
||||
if (count == -1)
|
||||
@ -418,48 +301,51 @@ db_backtrace(struct thread *td, struct trapframe *tf,
|
||||
*/
|
||||
actframe = frame;
|
||||
if (first) {
|
||||
if (tf != NULL) {
|
||||
first = FALSE;
|
||||
if (sym == C_DB_SYM_NULL && sp != 0) {
|
||||
/*
|
||||
* If a symbol couldn't be found, we've probably
|
||||
* jumped to a bogus location, so try and use
|
||||
* the return address to find our caller.
|
||||
*/
|
||||
db_print_stack_entry(name, pc, NULL);
|
||||
pc = db_get_value(sp, 8, FALSE);
|
||||
if (db_search_symbol(pc, DB_STGY_PROC,
|
||||
&offset) == C_DB_SYM_NULL)
|
||||
break;
|
||||
continue;
|
||||
} else if (tf != NULL) {
|
||||
int instr;
|
||||
|
||||
instr = db_get_value(pc, 4, FALSE);
|
||||
if ((instr & 0xffffffff) == 0xe5894855) {
|
||||
/* pushq %rbp; movq %rsp, %rbp */
|
||||
actframe = (void *)(get_rsp(tf) - 8);
|
||||
actframe = (void *)(tf->tf_rsp - 8);
|
||||
} else if ((instr & 0xffffff) == 0xe58948) {
|
||||
/* movq %rsp, %rbp */
|
||||
actframe = (void *)get_rsp(tf);
|
||||
actframe = (void *)tf->tf_rsp;
|
||||
if (tf->tf_rbp == 0) {
|
||||
/* Fake frame better. */
|
||||
frame = actframe;
|
||||
}
|
||||
} else if ((instr & 0xff) == 0xc3) {
|
||||
/* ret */
|
||||
actframe = (void *)(get_rsp(tf) - 8);
|
||||
actframe = (void *)(tf->tf_rsp - 8);
|
||||
} else if (offset == 0) {
|
||||
/* Probably an assembler symbol. */
|
||||
actframe = (void *)(get_rsp(tf) - 8);
|
||||
actframe = (void *)(tf->tf_rsp - 8);
|
||||
}
|
||||
} else if (strcmp(name, "fork_trampoline") == 0) {
|
||||
/*
|
||||
* Don't try to walk back on a stack for a
|
||||
* process that hasn't actually been run yet.
|
||||
*/
|
||||
db_print_stack_entry(name, 0, 0, 0, pc,
|
||||
actframe);
|
||||
db_print_stack_entry(name, pc, actframe);
|
||||
break;
|
||||
}
|
||||
first = FALSE;
|
||||
}
|
||||
|
||||
argp = &actframe->f_arg0;
|
||||
narg = MAXNARG;
|
||||
if (sym != NULL && db_sym_numargs(sym, &narg, argnames)) {
|
||||
argnp = argnames;
|
||||
} else {
|
||||
narg = db_numargs(frame);
|
||||
}
|
||||
|
||||
db_print_stack_entry(name, narg, argnp, argp, pc, actframe);
|
||||
db_print_stack_entry(name, pc, actframe);
|
||||
|
||||
if (actframe != frame) {
|
||||
/* `frame' belongs to caller. */
|
||||
@ -473,7 +359,7 @@ db_backtrace(struct thread *td, struct trapframe *tf,
|
||||
if (INKERNEL((long)pc) && !INKERNEL((long)frame)) {
|
||||
sym = db_search_symbol(pc, DB_STGY_ANY, &offset);
|
||||
db_symbol_values(sym, &name, NULL);
|
||||
db_print_stack_entry(name, 0, 0, 0, pc, frame);
|
||||
db_print_stack_entry(name, pc, frame);
|
||||
break;
|
||||
}
|
||||
if (!INKERNEL((long) frame)) {
|
||||
@ -495,17 +381,19 @@ db_trace_self(void)
|
||||
frame = (struct amd64_frame *)rbp;
|
||||
callpc = (db_addr_t)db_get_value((long)&frame->f_retaddr, 8, FALSE);
|
||||
frame = frame->f_frame;
|
||||
db_backtrace(curthread, NULL, frame, callpc, -1);
|
||||
db_backtrace(curthread, NULL, frame, callpc, 0, -1);
|
||||
}
|
||||
|
||||
int
|
||||
db_trace_thread(struct thread *thr, int count)
|
||||
{
|
||||
struct pcb *ctx;
|
||||
struct trapframe *tf;
|
||||
|
||||
ctx = kdb_thr_ctx(thr);
|
||||
return (db_backtrace(thr, NULL, (struct amd64_frame *)ctx->pcb_rbp,
|
||||
ctx->pcb_rip, count));
|
||||
tf = thr == kdb_thread ? kdb_frame : NULL;
|
||||
return (db_backtrace(thr, tf, (struct amd64_frame *)ctx->pcb_rbp,
|
||||
ctx->pcb_rip, ctx->pcb_rsp, count));
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -878,11 +878,26 @@ DB_SHOW_COMMAND(sysregs, db_show_sysregs)
|
||||
db_printf("cr2\t0x%016lx\n", rcr2());
|
||||
db_printf("cr3\t0x%016lx\n", rcr3());
|
||||
db_printf("cr4\t0x%016lx\n", rcr4());
|
||||
db_printf("EFER\t%016lx\n", rdmsr(MSR_EFER));
|
||||
db_printf("FEATURES_CTL\t%016lx\n", rdmsr(MSR_IA32_FEATURE_CONTROL));
|
||||
db_printf("DEBUG_CTL\t%016lx\n", rdmsr(MSR_DEBUGCTLMSR));
|
||||
db_printf("PAT\t%016lx\n", rdmsr(MSR_PAT));
|
||||
db_printf("GSBASE\t%016lx\n", rdmsr(MSR_GSBASE));
|
||||
if (rcr4() & CR4_XSAVE)
|
||||
db_printf("xcr0\t0x%016lx\n", rxcr(0));
|
||||
db_printf("EFER\t0x%016lx\n", rdmsr(MSR_EFER));
|
||||
if (cpu_feature2 & (CPUID2_VMX | CPUID2_SMX))
|
||||
db_printf("FEATURES_CTL\t%016lx\n",
|
||||
rdmsr(MSR_IA32_FEATURE_CONTROL));
|
||||
db_printf("DEBUG_CTL\t0x%016lx\n", rdmsr(MSR_DEBUGCTLMSR));
|
||||
db_printf("PAT\t0x%016lx\n", rdmsr(MSR_PAT));
|
||||
db_printf("GSBASE\t0x%016lx\n", rdmsr(MSR_GSBASE));
|
||||
}
|
||||
|
||||
DB_SHOW_COMMAND(dbregs, db_show_dbregs)
|
||||
{
|
||||
|
||||
db_printf("dr0\t0x%016lx\n", rdr0());
|
||||
db_printf("dr1\t0x%016lx\n", rdr1());
|
||||
db_printf("dr2\t0x%016lx\n", rdr2());
|
||||
db_printf("dr3\t0x%016lx\n", rdr3());
|
||||
db_printf("dr6\t0x%016lx\n", rdr6());
|
||||
db_printf("dr7\t0x%016lx\n", rdr7());
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -40,7 +40,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <vm/pmap.h>
|
||||
|
||||
static void
|
||||
stack_capture(struct stack *st, register_t rbp)
|
||||
stack_capture(struct thread *td, struct stack *st, register_t rbp)
|
||||
{
|
||||
struct amd64_frame *frame;
|
||||
vm_offset_t callpc;
|
||||
@ -56,8 +56,8 @@ stack_capture(struct stack *st, register_t rbp)
|
||||
if (stack_put(st, callpc) == -1)
|
||||
break;
|
||||
if (frame->f_frame <= frame ||
|
||||
(vm_offset_t)frame->f_frame >=
|
||||
(vm_offset_t)rbp + KSTACK_PAGES * PAGE_SIZE)
|
||||
(vm_offset_t)frame->f_frame >= td->td_kstack +
|
||||
td->td_kstack_pages * PAGE_SIZE)
|
||||
break;
|
||||
frame = frame->f_frame;
|
||||
}
|
||||
@ -74,7 +74,7 @@ stack_save_td(struct stack *st, struct thread *td)
|
||||
panic("stack_save_td: running");
|
||||
|
||||
rbp = td->td_pcb->pcb_rbp;
|
||||
stack_capture(st, rbp);
|
||||
stack_capture(td, st, rbp);
|
||||
}
|
||||
|
||||
void
|
||||
@ -83,5 +83,5 @@ stack_save(struct stack *st)
|
||||
register_t rbp;
|
||||
|
||||
__asm __volatile("movq %%rbp,%0" : "=r" (rbp));
|
||||
stack_capture(st, rbp);
|
||||
stack_capture(curthread, st, rbp);
|
||||
}
|
||||
|
264
sys/amd64/cloudabi64/cloudabi64_sysvec.c
Normal file
264
sys/amd64/cloudabi64/cloudabi64_sysvec.c
Normal file
@ -0,0 +1,264 @@
|
||||
/*-
|
||||
* Copyright (c) 2015 Nuxi, https://nuxi.nl/
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/exec.h>
|
||||
#include <sys/imgact.h>
|
||||
#include <sys/imgact_elf.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/smp.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/systm.h>
|
||||
|
||||
#include <vm/pmap.h>
|
||||
#include <vm/vm.h>
|
||||
|
||||
#include <machine/frame.h>
|
||||
#include <machine/pcb.h>
|
||||
#include <machine/pmap.h>
|
||||
#include <machine/psl.h>
|
||||
#include <machine/vmparam.h>
|
||||
|
||||
#include <compat/cloudabi/cloudabi_util.h>
|
||||
|
||||
#include <compat/cloudabi64/cloudabi64_syscall.h>
|
||||
#include <compat/cloudabi64/cloudabi64_syscalldefs.h>
|
||||
#include <compat/cloudabi64/cloudabi64_util.h>
|
||||
|
||||
extern const char *cloudabi64_syscallnames[];
|
||||
extern struct sysent cloudabi64_sysent[];
|
||||
|
||||
static register_t *
|
||||
cloudabi64_copyout_strings(struct image_params *imgp)
|
||||
{
|
||||
uintptr_t begin;
|
||||
size_t len;
|
||||
|
||||
/* Copy out program arguments. */
|
||||
len = imgp->args->begin_envv - imgp->args->begin_argv;
|
||||
begin = rounddown2(USRSTACK - len, sizeof(register_t));
|
||||
copyout(imgp->args->begin_argv, (void *)begin, len);
|
||||
return ((register_t *)begin);
|
||||
}
|
||||
|
||||
static int
|
||||
cloudabi64_fixup(register_t **stack_base, struct image_params *imgp)
|
||||
{
|
||||
char canarybuf[64];
|
||||
Elf64_Auxargs *args;
|
||||
void *argdata, *canary;
|
||||
size_t argdatalen;
|
||||
int error;
|
||||
|
||||
/* Store canary for stack smashing protection. */
|
||||
argdata = *stack_base;
|
||||
arc4rand(canarybuf, sizeof(canarybuf), 0);
|
||||
*stack_base -= howmany(sizeof(canarybuf), sizeof(register_t));
|
||||
canary = *stack_base;
|
||||
error = copyout(canarybuf, canary, sizeof(canarybuf));
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
/*
|
||||
* Compute length of program arguments. As the argument data is
|
||||
* binary safe, we had to add a trailing null byte in
|
||||
* exec_copyin_data_fds(). Undo this by reducing the length.
|
||||
*/
|
||||
args = (Elf64_Auxargs *)imgp->auxargs;
|
||||
argdatalen = imgp->args->begin_envv - imgp->args->begin_argv;
|
||||
if (argdatalen > 0)
|
||||
--argdatalen;
|
||||
|
||||
/* Write out an auxiliary vector. */
|
||||
cloudabi64_auxv_t auxv[] = {
|
||||
#define VAL(type, val) { .a_type = (type), .a_val = (val) }
|
||||
#define PTR(type, ptr) { .a_type = (type), .a_ptr = (uintptr_t)(ptr) }
|
||||
PTR(CLOUDABI_AT_ARGDATA, argdata),
|
||||
VAL(CLOUDABI_AT_ARGDATALEN, argdatalen),
|
||||
PTR(CLOUDABI_AT_CANARY, canary),
|
||||
VAL(CLOUDABI_AT_CANARYLEN, sizeof(canarybuf)),
|
||||
VAL(CLOUDABI_AT_NCPUS, mp_ncpus),
|
||||
VAL(CLOUDABI_AT_PAGESZ, args->pagesz),
|
||||
PTR(CLOUDABI_AT_PHDR, args->phdr),
|
||||
VAL(CLOUDABI_AT_PHNUM, args->phnum),
|
||||
VAL(CLOUDABI_AT_TID, curthread->td_tid),
|
||||
#undef VAL
|
||||
#undef PTR
|
||||
{ .a_type = CLOUDABI_AT_NULL },
|
||||
};
|
||||
*stack_base -= howmany(sizeof(auxv), sizeof(register_t));
|
||||
return (copyout(auxv, *stack_base, sizeof(auxv)));
|
||||
}
|
||||
|
||||
static int
|
||||
cloudabi64_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
{
|
||||
struct trapframe *frame = td->td_frame;
|
||||
|
||||
/* Obtain system call number. */
|
||||
sa->code = frame->tf_rax;
|
||||
if (sa->code >= CLOUDABI64_SYS_MAXSYSCALL)
|
||||
return (ENOSYS);
|
||||
sa->callp = &cloudabi64_sysent[sa->code];
|
||||
|
||||
/* Fetch system call arguments. */
|
||||
sa->args[0] = frame->tf_rdi;
|
||||
sa->args[1] = frame->tf_rsi;
|
||||
sa->args[2] = frame->tf_rdx;
|
||||
sa->args[3] = frame->tf_rcx; /* Actually %r10. */
|
||||
sa->args[4] = frame->tf_r8;
|
||||
sa->args[5] = frame->tf_r9;
|
||||
|
||||
/* Default system call return values. */
|
||||
td->td_retval[0] = 0;
|
||||
td->td_retval[1] = frame->tf_rdx;
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
cloudabi64_set_syscall_retval(struct thread *td, int error)
|
||||
{
|
||||
struct trapframe *frame = td->td_frame;
|
||||
|
||||
switch (error) {
|
||||
case 0:
|
||||
/* System call succeeded. */
|
||||
frame->tf_rax = td->td_retval[0];
|
||||
frame->tf_rdx = td->td_retval[1];
|
||||
frame->tf_rflags &= ~PSL_C;
|
||||
break;
|
||||
case ERESTART:
|
||||
/* Restart system call. */
|
||||
frame->tf_rip -= frame->tf_err;
|
||||
frame->tf_r10 = frame->tf_rcx;
|
||||
set_pcb_flags(td->td_pcb, PCB_FULL_IRET);
|
||||
break;
|
||||
case EJUSTRETURN:
|
||||
break;
|
||||
default:
|
||||
/* System call returned an error. */
|
||||
frame->tf_rax = cloudabi_convert_errno(error);
|
||||
frame->tf_rflags |= PSL_C;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cloudabi64_schedtail(struct thread *td)
|
||||
{
|
||||
struct trapframe *frame = td->td_frame;
|
||||
|
||||
/* Initial register values for processes returning from fork. */
|
||||
frame->tf_rax = CLOUDABI_PROCESS_CHILD;
|
||||
frame->tf_rdx = td->td_tid;
|
||||
}
|
||||
|
||||
void
|
||||
cloudabi64_thread_setregs(struct thread *td,
|
||||
const cloudabi64_threadattr_t *attr)
|
||||
{
|
||||
struct trapframe *frame;
|
||||
stack_t stack;
|
||||
|
||||
/* Perform standard register initialization. */
|
||||
stack.ss_sp = (void *)attr->stack;
|
||||
stack.ss_size = attr->stack_size;
|
||||
cpu_set_upcall_kse(td, (void *)attr->entry_point, NULL, &stack);
|
||||
|
||||
/*
|
||||
* Pass in the thread ID of the new thread and the argument
|
||||
* pointer provided by the parent thread in as arguments to the
|
||||
* entry point.
|
||||
*/
|
||||
frame = td->td_frame;
|
||||
frame->tf_rdi = td->td_tid;
|
||||
frame->tf_rsi = attr->argument;
|
||||
}
|
||||
|
||||
static struct sysentvec cloudabi64_elf_sysvec = {
|
||||
.sv_size = CLOUDABI64_SYS_MAXSYSCALL,
|
||||
.sv_table = cloudabi64_sysent,
|
||||
.sv_fixup = cloudabi64_fixup,
|
||||
.sv_name = "CloudABI ELF64",
|
||||
.sv_coredump = elf64_coredump,
|
||||
.sv_pagesize = PAGE_SIZE,
|
||||
.sv_minuser = VM_MIN_ADDRESS,
|
||||
.sv_maxuser = VM_MAXUSER_ADDRESS,
|
||||
.sv_usrstack = USRSTACK,
|
||||
.sv_stackprot = VM_PROT_READ | VM_PROT_WRITE,
|
||||
.sv_copyout_strings = cloudabi64_copyout_strings,
|
||||
.sv_flags = SV_ABI_CLOUDABI,
|
||||
.sv_set_syscall_retval = cloudabi64_set_syscall_retval,
|
||||
.sv_fetch_syscall_args = cloudabi64_fetch_syscall_args,
|
||||
.sv_syscallnames = cloudabi64_syscallnames,
|
||||
.sv_schedtail = cloudabi64_schedtail,
|
||||
};
|
||||
|
||||
INIT_SYSENTVEC(elf_sysvec, &cloudabi64_elf_sysvec);
|
||||
|
||||
static Elf64_Brandinfo cloudabi64_brand = {
|
||||
.brand = ELFOSABI_CLOUDABI,
|
||||
.machine = EM_X86_64,
|
||||
.sysvec = &cloudabi64_elf_sysvec,
|
||||
.compat_3_brand = "CloudABI",
|
||||
};
|
||||
|
||||
static int
|
||||
cloudabi64_modevent(module_t mod, int type, void *data)
|
||||
{
|
||||
|
||||
switch (type) {
|
||||
case MOD_LOAD:
|
||||
if (elf64_insert_brand_entry(&cloudabi64_brand) < 0) {
|
||||
printf("Failed to add CloudABI ELF brand handler\n");
|
||||
return (EINVAL);
|
||||
}
|
||||
return (0);
|
||||
case MOD_UNLOAD:
|
||||
if (elf64_brand_inuse(&cloudabi64_brand))
|
||||
return (EBUSY);
|
||||
if (elf64_remove_brand_entry(&cloudabi64_brand) < 0) {
|
||||
printf("Failed to remove CloudABI ELF brand handler\n");
|
||||
return (EINVAL);
|
||||
}
|
||||
return (0);
|
||||
default:
|
||||
return (EOPNOTSUPP);
|
||||
}
|
||||
}
|
||||
|
||||
static moduledata_t cloudabi64_module = {
|
||||
"cloudabi64",
|
||||
cloudabi64_modevent,
|
||||
NULL
|
||||
};
|
||||
|
||||
DECLARE_MODULE_TIED(cloudabi64, cloudabi64_module, SI_SUB_EXEC, SI_ORDER_ANY);
|
||||
MODULE_DEPEND(cloudabi64, cloudabi, 1, 1, 1);
|
@ -170,6 +170,7 @@ device ida # Compaq Smart RAID
|
||||
device mfi # LSI MegaRAID SAS
|
||||
device mlx # Mylex DAC960 family
|
||||
device mrsas # LSI/Avago MegaRAID SAS/SATA, 6Gb/s and 12Gb/s
|
||||
device pmspcv # PMC-Sierra SAS/SATA Controller driver
|
||||
#XXX pointer/int warnings
|
||||
#device pst # Promise Supertrak SX6000
|
||||
device twe # 3ware ATA RAID
|
||||
@ -364,5 +365,5 @@ device vmx # VMware VMXNET3 Ethernet
|
||||
# Netmap provides direct access to TX/RX rings on supported NICs
|
||||
device netmap # netmap(4) support
|
||||
|
||||
# The cypto framework is required by IPSEC
|
||||
# The crypto framework is required by IPSEC
|
||||
device crypto # Required by IPSEC
|
||||
|
@ -22,7 +22,6 @@ options KDTRACE_HOOKS
|
||||
#device dtrace
|
||||
|
||||
# DTrace modules
|
||||
#device dtrace_lockstat
|
||||
#device dtrace_profile
|
||||
#device dtrace_sdt
|
||||
#device dtrace_fbt
|
||||
@ -485,6 +484,10 @@ options ISCI_LOGGING # enable debugging in isci HAL
|
||||
device nvme # base NVMe driver
|
||||
device nvd # expose NVMe namespaces as disks, depends on nvme
|
||||
|
||||
#
|
||||
# PMC-Sierra SAS/SATA controller
|
||||
device pmspcv
|
||||
|
||||
#
|
||||
# SafeNet crypto driver: can be moved to the MI NOTES as soon as
|
||||
# it's tested on a big-endian machine
|
||||
@ -617,6 +620,9 @@ options COMPAT_FREEBSD32
|
||||
# Emulate spx device for client side of SVR3 local X interface
|
||||
#XXX#options SPX_HACK
|
||||
|
||||
# Enable 64-bit runtime support for CloudABI binaries.
|
||||
options COMPAT_CLOUDABI64
|
||||
|
||||
# Enable Linux ABI emulation
|
||||
#XXX#options COMPAT_LINUX
|
||||
|
||||
|
@ -82,18 +82,16 @@ struct a10_gpio_softc {
|
||||
bus_space_tag_t sc_bst;
|
||||
bus_space_handle_t sc_bsh;
|
||||
void * sc_intrhand;
|
||||
int sc_gpio_npins;
|
||||
struct gpio_pin sc_gpio_pins[A10_GPIO_PINS];
|
||||
};
|
||||
|
||||
#define A10_GPIO_LOCK(_sc) mtx_lock(&_sc->sc_mtx)
|
||||
#define A10_GPIO_UNLOCK(_sc) mtx_unlock(&_sc->sc_mtx)
|
||||
#define A10_GPIO_LOCK_ASSERT(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED)
|
||||
#define A10_GPIO_LOCK(_sc) mtx_lock_spin(&(_sc)->sc_mtx)
|
||||
#define A10_GPIO_UNLOCK(_sc) mtx_unlock_spin(&(_sc)->sc_mtx)
|
||||
#define A10_GPIO_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
|
||||
|
||||
#define A10_GPIO_GP_CFG(_bank, _pin) 0x00 + ((_bank) * 0x24) + ((_pin)<<2)
|
||||
#define A10_GPIO_GP_CFG(_bank, _idx) 0x00 + ((_bank) * 0x24) + ((_idx) << 2)
|
||||
#define A10_GPIO_GP_DAT(_bank) 0x10 + ((_bank) * 0x24)
|
||||
#define A10_GPIO_GP_DRV(_bank, _pin) 0x14 + ((_bank) * 0x24) + ((_pin)<<2)
|
||||
#define A10_GPIO_GP_PUL(_bank, _pin) 0x1c + ((_bank) * 0x24) + ((_pin)<<2)
|
||||
#define A10_GPIO_GP_DRV(_bank, _idx) 0x14 + ((_bank) * 0x24) + ((_idx) << 2)
|
||||
#define A10_GPIO_GP_PUL(_bank, _idx) 0x1c + ((_bank) * 0x24) + ((_idx) << 2)
|
||||
|
||||
#define A10_GPIO_GP_INT_CFG0 0x200
|
||||
#define A10_GPIO_GP_INT_CFG1 0x204
|
||||
@ -116,106 +114,106 @@ a10_gpio_get_function(struct a10_gpio_softc *sc, uint32_t pin)
|
||||
{
|
||||
uint32_t bank, func, offset;
|
||||
|
||||
/* Must be called with lock held. */
|
||||
A10_GPIO_LOCK_ASSERT(sc);
|
||||
|
||||
bank = pin / 32;
|
||||
pin = pin - 32 * bank;
|
||||
func = pin >> 3;
|
||||
pin = pin % 32;
|
||||
offset = ((pin & 0x07) << 2);
|
||||
|
||||
A10_GPIO_LOCK(sc);
|
||||
func = (A10_GPIO_READ(sc, A10_GPIO_GP_CFG(bank, func)) >> offset) & 7;
|
||||
A10_GPIO_UNLOCK(sc);
|
||||
|
||||
return (func);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
a10_gpio_func_flag(uint32_t nfunc)
|
||||
{
|
||||
|
||||
switch (nfunc) {
|
||||
func = A10_GPIO_READ(sc, A10_GPIO_GP_CFG(bank, pin >> 3));
|
||||
switch ((func >> offset) & 0x7) {
|
||||
case A10_GPIO_INPUT:
|
||||
return (GPIO_PIN_INPUT);
|
||||
case A10_GPIO_OUTPUT:
|
||||
return (GPIO_PIN_OUTPUT);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
a10_gpio_set_function(struct a10_gpio_softc *sc, uint32_t pin, uint32_t f)
|
||||
{
|
||||
uint32_t bank, func, data, offset;
|
||||
uint32_t bank, data, offset;
|
||||
|
||||
/* Must be called with lock held. */
|
||||
A10_GPIO_LOCK_ASSERT(sc);
|
||||
|
||||
bank = pin / 32;
|
||||
pin = pin - 32 * bank;
|
||||
func = pin >> 3;
|
||||
pin = pin % 32;
|
||||
offset = ((pin & 0x07) << 2);
|
||||
|
||||
data = A10_GPIO_READ(sc, A10_GPIO_GP_CFG(bank, func));
|
||||
data = A10_GPIO_READ(sc, A10_GPIO_GP_CFG(bank, pin >> 3));
|
||||
data &= ~(7 << offset);
|
||||
data |= (f << offset);
|
||||
A10_GPIO_WRITE(sc, A10_GPIO_GP_CFG(bank, func), data);
|
||||
A10_GPIO_WRITE(sc, A10_GPIO_GP_CFG(bank, pin >> 3), data);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
a10_gpio_get_pud(struct a10_gpio_softc *sc, uint32_t pin)
|
||||
{
|
||||
uint32_t bank, offset, val;
|
||||
|
||||
/* Must be called with lock held. */
|
||||
A10_GPIO_LOCK_ASSERT(sc);
|
||||
|
||||
bank = pin / 32;
|
||||
pin = pin % 32;
|
||||
offset = ((pin & 0x0f) << 1);
|
||||
|
||||
val = A10_GPIO_READ(sc, A10_GPIO_GP_PUL(bank, pin >> 4));
|
||||
switch ((val >> offset) & 0x3) {
|
||||
case A10_GPIO_PULLDOWN:
|
||||
return (GPIO_PIN_PULLDOWN);
|
||||
case A10_GPIO_PULLUP:
|
||||
return (GPIO_PIN_PULLUP);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
a10_gpio_set_pud(struct a10_gpio_softc *sc, uint32_t pin, uint32_t state)
|
||||
{
|
||||
uint32_t bank, offset, pull, val;
|
||||
uint32_t bank, offset, val;
|
||||
|
||||
/* Must be called with lock held. */
|
||||
A10_GPIO_LOCK_ASSERT(sc);
|
||||
|
||||
bank = pin / 32;
|
||||
pin = pin - 32 * bank;
|
||||
pull = pin >> 4;
|
||||
pin = pin % 32;
|
||||
offset = ((pin & 0x0f) << 1);
|
||||
|
||||
val = A10_GPIO_READ(sc, A10_GPIO_GP_PUL(bank, pull));
|
||||
val = A10_GPIO_READ(sc, A10_GPIO_GP_PUL(bank, pin >> 4));
|
||||
val &= ~(0x03 << offset);
|
||||
val |= (state << offset);
|
||||
A10_GPIO_WRITE(sc, A10_GPIO_GP_PUL(bank, pull), val);
|
||||
A10_GPIO_WRITE(sc, A10_GPIO_GP_PUL(bank, pin >> 4), val);
|
||||
}
|
||||
|
||||
static void
|
||||
a10_gpio_pin_configure(struct a10_gpio_softc *sc, struct gpio_pin *pin,
|
||||
unsigned int flags)
|
||||
a10_gpio_pin_configure(struct a10_gpio_softc *sc, uint32_t pin, uint32_t flags)
|
||||
{
|
||||
|
||||
A10_GPIO_LOCK(sc);
|
||||
/* Must be called with lock held. */
|
||||
A10_GPIO_LOCK_ASSERT(sc);
|
||||
|
||||
/*
|
||||
* Manage input/output.
|
||||
*/
|
||||
if (flags & (GPIO_PIN_INPUT|GPIO_PIN_OUTPUT)) {
|
||||
pin->gp_flags &= ~(GPIO_PIN_INPUT|GPIO_PIN_OUTPUT);
|
||||
if (flags & GPIO_PIN_OUTPUT) {
|
||||
pin->gp_flags |= GPIO_PIN_OUTPUT;
|
||||
a10_gpio_set_function(sc, pin->gp_pin,
|
||||
A10_GPIO_OUTPUT);
|
||||
} else {
|
||||
pin->gp_flags |= GPIO_PIN_INPUT;
|
||||
a10_gpio_set_function(sc, pin->gp_pin,
|
||||
A10_GPIO_INPUT);
|
||||
}
|
||||
/* Manage input/output. */
|
||||
if (flags & (GPIO_PIN_INPUT | GPIO_PIN_OUTPUT)) {
|
||||
if (flags & GPIO_PIN_OUTPUT)
|
||||
a10_gpio_set_function(sc, pin, A10_GPIO_OUTPUT);
|
||||
else
|
||||
a10_gpio_set_function(sc, pin, A10_GPIO_INPUT);
|
||||
}
|
||||
|
||||
/* Manage Pull-up/pull-down. */
|
||||
pin->gp_flags &= ~(GPIO_PIN_PULLUP|GPIO_PIN_PULLDOWN);
|
||||
if (flags & (GPIO_PIN_PULLUP|GPIO_PIN_PULLDOWN)) {
|
||||
if (flags & GPIO_PIN_PULLUP) {
|
||||
pin->gp_flags |= GPIO_PIN_PULLUP;
|
||||
a10_gpio_set_pud(sc, pin->gp_pin, A10_GPIO_PULLUP);
|
||||
} else {
|
||||
pin->gp_flags |= GPIO_PIN_PULLDOWN;
|
||||
a10_gpio_set_pud(sc, pin->gp_pin, A10_GPIO_PULLDOWN);
|
||||
}
|
||||
if (flags & (GPIO_PIN_PULLUP | GPIO_PIN_PULLDOWN)) {
|
||||
if (flags & GPIO_PIN_PULLUP)
|
||||
a10_gpio_set_pud(sc, pin, A10_GPIO_PULLUP);
|
||||
else
|
||||
a10_gpio_set_pud(sc, pin, A10_GPIO_PULLDOWN);
|
||||
} else
|
||||
a10_gpio_set_pud(sc, pin->gp_pin, A10_GPIO_NONE);
|
||||
|
||||
A10_GPIO_UNLOCK(sc);
|
||||
a10_gpio_set_pud(sc, pin, A10_GPIO_NONE);
|
||||
}
|
||||
|
||||
static device_t
|
||||
@ -239,20 +237,11 @@ a10_gpio_pin_max(device_t dev, int *maxpin)
|
||||
static int
|
||||
a10_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps)
|
||||
{
|
||||
struct a10_gpio_softc *sc = device_get_softc(dev);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < sc->sc_gpio_npins; i++) {
|
||||
if (sc->sc_gpio_pins[i].gp_pin == pin)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= sc->sc_gpio_npins)
|
||||
if (pin >= A10_GPIO_PINS)
|
||||
return (EINVAL);
|
||||
|
||||
A10_GPIO_LOCK(sc);
|
||||
*caps = sc->sc_gpio_pins[i].gp_caps;
|
||||
A10_GPIO_UNLOCK(sc);
|
||||
*caps = A10_GPIO_DEFAULT_CAPS;
|
||||
|
||||
return (0);
|
||||
}
|
||||
@ -260,19 +249,15 @@ a10_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps)
|
||||
static int
|
||||
a10_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags)
|
||||
{
|
||||
struct a10_gpio_softc *sc = device_get_softc(dev);
|
||||
int i;
|
||||
struct a10_gpio_softc *sc;
|
||||
|
||||
for (i = 0; i < sc->sc_gpio_npins; i++) {
|
||||
if (sc->sc_gpio_pins[i].gp_pin == pin)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= sc->sc_gpio_npins)
|
||||
if (pin >= A10_GPIO_PINS)
|
||||
return (EINVAL);
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
A10_GPIO_LOCK(sc);
|
||||
*flags = sc->sc_gpio_pins[i].gp_flags;
|
||||
*flags = a10_gpio_get_function(sc, pin);
|
||||
*flags |= a10_gpio_get_pud(sc, pin);
|
||||
A10_GPIO_UNLOCK(sc);
|
||||
|
||||
return (0);
|
||||
@ -281,20 +266,15 @@ a10_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags)
|
||||
static int
|
||||
a10_gpio_pin_getname(device_t dev, uint32_t pin, char *name)
|
||||
{
|
||||
struct a10_gpio_softc *sc = device_get_softc(dev);
|
||||
int i;
|
||||
uint32_t bank;
|
||||
|
||||
for (i = 0; i < sc->sc_gpio_npins; i++) {
|
||||
if (sc->sc_gpio_pins[i].gp_pin == pin)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= sc->sc_gpio_npins)
|
||||
if (pin >= A10_GPIO_PINS)
|
||||
return (EINVAL);
|
||||
|
||||
A10_GPIO_LOCK(sc);
|
||||
memcpy(name, sc->sc_gpio_pins[i].gp_name, GPIOMAXNAME);
|
||||
A10_GPIO_UNLOCK(sc);
|
||||
bank = pin / 32;
|
||||
snprintf(name, GPIOMAXNAME - 1, "pin %d (P%c%d)",
|
||||
pin, bank + 'A', pin % 32);
|
||||
name[GPIOMAXNAME - 1] = '\0';
|
||||
|
||||
return (0);
|
||||
}
|
||||
@ -302,18 +282,15 @@ a10_gpio_pin_getname(device_t dev, uint32_t pin, char *name)
|
||||
static int
|
||||
a10_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
|
||||
{
|
||||
struct a10_gpio_softc *sc = device_get_softc(dev);
|
||||
int i;
|
||||
struct a10_gpio_softc *sc;
|
||||
|
||||
for (i = 0; i < sc->sc_gpio_npins; i++) {
|
||||
if (sc->sc_gpio_pins[i].gp_pin == pin)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= sc->sc_gpio_npins)
|
||||
if (pin >= A10_GPIO_PINS)
|
||||
return (EINVAL);
|
||||
|
||||
a10_gpio_pin_configure(sc, &sc->sc_gpio_pins[i], flags);
|
||||
sc = device_get_softc(dev);
|
||||
A10_GPIO_LOCK(sc);
|
||||
a10_gpio_pin_configure(sc, pin, flags);
|
||||
A10_GPIO_UNLOCK(sc);
|
||||
|
||||
return (0);
|
||||
}
|
||||
@ -321,28 +298,22 @@ a10_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
|
||||
static int
|
||||
a10_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value)
|
||||
{
|
||||
struct a10_gpio_softc *sc = device_get_softc(dev);
|
||||
uint32_t bank, offset, data;
|
||||
int i;
|
||||
struct a10_gpio_softc *sc;
|
||||
uint32_t bank, data;
|
||||
|
||||
for (i = 0; i < sc->sc_gpio_npins; i++) {
|
||||
if (sc->sc_gpio_pins[i].gp_pin == pin)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= sc->sc_gpio_npins)
|
||||
if (pin >= A10_GPIO_PINS)
|
||||
return (EINVAL);
|
||||
|
||||
bank = pin / 32;
|
||||
pin = pin - 32 * bank;
|
||||
offset = pin & 0x1f;
|
||||
pin = pin % 32;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
A10_GPIO_LOCK(sc);
|
||||
data = A10_GPIO_READ(sc, A10_GPIO_GP_DAT(bank));
|
||||
if (value)
|
||||
data |= (1 << offset);
|
||||
data |= (1 << pin);
|
||||
else
|
||||
data &= ~(1 << offset);
|
||||
data &= ~(1 << pin);
|
||||
A10_GPIO_WRITE(sc, A10_GPIO_GP_DAT(bank), data);
|
||||
A10_GPIO_UNLOCK(sc);
|
||||
|
||||
@ -352,26 +323,20 @@ a10_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value)
|
||||
static int
|
||||
a10_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val)
|
||||
{
|
||||
struct a10_gpio_softc *sc = device_get_softc(dev);
|
||||
uint32_t bank, offset, reg_data;
|
||||
int i;
|
||||
struct a10_gpio_softc *sc;
|
||||
uint32_t bank, reg_data;
|
||||
|
||||
for (i = 0; i < sc->sc_gpio_npins; i++) {
|
||||
if (sc->sc_gpio_pins[i].gp_pin == pin)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= sc->sc_gpio_npins)
|
||||
if (pin >= A10_GPIO_PINS)
|
||||
return (EINVAL);
|
||||
|
||||
bank = pin / 32;
|
||||
pin = pin - 32 * bank;
|
||||
offset = pin & 0x1f;
|
||||
pin = pin % 32;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
A10_GPIO_LOCK(sc);
|
||||
reg_data = A10_GPIO_READ(sc, A10_GPIO_GP_DAT(bank));
|
||||
A10_GPIO_UNLOCK(sc);
|
||||
*val = (reg_data & (1 << offset)) ? 1 : 0;
|
||||
*val = (reg_data & (1 << pin)) ? 1 : 0;
|
||||
|
||||
return (0);
|
||||
}
|
||||
@ -379,28 +344,22 @@ a10_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val)
|
||||
static int
|
||||
a10_gpio_pin_toggle(device_t dev, uint32_t pin)
|
||||
{
|
||||
struct a10_gpio_softc *sc = device_get_softc(dev);
|
||||
uint32_t bank, data, offset;
|
||||
int i;
|
||||
struct a10_gpio_softc *sc;
|
||||
uint32_t bank, data;
|
||||
|
||||
for (i = 0; i < sc->sc_gpio_npins; i++) {
|
||||
if (sc->sc_gpio_pins[i].gp_pin == pin)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= sc->sc_gpio_npins)
|
||||
if (pin >= A10_GPIO_PINS)
|
||||
return (EINVAL);
|
||||
|
||||
bank = pin / 32;
|
||||
pin = pin - 32 * bank;
|
||||
offset = pin & 0x1f;
|
||||
pin = pin % 32;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
A10_GPIO_LOCK(sc);
|
||||
data = A10_GPIO_READ(sc, A10_GPIO_GP_DAT(bank));
|
||||
if (data & (1 << offset))
|
||||
data &= ~(1 << offset);
|
||||
if (data & (1 << pin))
|
||||
data &= ~(1 << pin);
|
||||
else
|
||||
data |= (1 << offset);
|
||||
data |= (1 << pin);
|
||||
A10_GPIO_WRITE(sc, A10_GPIO_GP_DAT(bank), data);
|
||||
A10_GPIO_UNLOCK(sc);
|
||||
|
||||
@ -424,14 +383,14 @@ a10_gpio_probe(device_t dev)
|
||||
static int
|
||||
a10_gpio_attach(device_t dev)
|
||||
{
|
||||
struct a10_gpio_softc *sc = device_get_softc(dev);
|
||||
uint32_t func;
|
||||
int i, rid;
|
||||
int rid;
|
||||
phandle_t gpio;
|
||||
struct a10_gpio_softc *sc;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
sc->sc_dev = dev;
|
||||
|
||||
mtx_init(&sc->sc_mtx, "a10 gpio", "gpio", MTX_DEF);
|
||||
mtx_init(&sc->sc_mtx, "a10 gpio", "gpio", MTX_SPIN);
|
||||
|
||||
rid = 0;
|
||||
sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
|
||||
@ -454,21 +413,10 @@ a10_gpio_attach(device_t dev)
|
||||
|
||||
/* Find our node. */
|
||||
gpio = ofw_bus_get_node(sc->sc_dev);
|
||||
|
||||
if (!OF_hasprop(gpio, "gpio-controller"))
|
||||
/* Node is not a GPIO controller. */
|
||||
goto fail;
|
||||
|
||||
/* Initialize the software controlled pins. */
|
||||
for (i = 0; i < A10_GPIO_PINS; i++) {
|
||||
snprintf(sc->sc_gpio_pins[i].gp_name, GPIOMAXNAME,
|
||||
"pin %d", i);
|
||||
func = a10_gpio_get_function(sc, i);
|
||||
sc->sc_gpio_pins[i].gp_pin = i;
|
||||
sc->sc_gpio_pins[i].gp_caps = A10_GPIO_DEFAULT_CAPS;
|
||||
sc->sc_gpio_pins[i].gp_flags = a10_gpio_func_flag(func);
|
||||
}
|
||||
sc->sc_gpio_npins = i;
|
||||
a10_gpio_sc = sc;
|
||||
sc->sc_busdev = gpiobus_attach_bus(dev);
|
||||
if (sc->sc_busdev == NULL)
|
||||
@ -493,6 +441,14 @@ a10_gpio_detach(device_t dev)
|
||||
return (EBUSY);
|
||||
}
|
||||
|
||||
static phandle_t
|
||||
a10_gpio_get_node(device_t dev, device_t bus)
|
||||
{
|
||||
|
||||
/* We only have one child, the GPIO bus, which needs our own node. */
|
||||
return (ofw_bus_get_node(dev));
|
||||
}
|
||||
|
||||
static device_method_t a10_gpio_methods[] = {
|
||||
/* Device interface */
|
||||
DEVMETHOD(device_probe, a10_gpio_probe),
|
||||
@ -510,6 +466,9 @@ static device_method_t a10_gpio_methods[] = {
|
||||
DEVMETHOD(gpio_pin_set, a10_gpio_pin_set),
|
||||
DEVMETHOD(gpio_pin_toggle, a10_gpio_pin_toggle),
|
||||
|
||||
/* ofw_bus interface */
|
||||
DEVMETHOD(ofw_bus_get_node, a10_gpio_get_node),
|
||||
|
||||
DEVMETHOD_END
|
||||
};
|
||||
|
||||
|
@ -44,6 +44,7 @@
|
||||
|
||||
#include "opt_compat.h"
|
||||
#include "opt_ddb.h"
|
||||
#include "opt_kstack_pages.h"
|
||||
#include "opt_platform.h"
|
||||
#include "opt_sched.h"
|
||||
#include "opt_timer.h"
|
||||
|
@ -542,8 +542,8 @@ abort_handler(struct trapframe *tf, int prefetch)
|
||||
return;
|
||||
}
|
||||
|
||||
ksig.sig = (rv == KERN_PROTECTION_FAILURE) ? SIGBUS : SIGSEGV;
|
||||
ksig.code = 0;
|
||||
ksig.sig = SIGSEGV;
|
||||
ksig.code = (rv == KERN_PROTECTION_FAILURE) ? SEGV_ACCERR : SEGV_MAPERR;
|
||||
ksig.addr = far;
|
||||
|
||||
do_trapsignal:
|
||||
|
@ -43,6 +43,7 @@
|
||||
* Created : 17/09/94
|
||||
*/
|
||||
|
||||
#include "opt_kstack_pages.h"
|
||||
#include "opt_platform.h"
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
@ -38,6 +38,8 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_kstack_pages.h"
|
||||
|
||||
#define _ARM32_BUS_DMA_PRIVATE
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
|
@ -32,7 +32,7 @@ makeoptions MODULES_EXTRA="dtb/am335x"
|
||||
options KDTRACE_HOOKS # Kernel DTrace hooks
|
||||
options DDB_CTF # all architectures - kernel ELF linker loads CTF data
|
||||
makeoptions WITH_CTF=1
|
||||
makeoptions MODULES_EXTRA+="opensolaris dtrace dtrace/lockstat dtrace/profile dtrace/fbt"
|
||||
makeoptions MODULES_EXTRA+="opensolaris dtrace dtrace/profile dtrace/fbt"
|
||||
|
||||
options HZ=100
|
||||
options SCHED_4BSD # 4BSD scheduler
|
||||
|
@ -98,7 +98,6 @@ options KDTRACE_HOOKS
|
||||
#device dtrace
|
||||
|
||||
# DTrace modules
|
||||
#device dtrace_lockstat
|
||||
#device dtrace_profile
|
||||
#device dtrace_sdt
|
||||
#device dtrace_fbt
|
||||
|
@ -32,6 +32,7 @@ options SYSVSHM # SYSV-style shared memory
|
||||
options SYSVMSG # SYSV-style message queues
|
||||
options SYSVSEM # SYSV-style semaphores
|
||||
options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
|
||||
options PRINTF_BUFR_SIZE=128 # Prevent printf output being interspersed.
|
||||
options KBD_INSTALL_CDEV # install a CDEV entry in /dev
|
||||
options FREEBSD_BOOT_LOADER # Process metadata passed from loader(8)
|
||||
options VFP # Enable floating point hardware support
|
||||
|
442
sys/arm/include/atomic-v4.h
Normal file
442
sys/arm/include/atomic-v4.h
Normal file
@ -0,0 +1,442 @@
|
||||
/* $NetBSD: atomic.h,v 1.1 2002/10/19 12:22:34 bsh Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (C) 2003-2004 Olivier Houchard
|
||||
* Copyright (C) 1994-1997 Mark Brinicombe
|
||||
* Copyright (C) 1994 Brini
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software written for Brini by Mark Brinicombe
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by Brini.
|
||||
* 4. The name of Brini may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL BRINI BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_ATOMIC_V4_H_
|
||||
#define _MACHINE_ATOMIC_V4_H_
|
||||
|
||||
#ifndef _MACHINE_ATOMIC_H_
|
||||
#error Do not include this file directly, use <machine/atomic.h>
|
||||
#endif
|
||||
|
||||
#if __ARM_ARCH <= 5
|
||||
#define isb() __asm __volatile("mcr p15, 0, %0, c7, c5, 4" : : "r" (0) : "memory")
|
||||
#define dsb() __asm __volatile("mcr p15, 0, %0, c7, c10, 4" : : "r" (0) : "memory")
|
||||
#define dmb() dsb()
|
||||
#else
|
||||
#error Only use this file with ARMv5 and earlier
|
||||
#endif
|
||||
|
||||
#define mb() dmb()
|
||||
#define wmb() dmb()
|
||||
#define rmb() dmb()
|
||||
|
||||
#define __with_interrupts_disabled(expr) \
|
||||
do { \
|
||||
u_int cpsr_save, tmp; \
|
||||
\
|
||||
__asm __volatile( \
|
||||
"mrs %0, cpsr;" \
|
||||
"orr %1, %0, %2;" \
|
||||
"msr cpsr_fsxc, %1;" \
|
||||
: "=r" (cpsr_save), "=r" (tmp) \
|
||||
: "I" (PSR_I | PSR_F) \
|
||||
: "cc" ); \
|
||||
(expr); \
|
||||
__asm __volatile( \
|
||||
"msr cpsr_fsxc, %0" \
|
||||
: /* no output */ \
|
||||
: "r" (cpsr_save) \
|
||||
: "cc" ); \
|
||||
} while(0)
|
||||
|
||||
static __inline uint32_t
|
||||
__swp(uint32_t val, volatile uint32_t *ptr)
|
||||
{
|
||||
__asm __volatile("swp %0, %2, [%3]"
|
||||
: "=&r" (val), "=m" (*ptr)
|
||||
: "r" (val), "r" (ptr), "m" (*ptr)
|
||||
: "memory");
|
||||
return (val);
|
||||
}
|
||||
|
||||
|
||||
#ifdef _KERNEL
|
||||
#define ARM_HAVE_ATOMIC64
|
||||
|
||||
static __inline void
|
||||
atomic_add_32(volatile u_int32_t *p, u_int32_t val)
|
||||
{
|
||||
__with_interrupts_disabled(*p += val);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_add_64(volatile u_int64_t *p, u_int64_t val)
|
||||
{
|
||||
__with_interrupts_disabled(*p += val);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_clear_32(volatile uint32_t *address, uint32_t clearmask)
|
||||
{
|
||||
__with_interrupts_disabled(*address &= ~clearmask);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_clear_64(volatile uint64_t *address, uint64_t clearmask)
|
||||
{
|
||||
__with_interrupts_disabled(*address &= ~clearmask);
|
||||
}
|
||||
|
||||
static __inline u_int32_t
|
||||
atomic_cmpset_32(volatile u_int32_t *p, volatile u_int32_t cmpval, volatile u_int32_t newval)
|
||||
{
|
||||
int ret;
|
||||
|
||||
__with_interrupts_disabled(
|
||||
{
|
||||
if (*p == cmpval) {
|
||||
*p = newval;
|
||||
ret = 1;
|
||||
} else {
|
||||
ret = 0;
|
||||
}
|
||||
});
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static __inline u_int64_t
|
||||
atomic_cmpset_64(volatile u_int64_t *p, volatile u_int64_t cmpval, volatile u_int64_t newval)
|
||||
{
|
||||
int ret;
|
||||
|
||||
__with_interrupts_disabled(
|
||||
{
|
||||
if (*p == cmpval) {
|
||||
*p = newval;
|
||||
ret = 1;
|
||||
} else {
|
||||
ret = 0;
|
||||
}
|
||||
});
|
||||
return (ret);
|
||||
}
|
||||
|
||||
|
||||
static __inline uint32_t
|
||||
atomic_fetchadd_32(volatile uint32_t *p, uint32_t v)
|
||||
{
|
||||
uint32_t value;
|
||||
|
||||
__with_interrupts_disabled(
|
||||
{
|
||||
value = *p;
|
||||
*p += v;
|
||||
});
|
||||
return (value);
|
||||
}
|
||||
|
||||
static __inline uint64_t
|
||||
atomic_fetchadd_64(volatile uint64_t *p, uint64_t v)
|
||||
{
|
||||
uint64_t value;
|
||||
|
||||
__with_interrupts_disabled(
|
||||
{
|
||||
value = *p;
|
||||
*p += v;
|
||||
});
|
||||
return (value);
|
||||
}
|
||||
|
||||
static __inline uint64_t
|
||||
atomic_load_64(volatile uint64_t *p)
|
||||
{
|
||||
uint64_t value;
|
||||
|
||||
__with_interrupts_disabled(value = *p);
|
||||
return (value);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_set_32(volatile uint32_t *address, uint32_t setmask)
|
||||
{
|
||||
__with_interrupts_disabled(*address |= setmask);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_set_64(volatile uint64_t *address, uint64_t setmask)
|
||||
{
|
||||
__with_interrupts_disabled(*address |= setmask);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_store_64(volatile uint64_t *p, uint64_t value)
|
||||
{
|
||||
__with_interrupts_disabled(*p = value);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_subtract_32(volatile u_int32_t *p, u_int32_t val)
|
||||
{
|
||||
__with_interrupts_disabled(*p -= val);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_subtract_64(volatile u_int64_t *p, u_int64_t val)
|
||||
{
|
||||
__with_interrupts_disabled(*p -= val);
|
||||
}
|
||||
|
||||
#else /* !_KERNEL */
|
||||
|
||||
static __inline void
|
||||
atomic_add_32(volatile u_int32_t *p, u_int32_t val)
|
||||
{
|
||||
int start, ras_start = ARM_RAS_START;
|
||||
|
||||
__asm __volatile("1:\n"
|
||||
"adr %1, 1b\n"
|
||||
"str %1, [%0]\n"
|
||||
"adr %1, 2f\n"
|
||||
"str %1, [%0, #4]\n"
|
||||
"ldr %1, [%2]\n"
|
||||
"add %1, %1, %3\n"
|
||||
"str %1, [%2]\n"
|
||||
"2:\n"
|
||||
"mov %1, #0\n"
|
||||
"str %1, [%0]\n"
|
||||
"mov %1, #0xffffffff\n"
|
||||
"str %1, [%0, #4]\n"
|
||||
: "+r" (ras_start), "=r" (start), "+r" (p), "+r" (val)
|
||||
: : "memory");
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_clear_32(volatile uint32_t *address, uint32_t clearmask)
|
||||
{
|
||||
int start, ras_start = ARM_RAS_START;
|
||||
|
||||
__asm __volatile("1:\n"
|
||||
"adr %1, 1b\n"
|
||||
"str %1, [%0]\n"
|
||||
"adr %1, 2f\n"
|
||||
"str %1, [%0, #4]\n"
|
||||
"ldr %1, [%2]\n"
|
||||
"bic %1, %1, %3\n"
|
||||
"str %1, [%2]\n"
|
||||
"2:\n"
|
||||
"mov %1, #0\n"
|
||||
"str %1, [%0]\n"
|
||||
"mov %1, #0xffffffff\n"
|
||||
"str %1, [%0, #4]\n"
|
||||
: "+r" (ras_start), "=r" (start), "+r" (address), "+r" (clearmask)
|
||||
: : "memory");
|
||||
|
||||
}
|
||||
|
||||
static __inline u_int32_t
|
||||
atomic_cmpset_32(volatile u_int32_t *p, volatile u_int32_t cmpval, volatile u_int32_t newval)
|
||||
{
|
||||
register int done, ras_start = ARM_RAS_START;
|
||||
|
||||
__asm __volatile("1:\n"
|
||||
"adr %1, 1b\n"
|
||||
"str %1, [%0]\n"
|
||||
"adr %1, 2f\n"
|
||||
"str %1, [%0, #4]\n"
|
||||
"ldr %1, [%2]\n"
|
||||
"cmp %1, %3\n"
|
||||
"streq %4, [%2]\n"
|
||||
"2:\n"
|
||||
"mov %1, #0\n"
|
||||
"str %1, [%0]\n"
|
||||
"mov %1, #0xffffffff\n"
|
||||
"str %1, [%0, #4]\n"
|
||||
"moveq %1, #1\n"
|
||||
"movne %1, #0\n"
|
||||
: "+r" (ras_start), "=r" (done)
|
||||
,"+r" (p), "+r" (cmpval), "+r" (newval) : : "cc", "memory");
|
||||
return (done);
|
||||
}
|
||||
|
||||
static __inline uint32_t
|
||||
atomic_fetchadd_32(volatile uint32_t *p, uint32_t v)
|
||||
{
|
||||
uint32_t start, tmp, ras_start = ARM_RAS_START;
|
||||
|
||||
__asm __volatile("1:\n"
|
||||
"adr %1, 1b\n"
|
||||
"str %1, [%0]\n"
|
||||
"adr %1, 2f\n"
|
||||
"str %1, [%0, #4]\n"
|
||||
"ldr %1, [%3]\n"
|
||||
"mov %2, %1\n"
|
||||
"add %2, %2, %4\n"
|
||||
"str %2, [%3]\n"
|
||||
"2:\n"
|
||||
"mov %2, #0\n"
|
||||
"str %2, [%0]\n"
|
||||
"mov %2, #0xffffffff\n"
|
||||
"str %2, [%0, #4]\n"
|
||||
: "+r" (ras_start), "=r" (start), "=r" (tmp), "+r" (p), "+r" (v)
|
||||
: : "memory");
|
||||
return (start);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_set_32(volatile uint32_t *address, uint32_t setmask)
|
||||
{
|
||||
int start, ras_start = ARM_RAS_START;
|
||||
|
||||
__asm __volatile("1:\n"
|
||||
"adr %1, 1b\n"
|
||||
"str %1, [%0]\n"
|
||||
"adr %1, 2f\n"
|
||||
"str %1, [%0, #4]\n"
|
||||
"ldr %1, [%2]\n"
|
||||
"orr %1, %1, %3\n"
|
||||
"str %1, [%2]\n"
|
||||
"2:\n"
|
||||
"mov %1, #0\n"
|
||||
"str %1, [%0]\n"
|
||||
"mov %1, #0xffffffff\n"
|
||||
"str %1, [%0, #4]\n"
|
||||
|
||||
: "+r" (ras_start), "=r" (start), "+r" (address), "+r" (setmask)
|
||||
: : "memory");
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_subtract_32(volatile u_int32_t *p, u_int32_t val)
|
||||
{
|
||||
int start, ras_start = ARM_RAS_START;
|
||||
|
||||
__asm __volatile("1:\n"
|
||||
"adr %1, 1b\n"
|
||||
"str %1, [%0]\n"
|
||||
"adr %1, 2f\n"
|
||||
"str %1, [%0, #4]\n"
|
||||
"ldr %1, [%2]\n"
|
||||
"sub %1, %1, %3\n"
|
||||
"str %1, [%2]\n"
|
||||
"2:\n"
|
||||
"mov %1, #0\n"
|
||||
"str %1, [%0]\n"
|
||||
"mov %1, #0xffffffff\n"
|
||||
"str %1, [%0, #4]\n"
|
||||
|
||||
: "+r" (ras_start), "=r" (start), "+r" (p), "+r" (val)
|
||||
: : "memory");
|
||||
}
|
||||
|
||||
#endif /* _KERNEL */
|
||||
|
||||
static __inline uint32_t
|
||||
atomic_readandclear_32(volatile u_int32_t *p)
|
||||
{
|
||||
|
||||
return (__swp(0, p));
|
||||
}
|
||||
|
||||
#define atomic_cmpset_rel_32 atomic_cmpset_32
|
||||
#define atomic_cmpset_acq_32 atomic_cmpset_32
|
||||
#define atomic_set_rel_32 atomic_set_32
|
||||
#define atomic_set_acq_32 atomic_set_32
|
||||
#define atomic_clear_rel_32 atomic_clear_32
|
||||
#define atomic_clear_acq_32 atomic_clear_32
|
||||
#define atomic_add_rel_32 atomic_add_32
|
||||
#define atomic_add_acq_32 atomic_add_32
|
||||
#define atomic_subtract_rel_32 atomic_subtract_32
|
||||
#define atomic_subtract_acq_32 atomic_subtract_32
|
||||
#define atomic_store_rel_32 atomic_store_32
|
||||
#define atomic_store_rel_long atomic_store_long
|
||||
#define atomic_load_acq_32 atomic_load_32
|
||||
#define atomic_load_acq_long atomic_load_long
|
||||
#define atomic_add_acq_long atomic_add_long
|
||||
#define atomic_add_rel_long atomic_add_long
|
||||
#define atomic_subtract_acq_long atomic_subtract_long
|
||||
#define atomic_subtract_rel_long atomic_subtract_long
|
||||
#define atomic_clear_acq_long atomic_clear_long
|
||||
#define atomic_clear_rel_long atomic_clear_long
|
||||
#define atomic_set_acq_long atomic_set_long
|
||||
#define atomic_set_rel_long atomic_set_long
|
||||
#define atomic_cmpset_acq_long atomic_cmpset_long
|
||||
#define atomic_cmpset_rel_long atomic_cmpset_long
|
||||
#define atomic_load_acq_long atomic_load_long
|
||||
#undef __with_interrupts_disabled
|
||||
|
||||
static __inline void
|
||||
atomic_add_long(volatile u_long *p, u_long v)
|
||||
{
|
||||
|
||||
atomic_add_32((volatile uint32_t *)p, v);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_clear_long(volatile u_long *p, u_long v)
|
||||
{
|
||||
|
||||
atomic_clear_32((volatile uint32_t *)p, v);
|
||||
}
|
||||
|
||||
static __inline int
|
||||
atomic_cmpset_long(volatile u_long *dst, u_long old, u_long newe)
|
||||
{
|
||||
|
||||
return (atomic_cmpset_32((volatile uint32_t *)dst, old, newe));
|
||||
}
|
||||
|
||||
static __inline u_long
|
||||
atomic_fetchadd_long(volatile u_long *p, u_long v)
|
||||
{
|
||||
|
||||
return (atomic_fetchadd_32((volatile uint32_t *)p, v));
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_readandclear_long(volatile u_long *p)
|
||||
{
|
||||
|
||||
atomic_readandclear_32((volatile uint32_t *)p);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_set_long(volatile u_long *p, u_long v)
|
||||
{
|
||||
|
||||
atomic_set_32((volatile uint32_t *)p, v);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_subtract_long(volatile u_long *p, u_long v)
|
||||
{
|
||||
|
||||
atomic_subtract_32((volatile uint32_t *)p, v);
|
||||
}
|
||||
|
||||
#endif /* _MACHINE_ATOMIC_H_ */
|
599
sys/arm/include/atomic-v6.h
Normal file
599
sys/arm/include/atomic-v6.h
Normal file
@ -0,0 +1,599 @@
|
||||
/* $NetBSD: atomic.h,v 1.1 2002/10/19 12:22:34 bsh Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (C) 2003-2004 Olivier Houchard
|
||||
* Copyright (C) 1994-1997 Mark Brinicombe
|
||||
* Copyright (C) 1994 Brini
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software written for Brini by Mark Brinicombe
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by Brini.
|
||||
* 4. The name of Brini may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL BRINI BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _MACHINE_ATOMIC_V6_H_
|
||||
#define _MACHINE_ATOMIC_V6_H_
|
||||
|
||||
#ifndef _MACHINE_ATOMIC_H_
|
||||
#error Do not include this file directly, use <machine/atomic.h>
|
||||
#endif
|
||||
|
||||
#if __ARM_ARCH >= 7
|
||||
#define isb() __asm __volatile("isb" : : : "memory")
|
||||
#define dsb() __asm __volatile("dsb" : : : "memory")
|
||||
#define dmb() __asm __volatile("dmb" : : : "memory")
|
||||
#elif __ARM_ARCH >= 6
|
||||
#define isb() __asm __volatile("mcr p15, 0, %0, c7, c5, 4" : : "r" (0) : "memory")
|
||||
#define dsb() __asm __volatile("mcr p15, 0, %0, c7, c10, 4" : : "r" (0) : "memory")
|
||||
#define dmb() __asm __volatile("mcr p15, 0, %0, c7, c10, 5" : : "r" (0) : "memory")
|
||||
#else
|
||||
#error Only use this file with ARMv6 and later
|
||||
#endif
|
||||
|
||||
#define mb() dmb()
|
||||
#define wmb() dmb()
|
||||
#define rmb() dmb()
|
||||
|
||||
#define ARM_HAVE_ATOMIC64
|
||||
|
||||
#define ATOMIC_ACQ_REL_LONG(NAME) \
|
||||
static __inline void \
|
||||
atomic_##NAME##_acq_long(__volatile u_long *p, u_long v) \
|
||||
{ \
|
||||
atomic_##NAME##_long(p, v); \
|
||||
dmb(); \
|
||||
} \
|
||||
\
|
||||
static __inline void \
|
||||
atomic_##NAME##_rel_long(__volatile u_long *p, u_long v) \
|
||||
{ \
|
||||
dmb(); \
|
||||
atomic_##NAME##_long(p, v); \
|
||||
}
|
||||
|
||||
#define ATOMIC_ACQ_REL(NAME, WIDTH) \
|
||||
static __inline void \
|
||||
atomic_##NAME##_acq_##WIDTH(__volatile uint##WIDTH##_t *p, uint##WIDTH##_t v)\
|
||||
{ \
|
||||
atomic_##NAME##_##WIDTH(p, v); \
|
||||
dmb(); \
|
||||
} \
|
||||
\
|
||||
static __inline void \
|
||||
atomic_##NAME##_rel_##WIDTH(__volatile uint##WIDTH##_t *p, uint##WIDTH##_t v)\
|
||||
{ \
|
||||
dmb(); \
|
||||
atomic_##NAME##_##WIDTH(p, v); \
|
||||
}
|
||||
|
||||
|
||||
static __inline void
|
||||
atomic_add_32(volatile uint32_t *p, uint32_t val)
|
||||
{
|
||||
uint32_t tmp = 0, tmp2 = 0;
|
||||
|
||||
__asm __volatile(
|
||||
"1: ldrex %0, [%2] \n"
|
||||
" add %0, %0, %3 \n"
|
||||
" strex %1, %0, [%2] \n"
|
||||
" cmp %1, #0 \n"
|
||||
" it ne \n"
|
||||
" bne 1b \n"
|
||||
: "=&r" (tmp), "+r" (tmp2)
|
||||
,"+r" (p), "+r" (val) : : "cc", "memory");
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_add_64(volatile uint64_t *p, uint64_t val)
|
||||
{
|
||||
uint64_t tmp;
|
||||
uint32_t exflag;
|
||||
|
||||
__asm __volatile(
|
||||
"1: \n"
|
||||
" ldrexd %Q[tmp], %R[tmp], [%[ptr]] \n"
|
||||
" adds %Q[tmp], %Q[val] \n"
|
||||
" adc %R[tmp], %R[tmp], %R[val] \n"
|
||||
" strexd %[exf], %Q[tmp], %R[tmp], [%[ptr]] \n"
|
||||
" teq %[exf], #0 \n"
|
||||
" it ne \n"
|
||||
" bne 1b \n"
|
||||
: [exf] "=&r" (exflag),
|
||||
[tmp] "=&r" (tmp)
|
||||
: [ptr] "r" (p),
|
||||
[val] "r" (val)
|
||||
: "cc", "memory");
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_add_long(volatile u_long *p, u_long val)
|
||||
{
|
||||
|
||||
atomic_add_32((volatile uint32_t *)p, val);
|
||||
}
|
||||
|
||||
ATOMIC_ACQ_REL(add, 32)
|
||||
ATOMIC_ACQ_REL(add, 64)
|
||||
ATOMIC_ACQ_REL_LONG(add)
|
||||
|
||||
static __inline void
|
||||
atomic_clear_32(volatile uint32_t *address, uint32_t setmask)
|
||||
{
|
||||
uint32_t tmp = 0, tmp2 = 0;
|
||||
|
||||
__asm __volatile(
|
||||
"1: ldrex %0, [%2] \n"
|
||||
" bic %0, %0, %3 \n"
|
||||
" strex %1, %0, [%2] \n"
|
||||
" cmp %1, #0 \n"
|
||||
" it ne \n"
|
||||
" bne 1b \n"
|
||||
: "=&r" (tmp), "+r" (tmp2), "+r" (address), "+r" (setmask)
|
||||
: : "cc", "memory");
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_clear_64(volatile uint64_t *p, uint64_t val)
|
||||
{
|
||||
uint64_t tmp;
|
||||
uint32_t exflag;
|
||||
|
||||
__asm __volatile(
|
||||
"1: \n"
|
||||
" ldrexd %Q[tmp], %R[tmp], [%[ptr]] \n"
|
||||
" bic %Q[tmp], %Q[val] \n"
|
||||
" bic %R[tmp], %R[val] \n"
|
||||
" strexd %[exf], %Q[tmp], %R[tmp], [%[ptr]] \n"
|
||||
" teq %[exf], #0 \n"
|
||||
" it ne \n"
|
||||
" bne 1b \n"
|
||||
: [exf] "=&r" (exflag),
|
||||
[tmp] "=&r" (tmp)
|
||||
: [ptr] "r" (p),
|
||||
[val] "r" (val)
|
||||
: "cc", "memory");
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_clear_long(volatile u_long *address, u_long setmask)
|
||||
{
|
||||
|
||||
atomic_clear_32((volatile uint32_t *)address, setmask);
|
||||
}
|
||||
|
||||
ATOMIC_ACQ_REL(clear, 32)
|
||||
ATOMIC_ACQ_REL(clear, 64)
|
||||
ATOMIC_ACQ_REL_LONG(clear)
|
||||
|
||||
static __inline uint32_t
|
||||
atomic_cmpset_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval)
|
||||
{
|
||||
uint32_t ret;
|
||||
|
||||
__asm __volatile(
|
||||
"1: ldrex %0, [%1] \n"
|
||||
" cmp %0, %2 \n"
|
||||
" itt ne \n"
|
||||
" movne %0, #0 \n"
|
||||
" bne 2f \n"
|
||||
" strex %0, %3, [%1] \n"
|
||||
" cmp %0, #0 \n"
|
||||
" ite eq \n"
|
||||
" moveq %0, #1 \n"
|
||||
" bne 1b \n"
|
||||
"2:"
|
||||
: "=&r" (ret), "+r" (p), "+r" (cmpval), "+r" (newval)
|
||||
: : "cc", "memory");
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static __inline int
|
||||
atomic_cmpset_64(volatile uint64_t *p, uint64_t cmpval, uint64_t newval)
|
||||
{
|
||||
uint64_t tmp;
|
||||
uint32_t ret;
|
||||
|
||||
__asm __volatile(
|
||||
"1: \n"
|
||||
" ldrexd %Q[tmp], %R[tmp], [%[ptr]] \n"
|
||||
" teq %Q[tmp], %Q[cmpval] \n"
|
||||
" itee eq \n"
|
||||
" teqeq %R[tmp], %R[cmpval] \n"
|
||||
" movne %[ret], #0 \n"
|
||||
" bne 2f \n"
|
||||
" strexd %[ret], %Q[newval], %R[newval], [%[ptr]]\n"
|
||||
" teq %[ret], #0 \n"
|
||||
" it ne \n"
|
||||
" bne 1b \n"
|
||||
" mov %[ret], #1 \n"
|
||||
"2: \n"
|
||||
: [ret] "=&r" (ret),
|
||||
[tmp] "=&r" (tmp)
|
||||
: [ptr] "r" (p),
|
||||
[cmpval] "r" (cmpval),
|
||||
[newval] "r" (newval)
|
||||
: "cc", "memory");
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static __inline u_long
|
||||
atomic_cmpset_long(volatile u_long *p, u_long cmpval, u_long newval)
|
||||
{
|
||||
|
||||
return (atomic_cmpset_32((volatile uint32_t *)p, cmpval, newval));
|
||||
}
|
||||
|
||||
static __inline uint32_t
|
||||
atomic_cmpset_acq_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval)
|
||||
{
|
||||
uint32_t ret;
|
||||
|
||||
ret = atomic_cmpset_32(p, cmpval, newval);
|
||||
dmb();
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static __inline uint64_t
|
||||
atomic_cmpset_acq_64(volatile uint64_t *p, uint64_t cmpval, uint64_t newval)
|
||||
{
|
||||
uint64_t ret;
|
||||
|
||||
ret = atomic_cmpset_64(p, cmpval, newval);
|
||||
dmb();
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static __inline u_long
|
||||
atomic_cmpset_acq_long(volatile u_long *p, u_long cmpval, u_long newval)
|
||||
{
|
||||
u_long ret;
|
||||
|
||||
ret = atomic_cmpset_long(p, cmpval, newval);
|
||||
dmb();
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static __inline uint32_t
|
||||
atomic_cmpset_rel_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval)
|
||||
{
|
||||
|
||||
dmb();
|
||||
return (atomic_cmpset_32(p, cmpval, newval));
|
||||
}
|
||||
|
||||
static __inline uint64_t
|
||||
atomic_cmpset_rel_64(volatile uint64_t *p, uint64_t cmpval, uint64_t newval)
|
||||
{
|
||||
|
||||
dmb();
|
||||
return (atomic_cmpset_64(p, cmpval, newval));
|
||||
}
|
||||
|
||||
static __inline u_long
|
||||
atomic_cmpset_rel_long(volatile u_long *p, u_long cmpval, u_long newval)
|
||||
{
|
||||
|
||||
dmb();
|
||||
return (atomic_cmpset_long(p, cmpval, newval));
|
||||
}
|
||||
|
||||
static __inline uint32_t
|
||||
atomic_fetchadd_32(volatile uint32_t *p, uint32_t val)
|
||||
{
|
||||
uint32_t tmp = 0, tmp2 = 0, ret = 0;
|
||||
|
||||
__asm __volatile(
|
||||
"1: ldrex %0, [%3] \n"
|
||||
" add %1, %0, %4 \n"
|
||||
" strex %2, %1, [%3] \n"
|
||||
" cmp %2, #0 \n"
|
||||
" it ne \n"
|
||||
" bne 1b \n"
|
||||
: "+r" (ret), "=&r" (tmp), "+r" (tmp2), "+r" (p), "+r" (val)
|
||||
: : "cc", "memory");
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static __inline uint64_t
|
||||
atomic_fetchadd_64(volatile uint64_t *p, uint64_t val)
|
||||
{
|
||||
uint64_t ret, tmp;
|
||||
uint32_t exflag;
|
||||
|
||||
__asm __volatile(
|
||||
"1: \n"
|
||||
" ldrexd %Q[tmp], %R[tmp], [%[ptr]] \n"
|
||||
" adds %Q[tmp], %Q[ret], %Q[val] \n"
|
||||
" adc %R[tmp], %R[ret], %R[val] \n"
|
||||
" strexd %[exf], %Q[tmp], %R[tmp], [%[ptr]] \n"
|
||||
" teq %[exf], #0 \n"
|
||||
" it ne \n"
|
||||
" bne 1b \n"
|
||||
: [ret] "=&r" (ret),
|
||||
[exf] "=&r" (exflag),
|
||||
[tmp] "=&r" (tmp)
|
||||
: [ptr] "r" (p),
|
||||
[val] "r" (val)
|
||||
: "cc", "memory");
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static __inline u_long
|
||||
atomic_fetchadd_long(volatile u_long *p, u_long val)
|
||||
{
|
||||
|
||||
return (atomic_fetchadd_32((volatile uint32_t *)p, val));
|
||||
}
|
||||
|
||||
static __inline uint32_t
|
||||
atomic_load_acq_32(volatile uint32_t *p)
|
||||
{
|
||||
uint32_t v;
|
||||
|
||||
v = *p;
|
||||
dmb();
|
||||
return (v);
|
||||
}
|
||||
|
||||
static __inline uint64_t
|
||||
atomic_load_64(volatile uint64_t *p)
|
||||
{
|
||||
uint64_t ret;
|
||||
|
||||
/*
|
||||
* The only way to atomically load 64 bits is with LDREXD which puts the
|
||||
* exclusive monitor into the exclusive state, so reset it to open state
|
||||
* with CLREX because we don't actually need to store anything.
|
||||
*/
|
||||
__asm __volatile(
|
||||
"ldrexd %Q[ret], %R[ret], [%[ptr]] \n"
|
||||
"clrex \n"
|
||||
: [ret] "=&r" (ret)
|
||||
: [ptr] "r" (p)
|
||||
: "cc", "memory");
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static __inline uint64_t
|
||||
atomic_load_acq_64(volatile uint64_t *p)
|
||||
{
|
||||
uint64_t ret;
|
||||
|
||||
ret = atomic_load_64(p);
|
||||
dmb();
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static __inline u_long
|
||||
atomic_load_acq_long(volatile u_long *p)
|
||||
{
|
||||
u_long v;
|
||||
|
||||
v = *p;
|
||||
dmb();
|
||||
return (v);
|
||||
}
|
||||
|
||||
static __inline uint32_t
|
||||
atomic_readandclear_32(volatile uint32_t *p)
|
||||
{
|
||||
uint32_t ret, tmp = 0, tmp2 = 0;
|
||||
|
||||
__asm __volatile(
|
||||
"1: ldrex %0, [%3] \n"
|
||||
" mov %1, #0 \n"
|
||||
" strex %2, %1, [%3] \n"
|
||||
" cmp %2, #0 \n"
|
||||
" it ne \n"
|
||||
" bne 1b \n"
|
||||
: "=r" (ret), "=&r" (tmp), "+r" (tmp2), "+r" (p)
|
||||
: : "cc", "memory");
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static __inline uint64_t
|
||||
atomic_readandclear_64(volatile uint64_t *p)
|
||||
{
|
||||
uint64_t ret, tmp;
|
||||
uint32_t exflag;
|
||||
|
||||
__asm __volatile(
|
||||
"1: \n"
|
||||
" ldrexd %Q[ret], %R[ret], [%[ptr]] \n"
|
||||
" mov %Q[tmp], #0 \n"
|
||||
" mov %R[tmp], #0 \n"
|
||||
" strexd %[exf], %Q[tmp], %R[tmp], [%[ptr]] \n"
|
||||
" teq %[exf], #0 \n"
|
||||
" it ne \n"
|
||||
" bne 1b \n"
|
||||
: [ret] "=&r" (ret),
|
||||
[exf] "=&r" (exflag),
|
||||
[tmp] "=&r" (tmp)
|
||||
: [ptr] "r" (p)
|
||||
: "cc", "memory");
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static __inline u_long
|
||||
atomic_readandclear_long(volatile u_long *p)
|
||||
{
|
||||
|
||||
return (atomic_readandclear_32((volatile uint32_t *)p));
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_set_32(volatile uint32_t *address, uint32_t setmask)
|
||||
{
|
||||
uint32_t tmp = 0, tmp2 = 0;
|
||||
|
||||
__asm __volatile(
|
||||
"1: ldrex %0, [%2] \n"
|
||||
" orr %0, %0, %3 \n"
|
||||
" strex %1, %0, [%2] \n"
|
||||
" cmp %1, #0 \n"
|
||||
" it ne \n"
|
||||
" bne 1b \n"
|
||||
: "=&r" (tmp), "+r" (tmp2), "+r" (address), "+r" (setmask)
|
||||
: : "cc", "memory");
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_set_64(volatile uint64_t *p, uint64_t val)
|
||||
{
|
||||
uint64_t tmp;
|
||||
uint32_t exflag;
|
||||
|
||||
__asm __volatile(
|
||||
"1: \n"
|
||||
" ldrexd %Q[tmp], %R[tmp], [%[ptr]] \n"
|
||||
" orr %Q[tmp], %Q[val] \n"
|
||||
" orr %R[tmp], %R[val] \n"
|
||||
" strexd %[exf], %Q[tmp], %R[tmp], [%[ptr]] \n"
|
||||
" teq %[exf], #0 \n"
|
||||
" it ne \n"
|
||||
" bne 1b \n"
|
||||
: [exf] "=&r" (exflag),
|
||||
[tmp] "=&r" (tmp)
|
||||
: [ptr] "r" (p),
|
||||
[val] "r" (val)
|
||||
: "cc", "memory");
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_set_long(volatile u_long *address, u_long setmask)
|
||||
{
|
||||
|
||||
atomic_set_32((volatile uint32_t *)address, setmask);
|
||||
}
|
||||
|
||||
ATOMIC_ACQ_REL(set, 32)
|
||||
ATOMIC_ACQ_REL(set, 64)
|
||||
ATOMIC_ACQ_REL_LONG(set)
|
||||
|
||||
static __inline void
|
||||
atomic_subtract_32(volatile uint32_t *p, uint32_t val)
|
||||
{
|
||||
uint32_t tmp = 0, tmp2 = 0;
|
||||
|
||||
__asm __volatile(
|
||||
"1: ldrex %0, [%2] \n"
|
||||
" sub %0, %0, %3 \n"
|
||||
" strex %1, %0, [%2] \n"
|
||||
" cmp %1, #0 \n"
|
||||
" it ne \n"
|
||||
" bne 1b \n"
|
||||
: "=&r" (tmp), "+r" (tmp2), "+r" (p), "+r" (val)
|
||||
: : "cc", "memory");
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_subtract_64(volatile uint64_t *p, uint64_t val)
|
||||
{
|
||||
uint64_t tmp;
|
||||
uint32_t exflag;
|
||||
|
||||
__asm __volatile(
|
||||
"1: \n"
|
||||
" ldrexd %Q[tmp], %R[tmp], [%[ptr]] \n"
|
||||
" subs %Q[tmp], %Q[val] \n"
|
||||
" sbc %R[tmp], %R[tmp], %R[val] \n"
|
||||
" strexd %[exf], %Q[tmp], %R[tmp], [%[ptr]] \n"
|
||||
" teq %[exf], #0 \n"
|
||||
" it ne \n"
|
||||
" bne 1b \n"
|
||||
: [exf] "=&r" (exflag),
|
||||
[tmp] "=&r" (tmp)
|
||||
: [ptr] "r" (p),
|
||||
[val] "r" (val)
|
||||
: "cc", "memory");
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_subtract_long(volatile u_long *p, u_long val)
|
||||
{
|
||||
|
||||
atomic_subtract_32((volatile uint32_t *)p, val);
|
||||
}
|
||||
|
||||
ATOMIC_ACQ_REL(subtract, 32)
|
||||
ATOMIC_ACQ_REL(subtract, 64)
|
||||
ATOMIC_ACQ_REL_LONG(subtract)
|
||||
|
||||
static __inline void
|
||||
atomic_store_64(volatile uint64_t *p, uint64_t val)
|
||||
{
|
||||
uint64_t tmp;
|
||||
uint32_t exflag;
|
||||
|
||||
/*
|
||||
* The only way to atomically store 64 bits is with STREXD, which will
|
||||
* succeed only if paired up with a preceeding LDREXD using the same
|
||||
* address, so we read and discard the existing value before storing.
|
||||
*/
|
||||
__asm __volatile(
|
||||
"1: \n"
|
||||
" ldrexd %Q[tmp], %R[tmp], [%[ptr]] \n"
|
||||
" strexd %[exf], %Q[val], %R[val], [%[ptr]] \n"
|
||||
" teq %[exf], #0 \n"
|
||||
" it ne \n"
|
||||
" bne 1b \n"
|
||||
: [tmp] "=&r" (tmp),
|
||||
[exf] "=&r" (exflag)
|
||||
: [ptr] "r" (p),
|
||||
[val] "r" (val)
|
||||
: "cc", "memory");
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_store_rel_32(volatile uint32_t *p, uint32_t v)
|
||||
{
|
||||
|
||||
dmb();
|
||||
*p = v;
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_store_rel_64(volatile uint64_t *p, uint64_t val)
|
||||
{
|
||||
|
||||
dmb();
|
||||
atomic_store_64(p, val);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
atomic_store_rel_long(volatile u_long *p, u_long v)
|
||||
{
|
||||
|
||||
dmb();
|
||||
*p = v;
|
||||
}
|
||||
|
||||
#undef ATOMIC_ACQ_REL
|
||||
#undef ATOMIC_ACQ_REL_LONG
|
||||
|
||||
#endif /* _MACHINE_ATOMIC_V6_H_ */
|
File diff suppressed because it is too large
Load Diff
@ -44,6 +44,7 @@
|
||||
*/
|
||||
|
||||
#include "opt_ddb.h"
|
||||
#include "opt_kstack_pages.h"
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
@ -48,6 +48,8 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_kstack_pages.h"
|
||||
|
||||
#define _ARM32_BUS_DMA_PRIVATE
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
|
@ -48,6 +48,8 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_kstack_pages.h"
|
||||
|
||||
#define _ARM32_BUS_DMA_PRIVATE
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
|
@ -48,6 +48,8 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_kstack_pages.h"
|
||||
|
||||
#define _ARM32_BUS_DMA_PRIVATE
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
|
@ -48,6 +48,8 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_kstack_pages.h"
|
||||
|
||||
#define _ARM32_BUS_DMA_PRIVATE
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
|
@ -46,6 +46,7 @@
|
||||
*/
|
||||
|
||||
#include "opt_ddb.h"
|
||||
#include "opt_kstack_pages.h"
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
76
sys/arm64/acpica/pci_cfgreg.c
Normal file
76
sys/arm64/acpica/pci_cfgreg.c
Normal file
@ -0,0 +1,76 @@
|
||||
/*-
|
||||
* Copyright (c) 2015 The FreeBSD Foundation
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by Semihalf under
|
||||
* the sponsorship of the FreeBSD Foundation.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
|
||||
#include <machine/pci_cfgreg.h>
|
||||
|
||||
/*
|
||||
* This file contains stubs for ACPI PCI functions
|
||||
*/
|
||||
|
||||
/*
|
||||
* Read configuration space register
|
||||
*/
|
||||
uint32_t
|
||||
pci_cfgregread(int bus, int slot, int func, int reg, int bytes)
|
||||
{
|
||||
|
||||
/* ARM64TODO */
|
||||
panic("pci_cfgregread not implemented");
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Write configuration space register
|
||||
*/
|
||||
void
|
||||
pci_cfgregwrite(int bus, int slot, int func, int reg, u_int32_t data, int bytes)
|
||||
{
|
||||
|
||||
/* ARM64TODO */
|
||||
panic("pci_cfgregwrite not implemented");
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize access to configuration space
|
||||
*/
|
||||
int
|
||||
pci_cfgregopen(void)
|
||||
{
|
||||
|
||||
/* ARM64TODO */
|
||||
panic("pci_cfgregopen not implemented");
|
||||
return (0);
|
||||
}
|
@ -61,17 +61,18 @@ __FBSDID("$FreeBSD$");
|
||||
add x1, x1, x2 /* Add these to the size */
|
||||
bic x0, x0, x4 /* Clear the low bit of the address */
|
||||
1:
|
||||
dc \dcop, x0
|
||||
dsb ish
|
||||
.if \ic != 0
|
||||
ic \icop, x0
|
||||
dsb ish
|
||||
.endif
|
||||
dc \dcop, x0
|
||||
add x0, x0, x3 /* Move to the next line */
|
||||
subs x1, x1, x3 /* Reduce the size */
|
||||
b.hi 1b /* Check if we are done */
|
||||
.if \ic != 0
|
||||
isb
|
||||
.endif
|
||||
dsb ish
|
||||
ret
|
||||
.endm
|
||||
|
||||
|
@ -52,6 +52,7 @@ static struct ofw_compat_data compat_data[] = {
|
||||
{"arm,cortex-a7-gic", true},
|
||||
{"arm,arm11mp-gic", true},
|
||||
{"brcm,brahma-b15-gic", true},
|
||||
{"qcom,msm-qgic2", true},
|
||||
{NULL, false}
|
||||
};
|
||||
|
||||
|
@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
|
||||
#include <dev/pci/pcireg.h>
|
||||
#include <dev/pci/pcivar.h>
|
||||
|
||||
#include <vm/vm.h>
|
||||
@ -89,6 +90,7 @@ static void its_free_tables(struct gic_v3_its_softc *);
|
||||
static void its_init_commandq(struct gic_v3_its_softc *);
|
||||
static int its_init_cpu(struct gic_v3_its_softc *);
|
||||
static void its_init_cpu_collection(struct gic_v3_its_softc *);
|
||||
static uint32_t its_get_devid(device_t);
|
||||
|
||||
static int its_cmd_send(struct gic_v3_its_softc *, struct its_cmd_desc *);
|
||||
|
||||
@ -133,6 +135,23 @@ const char *its_ptab_type[] = {
|
||||
[GITS_BASER_TYPE_RES7] = "Reserved (7)",
|
||||
};
|
||||
|
||||
/*
|
||||
* Vendor specific quirks.
|
||||
* One needs to add appropriate entry to its_quirks[]
|
||||
* table if the imlementation varies from the generic ARM ITS.
|
||||
*/
|
||||
|
||||
/* Cavium ThunderX PCI devid acquire function */
|
||||
static uint32_t its_get_devid_thunder(device_t);
|
||||
|
||||
static const struct its_quirks its_quirks[] = {
|
||||
{
|
||||
.cpuid = CPU_ID_RAW(CPU_IMPL_CAVIUM, CPU_PART_THUNDER, 0, 0),
|
||||
.cpuid_mask = CPU_IMPL_MASK | CPU_PART_MASK,
|
||||
.devid_func = its_get_devid_thunder,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gic_v3_its_softc *its_sc;
|
||||
|
||||
#define gic_its_read(sc, len, reg) \
|
||||
@ -794,6 +813,26 @@ lpi_alloc_chunk(struct gic_v3_its_softc *sc, struct lpi_chunk *lpic,
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
lpi_free_chunk(struct gic_v3_its_softc *sc, struct lpi_chunk *lpic)
|
||||
{
|
||||
int start, end;
|
||||
uint8_t *bitmap;
|
||||
|
||||
bitmap = (uint8_t *)sc->its_lpi_bitmap;
|
||||
|
||||
KASSERT((lpic->lpi_free == lpic->lpi_num),
|
||||
("Trying to free LPI chunk that is still in use.\n"));
|
||||
|
||||
/* First bit of this chunk in a global bitmap */
|
||||
start = lpic->lpi_base - GIC_FIRST_LPI;
|
||||
/* and last bit of this chunk... */
|
||||
end = start + lpic->lpi_num - 1;
|
||||
|
||||
/* Finally free this chunk */
|
||||
bit_nclear(bitmap, start, end);
|
||||
}
|
||||
|
||||
static void
|
||||
lpi_configure(struct gic_v3_its_softc *sc, struct its_dev *its_dev,
|
||||
uint32_t lpinum, boolean_t unmask)
|
||||
@ -1300,10 +1339,13 @@ its_device_alloc_locked(struct gic_v3_its_softc *sc, device_t pci_dev,
|
||||
if (newdev != NULL)
|
||||
return (newdev);
|
||||
|
||||
devid = PCI_DEVID(pci_dev);
|
||||
devid = its_get_devid(pci_dev);
|
||||
|
||||
/* There was no previously created device. Create one now */
|
||||
newdev = malloc(sizeof(*newdev), M_GIC_V3_ITS, (M_WAITOK | M_ZERO));
|
||||
newdev = malloc(sizeof(*newdev), M_GIC_V3_ITS, (M_NOWAIT | M_ZERO));
|
||||
if (newdev == NULL)
|
||||
return (NULL);
|
||||
|
||||
newdev->pci_dev = pci_dev;
|
||||
newdev->devid = devid;
|
||||
|
||||
@ -1321,7 +1363,12 @@ its_device_alloc_locked(struct gic_v3_its_softc *sc, device_t pci_dev,
|
||||
*/
|
||||
newdev->itt = (vm_offset_t)contigmalloc(
|
||||
roundup2(roundup2(nvecs, 2) * esize, 0x100), M_GIC_V3_ITS,
|
||||
(M_WAITOK | M_ZERO), 0, ~0UL, 0x100, 0);
|
||||
(M_NOWAIT | M_ZERO), 0, ~0UL, 0x100, 0);
|
||||
if (newdev->itt == 0) {
|
||||
lpi_free_chunk(sc, &newdev->lpis);
|
||||
free(newdev, M_GIC_V3_ITS);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX ARM64TODO: Currently all interrupts are going
|
||||
@ -1353,6 +1400,77 @@ its_device_asign_lpi_locked(struct gic_v3_its_softc *sc,
|
||||
its_dev->lpis.lpi_free);
|
||||
its_dev->lpis.lpi_free--;
|
||||
}
|
||||
|
||||
/*
|
||||
* ITS quirks.
|
||||
* Add vendor specific PCI devid function here.
|
||||
*/
|
||||
static uint32_t
|
||||
its_get_devid_thunder(device_t pci_dev)
|
||||
{
|
||||
int bsf;
|
||||
int pem;
|
||||
uint32_t bus;
|
||||
|
||||
bus = pci_get_bus(pci_dev);
|
||||
|
||||
bsf = PCI_RID(pci_get_bus(pci_dev), pci_get_slot(pci_dev),
|
||||
pci_get_function(pci_dev));
|
||||
|
||||
/* ECAM is on bus=0 */
|
||||
if (bus == 0) {
|
||||
return ((pci_get_domain(pci_dev) << PCI_RID_DOMAIN_SHIFT) |
|
||||
bsf);
|
||||
/* PEM otherwise */
|
||||
} else {
|
||||
/* PEM (PCIe MAC/root complex) number is equal to domain */
|
||||
pem = pci_get_domain(pci_dev);
|
||||
|
||||
/*
|
||||
* Set appropriate device ID (passed by the HW along with
|
||||
* the transaction to memory) for different root complex
|
||||
* numbers using hard-coded domain portion for each group.
|
||||
*/
|
||||
if (pem < 3)
|
||||
return ((0x1 << PCI_RID_DOMAIN_SHIFT) | bsf);
|
||||
|
||||
if (pem < 6)
|
||||
return ((0x3 << PCI_RID_DOMAIN_SHIFT) | bsf);
|
||||
|
||||
if (pem < 9)
|
||||
return ((0x9 << PCI_RID_DOMAIN_SHIFT) | bsf);
|
||||
|
||||
if (pem < 12)
|
||||
return ((0xB << PCI_RID_DOMAIN_SHIFT) | bsf);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static __inline uint32_t
|
||||
its_get_devid_default(device_t pci_dev)
|
||||
{
|
||||
|
||||
return (PCI_DEVID_GENERIC(pci_dev));
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
its_get_devid(device_t pci_dev)
|
||||
{
|
||||
const struct its_quirks *quirk;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < nitems(its_quirks); i++) {
|
||||
quirk = &its_quirks[i];
|
||||
if (CPU_MATCH_RAW(quirk->cpuid_mask, quirk->cpuid)) {
|
||||
if (quirk->devid_func != NULL)
|
||||
return ((*quirk->devid_func)(pci_dev));
|
||||
}
|
||||
}
|
||||
|
||||
return (its_get_devid_default(pci_dev));
|
||||
}
|
||||
|
||||
/*
|
||||
* Message signalled interrupts handling.
|
||||
*/
|
||||
|
@ -234,6 +234,15 @@ struct gic_v3_its_softc {
|
||||
struct mtx its_spin_mtx;
|
||||
};
|
||||
|
||||
/* Stuff that is specific to the vendor's implementation */
|
||||
typedef uint32_t (*its_devid_func_t)(device_t);
|
||||
|
||||
struct its_quirks {
|
||||
uint64_t cpuid;
|
||||
uint64_t cpuid_mask;
|
||||
its_devid_func_t devid_func;
|
||||
};
|
||||
|
||||
extern devclass_t gic_v3_its_devclass;
|
||||
|
||||
int gic_v3_its_detach(device_t);
|
||||
@ -277,13 +286,12 @@ void lpi_mask_irq(device_t, uint32_t);
|
||||
reg, val); \
|
||||
})
|
||||
|
||||
#define PCI_DEVID(pci_dev) \
|
||||
({ \
|
||||
(((pci_get_domain(pci_dev) >> 2) << 19) | \
|
||||
((pci_get_domain(pci_dev) % 4) << 16) | \
|
||||
(pci_get_bus(pci_dev) << 8) | \
|
||||
(pci_get_slot(pci_dev) << 3) | \
|
||||
(pci_get_function(pci_dev) << 0)); \
|
||||
#define PCI_DEVID_GENERIC(pci_dev) \
|
||||
({ \
|
||||
((pci_get_domain(pci_dev) << PCI_RID_DOMAIN_SHIFT) | \
|
||||
(pci_get_bus(pci_dev) << PCI_RID_BUS_SHIFT) | \
|
||||
(pci_get_slot(pci_dev) << PCI_RID_SLOT_SHIFT) | \
|
||||
(pci_get_function(pci_dev) << PCI_RID_FUNC_SHIFT)); \
|
||||
})
|
||||
|
||||
/*
|
||||
|
@ -451,8 +451,7 @@ void
|
||||
arm_setup_ipihandler(driver_filter_t *filt, u_int ipi)
|
||||
{
|
||||
|
||||
/* ARM64TODO: The hard coded 16 will be fixed with am_intrng */
|
||||
arm_setup_intr("ipi", filt, NULL, (void *)((uintptr_t)ipi | 1<<16), ipi + 16,
|
||||
arm_setup_intr("ipi", filt, NULL, (void *)((uintptr_t)ipi | 1<<16), ipi,
|
||||
INTR_TYPE_MISC | INTR_EXCL, NULL);
|
||||
arm_unmask_ipi(ipi);
|
||||
}
|
||||
@ -460,7 +459,8 @@ arm_setup_ipihandler(driver_filter_t *filt, u_int ipi)
|
||||
void
|
||||
arm_unmask_ipi(u_int ipi)
|
||||
{
|
||||
PIC_UNMASK(root_pic, ipi + 16);
|
||||
|
||||
PIC_UNMASK(root_pic, ipi);
|
||||
}
|
||||
|
||||
void
|
||||
@ -494,9 +494,6 @@ ipi_cpu(int cpu, u_int ipi)
|
||||
CPU_ZERO(&cpus);
|
||||
CPU_SET(cpu, &cpus);
|
||||
|
||||
/* ARM64TODO: This will be fixed with arm_intrng */
|
||||
ipi += 16;
|
||||
|
||||
CTR2(KTR_SMP, "ipi_cpu: cpu: %d, ipi: %x", cpu, ipi);
|
||||
PIC_IPI_SEND(root_pic, cpus, ipi);
|
||||
}
|
||||
@ -505,9 +502,6 @@ void
|
||||
ipi_selected(cpuset_t cpus, u_int ipi)
|
||||
{
|
||||
|
||||
/* ARM64TODO: This will be fixed with arm_intrng */
|
||||
ipi += 16;
|
||||
|
||||
CTR1(KTR_SMP, "ipi_selected: ipi: %x", ipi);
|
||||
PIC_IPI_SEND(root_pic, cpus, ipi);
|
||||
}
|
||||
|
@ -27,6 +27,7 @@
|
||||
*/
|
||||
|
||||
#include "assym.s"
|
||||
#include "opt_kstack_pages.h"
|
||||
#include <sys/syscall.h>
|
||||
#include <machine/asm.h>
|
||||
#include <machine/armreg.h>
|
||||
@ -51,8 +52,6 @@
|
||||
* We are loaded at a 2MiB aligned address
|
||||
*/
|
||||
|
||||
#define INIT_STACK_SIZE (PAGE_SIZE * 4)
|
||||
|
||||
.text
|
||||
.globl _start
|
||||
_start:
|
||||
@ -180,8 +179,7 @@ ENTRY(mpentry)
|
||||
mp_virtdone:
|
||||
ldr x4, =secondary_stacks
|
||||
mov x5, #(PAGE_SIZE * KSTACK_PAGES)
|
||||
sub x1, x0, #1
|
||||
mul x5, x1, x5
|
||||
mul x5, x0, x5
|
||||
add sp, x4, x5
|
||||
|
||||
b init_secondary
|
||||
@ -469,6 +467,9 @@ build_block_pagetable:
|
||||
lsl x12, x7, #2
|
||||
orr x12, x12, #L2_BLOCK
|
||||
orr x12, x12, #(ATTR_AF)
|
||||
#ifdef SMP
|
||||
orr x12, x12, ATTR_SH(ATTR_SH_IS)
|
||||
#endif
|
||||
|
||||
/* Only use the output address bits */
|
||||
lsr x9, x9, #L2_SHIFT
|
||||
@ -532,7 +533,8 @@ mair:
|
||||
/* Device Normal, no cache Normal, write-back */
|
||||
.quad MAIR_ATTR(0x00, 0) | MAIR_ATTR(0x44, 1) | MAIR_ATTR(0xff, 2)
|
||||
tcr:
|
||||
.quad (TCR_TxSZ(64 - VIRT_BITS) | TCR_ASID_16 | TCR_TG1_4K)
|
||||
.quad (TCR_TxSZ(64 - VIRT_BITS) | TCR_ASID_16 | TCR_TG1_4K | \
|
||||
TCR_CACHE_ATTRS | TCR_SMP_ATTRS)
|
||||
sctlr_set:
|
||||
/* Bits to set */
|
||||
.quad (SCTLR_UCI | SCTLR_nTWE | SCTLR_nTWI | SCTLR_UCT | SCTLR_DZE | \
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user