svn commit: r329183 - in stable/11: . stand stand/arm/uboot stand/common stand/efi/boot1 stand/efi/fdt stand/efi/include stand/efi/libefi stand/efi/loader stand/efi/loader/arch/arm stand/efi/loader...
Kyle Evans
kevans at FreeBSD.org
Mon Feb 12 20:51:30 UTC 2018
Author: kevans
Date: Mon Feb 12 20:51:28 2018
New Revision: 329183
URL: https://svnweb.freebsd.org/changeset/base/329183
Log:
MFC Loader Fixes Final: r327612,r327703,r327704,r327878,r327879,r327881,
r328007,r328029,r328030,r328031,r328061,r328156,r328169,r328288,r328289,
r328290,r328291,r328292,r328411,r328536,r328603,r328614,r328642,r328769,
r328779,r328780,r328781,r328782,r328783,r328806,r328808,r328826,r328835,
r328911,r328986,r328987,r328990,r328999,r329000,r329019,r329050,r329054,
r329060
r327612: Invent new #defines for the biospci_{read,write}_config function
r327703: Define __dmadat after #include'ing ufsread.c.
r327704: Fix printf missing format variables warnings.
r327878: Add GUID for UEFI boot manager variables.
r327879: Report the boot order and where we are in that boot order.
r327881: Allow this file to be included
r328007: Fix booting on some arm64 systems after r327879 by fixing the call
to utf8_to_ucs2
r328029: When returning an error and freeing allocated memory from
ucs2_to_utf8, NULL the return pointer.
r328030: Check the return value from utf8_to_ucs2 instead of whether or not
uv is NULL.
r328031: Need to free uv after we're done using it.
r328061: utf8_to_ucs2() should check for malloc failure
r328156: stand: Move sections around to fix stand/ build with ld.lld on
armv7
r328169: Remove extra copy of bootinfo.c. It's a bit rotted copy of the one
in efi/loader.
r328288: Fix some resource leaks.
r328289: Don't leak memory when displaying help.
r328290: On malloc failure, be sure to close the include file that triggered
it.
r328291: getenv does not return tainted data in the boot loader. Attempt to
clue Coverity into that fact.
r328292: There's no tainted data here, tag it as such to avoid false
positives.
r328411: loader.efi: add missing EFI GUIDs
r328536: loader: support for mixed-endianness ELF/loader and POWER8
r328603: Add missing non-POWERPC case to give the scr value something
non-zero.
r328614: Move libstand.3 to libsa.3. Update libsa.3 to include functions
r328642: Break out the interpreters (simple and forth) w/o ifdefs.
r328769: Centralize several variables.
r328779: Retire pnp.4th and the code needed only for 4th words used here.
r328780: These 4th words were an attempt to allow integration into the boot
loader scripts. However, that path won't be taken after all it
seems.
r328781: Remove pcibios forth support.
r328782: Now that we no longer conditionally compile some files outside of
ficl
r328783: Invent new LDR_INTERP for the loader interpreter to use.
r328806: We need more heap space to properly load newer powerpc kernels.
r328808: Implement strcoll as strcmp.
r328826: Make cross-endian loader changes apply only to powerpc
r328835: Fix regression introduced in r328806, preventing boot on many
platforms.
r328911: Ignore relocation tables for non-memory-resident sections.
r328986: Fix relative location of USB sources after recent move.
r328987: A more definitions to kernel emulation shim in order to build
stand/usb.
r328990: Move the stand/usb test loader into its own directory.
r328999: Fix indentation to FreeBSD standard for interp files
r329000: Move simple interpreter 'perform' into interp.c and call it
r329019: Move to tabs for indentation and to 8-space notches, per style(9).
r329050: Fix build of userboot.so
r329054: Set script.lang in the environment to either 'forth' or 'simple' to
reflect what scripting language was compiled into the loader.
r329060: loader: fix endianness conversion
PR: 225323
Added:
stable/11/stand/common/interp_simple.c
- copied, changed from r328642, head/stand/common/interp_simple.c
stable/11/stand/libsa/libsa.3
- copied, changed from r329182, stable/11/stand/libsa/libstand.3
stable/11/stand/usb/test/
- copied from r328990, head/stand/usb/test/
Deleted:
stable/11/stand/efi/loader/arch/i386/bootinfo.c
stable/11/stand/forth/pcibios.4th
stable/11/stand/forth/pnp.4th
stable/11/stand/libsa/libstand.3
stable/11/stand/usb/Makefile.test
stable/11/stand/usb/bsd_usbloader_test.c
Modified:
stable/11/ObsoleteFiles.inc
stable/11/stand/arm/uboot/Makefile
stable/11/stand/arm/uboot/ldscript.arm
stable/11/stand/common/boot.c
stable/11/stand/common/bootstrap.h
stable/11/stand/common/commands.c
stable/11/stand/common/install.c
stable/11/stand/common/interp.c
stable/11/stand/common/interp_backslash.c
stable/11/stand/common/interp_forth.c
stable/11/stand/common/interp_parse.c
stable/11/stand/common/load_elf.c
stable/11/stand/common/load_elf_obj.c
stable/11/stand/common/misc.c
stable/11/stand/common/pnp.c
stable/11/stand/defs.mk
stable/11/stand/efi/boot1/Makefile
stable/11/stand/efi/boot1/boot1.c
stable/11/stand/efi/fdt/Makefile
stable/11/stand/efi/include/efi.h
stable/11/stand/efi/include/efiapi.h
stable/11/stand/efi/libefi/Makefile
stable/11/stand/efi/libefi/efichar.c
stable/11/stand/efi/libefi/env.c
stable/11/stand/efi/loader/Makefile
stable/11/stand/efi/loader/arch/arm/ldscript.arm
stable/11/stand/efi/loader/main.c
stable/11/stand/fdt/Makefile
stable/11/stand/ficl.mk
stable/11/stand/ficl/Makefile
stable/11/stand/forth/Makefile
stable/11/stand/forth/loader.4th
stable/11/stand/geli/Makefile
stable/11/stand/i386/boot0/Makefile
stable/11/stand/i386/btx/btx/Makefile
stable/11/stand/i386/btx/btxldr/Makefile
stable/11/stand/i386/btx/lib/Makefile
stable/11/stand/i386/cdboot/Makefile
stable/11/stand/i386/kgzldr/Makefile
stable/11/stand/i386/libfirewire/Makefile
stable/11/stand/i386/libfirewire/firewire.c
stable/11/stand/i386/libi386/Makefile
stable/11/stand/i386/libi386/biospci.c
stable/11/stand/i386/libi386/comconsole.c
stable/11/stand/i386/libi386/libi386.h
stable/11/stand/i386/loader/Makefile
stable/11/stand/i386/mbr/Makefile
stable/11/stand/i386/pmbr/Makefile
stable/11/stand/kshim/bsd_kernel.h
stable/11/stand/libsa/Makefile
stable/11/stand/libsa/environment.c
stable/11/stand/libsa/stand.h
stable/11/stand/loader.mk
stable/11/stand/mips/beri/boot2/Makefile
stable/11/stand/mips/beri/boot2/boot2.c
stable/11/stand/mips/beri/loader/Makefile
stable/11/stand/mips/beri/loader/exec.c
stable/11/stand/mips/uboot/Makefile
stable/11/stand/ofw/common/main.c
stable/11/stand/ofw/libofw/Makefile
stable/11/stand/ofw/libofw/elf_freebsd.c
stable/11/stand/ofw/libofw/libofw.h
stable/11/stand/ofw/libofw/ofw_copy.c
stable/11/stand/ofw/libofw/ofw_memory.c
stable/11/stand/ofw/libofw/ppc64_elf_freebsd.c
stable/11/stand/powerpc/boot1.chrp/Makefile
stable/11/stand/powerpc/kboot/Makefile
stable/11/stand/powerpc/kboot/conf.c
stable/11/stand/powerpc/kboot/host_syscall.S
stable/11/stand/powerpc/kboot/host_syscall.h
stable/11/stand/powerpc/kboot/hostdisk.c
stable/11/stand/powerpc/kboot/kerneltramp.S
stable/11/stand/powerpc/kboot/main.c
stable/11/stand/powerpc/kboot/metadata.c
stable/11/stand/powerpc/kboot/ppc64_elf_freebsd.c
stable/11/stand/powerpc/ofw/Makefile
stable/11/stand/powerpc/ofw/ldscript.powerpc
stable/11/stand/powerpc/uboot/Makefile
stable/11/stand/sparc64/boot1/Makefile
stable/11/stand/sparc64/loader/Makefile
stable/11/stand/uboot/fdt/Makefile
stable/11/stand/uboot/lib/Makefile
stable/11/stand/usb/usbcore.mk
stable/11/stand/userboot/test/Makefile
stable/11/stand/userboot/userboot/Makefile
stable/11/stand/zfs/Makefile
stable/11/sys/kern/link_elf_obj.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/ObsoleteFiles.inc
==============================================================================
--- stable/11/ObsoleteFiles.inc Mon Feb 12 19:50:43 2018 (r329182)
+++ stable/11/ObsoleteFiles.inc Mon Feb 12 20:51:28 2018 (r329183)
@@ -38,6 +38,9 @@
# xargs -n1 | sort | uniq -d;
# done
+# 20180212: Obsolete forth files
+OLD_FILES+=boot/efi.4th
+OLD_FILES+=boot/pcibios.4th
# 20180212: Remove libstand
OLD_FILES+=usr/lib/libstand.a
OLD_FILES+=usr/lib/libstand_p.a
Modified: stable/11/stand/arm/uboot/Makefile
==============================================================================
--- stable/11/stand/arm/uboot/Makefile Mon Feb 12 19:50:43 2018 (r329182)
+++ stable/11/stand/arm/uboot/Makefile Mon Feb 12 20:51:28 2018 (r329183)
@@ -41,8 +41,8 @@ LDFLAGS+= -Wl,-znotext
CFLAGS+= -fPIC
-DPADD= ${LIBFICL} ${LIBUBOOT} ${LIBFDT} ${LIBUBOOT_FDT} ${LIBSA}
-LDADD= ${LIBFICL} ${LIBUBOOT} ${LIBFDT} ${LIBUBOOT_FDT} ${LIBSA}
+DPADD= ${LDR_INTERP} ${LIBUBOOT} ${LIBFDT} ${LIBUBOOT_FDT} ${LIBSA}
+LDADD= ${LDR_INTERP} ${LIBUBOOT} ${LIBFDT} ${LIBUBOOT_FDT} ${LIBSA}
OBJS+= ${SRCS:N*.h:R:S/$/.o/g}
Modified: stable/11/stand/arm/uboot/ldscript.arm
==============================================================================
--- stable/11/stand/arm/uboot/ldscript.arm Mon Feb 12 19:50:43 2018 (r329182)
+++ stable/11/stand/arm/uboot/ldscript.arm Mon Feb 12 20:51:28 2018 (r329183)
@@ -32,6 +32,11 @@ SECTIONS
.rela.got : { *(.rela.got) }
.rela.got1 : { *(.rela.got1) }
.rela.got2 : { *(.rela.got2) }
+ .dynamic : { *(.dynamic) }
+ PROVIDE (_GOT_START_ = .);
+ .got : { *(.got) }
+ .got.plt : { *(.got.plt) }
+ PROVIDE (_GOT_END_ = .);
.rela.ctors : { *(.rela.ctors) }
.rela.dtors : { *(.rela.dtors) }
.rela.init : { *(.rela.init) }
@@ -58,7 +63,6 @@ SECTIONS
}
.data1 : { *(.data1) }
.got1 : { *(.got1) }
- .dynamic : { *(.dynamic) }
/* Put .ctors and .dtors next to the .got2 section, so that the pointers
get relocated with -mrelocatable. Also put in the .fixup pointers.
The current compiler no longer needs this, but keep it around for 2.7.2 */
@@ -74,10 +78,6 @@ SECTIONS
.fixup : { *(.fixup) }
PROVIDE (_FIXUP_END_ = .);
PROVIDE (_GOT2_END_ = .);
- PROVIDE (_GOT_START_ = .);
- .got : { *(.got) }
- .got.plt : { *(.got.plt) }
- PROVIDE (_GOT_END_ = .);
/* We want the small data sections together, so single-instruction offsets
can access them all, and initialized data all before uninitialized, so
we can shorten the on-disk segment size. */
Modified: stable/11/stand/common/boot.c
==============================================================================
--- stable/11/stand/common/boot.c Mon Feb 12 19:50:43 2018 (r329182)
+++ stable/11/stand/common/boot.c Mon Feb 12 20:51:28 2018 (r329183)
@@ -52,60 +52,60 @@ COMMAND_SET(boot, "boot", "boot a file or loaded kerne
static int
command_boot(int argc, char *argv[])
{
- struct preloaded_file *fp;
+ struct preloaded_file *fp;
- /*
- * See if the user has specified an explicit kernel to boot.
- */
- if ((argc > 1) && (argv[1][0] != '-')) {
+ /*
+ * See if the user has specified an explicit kernel to boot.
+ */
+ if ((argc > 1) && (argv[1][0] != '-')) {
- /* XXX maybe we should discard everything and start again? */
- if (file_findfile(NULL, NULL) != NULL) {
- snprintf(command_errbuf, sizeof(command_errbuf),
- "can't boot '%s', kernel module already loaded", argv[1]);
- return(CMD_ERROR);
+ /* XXX maybe we should discard everything and start again? */
+ if (file_findfile(NULL, NULL) != NULL) {
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "can't boot '%s', kernel module already loaded", argv[1]);
+ return(CMD_ERROR);
+ }
+
+ /* find/load the kernel module */
+ if (mod_loadkld(argv[1], argc - 2, argv + 2) != 0)
+ return(CMD_ERROR);
+ /* we have consumed all arguments */
+ argc = 1;
}
- /* find/load the kernel module */
- if (mod_loadkld(argv[1], argc - 2, argv + 2) != 0)
- return(CMD_ERROR);
- /* we have consumed all arguments */
- argc = 1;
- }
+ /*
+ * See if there is a kernel module already loaded
+ */
+ if (file_findfile(NULL, NULL) == NULL)
+ if (loadakernel(0, argc - 1, argv + 1))
+ /* we have consumed all arguments */
+ argc = 1;
- /*
- * See if there is a kernel module already loaded
- */
- if (file_findfile(NULL, NULL) == NULL)
- if (loadakernel(0, argc - 1, argv + 1))
- /* we have consumed all arguments */
- argc = 1;
+ /*
+ * Loaded anything yet?
+ */
+ if ((fp = file_findfile(NULL, NULL)) == NULL) {
+ command_errmsg = "no bootable kernel";
+ return(CMD_ERROR);
+ }
- /*
- * Loaded anything yet?
- */
- if ((fp = file_findfile(NULL, NULL)) == NULL) {
- command_errmsg = "no bootable kernel";
- return(CMD_ERROR);
- }
+ /*
+ * If we were given arguments, discard any previous.
+ * XXX should we merge arguments? Hard to DWIM.
+ */
+ if (argc > 1) {
+ if (fp->f_args != NULL)
+ free(fp->f_args);
+ fp->f_args = unargv(argc - 1, argv + 1);
+ }
- /*
- * If we were given arguments, discard any previous.
- * XXX should we merge arguments? Hard to DWIM.
- */
- if (argc > 1) {
- if (fp->f_args != NULL)
- free(fp->f_args);
- fp->f_args = unargv(argc - 1, argv + 1);
- }
+ /* Hook for platform-specific autoloading of modules */
+ if (archsw.arch_autoload() != 0)
+ return(CMD_ERROR);
- /* Hook for platform-specific autoloading of modules */
- if (archsw.arch_autoload() != 0)
+ /* Call the exec handler from the loader matching the kernel */
+ file_formats[fp->f_loader]->l_exec(fp);
return(CMD_ERROR);
-
- /* Call the exec handler from the loader matching the kernel */
- file_formats[fp->f_loader]->l_exec(fp);
- return(CMD_ERROR);
}
@@ -118,29 +118,29 @@ COMMAND_SET(autoboot, "autoboot", "boot automatically
static int
command_autoboot(int argc, char *argv[])
{
- int howlong;
- char *cp, *prompt;
+ int howlong;
+ char *cp, *prompt;
- prompt = NULL;
- howlong = -1;
- switch(argc) {
- case 3:
- prompt = argv[2];
- /* FALLTHROUGH */
- case 2:
- howlong = strtol(argv[1], &cp, 0);
- if (*cp != 0) {
- snprintf(command_errbuf, sizeof(command_errbuf),
- "bad delay '%s'", argv[1]);
- return(CMD_ERROR);
+ prompt = NULL;
+ howlong = -1;
+ switch(argc) {
+ case 3:
+ prompt = argv[2];
+ /* FALLTHROUGH */
+ case 2:
+ howlong = strtol(argv[1], &cp, 0);
+ if (*cp != 0) {
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "bad delay '%s'", argv[1]);
+ return(CMD_ERROR);
+ }
+ /* FALLTHROUGH */
+ case 1:
+ return(autoboot(howlong, prompt));
}
- /* FALLTHROUGH */
- case 1:
- return(autoboot(howlong, prompt));
- }
- command_errmsg = "too many arguments";
- return(CMD_ERROR);
+ command_errmsg = "too many arguments";
+ return(CMD_ERROR);
}
/*
@@ -150,103 +150,103 @@ command_autoboot(int argc, char *argv[])
void
autoboot_maybe()
{
- char *cp;
+ char *cp;
- cp = getenv("autoboot_delay");
- if ((autoboot_tried == 0) && ((cp == NULL) || strcasecmp(cp, "NO")))
- autoboot(-1, NULL); /* try to boot automatically */
+ cp = getenv("autoboot_delay");
+ if ((autoboot_tried == 0) && ((cp == NULL) || strcasecmp(cp, "NO")))
+ autoboot(-1, NULL); /* try to boot automatically */
}
int
autoboot(int timeout, char *prompt)
{
- time_t when, otime, ntime;
- int c, yes;
- char *argv[2], *cp, *ep;
- char *kernelname;
+ time_t when, otime, ntime;
+ int c, yes;
+ char *argv[2], *cp, *ep;
+ char *kernelname;
#ifdef BOOT_PROMPT_123
- const char *seq = "123", *p = seq;
+ const char *seq = "123", *p = seq;
#endif
- autoboot_tried = 1;
+ autoboot_tried = 1;
- if (timeout == -1) {
- timeout = 10;
- /* try to get a delay from the environment */
- if ((cp = getenv("autoboot_delay"))) {
- timeout = strtol(cp, &ep, 0);
- if (cp == ep)
- timeout = 10; /* Unparseable? Set default! */
+ if (timeout == -1) {
+ timeout = 10;
+ /* try to get a delay from the environment */
+ if ((cp = getenv("autoboot_delay"))) {
+ timeout = strtol(cp, &ep, 0);
+ if (cp == ep)
+ timeout = 10; /* Unparseable? Set default! */
+ }
}
- }
- kernelname = getenv("kernelname");
- if (kernelname == NULL) {
- argv[0] = NULL;
- loadakernel(0, 0, argv);
kernelname = getenv("kernelname");
if (kernelname == NULL) {
- command_errmsg = "no valid kernel found";
- return(CMD_ERROR);
+ argv[0] = NULL;
+ loadakernel(0, 0, argv);
+ kernelname = getenv("kernelname");
+ if (kernelname == NULL) {
+ command_errmsg = "no valid kernel found";
+ return(CMD_ERROR);
+ }
}
- }
- if (timeout >= 0) {
- otime = time(NULL);
- when = otime + timeout; /* when to boot */
+ if (timeout >= 0) {
+ otime = time(NULL);
+ when = otime + timeout; /* when to boot */
- yes = 0;
+ yes = 0;
#ifdef BOOT_PROMPT_123
- printf("%s\n", (prompt == NULL) ? "Hit [Enter] to boot immediately, or "
- "1 2 3 sequence for command prompt." : prompt);
+ printf("%s\n", (prompt == NULL) ? "Hit [Enter] to boot immediately, or "
+ "1 2 3 sequence for command prompt." : prompt);
#else
- printf("%s\n", (prompt == NULL) ? "Hit [Enter] to boot immediately, or any other key for command prompt." : prompt);
+ printf("%s\n", (prompt == NULL) ? "Hit [Enter] to boot immediately, or any other key for command prompt." : prompt);
#endif
- for (;;) {
- if (ischar()) {
- c = getchar();
+ for (;;) {
+ if (ischar()) {
+ c = getchar();
#ifdef BOOT_PROMPT_123
- if ((c == '\r') || (c == '\n')) {
- yes = 1;
- break;
- } else if (c != *p++)
- p = seq;
- if (*p == 0)
- break;
+ if ((c == '\r') || (c == '\n')) {
+ yes = 1;
+ break;
+ } else if (c != *p++)
+ p = seq;
+ if (*p == 0)
+ break;
#else
- if ((c == '\r') || (c == '\n'))
- yes = 1;
- break;
+ if ((c == '\r') || (c == '\n'))
+ yes = 1;
+ break;
#endif
- }
- ntime = time(NULL);
- if (ntime >= when) {
- yes = 1;
- break;
- }
+ }
+ ntime = time(NULL);
+ if (ntime >= when) {
+ yes = 1;
+ break;
+ }
- if (ntime != otime) {
- printf("\rBooting [%s] in %d second%s... ",
- kernelname, (int)(when - ntime),
- (when-ntime)==1?"":"s");
- otime = ntime;
- }
- }
- } else {
- yes = 1;
- }
+ if (ntime != otime) {
+ printf("\rBooting [%s] in %d second%s... ",
+ kernelname, (int)(when - ntime),
+ (when-ntime)==1?"":"s");
+ otime = ntime;
+ }
+ }
+ } else {
+ yes = 1;
+ }
- if (yes)
- printf("\rBooting [%s]... ", kernelname);
- putchar('\n');
- if (yes) {
- argv[0] = "boot";
- argv[1] = NULL;
- return(command_boot(1, argv));
- }
- return(CMD_OK);
+ if (yes)
+ printf("\rBooting [%s]... ", kernelname);
+ putchar('\n');
+ if (yes) {
+ argv[0] = "boot";
+ argv[1] = NULL;
+ return(command_boot(1, argv));
+ }
+ return(CMD_OK);
}
/*
@@ -255,43 +255,43 @@ autoboot(int timeout, char *prompt)
static char *
getbootfile(int try)
{
- static char *name = NULL;
- const char *spec, *ep;
- size_t len;
+ static char *name = NULL;
+ const char *spec, *ep;
+ size_t len;
- /* we use dynamic storage */
- if (name != NULL) {
- free(name);
- name = NULL;
- }
+ /* we use dynamic storage */
+ if (name != NULL) {
+ free(name);
+ name = NULL;
+ }
- /*
- * Try $bootfile, then try our builtin default
- */
- if ((spec = getenv("bootfile")) == NULL)
- spec = default_bootfiles;
+ /*
+ * Try $bootfile, then try our builtin default
+ */
+ if ((spec = getenv("bootfile")) == NULL)
+ spec = default_bootfiles;
- while ((try > 0) && (spec != NULL)) {
- spec = strchr(spec, ';');
- if (spec)
- spec++; /* skip over the leading ';' */
- try--;
- }
- if (spec != NULL) {
- if ((ep = strchr(spec, ';')) != NULL) {
- len = ep - spec;
- } else {
- len = strlen(spec);
+ while ((try > 0) && (spec != NULL)) {
+ spec = strchr(spec, ';');
+ if (spec)
+ spec++; /* skip over the leading ';' */
+ try--;
}
- name = malloc(len + 1);
- strncpy(name, spec, len);
- name[len] = 0;
- }
- if (name && name[0] == 0) {
- free(name);
- name = NULL;
- }
- return(name);
+ if (spec != NULL) {
+ if ((ep = strchr(spec, ';')) != NULL) {
+ len = ep - spec;
+ } else {
+ len = strlen(spec);
+ }
+ name = malloc(len + 1);
+ strncpy(name, spec, len);
+ name[len] = 0;
+ }
+ if (name && name[0] == 0) {
+ free(name);
+ name = NULL;
+ }
+ return(name);
}
/*
@@ -307,104 +307,109 @@ getbootfile(int try)
int
getrootmount(char *rootdev)
{
- char lbuf[128], *cp, *ep, *dev, *fstyp, *options;
- int fd, error;
+ char lbuf[128], *cp, *ep, *dev, *fstyp, *options;
+ int fd, error;
- if (getenv("vfs.root.mountfrom") != NULL)
- return(0);
+ if (getenv("vfs.root.mountfrom") != NULL)
+ return(0);
- error = 1;
- sprintf(lbuf, "%s/etc/fstab", rootdev);
- if ((fd = open(lbuf, O_RDONLY)) < 0)
- goto notfound;
+ error = 1;
+ sprintf(lbuf, "%s/etc/fstab", rootdev);
+ if ((fd = open(lbuf, O_RDONLY)) < 0)
+ goto notfound;
- /* loop reading lines from /etc/fstab What was that about sscanf again? */
- while (fgetstr(lbuf, sizeof(lbuf), fd) >= 0) {
- if ((lbuf[0] == 0) || (lbuf[0] == '#'))
- continue;
+ /* loop reading lines from /etc/fstab What was that about sscanf again? */
+ fstyp = NULL;
+ dev = NULL;
+ while (fgetstr(lbuf, sizeof(lbuf), fd) >= 0) {
+ if ((lbuf[0] == 0) || (lbuf[0] == '#'))
+ continue;
- /* skip device name */
- for (cp = lbuf; (*cp != 0) && !isspace(*cp); cp++)
- ;
- if (*cp == 0) /* misformatted */
- continue;
- /* delimit and save */
- *cp++ = 0;
- dev = strdup(lbuf);
+ /* skip device name */
+ for (cp = lbuf; (*cp != 0) && !isspace(*cp); cp++)
+ ;
+ if (*cp == 0) /* misformatted */
+ continue;
+ /* delimit and save */
+ *cp++ = 0;
+ free(dev);
+ dev = strdup(lbuf);
- /* skip whitespace up to mountpoint */
- while ((*cp != 0) && isspace(*cp))
- cp++;
- /* must have /<space> to be root */
- if ((*cp == 0) || (*cp != '/') || !isspace(*(cp + 1)))
- continue;
- /* skip whitespace up to fstype */
- cp += 2;
- while ((*cp != 0) && isspace(*cp))
- cp++;
- if (*cp == 0) /* misformatted */
- continue;
- /* skip text to end of fstype and delimit */
- ep = cp;
- while ((*cp != 0) && !isspace(*cp))
- cp++;
- *cp = 0;
- fstyp = strdup(ep);
+ /* skip whitespace up to mountpoint */
+ while ((*cp != 0) && isspace(*cp))
+ cp++;
+ /* must have /<space> to be root */
+ if ((*cp == 0) || (*cp != '/') || !isspace(*(cp + 1)))
+ continue;
+ /* skip whitespace up to fstype */
+ cp += 2;
+ while ((*cp != 0) && isspace(*cp))
+ cp++;
+ if (*cp == 0) /* misformatted */
+ continue;
+ /* skip text to end of fstype and delimit */
+ ep = cp;
+ while ((*cp != 0) && !isspace(*cp))
+ cp++;
+ *cp = 0;
+ free(fstyp);
+ fstyp = strdup(ep);
- /* skip whitespace up to mount options */
- cp += 1;
- while ((*cp != 0) && isspace(*cp))
- cp++;
- if (*cp == 0) /* misformatted */
- continue;
- /* skip text to end of mount options and delimit */
- ep = cp;
- while ((*cp != 0) && !isspace(*cp))
- cp++;
- *cp = 0;
- options = strdup(ep);
- /* Build the <fstype>:<device> and save it in vfs.root.mountfrom */
- sprintf(lbuf, "%s:%s", fstyp, dev);
+ /* skip whitespace up to mount options */
+ cp += 1;
+ while ((*cp != 0) && isspace(*cp))
+ cp++;
+ if (*cp == 0) /* misformatted */
+ continue;
+ /* skip text to end of mount options and delimit */
+ ep = cp;
+ while ((*cp != 0) && !isspace(*cp))
+ cp++;
+ *cp = 0;
+ options = strdup(ep);
+ /* Build the <fstype>:<device> and save it in vfs.root.mountfrom */
+ sprintf(lbuf, "%s:%s", fstyp, dev);
+ setenv("vfs.root.mountfrom", lbuf, 0);
+
+ /* Don't override vfs.root.mountfrom.options if it is already set */
+ if (getenv("vfs.root.mountfrom.options") == NULL) {
+ /* save mount options */
+ setenv("vfs.root.mountfrom.options", options, 0);
+ }
+ free(options);
+ error = 0;
+ break;
+ }
+ close(fd);
free(dev);
free(fstyp);
- setenv("vfs.root.mountfrom", lbuf, 0);
- /* Don't override vfs.root.mountfrom.options if it is already set */
- if (getenv("vfs.root.mountfrom.options") == NULL) {
- /* save mount options */
- setenv("vfs.root.mountfrom.options", options, 0);
- }
- free(options);
- error = 0;
- break;
- }
- close(fd);
-
notfound:
- if (error) {
- const char *currdev;
+ if (error) {
+ const char *currdev;
- currdev = getenv("currdev");
- if (currdev != NULL && strncmp("zfs:", currdev, 4) == 0) {
- cp = strdup(currdev);
- cp[strlen(cp) - 1] = '\0';
- setenv("vfs.root.mountfrom", cp, 0);
- error = 0;
+ currdev = getenv("currdev");
+ if (currdev != NULL && strncmp("zfs:", currdev, 4) == 0) {
+ cp = strdup(currdev);
+ cp[strlen(cp) - 1] = '\0';
+ setenv("vfs.root.mountfrom", cp, 0);
+ error = 0;
+ free(cp);
+ }
}
- }
- return(error);
+ return(error);
}
static int
loadakernel(int try, int argc, char* argv[])
{
- char *cp;
+ char *cp;
for (try = 0; (cp = getbootfile(try)) != NULL; try++)
- if (mod_loadkld(cp, argc - 1, argv + 1) != 0)
- printf("can't load '%s'\n", cp);
- else
- return 1;
+ if (mod_loadkld(cp, argc - 1, argv + 1) != 0)
+ printf("can't load '%s'\n", cp);
+ else
+ return 1;
return 0;
}
Modified: stable/11/stand/common/bootstrap.h
==============================================================================
--- stable/11/stand/common/bootstrap.h Mon Feb 12 19:50:43 2018 (r329182)
+++ stable/11/stand/common/bootstrap.h Mon Feb 12 20:51:28 2018 (r329183)
@@ -46,18 +46,20 @@ extern char command_errbuf[COMMAND_ERRBUFSZ];
/* interp.c */
void interact(void);
-int include(const char *filename);
+void interp_emit_prompt(void);
+int interp_builtin_cmd(int argc, char *argv[]);
+/* Called by interp.c for interp_*.c embedded interpreters */
+int interp_include(const char *filename); /* Execute commands from filename */
+void interp_init(void); /* Initialize interpreater */
+int interp_run(const char *line); /* Run a single command */
+
/* interp_backslash.c */
char *backslash(const char *str);
/* interp_parse.c */
int parse(int *argc, char ***argv, const char *str);
-/* interp_forth.c */
-void bf_init(void);
-int bf_run(char *line);
-
/* boot.c */
int autoboot(int timeout, char *prompt);
void autoboot_maybe(void);
@@ -315,6 +317,9 @@ struct arch_switch
/* Probe ZFS pool(s), if needed. */
void (*arch_zfs_probe)(void);
+
+ /* For kexec-type loaders, get ksegment structure */
+ void (*arch_kexec_kseg_get)(int *nseg, void **kseg);
};
extern struct arch_switch archsw;
Modified: stable/11/stand/common/commands.c
==============================================================================
--- stable/11/stand/common/commands.c Mon Feb 12 19:50:43 2018 (r329182)
+++ stable/11/stand/common/commands.c Mon Feb 12 20:51:28 2018 (r329183)
@@ -91,10 +91,8 @@ help_getnext(int fd, char **topic, char **subtopic, ch
cp = ep;
}
if (*topic == NULL) {
- if (*subtopic != NULL)
- free(*subtopic);
- if (*desc != NULL)
- free(*desc);
+ free(*subtopic);
+ free(*desc);
continue;
}
return(1);
@@ -169,7 +167,7 @@ command_help(int argc, char *argv[])
} else if (strcmp(topic, t)) {
/* topic mismatch */
- if(matched) /* nothing more on this topic, stop scanning */
+ if (matched) /* nothing more on this topic, stop scanning */
break;
} else {
@@ -178,7 +176,7 @@ command_help(int argc, char *argv[])
if (((subtopic == NULL) && (s == NULL)) ||
((subtopic != NULL) && (s != NULL) && !strcmp(subtopic, s))) {
/* exact match, print text */
- while((fgetstr(buf, 80, hfd) >= 0) && (buf[0] != '#')) {
+ while ((fgetstr(buf, 80, hfd) >= 0) && (buf[0] != '#')) {
if (pager_output(buf))
break;
if (pager_output("\n"))
@@ -193,23 +191,24 @@ command_help(int argc, char *argv[])
free(t);
free(s);
free(d);
+ t = s = d = NULL;
}
+ free(t);
+ free(s);
+ free(d);
pager_close();
close(hfd);
if (!matched) {
snprintf(command_errbuf, sizeof(command_errbuf),
"no help available for '%s'", topic);
free(topic);
- if (subtopic)
- free(subtopic);
+ free(subtopic);
return(CMD_ERROR);
}
free(topic);
- if (subtopic)
- free(subtopic);
+ free(subtopic);
return(CMD_OK);
}
-
COMMAND_SET(commandlist, "?", "list commands", command_commandlist);
Modified: stable/11/stand/common/install.c
==============================================================================
--- stable/11/stand/common/install.c Mon Feb 12 19:50:43 2018 (r329182)
+++ stable/11/stand/common/install.c Mon Feb 12 20:51:28 2018 (r329183)
@@ -286,7 +286,7 @@ install(char *pkgname)
fd = open(s, O_RDONLY);
if (fd != -1) {
close(fd);
- error = include(s);
+ error = inter_include(s);
if (error == CMD_ERROR)
goto fail;
}
Modified: stable/11/stand/common/interp.c
==============================================================================
--- stable/11/stand/common/interp.c Mon Feb 12 19:50:43 2018 (r329182)
+++ stable/11/stand/common/interp.c Mon Feb 12 20:51:28 2018 (r329183)
@@ -37,102 +37,40 @@ __FBSDID("$FreeBSD$");
#include <string.h>
#include "bootstrap.h"
-#ifdef BOOT_FORTH
-#include "ficl.h"
-extern FICL_VM *bf_vm;
-#endif
-
#define MAXARGS 20 /* maximum number of arguments allowed */
-static void prompt(void);
-
-#ifndef BOOT_FORTH
/*
- * Perform the command
- */
-static int
-perform(int argc, char *argv[])
-{
- int result;
- struct bootblk_command **cmdp;
- bootblk_cmd_t *cmd;
-
- if (argc < 1)
- return(CMD_OK);
-
- /* set return defaults; a successful command will override these */
- command_errmsg = command_errbuf;
- strcpy(command_errbuf, "no error message");
- cmd = NULL;
- result = CMD_ERROR;
-
- /* search the command set for the command */
- SET_FOREACH(cmdp, Xcommand_set) {
- if (((*cmdp)->c_name != NULL) && !strcmp(argv[0], (*cmdp)->c_name))
- cmd = (*cmdp)->c_fn;
- }
- if (cmd != NULL) {
- result = (cmd)(argc, argv);
- } else {
- command_errmsg = "unknown command";
- }
- return(result);
-}
-#endif /* ! BOOT_FORTH */
-
-/*
* Interactive mode
*/
void
interact(void)
{
- static char input[256]; /* big enough? */
-#ifndef BOOT_FORTH
- int argc;
- char **argv;
-#endif
+ static char input[256]; /* big enough? */
-#ifdef BOOT_FORTH
- bf_init();
-#endif
+ interp_init();
- /* Read our default configuration. */
- include("/boot/loader.rc");
+ printf("\n");
- printf("\n");
+ /*
+ * Before interacting, we might want to autoboot.
+ */
+ autoboot_maybe();
- /*
- * Before interacting, we might want to autoboot.
- */
- autoboot_maybe();
-
- /*
- * Not autobooting, go manual
- */
- printf("\nType '?' for a list of commands, 'help' for more detailed help.\n");
- if (getenv("prompt") == NULL)
- setenv("prompt", "${interpret}", 1);
- if (getenv("interpret") == NULL)
- setenv("interpret", "OK", 1);
-
+ /*
+ * Not autobooting, go manual
+ */
+ printf("\nType '?' for a list of commands, 'help' for more detailed help.\n");
+ if (getenv("prompt") == NULL)
+ setenv("prompt", "${interpret}", 1);
+ if (getenv("interpret") == NULL)
+ setenv("interpret", "OK", 1);
- for (;;) {
- input[0] = '\0';
- prompt();
- ngets(input, sizeof(input));
-#ifdef BOOT_FORTH
- bf_vm->sourceID.i = 0;
- bf_run(input);
-#else
- if (!parse(&argc, &argv, input)) {
- if (perform(argc, argv))
- printf("%s: %s\n", argv[0], command_errmsg);
- free(argv);
- } else {
- printf("parse error\n");
+ for (;;) {
+ input[0] = '\0';
+ interp_emit_prompt();
+ ngets(input, sizeof(input));
+ interp_run(input);
}
-#endif
- }
}
/*
@@ -149,214 +87,87 @@ COMMAND_SET(include, "include", "read commands from a
static int
command_include(int argc, char *argv[])
{
- int i;
- int res;
- char **argvbuf;
+ int i;
+ int res;
+ char **argvbuf;
- /*
- * Since argv is static, we need to save it here.
- */
- argvbuf = (char**) calloc((u_int)argc, sizeof(char*));
- for (i = 0; i < argc; i++)
- argvbuf[i] = strdup(argv[i]);
+ /*
+ * Since argv is static, we need to save it here.
+ */
+ argvbuf = (char**) calloc((u_int)argc, sizeof(char*));
+ for (i = 0; i < argc; i++)
+ argvbuf[i] = strdup(argv[i]);
- res=CMD_OK;
- for (i = 1; (i < argc) && (res == CMD_OK); i++)
- res = include(argvbuf[i]);
+ res=CMD_OK;
+ for (i = 1; (i < argc) && (res == CMD_OK); i++)
+ res = interp_include(argvbuf[i]);
- for (i = 0; i < argc; i++)
- free(argvbuf[i]);
- free(argvbuf);
+ for (i = 0; i < argc; i++)
+ free(argvbuf[i]);
+ free(argvbuf);
- return(res);
+ return(res);
}
/*
- * Header prepended to each line. The text immediately follows the header.
- * We try to make this short in order to save memory -- the loader has
- * limited memory available, and some of the forth files are very long.
+ * Emit the current prompt; use the same syntax as the parser
+ * for embedding environment variables. Does not accept input.
*/
-struct includeline
+void
+interp_emit_prompt(void)
{
- struct includeline *next;
-#ifndef BOOT_FORTH
- int flags;
- int line;
-#define SL_QUIET (1<<0)
-#define SL_IGNOREERR (1<<1)
-#endif
- char text[0];
-};
+ char *pr, *p, *cp, *ev;
-int
-include(const char *filename)
-{
- struct includeline *script, *se, *sp;
- char input[256]; /* big enough? */
-#ifdef BOOT_FORTH
- int res;
- char *cp;
- int prevsrcid, fd, line;
-#else
- int argc,res;
- char **argv, *cp;
- int fd, flags, line;
-#endif
+ if ((cp = getenv("prompt")) == NULL)
+ cp = ">";
+ pr = p = strdup(cp);
- if (((fd = open(filename, O_RDONLY)) == -1)) {
- snprintf(command_errbuf, sizeof(command_errbuf),
- "can't open '%s': %s", filename, strerror(errno));
- return(CMD_ERROR);
- }
+ while (*p != 0) {
+ if ((*p == '$') && (*(p+1) == '{')) {
+ for (cp = p + 2; (*cp != 0) && (*cp != '}'); cp++)
+ ;
+ *cp = 0;
+ ev = getenv(p + 2);
- /*
- * Read the script into memory.
- */
- script = se = NULL;
- line = 0;
-
- while (fgetstr(input, sizeof(input), fd) >= 0) {
- line++;
-#ifdef BOOT_FORTH
- cp = input;
-#else
- flags = 0;
- /* Discard comments */
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-stable
mailing list