Remove obsolete asf(8)
kgdb now handles kernel module state internally, so the asf tool serves no purpose. PR: 229046 Reviewed by: brooks Relnotes: yes Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D15827
This commit is contained in:
parent
d1ded78d8e
commit
f756301851
@ -38,6 +38,9 @@
|
|||||||
# xargs -n1 | sort | uniq -d;
|
# xargs -n1 | sort | uniq -d;
|
||||||
# done
|
# done
|
||||||
|
|
||||||
|
# 20180615: asf(8) removed
|
||||||
|
OLD_FILES+=usr/bin/asf
|
||||||
|
OLD_FILES+=usr/share/man/man8/asf.8.gz
|
||||||
# 20180609: obsolete libc++ files missed from the 5.0.0 import
|
# 20180609: obsolete libc++ files missed from the 5.0.0 import
|
||||||
OLD_FILES+=usr/include/c++/v1/__refstring
|
OLD_FILES+=usr/include/c++/v1/__refstring
|
||||||
OLD_FILES+=usr/include/c++/v1/__undef_min_max
|
OLD_FILES+=usr/include/c++/v1/__undef_min_max
|
||||||
|
@ -810,7 +810,6 @@ DIRDEPS.amd64= \
|
|||||||
usr.sbin/acpi/acpidump \
|
usr.sbin/acpi/acpidump \
|
||||||
usr.sbin/acpi/iasl \
|
usr.sbin/acpi/iasl \
|
||||||
usr.sbin/apm \
|
usr.sbin/apm \
|
||||||
usr.sbin/asf \
|
|
||||||
usr.sbin/bhyve \
|
usr.sbin/bhyve \
|
||||||
usr.sbin/bhyvectl \
|
usr.sbin/bhyvectl \
|
||||||
usr.sbin/bhyveload \
|
usr.sbin/bhyveload \
|
||||||
@ -842,7 +841,6 @@ DIRDEPS.i386= \
|
|||||||
sbin/sconfig \
|
sbin/sconfig \
|
||||||
usr.sbin/apm \
|
usr.sbin/apm \
|
||||||
usr.sbin/apmd \
|
usr.sbin/apmd \
|
||||||
usr.sbin/asf \
|
|
||||||
usr.sbin/btxld \
|
usr.sbin/btxld \
|
||||||
usr.sbin/cpucontrol \
|
usr.sbin/cpucontrol \
|
||||||
usr.sbin/hyperv/tools \
|
usr.sbin/hyperv/tools \
|
||||||
|
@ -9,7 +9,6 @@ SUBDIR+= acpi
|
|||||||
.if ${MK_APM} != "no"
|
.if ${MK_APM} != "no"
|
||||||
SUBDIR+= apm
|
SUBDIR+= apm
|
||||||
.endif
|
.endif
|
||||||
SUBDIR+= asf
|
|
||||||
.if ${MK_BHYVE} != "no"
|
.if ${MK_BHYVE} != "no"
|
||||||
SUBDIR+= bhyve
|
SUBDIR+= bhyve
|
||||||
SUBDIR+= bhyvectl
|
SUBDIR+= bhyvectl
|
||||||
|
@ -7,7 +7,6 @@ SUBDIR+= acpi
|
|||||||
SUBDIR+= apm
|
SUBDIR+= apm
|
||||||
SUBDIR+= apmd
|
SUBDIR+= apmd
|
||||||
.endif
|
.endif
|
||||||
SUBDIR+= asf
|
|
||||||
SUBDIR+= boot0cfg
|
SUBDIR+= boot0cfg
|
||||||
.if ${MK_TOOLCHAIN} != "no"
|
.if ${MK_TOOLCHAIN} != "no"
|
||||||
SUBDIR+= btxld
|
SUBDIR+= btxld
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
|
|
||||||
PROG= asf
|
|
||||||
SRCS= asf.c asf_kld.c asf_kvm.c asf_prog.c
|
|
||||||
MAN= asf.8
|
|
||||||
|
|
||||||
LIBADD= kvm
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
|
@ -1,19 +0,0 @@
|
|||||||
# $FreeBSD$
|
|
||||||
# Autogenerated - do NOT edit!
|
|
||||||
|
|
||||||
DIRDEPS = \
|
|
||||||
gnu/lib/csu \
|
|
||||||
include \
|
|
||||||
include/xlocale \
|
|
||||||
lib/${CSU_DIR} \
|
|
||||||
lib/libc \
|
|
||||||
lib/libcompiler_rt \
|
|
||||||
lib/libelf \
|
|
||||||
lib/libkvm \
|
|
||||||
|
|
||||||
|
|
||||||
.include <dirdeps.mk>
|
|
||||||
|
|
||||||
.if ${DEP_RELDIR} == ${_DEP_RELDIR}
|
|
||||||
# local dependencies - needed for -jN in clean tree
|
|
||||||
.endif
|
|
@ -1,188 +0,0 @@
|
|||||||
.\" Copyright (c) 2003 Greg Lehey. 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 Greg Lehey ``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 Greg Lehey be liable
|
|
||||||
.\" for any direct, indirect, incidental, special, exemplary, or consequential
|
|
||||||
.\" damages (including, but not limited to, procurement of substitute goods
|
|
||||||
.\" or services; loss of use, data, or profits; or business interruption)
|
|
||||||
.\" however caused and on any theory of liability, whether in contract, strict
|
|
||||||
.\" liability, or tort (including negligence or otherwise) arising in any way
|
|
||||||
.\" out of the use of this software, even if advised of the possibility of
|
|
||||||
.\" such damage.
|
|
||||||
.\"
|
|
||||||
.\" $FreeBSD$
|
|
||||||
.\"
|
|
||||||
.Dd December 20, 2006
|
|
||||||
.Dt ASF 8
|
|
||||||
.Os
|
|
||||||
.Sh NAME
|
|
||||||
.Nm asf
|
|
||||||
.Nd add symbol files
|
|
||||||
.Sh SYNOPSIS
|
|
||||||
.Nm
|
|
||||||
.Op Fl afKksVx
|
|
||||||
.Op Fl M Ar core
|
|
||||||
.Op Fl N Ar system
|
|
||||||
.Op Fl o Ar outfile
|
|
||||||
.Op Fl X Ar suffix
|
|
||||||
.Op Ar modules-path Op Ar outfile
|
|
||||||
.Sh DEPRECATION NOTICE
|
|
||||||
The
|
|
||||||
.Nm
|
|
||||||
utility is not present in
|
|
||||||
.Fx 12.0
|
|
||||||
and later.
|
|
||||||
The
|
|
||||||
.Xr kgdb 1
|
|
||||||
debugger handles kernel module state internally.
|
|
||||||
.Sh DESCRIPTION
|
|
||||||
By default,
|
|
||||||
.Nm
|
|
||||||
reads
|
|
||||||
.Xr kldstat 8
|
|
||||||
output from standard input and writes to the
|
|
||||||
.Pa .asf
|
|
||||||
file a list of
|
|
||||||
.Xr gdb 1
|
|
||||||
commands to add symbol files from KLDs in subdirectories of the subdirectory
|
|
||||||
.Pa modules
|
|
||||||
of the current directory, which is intended to be a kernel build directory.
|
|
||||||
This allows
|
|
||||||
.Xr gdb 1
|
|
||||||
to load the symbols into the debugging environment.
|
|
||||||
.Pp
|
|
||||||
An optional
|
|
||||||
.Ar modules-path
|
|
||||||
argument can specify a semicolon-separated list of directory pathnames
|
|
||||||
similar to the
|
|
||||||
.Va kern.module_path
|
|
||||||
sysctl.
|
|
||||||
Each directory in the list will be searched in turn for modules.
|
|
||||||
The default list consists of just one element,
|
|
||||||
.Pa modules ,
|
|
||||||
which is suitable if the current directory is a kernel build directory.
|
|
||||||
.Pp
|
|
||||||
If
|
|
||||||
.Ar outfile
|
|
||||||
is specified,
|
|
||||||
.Nm
|
|
||||||
writes to it instead of
|
|
||||||
.Pa .asf .
|
|
||||||
If
|
|
||||||
.Ar outfile
|
|
||||||
is a single dash
|
|
||||||
.Pq Sq Fl ,
|
|
||||||
standard output is used.
|
|
||||||
.Sh OPTIONS
|
|
||||||
The following options modify the function of
|
|
||||||
.Nm :
|
|
||||||
.Bl -tag -width indent
|
|
||||||
.It Fl a
|
|
||||||
When writing to an explicit
|
|
||||||
.Ar outfile ,
|
|
||||||
append to the file rather than overwriting it.
|
|
||||||
.It Fl f
|
|
||||||
Instead of trying to simplistically guess the path for each module, perform
|
|
||||||
a traversal in the same way that
|
|
||||||
.Xr find 1
|
|
||||||
does to locate an exact path for each module, no matter where in
|
|
||||||
.Ar modules-path
|
|
||||||
it is located.
|
|
||||||
.It Fl K
|
|
||||||
Instead of reading from standard input, use the conventional
|
|
||||||
system interface to get the list of modules currently loaded.
|
|
||||||
.It Fl k
|
|
||||||
Instead of reading from standard input, start a
|
|
||||||
.Xr kldstat 8
|
|
||||||
and read the information from it.
|
|
||||||
.It Fl M
|
|
||||||
Specify the core file for
|
|
||||||
.Xr kvm 3 .
|
|
||||||
Implies
|
|
||||||
.Fl V .
|
|
||||||
.It Fl N
|
|
||||||
Specify the system file for
|
|
||||||
.Xr kvm 3 .
|
|
||||||
Implies
|
|
||||||
.Fl V .
|
|
||||||
.It Fl o
|
|
||||||
Specify the file for
|
|
||||||
.Nm
|
|
||||||
to write or append its output to.
|
|
||||||
If
|
|
||||||
.Ar outfile
|
|
||||||
is a single dash
|
|
||||||
.Pq Sq Fl ,
|
|
||||||
standard output is used.
|
|
||||||
.It Fl s
|
|
||||||
Do not prepend a (guessed) subdirectory of the module path.
|
|
||||||
.It Fl V
|
|
||||||
Instead of reading from standard input, use the
|
|
||||||
.Xr kvm 3
|
|
||||||
interface to get the list of modules.
|
|
||||||
This interface allows for inspecting system crash dumps,
|
|
||||||
as well as the live system.
|
|
||||||
The
|
|
||||||
.Fl M
|
|
||||||
and
|
|
||||||
.Fl N
|
|
||||||
options will be of use if inspecting a crash dump.
|
|
||||||
Elevated privileges, e.g., those of a superuser,
|
|
||||||
may be needed to use this option.
|
|
||||||
.It Fl X
|
|
||||||
Add
|
|
||||||
.Ar suffix
|
|
||||||
to the list of suffixes
|
|
||||||
.Nm
|
|
||||||
tries to append to KLD file names.
|
|
||||||
The default list consists of
|
|
||||||
.Pa .debug ,
|
|
||||||
.Pa .symbols ,
|
|
||||||
and the null suffix.
|
|
||||||
The null suffix always stays at the list tail, after the suffix added.
|
|
||||||
Should it be needed in the middle of the list,
|
|
||||||
a blank suffix can be specified to
|
|
||||||
.Fl X
|
|
||||||
instead.
|
|
||||||
.It Fl x
|
|
||||||
Clear the list of suffixes
|
|
||||||
.Nm
|
|
||||||
tries to append to KLD file names.
|
|
||||||
Only the null suffix is left in the list.
|
|
||||||
.El
|
|
||||||
.Sh EXAMPLES
|
|
||||||
To add symbol files from the system search path specified by the
|
|
||||||
.Va kern.module_path
|
|
||||||
sysctl, the following command can be used:
|
|
||||||
.Pp
|
|
||||||
.Dl asf -s `sysctl -n kern.module_path`
|
|
||||||
.Sh SEE ALSO
|
|
||||||
.Xr gdb 1 ,
|
|
||||||
.Xr kvm 3 ,
|
|
||||||
.Xr kld 4 ,
|
|
||||||
.Xr kldstat 8 ,
|
|
||||||
.Xr sysctl 8
|
|
||||||
.Sh HISTORY
|
|
||||||
The
|
|
||||||
.Nm
|
|
||||||
utility first appeared in
|
|
||||||
.Fx 5.2 .
|
|
||||||
.Sh AUTHORS
|
|
||||||
.An Greg Lehey Aq Mt grog@FreeBSD.org
|
|
||||||
.Sh BUGS
|
|
||||||
Module paths are guessed in a rather naive way by default.
|
|
||||||
It is likely to lag behind the changes to the build tree layout.
|
|
||||||
Using
|
|
||||||
.Fl f
|
|
||||||
is recommended.
|
|
@ -1,429 +0,0 @@
|
|||||||
/*-
|
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
|
||||||
*
|
|
||||||
* Copyright (c) 2002, 2003 Greg Lehey
|
|
||||||
* 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 ``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 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.
|
|
||||||
*/
|
|
||||||
/* $Id: asf.c,v 1.4 2003/05/04 02:55:20 grog Exp grog $ */
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/queue.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <err.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fts.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "asf.h"
|
|
||||||
|
|
||||||
struct kfile {
|
|
||||||
char *name;
|
|
||||||
caddr_t addr;
|
|
||||||
int seen;
|
|
||||||
STAILQ_ENTRY(kfile) link;
|
|
||||||
};
|
|
||||||
|
|
||||||
static STAILQ_HEAD(,kfile) kfile_head = STAILQ_HEAD_INITIALIZER(kfile_head);
|
|
||||||
|
|
||||||
void
|
|
||||||
kfile_add(const char *name, caddr_t addr)
|
|
||||||
{
|
|
||||||
struct kfile *kfp;
|
|
||||||
|
|
||||||
if ((kfp = malloc(sizeof(*kfp))) == NULL ||
|
|
||||||
(kfp->name = strdup(name)) == NULL)
|
|
||||||
errx(2, "out of memory");
|
|
||||||
kfp->addr = addr;
|
|
||||||
kfp->seen = 0;
|
|
||||||
STAILQ_INSERT_TAIL(&kfile_head, kfp, link);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct kfile *
|
|
||||||
kfile_find(const char *name)
|
|
||||||
{
|
|
||||||
struct kfile *kfp;
|
|
||||||
|
|
||||||
STAILQ_FOREACH(kfp, &kfile_head, link)
|
|
||||||
if (strcmp(kfp->name, name) == 0)
|
|
||||||
return (kfp); /* found */
|
|
||||||
|
|
||||||
return (NULL); /* not found */
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
kfile_allseen(void)
|
|
||||||
{
|
|
||||||
struct kfile *kfp;
|
|
||||||
|
|
||||||
STAILQ_FOREACH(kfp, &kfile_head, link)
|
|
||||||
if (!kfp->seen)
|
|
||||||
return (0); /* at least one unseen */
|
|
||||||
|
|
||||||
return (1); /* all seen */
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
kfile_empty(void)
|
|
||||||
{
|
|
||||||
return (STAILQ_EMPTY(&kfile_head));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Take a blank separated list of tokens and turn it into a list of
|
|
||||||
* individual nul-delimited strings. Build a list of pointers at
|
|
||||||
* token, which must have enough space for the tokens. Return the
|
|
||||||
* number of tokens, or -1 on error (typically a missing string
|
|
||||||
* delimiter).
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
tokenize(char *cptr, char *token[], int maxtoken)
|
|
||||||
{
|
|
||||||
char delim; /* delimiter to search for */
|
|
||||||
int tokennr; /* index of this token */
|
|
||||||
|
|
||||||
for (tokennr = 0; tokennr < maxtoken;) {
|
|
||||||
while (isspace(*cptr))
|
|
||||||
cptr++; /* skip initial white space */
|
|
||||||
if ((*cptr == '\0') || (*cptr == '\n')
|
|
||||||
|| (*cptr == '#')) /* end of line */
|
|
||||||
return tokennr; /* return number of tokens found */
|
|
||||||
delim = *cptr;
|
|
||||||
token[tokennr] = cptr; /* point to it */
|
|
||||||
tokennr++; /* one more */
|
|
||||||
if (tokennr == maxtoken) /* run off the end? */
|
|
||||||
return tokennr;
|
|
||||||
if ((delim == '\'') || (delim == '"')) { /* delimitered */
|
|
||||||
for (;;) {
|
|
||||||
cptr++;
|
|
||||||
if ((*cptr == delim)
|
|
||||||
&& (cptr[-1] != '\\')) { /* found the partner */
|
|
||||||
cptr++; /* move on past */
|
|
||||||
if (!isspace(*cptr)) /* no space after closing quote */
|
|
||||||
return -1;
|
|
||||||
*cptr++ = '\0'; /* delimit */
|
|
||||||
} else if ((*cptr == '\0')
|
|
||||||
|| (*cptr == '\n')) /* end of line */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else { /* not quoted */
|
|
||||||
while ((*cptr != '\0') && (!isspace(*cptr)) && (*cptr != '\n'))
|
|
||||||
cptr++;
|
|
||||||
if (*cptr != '\0') /* not end of the line, */
|
|
||||||
*cptr++ = '\0'; /* delimit and move to the next */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return maxtoken; /* can't get here */
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
doobj(const char *path, caddr_t addr, FILE *out)
|
|
||||||
{
|
|
||||||
uintmax_t base = (uintptr_t)addr;
|
|
||||||
uintmax_t textaddr = 0;
|
|
||||||
uintmax_t dataaddr = 0;
|
|
||||||
uintmax_t bssaddr = 0;
|
|
||||||
uintmax_t *up;
|
|
||||||
int octokens;
|
|
||||||
char *octoken[MAXTOKEN];
|
|
||||||
char ocbuf[LINE_MAX + PATH_MAX];
|
|
||||||
FILE *objcopy;
|
|
||||||
|
|
||||||
snprintf(ocbuf, sizeof(ocbuf),
|
|
||||||
"/usr/bin/objdump --section-headers %s", path);
|
|
||||||
if ((objcopy = popen(ocbuf, "r")) == NULL)
|
|
||||||
err(2, "can't start %s", ocbuf);
|
|
||||||
while (fgets(ocbuf, sizeof(ocbuf), objcopy)) {
|
|
||||||
octokens = tokenize(ocbuf, octoken, MAXTOKEN);
|
|
||||||
if (octokens <= 1)
|
|
||||||
continue;
|
|
||||||
up = NULL;
|
|
||||||
if (strcmp(octoken[1], ".text") == 0)
|
|
||||||
up = &textaddr;
|
|
||||||
else if (strcmp(octoken[1], ".data") == 0)
|
|
||||||
up = &dataaddr;
|
|
||||||
else if (strcmp(octoken[1], ".bss") == 0)
|
|
||||||
up = &bssaddr;
|
|
||||||
if (up == NULL)
|
|
||||||
continue;
|
|
||||||
*up = strtoumax(octoken[3], NULL, 16) + base;
|
|
||||||
}
|
|
||||||
if (textaddr) { /* we must have a text address */
|
|
||||||
fprintf(out, "add-symbol-file %s 0x%jx", path, textaddr);
|
|
||||||
if (dataaddr)
|
|
||||||
fprintf(out, " -s .data 0x%jx", dataaddr);
|
|
||||||
if (bssaddr)
|
|
||||||
fprintf(out, " -s .bss 0x%jx", bssaddr);
|
|
||||||
fprintf(out, "\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
findmodules(char *path_argv[], const char *sfx[], FILE *out)
|
|
||||||
{
|
|
||||||
char *p;
|
|
||||||
FTS *fts;
|
|
||||||
FTSENT *ftsent;
|
|
||||||
struct kfile *kfp;
|
|
||||||
int i;
|
|
||||||
int sl;
|
|
||||||
|
|
||||||
/* Have to fts once per suffix to find preferred suffixes first */
|
|
||||||
do {
|
|
||||||
sl = *sfx ? strlen(*sfx) : 0; /* current suffix length */
|
|
||||||
fts = fts_open(path_argv, FTS_PHYSICAL | FTS_NOCHDIR, NULL);
|
|
||||||
if (fts == NULL)
|
|
||||||
err(2, "can't begin traversing module path");
|
|
||||||
while ((ftsent = fts_read(fts)) != NULL) {
|
|
||||||
if (ftsent->fts_info == FTS_DNR ||
|
|
||||||
ftsent->fts_info == FTS_ERR ||
|
|
||||||
ftsent->fts_info == FTS_NS) {
|
|
||||||
errno = ftsent->fts_errno;
|
|
||||||
err(2, "error while traversing path %s", ftsent->fts_path);
|
|
||||||
}
|
|
||||||
if (ftsent->fts_info != FTS_F)
|
|
||||||
continue; /* not a plain file */
|
|
||||||
|
|
||||||
if (sl > 0) {
|
|
||||||
/* non-blank suffix; see if file name has it */
|
|
||||||
i = ftsent->fts_namelen - sl;
|
|
||||||
if (i <= 0 || strcmp(ftsent->fts_name + i, *sfx) != 0)
|
|
||||||
continue; /* no such suffix */
|
|
||||||
if ((p = strdup(ftsent->fts_name)) == NULL)
|
|
||||||
errx(2, "out of memory");
|
|
||||||
p[i] = '\0'; /* remove suffix in the copy */
|
|
||||||
kfp = kfile_find(p);
|
|
||||||
free(p);
|
|
||||||
} else
|
|
||||||
kfp = kfile_find(ftsent->fts_name);
|
|
||||||
|
|
||||||
if (kfp && !kfp->seen) {
|
|
||||||
doobj(ftsent->fts_path, kfp->addr, out);
|
|
||||||
kfp->seen = 1;
|
|
||||||
/* Optimization: stop fts as soon as seen all loaded modules */
|
|
||||||
if (kfile_allseen()) {
|
|
||||||
fts_close(fts);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ftsent == NULL && errno != 0)
|
|
||||||
err(2, "couldn't complete traversing module path");
|
|
||||||
fts_close(fts);
|
|
||||||
} while (*sfx++);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
usage(const char *myname)
|
|
||||||
{
|
|
||||||
fprintf(stderr,
|
|
||||||
"Usage:\n"
|
|
||||||
"%s [-afKksVx] [-M core] [-N system] [-o outfile] [-X suffix]\n"
|
|
||||||
"%*s [modules-path [outfile]]\n\n"
|
|
||||||
"\t-a\tappend to outfile\n"
|
|
||||||
"\t-f\tfind the module in any subdirectory of modules-path\n"
|
|
||||||
"\t-K\tuse kld(2) to get the list of modules\n"
|
|
||||||
"\t-k\ttake input from kldstat(8)\n"
|
|
||||||
"\t-M\tspecify core name for kvm(3)\n"
|
|
||||||
"\t-N\tspecify system name for kvm(3)\n"
|
|
||||||
"\t-o\tuse outfile instead of \".asf\"\n"
|
|
||||||
"\t-s\tdon't prepend subdir for module path\n"
|
|
||||||
"\t-V\tuse kvm(3) to get the list of modules\n"
|
|
||||||
"\t-X\tappend suffix to list of possible module file name suffixes\n"
|
|
||||||
"\t-x\tclear list of possible module file name suffixes\n",
|
|
||||||
myname, (int)strlen(myname), "");
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define MAXPATHS 15
|
|
||||||
#define MAXSUFFIXES 15
|
|
||||||
|
|
||||||
/* KLD file names end in this */
|
|
||||||
static int nsuffixes = 2;
|
|
||||||
static const char *suffixes[MAXSUFFIXES + 1] = {
|
|
||||||
".debug",
|
|
||||||
".symbols",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
char basename[PATH_MAX];
|
|
||||||
char path[PATH_MAX];
|
|
||||||
char *modules_argv[MAXPATHS + 1];
|
|
||||||
char *copy, *p;
|
|
||||||
char **ap;
|
|
||||||
const char *filemode = "w"; /* mode for outfile */
|
|
||||||
const char *modules_path = "modules"; /* path to kernel build directory */
|
|
||||||
const char *outfile = ".asf"; /* and where to write the output */
|
|
||||||
const char *corefile = NULL; /* for kvm(3) */
|
|
||||||
const char *sysfile = NULL; /* for kvm(3) */
|
|
||||||
const char **sfx;
|
|
||||||
struct kfile *kfp;
|
|
||||||
struct stat st;
|
|
||||||
FILE *out; /* output file */
|
|
||||||
int dofind = 0;
|
|
||||||
int dokld = 0;
|
|
||||||
int dokvm = 0;
|
|
||||||
int nosubdir = 0;
|
|
||||||
int runprog = 0;
|
|
||||||
int i;
|
|
||||||
const int sl = strlen(KLDSUFFIX);
|
|
||||||
|
|
||||||
while ((i = getopt(argc, argv, "afKkM:N:o:sVX:x")) != -1)
|
|
||||||
switch (i) {
|
|
||||||
case 'a':
|
|
||||||
filemode = "a"; /* append to outfile */
|
|
||||||
break;
|
|
||||||
case 'f':
|
|
||||||
dofind = 1; /* find .ko (recursively) */
|
|
||||||
break;
|
|
||||||
case 'K':
|
|
||||||
dokld = 1; /* use kld(2) interface */
|
|
||||||
break;
|
|
||||||
case 'k':
|
|
||||||
runprog = 1; /* get input from kldstat(8) */
|
|
||||||
break;
|
|
||||||
case 'M':
|
|
||||||
corefile = optarg; /* core file for kvm(3) */
|
|
||||||
break;
|
|
||||||
case 'N':
|
|
||||||
sysfile = optarg; /* system file (kernel) for kvm(3) */
|
|
||||||
break;
|
|
||||||
case 'o':
|
|
||||||
outfile = optarg; /* output file name */
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
nosubdir = 1; /* don't descend into subdirs */
|
|
||||||
break;
|
|
||||||
case 'V':
|
|
||||||
dokvm = 1; /* use kvm(3) interface */
|
|
||||||
break;
|
|
||||||
case 'X':
|
|
||||||
if (nsuffixes >= MAXSUFFIXES)
|
|
||||||
errx(2, "only %d suffixes can be specified", MAXSUFFIXES);
|
|
||||||
suffixes[nsuffixes++] = optarg;
|
|
||||||
suffixes[nsuffixes] = NULL;
|
|
||||||
break;
|
|
||||||
case 'x':
|
|
||||||
nsuffixes = 0;
|
|
||||||
suffixes[0] = NULL;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
usage(argv[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
argc -= optind;
|
|
||||||
argv += optind;
|
|
||||||
|
|
||||||
if (argc > 0) {
|
|
||||||
modules_path = argv[0];
|
|
||||||
argc--, argv++;
|
|
||||||
}
|
|
||||||
if (argc > 0) {
|
|
||||||
outfile = argv[0];
|
|
||||||
argc--, argv++;
|
|
||||||
}
|
|
||||||
if (argc > 0)
|
|
||||||
usage(argv[0]);
|
|
||||||
|
|
||||||
if (strcmp(outfile, "-") == 0)
|
|
||||||
out = stdout;
|
|
||||||
else
|
|
||||||
if ((out = fopen(outfile, filemode)) == NULL)
|
|
||||||
err(2, "can't open output file %s", outfile);
|
|
||||||
|
|
||||||
if (dokvm || corefile || sysfile) {
|
|
||||||
if (dokld || runprog)
|
|
||||||
warnx("using kvm(3) instead");
|
|
||||||
asf_kvm(sysfile, corefile);
|
|
||||||
} else if (dokld) {
|
|
||||||
if (runprog)
|
|
||||||
warnx("using kld(2) instead");
|
|
||||||
asf_kld();
|
|
||||||
} else
|
|
||||||
asf_prog(runprog);
|
|
||||||
|
|
||||||
/* Avoid long operations like module tree traversal when nothing to do */
|
|
||||||
if (kfile_empty()) {
|
|
||||||
warnx("no kernel modules loaded");
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((copy = strdup(modules_path)) == NULL)
|
|
||||||
errx(2, "out of memory");
|
|
||||||
for (
|
|
||||||
ap = modules_argv, p = copy;
|
|
||||||
(*ap = strsep(&p, ";")) != NULL && ap < &modules_argv[MAXPATHS];
|
|
||||||
ap++
|
|
||||||
);
|
|
||||||
if (*ap)
|
|
||||||
errx(2, "only %d module path elements can be specified", MAXPATHS);
|
|
||||||
|
|
||||||
if (!dofind)
|
|
||||||
STAILQ_FOREACH(kfp, &kfile_head, link) {
|
|
||||||
for (ap = modules_argv; *ap; ap++) {
|
|
||||||
if (!nosubdir) {
|
|
||||||
/* prepare basename of KLD, w/o suffix */
|
|
||||||
strlcpy(basename, kfp->name, sizeof(basename) - 1);
|
|
||||||
i = strlen(basename);
|
|
||||||
if (i > sl && strcmp(basename + i - sl, KLDSUFFIX) == 0)
|
|
||||||
i -= sl;
|
|
||||||
basename[i] = '/';
|
|
||||||
basename[i + 1] = '\0';
|
|
||||||
}
|
|
||||||
for (sfx = suffixes;; sfx++) {
|
|
||||||
snprintf(path, sizeof(path),
|
|
||||||
"%s/%s%s%s",
|
|
||||||
*ap,
|
|
||||||
nosubdir ? "" : basename,
|
|
||||||
kfp->name,
|
|
||||||
*sfx ? *sfx : "");
|
|
||||||
if (stat(path, &st) == 0) {
|
|
||||||
doobj(path, kfp->addr, out);
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
if (*sfx == NULL)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
warnx("module %s not found in search path", kfp->name);
|
|
||||||
found:
|
|
||||||
;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
findmodules(modules_argv, suffixes, out);
|
|
||||||
|
|
||||||
free(copy);
|
|
||||||
return (0);
|
|
||||||
}
|
|
@ -1,42 +0,0 @@
|
|||||||
/*-
|
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
|
||||||
*
|
|
||||||
* Copyright (c) 2006 The FreeBSD Project
|
|
||||||
* 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$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define KERNFILE "kernel"
|
|
||||||
#define KLDSUFFIX ".ko"
|
|
||||||
|
|
||||||
#define MAXTOKEN 10
|
|
||||||
|
|
||||||
int tokenize(char *cptr, char *token[], int maxtoken);
|
|
||||||
|
|
||||||
void kfile_add(const char *name, caddr_t addr);
|
|
||||||
|
|
||||||
void asf_kld(void);
|
|
||||||
void asf_kvm(const char *kernfile, const char *corefile);
|
|
||||||
void asf_prog(int run);
|
|
@ -1,61 +0,0 @@
|
|||||||
/*-
|
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
|
||||||
*
|
|
||||||
* Copyright (c) 2006 The FreeBSD Project
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/linker.h>
|
|
||||||
#include <err.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "asf.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the linker file list using the kld interface.
|
|
||||||
* Works with a live kernel only.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
asf_kld(void)
|
|
||||||
{
|
|
||||||
struct kld_file_stat kfs;
|
|
||||||
int fid = 0; /* indicates the beginning of the linker file list */
|
|
||||||
|
|
||||||
while ((fid = kldnext(fid)) != 0) {
|
|
||||||
if (fid == -1)
|
|
||||||
err(2, "kldnext");
|
|
||||||
kfs.version = sizeof(kfs); /* must be set for kldstat(2) */
|
|
||||||
/* Get info on this linker file */
|
|
||||||
if (kldstat(fid, &kfs) == -1)
|
|
||||||
err(2, "kldstat");
|
|
||||||
if (strcmp(kfs.name, KERNFILE) == 0)
|
|
||||||
continue;
|
|
||||||
/* Add to our list of linker files */
|
|
||||||
kfile_add(kfs.name, kfs.address);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,130 +0,0 @@
|
|||||||
/*-
|
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
|
||||||
*
|
|
||||||
* Copyright (c) 2006 The FreeBSD Project
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/queue.h> /* for <sys/linker.h> with _KERNEL defined */
|
|
||||||
#include <err.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <kvm.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <nlist.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#define _KERNEL
|
|
||||||
#include <sys/linker.h>
|
|
||||||
#undef _KERNEL
|
|
||||||
|
|
||||||
#include "asf.h"
|
|
||||||
|
|
||||||
/* Name of the head of the linker file list in /sys/kern/kern_linker.c */
|
|
||||||
#define LINKER_HEAD "linker_files"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the list of linker files using kvm(3).
|
|
||||||
* Can work with a live kernel as well as with a crash dump.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
asf_kvm(const char *kernfile, const char *corefile)
|
|
||||||
{
|
|
||||||
char errbuf[LINE_MAX];
|
|
||||||
char name[PATH_MAX];
|
|
||||||
kvm_t *kd;
|
|
||||||
struct nlist nl[2];
|
|
||||||
struct linker_file lf;
|
|
||||||
linker_file_list_t linker_files;
|
|
||||||
ssize_t n;
|
|
||||||
void *kp;
|
|
||||||
|
|
||||||
kd = kvm_openfiles(kernfile, corefile, NULL, O_RDONLY, errbuf);
|
|
||||||
if (kd == NULL)
|
|
||||||
errx(2, "open kernel memory: %s", errbuf);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Locate the head of the linker file list using kernel symbols.
|
|
||||||
*/
|
|
||||||
strcpy(name, LINKER_HEAD);
|
|
||||||
nl[0].n_name = name; /* can't use LINKER_HEAD here because it's const */
|
|
||||||
nl[1].n_name = NULL; /* terminate the array for kvm_nlist() */
|
|
||||||
switch (kvm_nlist(kd, nl)) {
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
case -1:
|
|
||||||
warnx("%s: %s", LINKER_HEAD, kvm_geterr(kd));
|
|
||||||
kvm_close(kd);
|
|
||||||
exit(2);
|
|
||||||
default:
|
|
||||||
kvm_close(kd);
|
|
||||||
errx(2, "%s: symbol not found", LINKER_HEAD);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read the head of the linker file list from kernel memory.
|
|
||||||
*/
|
|
||||||
n = kvm_read(kd, nl[0].n_value, &linker_files, sizeof(linker_files));
|
|
||||||
if (n == -1)
|
|
||||||
goto read_err;
|
|
||||||
if (n != sizeof(linker_files)) {
|
|
||||||
kvm_close(kd);
|
|
||||||
errx(2, "%s: short read", LINKER_HEAD);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Traverse the linker file list starting at its head.
|
|
||||||
*/
|
|
||||||
for (kp = linker_files.tqh_first; kp; kp = lf.link.tqe_next) {
|
|
||||||
/* Read a linker file structure */
|
|
||||||
n = kvm_read(kd, (u_long)kp, &lf, sizeof(lf));
|
|
||||||
if (n == -1)
|
|
||||||
goto read_err;
|
|
||||||
if (n != sizeof(lf)) {
|
|
||||||
kvm_close(kd);
|
|
||||||
errx(2, "kvm: short read");
|
|
||||||
}
|
|
||||||
/* Read the name of the file stored separately */
|
|
||||||
bzero(name, sizeof(name));
|
|
||||||
n = kvm_read(kd, (u_long)lf.filename, name, sizeof(name) - 1);
|
|
||||||
if (n == -1)
|
|
||||||
goto read_err;
|
|
||||||
if (strcmp(name, KERNFILE) == 0)
|
|
||||||
continue;
|
|
||||||
/* Add this file to our list of linker files */
|
|
||||||
kfile_add(name, lf.address);
|
|
||||||
}
|
|
||||||
kvm_close(kd);
|
|
||||||
return;
|
|
||||||
|
|
||||||
read_err: /* A common error case */
|
|
||||||
warnx("read kernel memory: %s", kvm_geterr(kd));
|
|
||||||
kvm_close(kd);
|
|
||||||
exit(2);
|
|
||||||
}
|
|
@ -1,75 +0,0 @@
|
|||||||
/*-
|
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
|
||||||
*
|
|
||||||
* Copyright (c) 2002, 2003 Greg Lehey
|
|
||||||
* 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 ``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 be liable for any
|
|
||||||
* direct, indirect, incidental, special, exemplary, or consequential
|
|
||||||
* damages (including, but not limited to, procurement of substitute
|
|
||||||
* goods or services; loss of use, data, or profits; or business
|
|
||||||
* interruption) however caused and on any theory of liability,
|
|
||||||
* whether in contract, strict liability, or tort (including
|
|
||||||
* negligence or otherwise) arising in any way out of the use of this
|
|
||||||
* software, even if advised of the possibility of such damage.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <err.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "asf.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the linker file list from kldstat(8) output.
|
|
||||||
* The "run" flag tells if kldstat(8) should run now.
|
|
||||||
* Of course, kldstat(1) can run in a live system only, but its output
|
|
||||||
* can be saved beforehand and fed to this function later via stdin.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
asf_prog(int run)
|
|
||||||
{
|
|
||||||
char buf[LINE_MAX];
|
|
||||||
char *token[MAXTOKEN];
|
|
||||||
char *endp;
|
|
||||||
FILE *kldstat;
|
|
||||||
caddr_t base;
|
|
||||||
int tokens;
|
|
||||||
|
|
||||||
if (run) {
|
|
||||||
if ((kldstat = popen("kldstat", "r")) == NULL)
|
|
||||||
err(2, "can't start kldstat");
|
|
||||||
} else
|
|
||||||
kldstat = stdin;
|
|
||||||
|
|
||||||
while (fgets(buf, sizeof(buf), kldstat)) {
|
|
||||||
/* Skip header line and main kernel file */
|
|
||||||
if (buf[0] == 'I' || strstr(buf, KERNFILE))
|
|
||||||
continue;
|
|
||||||
tokens = tokenize(buf, token, MAXTOKEN);
|
|
||||||
if (tokens < 4)
|
|
||||||
continue;
|
|
||||||
base = (caddr_t)(uintptr_t)strtoumax(token[2], &endp, 16);
|
|
||||||
if (endp == NULL || *endp != '\0')
|
|
||||||
continue;
|
|
||||||
kfile_add(token[4], base);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user