Merged ^/head r283871 through r284187.
This commit is contained in:
commit
3adc74c768
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/projects/clang-trunk/; revision=284188
9
UPDATING
9
UPDATING
@ -36,6 +36,15 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 11.x IS SLOW:
|
|||||||
20141231 entry below for information about prerequisites and upgrading,
|
20141231 entry below for information about prerequisites and upgrading,
|
||||||
if you are not already using 3.5.0 or higher.
|
if you are not already using 3.5.0 or higher.
|
||||||
|
|
||||||
|
20150604:
|
||||||
|
Generation of legacy formatted entries have been disabled by default
|
||||||
|
in pwd_mkdb(8), as all base system consumers of the legacy formatted
|
||||||
|
entries were converted to use the new format by default when the new,
|
||||||
|
machine independent format have been added and supported since FreeBSD
|
||||||
|
5.x.
|
||||||
|
|
||||||
|
Please see the pwd_mkdb(8) manual page for further details.
|
||||||
|
|
||||||
20150525:
|
20150525:
|
||||||
Clang and llvm have been upgraded to 3.6.1 release. Please see the
|
Clang and llvm have been upgraded to 3.6.1 release. Please see the
|
||||||
20141231 entry below for information about prerequisites and upgrading,
|
20141231 entry below for information about prerequisites and upgrading,
|
||||||
|
@ -162,14 +162,16 @@ done: argv += optind;
|
|||||||
atflag = AT_SYMLINK_NOFOLLOW;
|
atflag = AT_SYMLINK_NOFOLLOW;
|
||||||
|
|
||||||
switch (p->fts_info) {
|
switch (p->fts_info) {
|
||||||
case FTS_D: /* Change it at FTS_DP. */
|
case FTS_D:
|
||||||
if (!Rflag)
|
if (!Rflag)
|
||||||
fts_set(ftsp, p, FTS_SKIP);
|
fts_set(ftsp, p, FTS_SKIP);
|
||||||
continue;
|
break;
|
||||||
case FTS_DNR: /* Warn, chmod. */
|
case FTS_DNR: /* Warn, chmod. */
|
||||||
warnx("%s: %s", p->fts_path, strerror(p->fts_errno));
|
warnx("%s: %s", p->fts_path, strerror(p->fts_errno));
|
||||||
rval = 1;
|
rval = 1;
|
||||||
break;
|
break;
|
||||||
|
case FTS_DP: /* Already changed at FTS_D. */
|
||||||
|
continue;
|
||||||
case FTS_ERR: /* Warn, continue. */
|
case FTS_ERR: /* Warn, continue. */
|
||||||
case FTS_NS:
|
case FTS_NS:
|
||||||
warnx("%s: %s", p->fts_path, strerror(p->fts_errno));
|
warnx("%s: %s", p->fts_path, strerror(p->fts_errno));
|
||||||
|
13
bin/cp/cp.1
13
bin/cp/cp.1
@ -32,7 +32,7 @@
|
|||||||
.\" @(#)cp.1 8.3 (Berkeley) 4/18/94
|
.\" @(#)cp.1 8.3 (Berkeley) 4/18/94
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd March 15, 2013
|
.Dd June 6, 2015
|
||||||
.Dt CP 1
|
.Dt CP 1
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -45,7 +45,7 @@
|
|||||||
.Op Fl H | Fl L | Fl P
|
.Op Fl H | Fl L | Fl P
|
||||||
.Oc
|
.Oc
|
||||||
.Op Fl f | i | n
|
.Op Fl f | i | n
|
||||||
.Op Fl alpvx
|
.Op Fl alpsvx
|
||||||
.Ar source_file target_file
|
.Ar source_file target_file
|
||||||
.Nm
|
.Nm
|
||||||
.Oo
|
.Oo
|
||||||
@ -53,7 +53,7 @@
|
|||||||
.Op Fl H | Fl L | Fl P
|
.Op Fl H | Fl L | Fl P
|
||||||
.Oc
|
.Oc
|
||||||
.Op Fl f | i | n
|
.Op Fl f | i | n
|
||||||
.Op Fl alpvx
|
.Op Fl alpsvx
|
||||||
.Ar source_file ... target_directory
|
.Ar source_file ... target_directory
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
In the first synopsis form, the
|
In the first synopsis form, the
|
||||||
@ -179,6 +179,8 @@ If the source file has both its set-user-ID and set-group-ID bits on,
|
|||||||
and either the user ID or group ID cannot be preserved, neither
|
and either the user ID or group ID cannot be preserved, neither
|
||||||
the set-user-ID nor set-group-ID bits are preserved in the copy's
|
the set-user-ID nor set-group-ID bits are preserved in the copy's
|
||||||
permissions.
|
permissions.
|
||||||
|
.It Fl s
|
||||||
|
Create symbolic links to regular files in a hierarchy instead of copying.
|
||||||
.It Fl v
|
.It Fl v
|
||||||
Cause
|
Cause
|
||||||
.Nm
|
.Nm
|
||||||
@ -298,7 +300,10 @@ differ as they copy special files as normal
|
|||||||
files while recreating a hierarchy.
|
files while recreating a hierarchy.
|
||||||
.Pp
|
.Pp
|
||||||
The
|
The
|
||||||
.Fl v
|
.Fl l,
|
||||||
|
.Fl s,
|
||||||
|
.Fl v,
|
||||||
|
.Fl x
|
||||||
and
|
and
|
||||||
.Fl n
|
.Fl n
|
||||||
options are non-standard and their use in scripts is not recommended.
|
options are non-standard and their use in scripts is not recommended.
|
||||||
|
40
bin/cp/cp.c
40
bin/cp/cp.c
@ -75,15 +75,15 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include "extern.h"
|
#include "extern.h"
|
||||||
|
|
||||||
#define STRIP_TRAILING_SLASH(p) { \
|
#define STRIP_TRAILING_SLASH(p) { \
|
||||||
while ((p).p_end > (p).p_path + 1 && (p).p_end[-1] == '/') \
|
while ((p).p_end > (p).p_path + 1 && (p).p_end[-1] == '/') \
|
||||||
*--(p).p_end = 0; \
|
*--(p).p_end = 0; \
|
||||||
}
|
}
|
||||||
|
|
||||||
static char emptystring[] = "";
|
static char emptystring[] = "";
|
||||||
|
|
||||||
PATH_T to = { to.p_path, emptystring, "" };
|
PATH_T to = { to.p_path, emptystring, "" };
|
||||||
|
|
||||||
int fflag, iflag, lflag, nflag, pflag, vflag;
|
int fflag, iflag, lflag, nflag, pflag, sflag, vflag;
|
||||||
static int Rflag, rflag;
|
static int Rflag, rflag;
|
||||||
volatile sig_atomic_t info;
|
volatile sig_atomic_t info;
|
||||||
|
|
||||||
@ -102,7 +102,7 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
fts_options = FTS_NOCHDIR | FTS_PHYSICAL;
|
fts_options = FTS_NOCHDIR | FTS_PHYSICAL;
|
||||||
Hflag = Lflag = 0;
|
Hflag = Lflag = 0;
|
||||||
while ((ch = getopt(argc, argv, "HLPRafilnprvx")) != -1)
|
while ((ch = getopt(argc, argv, "HLPRafilnprsvx")) != -1)
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 'H':
|
case 'H':
|
||||||
Hflag = 1;
|
Hflag = 1;
|
||||||
@ -145,6 +145,9 @@ main(int argc, char *argv[])
|
|||||||
rflag = Lflag = 1;
|
rflag = Lflag = 1;
|
||||||
Hflag = 0;
|
Hflag = 0;
|
||||||
break;
|
break;
|
||||||
|
case 's':
|
||||||
|
sflag = 1;
|
||||||
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
vflag = 1;
|
vflag = 1;
|
||||||
break;
|
break;
|
||||||
@ -163,6 +166,8 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
if (Rflag && rflag)
|
if (Rflag && rflag)
|
||||||
errx(1, "the -R and -r options may not be specified together");
|
errx(1, "the -R and -r options may not be specified together");
|
||||||
|
if (lflag && sflag)
|
||||||
|
errx(1, "the -l and -s options may not be specified together");
|
||||||
if (rflag)
|
if (rflag)
|
||||||
Rflag = 1;
|
Rflag = 1;
|
||||||
if (Rflag) {
|
if (Rflag) {
|
||||||
@ -183,7 +188,7 @@ main(int argc, char *argv[])
|
|||||||
if (strlcpy(to.p_path, target, sizeof(to.p_path)) >= sizeof(to.p_path))
|
if (strlcpy(to.p_path, target, sizeof(to.p_path)) >= sizeof(to.p_path))
|
||||||
errx(1, "%s: name too long", target);
|
errx(1, "%s: name too long", target);
|
||||||
to.p_end = to.p_path + strlen(to.p_path);
|
to.p_end = to.p_path + strlen(to.p_path);
|
||||||
if (to.p_path == to.p_end) {
|
if (to.p_path == to.p_end) {
|
||||||
*to.p_end++ = '.';
|
*to.p_end++ = '.';
|
||||||
*to.p_end = 0;
|
*to.p_end = 0;
|
||||||
}
|
}
|
||||||
@ -240,10 +245,10 @@ main(int argc, char *argv[])
|
|||||||
type = FILE_TO_FILE;
|
type = FILE_TO_FILE;
|
||||||
|
|
||||||
if (have_trailing_slash && type == FILE_TO_FILE) {
|
if (have_trailing_slash && type == FILE_TO_FILE) {
|
||||||
if (r == -1)
|
if (r == -1) {
|
||||||
errx(1, "directory %s does not exist",
|
errx(1, "directory %s does not exist",
|
||||||
to.p_path);
|
to.p_path);
|
||||||
else
|
} else
|
||||||
errx(1, "%s is not a directory", to.p_path);
|
errx(1, "%s is not a directory", to.p_path);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
@ -294,8 +299,8 @@ copy(char *argv[], enum op type, int fts_options)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* If we are in case (2) or (3) above, we need to append the
|
* If we are in case (2) or (3) above, we need to append the
|
||||||
* source name to the target name.
|
* source name to the target name.
|
||||||
*/
|
*/
|
||||||
if (type != FILE_TO_FILE) {
|
if (type != FILE_TO_FILE) {
|
||||||
/*
|
/*
|
||||||
* Need to remember the roots of traversals to create
|
* Need to remember the roots of traversals to create
|
||||||
@ -374,7 +379,8 @@ copy(char *argv[], enum op type, int fts_options)
|
|||||||
mode = curr->fts_statp->st_mode;
|
mode = curr->fts_statp->st_mode;
|
||||||
if ((mode & (S_ISUID | S_ISGID | S_ISTXT)) ||
|
if ((mode & (S_ISUID | S_ISGID | S_ISTXT)) ||
|
||||||
((mode | S_IRWXU) & mask) != (mode & mask))
|
((mode | S_IRWXU) & mask) != (mode & mask))
|
||||||
if (chmod(to.p_path, mode & mask) != 0){
|
if (chmod(to.p_path, mode & mask) !=
|
||||||
|
0) {
|
||||||
warn("chmod: %s", to.p_path);
|
warn("chmod: %s", to.p_path);
|
||||||
rval = 1;
|
rval = 1;
|
||||||
}
|
}
|
||||||
@ -382,7 +388,7 @@ copy(char *argv[], enum op type, int fts_options)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Not an error but need to remember it happened */
|
/* Not an error but need to remember it happened. */
|
||||||
if (stat(to.p_path, &to_stat) == -1)
|
if (stat(to.p_path, &to_stat) == -1)
|
||||||
dne = 1;
|
dne = 1;
|
||||||
else {
|
else {
|
||||||
@ -408,7 +414,7 @@ copy(char *argv[], enum op type, int fts_options)
|
|||||||
|
|
||||||
switch (curr->fts_statp->st_mode & S_IFMT) {
|
switch (curr->fts_statp->st_mode & S_IFMT) {
|
||||||
case S_IFLNK:
|
case S_IFLNK:
|
||||||
/* Catch special case of a non-dangling symlink */
|
/* Catch special case of a non-dangling symlink. */
|
||||||
if ((fts_options & FTS_LOGICAL) ||
|
if ((fts_options & FTS_LOGICAL) ||
|
||||||
((fts_options & FTS_COMFOLLOW) &&
|
((fts_options & FTS_COMFOLLOW) &&
|
||||||
curr->fts_level == 0)) {
|
curr->fts_level == 0)) {
|
||||||
@ -433,7 +439,7 @@ copy(char *argv[], enum op type, int fts_options)
|
|||||||
* modified by the umask. Trade-off between being
|
* modified by the umask. Trade-off between being
|
||||||
* able to write the directory (if from directory is
|
* able to write the directory (if from directory is
|
||||||
* 555) and not causing a permissions race. If the
|
* 555) and not causing a permissions race. If the
|
||||||
* umask blocks owner writes, we fail..
|
* umask blocks owner writes, we fail.
|
||||||
*/
|
*/
|
||||||
if (dne) {
|
if (dne) {
|
||||||
if (mkdir(to.p_path,
|
if (mkdir(to.p_path,
|
||||||
@ -452,7 +458,7 @@ copy(char *argv[], enum op type, int fts_options)
|
|||||||
break;
|
break;
|
||||||
case S_IFBLK:
|
case S_IFBLK:
|
||||||
case S_IFCHR:
|
case S_IFCHR:
|
||||||
if (Rflag) {
|
if (Rflag && !sflag) {
|
||||||
if (copy_special(curr->fts_statp, !dne))
|
if (copy_special(curr->fts_statp, !dne))
|
||||||
badcp = rval = 1;
|
badcp = rval = 1;
|
||||||
} else {
|
} else {
|
||||||
@ -462,10 +468,10 @@ copy(char *argv[], enum op type, int fts_options)
|
|||||||
break;
|
break;
|
||||||
case S_IFSOCK:
|
case S_IFSOCK:
|
||||||
warnx("%s is a socket (not copied).",
|
warnx("%s is a socket (not copied).",
|
||||||
curr->fts_path);
|
curr->fts_path);
|
||||||
break;
|
break;
|
||||||
case S_IFIFO:
|
case S_IFIFO:
|
||||||
if (Rflag) {
|
if (Rflag && !sflag) {
|
||||||
if (copy_fifo(curr->fts_statp, !dne))
|
if (copy_fifo(curr->fts_statp, !dne))
|
||||||
badcp = rval = 1;
|
badcp = rval = 1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -37,7 +37,7 @@ typedef struct {
|
|||||||
} PATH_T;
|
} PATH_T;
|
||||||
|
|
||||||
extern PATH_T to;
|
extern PATH_T to;
|
||||||
extern int fflag, iflag, lflag, nflag, pflag, vflag;
|
extern int fflag, iflag, lflag, nflag, pflag, sflag, vflag;
|
||||||
extern volatile sig_atomic_t info;
|
extern volatile sig_atomic_t info;
|
||||||
|
|
||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
|
114
bin/cp/utils.c
114
bin/cp/utils.c
@ -57,15 +57,19 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
#define cp_pct(x, y) ((y == 0) ? 0 : (int)(100.0 * (x) / (y)))
|
#define cp_pct(x, y) ((y == 0) ? 0 : (int)(100.0 * (x) / (y)))
|
||||||
|
|
||||||
/* Memory strategy threshold, in pages: if physmem is larger then this, use a
|
/*
|
||||||
* large buffer */
|
* Memory strategy threshold, in pages: if physmem is larger then this, use a
|
||||||
|
* large buffer.
|
||||||
|
*/
|
||||||
#define PHYSPAGES_THRESHOLD (32*1024)
|
#define PHYSPAGES_THRESHOLD (32*1024)
|
||||||
|
|
||||||
/* Maximum buffer size in bytes - do not allow it to grow larger than this */
|
/* Maximum buffer size in bytes - do not allow it to grow larger than this. */
|
||||||
#define BUFSIZE_MAX (2*1024*1024)
|
#define BUFSIZE_MAX (2*1024*1024)
|
||||||
|
|
||||||
/* Small (default) buffer size in bytes. It's inefficient for this to be
|
/*
|
||||||
* smaller than MAXPHYS */
|
* Small (default) buffer size in bytes. It's inefficient for this to be
|
||||||
|
* smaller than MAXPHYS.
|
||||||
|
*/
|
||||||
#define BUFSIZE_SMALL (MAXPHYS)
|
#define BUFSIZE_SMALL (MAXPHYS)
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -77,13 +81,15 @@ copy_file(const FTSENT *entp, int dne)
|
|||||||
ssize_t wcount;
|
ssize_t wcount;
|
||||||
size_t wresid;
|
size_t wresid;
|
||||||
off_t wtotal;
|
off_t wtotal;
|
||||||
int ch, checkch, from_fd = 0, rcount, rval, to_fd = 0;
|
int ch, checkch, from_fd, rcount, rval, to_fd;
|
||||||
char *bufp;
|
char *bufp;
|
||||||
#ifdef VM_AND_BUFFER_CACHE_SYNCHRONIZED
|
#ifdef VM_AND_BUFFER_CACHE_SYNCHRONIZED
|
||||||
char *p;
|
char *p;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ((from_fd = open(entp->fts_path, O_RDONLY, 0)) == -1) {
|
from_fd = to_fd = -1;
|
||||||
|
if (!lflag && !sflag &&
|
||||||
|
(from_fd = open(entp->fts_path, O_RDONLY, 0)) == -1) {
|
||||||
warn("%s", entp->fts_path);
|
warn("%s", entp->fts_path);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
@ -103,63 +109,65 @@ copy_file(const FTSENT *entp, int dne)
|
|||||||
if (nflag) {
|
if (nflag) {
|
||||||
if (vflag)
|
if (vflag)
|
||||||
printf("%s not overwritten\n", to.p_path);
|
printf("%s not overwritten\n", to.p_path);
|
||||||
(void)close(from_fd);
|
rval = 1;
|
||||||
return (1);
|
goto done;
|
||||||
} else if (iflag) {
|
} else if (iflag) {
|
||||||
(void)fprintf(stderr, "overwrite %s? %s",
|
(void)fprintf(stderr, "overwrite %s? %s",
|
||||||
to.p_path, YESNO);
|
to.p_path, YESNO);
|
||||||
checkch = ch = getchar();
|
checkch = ch = getchar();
|
||||||
while (ch != '\n' && ch != EOF)
|
while (ch != '\n' && ch != EOF)
|
||||||
ch = getchar();
|
ch = getchar();
|
||||||
if (checkch != 'y' && checkch != 'Y') {
|
if (checkch != 'y' && checkch != 'Y') {
|
||||||
(void)close(from_fd);
|
|
||||||
(void)fprintf(stderr, "not overwritten\n");
|
(void)fprintf(stderr, "not overwritten\n");
|
||||||
return (1);
|
rval = 1;
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fflag) {
|
if (fflag) {
|
||||||
/* remove existing destination file name,
|
/*
|
||||||
* create a new file */
|
* Remove existing destination file name create a new
|
||||||
(void)unlink(to.p_path);
|
* file.
|
||||||
if (!lflag)
|
*/
|
||||||
to_fd = open(to.p_path, O_WRONLY | O_TRUNC | O_CREAT,
|
(void)unlink(to.p_path);
|
||||||
fs->st_mode & ~(S_ISUID | S_ISGID));
|
if (!lflag && !sflag) {
|
||||||
} else {
|
to_fd = open(to.p_path,
|
||||||
if (!lflag)
|
O_WRONLY | O_TRUNC | O_CREAT,
|
||||||
/* overwrite existing destination file name */
|
fs->st_mode & ~(S_ISUID | S_ISGID));
|
||||||
to_fd = open(to.p_path, O_WRONLY | O_TRUNC, 0);
|
}
|
||||||
|
} else if (!lflag && !sflag) {
|
||||||
|
/* Overwrite existing destination file name. */
|
||||||
|
to_fd = open(to.p_path, O_WRONLY | O_TRUNC, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else if (!lflag && !sflag) {
|
||||||
if (!lflag)
|
to_fd = open(to.p_path, O_WRONLY | O_TRUNC | O_CREAT,
|
||||||
to_fd = open(to.p_path, O_WRONLY | O_TRUNC | O_CREAT,
|
fs->st_mode & ~(S_ISUID | S_ISGID));
|
||||||
fs->st_mode & ~(S_ISUID | S_ISGID));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (to_fd == -1) {
|
if (!lflag && !sflag && to_fd == -1) {
|
||||||
warn("%s", to.p_path);
|
warn("%s", to.p_path);
|
||||||
(void)close(from_fd);
|
rval = 1;
|
||||||
return (1);
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
rval = 0;
|
rval = 0;
|
||||||
|
|
||||||
if (!lflag) {
|
if (!lflag && !sflag) {
|
||||||
/*
|
/*
|
||||||
* Mmap and write if less than 8M (the limit is so we don't totally
|
* Mmap and write if less than 8M (the limit is so we don't
|
||||||
* trash memory on big files. This is really a minor hack, but it
|
* totally trash memory on big files. This is really a minor
|
||||||
* wins some CPU back.
|
* hack, but it wins some CPU back.
|
||||||
* Some filesystems, such as smbnetfs, don't support mmap,
|
* Some filesystems, such as smbnetfs, don't support mmap,
|
||||||
* so this is a best-effort attempt.
|
* so this is a best-effort attempt.
|
||||||
*/
|
*/
|
||||||
#ifdef VM_AND_BUFFER_CACHE_SYNCHRONIZED
|
#ifdef VM_AND_BUFFER_CACHE_SYNCHRONIZED
|
||||||
if (S_ISREG(fs->st_mode) && fs->st_size > 0 &&
|
if (S_ISREG(fs->st_mode) && fs->st_size > 0 &&
|
||||||
fs->st_size <= 8 * 1024 * 1024 &&
|
fs->st_size <= 8 * 1024 * 1024 &&
|
||||||
(p = mmap(NULL, (size_t)fs->st_size, PROT_READ,
|
(p = mmap(NULL, (size_t)fs->st_size, PROT_READ,
|
||||||
MAP_SHARED, from_fd, (off_t)0)) != MAP_FAILED) {
|
MAP_SHARED, from_fd, (off_t)0)) != MAP_FAILED) {
|
||||||
wtotal = 0;
|
wtotal = 0;
|
||||||
for (bufp = p, wresid = fs->st_size; ;
|
for (bufp = p, wresid = fs->st_size; ;
|
||||||
bufp += wcount, wresid -= (size_t)wcount) {
|
bufp += wcount, wresid -= (size_t)wcount) {
|
||||||
wcount = write(to_fd, bufp, wresid);
|
wcount = write(to_fd, bufp, wresid);
|
||||||
if (wcount <= 0)
|
if (wcount <= 0)
|
||||||
break;
|
break;
|
||||||
@ -204,7 +212,7 @@ copy_file(const FTSENT *entp, int dne)
|
|||||||
wtotal = 0;
|
wtotal = 0;
|
||||||
while ((rcount = read(from_fd, buf, bufsize)) > 0) {
|
while ((rcount = read(from_fd, buf, bufsize)) > 0) {
|
||||||
for (bufp = buf, wresid = rcount; ;
|
for (bufp = buf, wresid = rcount; ;
|
||||||
bufp += wcount, wresid -= wcount) {
|
bufp += wcount, wresid -= wcount) {
|
||||||
wcount = write(to_fd, bufp, wresid);
|
wcount = write(to_fd, bufp, wresid);
|
||||||
if (wcount <= 0)
|
if (wcount <= 0)
|
||||||
break;
|
break;
|
||||||
@ -230,13 +238,18 @@ copy_file(const FTSENT *entp, int dne)
|
|||||||
rval = 1;
|
rval = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else if (lflag) {
|
||||||
if (link(entp->fts_path, to.p_path)) {
|
if (link(entp->fts_path, to.p_path)) {
|
||||||
warn("%s", to.p_path);
|
warn("%s", to.p_path);
|
||||||
rval = 1;
|
rval = 1;
|
||||||
}
|
}
|
||||||
|
} else if (sflag) {
|
||||||
|
if (symlink(entp->fts_path, to.p_path)) {
|
||||||
|
warn("%s", to.p_path);
|
||||||
|
rval = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't remove the target even after an error. The target might
|
* Don't remove the target even after an error. The target might
|
||||||
* not be a regular file, or its attributes might be important,
|
* not be a regular file, or its attributes might be important,
|
||||||
@ -244,7 +257,7 @@ copy_file(const FTSENT *entp, int dne)
|
|||||||
* to remove it if we created it and its length is 0.
|
* to remove it if we created it and its length is 0.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!lflag) {
|
if (!lflag && !sflag) {
|
||||||
if (pflag && setfile(fs, to_fd))
|
if (pflag && setfile(fs, to_fd))
|
||||||
rval = 1;
|
rval = 1;
|
||||||
if (pflag && preserve_fd_acls(from_fd, to_fd) != 0)
|
if (pflag && preserve_fd_acls(from_fd, to_fd) != 0)
|
||||||
@ -255,8 +268,9 @@ copy_file(const FTSENT *entp, int dne)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)close(from_fd);
|
done:
|
||||||
|
if (from_fd != -1)
|
||||||
|
(void)close(from_fd);
|
||||||
return (rval);
|
return (rval);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -338,7 +352,7 @@ setfile(struct stat *fs, int fd)
|
|||||||
fdval = fd != -1;
|
fdval = fd != -1;
|
||||||
islink = !fdval && S_ISLNK(fs->st_mode);
|
islink = !fdval && S_ISLNK(fs->st_mode);
|
||||||
fs->st_mode &= S_ISUID | S_ISGID | S_ISVTX |
|
fs->st_mode &= S_ISUID | S_ISGID | S_ISVTX |
|
||||||
S_IRWXU | S_IRWXG | S_IRWXO;
|
S_IRWXU | S_IRWXG | S_IRWXO;
|
||||||
|
|
||||||
tspec[0] = fs->st_atim;
|
tspec[0] = fs->st_atim;
|
||||||
tspec[1] = fs->st_mtim;
|
tspec[1] = fs->st_mtim;
|
||||||
@ -353,7 +367,7 @@ setfile(struct stat *fs, int fd)
|
|||||||
else {
|
else {
|
||||||
gotstat = 1;
|
gotstat = 1;
|
||||||
ts.st_mode &= S_ISUID | S_ISGID | S_ISVTX |
|
ts.st_mode &= S_ISUID | S_ISGID | S_ISVTX |
|
||||||
S_IRWXU | S_IRWXG | S_IRWXO;
|
S_IRWXU | S_IRWXG | S_IRWXO;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Changing the ownership probably won't succeed, unless we're root
|
* Changing the ownership probably won't succeed, unless we're root
|
||||||
@ -477,7 +491,7 @@ preserve_dir_acls(struct stat *fs, char *source_dir, char *dest_dir)
|
|||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the file is a link we will not follow it
|
* If the file is a link we will not follow it.
|
||||||
*/
|
*/
|
||||||
if (S_ISLNK(fs->st_mode)) {
|
if (S_ISLNK(fs->st_mode)) {
|
||||||
aclgetf = acl_get_link_np;
|
aclgetf = acl_get_link_np;
|
||||||
@ -536,8 +550,10 @@ usage(void)
|
|||||||
{
|
{
|
||||||
|
|
||||||
(void)fprintf(stderr, "%s\n%s\n",
|
(void)fprintf(stderr, "%s\n%s\n",
|
||||||
"usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file target_file",
|
"usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpsvx] "
|
||||||
" cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file ... "
|
"source_file target_file",
|
||||||
"target_directory");
|
" cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpsvx] "
|
||||||
|
"source_file ... "
|
||||||
|
"target_directory");
|
||||||
exit(EX_USAGE);
|
exit(EX_USAGE);
|
||||||
}
|
}
|
||||||
|
@ -413,9 +413,14 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* If not -F, -P, -d or -l options, follow any symbolic links listed on
|
* If not -F, -P, -d or -l options, follow any symbolic links listed on
|
||||||
* the command line.
|
* the command line, unless in color mode in which case we need to
|
||||||
|
* distinguish file type for a symbolic link itself and its target.
|
||||||
*/
|
*/
|
||||||
if (!f_nofollow && !f_longform && !f_listdir && (!f_type || f_slash))
|
if (!f_nofollow && !f_longform && !f_listdir && (!f_type || f_slash)
|
||||||
|
#ifdef COLORLS
|
||||||
|
&& !f_color
|
||||||
|
#endif
|
||||||
|
)
|
||||||
fts_options |= FTS_COMFOLLOW;
|
fts_options |= FTS_COMFOLLOW;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -156,6 +156,21 @@ typedef struct dt_module {
|
|||||||
#define DT_DM_KERNEL 0x2 /* module is associated with a kernel object */
|
#define DT_DM_KERNEL 0x2 /* module is associated with a kernel object */
|
||||||
#define DT_DM_PRIMARY 0x4 /* module is a krtld primary kernel object */
|
#define DT_DM_PRIMARY 0x4 /* module is a krtld primary kernel object */
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
/*
|
||||||
|
* A representation of a FreeBSD kernel module, used when checking module
|
||||||
|
* dependencies. This differs from dt_module_t, which refers to a KLD in the
|
||||||
|
* case of kernel probes. Since modules can be identified regardless of whether
|
||||||
|
* they've been compiled into the kernel, we use them to identify DTrace
|
||||||
|
* modules.
|
||||||
|
*/
|
||||||
|
typedef struct dt_kmodule {
|
||||||
|
struct dt_kmodule *dkm_next; /* hash table entry */
|
||||||
|
char *dkm_name; /* string name of module */
|
||||||
|
dt_module_t *dkm_module; /* corresponding KLD module */
|
||||||
|
} dt_kmodule_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct dt_provmod {
|
typedef struct dt_provmod {
|
||||||
char *dp_name; /* name of provider module */
|
char *dp_name; /* name of provider module */
|
||||||
struct dt_provmod *dp_next; /* next module */
|
struct dt_provmod *dp_next; /* next module */
|
||||||
@ -235,6 +250,9 @@ struct dtrace_hdl {
|
|||||||
dt_idhash_t *dt_tls; /* hash table of thread-local identifiers */
|
dt_idhash_t *dt_tls; /* hash table of thread-local identifiers */
|
||||||
dt_list_t dt_modlist; /* linked list of dt_module_t's */
|
dt_list_t dt_modlist; /* linked list of dt_module_t's */
|
||||||
dt_module_t **dt_mods; /* hash table of dt_module_t's */
|
dt_module_t **dt_mods; /* hash table of dt_module_t's */
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
dt_kmodule_t **dt_kmods; /* hash table of dt_kmodule_t's */
|
||||||
|
#endif
|
||||||
uint_t dt_modbuckets; /* number of module hash buckets */
|
uint_t dt_modbuckets; /* number of module hash buckets */
|
||||||
uint_t dt_nmods; /* number of modules in hash and list */
|
uint_t dt_nmods; /* number of modules in hash and list */
|
||||||
dt_provmod_t *dt_provmod; /* linked list of provider modules */
|
dt_provmod_t *dt_provmod; /* linked list of provider modules */
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
#else
|
#else
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/linker.h>
|
#include <sys/linker.h>
|
||||||
|
#include <sys/module.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -542,6 +543,22 @@ dt_module_lookup_by_ctf(dtrace_hdl_t *dtp, ctf_file_t *ctfp)
|
|||||||
return (ctfp ? ctf_getspecific(ctfp) : NULL);
|
return (ctfp ? ctf_getspecific(ctfp) : NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
dt_kmodule_t *
|
||||||
|
dt_kmodule_lookup(dtrace_hdl_t *dtp, const char *name)
|
||||||
|
{
|
||||||
|
uint_t h = dt_strtab_hash(name, NULL) % dtp->dt_modbuckets;
|
||||||
|
dt_kmodule_t *dkmp;
|
||||||
|
|
||||||
|
for (dkmp = dtp->dt_kmods[h]; dkmp != NULL; dkmp = dkmp->dkm_next) {
|
||||||
|
if (strcmp(dkmp->dkm_name, name) == 0)
|
||||||
|
return (dkmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int
|
static int
|
||||||
dt_module_load_sect(dtrace_hdl_t *dtp, dt_module_t *dmp, ctf_sect_t *ctsp)
|
dt_module_load_sect(dtrace_hdl_t *dtp, dt_module_t *dmp, ctf_sect_t *ctsp)
|
||||||
{
|
{
|
||||||
@ -1124,6 +1141,12 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
|
|||||||
char fname[MAXPATHLEN];
|
char fname[MAXPATHLEN];
|
||||||
struct stat64 st;
|
struct stat64 st;
|
||||||
int fd, err, bits;
|
int fd, err, bits;
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
struct module_stat ms;
|
||||||
|
dt_kmodule_t *dkmp;
|
||||||
|
uint_t h;
|
||||||
|
int modid;
|
||||||
|
#endif
|
||||||
|
|
||||||
dt_module_t *dmp;
|
dt_module_t *dmp;
|
||||||
const char *s;
|
const char *s;
|
||||||
@ -1270,6 +1293,33 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
|
|||||||
if (dmp->dm_info.objfs_info_primary)
|
if (dmp->dm_info.objfs_info_primary)
|
||||||
dmp->dm_flags |= DT_DM_PRIMARY;
|
dmp->dm_flags |= DT_DM_PRIMARY;
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
ms.version = sizeof(ms);
|
||||||
|
for (modid = kldfirstmod(k_stat->id); modid > 0;
|
||||||
|
modid = modnext(modid)) {
|
||||||
|
if (modstat(modid, &ms) != 0) {
|
||||||
|
dt_dprintf("modstat failed for id %d in %s: %s\n",
|
||||||
|
modid, k_stat->name, strerror(errno));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (dt_kmodule_lookup(dtp, ms.name) != NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
dkmp = malloc(sizeof (*dkmp));
|
||||||
|
if (dkmp == NULL) {
|
||||||
|
dt_dprintf("failed to allocate memory\n");
|
||||||
|
dt_module_destroy(dtp, dmp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
h = dt_strtab_hash(ms.name, NULL) % dtp->dt_modbuckets;
|
||||||
|
dkmp->dkm_next = dtp->dt_kmods[h];
|
||||||
|
dkmp->dkm_name = strdup(ms.name);
|
||||||
|
dkmp->dkm_module = dmp;
|
||||||
|
dtp->dt_kmods[h] = dkmp;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
dt_dprintf("opened %d-bit module %s (%s) [%d]\n",
|
dt_dprintf("opened %d-bit module %s (%s) [%d]\n",
|
||||||
bits, dmp->dm_name, dmp->dm_file, dmp->dm_modid);
|
bits, dmp->dm_name, dmp->dm_file, dmp->dm_modid);
|
||||||
}
|
}
|
||||||
|
@ -44,6 +44,10 @@ extern void dt_module_destroy(dtrace_hdl_t *, dt_module_t *);
|
|||||||
extern dt_module_t *dt_module_lookup_by_name(dtrace_hdl_t *, const char *);
|
extern dt_module_t *dt_module_lookup_by_name(dtrace_hdl_t *, const char *);
|
||||||
extern dt_module_t *dt_module_lookup_by_ctf(dtrace_hdl_t *, ctf_file_t *);
|
extern dt_module_t *dt_module_lookup_by_ctf(dtrace_hdl_t *, ctf_file_t *);
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
extern dt_kmodule_t *dt_kmodule_lookup(dtrace_hdl_t *, const char *);
|
||||||
|
#endif
|
||||||
|
|
||||||
extern int dt_module_hasctf(dtrace_hdl_t *, dt_module_t *);
|
extern int dt_module_hasctf(dtrace_hdl_t *, dt_module_t *);
|
||||||
extern ctf_file_t *dt_module_getctf(dtrace_hdl_t *, dt_module_t *);
|
extern ctf_file_t *dt_module_getctf(dtrace_hdl_t *, dt_module_t *);
|
||||||
extern dt_ident_t *dt_module_extern(dtrace_hdl_t *, dt_module_t *,
|
extern dt_ident_t *dt_module_extern(dtrace_hdl_t *, dt_module_t *,
|
||||||
|
@ -1178,6 +1178,9 @@ dt_vopen(int version, int flags, int *errp,
|
|||||||
#endif
|
#endif
|
||||||
dtp->dt_modbuckets = _dtrace_strbuckets;
|
dtp->dt_modbuckets = _dtrace_strbuckets;
|
||||||
dtp->dt_mods = calloc(dtp->dt_modbuckets, sizeof (dt_module_t *));
|
dtp->dt_mods = calloc(dtp->dt_modbuckets, sizeof (dt_module_t *));
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
dtp->dt_kmods = calloc(dtp->dt_modbuckets, sizeof (dt_module_t *));
|
||||||
|
#endif
|
||||||
dtp->dt_provbuckets = _dtrace_strbuckets;
|
dtp->dt_provbuckets = _dtrace_strbuckets;
|
||||||
dtp->dt_provs = calloc(dtp->dt_provbuckets, sizeof (dt_provider_t *));
|
dtp->dt_provs = calloc(dtp->dt_provbuckets, sizeof (dt_provider_t *));
|
||||||
dt_proc_hash_create(dtp);
|
dt_proc_hash_create(dtp);
|
||||||
@ -1199,6 +1202,7 @@ dt_vopen(int version, int flags, int *errp,
|
|||||||
if (dtp->dt_mods == NULL || dtp->dt_provs == NULL ||
|
if (dtp->dt_mods == NULL || dtp->dt_provs == NULL ||
|
||||||
dtp->dt_procs == NULL || dtp->dt_ld_path == NULL ||
|
dtp->dt_procs == NULL || dtp->dt_ld_path == NULL ||
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
|
dtp->dt_kmods == NULL ||
|
||||||
dtp->dt_objcopy_path == NULL ||
|
dtp->dt_objcopy_path == NULL ||
|
||||||
#endif
|
#endif
|
||||||
dtp->dt_cpp_path == NULL || dtp->dt_cpp_argv == NULL)
|
dtp->dt_cpp_path == NULL || dtp->dt_cpp_argv == NULL)
|
||||||
@ -1621,6 +1625,10 @@ dtrace_close(dtrace_hdl_t *dtp)
|
|||||||
dtrace_prog_t *pgp;
|
dtrace_prog_t *pgp;
|
||||||
dt_xlator_t *dxp;
|
dt_xlator_t *dxp;
|
||||||
dt_dirpath_t *dirp;
|
dt_dirpath_t *dirp;
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
dt_kmodule_t *dkm;
|
||||||
|
uint_t h;
|
||||||
|
#endif
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (dtp->dt_procs != NULL)
|
if (dtp->dt_procs != NULL)
|
||||||
@ -1648,6 +1656,15 @@ dtrace_close(dtrace_hdl_t *dtp)
|
|||||||
if (dtp->dt_tls != NULL)
|
if (dtp->dt_tls != NULL)
|
||||||
dt_idhash_destroy(dtp->dt_tls);
|
dt_idhash_destroy(dtp->dt_tls);
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
for (h = 0; h < dtp->dt_modbuckets; h++)
|
||||||
|
while ((dkm = dtp->dt_kmods[h]) != NULL) {
|
||||||
|
dtp->dt_kmods[h] = dkm->dkm_next;
|
||||||
|
free(dkm->dkm_name);
|
||||||
|
free(dkm);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
while ((dmp = dt_list_next(&dtp->dt_modlist)) != NULL)
|
while ((dmp = dt_list_next(&dtp->dt_modlist)) != NULL)
|
||||||
dt_module_destroy(dtp, dmp);
|
dt_module_destroy(dtp, dmp);
|
||||||
|
|
||||||
@ -1697,6 +1714,9 @@ dtrace_close(dtrace_hdl_t *dtp)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
free(dtp->dt_mods);
|
free(dtp->dt_mods);
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
free(dtp->dt_kmods);
|
||||||
|
#endif
|
||||||
free(dtp->dt_provs);
|
free(dtp->dt_provs);
|
||||||
free(dtp);
|
free(dtp);
|
||||||
}
|
}
|
||||||
|
@ -278,6 +278,14 @@ dt_pragma_depends(const char *prname, dt_node_t *cnp)
|
|||||||
} else if (strcmp(cnp->dn_string, "module") == 0) {
|
} else if (strcmp(cnp->dn_string, "module") == 0) {
|
||||||
dt_module_t *mp = dt_module_lookup_by_name(dtp, nnp->dn_string);
|
dt_module_t *mp = dt_module_lookup_by_name(dtp, nnp->dn_string);
|
||||||
found = mp != NULL && dt_module_getctf(dtp, mp) != NULL;
|
found = mp != NULL && dt_module_getctf(dtp, mp) != NULL;
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
if (!found) {
|
||||||
|
dt_kmodule_t *dkmp = dt_kmodule_lookup(dtp,
|
||||||
|
nnp->dn_string);
|
||||||
|
found = dkmp != NULL &&
|
||||||
|
dt_module_getctf(dtp, dkmp->dkm_module) != NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
} else if (strcmp(cnp->dn_string, "library") == 0) {
|
} else if (strcmp(cnp->dn_string, "library") == 0) {
|
||||||
if (yypcb->pcb_cflags & DTRACE_C_CTL) {
|
if (yypcb->pcb_cflags & DTRACE_C_CTL) {
|
||||||
assert(dtp->dt_filetag != NULL);
|
assert(dtp->dt_filetag != NULL);
|
||||||
|
@ -624,11 +624,11 @@ static void check_avoid_default_addr_size(struct check *c, struct node *dt,
|
|||||||
if (!reg && !ranges)
|
if (!reg && !ranges)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((node->parent->addr_cells == -1))
|
if (node->parent->addr_cells == -1)
|
||||||
FAIL(c, "Relying on default #address-cells value for %s",
|
FAIL(c, "Relying on default #address-cells value for %s",
|
||||||
node->fullpath);
|
node->fullpath);
|
||||||
|
|
||||||
if ((node->parent->size_cells == -1))
|
if (node->parent->size_cells == -1)
|
||||||
FAIL(c, "Relying on default #size-cells value for %s",
|
FAIL(c, "Relying on default #size-cells value for %s",
|
||||||
node->fullpath);
|
node->fullpath);
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <err.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@ -35,6 +36,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
#include "mandoc.h"
|
#include "mandoc.h"
|
||||||
#include "mandoc_aux.h"
|
#include "mandoc_aux.h"
|
||||||
@ -792,6 +794,27 @@ mparse_readfd(struct mparse *curp, int fd, const char *file)
|
|||||||
return(curp->file_status);
|
return(curp->file_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* hack to avoid depending on gnuzip(1) waiting for upstream proper
|
||||||
|
* support
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
gunzip(const char *file)
|
||||||
|
{
|
||||||
|
gzFile gz;
|
||||||
|
char buf[8192];
|
||||||
|
int r;
|
||||||
|
|
||||||
|
gz = gzopen(file, "r");
|
||||||
|
if (gz == NULL)
|
||||||
|
err(EXIT_FAILURE, "cannot open %s", file);
|
||||||
|
|
||||||
|
while ((r = gzread(gz, buf, sizeof(buf))) > 0)
|
||||||
|
fwrite(buf, 1, r, stdout);
|
||||||
|
|
||||||
|
gzclose(gz);
|
||||||
|
return (EXIT_SUCCESS);
|
||||||
|
}
|
||||||
enum mandoclevel
|
enum mandoclevel
|
||||||
mparse_open(struct mparse *curp, int *fd, const char *file)
|
mparse_open(struct mparse *curp, int *fd, const char *file)
|
||||||
{
|
{
|
||||||
@ -846,9 +869,7 @@ mparse_open(struct mparse *curp, int *fd, const char *file)
|
|||||||
perror("dup");
|
perror("dup");
|
||||||
exit((int)MANDOCLEVEL_SYSERR);
|
exit((int)MANDOCLEVEL_SYSERR);
|
||||||
}
|
}
|
||||||
execlp("gunzip", "gunzip", "-c", file, NULL);
|
exit(gunzip(file));
|
||||||
perror("exec");
|
|
||||||
exit((int)MANDOCLEVEL_SYSERR);
|
|
||||||
default:
|
default:
|
||||||
close(pfd[1]);
|
close(pfd[1]);
|
||||||
*fd = pfd[0];
|
*fd = pfd[0];
|
||||||
|
@ -188,13 +188,10 @@ distribute:
|
|||||||
.include <bsd.endian.mk>
|
.include <bsd.endian.mk>
|
||||||
.if ${TARGET_ENDIANNESS} == "1234"
|
.if ${TARGET_ENDIANNESS} == "1234"
|
||||||
CAP_MKDB_ENDIAN?= -l
|
CAP_MKDB_ENDIAN?= -l
|
||||||
PWD_MKDB_ENDIAN?= -L
|
|
||||||
.elif ${TARGET_ENDIANNESS} == "4321"
|
.elif ${TARGET_ENDIANNESS} == "4321"
|
||||||
CAP_MKDB_ENDIAN?= -b
|
CAP_MKDB_ENDIAN?= -b
|
||||||
PWD_MKDB_ENDIAN?= -B
|
|
||||||
.else
|
.else
|
||||||
CAP_MKDB_ENDIAN?=
|
CAP_MKDB_ENDIAN?=
|
||||||
PWD_MKDB_ENDIAN?=
|
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
.if defined(NO_ROOT)
|
.if defined(NO_ROOT)
|
||||||
@ -210,6 +207,8 @@ distribution:
|
|||||||
${INSTALL} -o ${BINOWN} -g ${BINGRP} -m 644 \
|
${INSTALL} -o ${BINOWN} -g ${BINGRP} -m 644 \
|
||||||
${BIN1} ${DESTDIR}/etc; \
|
${BIN1} ${DESTDIR}/etc; \
|
||||||
cap_mkdb ${CAP_MKDB_ENDIAN} ${DESTDIR}/etc/login.conf; \
|
cap_mkdb ${CAP_MKDB_ENDIAN} ${DESTDIR}/etc/login.conf; \
|
||||||
|
services_mkdb ${CAP_MKDB_ENDIAN} -q -o ${DESTDIR}/var/db/services.db \
|
||||||
|
${DESTDIR}/etc/services; \
|
||||||
${INSTALL} -o ${BINOWN} -g ${BINGRP} -m 755 \
|
${INSTALL} -o ${BINOWN} -g ${BINGRP} -m 755 \
|
||||||
${BIN2} ${DESTDIR}/etc; \
|
${BIN2} ${DESTDIR}/etc; \
|
||||||
${INSTALL} -o ${BINOWN} -g ${BINGRP} -m 600 \
|
${INSTALL} -o ${BINOWN} -g ${BINGRP} -m 600 \
|
||||||
@ -220,8 +219,7 @@ distribution:
|
|||||||
.if ${MK_TCSH} == "no"
|
.if ${MK_TCSH} == "no"
|
||||||
sed -i "" -e 's;/bin/csh;/bin/sh;' ${DESTDIR}/etc/master.passwd
|
sed -i "" -e 's;/bin/csh;/bin/sh;' ${DESTDIR}/etc/master.passwd
|
||||||
.endif
|
.endif
|
||||||
pwd_mkdb ${PWD_MKDB_ENDIAN} -i -p -d ${DESTDIR}/etc \
|
pwd_mkdb -i -p -d ${DESTDIR}/etc ${DESTDIR}/etc/master.passwd
|
||||||
${DESTDIR}/etc/master.passwd
|
|
||||||
.if defined(NO_ROOT)
|
.if defined(NO_ROOT)
|
||||||
( \
|
( \
|
||||||
echo "./etc/login.conf.db type=file mode=0644 uname=root gname=wheel"; \
|
echo "./etc/login.conf.db type=file mode=0644 uname=root gname=wheel"; \
|
||||||
|
@ -150,14 +150,14 @@ main(int argc, char *argv[])
|
|||||||
set(tm->tm_min/10, 14);
|
set(tm->tm_min/10, 14);
|
||||||
|
|
||||||
if (t12) {
|
if (t12) {
|
||||||
if (tm->tm_hour > 12) {
|
if (tm->tm_hour < 12) {
|
||||||
tm->tm_hour -= 12;
|
|
||||||
mvaddstr(YBASE + 5, XBASE + 52, "PM");
|
|
||||||
} else {
|
|
||||||
if (tm->tm_hour == 0)
|
if (tm->tm_hour == 0)
|
||||||
tm->tm_hour = 12;
|
tm->tm_hour = 12;
|
||||||
|
|
||||||
mvaddstr(YBASE + 5, XBASE + 52, "AM");
|
mvaddstr(YBASE + 5, XBASE + 52, "AM");
|
||||||
|
} else {
|
||||||
|
if (tm->tm_hour > 12)
|
||||||
|
tm->tm_hour -= 12;
|
||||||
|
mvaddstr(YBASE + 5, XBASE + 52, "PM");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ ENTRY(longjmp)
|
|||||||
str x1, [sp, #16]
|
str x1, [sp, #16]
|
||||||
|
|
||||||
/* Restore the signal mask */
|
/* Restore the signal mask */
|
||||||
mov x1, #0 /* oset */
|
mov x2, #0 /* oset */
|
||||||
add x1, x0, #(_JB_SIGMASK * 8) /* set */
|
add x1, x0, #(_JB_SIGMASK * 8) /* set */
|
||||||
mov x0, #3 /* SIG_BLOCK */
|
mov x0, #3 /* SIG_BLOCK */
|
||||||
bl sigprocmask
|
bl sigprocmask
|
||||||
|
@ -113,10 +113,12 @@ and
|
|||||||
.Fn strrchr
|
.Fn strrchr
|
||||||
conform to
|
conform to
|
||||||
.St -isoC .
|
.St -isoC .
|
||||||
The
|
The function
|
||||||
.Fn strchrnul
|
.Fn strchrnul
|
||||||
is a GNU extension .
|
is a
|
||||||
.Sh History
|
.Tn GNU
|
||||||
|
extension.
|
||||||
|
.Sh HISTORY
|
||||||
The
|
The
|
||||||
.Fn strchrnul
|
.Fn strchrnul
|
||||||
function first appeared in glibc 2.1.1 and was added in
|
function first appeared in glibc 2.1.1 and was added in
|
||||||
|
@ -334,7 +334,6 @@ devstat_getdevs(kvm_t *kd, struct statinfo *stats)
|
|||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
size_t dssize;
|
size_t dssize;
|
||||||
int oldnumdevs;
|
|
||||||
long oldgeneration;
|
long oldgeneration;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
struct devinfo *dinfo;
|
struct devinfo *dinfo;
|
||||||
@ -348,7 +347,6 @@ devstat_getdevs(kvm_t *kd, struct statinfo *stats)
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
oldnumdevs = dinfo->numdevs;
|
|
||||||
oldgeneration = dinfo->generation;
|
oldgeneration = dinfo->generation;
|
||||||
|
|
||||||
if (kd == NULL) {
|
if (kd == NULL) {
|
||||||
|
@ -391,7 +391,6 @@ dprompt_add_files(struct dpv_file_node *file_list,
|
|||||||
enum dprompt_state dstate;
|
enum dprompt_state dstate;
|
||||||
int estext_lsize;
|
int estext_lsize;
|
||||||
int estext_rsize;
|
int estext_rsize;
|
||||||
int estext_size;
|
|
||||||
int flabel_size;
|
int flabel_size;
|
||||||
int hlen;
|
int hlen;
|
||||||
int lsize;
|
int lsize;
|
||||||
@ -559,13 +558,11 @@ dprompt_add_files(struct dpv_file_node *file_list,
|
|||||||
bg_code = "\\Zr\\Z1"; /* Red */
|
bg_code = "\\Zr\\Z1"; /* Red */
|
||||||
estext_lsize = fail_lsize;
|
estext_lsize = fail_lsize;
|
||||||
estext_rsize = fail_rsize;
|
estext_rsize = fail_rsize;
|
||||||
estext_size = fail_size;
|
|
||||||
estext = fail;
|
estext = fail;
|
||||||
} else { /* e.g., DPV_STATUS_DONE */
|
} else { /* e.g., DPV_STATUS_DONE */
|
||||||
bg_code = "\\Zr\\Z2"; /* Green */
|
bg_code = "\\Zr\\Z2"; /* Green */
|
||||||
estext_lsize = done_lsize;
|
estext_lsize = done_lsize;
|
||||||
estext_rsize = done_rsize;
|
estext_rsize = done_rsize;
|
||||||
estext_size = done_size;
|
|
||||||
estext = done;
|
estext = done;
|
||||||
}
|
}
|
||||||
switch (dstate) {
|
switch (dstate) {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: readline.h,v 1.34 2013/05/28 00:10:34 christos Exp $ */
|
/* $NetBSD: readline.h,v 1.37 2015/06/02 15:36:45 christos Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1997 The NetBSD Foundation, Inc.
|
* Copyright (c) 1997 The NetBSD Foundation, Inc.
|
||||||
@ -41,9 +41,8 @@
|
|||||||
/* typedefs */
|
/* typedefs */
|
||||||
typedef int Function(const char *, int);
|
typedef int Function(const char *, int);
|
||||||
typedef void VFunction(void);
|
typedef void VFunction(void);
|
||||||
typedef void VCPFunction(char *);
|
typedef void rl_vcpfunc_t(char *);
|
||||||
typedef char *CPFunction(const char *, int);
|
typedef char **rl_completion_func_t(const char *, int, int);
|
||||||
typedef char **CPPFunction(const char *, int, int);
|
|
||||||
typedef char *rl_compentry_func_t(const char *, int);
|
typedef char *rl_compentry_func_t(const char *, int);
|
||||||
typedef int rl_command_func_t(int, int);
|
typedef int rl_command_func_t(int, int);
|
||||||
|
|
||||||
@ -110,9 +109,9 @@ extern int max_input_history;
|
|||||||
extern char *rl_basic_word_break_characters;
|
extern char *rl_basic_word_break_characters;
|
||||||
extern char *rl_completer_word_break_characters;
|
extern char *rl_completer_word_break_characters;
|
||||||
extern char *rl_completer_quote_characters;
|
extern char *rl_completer_quote_characters;
|
||||||
extern Function *rl_completion_entry_function;
|
extern rl_compentry_func_t *rl_completion_entry_function;
|
||||||
extern char *(*rl_completion_word_break_hook)(void);
|
extern char *(*rl_completion_word_break_hook)(void);
|
||||||
extern CPPFunction *rl_attempted_completion_function;
|
extern rl_completion_func_t *rl_attempted_completion_function;
|
||||||
extern int rl_attempted_completion_over;
|
extern int rl_attempted_completion_over;
|
||||||
extern int rl_completion_type;
|
extern int rl_completion_type;
|
||||||
extern int rl_completion_query_items;
|
extern int rl_completion_query_items;
|
||||||
@ -177,7 +176,7 @@ char *filename_completion_function(const char *, int);
|
|||||||
char *username_completion_function(const char *, int);
|
char *username_completion_function(const char *, int);
|
||||||
int rl_complete(int, int);
|
int rl_complete(int, int);
|
||||||
int rl_read_key(void);
|
int rl_read_key(void);
|
||||||
char **completion_matches(const char *, CPFunction *);
|
char **completion_matches(const char *, rl_compentry_func_t *);
|
||||||
void rl_display_match_list(char **, int, int);
|
void rl_display_match_list(char **, int, int);
|
||||||
|
|
||||||
int rl_insert(int, int);
|
int rl_insert(int, int);
|
||||||
@ -186,7 +185,7 @@ void rl_reset_terminal(const char *);
|
|||||||
int rl_bind_key(int, rl_command_func_t *);
|
int rl_bind_key(int, rl_command_func_t *);
|
||||||
int rl_newline(int, int);
|
int rl_newline(int, int);
|
||||||
void rl_callback_read_char(void);
|
void rl_callback_read_char(void);
|
||||||
void rl_callback_handler_install(const char *, VCPFunction *);
|
void rl_callback_handler_install(const char *, rl_vcpfunc_t *);
|
||||||
void rl_callback_handler_remove(void);
|
void rl_callback_handler_remove(void);
|
||||||
void rl_redisplay(void);
|
void rl_redisplay(void);
|
||||||
int rl_get_previous_history(int, int);
|
int rl_get_previous_history(int, int);
|
||||||
@ -196,7 +195,7 @@ int rl_read_init_file(const char *);
|
|||||||
int rl_parse_and_bind(const char *);
|
int rl_parse_and_bind(const char *);
|
||||||
int rl_variable_bind(const char *, const char *);
|
int rl_variable_bind(const char *, const char *);
|
||||||
void rl_stuff_char(int);
|
void rl_stuff_char(int);
|
||||||
int rl_add_defun(const char *, Function *, int);
|
int rl_add_defun(const char *, rl_command_func_t *, int);
|
||||||
HISTORY_STATE *history_get_history_state(void);
|
HISTORY_STATE *history_get_history_state(void);
|
||||||
void rl_get_screen_size(int *, int *);
|
void rl_get_screen_size(int *, int *);
|
||||||
void rl_set_screen_size(int, int);
|
void rl_set_screen_size(int, int);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: readline.c,v 1.115 2015/04/01 15:23:15 christos Exp $ */
|
/* $NetBSD: readline.c,v 1.117 2015/06/02 15:35:31 christos Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1997 The NetBSD Foundation, Inc.
|
* Copyright (c) 1997 The NetBSD Foundation, Inc.
|
||||||
@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#if !defined(lint) && !defined(SCCSID)
|
#if !defined(lint) && !defined(SCCSID)
|
||||||
__RCSID("$NetBSD: readline.c,v 1.115 2015/04/01 15:23:15 christos Exp $");
|
__RCSID("$NetBSD: readline.c,v 1.117 2015/06/02 15:35:31 christos Exp $");
|
||||||
#endif /* not lint && not SCCSID */
|
#endif /* not lint && not SCCSID */
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
@ -80,7 +80,7 @@ FILE *rl_outstream = NULL;
|
|||||||
int rl_point = 0;
|
int rl_point = 0;
|
||||||
int rl_end = 0;
|
int rl_end = 0;
|
||||||
char *rl_line_buffer = NULL;
|
char *rl_line_buffer = NULL;
|
||||||
VCPFunction *rl_linefunc = NULL;
|
rl_vcpfunc_t *rl_linefunc = NULL;
|
||||||
int rl_done = 0;
|
int rl_done = 0;
|
||||||
VFunction *rl_event_hook = NULL;
|
VFunction *rl_event_hook = NULL;
|
||||||
KEYMAP_ENTRY_ARRAY emacs_standard_keymap,
|
KEYMAP_ENTRY_ARRAY emacs_standard_keymap,
|
||||||
@ -109,9 +109,9 @@ int rl_attempted_completion_over = 0;
|
|||||||
char *rl_basic_word_break_characters = break_chars;
|
char *rl_basic_word_break_characters = break_chars;
|
||||||
char *rl_completer_word_break_characters = NULL;
|
char *rl_completer_word_break_characters = NULL;
|
||||||
char *rl_completer_quote_characters = NULL;
|
char *rl_completer_quote_characters = NULL;
|
||||||
Function *rl_completion_entry_function = NULL;
|
rl_compentry_func_t *rl_completion_entry_function = NULL;
|
||||||
char *(*rl_completion_word_break_hook)(void) = NULL;
|
char *(*rl_completion_word_break_hook)(void) = NULL;
|
||||||
CPPFunction *rl_attempted_completion_function = NULL;
|
rl_completion_func_t *rl_attempted_completion_function = NULL;
|
||||||
Function *rl_pre_input_hook = NULL;
|
Function *rl_pre_input_hook = NULL;
|
||||||
Function *rl_startup1_hook = NULL;
|
Function *rl_startup1_hook = NULL;
|
||||||
int (*rl_getc_function)(FILE *) = NULL;
|
int (*rl_getc_function)(FILE *) = NULL;
|
||||||
@ -162,7 +162,7 @@ int rl_completion_append_character = ' ';
|
|||||||
|
|
||||||
static History *h = NULL;
|
static History *h = NULL;
|
||||||
static EditLine *e = NULL;
|
static EditLine *e = NULL;
|
||||||
static Function *map[256];
|
static rl_command_func_t *map[256];
|
||||||
static jmp_buf topbuf;
|
static jmp_buf topbuf;
|
||||||
|
|
||||||
/* internal functions */
|
/* internal functions */
|
||||||
@ -1829,9 +1829,11 @@ rl_complete(int ignore __attribute__((__unused__)), int invoking_key)
|
|||||||
else
|
else
|
||||||
breakchars = rl_basic_word_break_characters;
|
breakchars = rl_basic_word_break_characters;
|
||||||
|
|
||||||
|
_rl_update_pos();
|
||||||
|
|
||||||
/* Just look at how many global variables modify this operation! */
|
/* Just look at how many global variables modify this operation! */
|
||||||
return fn_complete(e,
|
return fn_complete(e,
|
||||||
(CPFunction *)rl_completion_entry_function,
|
(rl_compentry_func_t *)rl_completion_entry_function,
|
||||||
rl_attempted_completion_function,
|
rl_attempted_completion_function,
|
||||||
ct_decode_string(rl_basic_word_break_characters, &wbreak_conv),
|
ct_decode_string(rl_basic_word_break_characters, &wbreak_conv),
|
||||||
ct_decode_string(breakchars, &sprefix_conv),
|
ct_decode_string(breakchars, &sprefix_conv),
|
||||||
@ -1960,7 +1962,7 @@ rl_bind_wrapper(EditLine *el __attribute__((__unused__)), unsigned char c)
|
|||||||
|
|
||||||
_rl_update_pos();
|
_rl_update_pos();
|
||||||
|
|
||||||
(*map[c])(NULL, c);
|
(*map[c])(1, c);
|
||||||
|
|
||||||
/* If rl_done was set by the above call, deal with it here */
|
/* If rl_done was set by the above call, deal with it here */
|
||||||
if (rl_done)
|
if (rl_done)
|
||||||
@ -1970,7 +1972,7 @@ rl_bind_wrapper(EditLine *el __attribute__((__unused__)), unsigned char c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rl_add_defun(const char *name, Function *fun, int c)
|
rl_add_defun(const char *name, rl_command_func_t *fun, int c)
|
||||||
{
|
{
|
||||||
char dest[8];
|
char dest[8];
|
||||||
if ((size_t)c >= sizeof(map) / sizeof(map[0]) || c < 0)
|
if ((size_t)c >= sizeof(map) / sizeof(map[0]) || c < 0)
|
||||||
@ -2009,7 +2011,7 @@ rl_callback_read_char(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rl_callback_handler_install(const char *prompt, VCPFunction *linefunc)
|
rl_callback_handler_install(const char *prompt, rl_vcpfunc_t *linefunc)
|
||||||
{
|
{
|
||||||
if (e == NULL) {
|
if (e == NULL) {
|
||||||
rl_initialize();
|
rl_initialize();
|
||||||
|
@ -165,7 +165,6 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,
|
|||||||
struct _gss_mechanism_cred *mc;
|
struct _gss_mechanism_cred *mc;
|
||||||
gss_cred_id_t acceptor_mc, delegated_mc;
|
gss_cred_id_t acceptor_mc, delegated_mc;
|
||||||
gss_name_t src_mn;
|
gss_name_t src_mn;
|
||||||
int allocated_ctx;
|
|
||||||
|
|
||||||
*minor_status = 0;
|
*minor_status = 0;
|
||||||
if (src_name)
|
if (src_name)
|
||||||
@ -206,11 +205,8 @@ OM_uint32 gss_accept_sec_context(OM_uint32 *minor_status,
|
|||||||
free(ctx);
|
free(ctx);
|
||||||
return (GSS_S_BAD_MECH);
|
return (GSS_S_BAD_MECH);
|
||||||
}
|
}
|
||||||
allocated_ctx = 1;
|
} else
|
||||||
} else {
|
|
||||||
m = ctx->gc_mech;
|
m = ctx->gc_mech;
|
||||||
allocated_ctx = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cred) {
|
if (cred) {
|
||||||
SLIST_FOREACH(mc, &cred->gc_mc, gmc_link)
|
SLIST_FOREACH(mc, &cred->gc_mc, gmc_link)
|
||||||
|
@ -64,11 +64,10 @@ bsde_rule_to_string(struct mac_bsdextended_rule *rule, char *buf, size_t buflen)
|
|||||||
struct statfs *mntbuf;
|
struct statfs *mntbuf;
|
||||||
char *cur, type[sizeof(rule->mbr_object.mbo_type) * CHAR_BIT + 1];
|
char *cur, type[sizeof(rule->mbr_object.mbo_type) * CHAR_BIT + 1];
|
||||||
size_t left, len;
|
size_t left, len;
|
||||||
int anymode, unknownmode, truncated, numfs, i, notdone;
|
int anymode, unknownmode, numfs, i, notdone;
|
||||||
|
|
||||||
cur = buf;
|
cur = buf;
|
||||||
left = buflen;
|
left = buflen;
|
||||||
truncated = 0;
|
|
||||||
|
|
||||||
len = snprintf(cur, left, "subject ");
|
len = snprintf(cur, left, "subject ");
|
||||||
if (len < 0 || len > left)
|
if (len < 0 || len > left)
|
||||||
@ -1216,7 +1215,7 @@ bsde_delete_rule(int rulenum, size_t buflen, char *errstr)
|
|||||||
{
|
{
|
||||||
struct mac_bsdextended_rule rule;
|
struct mac_bsdextended_rule rule;
|
||||||
int name[10];
|
int name[10];
|
||||||
size_t len, size;
|
size_t len;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if (bsde_check_version(buflen, errstr) != 0)
|
if (bsde_check_version(buflen, errstr) != 0)
|
||||||
@ -1233,7 +1232,6 @@ bsde_delete_rule(int rulenum, size_t buflen, char *errstr)
|
|||||||
name[len] = rulenum;
|
name[len] = rulenum;
|
||||||
len++;
|
len++;
|
||||||
|
|
||||||
size = sizeof(rule);
|
|
||||||
error = sysctl(name, len, NULL, NULL, &rule, 0);
|
error = sysctl(name, len, NULL, NULL, &rule, 0);
|
||||||
if (error) {
|
if (error) {
|
||||||
len = snprintf(errstr, buflen, "%s.%d: %s", MIB ".rules",
|
len = snprintf(errstr, buflen, "%s.%d: %s", MIB ".rules",
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd October 30, 2012
|
.Dd June 06, 2015
|
||||||
.Dt PW_UTIL 3
|
.Dt PW_UTIL 3
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -222,7 +222,7 @@ and it is the caller's responsibility to free it with
|
|||||||
The
|
The
|
||||||
.Fn pw_mkdb
|
.Fn pw_mkdb
|
||||||
function regenerates the password database by running
|
function regenerates the password database by running
|
||||||
.Xr pw_mkdb 8 .
|
.Xr pwd_mkdb 8 .
|
||||||
If
|
If
|
||||||
.Fa user
|
.Fa user
|
||||||
only the record corresponding to that user will be updated.
|
only the record corresponding to that user will be updated.
|
||||||
|
@ -51,9 +51,9 @@ ec2ami: cw-ec2 ${CW_EC2_PORTINSTALL}
|
|||||||
@echo "--------------------------------------------------------------"
|
@echo "--------------------------------------------------------------"
|
||||||
@false
|
@false
|
||||||
.endif
|
.endif
|
||||||
/usr/local/bin/bsdec2-image-upload ${PUBLISH} \
|
/usr/local/bin/bsdec2-image-upload ${PUBLISH} \
|
||||||
${.OBJDIR}/ec2.raw \
|
${.OBJDIR}/ec2.raw \
|
||||||
"${TYPE} ${REVISION}-${BRANCH}-${TARGET}${AMINAMESUFFIX}" \
|
"${TYPE} ${REVISION}-${BRANCH}-${TARGET}${AMINAMESUFFIX}" \
|
||||||
"${TYPE} ${REVISION}-${BRANCH}-${TARGET}" \
|
"${TYPE} ${REVISION}-${BRANCH}-${TARGET}" \
|
||||||
${AWSREGION} ${AWSBUCKET} ${AWSKEYFILE}
|
${AWSREGION} ${AWSBUCKET} ${AWSKEYFILE}
|
||||||
@touch ${.TARGET}
|
@touch ${.TARGET}
|
||||||
|
@ -23,7 +23,7 @@ arm_install_uboot() {
|
|||||||
chroot ${CHROOTDIR} mkdir -p "${FATMOUNT}" "${UFSMOUNT}"
|
chroot ${CHROOTDIR} mkdir -p "${FATMOUNT}" "${UFSMOUNT}"
|
||||||
chroot ${CHROOTDIR} mount_msdosfs /dev/${mddev}s1 ${FATMOUNT}
|
chroot ${CHROOTDIR} mount_msdosfs /dev/${mddev}s1 ${FATMOUNT}
|
||||||
chroot ${CHROOTDIR} mount /dev/${mddev}s2a ${UFSMOUNT}
|
chroot ${CHROOTDIR} mount /dev/${mddev}s2a ${UFSMOUNT}
|
||||||
chroot ${CHROOTDIR} cp -p ${UBOOT_DIR}/MLO ${FATMOUNT}/MLO
|
chroot ${CHROOTDIR} cp -p ${UBOOT_DIR}/MLO ${FATMOUNT}/MLO
|
||||||
chroot ${CHROOTDIR} cp -p ${UBOOT_DIR}/u-boot.img ${FATMOUNT}/u-boot.img
|
chroot ${CHROOTDIR} cp -p ${UBOOT_DIR}/u-boot.img ${FATMOUNT}/u-boot.img
|
||||||
chroot ${CHROOTDIR} cp -p ${UFSMOUNT}/boot/ubldr ${FATMOUNT}/ubldr
|
chroot ${CHROOTDIR} cp -p ${UFSMOUNT}/boot/ubldr ${FATMOUNT}/ubldr
|
||||||
chroot ${CHROOTDIR} touch ${UFSMOUNT}/firstboot
|
chroot ${CHROOTDIR} touch ${UFSMOUNT}/firstboot
|
||||||
|
39
release/arm/CUBOX-HUMMINGBOARD.conf
Normal file
39
release/arm/CUBOX-HUMMINGBOARD.conf
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# $FreeBSD$
|
||||||
|
#
|
||||||
|
|
||||||
|
EMBEDDEDBUILD=1
|
||||||
|
EMBEDDED_TARGET="arm"
|
||||||
|
EMBEDDED_TARGET_ARCH="armv6"
|
||||||
|
EMBEDDEDPORTS="sysutils/u-boot-cubox-hummingboard"
|
||||||
|
KERNEL="IMX6"
|
||||||
|
WORLD_FLAGS="${WORLD_FLAGS} UBLDR_LOADADDR=0x12000000"
|
||||||
|
IMAGE_SIZE="1G"
|
||||||
|
PART_SCHEME="MBR"
|
||||||
|
FAT_SIZE="50m -b 16384"
|
||||||
|
FAT_TYPE="16"
|
||||||
|
MD_ARGS="-x 63 -y 255"
|
||||||
|
NODOC=1
|
||||||
|
export BOARDNAME="CUBOX-HUMMINGBOARD"
|
||||||
|
|
||||||
|
arm_install_uboot() {
|
||||||
|
UBOOT_DIR="/usr/local/share/u-boot/u-boot-cubox-hummingboard"
|
||||||
|
UBOOT_FILES="u-boot.imx"
|
||||||
|
FATMOUNT="${DESTDIR%${KERNEL}}/fat"
|
||||||
|
UFSMOUNT="${DESTDIR%${KERNEL}}/ufs"
|
||||||
|
chroot ${CHROOTDIR} dd if=${UBOOT_DIR}/${UBOOT_FILES} \
|
||||||
|
of=/dev/${mddev} bs=512 seek=2
|
||||||
|
chroot ${CHROOTDIR} mkdir -p "${FATMOUNT}" "${UFSMOUNT}"
|
||||||
|
chroot ${CHROOTDIR} mount_msdosfs /dev/${mddev}s1 ${FATMOUNT}
|
||||||
|
chroot ${CHROOTDIR} mount /dev/${mddev}s2a ${UFSMOUNT}
|
||||||
|
chroot ${CHROOTDIR} cp -p ${UFSMOUNT}/boot/ubldr ${FATMOUNT}/ubldr
|
||||||
|
chroot ${CHROOTDIR} touch ${UFSMOUNT}/firstboot
|
||||||
|
sync
|
||||||
|
umount_loop ${CHROOTDIR}/${FATMOUNT}
|
||||||
|
umount_loop ${CHROOTDIR}/${UFSMOUNT}
|
||||||
|
chroot ${CHROOTDIR} rmdir ${FATMOUNT}
|
||||||
|
chroot ${CHROOTDIR} rmdir ${UFSMOUNT}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
37
release/arm/GUMSTIX.conf
Normal file
37
release/arm/GUMSTIX.conf
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# $FreeBSD$
|
||||||
|
#
|
||||||
|
|
||||||
|
EMBEDDEDBUILD=1
|
||||||
|
EMBEDDED_TARGET="arm"
|
||||||
|
EMBEDDED_TARGET_ARCH="armv6"
|
||||||
|
EMBEDDEDPORTS="sysutils/u-boot-duovero"
|
||||||
|
KERNEL="GUMSTIX"
|
||||||
|
WORLD_FLAGS="${WORLD_FLAGS} UBLDR_LOADADDR=0x88000000"
|
||||||
|
IMAGE_SIZE="1G"
|
||||||
|
PART_SCHEME="MBR"
|
||||||
|
FAT_SIZE="2m"
|
||||||
|
FAT_TYPE="12"
|
||||||
|
MD_ARGS="-x 63 -y 255"
|
||||||
|
NODOC=1
|
||||||
|
|
||||||
|
arm_install_uboot() {
|
||||||
|
UBOOT_DIR="/usr/local/share/u-boot/u-boot-duovero"
|
||||||
|
FATMOUNT="${DESTDIR%${KERNEL}}/fat"
|
||||||
|
UFSMOUNT="${DESTDIR%${KERNEL}}/ufs"
|
||||||
|
chroot ${CHROOTDIR} mkdir -p "${FATMOUNT}" "${UFSMOUNT}"
|
||||||
|
chroot ${CHROOTDIR} mount_msdosfs /dev/${mddev}s1 ${FATMOUNT}
|
||||||
|
chroot ${CHROOTDIR} mount /dev/${mddev}s2a ${UFSMOUNT}
|
||||||
|
chroot ${CHROOTDIR} cp -p ${UBOOT_DIR}/MLO ${FATMOUNT}/MLO
|
||||||
|
chroot ${CHROOTDIR} cp -p ${UBOOT_DIR}/u-boot.img ${FATMOUNT}/u-boot.img
|
||||||
|
chroot ${CHROOTDIR} cp -p ${UFSMOUNT}/boot/ubldr ${FATMOUNT}/ubldr
|
||||||
|
chroot ${CHROOTDIR} touch ${UFSMOUNT}/firstboot
|
||||||
|
sync
|
||||||
|
umount_loop ${CHROOTDIR}/${FATMOUNT}
|
||||||
|
umount_loop ${CHROOTDIR}/${UFSMOUNT}
|
||||||
|
chroot ${CHROOTDIR} rmdir ${FATMOUNT}
|
||||||
|
chroot ${CHROOTDIR} rmdir ${UFSMOUNT}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
@ -8,7 +8,7 @@ EMBEDDED_TARGET="arm"
|
|||||||
EMBEDDED_TARGET_ARCH="armv6"
|
EMBEDDED_TARGET_ARCH="armv6"
|
||||||
EMBEDDEDPORTS="sysutils/u-boot-wandboard"
|
EMBEDDEDPORTS="sysutils/u-boot-wandboard"
|
||||||
KERNEL="IMX6"
|
KERNEL="IMX6"
|
||||||
WORLD_FLAGS="${WORLD_FLAGS} UBLDR_LOADADDR=0x11000000"
|
WORLD_FLAGS="${WORLD_FLAGS} UBLDR_LOADADDR=0x12000000"
|
||||||
IMAGE_SIZE="1G"
|
IMAGE_SIZE="1G"
|
||||||
PART_SCHEME="MBR"
|
PART_SCHEME="MBR"
|
||||||
FAT_SIZE="50m -b 16384"
|
FAT_SIZE="50m -b 16384"
|
||||||
|
@ -72,7 +72,7 @@ arm_create_disk() {
|
|||||||
chroot ${CHROOTDIR} gpart create -s bsd ${mddev}s2
|
chroot ${CHROOTDIR} gpart create -s bsd ${mddev}s2
|
||||||
chroot ${CHROOTDIR} gpart add -t freebsd-ufs -a 64k /dev/${mddev}s2
|
chroot ${CHROOTDIR} gpart add -t freebsd-ufs -a 64k /dev/${mddev}s2
|
||||||
chroot ${CHROOTDIR} newfs -U -L rootfs /dev/${mddev}s2a
|
chroot ${CHROOTDIR} newfs -U -L rootfs /dev/${mddev}s2a
|
||||||
chroot ${CHROOTDIR} tunefs -j enable -N enable /dev/${mddev}s2a
|
chroot ${CHROOTDIR} tunefs -N enable /dev/${mddev}s2a
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
@ -80,11 +80,15 @@ arm_create_disk() {
|
|||||||
arm_create_user() {
|
arm_create_user() {
|
||||||
# Create a default user account 'freebsd' with the password 'freebsd',
|
# Create a default user account 'freebsd' with the password 'freebsd',
|
||||||
# and set the default password for the 'root' user to 'root'.
|
# and set the default password for the 'root' user to 'root'.
|
||||||
chroot ${CHROOTDIR} /usr/sbin/pw groupadd freebsd -g 1001
|
chroot ${CHROOTDIR} /usr/sbin/pw -R ${DESTDIR} \
|
||||||
chroot ${CHROOTDIR} /usr/sbin/pw useradd freebsd \
|
groupadd freebsd -g 1001
|
||||||
|
chroot ${CHROOTDIR} mkdir -p ${DESTDIR}/home/freebsd
|
||||||
|
chroot ${CHROOTDIR} /usr/sbin/pw -R ${DESTDIR} \
|
||||||
|
useradd freebsd \
|
||||||
-m -M 0755 -w yes -n freebsd -u 1001 -g 1001 -G 0 \
|
-m -M 0755 -w yes -n freebsd -u 1001 -g 1001 -G 0 \
|
||||||
-c 'FreeBSD User' -d '/home/freebsd' -s '/bin/csh'
|
-c 'FreeBSD User' -d '/home/freebsd' -s '/bin/csh'
|
||||||
chroot ${CHROOTDIR} /usr/sbin/pw usermod root -w yes
|
chroot ${CHROOTDIR} /usr/sbin/pw -R ${DESTDIR} \
|
||||||
|
usermod root -w yes
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,5 @@
|
|||||||
PROG= badsect
|
PROG= badsect
|
||||||
LIBADD= ufs
|
LIBADD= ufs
|
||||||
MAN= badsect.8
|
MAN= badsect.8
|
||||||
WARNS?= 2
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
.include <bsd.prog.mk>
|
||||||
|
@ -2566,12 +2566,11 @@ atahpa(struct cam_device *device, int retry_count, int timeout,
|
|||||||
struct ata_params *ident_buf;
|
struct ata_params *ident_buf;
|
||||||
struct ccb_getdev cgd;
|
struct ccb_getdev cgd;
|
||||||
struct ata_set_max_pwd pwd;
|
struct ata_set_max_pwd pwd;
|
||||||
int error, confirm, quiet, c, action, actions, setpwd, persist;
|
int error, confirm, quiet, c, action, actions, persist;
|
||||||
int security, is48bit, pwdsize;
|
int security, is48bit, pwdsize;
|
||||||
u_int64_t hpasize, maxsize;
|
u_int64_t hpasize, maxsize;
|
||||||
|
|
||||||
actions = 0;
|
actions = 0;
|
||||||
setpwd = 0;
|
|
||||||
confirm = 0;
|
confirm = 0;
|
||||||
quiet = 0;
|
quiet = 0;
|
||||||
maxsize = 0;
|
maxsize = 0;
|
||||||
|
@ -432,7 +432,7 @@ scsipersist(struct cam_device *device, int argc, char **argv, char *combinedopt,
|
|||||||
uint32_t res_len = 0;
|
uint32_t res_len = 0;
|
||||||
unsigned long rel_tgt_port = 0;
|
unsigned long rel_tgt_port = 0;
|
||||||
uint8_t *res_buf = NULL;
|
uint8_t *res_buf = NULL;
|
||||||
int scope = SPR_LU_SCOPE, res_type = 0, key_set = 0, sa_key_set = 0;
|
int scope = SPR_LU_SCOPE, res_type = 0;
|
||||||
struct persist_transport_id *id, *id2;
|
struct persist_transport_id *id, *id2;
|
||||||
STAILQ_HEAD(, persist_transport_id) transport_id_list;
|
STAILQ_HEAD(, persist_transport_id) transport_id_list;
|
||||||
uint64_t key = 0, sa_key = 0;
|
uint64_t key = 0, sa_key = 0;
|
||||||
@ -510,10 +510,8 @@ scsipersist(struct cam_device *device, int argc, char **argv, char *combinedopt,
|
|||||||
}
|
}
|
||||||
if (c == 'k') {
|
if (c == 'k') {
|
||||||
key = tmpval;
|
key = tmpval;
|
||||||
key_set = 1;
|
|
||||||
} else {
|
} else {
|
||||||
sa_key = tmpval;
|
sa_key = tmpval;
|
||||||
sa_key_set = 1;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ This paper contains the road-map for a stackable "BIO" system in
|
|||||||
FreeBSD, which will support these facilities.
|
FreeBSD, which will support these facilities.
|
||||||
.AE
|
.AE
|
||||||
.NH
|
.NH
|
||||||
The miseducation of \f(CW.)struct buf\fP.
|
The miseducation of \f(CWstruct buf\fP.
|
||||||
.PP
|
.PP
|
||||||
To fully appreciate the topic, I include a little historic overview
|
To fully appreciate the topic, I include a little historic overview
|
||||||
of struct buf, it is a most enlightening case of not exactly bit-rot
|
of struct buf, it is a most enlightening case of not exactly bit-rot
|
||||||
@ -215,7 +215,7 @@ and Vinum. They all basically do the same: they map I/O requests from
|
|||||||
a logical space to a physical space, and the mappings they perform
|
a logical space to a physical space, and the mappings they perform
|
||||||
can be 1:1 or 1:N. \**
|
can be 1:1 or 1:N. \**
|
||||||
.FS
|
.FS
|
||||||
It is interesting to note that Lions in his comments to the \f(CW.)rkaddr\fP
|
It is interesting to note that Lions in his comments to the \f(CWrkaddr\fP
|
||||||
routine (p. 16-2) writes \fIThe code in this procedure incorporates
|
routine (p. 16-2) writes \fIThe code in this procedure incorporates
|
||||||
a special feature for files which extend over more than one disk
|
a special feature for files which extend over more than one disk
|
||||||
drive. This feature is described in the UPM Section "RK(IV)". Its
|
drive. This feature is described in the UPM Section "RK(IV)". Its
|
||||||
@ -258,7 +258,7 @@ limited extent diskslice/label, which
|
|||||||
need only the I/O aspect, not the vnode, caching or VM linkage.
|
need only the I/O aspect, not the vnode, caching or VM linkage.
|
||||||
.IP
|
.IP
|
||||||
.I
|
.I
|
||||||
The I/O aspect of struct buf should be put in a separate \f(CW.)struct bio\fP.
|
The I/O aspect of struct buf should be put in a separate \f(CWstruct bio\fP.
|
||||||
.R
|
.R
|
||||||
.NH 1
|
.NH 1
|
||||||
Implications for future struct buf improvements
|
Implications for future struct buf improvements
|
||||||
@ -296,7 +296,7 @@ Anything that could be added to or done with
|
|||||||
the I/O aspect of struct buf can also be added to or done
|
the I/O aspect of struct buf can also be added to or done
|
||||||
with the I/O aspect if it lives in a new "struct bio".
|
with the I/O aspect if it lives in a new "struct bio".
|
||||||
.NH 1
|
.NH 1
|
||||||
Implementing a \f(CW.)struct bio\fP
|
Implementing a \f(CWstruct bio\fP
|
||||||
.PP
|
.PP
|
||||||
The first decision to be made was who got to use the name "struct buf",
|
The first decision to be made was who got to use the name "struct buf",
|
||||||
and considering the fact that it is the I/O aspect which gets separated
|
and considering the fact that it is the I/O aspect which gets separated
|
||||||
|
@ -104,7 +104,10 @@ while getopts ac:C:d:e:g:hH:iI:m:p:t: c ; do
|
|||||||
console=${OPTARG}
|
console=${OPTARG}
|
||||||
;;
|
;;
|
||||||
d)
|
d)
|
||||||
eval "disk_dev${disk_total}=\"${OPTARG}\""
|
disk_dev=${OPTARG%%,*}
|
||||||
|
disk_opts=${OPTARG#${disk_dev}}
|
||||||
|
eval "disk_dev${disk_total}=\"${disk_dev}\""
|
||||||
|
eval "disk_opts${disk_total}=\"${disk_opts}\""
|
||||||
disk_total=$(($disk_total + 1))
|
disk_total=$(($disk_total + 1))
|
||||||
;;
|
;;
|
||||||
e)
|
e)
|
||||||
@ -183,16 +186,16 @@ make_and_check_diskdev()
|
|||||||
|
|
||||||
echo "Launching virtual machine \"$vmname\" ..."
|
echo "Launching virtual machine \"$vmname\" ..."
|
||||||
|
|
||||||
virtio_diskdev="$disk_dev0"
|
first_diskdev="$disk_dev0"
|
||||||
|
|
||||||
${BHYVECTL} --vm=${vmname} --destroy > /dev/null 2>&1
|
${BHYVECTL} --vm=${vmname} --destroy > /dev/null 2>&1
|
||||||
|
|
||||||
while [ 1 ]; do
|
while [ 1 ]; do
|
||||||
|
|
||||||
file -s ${virtio_diskdev} | grep "boot sector" > /dev/null
|
file -s ${first_diskdev} | grep "boot sector" > /dev/null
|
||||||
rc=$?
|
rc=$?
|
||||||
if [ $rc -ne 0 ]; then
|
if [ $rc -ne 0 ]; then
|
||||||
file -s ${virtio_diskdev} | grep ": Unix Fast File sys" > /dev/null
|
file -s ${first_diskdev} | grep ": Unix Fast File sys" > /dev/null
|
||||||
rc=$?
|
rc=$?
|
||||||
fi
|
fi
|
||||||
if [ $rc -ne 0 ]; then
|
if [ $rc -ne 0 ]; then
|
||||||
@ -207,14 +210,22 @@ while [ 1 ]; do
|
|||||||
echo "is not readable"
|
echo "is not readable"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
BOOTDISK=${isofile}
|
BOOTDISKS="-d ${isofile}"
|
||||||
installer_opt="-s 31:0,ahci-cd,${BOOTDISK}"
|
installer_opt="-s 31:0,ahci-cd,${isofile}"
|
||||||
else
|
else
|
||||||
BOOTDISK=${virtio_diskdev}
|
BOOTDISKS=""
|
||||||
|
i=0
|
||||||
|
while [ $i -lt $disk_total ] ; do
|
||||||
|
eval "disk=\$disk_dev${i}"
|
||||||
|
if [ -r ${disk} ] ; then
|
||||||
|
BOOTDISKS="$BOOTDISKS -d ${disk} "
|
||||||
|
fi
|
||||||
|
i=$(($i + 1))
|
||||||
|
done
|
||||||
installer_opt=""
|
installer_opt=""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
${LOADER} -c ${console} -m ${memsize} -d ${BOOTDISK} ${loader_opt} \
|
${LOADER} -c ${console} -m ${memsize} ${BOOTDISKS} ${loader_opt} \
|
||||||
${vmname}
|
${vmname}
|
||||||
bhyve_exit=$?
|
bhyve_exit=$?
|
||||||
if [ $bhyve_exit -ne 0 ]; then
|
if [ $bhyve_exit -ne 0 ]; then
|
||||||
@ -237,8 +248,9 @@ while [ 1 ]; do
|
|||||||
i=0
|
i=0
|
||||||
while [ $i -lt $disk_total ] ; do
|
while [ $i -lt $disk_total ] ; do
|
||||||
eval "disk=\$disk_dev${i}"
|
eval "disk=\$disk_dev${i}"
|
||||||
|
eval "opts=\$disk_opts${i}"
|
||||||
make_and_check_diskdev "${disk}"
|
make_and_check_diskdev "${disk}"
|
||||||
devargs="$devargs -s $nextslot:0,virtio-blk,${disk} "
|
devargs="$devargs -s $nextslot:0,virtio-blk,${disk}${opts} "
|
||||||
nextslot=$(($nextslot + 1))
|
nextslot=$(($nextslot + 1))
|
||||||
i=$(($i + 1))
|
i=$(($i + 1))
|
||||||
done
|
done
|
||||||
|
@ -45,6 +45,14 @@ kernel configuration file:
|
|||||||
.Cd "device em"
|
.Cd "device em"
|
||||||
.Ed
|
.Ed
|
||||||
.Pp
|
.Pp
|
||||||
|
Optional multiqueue support is available via the following kernel
|
||||||
|
compile options:
|
||||||
|
.Bd -ragged -offset indent
|
||||||
|
.Cd "options EM_MULTIQUEUE"
|
||||||
|
.Ed
|
||||||
|
.Pp
|
||||||
|
Note: Activating EM_MULTIQUEUE support is not supported by Intel.
|
||||||
|
.Pp
|
||||||
Alternatively, to load the driver as a
|
Alternatively, to load the driver as a
|
||||||
module at boot time, place the following line in
|
module at boot time, place the following line in
|
||||||
.Xr loader.conf 5 :
|
.Xr loader.conf 5 :
|
||||||
@ -197,6 +205,18 @@ Tunables can be set at the
|
|||||||
prompt before booting the kernel or stored in
|
prompt before booting the kernel or stored in
|
||||||
.Xr loader.conf 5 .
|
.Xr loader.conf 5 .
|
||||||
.Bl -tag -width indent
|
.Bl -tag -width indent
|
||||||
|
.It Va hw.em.eee_setting
|
||||||
|
Disable or enable Energy Efficient Ethernet.
|
||||||
|
Default 1 (disabled).
|
||||||
|
.It Va hw.em.msix
|
||||||
|
Enable or disable MSI-X style interrupts.
|
||||||
|
Default 1 (enabled).
|
||||||
|
.It Va hw.em.smart_pwr_down
|
||||||
|
Enable or disable smart power down features on newer adapters.
|
||||||
|
Default 0 (disabled).
|
||||||
|
.It Va hw.em.sbp
|
||||||
|
Show bad packets when in promiscuous mode.
|
||||||
|
Default 0 (off).
|
||||||
.It Va hw.em.rxd
|
.It Va hw.em.rxd
|
||||||
Number of receive descriptors allocated by the driver.
|
Number of receive descriptors allocated by the driver.
|
||||||
The default value is 1024 for adapters newer than 82547,
|
The default value is 1024 for adapters newer than 82547,
|
||||||
@ -228,6 +248,11 @@ If
|
|||||||
.Va hw.em.tx_int_delay
|
.Va hw.em.tx_int_delay
|
||||||
is non-zero, this tunable limits the maximum delay in which a transmit
|
is non-zero, this tunable limits the maximum delay in which a transmit
|
||||||
interrupt is generated.
|
interrupt is generated.
|
||||||
|
.It Va hw.em.num_queues
|
||||||
|
Number of hardware queues that will be configured on this adapter (maximum of 2)
|
||||||
|
Defaults to 1.
|
||||||
|
Only valid with kernel configuration
|
||||||
|
.Cd "options EM_MULTIQUEUE".
|
||||||
.El
|
.El
|
||||||
.Sh FILES
|
.Sh FILES
|
||||||
.Bl -tag -width /dev/led/em*
|
.Bl -tag -width /dev/led/em*
|
||||||
@ -287,3 +312,5 @@ You can enable it on an
|
|||||||
.Nm
|
.Nm
|
||||||
interface using
|
interface using
|
||||||
.Xr ifconfig 8 .
|
.Xr ifconfig 8 .
|
||||||
|
.Pp
|
||||||
|
Activating EM_MULTIQUEUE support requires MSI-X features.
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd September 10, 2013
|
.Dd June 8, 2015
|
||||||
.Dt GEOM 4
|
.Dt GEOM 4
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -52,12 +52,14 @@
|
|||||||
.Cd options GEOM_JOURNAL
|
.Cd options GEOM_JOURNAL
|
||||||
.Cd options GEOM_LABEL
|
.Cd options GEOM_LABEL
|
||||||
.Cd options GEOM_LINUX_LVM
|
.Cd options GEOM_LINUX_LVM
|
||||||
|
.Cd options GEOM_MAP
|
||||||
.Cd options GEOM_MBR
|
.Cd options GEOM_MBR
|
||||||
.Cd options GEOM_MIRROR
|
.Cd options GEOM_MIRROR
|
||||||
.Cd options GEOM_MULTIPATH
|
.Cd options GEOM_MULTIPATH
|
||||||
.Cd options GEOM_NOP
|
.Cd options GEOM_NOP
|
||||||
.Cd options GEOM_PART_APM
|
.Cd options GEOM_PART_APM
|
||||||
.Cd options GEOM_PART_BSD
|
.Cd options GEOM_PART_BSD
|
||||||
|
.Cd options GEOM_PART_BSD64
|
||||||
.Cd options GEOM_PART_EBR
|
.Cd options GEOM_PART_EBR
|
||||||
.Cd options GEOM_PART_EBR_COMPAT
|
.Cd options GEOM_PART_EBR_COMPAT
|
||||||
.Cd options GEOM_PART_GPT
|
.Cd options GEOM_PART_GPT
|
||||||
@ -71,6 +73,7 @@
|
|||||||
.Cd options GEOM_SHSEC
|
.Cd options GEOM_SHSEC
|
||||||
.Cd options GEOM_STRIPE
|
.Cd options GEOM_STRIPE
|
||||||
.Cd options GEOM_SUNLABEL
|
.Cd options GEOM_SUNLABEL
|
||||||
|
.Cd options GEOM_UNCOMPRESS
|
||||||
.Cd options GEOM_UZIP
|
.Cd options GEOM_UZIP
|
||||||
.Cd options GEOM_VIRSTOR
|
.Cd options GEOM_VIRSTOR
|
||||||
.Cd options GEOM_VOL
|
.Cd options GEOM_VOL
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd May 17, 2011
|
.Dd June 8, 2015
|
||||||
.Dt GEOM_MAP 4
|
.Dt GEOM_MAP 4
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -36,7 +36,7 @@ To compile this driver into the kernel,
|
|||||||
place the following line in your
|
place the following line in your
|
||||||
kernel configuration file:
|
kernel configuration file:
|
||||||
.Bd -ragged -offset indent
|
.Bd -ragged -offset indent
|
||||||
.Cd "device geom_map"
|
.Cd "options geom_map"
|
||||||
.Ed
|
.Ed
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
The
|
The
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd November 7, 2014
|
.Dd June 2, 2015
|
||||||
.Dt GRE 4
|
.Dt GRE 4
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -117,6 +117,44 @@ ifconfig greN inet 192.168.2.1 192.168.1.1
|
|||||||
ifconfig greN inet tunnel B A
|
ifconfig greN inet tunnel B A
|
||||||
route add -net 192.168.1 -netmask 255.255.255.0 192.168.1.1
|
route add -net 192.168.1 -netmask 255.255.255.0 192.168.1.1
|
||||||
.Ed
|
.Ed
|
||||||
|
.Pp
|
||||||
|
In case when internal and external IP addresses are the same,
|
||||||
|
different routing tables (FIB) should be used.
|
||||||
|
The default FIB will be applied to IP packets before GRE encapsulation.
|
||||||
|
After encapsulation GRE interface should set different FIB number to
|
||||||
|
outgoing packet.
|
||||||
|
Then different FIB will be applied to such encapsulated packets.
|
||||||
|
According to this FIB packet should be routed to tunnel endpoint.
|
||||||
|
.Bd -literal
|
||||||
|
Host X -- Host A (198.51.100.1) ---tunnel--- Cisco D (203.0.113.1) -- Host E
|
||||||
|
\\ /
|
||||||
|
\\ /
|
||||||
|
+----- Host B ----- Host C -----+
|
||||||
|
(198.51.100.254)
|
||||||
|
.Ed
|
||||||
|
.Pp
|
||||||
|
On Host A (FreeBSD):
|
||||||
|
.Pp
|
||||||
|
First of multiple FIBs should be configured via loader.conf:
|
||||||
|
.Bd -literal -offset indent
|
||||||
|
net.fibs=2
|
||||||
|
net.add_addr_allfibs=0
|
||||||
|
.Ed
|
||||||
|
.Pp
|
||||||
|
Then routes to the gateway and remote tunnel endpoint via this gateway
|
||||||
|
should be added to the second FIB:
|
||||||
|
.Bd -literal -offset indent
|
||||||
|
route add -net 198.51.100.0 -netmask 255.255.255.0 -fib 1 -iface em0
|
||||||
|
route add -host 203.0.113.1 -fib 1 198.51.100.254
|
||||||
|
.Ed
|
||||||
|
.Pp
|
||||||
|
And GRE tunnel should be configured to change FIB for encapsulated packets:
|
||||||
|
.Bd -literal -offset indent
|
||||||
|
ifconfig greN create
|
||||||
|
ifconfig greN inet 198.51.100.1 203.0.113.1
|
||||||
|
ifconfig greN inet tunnel 198.51.100.1 203.0.113.1 tunnelfib 1
|
||||||
|
.Ed
|
||||||
|
.Pp
|
||||||
.Sh NOTES
|
.Sh NOTES
|
||||||
The MTU of
|
The MTU of
|
||||||
.Nm
|
.Nm
|
||||||
|
@ -13,7 +13,9 @@ MAN= crash.8 \
|
|||||||
${_uefi.8} \
|
${_uefi.8} \
|
||||||
yp.8
|
yp.8
|
||||||
|
|
||||||
MLINKS= rc.8 rc.atm.8 \
|
MLINKS= \
|
||||||
|
nanobsd.8 nanobsd.sh.8 \
|
||||||
|
rc.8 rc.atm.8 \
|
||||||
rc.8 rc.d.8 \
|
rc.8 rc.d.8 \
|
||||||
rc.8 rc.firewall.8 \
|
rc.8 rc.firewall.8 \
|
||||||
rc.8 rc.local.8 \
|
rc.8 rc.local.8 \
|
||||||
|
@ -68,6 +68,7 @@ bf [label="Brendan Fabeny\nbf@FreeBSD.org\n2010/06/02"]
|
|||||||
bland [label="Alexander Nedotsukov\nbland@FreeBSD.org\n2003/08/14"]
|
bland [label="Alexander Nedotsukov\nbland@FreeBSD.org\n2003/08/14"]
|
||||||
bmah [label="Bruce A. Mah\nbmah@FreeBSD.org\n2000/08/23"]
|
bmah [label="Bruce A. Mah\nbmah@FreeBSD.org\n2000/08/23"]
|
||||||
bofh [label="Muhammad Moinur Rahman\nbofh@FreeBSD.org\n2014/12/23"]
|
bofh [label="Muhammad Moinur Rahman\nbofh@FreeBSD.org\n2014/12/23"]
|
||||||
|
brnrd [label="Bernard Spil\nbrnrd@FreeBSD.org\n2015/05/24"]
|
||||||
brix [label="Henrik Brix Andersen\nbrix@FreeBSD.org\n2007/10/31"]
|
brix [label="Henrik Brix Andersen\nbrix@FreeBSD.org\n2007/10/31"]
|
||||||
brooks [label="Brooks Davies\nbrooks@FreeBSD.org\n2004/05/03"]
|
brooks [label="Brooks Davies\nbrooks@FreeBSD.org\n2004/05/03"]
|
||||||
bsam [label="Boris Samorodov\nbsam@FreeBSD.org\n2006/07/20"]
|
bsam [label="Boris Samorodov\nbsam@FreeBSD.org\n2006/07/20"]
|
||||||
@ -224,6 +225,7 @@ trociny [label="Mikolaj Golub\ntrociny@FreeBSD.org\n2013/10/17"]
|
|||||||
uqs [label="Ulrich Spoerlein\nuqs@FreeBSD.org\n2012/01/19"]
|
uqs [label="Ulrich Spoerlein\nuqs@FreeBSD.org\n2012/01/19"]
|
||||||
vd [label="Vasil Dimov\nvd@FreeBSD.org\n2006/01/19"]
|
vd [label="Vasil Dimov\nvd@FreeBSD.org\n2006/01/19"]
|
||||||
vg [label="Veniamin Gvozdikov\nvg@FreeBSD.org\n2013/06/11"]
|
vg [label="Veniamin Gvozdikov\nvg@FreeBSD.org\n2013/06/11"]
|
||||||
|
vsevolod [label="Vsevolod Stakhov\nvsevolod@FreeBSD.org\n2005/07/22"]
|
||||||
wen [label="Wen Heping\nwen@FreeBSD.org\n2010/12/13"]
|
wen [label="Wen Heping\nwen@FreeBSD.org\n2010/12/13"]
|
||||||
wg [label="William Grzybowski\nwg@FreeBSD.org\n2013/04/01"]
|
wg [label="William Grzybowski\nwg@FreeBSD.org\n2013/04/01"]
|
||||||
wxs [label="Wesley Shields\nwxs@FreeBSD.org\n2008/01/03"]
|
wxs [label="Wesley Shields\nwxs@FreeBSD.org\n2008/01/03"]
|
||||||
@ -404,6 +406,7 @@ knu -> maho
|
|||||||
knu -> nobutaka
|
knu -> nobutaka
|
||||||
knu -> nork
|
knu -> nork
|
||||||
|
|
||||||
|
koobs -> brnrd
|
||||||
koobs -> kami
|
koobs -> kami
|
||||||
koobs -> xmj
|
koobs -> xmj
|
||||||
|
|
||||||
@ -576,6 +579,8 @@ thierry -> riggs
|
|||||||
tmclaugh -> itetcu
|
tmclaugh -> itetcu
|
||||||
tmclaugh -> xride
|
tmclaugh -> xride
|
||||||
|
|
||||||
|
vsevolod -> brnrd
|
||||||
|
|
||||||
wen -> cs
|
wen -> cs
|
||||||
wen -> culot
|
wen -> culot
|
||||||
wen -> pawel
|
wen -> pawel
|
||||||
|
@ -169,7 +169,7 @@ _LIBS= lib${LIB_PRIVATE}${LIB}.a
|
|||||||
lib${LIB_PRIVATE}${LIB}.a: ${OBJS} ${STATICOBJS}
|
lib${LIB_PRIVATE}${LIB}.a: ${OBJS} ${STATICOBJS}
|
||||||
@${ECHO} building static ${LIB} library
|
@${ECHO} building static ${LIB} library
|
||||||
@rm -f ${.TARGET}
|
@rm -f ${.TARGET}
|
||||||
@${AR} ${ARFLAGS} ${.TARGET} `NM='${NM}' lorder ${OBJS} ${STATICOBJS} | tsort -q` ${ARADD}
|
${AR} ${ARFLAGS} ${.TARGET} `NM='${NM}' lorder ${OBJS} ${STATICOBJS} | tsort -q` ${ARADD}
|
||||||
${RANLIB} ${RANLIBFLAGS} ${.TARGET}
|
${RANLIB} ${RANLIBFLAGS} ${.TARGET}
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
@ -183,7 +183,7 @@ NOPATH_FILES+= ${POBJS}
|
|||||||
lib${LIB_PRIVATE}${LIB}_p.a: ${POBJS}
|
lib${LIB_PRIVATE}${LIB}_p.a: ${POBJS}
|
||||||
@${ECHO} building profiled ${LIB} library
|
@${ECHO} building profiled ${LIB} library
|
||||||
@rm -f ${.TARGET}
|
@rm -f ${.TARGET}
|
||||||
@${AR} ${ARFLAGS} ${.TARGET} `NM='${NM}' lorder ${POBJS} | tsort -q` ${ARADD}
|
${AR} ${ARFLAGS} ${.TARGET} `NM='${NM}' lorder ${POBJS} | tsort -q` ${ARADD}
|
||||||
${RANLIB} ${RANLIBFLAGS} ${.TARGET}
|
${RANLIB} ${RANLIBFLAGS} ${.TARGET}
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
@ -240,7 +240,7 @@ _LIBS+= lib${LIB_PRIVATE}${LIB}_pic.a
|
|||||||
lib${LIB_PRIVATE}${LIB}_pic.a: ${SOBJS}
|
lib${LIB_PRIVATE}${LIB}_pic.a: ${SOBJS}
|
||||||
@${ECHO} building special pic ${LIB} library
|
@${ECHO} building special pic ${LIB} library
|
||||||
@rm -f ${.TARGET}
|
@rm -f ${.TARGET}
|
||||||
@${AR} ${ARFLAGS} ${.TARGET} ${SOBJS} ${ARADD}
|
${AR} ${ARFLAGS} ${.TARGET} ${SOBJS} ${ARADD}
|
||||||
${RANLIB} ${RANLIBFLAGS} ${.TARGET}
|
${RANLIB} ${RANLIBFLAGS} ${.TARGET}
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
|
@ -70,3 +70,16 @@ MK_${var}:= no
|
|||||||
.for var in ${BROKEN_OPTIONS}
|
.for var in ${BROKEN_OPTIONS}
|
||||||
MK_${var}:= no
|
MK_${var}:= no
|
||||||
.endfor
|
.endfor
|
||||||
|
|
||||||
|
.for vv in ${__DEFAULT_DEPENDENT_OPTIONS}
|
||||||
|
.if defined(WITH_${vv:H}) && defined(WITHOUT_${vv:H})
|
||||||
|
MK_${vv:H}?= no
|
||||||
|
.elif defined(WITH_${vv:H})
|
||||||
|
MK_${vv:H}?= yes
|
||||||
|
.elif defined(WITHOUT_${vv:H})
|
||||||
|
MK_${vv:H}?= no
|
||||||
|
.else
|
||||||
|
MK_${vv:H}?= ${MK_${vv:T}}
|
||||||
|
.endif
|
||||||
|
.endfor
|
||||||
|
.undef __DEFAULT_DEPENDENT_OPTIONS
|
||||||
|
@ -74,6 +74,7 @@ u_int cpu_fxsr; /* SSE enabled */
|
|||||||
u_int cpu_mxcsr_mask; /* Valid bits in mxcsr */
|
u_int cpu_mxcsr_mask; /* Valid bits in mxcsr */
|
||||||
u_int cpu_clflush_line_size = 32;
|
u_int cpu_clflush_line_size = 32;
|
||||||
u_int cpu_stdext_feature;
|
u_int cpu_stdext_feature;
|
||||||
|
u_int cpu_stdext_feature2;
|
||||||
u_int cpu_max_ext_state_size;
|
u_int cpu_max_ext_state_size;
|
||||||
u_int cpu_mon_mwait_flags; /* MONITOR/MWAIT flags (CPUID.05H.ECX) */
|
u_int cpu_mon_mwait_flags; /* MONITOR/MWAIT flags (CPUID.05H.ECX) */
|
||||||
u_int cpu_mon_min_size; /* MONITOR minimum range size, bytes */
|
u_int cpu_mon_min_size; /* MONITOR minimum range size, bytes */
|
||||||
|
@ -4844,6 +4844,7 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
|
|||||||
PG_PS_FRAME, &lock))) {
|
PG_PS_FRAME, &lock))) {
|
||||||
*pde = srcptepaddr & ~PG_W;
|
*pde = srcptepaddr & ~PG_W;
|
||||||
pmap_resident_count_inc(dst_pmap, NBPDR / PAGE_SIZE);
|
pmap_resident_count_inc(dst_pmap, NBPDR / PAGE_SIZE);
|
||||||
|
atomic_add_long(&pmap_pde_mappings, 1);
|
||||||
} else
|
} else
|
||||||
dstmpde->wire_count--;
|
dstmpde->wire_count--;
|
||||||
continue;
|
continue;
|
||||||
|
@ -49,6 +49,7 @@ extern u_int via_feature_rng;
|
|||||||
extern u_int via_feature_xcrypt;
|
extern u_int via_feature_xcrypt;
|
||||||
extern u_int cpu_clflush_line_size;
|
extern u_int cpu_clflush_line_size;
|
||||||
extern u_int cpu_stdext_feature;
|
extern u_int cpu_stdext_feature;
|
||||||
|
extern u_int cpu_stdext_feature2;
|
||||||
extern u_int cpu_fxsr;
|
extern u_int cpu_fxsr;
|
||||||
extern u_int cpu_high;
|
extern u_int cpu_high;
|
||||||
extern u_int cpu_id;
|
extern u_int cpu_id;
|
||||||
|
@ -90,13 +90,12 @@
|
|||||||
#define VM_PHYSSEG_MAX 63
|
#define VM_PHYSSEG_MAX 63
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create three free page pools: VM_FREEPOOL_DEFAULT is the default pool
|
* Create two free page pools: VM_FREEPOOL_DEFAULT is the default pool
|
||||||
* from which physical pages are allocated and VM_FREEPOOL_DIRECT is
|
* from which physical pages are allocated and VM_FREEPOOL_DIRECT is
|
||||||
* the pool from which physical pages for page tables and small UMA
|
* the pool from which physical pages for page tables and small UMA
|
||||||
* objects are allocated.
|
* objects are allocated.
|
||||||
*/
|
*/
|
||||||
#define VM_NFREEPOOL 3
|
#define VM_NFREEPOOL 2
|
||||||
#define VM_FREEPOOL_CACHE 2
|
|
||||||
#define VM_FREEPOOL_DEFAULT 0
|
#define VM_FREEPOOL_DEFAULT 0
|
||||||
#define VM_FREEPOOL_DIRECT 1
|
#define VM_FREEPOOL_DIRECT 1
|
||||||
|
|
||||||
|
@ -45,9 +45,9 @@ ENTRY(futex_xchgl)
|
|||||||
movq $VM_MAXUSER_ADDRESS-4,%rax
|
movq $VM_MAXUSER_ADDRESS-4,%rax
|
||||||
cmpq %rax,%rsi
|
cmpq %rax,%rsi
|
||||||
ja futex_fault
|
ja futex_fault
|
||||||
xchgq %rdi,(%rsi)
|
xchgl %edi,(%rsi)
|
||||||
movq %rdi,(%rdx)
|
movl %edi,(%rdx)
|
||||||
xorq %rax,%rax
|
xorl %eax,%eax
|
||||||
movq %rax,PCB_ONFAULT(%r8)
|
movq %rax,PCB_ONFAULT(%r8)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@ -60,9 +60,9 @@ ENTRY(futex_addl)
|
|||||||
#ifdef SMP
|
#ifdef SMP
|
||||||
lock
|
lock
|
||||||
#endif
|
#endif
|
||||||
xaddq %rdi,(%rsi)
|
xaddl %edi,(%rsi)
|
||||||
movq %rdi,(%rdx)
|
movl %edi,(%rdx)
|
||||||
xorq %rax,%rax
|
xorl %eax,%eax
|
||||||
movq %rax,PCB_ONFAULT(%r8)
|
movq %rax,PCB_ONFAULT(%r8)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@ -72,16 +72,16 @@ ENTRY(futex_orl)
|
|||||||
movq $VM_MAXUSER_ADDRESS-4,%rax
|
movq $VM_MAXUSER_ADDRESS-4,%rax
|
||||||
cmpq %rax,%rsi
|
cmpq %rax,%rsi
|
||||||
ja futex_fault
|
ja futex_fault
|
||||||
movq (%rsi),%rax
|
movl (%rsi),%eax
|
||||||
1: movq %rax,%rcx
|
1: movl %eax,%ecx
|
||||||
orq %rdi,%rcx
|
orl %edi,%ecx
|
||||||
#ifdef SMP
|
#ifdef SMP
|
||||||
lock
|
lock
|
||||||
#endif
|
#endif
|
||||||
cmpxchgq %rcx,(%rsi)
|
cmpxchgl %ecx,(%rsi)
|
||||||
jnz 1b
|
jnz 1b
|
||||||
movq %rax,(%rdx)
|
movl %eax,(%rdx)
|
||||||
xorq %rax,%rax
|
xorl %eax,%eax
|
||||||
movq %rax,PCB_ONFAULT(%r8)
|
movq %rax,PCB_ONFAULT(%r8)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@ -91,16 +91,16 @@ ENTRY(futex_andl)
|
|||||||
movq $VM_MAXUSER_ADDRESS-4,%rax
|
movq $VM_MAXUSER_ADDRESS-4,%rax
|
||||||
cmpq %rax,%rsi
|
cmpq %rax,%rsi
|
||||||
ja futex_fault
|
ja futex_fault
|
||||||
movq (%rsi),%rax
|
movl (%rsi),%eax
|
||||||
1: movq %rax,%rcx
|
1: movl %eax,%ecx
|
||||||
andq %rdi,%rcx
|
andl %edi,%ecx
|
||||||
#ifdef SMP
|
#ifdef SMP
|
||||||
lock
|
lock
|
||||||
#endif
|
#endif
|
||||||
cmpxchgq %rcx,(%rsi)
|
cmpxchgl %ecx,(%rsi)
|
||||||
jnz 1b
|
jnz 1b
|
||||||
movq %rax,(%rdx)
|
movl %eax,(%rdx)
|
||||||
xorq %rax,%rax
|
xorl %eax,%eax
|
||||||
movq %rax,PCB_ONFAULT(%r8)
|
movq %rax,PCB_ONFAULT(%r8)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@ -110,15 +110,15 @@ ENTRY(futex_xorl)
|
|||||||
movq $VM_MAXUSER_ADDRESS-4,%rax
|
movq $VM_MAXUSER_ADDRESS-4,%rax
|
||||||
cmpq %rax,%rsi
|
cmpq %rax,%rsi
|
||||||
ja futex_fault
|
ja futex_fault
|
||||||
movq (%rsi),%rax
|
movl (%rsi),%eax
|
||||||
1: movq %rax,%rcx
|
1: movl %eax,%ecx
|
||||||
xorq %rdi,%rcx
|
xorl %edi,%ecx
|
||||||
#ifdef SMP
|
#ifdef SMP
|
||||||
lock
|
lock
|
||||||
#endif
|
#endif
|
||||||
cmpxchgq %rcx,(%rsi)
|
cmpxchgl %ecx,(%rsi)
|
||||||
jnz 1b
|
jnz 1b
|
||||||
movq %rax,(%rdx)
|
movl %eax,(%rdx)
|
||||||
xorq %rax,%rax
|
xorl %eax,%eax
|
||||||
movq %rax,PCB_ONFAULT(%r8)
|
movq %rax,PCB_ONFAULT(%r8)
|
||||||
ret
|
ret
|
||||||
|
@ -102,8 +102,8 @@ static MALLOC_DEFINE(M_SVM_VLAPIC, "svm-vlapic", "svm-vlapic");
|
|||||||
/* Per-CPU context area. */
|
/* Per-CPU context area. */
|
||||||
extern struct pcpu __pcpu[];
|
extern struct pcpu __pcpu[];
|
||||||
|
|
||||||
static uint32_t svm_feature; /* AMD SVM features. */
|
static uint32_t svm_feature = ~0U; /* AMD SVM features. */
|
||||||
SYSCTL_UINT(_hw_vmm_svm, OID_AUTO, features, CTLFLAG_RD, &svm_feature, 0,
|
SYSCTL_UINT(_hw_vmm_svm, OID_AUTO, features, CTLFLAG_RDTUN, &svm_feature, 0,
|
||||||
"SVM features advertised by CPUID.8000000AH:EDX");
|
"SVM features advertised by CPUID.8000000AH:EDX");
|
||||||
|
|
||||||
static int disable_npf_assist;
|
static int disable_npf_assist;
|
||||||
@ -112,7 +112,7 @@ SYSCTL_INT(_hw_vmm_svm, OID_AUTO, disable_npf_assist, CTLFLAG_RWTUN,
|
|||||||
|
|
||||||
/* Maximum ASIDs supported by the processor */
|
/* Maximum ASIDs supported by the processor */
|
||||||
static uint32_t nasid;
|
static uint32_t nasid;
|
||||||
SYSCTL_UINT(_hw_vmm_svm, OID_AUTO, num_asids, CTLFLAG_RD, &nasid, 0,
|
SYSCTL_UINT(_hw_vmm_svm, OID_AUTO, num_asids, CTLFLAG_RDTUN, &nasid, 0,
|
||||||
"Number of ASIDs supported by this processor");
|
"Number of ASIDs supported by this processor");
|
||||||
|
|
||||||
/* Current ASID generation for each host cpu */
|
/* Current ASID generation for each host cpu */
|
||||||
@ -174,9 +174,14 @@ check_svm_features(void)
|
|||||||
|
|
||||||
/* CPUID Fn8000_000A is for SVM */
|
/* CPUID Fn8000_000A is for SVM */
|
||||||
do_cpuid(0x8000000A, regs);
|
do_cpuid(0x8000000A, regs);
|
||||||
svm_feature = regs[3];
|
svm_feature &= regs[3];
|
||||||
|
|
||||||
nasid = regs[1];
|
/*
|
||||||
|
* The number of ASIDs can be configured to be less than what is
|
||||||
|
* supported by the hardware but not more.
|
||||||
|
*/
|
||||||
|
if (nasid == 0 || nasid > regs[1])
|
||||||
|
nasid = regs[1];
|
||||||
KASSERT(nasid > 1, ("Insufficient ASIDs for guests: %#x", nasid));
|
KASSERT(nasid > 1, ("Insufficient ASIDs for guests: %#x", nasid));
|
||||||
|
|
||||||
/* bhyve requires the Nested Paging feature */
|
/* bhyve requires the Nested Paging feature */
|
||||||
|
@ -856,10 +856,11 @@ vmx_vminit(struct vm *vm, pmap_t pmap)
|
|||||||
* VM exit and entry respectively. It is also restored from the
|
* VM exit and entry respectively. It is also restored from the
|
||||||
* host VMCS area on a VM exit.
|
* host VMCS area on a VM exit.
|
||||||
*
|
*
|
||||||
* The TSC MSR is exposed read-only. Writes are disallowed as that
|
* The TSC MSR is exposed read-only. Writes are disallowed as
|
||||||
* will impact the host TSC.
|
* that will impact the host TSC. If the guest does a write
|
||||||
* XXX Writes would be implemented with a wrmsr trap, and
|
* the "use TSC offsetting" execution control is enabled and the
|
||||||
* then modifying the TSC offset in the VMCS.
|
* difference between the host TSC and the guest TSC is written
|
||||||
|
* into the TSC offset in the VMCS.
|
||||||
*/
|
*/
|
||||||
if (guest_msr_rw(vmx, MSR_GSBASE) ||
|
if (guest_msr_rw(vmx, MSR_GSBASE) ||
|
||||||
guest_msr_rw(vmx, MSR_FSBASE) ||
|
guest_msr_rw(vmx, MSR_FSBASE) ||
|
||||||
@ -1130,6 +1131,22 @@ vmx_clear_nmi_window_exiting(struct vmx *vmx, int vcpu)
|
|||||||
VCPU_CTR0(vmx->vm, vcpu, "Disabling NMI window exiting");
|
VCPU_CTR0(vmx->vm, vcpu, "Disabling NMI window exiting");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
vmx_set_tsc_offset(struct vmx *vmx, int vcpu, uint64_t offset)
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
|
||||||
|
if ((vmx->cap[vcpu].proc_ctls & PROCBASED_TSC_OFFSET) == 0) {
|
||||||
|
vmx->cap[vcpu].proc_ctls |= PROCBASED_TSC_OFFSET;
|
||||||
|
vmcs_write(VMCS_PRI_PROC_BASED_CTLS, vmx->cap[vcpu].proc_ctls);
|
||||||
|
VCPU_CTR0(vmx->vm, vcpu, "Enabling TSC offsetting");
|
||||||
|
}
|
||||||
|
|
||||||
|
error = vmwrite(VMCS_TSC_OFFSET, offset);
|
||||||
|
|
||||||
|
return (error);
|
||||||
|
}
|
||||||
|
|
||||||
#define NMI_BLOCKING (VMCS_INTERRUPTIBILITY_NMI_BLOCKING | \
|
#define NMI_BLOCKING (VMCS_INTERRUPTIBILITY_NMI_BLOCKING | \
|
||||||
VMCS_INTERRUPTIBILITY_MOVSS_BLOCKING)
|
VMCS_INTERRUPTIBILITY_MOVSS_BLOCKING)
|
||||||
#define HWINTR_BLOCKING (VMCS_INTERRUPTIBILITY_STI_BLOCKING | \
|
#define HWINTR_BLOCKING (VMCS_INTERRUPTIBILITY_STI_BLOCKING | \
|
||||||
|
@ -135,6 +135,8 @@ void vmx_call_isr(uintptr_t entry);
|
|||||||
u_long vmx_fix_cr0(u_long cr0);
|
u_long vmx_fix_cr0(u_long cr0);
|
||||||
u_long vmx_fix_cr4(u_long cr4);
|
u_long vmx_fix_cr4(u_long cr4);
|
||||||
|
|
||||||
|
int vmx_set_tsc_offset(struct vmx *vmx, int vcpu, uint64_t offset);
|
||||||
|
|
||||||
extern char vmx_exit_guest[];
|
extern char vmx_exit_guest[];
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -474,6 +474,9 @@ vmx_wrmsr(struct vmx *vmx, int vcpuid, u_int num, uint64_t val, bool *retu)
|
|||||||
else
|
else
|
||||||
vm_inject_gp(vmx->vm, vcpuid);
|
vm_inject_gp(vmx->vm, vcpuid);
|
||||||
break;
|
break;
|
||||||
|
case MSR_TSC:
|
||||||
|
error = vmx_set_tsc_offset(vmx, vcpuid, val - rdtsc());
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
error = EINVAL;
|
error = EINVAL;
|
||||||
break;
|
break;
|
||||||
|
@ -2342,7 +2342,7 @@ verify_gla(struct vm *vm, int cpuid, uint64_t gla, struct vie *vie)
|
|||||||
* instruction
|
* instruction
|
||||||
*/
|
*/
|
||||||
if (vie->base_register == VM_REG_GUEST_RIP)
|
if (vie->base_register == VM_REG_GUEST_RIP)
|
||||||
base += vie->num_valid;
|
base += vie->num_processed;
|
||||||
}
|
}
|
||||||
|
|
||||||
idx = 0;
|
idx = 0;
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
*
|
*
|
||||||
* $FreeBSD$
|
* $FreeBSD$
|
||||||
*/
|
*/
|
||||||
|
#include "assym.s"
|
||||||
|
|
||||||
#include <machine/acle-compat.h>
|
#include <machine/acle-compat.h>
|
||||||
#include <machine/asm.h>
|
#include <machine/asm.h>
|
||||||
@ -33,6 +34,17 @@
|
|||||||
#include <machine/armreg.h>
|
#include <machine/armreg.h>
|
||||||
#include <machine/sysreg.h>
|
#include <machine/sysreg.h>
|
||||||
|
|
||||||
|
#if __ARM_ARCH >= 6
|
||||||
|
#define GET_PCB(tmp) \
|
||||||
|
mrc CP15_TPIDRPRW(tmp); \
|
||||||
|
add tmp, tmp, #(TD_PCB)
|
||||||
|
#else
|
||||||
|
.Lcurpcb:
|
||||||
|
.word _C_LABEL(__pcpu) + PC_CURPCB
|
||||||
|
#define GET_PCB(tmp) \
|
||||||
|
ldr tmp, .Lcurpcb
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Define cache functions used by startup code, which counts on the fact that
|
* Define cache functions used by startup code, which counts on the fact that
|
||||||
* only r0-r3,r12 (ip) are modified and no stack space is used. These functions
|
* only r0-r3,r12 (ip) are modified and no stack space is used. These functions
|
||||||
@ -208,3 +220,59 @@ ASENTRY_NP(dcache_wbinv_poc_all)
|
|||||||
bx lr
|
bx lr
|
||||||
#endif /* __ARM_ARCH == 6 */
|
#endif /* __ARM_ARCH == 6 */
|
||||||
END(dcache_wbinv_poc_all)
|
END(dcache_wbinv_poc_all)
|
||||||
|
|
||||||
|
ASENTRY_NP(dcache_wb_pou_checked)
|
||||||
|
ldr ip, .Lcpuinfo
|
||||||
|
ldr ip, [ip, #DCACHE_LINE_SIZE]
|
||||||
|
|
||||||
|
GET_PCB(r2)
|
||||||
|
ldr r2, [r2]
|
||||||
|
|
||||||
|
adr r3, _C_LABEL(cachebailout)
|
||||||
|
str r3, [r2, #PCB_ONFAULT]
|
||||||
|
1:
|
||||||
|
mcr CP15_DCCMVAC(r0)
|
||||||
|
add r0, r0, ip
|
||||||
|
subs r1, r1, ip
|
||||||
|
bhi 1b
|
||||||
|
DSB
|
||||||
|
mov r0, #0
|
||||||
|
str r0, [r2, #PCB_ONFAULT]
|
||||||
|
mov r0, #1 /* cannot be faulting address */
|
||||||
|
RET
|
||||||
|
|
||||||
|
.Lcpuinfo:
|
||||||
|
.word cpuinfo
|
||||||
|
END(dcache_wb_pou_checked)
|
||||||
|
|
||||||
|
ASENTRY_NP(icache_inv_pou_checked)
|
||||||
|
ldr ip, .Lcpuinfo
|
||||||
|
ldr ip, [ip, #ICACHE_LINE_SIZE]
|
||||||
|
|
||||||
|
GET_PCB(r2)
|
||||||
|
ldr r2, [r2]
|
||||||
|
|
||||||
|
adr r3, _C_LABEL(cachebailout)
|
||||||
|
str r3, [r2, #PCB_ONFAULT]
|
||||||
|
|
||||||
|
1:
|
||||||
|
mcr CP15_ICIMVAU(r0)
|
||||||
|
add r0, r0, ip
|
||||||
|
subs r1, r1, ip
|
||||||
|
bhi 1b
|
||||||
|
DSB
|
||||||
|
ISB
|
||||||
|
mov r0, #0
|
||||||
|
str r0, [r2, #PCB_ONFAULT]
|
||||||
|
mov r0, #1 /* cannot be faulting address */
|
||||||
|
RET
|
||||||
|
END(icache_inv_pou_checked)
|
||||||
|
|
||||||
|
/* label must be global as trap-v6.c references it */
|
||||||
|
.global _C_LABEL(cachebailout)
|
||||||
|
_C_LABEL(cachebailout):
|
||||||
|
DSB
|
||||||
|
ISB
|
||||||
|
mov r1, #0
|
||||||
|
str r1, [r2, #PCB_ONFAULT]
|
||||||
|
RET
|
||||||
|
@ -725,7 +725,6 @@ __start(void)
|
|||||||
(unsigned int)(&load_kernel) + 800, sp);
|
(unsigned int)(&load_kernel) + 800, sp);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __ARM_EABI__
|
|
||||||
/* We need to provide these functions but never call them */
|
/* We need to provide these functions but never call them */
|
||||||
void __aeabi_unwind_cpp_pr0(void);
|
void __aeabi_unwind_cpp_pr0(void);
|
||||||
void __aeabi_unwind_cpp_pr1(void);
|
void __aeabi_unwind_cpp_pr1(void);
|
||||||
@ -737,5 +736,3 @@ void
|
|||||||
__aeabi_unwind_cpp_pr0(void)
|
__aeabi_unwind_cpp_pr0(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -49,6 +49,7 @@
|
|||||||
#include "assym.s"
|
#include "assym.s"
|
||||||
|
|
||||||
#include "opt_kdtrace.h"
|
#include "opt_kdtrace.h"
|
||||||
|
#include <machine/acle-compat.h>
|
||||||
#include <machine/asm.h>
|
#include <machine/asm.h>
|
||||||
#include <machine/armreg.h>
|
#include <machine/armreg.h>
|
||||||
#include <machine/asmacros.h>
|
#include <machine/asmacros.h>
|
||||||
@ -80,7 +81,7 @@ _C_LABEL(dtrace_invop_calltrap_addr):
|
|||||||
* NOTE: r13 and r14 are stored separately as a work around for the
|
* NOTE: r13 and r14 are stored separately as a work around for the
|
||||||
* SA110 rev 2 STM^ bug
|
* SA110 rev 2 STM^ bug
|
||||||
*/
|
*/
|
||||||
#ifdef ARM_TP_ADDRESS
|
#if __ARM_ARCH < 6
|
||||||
#define PUSHFRAME \
|
#define PUSHFRAME \
|
||||||
sub sp, sp, #4; /* Align the stack */ \
|
sub sp, sp, #4; /* Align the stack */ \
|
||||||
str lr, [sp, #-4]!; /* Push the return address */ \
|
str lr, [sp, #-4]!; /* Push the return address */ \
|
||||||
@ -114,7 +115,7 @@ _C_LABEL(dtrace_invop_calltrap_addr):
|
|||||||
* Since the current mode is used, the SVC lr field is ignored.
|
* Since the current mode is used, the SVC lr field is ignored.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef ARM_TP_ADDRESS
|
#if __ARM_ARCH < 6
|
||||||
#define PULLFRAME \
|
#define PULLFRAME \
|
||||||
ldr r0, [sp], #4; /* Get the SPSR from stack */ \
|
ldr r0, [sp], #4; /* Get the SPSR from stack */ \
|
||||||
msr spsr_fsxc, r0; \
|
msr spsr_fsxc, r0; \
|
||||||
@ -145,7 +146,7 @@ _C_LABEL(dtrace_invop_calltrap_addr):
|
|||||||
* NOTE: r13 and r14 are stored separately as a work around for the
|
* NOTE: r13 and r14 are stored separately as a work around for the
|
||||||
* SA110 rev 2 STM^ bug
|
* SA110 rev 2 STM^ bug
|
||||||
*/
|
*/
|
||||||
#ifdef ARM_TP_ADDRESS
|
#if __ARM_ARCH < 6
|
||||||
#define PUSHFRAMEINSVC \
|
#define PUSHFRAMEINSVC \
|
||||||
stmdb sp, {r0-r3}; /* Save 4 registers */ \
|
stmdb sp, {r0-r3}; /* Save 4 registers */ \
|
||||||
mov r0, lr; /* Save xxx32 r14 */ \
|
mov r0, lr; /* Save xxx32 r14 */ \
|
||||||
@ -218,7 +219,7 @@ _C_LABEL(dtrace_invop_calltrap_addr):
|
|||||||
* exit.
|
* exit.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef ARM_TP_ADDRESS
|
#if __ARM_ARCH < 6
|
||||||
#define PULLFRAMEFROMSVCANDEXIT \
|
#define PULLFRAMEFROMSVCANDEXIT \
|
||||||
ldr r0, [sp], #4; /* Get the SPSR from stack */ \
|
ldr r0, [sp], #4; /* Get the SPSR from stack */ \
|
||||||
msr spsr_fsxc, r0; /* restore SPSR */ \
|
msr spsr_fsxc, r0; /* restore SPSR */ \
|
||||||
@ -237,7 +238,6 @@ _C_LABEL(dtrace_invop_calltrap_addr):
|
|||||||
ldmia sp, {sp, lr, pc}^ /* Restore lr and exit */
|
ldmia sp, {sp, lr, pc}^ /* Restore lr and exit */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__ARM_EABI__)
|
|
||||||
/*
|
/*
|
||||||
* Unwind hints so we can unwind past functions that use
|
* Unwind hints so we can unwind past functions that use
|
||||||
* PULLFRAMEFROMSVCANDEXIT. They are run in reverse order.
|
* PULLFRAMEFROMSVCANDEXIT. They are run in reverse order.
|
||||||
@ -249,9 +249,6 @@ _C_LABEL(dtrace_invop_calltrap_addr):
|
|||||||
.pad #(2*4); /* Skip user sp and lr */ \
|
.pad #(2*4); /* Skip user sp and lr */ \
|
||||||
.save {r0-r12}; /* Restore r0-r12 */ \
|
.save {r0-r12}; /* Restore r0-r12 */ \
|
||||||
.pad #(4) /* Skip spsr */
|
.pad #(4) /* Skip spsr */
|
||||||
#else
|
|
||||||
#define UNWINDSVCFRAME
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define DO_AST \
|
#define DO_AST \
|
||||||
ldr r0, [sp]; /* Get the SPSR from stack */ \
|
ldr r0, [sp]; /* Get the SPSR from stack */ \
|
||||||
|
@ -38,6 +38,8 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <vm/vm_param.h>
|
#include <vm/vm_param.h>
|
||||||
#include <vm/pmap.h>
|
#include <vm/pmap.h>
|
||||||
#include <vm/vm_map.h>
|
#include <vm/vm_map.h>
|
||||||
|
|
||||||
|
#include <machine/acle-compat.h>
|
||||||
#include <machine/vmparam.h>
|
#include <machine/vmparam.h>
|
||||||
#include <machine/armreg.h>
|
#include <machine/armreg.h>
|
||||||
#include <machine/frame.h>
|
#include <machine/frame.h>
|
||||||
@ -124,7 +126,7 @@ ASSYM(P_FLAG, offsetof(struct proc, p_flag));
|
|||||||
|
|
||||||
ASSYM(SIGF_UC, offsetof(struct sigframe, sf_uc));
|
ASSYM(SIGF_UC, offsetof(struct sigframe, sf_uc));
|
||||||
|
|
||||||
#ifdef ARM_TP_ADDRESS
|
#if __ARM_ARCH < 6
|
||||||
ASSYM(ARM_TP_ADDRESS, ARM_TP_ADDRESS);
|
ASSYM(ARM_TP_ADDRESS, ARM_TP_ADDRESS);
|
||||||
ASSYM(ARM_RAS_START, ARM_RAS_START);
|
ASSYM(ARM_RAS_START, ARM_RAS_START);
|
||||||
ASSYM(ARM_RAS_END, ARM_RAS_END);
|
ASSYM(ARM_RAS_END, ARM_RAS_END);
|
||||||
@ -133,8 +135,6 @@ ASSYM(ARM_RAS_END, ARM_RAS_END);
|
|||||||
#ifdef VFP
|
#ifdef VFP
|
||||||
ASSYM(PCB_VFPSTATE, offsetof(struct pcb, pcb_vfpstate));
|
ASSYM(PCB_VFPSTATE, offsetof(struct pcb, pcb_vfpstate));
|
||||||
|
|
||||||
ASSYM(PC_CPU, offsetof(struct pcpu, pc_cpu));
|
|
||||||
|
|
||||||
ASSYM(PC_CURPMAP, offsetof(struct pcpu, pc_curpmap));
|
ASSYM(PC_CURPMAP, offsetof(struct pcpu, pc_curpmap));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -741,10 +741,13 @@ get_mcontext(struct thread *td, mcontext_t *mcp, int clear_ret)
|
|||||||
struct trapframe *tf = td->td_frame;
|
struct trapframe *tf = td->td_frame;
|
||||||
__greg_t *gr = mcp->__gregs;
|
__greg_t *gr = mcp->__gregs;
|
||||||
|
|
||||||
if (clear_ret & GET_MC_CLEAR_RET)
|
if (clear_ret & GET_MC_CLEAR_RET) {
|
||||||
gr[_REG_R0] = 0;
|
gr[_REG_R0] = 0;
|
||||||
else
|
gr[_REG_CPSR] = tf->tf_spsr & ~PSR_C;
|
||||||
|
} else {
|
||||||
gr[_REG_R0] = tf->tf_r0;
|
gr[_REG_R0] = tf->tf_r0;
|
||||||
|
gr[_REG_CPSR] = tf->tf_spsr;
|
||||||
|
}
|
||||||
gr[_REG_R1] = tf->tf_r1;
|
gr[_REG_R1] = tf->tf_r1;
|
||||||
gr[_REG_R2] = tf->tf_r2;
|
gr[_REG_R2] = tf->tf_r2;
|
||||||
gr[_REG_R3] = tf->tf_r3;
|
gr[_REG_R3] = tf->tf_r3;
|
||||||
@ -760,7 +763,6 @@ get_mcontext(struct thread *td, mcontext_t *mcp, int clear_ret)
|
|||||||
gr[_REG_SP] = tf->tf_usr_sp;
|
gr[_REG_SP] = tf->tf_usr_sp;
|
||||||
gr[_REG_LR] = tf->tf_usr_lr;
|
gr[_REG_LR] = tf->tf_usr_lr;
|
||||||
gr[_REG_PC] = tf->tf_pc;
|
gr[_REG_PC] = tf->tf_pc;
|
||||||
gr[_REG_CPSR] = tf->tf_spsr;
|
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@ -914,9 +916,6 @@ pcpu0_init(void)
|
|||||||
#endif
|
#endif
|
||||||
pcpu_init(pcpup, 0, sizeof(struct pcpu));
|
pcpu_init(pcpup, 0, sizeof(struct pcpu));
|
||||||
PCPU_SET(curthread, &thread0);
|
PCPU_SET(curthread, &thread0);
|
||||||
#ifdef VFP
|
|
||||||
PCPU_SET(cpu, 0);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(LINUX_BOOT_ABI)
|
#if defined(LINUX_BOOT_ABI)
|
||||||
|
@ -197,8 +197,6 @@ init_secondary(int cpu)
|
|||||||
pc->pc_curpcb = pc->pc_idlethread->td_pcb;
|
pc->pc_curpcb = pc->pc_idlethread->td_pcb;
|
||||||
set_curthread(pc->pc_idlethread);
|
set_curthread(pc->pc_idlethread);
|
||||||
#ifdef VFP
|
#ifdef VFP
|
||||||
pc->pc_cpu = cpu;
|
|
||||||
|
|
||||||
vfp_init();
|
vfp_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -5768,6 +5768,7 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
|
|||||||
~PTE1_W;
|
~PTE1_W;
|
||||||
dst_pmap->pm_stats.resident_count +=
|
dst_pmap->pm_stats.resident_count +=
|
||||||
PTE1_SIZE / PAGE_SIZE;
|
PTE1_SIZE / PAGE_SIZE;
|
||||||
|
pmap_pte1_mappings++;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
} else if (!pte1_is_link(src_pte1))
|
} else if (!pte1_is_link(src_pte1))
|
||||||
|
@ -49,16 +49,6 @@ extern vm_offset_t kernel_vm_end;
|
|||||||
static void
|
static void
|
||||||
stack_capture(struct stack *st, u_int32_t *frame)
|
stack_capture(struct stack *st, u_int32_t *frame)
|
||||||
{
|
{
|
||||||
#if !defined(__ARM_EABI__) && !defined(__clang__)
|
|
||||||
vm_offset_t callpc;
|
|
||||||
|
|
||||||
while (INKERNEL(frame) && (vm_offset_t)frame < kernel_vm_end) {
|
|
||||||
callpc = frame[FR_SCP];
|
|
||||||
if (stack_put(st, callpc) == -1)
|
|
||||||
break;
|
|
||||||
frame = (u_int32_t *)(frame[FR_RFP]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -198,20 +198,20 @@ ENTRY(cpu_throw)
|
|||||||
str r7, [r6, #PC_CURPCB]
|
str r7, [r6, #PC_CURPCB]
|
||||||
/* We have a new curthread now so make a note it */
|
/* We have a new curthread now so make a note it */
|
||||||
str r5, [r6, #PC_CURTHREAD]
|
str r5, [r6, #PC_CURTHREAD]
|
||||||
#ifndef ARM_TP_ADDRESS
|
#if __ARM_ARCH >= 6
|
||||||
mcr p15, 0, r5, c13, c0, 4
|
mcr p15, 0, r5, c13, c0, 4
|
||||||
#endif
|
#endif
|
||||||
/* Set the new tp */
|
/* Set the new tp */
|
||||||
ldr r6, [r5, #(TD_MD + MD_TP)]
|
ldr r6, [r5, #(TD_MD + MD_TP)]
|
||||||
#ifdef ARM_TP_ADDRESS
|
#if __ARM_ARCH >= 6
|
||||||
|
mcr p15, 0, r6, c13, c0, 3
|
||||||
|
#else
|
||||||
ldr r4, =ARM_TP_ADDRESS
|
ldr r4, =ARM_TP_ADDRESS
|
||||||
str r6, [r4]
|
str r6, [r4]
|
||||||
ldr r6, [r5, #(TD_MD + MD_RAS_START)]
|
ldr r6, [r5, #(TD_MD + MD_RAS_START)]
|
||||||
str r6, [r4, #4] /* ARM_RAS_START */
|
str r6, [r4, #4] /* ARM_RAS_START */
|
||||||
ldr r6, [r5, #(TD_MD + MD_RAS_END)]
|
ldr r6, [r5, #(TD_MD + MD_RAS_END)]
|
||||||
str r6, [r4, #8] /* ARM_RAS_END */
|
str r6, [r4, #8] /* ARM_RAS_END */
|
||||||
#else
|
|
||||||
mcr p15, 0, r6, c13, c0, 3
|
|
||||||
#endif
|
#endif
|
||||||
/* Restore all the saved registers and exit */
|
/* Restore all the saved registers and exit */
|
||||||
add r3, r7, #PCB_R4
|
add r3, r7, #PCB_R4
|
||||||
@ -245,7 +245,7 @@ ENTRY(cpu_switch)
|
|||||||
/* We have a new curthread now so make a note it */
|
/* We have a new curthread now so make a note it */
|
||||||
GET_PCPU(r7, r2)
|
GET_PCPU(r7, r2)
|
||||||
str r1, [r7, #PC_CURTHREAD]
|
str r1, [r7, #PC_CURTHREAD]
|
||||||
#ifndef ARM_TP_ADDRESS
|
#if __ARM_ARCH >= 6
|
||||||
mcr p15, 0, r1, c13, c0, 4
|
mcr p15, 0, r1, c13, c0, 4
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -259,7 +259,14 @@ ENTRY(cpu_switch)
|
|||||||
ldr r2, [r0, #(TD_PCB)]
|
ldr r2, [r0, #(TD_PCB)]
|
||||||
mov r4, r0 /* Save the old thread. */
|
mov r4, r0 /* Save the old thread. */
|
||||||
|
|
||||||
#ifdef ARM_TP_ADDRESS
|
#if __ARM_ARCH >= 6
|
||||||
|
/*
|
||||||
|
* Set new tp. No need to store the old one first, userland can't
|
||||||
|
* change it directly on armv6.
|
||||||
|
*/
|
||||||
|
ldr r9, [r1, #(TD_MD + MD_TP)]
|
||||||
|
mcr p15, 0, r9, c13, c0, 3
|
||||||
|
#else
|
||||||
/* Store the old tp; userland can change it on armv4. */
|
/* Store the old tp; userland can change it on armv4. */
|
||||||
ldr r3, =ARM_TP_ADDRESS
|
ldr r3, =ARM_TP_ADDRESS
|
||||||
ldr r9, [r3]
|
ldr r9, [r3]
|
||||||
@ -276,13 +283,6 @@ ENTRY(cpu_switch)
|
|||||||
str r9, [r3, #4]
|
str r9, [r3, #4]
|
||||||
ldr r9, [r1, #(TD_MD + MD_RAS_END)]
|
ldr r9, [r1, #(TD_MD + MD_RAS_END)]
|
||||||
str r9, [r3, #8]
|
str r9, [r3, #8]
|
||||||
#else
|
|
||||||
/*
|
|
||||||
* Set new tp. No need to store the old one first, userland can't
|
|
||||||
* change it directly on armv6.
|
|
||||||
*/
|
|
||||||
ldr r9, [r1, #(TD_MD + MD_TP)]
|
|
||||||
mcr p15, 0, r9, c13, c0, 3
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Get the user structure for the new process in r9 */
|
/* Get the user structure for the new process in r9 */
|
||||||
|
@ -41,8 +41,13 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <sys/sysproto.h>
|
#include <sys/sysproto.h>
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
#include <sys/sysent.h>
|
#include <sys/sysent.h>
|
||||||
|
#include <vm/vm.h>
|
||||||
|
#include <vm/vm_extern.h>
|
||||||
|
|
||||||
|
#include <machine/acle-compat.h>
|
||||||
|
#include <machine/cpu-v6.h>
|
||||||
#include <machine/sysarch.h>
|
#include <machine/sysarch.h>
|
||||||
|
#include <machine/vmparam.h>
|
||||||
|
|
||||||
#ifndef _SYS_SYSPROTO_H_
|
#ifndef _SYS_SYSPROTO_H_
|
||||||
struct sysarch_args {
|
struct sysarch_args {
|
||||||
@ -55,16 +60,89 @@ struct sysarch_args {
|
|||||||
static int arm32_sync_icache (struct thread *, void *);
|
static int arm32_sync_icache (struct thread *, void *);
|
||||||
static int arm32_drain_writebuf(struct thread *, void *);
|
static int arm32_drain_writebuf(struct thread *, void *);
|
||||||
|
|
||||||
|
#if __ARM_ARCH >= 6
|
||||||
|
static int
|
||||||
|
sync_icache(uintptr_t addr, size_t len)
|
||||||
|
{
|
||||||
|
size_t size;
|
||||||
|
vm_offset_t rv;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Align starting address to even number because value of "1"
|
||||||
|
* is used as return value for success.
|
||||||
|
*/
|
||||||
|
len += addr & 1;
|
||||||
|
addr &= ~1;
|
||||||
|
|
||||||
|
/* Break whole range to pages. */
|
||||||
|
do {
|
||||||
|
size = PAGE_SIZE - (addr & PAGE_MASK);
|
||||||
|
size = min(size, len);
|
||||||
|
rv = dcache_wb_pou_checked(addr, size);
|
||||||
|
if (rv == 1) /* see dcache_wb_pou_checked() */
|
||||||
|
rv = icache_inv_pou_checked(addr, size);
|
||||||
|
if (rv != 1) {
|
||||||
|
if (!useracc((void *)addr, size, VM_PROT_READ)) {
|
||||||
|
/* Invalid access */
|
||||||
|
return (rv);
|
||||||
|
}
|
||||||
|
/* Valid but unmapped page - skip it. */
|
||||||
|
}
|
||||||
|
len -= size;
|
||||||
|
addr += size;
|
||||||
|
} while (len > 0);
|
||||||
|
|
||||||
|
/* Invalidate branch predictor buffer. */
|
||||||
|
bpb_inv_all();
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int
|
static int
|
||||||
arm32_sync_icache(struct thread *td, void *args)
|
arm32_sync_icache(struct thread *td, void *args)
|
||||||
{
|
{
|
||||||
struct arm_sync_icache_args ua;
|
struct arm_sync_icache_args ua;
|
||||||
int error;
|
int error;
|
||||||
|
ksiginfo_t ksi;
|
||||||
|
#if __ARM_ARCH >= 6
|
||||||
|
vm_offset_t rv;
|
||||||
|
#endif
|
||||||
|
|
||||||
if ((error = copyin(args, &ua, sizeof(ua))) != 0)
|
if ((error = copyin(args, &ua, sizeof(ua))) != 0)
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
|
if (ua.len == 0) {
|
||||||
|
td->td_retval[0] = 0;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Validate arguments. Address and length are unsigned,
|
||||||
|
* so we can use wrapped overflow check.
|
||||||
|
*/
|
||||||
|
if (((ua.addr + ua.len) < ua.addr) ||
|
||||||
|
((ua.addr + ua.len) > VM_MAXUSER_ADDRESS)) {
|
||||||
|
ksiginfo_init_trap(&ksi);
|
||||||
|
ksi.ksi_signo = SIGSEGV;
|
||||||
|
ksi.ksi_code = SEGV_ACCERR;
|
||||||
|
ksi.ksi_addr = (void *)max(ua.addr, VM_MAXUSER_ADDRESS);
|
||||||
|
trapsignal(td, &ksi);
|
||||||
|
return (EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if __ARM_ARCH >= 6
|
||||||
|
rv = sync_icache(ua.addr, ua.len);
|
||||||
|
if (rv != 1) {
|
||||||
|
ksiginfo_init_trap(&ksi);
|
||||||
|
ksi.ksi_signo = SIGSEGV;
|
||||||
|
ksi.ksi_code = SEGV_MAPERR;
|
||||||
|
ksi.ksi_addr = (void *)rv;
|
||||||
|
trapsignal(td, &ksi);
|
||||||
|
return (EINVAL);
|
||||||
|
}
|
||||||
|
#else
|
||||||
cpu_icache_sync_range(ua.addr, ua.len);
|
cpu_icache_sync_range(ua.addr, ua.len);
|
||||||
|
#endif
|
||||||
|
|
||||||
td->td_retval[0] = 0;
|
td->td_retval[0] = 0;
|
||||||
return (0);
|
return (0);
|
||||||
@ -85,7 +163,7 @@ arm32_set_tp(struct thread *td, void *args)
|
|||||||
{
|
{
|
||||||
|
|
||||||
td->td_md.md_tp = (register_t)args;
|
td->td_md.md_tp = (register_t)args;
|
||||||
#ifndef ARM_TP_ADDRESS
|
#if __ARM_ARCH >= 6
|
||||||
set_tls(args);
|
set_tls(args);
|
||||||
#else
|
#else
|
||||||
*(register_t *)ARM_TP_ADDRESS = (register_t)args;
|
*(register_t *)ARM_TP_ADDRESS = (register_t)args;
|
||||||
@ -97,7 +175,7 @@ static int
|
|||||||
arm32_get_tp(struct thread *td, void *args)
|
arm32_get_tp(struct thread *td, void *args)
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifndef ARM_TP_ADDRESS
|
#if __ARM_ARCH >= 6
|
||||||
td->td_retval[0] = td->td_md.md_tp;
|
td->td_retval[0] = td->td_md.md_tp;
|
||||||
#else
|
#else
|
||||||
td->td_retval[0] = *(register_t *)ARM_TP_ADDRESS;
|
td->td_retval[0] = *(register_t *)ARM_TP_ADDRESS;
|
||||||
|
@ -67,6 +67,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern char fusubailout[];
|
extern char fusubailout[];
|
||||||
|
extern char cachebailout[];
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
int last_fault_code; /* For the benefit of pmap_fault_fixup() */
|
int last_fault_code; /* For the benefit of pmap_fault_fixup() */
|
||||||
@ -133,7 +134,7 @@ static const struct abort aborts[] = {
|
|||||||
{abort_align, "Alignment Fault"},
|
{abort_align, "Alignment Fault"},
|
||||||
{abort_fatal, "Debug Event"},
|
{abort_fatal, "Debug Event"},
|
||||||
{NULL, "Access Bit (L1)"},
|
{NULL, "Access Bit (L1)"},
|
||||||
{abort_icache, "Instruction cache maintenance"},
|
{NULL, "Instruction cache maintenance"},
|
||||||
{NULL, "Translation Fault (L1)"},
|
{NULL, "Translation Fault (L1)"},
|
||||||
{NULL, "Access Bit (L2)"},
|
{NULL, "Access Bit (L2)"},
|
||||||
{NULL, "Translation Fault (L2)"},
|
{NULL, "Translation Fault (L2)"},
|
||||||
@ -405,6 +406,24 @@ abort_handler(struct trapframe *tf, int prefetch)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Don't pass faulting cache operation to vm_fault(). We don't want
|
||||||
|
* to handle all vm stuff at this moment.
|
||||||
|
*/
|
||||||
|
pcb = td->td_pcb;
|
||||||
|
if (__predict_false(pcb->pcb_onfault == cachebailout)) {
|
||||||
|
tf->tf_r0 = far; /* return failing address */
|
||||||
|
tf->tf_pc = (register_t)pcb->pcb_onfault;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle remaining I cache aborts. */
|
||||||
|
if (idx == FAULT_ICACHE) {
|
||||||
|
if (abort_icache(tf, idx, fsr, far, prefetch, td, &ksig))
|
||||||
|
goto do_trapsignal;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* At this point, we're dealing with one of the following aborts:
|
* At this point, we're dealing with one of the following aborts:
|
||||||
*
|
*
|
||||||
|
@ -199,7 +199,7 @@ vfp_bounce(u_int addr, u_int insn, struct trapframe *frame, int code)
|
|||||||
*/
|
*/
|
||||||
fmxr(fpexc, fpexc | VFPEXC_EN);
|
fmxr(fpexc, fpexc | VFPEXC_EN);
|
||||||
curpcb = curthread->td_pcb;
|
curpcb = curthread->td_pcb;
|
||||||
cpu = PCPU_GET(cpu);
|
cpu = PCPU_GET(cpuid);
|
||||||
if (curpcb->pcb_vfpcpu != cpu || curthread != PCPU_GET(fpcurthread)) {
|
if (curpcb->pcb_vfpcpu != cpu || curthread != PCPU_GET(fpcurthread)) {
|
||||||
vfp_restore(&curpcb->pcb_vfpstate);
|
vfp_restore(&curpcb->pcb_vfpstate);
|
||||||
curpcb->pcb_vfpcpu = cpu;
|
curpcb->pcb_vfpcpu = cpu;
|
||||||
|
@ -54,6 +54,8 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
#include <sys/sysent.h>
|
#include <sys/sysent.h>
|
||||||
#include <sys/unistd.h>
|
#include <sys/unistd.h>
|
||||||
|
|
||||||
|
#include <machine/acle-compat.h>
|
||||||
#include <machine/cpu.h>
|
#include <machine/cpu.h>
|
||||||
#include <machine/frame.h>
|
#include <machine/frame.h>
|
||||||
#include <machine/pcb.h>
|
#include <machine/pcb.h>
|
||||||
@ -143,10 +145,10 @@ cpu_fork(register struct thread *td1, register struct proc *p2,
|
|||||||
/* Setup to release spin count in fork_exit(). */
|
/* Setup to release spin count in fork_exit(). */
|
||||||
td2->td_md.md_spinlock_count = 1;
|
td2->td_md.md_spinlock_count = 1;
|
||||||
td2->td_md.md_saved_cspr = PSR_SVC32_MODE;;
|
td2->td_md.md_saved_cspr = PSR_SVC32_MODE;;
|
||||||
#ifdef ARM_TP_ADDRESS
|
#if __ARM_ARCH >= 6
|
||||||
td2->td_md.md_tp = *(register_t *)ARM_TP_ADDRESS;
|
|
||||||
#else
|
|
||||||
td2->td_md.md_tp = td1->td_md.md_tp;
|
td2->td_md.md_tp = td1->td_md.md_tp;
|
||||||
|
#else
|
||||||
|
td2->td_md.md_tp = *(register_t *)ARM_TP_ADDRESS;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,10 +275,10 @@ cpu_set_user_tls(struct thread *td, void *tls_base)
|
|||||||
td->td_md.md_tp = (register_t)tls_base;
|
td->td_md.md_tp = (register_t)tls_base;
|
||||||
if (td == curthread) {
|
if (td == curthread) {
|
||||||
critical_enter();
|
critical_enter();
|
||||||
#ifdef ARM_TP_ADDRESS
|
#if __ARM_ARCH >= 6
|
||||||
*(register_t *)ARM_TP_ADDRESS = (register_t)tls_base;
|
|
||||||
#else
|
|
||||||
set_tls(tls_base);
|
set_tls(tls_base);
|
||||||
|
#else
|
||||||
|
*(register_t *)ARM_TP_ADDRESS = (register_t)tls_base;
|
||||||
#endif
|
#endif
|
||||||
critical_exit();
|
critical_exit();
|
||||||
}
|
}
|
||||||
|
@ -427,6 +427,15 @@ bcm_spi_transfer(device_t dev, device_t child, struct spi_command *cmd)
|
|||||||
KASSERT(cmd->tx_data_sz == cmd->rx_data_sz,
|
KASSERT(cmd->tx_data_sz == cmd->rx_data_sz,
|
||||||
("TX/RX data sizes should be equal"));
|
("TX/RX data sizes should be equal"));
|
||||||
|
|
||||||
|
/* Get the proper chip select for this child. */
|
||||||
|
spibus_get_cs(child, &cs);
|
||||||
|
if (cs < 0 || cs > 2) {
|
||||||
|
device_printf(dev,
|
||||||
|
"Invalid chip select %d requested by %s\n", cs,
|
||||||
|
device_get_nameunit(child));
|
||||||
|
return (EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
BCM_SPI_LOCK(sc);
|
BCM_SPI_LOCK(sc);
|
||||||
|
|
||||||
/* If the controller is in use wait until it is available. */
|
/* If the controller is in use wait until it is available. */
|
||||||
@ -441,16 +450,6 @@ bcm_spi_transfer(device_t dev, device_t child, struct spi_command *cmd)
|
|||||||
SPI_CS_CLEAR_RXFIFO | SPI_CS_CLEAR_TXFIFO,
|
SPI_CS_CLEAR_RXFIFO | SPI_CS_CLEAR_TXFIFO,
|
||||||
SPI_CS_CLEAR_RXFIFO | SPI_CS_CLEAR_TXFIFO);
|
SPI_CS_CLEAR_RXFIFO | SPI_CS_CLEAR_TXFIFO);
|
||||||
|
|
||||||
/* Get the proper chip select for this child. */
|
|
||||||
spibus_get_cs(child, &cs);
|
|
||||||
if (cs < 0 || cs > 2) {
|
|
||||||
device_printf(dev,
|
|
||||||
"Invalid chip select %d requested by %s\n", cs,
|
|
||||||
device_get_nameunit(child));
|
|
||||||
BCM_SPI_UNLOCK(sc);
|
|
||||||
return (EINVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Save a pointer to the SPI command. */
|
/* Save a pointer to the SPI command. */
|
||||||
sc->sc_cmd = cmd;
|
sc->sc_cmd = cmd;
|
||||||
sc->sc_read = 0;
|
sc->sc_read = 0;
|
||||||
@ -471,8 +470,10 @@ bcm_spi_transfer(device_t dev, device_t child, struct spi_command *cmd)
|
|||||||
/* Make sure the SPI engine and interrupts are disabled. */
|
/* Make sure the SPI engine and interrupts are disabled. */
|
||||||
bcm_spi_modifyreg(sc, SPI_CS, SPI_CS_TA | SPI_CS_INTR | SPI_CS_INTD, 0);
|
bcm_spi_modifyreg(sc, SPI_CS, SPI_CS_TA | SPI_CS_INTR | SPI_CS_INTD, 0);
|
||||||
|
|
||||||
/* Clear the controller flags. */
|
/* Release the controller and wakeup the next thread waiting for it. */
|
||||||
sc->sc_flags = 0;
|
sc->sc_flags = 0;
|
||||||
|
wakeup_one(dev);
|
||||||
|
BCM_SPI_UNLOCK(sc);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check for transfer timeout. The SPI controller doesn't
|
* Check for transfer timeout. The SPI controller doesn't
|
||||||
@ -483,8 +484,6 @@ bcm_spi_transfer(device_t dev, device_t child, struct spi_command *cmd)
|
|||||||
err = EIO;
|
err = EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
BCM_SPI_UNLOCK(sc);
|
|
||||||
|
|
||||||
return (err);
|
return (err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <vm/vm.h>
|
#include <vm/vm.h>
|
||||||
#include <vm/vm_extern.h>
|
#include <vm/vm_extern.h>
|
||||||
#include <vm/vm_kern.h>
|
#include <vm/vm_kern.h>
|
||||||
|
#include <vm/pmap.h>
|
||||||
|
|
||||||
#include <dev/fdt/fdt_common.h>
|
#include <dev/fdt/fdt_common.h>
|
||||||
#include <dev/ofw/openfirm.h>
|
#include <dev/ofw/openfirm.h>
|
||||||
|
@ -42,12 +42,11 @@ struct vmspace;
|
|||||||
|
|
||||||
#ifdef VFP
|
#ifdef VFP
|
||||||
#define PCPU_MD_FIELDS \
|
#define PCPU_MD_FIELDS \
|
||||||
unsigned int pc_cpu; \
|
|
||||||
unsigned int pc_vfpsid; \
|
unsigned int pc_vfpsid; \
|
||||||
unsigned int pc_vfpmvfr0; \
|
unsigned int pc_vfpmvfr0; \
|
||||||
unsigned int pc_vfpmvfr1; \
|
unsigned int pc_vfpmvfr1; \
|
||||||
struct pmap *pc_curpmap; \
|
struct pmap *pc_curpmap; \
|
||||||
char __pad[137]
|
char __pad[141]
|
||||||
#else
|
#else
|
||||||
#define PCPU_MD_FIELDS \
|
#define PCPU_MD_FIELDS \
|
||||||
char __pad[157]
|
char __pad[157]
|
||||||
|
@ -84,13 +84,12 @@
|
|||||||
#define VM_PHYSSEG_SPARSE
|
#define VM_PHYSSEG_SPARSE
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create two free page pools. Since the ARM kernel virtual address
|
* Create one free page pool. Since the ARM kernel virtual address
|
||||||
* space does not include a mapping onto the machine's entire physical
|
* space does not include a mapping onto the machine's entire physical
|
||||||
* memory, VM_FREEPOOL_DIRECT is defined as an alias for the default
|
* memory, VM_FREEPOOL_DIRECT is defined as an alias for the default
|
||||||
* pool, VM_FREEPOOL_DEFAULT.
|
* pool, VM_FREEPOOL_DEFAULT.
|
||||||
*/
|
*/
|
||||||
#define VM_NFREEPOOL 2
|
#define VM_NFREEPOOL 1
|
||||||
#define VM_FREEPOOL_CACHE 1
|
|
||||||
#define VM_FREEPOOL_DEFAULT 0
|
#define VM_FREEPOOL_DEFAULT 0
|
||||||
#define VM_FREEPOOL_DIRECT 0
|
#define VM_FREEPOOL_DIRECT 0
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
/*
|
/*
|
||||||
* TPS65217 PMIC companion chip for AM335x SoC sitting on I2C bus
|
* TI TPS65217 PMIC companion chip for AM335x SoC sitting on I2C bus
|
||||||
*/
|
*/
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
@ -50,30 +50,10 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <dev/ofw/ofw_bus_subr.h>
|
#include <dev/ofw/ofw_bus_subr.h>
|
||||||
|
|
||||||
#include <arm/ti/am335x/am335x_rtcvar.h>
|
#include <arm/ti/am335x/am335x_rtcvar.h>
|
||||||
|
#include <arm/ti/am335x/tps65217x.h>
|
||||||
|
|
||||||
#include "iicbus_if.h"
|
#include "iicbus_if.h"
|
||||||
|
|
||||||
#define TPS65217A 0x7
|
|
||||||
#define TPS65217B 0xF
|
|
||||||
#define TPS65217C 0xE
|
|
||||||
#define TPS65217D 0x6
|
|
||||||
|
|
||||||
/* TPS65217 Reisters */
|
|
||||||
#define TPS65217_CHIPID_REG 0x00
|
|
||||||
#define TPS65217_INT_REG 0x02
|
|
||||||
#define TPS65217_INT_PBM (1U << 6)
|
|
||||||
#define TPS65217_INT_ACM (1U << 5)
|
|
||||||
#define TPS65217_INT_USBM (1U << 4)
|
|
||||||
#define TPS65217_INT_PBI (1U << 2)
|
|
||||||
#define TPS65217_INT_ACI (1U << 1)
|
|
||||||
#define TPS65217_INT_USBI (1U << 0)
|
|
||||||
|
|
||||||
#define TPS65217_STATUS_REG 0x0A
|
|
||||||
#define TPS65217_STATUS_OFF (1U << 7)
|
|
||||||
#define TPS65217_STATUS_ACPWR (1U << 3)
|
|
||||||
#define TPS65217_STATUS_USBPWR (1U << 2)
|
|
||||||
#define TPS65217_STATUS_BT (1U << 0)
|
|
||||||
|
|
||||||
#define MAX_IIC_DATA_SIZE 2
|
#define MAX_IIC_DATA_SIZE 2
|
||||||
|
|
||||||
|
|
||||||
@ -85,6 +65,13 @@ struct am335x_pmic_softc {
|
|||||||
void *sc_intrhand;
|
void *sc_intrhand;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const char *tps65217_voreg_c[4] = {"4.10V", "4.15V", "4.20V", "4.25V"};
|
||||||
|
|
||||||
|
static int am335x_pmic_bootverbose = 0;
|
||||||
|
TUNABLE_INT("hw.am335x_pmic.bootverbose", &am335x_pmic_bootverbose);
|
||||||
|
static char am335x_pmic_vo[6];
|
||||||
|
TUNABLE_STR("hw.am335x_pmic.vo", am335x_pmic_vo, sizeof(am335x_pmic_vo));
|
||||||
|
|
||||||
static void am335x_pmic_shutdown(void *, int);
|
static void am335x_pmic_shutdown(void *, int);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -120,18 +107,19 @@ static void
|
|||||||
am335x_pmic_intr(void *arg)
|
am335x_pmic_intr(void *arg)
|
||||||
{
|
{
|
||||||
struct am335x_pmic_softc *sc = (struct am335x_pmic_softc *)arg;
|
struct am335x_pmic_softc *sc = (struct am335x_pmic_softc *)arg;
|
||||||
uint8_t int_reg, status_reg;
|
struct tps65217_status_reg status_reg;
|
||||||
|
struct tps65217_int_reg int_reg;
|
||||||
int rv;
|
int rv;
|
||||||
char notify_buf[16];
|
char notify_buf[16];
|
||||||
|
|
||||||
THREAD_SLEEPING_OK();
|
THREAD_SLEEPING_OK();
|
||||||
rv = am335x_pmic_read(sc->sc_dev, TPS65217_INT_REG, &int_reg, 1);
|
rv = am335x_pmic_read(sc->sc_dev, TPS65217_INT_REG, (uint8_t *)&int_reg, 1);
|
||||||
if (rv != 0) {
|
if (rv != 0) {
|
||||||
device_printf(sc->sc_dev, "Cannot read interrupt register\n");
|
device_printf(sc->sc_dev, "Cannot read interrupt register\n");
|
||||||
THREAD_NO_SLEEPING();
|
THREAD_NO_SLEEPING();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
rv = am335x_pmic_read(sc->sc_dev, TPS65217_STATUS_REG, &status_reg, 1);
|
rv = am335x_pmic_read(sc->sc_dev, TPS65217_STATUS_REG, (uint8_t *)&status_reg, 1);
|
||||||
if (rv != 0) {
|
if (rv != 0) {
|
||||||
device_printf(sc->sc_dev, "Cannot read status register\n");
|
device_printf(sc->sc_dev, "Cannot read status register\n");
|
||||||
THREAD_NO_SLEEPING();
|
THREAD_NO_SLEEPING();
|
||||||
@ -139,11 +127,11 @@ am335x_pmic_intr(void *arg)
|
|||||||
}
|
}
|
||||||
THREAD_NO_SLEEPING();
|
THREAD_NO_SLEEPING();
|
||||||
|
|
||||||
if ((int_reg & TPS65217_INT_PBI) && (status_reg & TPS65217_STATUS_BT))
|
if (int_reg.pbi && status_reg.pb)
|
||||||
shutdown_nice(RB_POWEROFF);
|
shutdown_nice(RB_POWEROFF);
|
||||||
if (int_reg & TPS65217_INT_ACI) {
|
if (int_reg.aci) {
|
||||||
snprintf(notify_buf, sizeof(notify_buf), "notify=0x%02x",
|
snprintf(notify_buf, sizeof(notify_buf), "notify=0x%02x",
|
||||||
(status_reg & TPS65217_STATUS_ACPWR) ? 1 : 0);
|
status_reg.acpwr ? 1 : 0);
|
||||||
devctl_notify_f("ACPI", "ACAD", "power", notify_buf, M_NOWAIT);
|
devctl_notify_f("ACPI", "ACAD", "power", notify_buf, M_NOWAIT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -166,38 +154,121 @@ am335x_pmic_probe(device_t dev)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
am335x_pmic_dump_chgconfig(device_t dev)
|
||||||
|
{
|
||||||
|
struct tps65217_chgconfig0_reg reg0;
|
||||||
|
struct tps65217_chgconfig1_reg reg1;
|
||||||
|
struct tps65217_chgconfig2_reg reg2;
|
||||||
|
struct tps65217_chgconfig3_reg reg3;
|
||||||
|
const char *e_d[] = {"enabled", "disabled"};
|
||||||
|
const char *d_e[] = {"disabled", "enabled"};
|
||||||
|
const char *i_a[] = {"inactive", "active"};
|
||||||
|
const char *f_t[] = {"false", "true"};
|
||||||
|
const char *timer_c[] = {"4h", "5h", "6h", "8h"};
|
||||||
|
const char *ntc_type_c[] = {"100k", "10k"};
|
||||||
|
const char *vprechg_c[] = {"2.9V", "2.5V"};
|
||||||
|
const char *trange_c[] = {"0-45 C", "0-60 C"};
|
||||||
|
const char *termif_c[] = {"2.5%", "7.5%", "15%", "18%"};
|
||||||
|
const char *pchrgt_c[] = {"30 min", "60 min"};
|
||||||
|
const char *dppmth_c[] = {"3.50V", "3.75V", "4.00V", "4.25V"};
|
||||||
|
const char *ichrg_c[] = {"300mA", "400mA", "500mA", "700mA"};
|
||||||
|
|
||||||
|
am335x_pmic_read(dev, TPS65217_CHGCONFIG0_REG, (uint8_t *)®0, 1);
|
||||||
|
device_printf(dev, " BAT TEMP/NTC ERROR: %s\n", f_t[reg0.battemp]);
|
||||||
|
device_printf(dev, " Pre-charge timer time-out: %s\n", f_t[reg0.pchgtout]);
|
||||||
|
device_printf(dev, " Charge timer time-out: %s\n", f_t[reg0.chgtout]);
|
||||||
|
device_printf(dev, " Charger active: %s\n", f_t[reg0.active]);
|
||||||
|
device_printf(dev, " Termination current detected: %s\n", f_t[reg0.termi]);
|
||||||
|
device_printf(dev, " Thermal suspend: %s\n", f_t[reg0.tsusp]);
|
||||||
|
device_printf(dev, " DPPM active: %s\n", f_t[reg0.dppm]);
|
||||||
|
device_printf(dev, " Thermal regulation: %s\n", i_a[reg0.treg]);
|
||||||
|
|
||||||
|
am335x_pmic_read(dev, TPS65217_CHGCONFIG1_REG, (uint8_t *)®1, 1);
|
||||||
|
device_printf(dev, " Charger: %s\n", d_e[reg1.chg_en]);
|
||||||
|
device_printf(dev, " Suspend charge: %s\n", i_a[reg1.susp]);
|
||||||
|
device_printf(dev, " Charge termination: %s\n", e_d[reg1.term]);
|
||||||
|
device_printf(dev, " Charger reset: %s\n", i_a[reg1.reset]);
|
||||||
|
device_printf(dev, " NTC TYPE: %s\n", ntc_type_c[reg1.ntc_type]);
|
||||||
|
device_printf(dev, " Safety timer: %s\n", d_e[reg1.tmr_en]);
|
||||||
|
device_printf(dev, " Charge safety timer: %s\n", timer_c[reg1.timer]);
|
||||||
|
|
||||||
|
am335x_pmic_read(dev, TPS65217_CHGCONFIG2_REG, (uint8_t *)®2, 1);
|
||||||
|
device_printf(dev, " Charge voltage: %s\n", tps65217_voreg_c[reg2.voreg]);
|
||||||
|
device_printf(dev, " Pre-charge to fast charge transition voltage: %s\n",
|
||||||
|
vprechg_c[reg2.vprechg]);
|
||||||
|
device_printf(dev, " Dynamic timer function: %s\n", d_e[reg2.dyntmr]);
|
||||||
|
|
||||||
|
am335x_pmic_read(dev, TPS65217_CHGCONFIG3_REG, (uint8_t *)®3, 1);
|
||||||
|
device_printf(dev, " Temperature range for charging: %s\n", trange_c[reg3.trange]);
|
||||||
|
device_printf(dev, " Termination current factor: %s\n", termif_c[reg3.termif]);
|
||||||
|
device_printf(dev, " Pre-charge time: %s\n", pchrgt_c[reg3.pchrgt]);
|
||||||
|
device_printf(dev, " Power path DPPM threshold: %s\n", dppmth_c[reg3.dppmth]);
|
||||||
|
device_printf(dev, " Charge current: %s\n", ichrg_c[reg3.ichrg]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
am335x_pmic_setvo(device_t dev, uint8_t vo)
|
||||||
|
{
|
||||||
|
struct tps65217_chgconfig2_reg reg2;
|
||||||
|
|
||||||
|
am335x_pmic_read(dev, TPS65217_CHGCONFIG2_REG, (uint8_t *)®2, 1);
|
||||||
|
reg2.voreg = vo;
|
||||||
|
am335x_pmic_write(dev, TPS65217_CHGCONFIG2_REG, (uint8_t *)®2, 1);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
am335x_pmic_start(void *xdev)
|
am335x_pmic_start(void *xdev)
|
||||||
{
|
{
|
||||||
struct am335x_pmic_softc *sc;
|
struct am335x_pmic_softc *sc;
|
||||||
device_t dev = (device_t)xdev;
|
device_t dev = (device_t)xdev;
|
||||||
uint8_t reg;
|
struct tps65217_status_reg status_reg;
|
||||||
|
struct tps65217_chipid_reg chipid_reg;
|
||||||
|
uint8_t reg, vo;
|
||||||
char name[20];
|
char name[20];
|
||||||
char pwr[4][11] = {"Unknown", "USB", "AC", "USB and AC"};
|
char pwr[4][11] = {"Battery", "USB", "AC", "USB and AC"};
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
sc = device_get_softc(dev);
|
sc = device_get_softc(dev);
|
||||||
|
|
||||||
am335x_pmic_read(dev, TPS65217_CHIPID_REG, ®, 1);
|
am335x_pmic_read(dev, TPS65217_CHIPID_REG, (uint8_t *)&chipid_reg, 1);
|
||||||
switch (reg>>4) {
|
switch (chipid_reg.chip) {
|
||||||
case TPS65217A:
|
case TPS65217A:
|
||||||
sprintf(name, "TPS65217A ver 1.%u", reg & 0xF);
|
sprintf(name, "TPS65217A ver 1.%u", chipid_reg.rev);
|
||||||
break;
|
break;
|
||||||
case TPS65217B:
|
case TPS65217B:
|
||||||
sprintf(name, "TPS65217B ver 1.%u", reg & 0xF);
|
sprintf(name, "TPS65217B ver 1.%u", chipid_reg.rev);
|
||||||
break;
|
break;
|
||||||
case TPS65217C:
|
case TPS65217C:
|
||||||
sprintf(name, "TPS65217C ver 1.%u", reg & 0xF);
|
sprintf(name, "TPS65217C ver 1.%u", chipid_reg.rev);
|
||||||
break;
|
break;
|
||||||
case TPS65217D:
|
case TPS65217D:
|
||||||
sprintf(name, "TPS65217D ver 1.%u", reg & 0xF);
|
sprintf(name, "TPS65217D ver 1.%u", chipid_reg.rev);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
sprintf(name, "Unknown PMIC");
|
sprintf(name, "Unknown PMIC");
|
||||||
}
|
}
|
||||||
|
|
||||||
am335x_pmic_read(dev, TPS65217_STATUS_REG, ®, 1);
|
am335x_pmic_read(dev, TPS65217_STATUS_REG, (uint8_t *)&status_reg, 1);
|
||||||
device_printf(dev, "%s powered by %s\n", name, pwr[(reg>>2)&0x03]);
|
device_printf(dev, "%s powered by %s\n", name,
|
||||||
|
pwr[status_reg.usbpwr | (status_reg.acpwr << 1)]);
|
||||||
|
|
||||||
|
if (am335x_pmic_vo[0] != '\0') {
|
||||||
|
for (vo = 0; vo < 4; vo++) {
|
||||||
|
if (strcmp(tps65217_voreg_c[vo], am335x_pmic_vo) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (vo == 4) {
|
||||||
|
device_printf(dev, "WARNING: hw.am335x_pmic.vo=\"%s\""
|
||||||
|
": unsupported value\n", am335x_pmic_vo);
|
||||||
|
} else {
|
||||||
|
am335x_pmic_setvo(dev, vo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bootverbose || am335x_pmic_bootverbose) {
|
||||||
|
am335x_pmic_dump_chgconfig(dev);
|
||||||
|
}
|
||||||
|
|
||||||
EVENTHANDLER_REGISTER(shutdown_final, am335x_pmic_shutdown, dev,
|
EVENTHANDLER_REGISTER(shutdown_final, am335x_pmic_shutdown, dev,
|
||||||
SHUTDOWN_PRI_LAST);
|
SHUTDOWN_PRI_LAST);
|
||||||
@ -248,14 +319,15 @@ static void
|
|||||||
am335x_pmic_shutdown(void *xdev, int howto)
|
am335x_pmic_shutdown(void *xdev, int howto)
|
||||||
{
|
{
|
||||||
device_t dev;
|
device_t dev;
|
||||||
uint8_t reg;
|
struct tps65217_status_reg reg;
|
||||||
|
|
||||||
if (!(howto & RB_POWEROFF))
|
if (!(howto & RB_POWEROFF))
|
||||||
return;
|
return;
|
||||||
dev = (device_t)xdev;
|
dev = (device_t)xdev;
|
||||||
|
am335x_pmic_read(dev, TPS65217_STATUS_REG, (uint8_t *)®, 1);
|
||||||
/* Set the OFF bit on status register to start the shutdown sequence. */
|
/* Set the OFF bit on status register to start the shutdown sequence. */
|
||||||
reg = TPS65217_STATUS_OFF;
|
reg.off = 1;
|
||||||
am335x_pmic_write(dev, TPS65217_STATUS_REG, ®, 1);
|
am335x_pmic_write(dev, TPS65217_STATUS_REG, (uint8_t *)®, 1);
|
||||||
/* Toggle pmic_pwr_enable to shutdown the PMIC. */
|
/* Toggle pmic_pwr_enable to shutdown the PMIC. */
|
||||||
am335x_rtc_pmic_pwr_toggle();
|
am335x_rtc_pmic_pwr_toggle();
|
||||||
}
|
}
|
||||||
|
114
sys/arm/ti/am335x/tps65217x.h
Normal file
114
sys/arm/ti/am335x/tps65217x.h
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 2012 Damjan Marion <dmarion@FreeBSD.org>
|
||||||
|
* Copyright (c) 2015 Maksym Sobolyev <sobomax@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 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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TPS65217X_H__
|
||||||
|
#define __TPS65217X_H__
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TPS65217 PMIC is a companion chip for AM335x SoC sitting on I2C bus
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* TPS65217 Reisters */
|
||||||
|
#define TPS65217_CHIPID_REG 0x00
|
||||||
|
struct tps65217_chipid_reg {
|
||||||
|
unsigned int rev:4;
|
||||||
|
unsigned int chip:4;
|
||||||
|
#define TPS65217A 0x7
|
||||||
|
#define TPS65217B 0xF
|
||||||
|
#define TPS65217C 0xE
|
||||||
|
#define TPS65217D 0x6
|
||||||
|
} __attribute__((__packed__));
|
||||||
|
|
||||||
|
#define TPS65217_INT_REG 0x02
|
||||||
|
struct tps65217_int_reg {
|
||||||
|
unsigned int usbi:1;
|
||||||
|
unsigned int aci:1;
|
||||||
|
unsigned int pbi:1;
|
||||||
|
unsigned int reserved3:1;
|
||||||
|
unsigned int usbm:1;
|
||||||
|
unsigned int acm:1;
|
||||||
|
unsigned int pbm:1;
|
||||||
|
unsigned int reserved7:1;
|
||||||
|
} __attribute__((__packed__));
|
||||||
|
|
||||||
|
#define TPS65217_STATUS_REG 0x0A
|
||||||
|
struct tps65217_status_reg {
|
||||||
|
unsigned int pb:1;
|
||||||
|
unsigned int reserved1:1;
|
||||||
|
unsigned int usbpwr:1;
|
||||||
|
unsigned int acpwr:1;
|
||||||
|
unsigned int reserved4:3;
|
||||||
|
unsigned int off:1;
|
||||||
|
} __attribute__((__packed__));
|
||||||
|
|
||||||
|
#define TPS65217_CHGCONFIG0_REG 0x03
|
||||||
|
struct tps65217_chgconfig0_reg {
|
||||||
|
unsigned int battemp:1;
|
||||||
|
unsigned int pchgtout:1;
|
||||||
|
unsigned int chgtout:1;
|
||||||
|
unsigned int active:1;
|
||||||
|
unsigned int termi:1;
|
||||||
|
unsigned int tsusp:1;
|
||||||
|
unsigned int dppm:1;
|
||||||
|
unsigned int treg:1;
|
||||||
|
} __attribute__((__packed__));
|
||||||
|
|
||||||
|
#define TPS65217_CHGCONFIG1_REG 0x04
|
||||||
|
struct tps65217_chgconfig1_reg {
|
||||||
|
unsigned int chg_en:1;
|
||||||
|
unsigned int susp:1;
|
||||||
|
unsigned int term:1;
|
||||||
|
unsigned int reset:1;
|
||||||
|
unsigned int ntc_type:1;
|
||||||
|
unsigned int tmr_en:1;
|
||||||
|
unsigned int timer:2;
|
||||||
|
} __attribute__((__packed__));
|
||||||
|
|
||||||
|
#define TPS65217_CHGCONFIG2_REG 0x05
|
||||||
|
struct tps65217_chgconfig2_reg {
|
||||||
|
unsigned int reserved:4;
|
||||||
|
unsigned int voreg:2;
|
||||||
|
#define TPS65217_VO_410V 0b00
|
||||||
|
#define TPS65217_VO_415V 0b01
|
||||||
|
#define TPS65217_VO_420V 0b10
|
||||||
|
#define TPS65217_VO_425V 0b11
|
||||||
|
unsigned int vprechg:1;
|
||||||
|
unsigned int dyntmr:1;
|
||||||
|
} __attribute__((__packed__));
|
||||||
|
|
||||||
|
#define TPS65217_CHGCONFIG3_REG 0x06
|
||||||
|
struct tps65217_chgconfig3_reg {
|
||||||
|
unsigned int trange:1;
|
||||||
|
unsigned int termif:2;
|
||||||
|
unsigned int pchrgt:1;
|
||||||
|
unsigned int dppmth:2;
|
||||||
|
unsigned int ichrg:2;
|
||||||
|
} __attribute__((__packed__));
|
||||||
|
|
||||||
|
#endif /* __TPS65217X_H__ */
|
@ -33,6 +33,9 @@ __FBSDID("$FreeBSD$");
|
|||||||
.text
|
.text
|
||||||
|
|
||||||
.macro save_registers el
|
.macro save_registers el
|
||||||
|
.if \el == 1
|
||||||
|
mov x18, sp
|
||||||
|
.endif
|
||||||
stp x28, x29, [sp, #-16]!
|
stp x28, x29, [sp, #-16]!
|
||||||
stp x26, x27, [sp, #-16]!
|
stp x26, x27, [sp, #-16]!
|
||||||
stp x24, x25, [sp, #-16]!
|
stp x24, x25, [sp, #-16]!
|
||||||
@ -51,22 +54,20 @@ __FBSDID("$FreeBSD$");
|
|||||||
mrs x10, elr_el1
|
mrs x10, elr_el1
|
||||||
mrs x11, spsr_el1
|
mrs x11, spsr_el1
|
||||||
.if \el == 0
|
.if \el == 0
|
||||||
mrs x12, sp_el0
|
mrs x18, sp_el0
|
||||||
.else
|
|
||||||
mov x12, sp
|
|
||||||
.endif
|
.endif
|
||||||
stp x10, x11, [sp, #-16]!
|
stp x10, x11, [sp, #-16]!
|
||||||
stp x12, lr, [sp, #-16]!
|
stp x18, lr, [sp, #-16]!
|
||||||
mrs x18, tpidr_el1
|
mrs x18, tpidr_el1
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro restore_registers el
|
.macro restore_registers el
|
||||||
ldp x12, lr, [sp], #16
|
msr daifset, #2 /* Disable interrupts, x18 may change
|
||||||
|
* in the interrupt exception handler */
|
||||||
|
ldp x18, lr, [sp], #16
|
||||||
ldp x10, x11, [sp], #16
|
ldp x10, x11, [sp], #16
|
||||||
.if \el == 0
|
.if \el == 0
|
||||||
msr sp_el0, x12
|
msr sp_el0, x18
|
||||||
.else
|
|
||||||
mov sp, x12
|
|
||||||
.endif
|
.endif
|
||||||
msr spsr_el1, x11
|
msr spsr_el1, x11
|
||||||
msr elr_el1, x10
|
msr elr_el1, x10
|
||||||
@ -89,6 +90,10 @@ __FBSDID("$FreeBSD$");
|
|||||||
ldp x24, x25, [sp], #16
|
ldp x24, x25, [sp], #16
|
||||||
ldp x26, x27, [sp], #16
|
ldp x26, x27, [sp], #16
|
||||||
ldp x28, x29, [sp], #16
|
ldp x28, x29, [sp], #16
|
||||||
|
.if \el == 1
|
||||||
|
mov sp, x18
|
||||||
|
mrs x18, tpidr_el1
|
||||||
|
.endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro do_ast
|
.macro do_ast
|
||||||
|
@ -75,13 +75,12 @@
|
|||||||
#define VM_PHYSSEG_MAX 64
|
#define VM_PHYSSEG_MAX 64
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create three free page pools: VM_FREEPOOL_DEFAULT is the default pool
|
* Create two free page pools: VM_FREEPOOL_DEFAULT is the default pool
|
||||||
* from which physical pages are allocated and VM_FREEPOOL_DIRECT is
|
* from which physical pages are allocated and VM_FREEPOOL_DIRECT is
|
||||||
* the pool from which physical pages for small UMA objects are
|
* the pool from which physical pages for small UMA objects are
|
||||||
* allocated.
|
* allocated.
|
||||||
*/
|
*/
|
||||||
#define VM_NFREEPOOL 3
|
#define VM_NFREEPOOL 2
|
||||||
#define VM_FREEPOOL_CACHE 2
|
|
||||||
#define VM_FREEPOOL_DEFAULT 0
|
#define VM_FREEPOOL_DEFAULT 0
|
||||||
#define VM_FREEPOOL_DIRECT 1
|
#define VM_FREEPOOL_DIRECT 1
|
||||||
|
|
||||||
|
@ -1437,12 +1437,12 @@ also builtins
|
|||||||
abort" Unable to load a kernel!"
|
abort" Unable to load a kernel!"
|
||||||
;
|
;
|
||||||
|
|
||||||
: load_xen ( -- )
|
: load_xen ( -- flag )
|
||||||
s" xen_kernel" getenv dup -1 <> if
|
s" xen_kernel" getenv dup -1 <> if
|
||||||
1 1 load
|
1 1 load ( c-addr/u flag N -- flag )
|
||||||
else
|
else
|
||||||
drop
|
drop
|
||||||
0
|
0 ( -1 -- flag )
|
||||||
then
|
then
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -65,10 +65,11 @@ struct fs_ops *file_system[] = {
|
|||||||
&host_fsops,
|
&host_fsops,
|
||||||
&ufs_fsops,
|
&ufs_fsops,
|
||||||
&cd9660_fsops,
|
&cd9660_fsops,
|
||||||
&gzipfs_fsops,
|
|
||||||
#if defined(USERBOOT_ZFS_SUPPORT)
|
#if defined(USERBOOT_ZFS_SUPPORT)
|
||||||
&zfs_fsops,
|
&zfs_fsops,
|
||||||
#endif
|
#endif
|
||||||
|
&gzipfs_fsops,
|
||||||
|
&bzipfs_fsops,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1255,6 +1255,10 @@ dnode_read(const spa_t *spa, const dnode_phys_t *dnode, off_t offset, void *buf,
|
|||||||
ibn = bn >> ((nlevels - i - 1) * ibshift);
|
ibn = bn >> ((nlevels - i - 1) * ibshift);
|
||||||
ibn &= ((1 << ibshift) - 1);
|
ibn &= ((1 << ibshift) - 1);
|
||||||
bp = indbp[ibn];
|
bp = indbp[ibn];
|
||||||
|
if (BP_IS_HOLE(&bp)) {
|
||||||
|
memset(dnode_cache_buf, 0, bsize);
|
||||||
|
break;
|
||||||
|
}
|
||||||
rc = zio_read(spa, &bp, dnode_cache_buf);
|
rc = zio_read(spa, &bp, dnode_cache_buf);
|
||||||
if (rc)
|
if (rc)
|
||||||
return (rc);
|
return (rc);
|
||||||
|
@ -5011,9 +5011,9 @@ ctl_disable_lun(struct ctl_be_lun *be_lun)
|
|||||||
lun->lun);
|
lun->lun);
|
||||||
mtx_lock(&softc->ctl_lock);
|
mtx_lock(&softc->ctl_lock);
|
||||||
if (retval != 0) {
|
if (retval != 0) {
|
||||||
printf("ctl_alloc_lun: FETD %s port %d returned error "
|
printf("%s: FETD %s port %d returned error "
|
||||||
"%d for lun_disable on target %ju lun %jd\n",
|
"%d for lun_disable on target %ju lun %jd\n",
|
||||||
port->port_name, port->targ_port, retval,
|
__func__, port->port_name, port->targ_port, retval,
|
||||||
(uintmax_t)lun->target.id, (intmax_t)lun->lun);
|
(uintmax_t)lun->target.id, (intmax_t)lun->lun);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1657,16 +1657,24 @@ ctlfe_onoffline(void *arg, int online)
|
|||||||
* down to the SIM. Otherwise, record what the SIM
|
* down to the SIM. Otherwise, record what the SIM
|
||||||
* has reported.
|
* has reported.
|
||||||
*/
|
*/
|
||||||
if ((bus_softc->port.wwnn != 0)
|
if (bus_softc->port.wwnn != 0 && bus_softc->port.wwnn
|
||||||
&& (bus_softc->port.wwpn != 0)) {
|
!= ccb->knob.xport_specific.fc.wwnn) {
|
||||||
ccb->knob.xport_specific.fc.wwnn =
|
ccb->knob.xport_specific.fc.wwnn =
|
||||||
bus_softc->port.wwnn;
|
bus_softc->port.wwnn;
|
||||||
ccb->knob.xport_specific.fc.wwpn =
|
|
||||||
bus_softc->port.wwpn;
|
|
||||||
set_wwnn = 1;
|
set_wwnn = 1;
|
||||||
} else {
|
} else {
|
||||||
ctl_port_set_wwns(&bus_softc->port,
|
ctl_port_set_wwns(&bus_softc->port,
|
||||||
true, ccb->knob.xport_specific.fc.wwnn,
|
true, ccb->knob.xport_specific.fc.wwnn,
|
||||||
|
false, 0);
|
||||||
|
}
|
||||||
|
if (bus_softc->port.wwpn != 0 && bus_softc->port.wwpn
|
||||||
|
!= ccb->knob.xport_specific.fc.wwpn) {
|
||||||
|
ccb->knob.xport_specific.fc.wwpn =
|
||||||
|
bus_softc->port.wwpn;
|
||||||
|
set_wwnn = 1;
|
||||||
|
} else {
|
||||||
|
ctl_port_set_wwns(&bus_softc->port,
|
||||||
|
false, 0,
|
||||||
true, ccb->knob.xport_specific.fc.wwpn);
|
true, ccb->knob.xport_specific.fc.wwpn);
|
||||||
}
|
}
|
||||||
#endif /* RANDOM_WWNN */
|
#endif /* RANDOM_WWNN */
|
||||||
|
@ -29,6 +29,8 @@
|
|||||||
#ifndef _OPENSOLARIS_SYS_NVPAIR_H_
|
#ifndef _OPENSOLARIS_SYS_NVPAIR_H_
|
||||||
#define _OPENSOLARIS_SYS_NVPAIR_H_
|
#define _OPENSOLARIS_SYS_NVPAIR_H_
|
||||||
|
|
||||||
|
#ifdef _KERNEL
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some of the symbols in the Illumos nvpair library conflict with symbols
|
* Some of the symbols in the Illumos nvpair library conflict with symbols
|
||||||
* provided by nv(9), so we use this preprocessor hack to avoid the conflict.
|
* provided by nv(9), so we use this preprocessor hack to avoid the conflict.
|
||||||
@ -254,6 +256,8 @@
|
|||||||
#define nvpair_unpack illumos_nvpair_unpack
|
#define nvpair_unpack illumos_nvpair_unpack
|
||||||
#define nvpair_unpack_descriptor illumos_nvpair_unpack_descriptor
|
#define nvpair_unpack_descriptor illumos_nvpair_unpack_descriptor
|
||||||
|
|
||||||
|
#endif /* _KERNEL */
|
||||||
|
|
||||||
#include_next <sys/nvpair.h>
|
#include_next <sys/nvpair.h>
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1025,20 +1025,16 @@ linprocfs_doprocmaps(PFS_FILL_ARGS)
|
|||||||
ino = 0;
|
ino = 0;
|
||||||
if (lobj) {
|
if (lobj) {
|
||||||
off = IDX_TO_OFF(lobj->size);
|
off = IDX_TO_OFF(lobj->size);
|
||||||
if (lobj->type == OBJT_VNODE) {
|
vp = vm_object_vnode(lobj);
|
||||||
vp = lobj->handle;
|
if (vp != NULL)
|
||||||
if (vp)
|
vref(vp);
|
||||||
vref(vp);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
vp = NULL;
|
|
||||||
if (lobj != obj)
|
if (lobj != obj)
|
||||||
VM_OBJECT_RUNLOCK(lobj);
|
VM_OBJECT_RUNLOCK(lobj);
|
||||||
flags = obj->flags;
|
flags = obj->flags;
|
||||||
ref_count = obj->ref_count;
|
ref_count = obj->ref_count;
|
||||||
shadow_count = obj->shadow_count;
|
shadow_count = obj->shadow_count;
|
||||||
VM_OBJECT_RUNLOCK(obj);
|
VM_OBJECT_RUNLOCK(obj);
|
||||||
if (vp) {
|
if (vp != NULL) {
|
||||||
vn_fullpath(td, vp, &name, &freename);
|
vn_fullpath(td, vp, &name, &freename);
|
||||||
vn_lock(vp, LK_SHARED | LK_RETRY);
|
vn_lock(vp, LK_SHARED | LK_RETRY);
|
||||||
VOP_GETATTR(vp, &vat, td->td_ucred);
|
VOP_GETATTR(vp, &vat, td->td_ucred);
|
||||||
|
@ -219,6 +219,18 @@ void
|
|||||||
linux_proc_exec(void *arg __unused, struct proc *p, struct image_params *imgp)
|
linux_proc_exec(void *arg __unused, struct proc *p, struct image_params *imgp)
|
||||||
{
|
{
|
||||||
struct thread *td = curthread;
|
struct thread *td = curthread;
|
||||||
|
struct thread *othertd;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In a case of execing from linux binary properly detach
|
||||||
|
* other threads from the user space.
|
||||||
|
*/
|
||||||
|
if (__predict_false(SV_PROC_ABI(p) == SV_ABI_LINUX)) {
|
||||||
|
FOREACH_THREAD_IN_PROC(p, othertd) {
|
||||||
|
if (td != othertd)
|
||||||
|
(p->p_sysent->sv_thread_detach)(othertd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In a case of execing to linux binary we create linux
|
* In a case of execing to linux binary we create linux
|
||||||
|
@ -787,6 +787,7 @@ linux_accept_common(struct thread *td, int s, l_uintptr_t addr,
|
|||||||
/* XXX: */
|
/* XXX: */
|
||||||
bsd_args.name = (struct sockaddr * __restrict)PTRIN(addr);
|
bsd_args.name = (struct sockaddr * __restrict)PTRIN(addr);
|
||||||
bsd_args.anamelen = PTRIN(namelen);/* XXX */
|
bsd_args.anamelen = PTRIN(namelen);/* XXX */
|
||||||
|
bsd_args.flags = 0;
|
||||||
error = linux_set_socket_flags(flags, &bsd_args.flags);
|
error = linux_set_socket_flags(flags, &bsd_args.flags);
|
||||||
if (error != 0)
|
if (error != 0)
|
||||||
return (error);
|
return (error);
|
||||||
|
@ -156,6 +156,7 @@ options GEOM_GATE # Userland services.
|
|||||||
options GEOM_JOURNAL # Journaling.
|
options GEOM_JOURNAL # Journaling.
|
||||||
options GEOM_LABEL # Providers labelization.
|
options GEOM_LABEL # Providers labelization.
|
||||||
options GEOM_LINUX_LVM # Linux LVM2 volumes
|
options GEOM_LINUX_LVM # Linux LVM2 volumes
|
||||||
|
options GEOM_MAP # Map based partitioning
|
||||||
options GEOM_MBR # DOS/MBR partitioning
|
options GEOM_MBR # DOS/MBR partitioning
|
||||||
options GEOM_MIRROR # Disk mirroring.
|
options GEOM_MIRROR # Disk mirroring.
|
||||||
options GEOM_MULTIPATH # Disk multipath
|
options GEOM_MULTIPATH # Disk multipath
|
||||||
@ -176,6 +177,7 @@ options GEOM_RAID3 # RAID3 functionality.
|
|||||||
options GEOM_SHSEC # Shared secret.
|
options GEOM_SHSEC # Shared secret.
|
||||||
options GEOM_STRIPE # Disk striping.
|
options GEOM_STRIPE # Disk striping.
|
||||||
options GEOM_SUNLABEL # Sun/Solaris partitioning
|
options GEOM_SUNLABEL # Sun/Solaris partitioning
|
||||||
|
options GEOM_UNCOMPRESS # Read-only compressed disks (lzma, zip)
|
||||||
options GEOM_UZIP # Read-only compressed disks
|
options GEOM_UZIP # Read-only compressed disks
|
||||||
options GEOM_VINUM # Vinum logical volume manager
|
options GEOM_VINUM # Vinum logical volume manager
|
||||||
options GEOM_VIRSTOR # Virtual storage.
|
options GEOM_VIRSTOR # Virtual storage.
|
||||||
@ -2980,6 +2982,9 @@ options RANDOM_DEBUG # Debugging messages
|
|||||||
# Module to enable execution of application via emulators like QEMU
|
# Module to enable execution of application via emulators like QEMU
|
||||||
options IMAGACT_BINMISC
|
options IMAGACT_BINMISC
|
||||||
|
|
||||||
|
# Intel em(4) driver
|
||||||
|
options EM_MULTIQUEUE # Activate multiqueue features/disable MSI-X
|
||||||
|
|
||||||
# zlib I/O stream support
|
# zlib I/O stream support
|
||||||
# This enables support for compressed core dumps.
|
# This enables support for compressed core dumps.
|
||||||
options GZIO
|
options GZIO
|
||||||
|
@ -2561,6 +2561,7 @@ dev/usb/template/usb_template_msc.c optional usb_template
|
|||||||
dev/usb/template/usb_template_mtp.c optional usb_template
|
dev/usb/template/usb_template_mtp.c optional usb_template
|
||||||
dev/usb/template/usb_template_phone.c optional usb_template
|
dev/usb/template/usb_template_phone.c optional usb_template
|
||||||
dev/usb/template/usb_template_serialnet.c optional usb_template
|
dev/usb/template/usb_template_serialnet.c optional usb_template
|
||||||
|
dev/usb/template/usb_template_midi.c optional usb_template
|
||||||
#
|
#
|
||||||
# USB video drivers
|
# USB video drivers
|
||||||
#
|
#
|
||||||
|
@ -108,6 +108,7 @@ GEOM_JOURNAL opt_geom.h
|
|||||||
GEOM_LABEL opt_geom.h
|
GEOM_LABEL opt_geom.h
|
||||||
GEOM_LABEL_GPT opt_geom.h
|
GEOM_LABEL_GPT opt_geom.h
|
||||||
GEOM_LINUX_LVM opt_geom.h
|
GEOM_LINUX_LVM opt_geom.h
|
||||||
|
GEOM_MAP opt_geom.h
|
||||||
GEOM_MBR opt_geom.h
|
GEOM_MBR opt_geom.h
|
||||||
GEOM_MIRROR opt_geom.h
|
GEOM_MIRROR opt_geom.h
|
||||||
GEOM_MULTIPATH opt_geom.h
|
GEOM_MULTIPATH opt_geom.h
|
||||||
@ -940,3 +941,6 @@ RCTL opt_global.h
|
|||||||
RANDOM_YARROW opt_random.h
|
RANDOM_YARROW opt_random.h
|
||||||
RANDOM_FORTUNA opt_random.h
|
RANDOM_FORTUNA opt_random.h
|
||||||
RANDOM_DEBUG opt_random.h
|
RANDOM_DEBUG opt_random.h
|
||||||
|
|
||||||
|
# Intel em(4) driver
|
||||||
|
EM_MULTIQUEUE opt_em.h
|
||||||
|
@ -43,6 +43,7 @@
|
|||||||
|
|
||||||
#include <contrib/dev/acpica/include/acpi.h>
|
#include <contrib/dev/acpica/include/acpi.h>
|
||||||
#include <contrib/dev/acpica/include/accommon.h>
|
#include <contrib/dev/acpica/include/accommon.h>
|
||||||
|
#include <contrib/dev/acpica/include/acuuid.h>
|
||||||
|
|
||||||
#define _COMPONENT ACPI_UTILITIES
|
#define _COMPONENT ACPI_UTILITIES
|
||||||
ACPI_MODULE_NAME ("ahuuids")
|
ACPI_MODULE_NAME ("ahuuids")
|
||||||
@ -52,44 +53,36 @@
|
|||||||
*/
|
*/
|
||||||
const AH_UUID AcpiUuids[] =
|
const AH_UUID AcpiUuids[] =
|
||||||
{
|
{
|
||||||
{"PCI Host Bridge Device",
|
{"[Controllers]", NULL},
|
||||||
"33db4d5b-1ff7-401c-9657-7441c03dd766"},
|
{"GPIO Controller", UUID_GPIO_CONTROLLER},
|
||||||
|
{"USB Controller", UUID_USB_CONTROLLER},
|
||||||
|
{"SATA Controller", UUID_SATA_CONTROLLER},
|
||||||
|
|
||||||
{"Platform-wide Capabilities",
|
{"[Devices]", NULL},
|
||||||
"0811b06e-4a27-44f9-8d60-3cbbc22e7b48"},
|
{"PCI Host Bridge Device", UUID_PCI_HOST_BRIDGE},
|
||||||
|
{"HID I2C Device", UUID_I2C_DEVICE},
|
||||||
|
{"Power Button Device", UUID_POWER_BUTTON},
|
||||||
|
|
||||||
{"Dynamic Enumeration",
|
{"[Interfaces]", NULL},
|
||||||
"d8c1a3a6-be9b-4c9b-91bf-c3cb81fc5daf"},
|
{"Device Labeling Interface", UUID_DEVICE_LABELING},
|
||||||
|
{"Physical Presence Interface", UUID_PHYSICAL_PRESENCE},
|
||||||
|
|
||||||
{"GPIO Controller",
|
{"[Non-volatile DIMM and NFIT table]", NULL},
|
||||||
"4f248f40-d5e2-499f-834c-27758ea1cd3f"},
|
{"Volatile Memory Region", UUID_VOLATILE_MEMORY},
|
||||||
|
{"Persistent Memory Region", UUID_PERSISTENT_MEMORY},
|
||||||
|
{"NVDIMM Control Region", UUID_CONTROL_REGION},
|
||||||
|
{"NVDIMM Data Region", UUID_DATA_REGION},
|
||||||
|
{"Volatile Virtual Disk", UUID_VOLATILE_VIRTUAL_DISK},
|
||||||
|
{"Volatile Virtual CD", UUID_VOLATILE_VIRTUAL_CD},
|
||||||
|
{"Persistent Virtual Disk", UUID_PERSISTENT_VIRTUAL_DISK},
|
||||||
|
{"Persistent Virtual CD", UUID_PERSISTENT_VIRTUAL_CD},
|
||||||
|
|
||||||
{"Battery Thermal Limit",
|
{"[Miscellaneous]", NULL},
|
||||||
"4c2067e3-887d-475c-9720-4af1d3ed602e"},
|
{"Platform-wide Capabilities", UUID_PLATFORM_CAPABILITIES},
|
||||||
|
{"Dynamic Enumeration", UUID_DYNAMIC_ENUMERATION},
|
||||||
{"Thermal Extensions",
|
{"Battery Thermal Limit", UUID_BATTERY_THERMAL_LIMIT},
|
||||||
"14d399cd-7a27-4b18-8fb4-7cb7b9f4e500"},
|
{"Thermal Extensions", UUID_THERMAL_EXTENSIONS},
|
||||||
|
{"Device Properties for _DSD", UUID_DEVICE_PROPERTIES},
|
||||||
{"USB Controller",
|
|
||||||
"ce2ee385-00e6-48cb-9f05-2edb927c4899"},
|
|
||||||
|
|
||||||
{"HID I2C Device",
|
|
||||||
"3cdff6f7-4267-4555-ad05-b30a3d8938de"},
|
|
||||||
|
|
||||||
{"Power Button Device",
|
|
||||||
"dfbcf3c5-e7a5-44e6-9c1f-29c76f6e059c"},
|
|
||||||
|
|
||||||
{"Device Labeling Interface",
|
|
||||||
"e5c937d0-3553-4d7a-9117-ea4d19c3434d"},
|
|
||||||
|
|
||||||
{"SATA Controller",
|
|
||||||
"e4db149b-fcfe-425b-a6d8-92357d78fc7f"},
|
|
||||||
|
|
||||||
{"Physical Presence Interface",
|
|
||||||
"3dddfaa6-361b-4eb4-a424-8d10089d1653"},
|
|
||||||
|
|
||||||
{"Device Properties for _DSD",
|
|
||||||
"daffd814-6eba-4d8c-8a91-bc9bbf4aa301"},
|
|
||||||
|
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
@ -120,6 +113,13 @@ AcpiAhMatchUuid (
|
|||||||
|
|
||||||
for (Info = AcpiUuids; Info->Description; Info++)
|
for (Info = AcpiUuids; Info->Description; Info++)
|
||||||
{
|
{
|
||||||
|
/* Null string means desciption is a UUID class */
|
||||||
|
|
||||||
|
if (!Info->String)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
AcpiUtConvertStringToUuid (Info->String, UuidBuffer);
|
AcpiUtConvertStringToUuid (Info->String, UuidBuffer);
|
||||||
|
|
||||||
if (!ACPI_MEMCMP (Data, UuidBuffer, UUID_BUFFER_LENGTH))
|
if (!ACPI_MEMCMP (Data, UuidBuffer, UUID_BUFFER_LENGTH))
|
||||||
|
@ -50,15 +50,41 @@
|
|||||||
* Note2: This file is standalone and should remain that way.
|
* Note2: This file is standalone and should remain that way.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* NFIT/NVDIMM */
|
/* Controllers */
|
||||||
|
|
||||||
|
#define UUID_GPIO_CONTROLLER "4f248f40-d5e2-499f-834c-27758ea1cd3f"
|
||||||
|
#define UUID_USB_CONTROLLER "ce2ee385-00e6-48cb-9f05-2edb927c4899"
|
||||||
|
#define UUID_SATA_CONTROLLER "e4db149b-fcfe-425b-a6d8-92357d78fc7f"
|
||||||
|
|
||||||
|
/* Devices */
|
||||||
|
|
||||||
|
#define UUID_PCI_HOST_BRIDGE "33db4d5b-1ff7-401c-9657-7441c03dd766"
|
||||||
|
#define UUID_I2C_DEVICE "3cdff6f7-4267-4555-ad05-b30a3d8938de"
|
||||||
|
#define UUID_POWER_BUTTON "dfbcf3c5-e7a5-44e6-9c1f-29c76f6e059c"
|
||||||
|
|
||||||
|
/* Interfaces */
|
||||||
|
|
||||||
|
#define UUID_DEVICE_LABELING "e5c937d0-3553-4d7a-9117-ea4d19c3434d"
|
||||||
|
#define UUID_PHYSICAL_PRESENCE "3dddfaa6-361b-4eb4-a424-8d10089d1653"
|
||||||
|
|
||||||
|
/* NVDIMM - NFIT table */
|
||||||
|
|
||||||
|
#define UUID_VOLATILE_MEMORY "7305944f-fdda-44e3-b16c-3f22d252e5d0"
|
||||||
|
#define UUID_PERSISTENT_MEMORY "66f0d379-b4f3-4074-ac43-0d3318b78cdb"
|
||||||
|
#define UUID_CONTROL_REGION "92f701f6-13b4-405d-910b-299367e8234c"
|
||||||
|
#define UUID_DATA_REGION "91af0530-5d86-470e-a6b0-0a2db9408249"
|
||||||
|
#define UUID_VOLATILE_VIRTUAL_DISK "77ab535a-45fc-624b-5560-f7b281d1f96e"
|
||||||
|
#define UUID_VOLATILE_VIRTUAL_CD "3d5abd30-4175-87ce-6d64-d2ade523c4bb"
|
||||||
|
#define UUID_PERSISTENT_VIRTUAL_DISK "5cea02c9-4d07-69d3-269f-4496fbe096f9"
|
||||||
|
#define UUID_PERSISTENT_VIRTUAL_CD "08018188-42cd-bb48-100f-5387d53ded3d"
|
||||||
|
|
||||||
|
/* Miscellaneous */
|
||||||
|
|
||||||
|
#define UUID_PLATFORM_CAPABILITIES "0811b06e-4a27-44f9-8d60-3cbbc22e7b48"
|
||||||
|
#define UUID_DYNAMIC_ENUMERATION "d8c1a3a6-be9b-4c9b-91bf-c3cb81fc5daf"
|
||||||
|
#define UUID_BATTERY_THERMAL_LIMIT "4c2067e3-887d-475c-9720-4af1d3ed602e"
|
||||||
|
#define UUID_THERMAL_EXTENSIONS "14d399cd-7a27-4b18-8fb4-7cb7b9f4e500"
|
||||||
|
#define UUID_DEVICE_PROPERTIES "daffd814-6eba-4d8c-8a91-bc9bbf4aa301"
|
||||||
|
|
||||||
#define UUID_VOLATILE_MEMORY "4F940573-DAFD-E344-B16C-3F22D252E5D0"
|
|
||||||
#define UUID_PERSISTENT_MEMORY "79D3F066-F3B4-7440-AC43-0D3318B78CDB"
|
|
||||||
#define UUID_CONTROL_REGION "F601F792-B413-5D40-910B-299367E8234C"
|
|
||||||
#define UUID_DATA_REGION "3005AF91-865D-0E47-A6B0-0A2DB9408249"
|
|
||||||
#define UUID_VOLATILE_VIRTUAL_DISK "5A53AB77-FC45-4B62-5560-F7B281D1F96E"
|
|
||||||
#define UUID_VOLATILE_VIRTUAL_CD "30BD5A3D-7541-CE87-6D64-D2ADE523C4BB"
|
|
||||||
#define UUID_PERSISTENT_VIRTUAL_DISK "C902EA5C-074D-69D3-269F-4496FBE096F9"
|
|
||||||
#define UUID_PERSISTENT_VIRTUAL_CD "88810108-CD42-48BB-100F-5387D53DED3D"
|
|
||||||
|
|
||||||
#endif /* __AUUID_H__ */
|
#endif /* __AUUID_H__ */
|
||||||
|
@ -578,7 +578,7 @@ enum ahci_err_type {
|
|||||||
#define AHCI_Q_RESTORE_CAP 0x00080000
|
#define AHCI_Q_RESTORE_CAP 0x00080000
|
||||||
|
|
||||||
#define AHCI_Q_BIT_STRING \
|
#define AHCI_Q_BIT_STRING \
|
||||||
"\021" \
|
"\020" \
|
||||||
"\001NOFORCE" \
|
"\001NOFORCE" \
|
||||||
"\002NOPMP" \
|
"\002NOPMP" \
|
||||||
"\003NONCQ" \
|
"\003NONCQ" \
|
||||||
|
@ -93,6 +93,11 @@ ahd_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor)
|
|||||||
#define ID_AIC7902_PCI_REV_A4 0x3
|
#define ID_AIC7902_PCI_REV_A4 0x3
|
||||||
#define ID_AIC7902_PCI_REV_B0 0x10
|
#define ID_AIC7902_PCI_REV_B0 0x10
|
||||||
#define SUBID_HP 0x0E11
|
#define SUBID_HP 0x0E11
|
||||||
|
#define DEVICE8081 0x8081
|
||||||
|
#define DEVICE8088 0x8088
|
||||||
|
#define DEVICE8089 0x8089
|
||||||
|
#define ADAPTECVENDORID 0x9005
|
||||||
|
#define SUBVENDOR9005 0x9005
|
||||||
|
|
||||||
#define DEVID_9005_HOSTRAID(id) ((id) & 0x80)
|
#define DEVID_9005_HOSTRAID(id) ((id) & 0x80)
|
||||||
|
|
||||||
@ -292,6 +297,15 @@ ahd_find_pci_device(aic_dev_softc_t pci)
|
|||||||
device = aic_pci_read_config(pci, PCIR_DEVICE, /*bytes*/2);
|
device = aic_pci_read_config(pci, PCIR_DEVICE, /*bytes*/2);
|
||||||
subvendor = aic_pci_read_config(pci, PCIR_SUBVEND_0, /*bytes*/2);
|
subvendor = aic_pci_read_config(pci, PCIR_SUBVEND_0, /*bytes*/2);
|
||||||
subdevice = aic_pci_read_config(pci, PCIR_SUBDEV_0, /*bytes*/2);
|
subdevice = aic_pci_read_config(pci, PCIR_SUBDEV_0, /*bytes*/2);
|
||||||
|
|
||||||
|
if ((vendor == ADAPTECVENDORID) && (subvendor == SUBVENDOR9005)) {
|
||||||
|
if ((device == DEVICE8081) || (device == DEVICE8088) ||
|
||||||
|
(device == DEVICE8089)) {
|
||||||
|
printf("Controller device ID conflict with PMC Adaptec HBA\n");
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
full_id = ahd_compose_id(device,
|
full_id = ahd_compose_id(device,
|
||||||
vendor,
|
vendor,
|
||||||
subdevice,
|
subdevice,
|
||||||
|
@ -297,7 +297,7 @@ alloc_nm_rxq_hwq(struct port_info *pi, struct sge_nm_rxq *nm_rxq, int cong)
|
|||||||
(fl_pad ? F_FW_IQ_CMD_FL0PADEN : 0) |
|
(fl_pad ? F_FW_IQ_CMD_FL0PADEN : 0) |
|
||||||
(black_hole == 2 ? F_FW_IQ_CMD_FL0PACKEN : 0));
|
(black_hole == 2 ? F_FW_IQ_CMD_FL0PACKEN : 0));
|
||||||
c.fl0dcaen_to_fl0cidxfthresh =
|
c.fl0dcaen_to_fl0cidxfthresh =
|
||||||
htobe16(V_FW_IQ_CMD_FL0FBMIN(X_FETCHBURSTMIN_64B) |
|
htobe16(V_FW_IQ_CMD_FL0FBMIN(X_FETCHBURSTMIN_128B) |
|
||||||
V_FW_IQ_CMD_FL0FBMAX(X_FETCHBURSTMAX_512B));
|
V_FW_IQ_CMD_FL0FBMAX(X_FETCHBURSTMAX_512B));
|
||||||
c.fl0size = htobe16(na->num_rx_desc / 8 + spg_len / EQ_ESIZE);
|
c.fl0size = htobe16(na->num_rx_desc / 8 + spg_len / EQ_ESIZE);
|
||||||
c.fl0addr = htobe64(nm_rxq->fl_ba);
|
c.fl0addr = htobe64(nm_rxq->fl_ba);
|
||||||
|
@ -51,9 +51,7 @@ struct drm_file;
|
|||||||
#include <sys/conf.h>
|
#include <sys/conf.h>
|
||||||
#include <sys/sglist.h>
|
#include <sys/sglist.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#if __FreeBSD_version >= 700000
|
|
||||||
#include <sys/priv.h>
|
#include <sys/priv.h>
|
||||||
#endif
|
|
||||||
#include <sys/proc.h>
|
#include <sys/proc.h>
|
||||||
#include <sys/lock.h>
|
#include <sys/lock.h>
|
||||||
#include <sys/fcntl.h>
|
#include <sys/fcntl.h>
|
||||||
@ -94,11 +92,7 @@ struct drm_file;
|
|||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/rman.h>
|
#include <sys/rman.h>
|
||||||
#include <sys/memrange.h>
|
#include <sys/memrange.h>
|
||||||
#if __FreeBSD_version >= 800004
|
|
||||||
#include <dev/agp/agpvar.h>
|
#include <dev/agp/agpvar.h>
|
||||||
#else /* __FreeBSD_version >= 800004 */
|
|
||||||
#include <pci/agpvar.h>
|
|
||||||
#endif /* __FreeBSD_version >= 800004 */
|
|
||||||
#include <sys/agpio.h>
|
#include <sys/agpio.h>
|
||||||
#include <sys/mutex.h>
|
#include <sys/mutex.h>
|
||||||
#include <dev/pci/pcivar.h>
|
#include <dev/pci/pcivar.h>
|
||||||
@ -227,11 +221,7 @@ enum {
|
|||||||
|
|
||||||
#define PAGE_ALIGN(addr) round_page(addr)
|
#define PAGE_ALIGN(addr) round_page(addr)
|
||||||
/* DRM_SUSER returns true if the user is superuser */
|
/* DRM_SUSER returns true if the user is superuser */
|
||||||
#if __FreeBSD_version >= 700000
|
|
||||||
#define DRM_SUSER(p) (priv_check(p, PRIV_DRIVER) == 0)
|
#define DRM_SUSER(p) (priv_check(p, PRIV_DRIVER) == 0)
|
||||||
#else
|
|
||||||
#define DRM_SUSER(p) (suser(p) == 0)
|
|
||||||
#endif
|
|
||||||
#define DRM_AGP_FIND_DEVICE() agp_find_device()
|
#define DRM_AGP_FIND_DEVICE() agp_find_device()
|
||||||
#define DRM_MTRR_WC MDF_WRITECOMBINE
|
#define DRM_MTRR_WC MDF_WRITECOMBINE
|
||||||
#define jiffies ticks
|
#define jiffies ticks
|
||||||
|
@ -38,50 +38,15 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
#include "dev/drm/drmP.h"
|
#include "dev/drm/drmP.h"
|
||||||
|
|
||||||
#if __FreeBSD_version >= 800004
|
|
||||||
#include <dev/agp/agpreg.h>
|
#include <dev/agp/agpreg.h>
|
||||||
#else /* __FreeBSD_version >= 800004 */
|
|
||||||
#include <pci/agpreg.h>
|
|
||||||
#endif /* __FreeBSD_version >= 800004 */
|
|
||||||
#include <dev/pci/pcireg.h>
|
#include <dev/pci/pcireg.h>
|
||||||
|
|
||||||
/* Returns 1 if AGP or 0 if not. */
|
/* Returns 1 if AGP or 0 if not. */
|
||||||
static int
|
static int
|
||||||
drm_device_find_capability(struct drm_device *dev, int cap)
|
drm_device_find_capability(struct drm_device *dev, int cap)
|
||||||
{
|
{
|
||||||
#if __FreeBSD_version >= 602102
|
|
||||||
|
|
||||||
return (pci_find_cap(dev->device, cap, NULL) == 0);
|
return (pci_find_cap(dev->device, cap, NULL) == 0);
|
||||||
#else
|
|
||||||
/* Code taken from agp.c. IWBNI that was a public interface. */
|
|
||||||
u_int32_t status;
|
|
||||||
u_int8_t ptr, next;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check the CAP_LIST bit of the PCI status register first.
|
|
||||||
*/
|
|
||||||
status = pci_read_config(dev->device, PCIR_STATUS, 2);
|
|
||||||
if (!(status & 0x10))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Traverse the capabilities list.
|
|
||||||
*/
|
|
||||||
for (ptr = pci_read_config(dev->device, AGP_CAPPTR, 1);
|
|
||||||
ptr != 0;
|
|
||||||
ptr = next) {
|
|
||||||
u_int32_t capid = pci_read_config(dev->device, ptr, 4);
|
|
||||||
next = AGP_CAPID_GET_NEXT_PTR(capid);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If this capability entry ID is cap, then we are done.
|
|
||||||
*/
|
|
||||||
if (AGP_CAPID_GET_CAP_ID(capid) == cap)
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int drm_device_is_agp(struct drm_device *dev)
|
int drm_device_is_agp(struct drm_device *dev)
|
||||||
|
@ -1066,15 +1066,9 @@ int drm_mapbufs(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
vaddr = round_page((vm_offset_t)vms->vm_daddr + MAXDSIZ);
|
vaddr = round_page((vm_offset_t)vms->vm_daddr + MAXDSIZ);
|
||||||
#if __FreeBSD_version >= 600023
|
retcode = vm_mmap(&vms->vm_map, &vaddr, size, VM_PROT_READ |
|
||||||
retcode = vm_mmap(&vms->vm_map, &vaddr, size, PROT_READ | PROT_WRITE,
|
VM_PROT_WRITE, VM_PROT_ALL, MAP_SHARED | MAP_NOSYNC, OBJT_DEVICE,
|
||||||
VM_PROT_ALL, MAP_SHARED | MAP_NOSYNC, OBJT_DEVICE,
|
|
||||||
dev->devnode, foff);
|
dev->devnode, foff);
|
||||||
#else
|
|
||||||
retcode = vm_mmap(&vms->vm_map, &vaddr, size, PROT_READ | PROT_WRITE,
|
|
||||||
VM_PROT_ALL, MAP_SHARED | MAP_NOSYNC,
|
|
||||||
SLIST_FIRST(&dev->devnode->si_hlist), foff);
|
|
||||||
#endif
|
|
||||||
if (retcode)
|
if (retcode)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
|
@ -161,19 +161,8 @@ int drm_probe(device_t kdev, drm_pci_id_list_t *idlist)
|
|||||||
{
|
{
|
||||||
drm_pci_id_list_t *id_entry;
|
drm_pci_id_list_t *id_entry;
|
||||||
int vendor, device;
|
int vendor, device;
|
||||||
#if __FreeBSD_version < 700010
|
|
||||||
device_t realdev;
|
|
||||||
|
|
||||||
if (!strcmp(device_get_name(kdev), "drmsub"))
|
|
||||||
realdev = device_get_parent(kdev);
|
|
||||||
else
|
|
||||||
realdev = kdev;
|
|
||||||
vendor = pci_get_vendor(realdev);
|
|
||||||
device = pci_get_device(realdev);
|
|
||||||
#else
|
|
||||||
vendor = pci_get_vendor(kdev);
|
vendor = pci_get_vendor(kdev);
|
||||||
device = pci_get_device(kdev);
|
device = pci_get_device(kdev);
|
||||||
#endif
|
|
||||||
|
|
||||||
if (pci_get_class(kdev) != PCIC_DISPLAY
|
if (pci_get_class(kdev) != PCIC_DISPLAY
|
||||||
|| pci_get_subclass(kdev) != PCIS_DISPLAY_VGA)
|
|| pci_get_subclass(kdev) != PCIS_DISPLAY_VGA)
|
||||||
@ -200,14 +189,7 @@ int drm_attach(device_t kdev, drm_pci_id_list_t *idlist)
|
|||||||
unit = device_get_unit(kdev);
|
unit = device_get_unit(kdev);
|
||||||
dev = device_get_softc(kdev);
|
dev = device_get_softc(kdev);
|
||||||
|
|
||||||
#if __FreeBSD_version < 700010
|
|
||||||
if (!strcmp(device_get_name(kdev), "drmsub"))
|
|
||||||
dev->device = device_get_parent(kdev);
|
|
||||||
else
|
|
||||||
dev->device = kdev;
|
|
||||||
#else
|
|
||||||
dev->device = kdev;
|
dev->device = kdev;
|
||||||
#endif
|
|
||||||
dev->devnode = make_dev(&drm_cdevsw,
|
dev->devnode = make_dev(&drm_cdevsw,
|
||||||
0,
|
0,
|
||||||
DRM_DEV_UID,
|
DRM_DEV_UID,
|
||||||
@ -216,11 +198,7 @@ int drm_attach(device_t kdev, drm_pci_id_list_t *idlist)
|
|||||||
"dri/card%d", unit);
|
"dri/card%d", unit);
|
||||||
dev->devnode->si_drv1 = dev;
|
dev->devnode->si_drv1 = dev;
|
||||||
|
|
||||||
#if __FreeBSD_version >= 700053
|
|
||||||
dev->pci_domain = pci_get_domain(dev->device);
|
dev->pci_domain = pci_get_domain(dev->device);
|
||||||
#else
|
|
||||||
dev->pci_domain = 0;
|
|
||||||
#endif
|
|
||||||
dev->pci_bus = pci_get_bus(dev->device);
|
dev->pci_bus = pci_get_bus(dev->device);
|
||||||
dev->pci_slot = pci_get_slot(dev->device);
|
dev->pci_slot = pci_get_slot(dev->device);
|
||||||
dev->pci_func = pci_get_function(dev->device);
|
dev->pci_func = pci_get_function(dev->device);
|
||||||
|
@ -175,15 +175,9 @@ int drm_irq_install(struct drm_device *dev)
|
|||||||
DRM_UNLOCK();
|
DRM_UNLOCK();
|
||||||
|
|
||||||
/* Install handler */
|
/* Install handler */
|
||||||
#if __FreeBSD_version >= 700031
|
|
||||||
retcode = bus_setup_intr(dev->device, dev->irqr,
|
retcode = bus_setup_intr(dev->device, dev->irqr,
|
||||||
INTR_TYPE_TTY | INTR_MPSAFE,
|
INTR_TYPE_TTY | INTR_MPSAFE,
|
||||||
NULL, drm_irq_handler_wrap, dev, &dev->irqh);
|
NULL, drm_irq_handler_wrap, dev, &dev->irqh);
|
||||||
#else
|
|
||||||
retcode = bus_setup_intr(dev->device, dev->irqr,
|
|
||||||
INTR_TYPE_TTY | INTR_MPSAFE,
|
|
||||||
drm_irq_handler_wrap, dev, &dev->irqh);
|
|
||||||
#endif
|
|
||||||
if (retcode != 0)
|
if (retcode != 0)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
@ -147,19 +147,11 @@ static device_method_t i915_methods[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static driver_t i915_driver = {
|
static driver_t i915_driver = {
|
||||||
#if __FreeBSD_version >= 700010
|
|
||||||
"drm",
|
"drm",
|
||||||
#else
|
|
||||||
"drmsub",
|
|
||||||
#endif
|
|
||||||
i915_methods,
|
i915_methods,
|
||||||
sizeof(struct drm_device)
|
sizeof(struct drm_device)
|
||||||
};
|
};
|
||||||
|
|
||||||
extern devclass_t drm_devclass;
|
extern devclass_t drm_devclass;
|
||||||
#if __FreeBSD_version >= 700010
|
|
||||||
DRIVER_MODULE(i915, vgapci, i915_driver, drm_devclass, 0, 0);
|
DRIVER_MODULE(i915, vgapci, i915_driver, drm_devclass, 0, 0);
|
||||||
#else
|
|
||||||
DRIVER_MODULE(i915, agp, i915_driver, drm_devclass, 0, 0);
|
|
||||||
#endif
|
|
||||||
MODULE_DEPEND(i915, drm, 1, 1, 1);
|
MODULE_DEPEND(i915, drm, 1, 1, 1);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user