svn commit: r329010 - in stable/11/sys/boot: common efi/boot1 efi/libefi efi/loader efi/loader/arch/amd64 fdt forth i386 i386/boot0 i386/boot2 i386/btx/btx i386/btx/btxldr i386/cdboot i386/gptboot ...
Kyle Evans
kevans at FreeBSD.org
Thu Feb 8 02:44:25 UTC 2018
Author: kevans
Date: Thu Feb 8 02:44:21 2018
New Revision: 329010
URL: https://svnweb.freebsd.org/changeset/base/329010
Log:
MFC r303555,r303556,r303936,r303962,r304317,r304532,r305026,r305107,r305132,
r305178,r305353,r305814,r306159,r306380,r306504: Loader fixes, 2016q3
r303555: bcache should support reads shorter than sector size
r303556: Improve boot loader quote parsing
r303936: Add kernel environment variables under smbios.system
r303962: Add the missing space between .asciz directive and opening quote
for some lines with #ifdef BTXLDR_VERBOSE/#endif
r304317: boot1.efi Free() should check for NULL to provide consistent
behavior
r304532: Replace sprintf -> snprintf for command_errbuf provisioned from
dynamic content.
r305026: Emulate efi_cons_poll when WaitForKey is not available
r305107: Create a hook 'post-initialize' for people that want to define
something to read in .conf files after all other .conf files for the purpose
of overriding.
r305132: Remove accidentally committed stray comment.
r305178: bd_int13probe() should check extended info if sector info is bad
r305353: Don't use -N to set the OMAGIC with data and text writeable and
data not page aligned.
r305814: ufsread: Do not cast struct direct from void *
r306159: Consistently declare getsecs(void) with proper return type and void
when no arguments are present.
r306380: loader command interpreter should reset command_errmsg
r306504: Fix a cluster of bugs in list EFI environment variables
PR: 204602, 211958, 211958
Relnotes: yes ("Improve boot loader quote parsing")
Added:
stable/11/sys/boot/i386/boot.ldscript
- copied unchanged from r305353, head/sys/boot/i386/boot.ldscript
Modified:
stable/11/sys/boot/common/bcache.c
stable/11/sys/boot/common/boot.c
stable/11/sys/boot/common/bootstrap.h
stable/11/sys/boot/common/commands.c
stable/11/sys/boot/common/interp.c
stable/11/sys/boot/common/interp_forth.c
stable/11/sys/boot/common/interp_parse.c
stable/11/sys/boot/common/ls.c
stable/11/sys/boot/common/module.c
stable/11/sys/boot/common/ufsread.c
stable/11/sys/boot/efi/boot1/boot1.c
stable/11/sys/boot/efi/libefi/efi_console.c
stable/11/sys/boot/efi/libefi/time.c
stable/11/sys/boot/efi/libefi/time_event.c
stable/11/sys/boot/efi/loader/arch/amd64/framebuffer.c
stable/11/sys/boot/efi/loader/main.c
stable/11/sys/boot/fdt/fdt_loader_cmd.c
stable/11/sys/boot/forth/loader.4th
stable/11/sys/boot/i386/Makefile.inc
stable/11/sys/boot/i386/boot0/Makefile
stable/11/sys/boot/i386/boot2/Makefile
stable/11/sys/boot/i386/btx/btx/Makefile
stable/11/sys/boot/i386/btx/btxldr/Makefile
stable/11/sys/boot/i386/btx/btxldr/btxldr.S
stable/11/sys/boot/i386/cdboot/Makefile
stable/11/sys/boot/i386/gptboot/Makefile
stable/11/sys/boot/i386/gptzfsboot/Makefile
stable/11/sys/boot/i386/libi386/biosdisk.c
stable/11/sys/boot/i386/libi386/pxe.c
stable/11/sys/boot/i386/libi386/smbios.c
stable/11/sys/boot/i386/mbr/Makefile
stable/11/sys/boot/i386/pmbr/Makefile
stable/11/sys/boot/i386/pxeldr/Makefile
stable/11/sys/boot/i386/zfsboot/Makefile
stable/11/sys/boot/ofw/libofw/ofw_time.c
stable/11/sys/boot/pc98/Makefile.inc
stable/11/sys/boot/pc98/boot0/Makefile
stable/11/sys/boot/pc98/boot2/Makefile
stable/11/sys/boot/pc98/btx/btx/Makefile
stable/11/sys/boot/pc98/btx/btxldr/Makefile
stable/11/sys/boot/pc98/cdboot/Makefile
stable/11/sys/boot/powerpc/kboot/main.c
stable/11/sys/boot/powerpc/ps3/main.c
stable/11/sys/boot/uboot/lib/time.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/boot/common/bcache.c
==============================================================================
--- stable/11/sys/boot/common/bcache.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/common/bcache.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -302,7 +302,9 @@ read_strategy(void *devdata, int rw, daddr_t blk, size
break;
}
- size = i * bcache_blksize;
+ if (size > i * bcache_blksize)
+ size = i * bcache_blksize;
+
if (size != 0) {
bcopy(bc->bcache_data + (bcache_blksize * BHASH(bc, blk)), buf, size);
result = 0;
Modified: stable/11/sys/boot/common/boot.c
==============================================================================
--- stable/11/sys/boot/common/boot.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/common/boot.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -61,7 +61,8 @@ command_boot(int argc, char *argv[])
/* XXX maybe we should discard everything and start again? */
if (file_findfile(NULL, NULL) != NULL) {
- sprintf(command_errbuf, "can't boot '%s', kernel module already loaded", argv[1]);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "can't boot '%s', kernel module already loaded", argv[1]);
return(CMD_ERROR);
}
@@ -129,7 +130,8 @@ command_autoboot(int argc, char *argv[])
case 2:
howlong = strtol(argv[1], &cp, 0);
if (*cp != 0) {
- sprintf(command_errbuf, "bad delay '%s'", argv[1]);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "bad delay '%s'", argv[1]);
return(CMD_ERROR);
}
/* FALLTHROUGH */
Modified: stable/11/sys/boot/common/bootstrap.h
==============================================================================
--- stable/11/sys/boot/common/bootstrap.h Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/common/bootstrap.h Thu Feb 8 02:44:21 2018 (r329010)
@@ -35,8 +35,9 @@
/* Commands and return values; nonzero return sets command_errmsg != NULL */
typedef int (bootblk_cmd_t)(int argc, char *argv[]);
+#define COMMAND_ERRBUFSZ (256)
extern char *command_errmsg;
-extern char command_errbuf[]; /* XXX blah, length */
+extern char command_errbuf[COMMAND_ERRBUFSZ];
#define CMD_OK 0
#define CMD_WARN 1
#define CMD_ERROR 2
Modified: stable/11/sys/boot/common/commands.c
==============================================================================
--- stable/11/sys/boot/common/commands.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/common/commands.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -33,7 +33,8 @@ __FBSDID("$FreeBSD$");
#include "bootstrap.h"
char *command_errmsg;
-char command_errbuf[256]; /* XXX should have procedural interface for setting, size limit? */
+/* XXX should have procedural interface for setting, size limit? */
+char command_errbuf[COMMAND_ERRBUFSZ];
static int page_file(char *filename);
@@ -196,7 +197,8 @@ command_help(int argc, char *argv[])
pager_close();
close(hfd);
if (!matched) {
- sprintf(command_errbuf, "no help available for '%s'", topic);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "no help available for '%s'", topic);
free(topic);
if (subtopic)
free(subtopic);
@@ -276,7 +278,8 @@ command_show(int argc, char *argv[])
if ((cp = getenv(argv[1])) != NULL) {
printf("%s\n", cp);
} else {
- sprintf(command_errbuf, "variable '%s' not found", argv[1]);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "variable '%s' not found", argv[1]);
return(CMD_ERROR);
}
}
@@ -386,7 +389,8 @@ command_read(int argc, char *argv[])
case 't':
timeout = strtol(optarg, &cp, 0);
if (cp == optarg) {
- sprintf(command_errbuf, "bad timeout '%s'", optarg);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "bad timeout '%s'", optarg);
return(CMD_ERROR);
}
break;
@@ -454,8 +458,10 @@ page_file(char *filename)
result = pager_file(filename);
- if (result == -1)
- sprintf(command_errbuf, "error showing %s", filename);
+ if (result == -1) {
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "error showing %s", filename);
+ }
return result;
}
Modified: stable/11/sys/boot/common/interp.c
==============================================================================
--- stable/11/sys/boot/common/interp.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/common/interp.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -214,7 +214,8 @@ include(const char *filename)
#endif
if (((fd = open(filename, O_RDONLY)) == -1)) {
- sprintf(command_errbuf,"can't open '%s': %s", filename, strerror(errno));
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "can't open '%s': %s", filename, strerror(errno));
return(CMD_ERROR);
}
@@ -256,8 +257,9 @@ include(const char *filename)
script = script->next;
free(se);
}
- sprintf(command_errbuf, "file '%s' line %d: memory allocation "
- "failure - aborting", filename, line);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "file '%s' line %d: memory allocation failure - aborting",
+ filename, line);
return (CMD_ERROR);
}
strcpy(sp->text, cp);
@@ -291,7 +293,9 @@ include(const char *filename)
#ifdef BOOT_FORTH
res = bf_run(sp->text);
if (res != VM_OUTOFTEXT) {
- sprintf(command_errbuf, "Error while including %s, in the line:\n%s", filename, sp->text);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "Error while including %s, in the line:\n%s",
+ filename, sp->text);
res = CMD_ERROR;
break;
} else
Modified: stable/11/sys/boot/common/interp_forth.c
==============================================================================
--- stable/11/sys/boot/common/interp_forth.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/common/interp_forth.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -324,13 +324,15 @@ bf_run(char *line)
printf("Parse error!\n");
break;
default:
- /* Hopefully, all other codes filled this buffer */
- printf("%s\n", command_errmsg);
+ if (command_errmsg != NULL) {
+ printf("%s\n", command_errmsg);
+ command_errmsg = NULL;
+ }
}
if (result == VM_USEREXIT)
panic("interpreter exit");
setenv("interpret", bf_vm->state ? "" : "OK", 1);
- return result;
+ return (result);
}
Modified: stable/11/sys/boot/common/interp_parse.c
==============================================================================
--- stable/11/sys/boot/common/interp_parse.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/common/interp_parse.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -72,20 +72,26 @@ isdelim(int ch)
static int
isquote(int ch)
{
- return (ch == '\'' || ch == '"');
+ return (ch == '\'');
}
+static int
+isdquote(int ch)
+{
+ return (ch == '"');
+}
+
int
parse(int *argc, char ***argv, char *str)
{
int ac;
char *val, *p, *q, *copy = NULL;
size_t i = 0;
- char token, tmp, quote, *buf;
+ char token, tmp, quote, dquote, *buf;
enum { STR, VAR, WHITE } state;
ac = *argc = 0;
- quote = 0;
+ dquote = quote = 0;
if (!str || (p = copy = backslash(str)) == NULL)
return 1;
@@ -105,9 +111,19 @@ parse(int *argc, char ***argv, char *str)
buf[i++] = *p++;
} else if (isquote(*p)) {
quote = quote ? 0 : *p;
- ++p;
- }
- else if (isspace(*p) && !quote) {
+ if (dquote) { /* keep quote */
+ PARSE_FAIL(i == (PARSE_BUFSIZE - 1));
+ buf[i++] = *p++;
+ } else
+ ++p;
+ } else if (isdquote(*p)) {
+ dquote = dquote ? 0 : *p;
+ if (quote) { /* keep dquote */
+ PARSE_FAIL(i == (PARSE_BUFSIZE - 1));
+ buf[i++] = *p++;
+ } else
+ ++p;
+ } else if (isspace(*p) && !quote && !dquote) {
state = WHITE;
if (i) {
buf[i] = '\0';
@@ -115,7 +131,7 @@ parse(int *argc, char ***argv, char *str)
i = 0;
}
++p;
- } else if (*p == '$') {
+ } else if (*p == '$' && !quote) {
token = isdelim(*(p + 1));
if (token)
p += 2;
@@ -157,6 +173,8 @@ parse(int *argc, char ***argv, char *str)
break;
}
}
+ /* missing terminating ' or " */
+ PARSE_FAIL(quote || dquote);
/* If at end of token, add it */
if (i && state == STR) {
buf[i] = '\0';
Modified: stable/11/sys/boot/common/ls.c
==============================================================================
--- stable/11/sys/boot/common/ls.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/common/ls.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -149,7 +149,8 @@ ls_getdir(char **pathp)
/* Make sure the path is respectable to begin with */
if (archsw.arch_getdev(NULL, path, &cp)) {
- sprintf(command_errbuf, "bad path '%s'", path);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "bad path '%s'", path);
goto out;
}
@@ -159,15 +160,18 @@ ls_getdir(char **pathp)
fd = open(path, O_RDONLY);
if (fd < 0) {
- sprintf(command_errbuf, "open '%s' failed: %s", path, strerror(errno));
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "open '%s' failed: %s", path, strerror(errno));
goto out;
}
if (fstat(fd, &sb) < 0) {
- sprintf(command_errbuf, "stat failed: %s", strerror(errno));
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "stat failed: %s", strerror(errno));
goto out;
}
if (!S_ISDIR(sb.st_mode)) {
- sprintf(command_errbuf, "%s: %s", path, strerror(ENOTDIR));
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "%s: %s", path, strerror(ENOTDIR));
goto out;
}
Modified: stable/11/sys/boot/common/module.c
==============================================================================
--- stable/11/sys/boot/common/module.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/common/module.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -143,7 +143,8 @@ command_load(int argc, char *argv[])
fp = file_findfile(argv[1], typestr);
if (fp) {
- sprintf(command_errbuf, "warning: file '%s' already loaded", argv[1]);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "warning: file '%s' already loaded", argv[1]);
return (CMD_WARN);
}
@@ -162,7 +163,8 @@ command_load(int argc, char *argv[])
if (dokld || file_havepath(argv[1])) {
error = mod_loadkld(argv[1], argc - 2, argv + 2);
if (error == EEXIST) {
- sprintf(command_errbuf, "warning: KLD '%s' already loaded", argv[1]);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "warning: KLD '%s' already loaded", argv[1]);
return (CMD_WARN);
}
@@ -173,7 +175,8 @@ command_load(int argc, char *argv[])
*/
error = mod_load(argv[1], NULL, argc - 2, argv + 2);
if (error == EEXIST) {
- sprintf(command_errbuf, "warning: module '%s' already loaded", argv[1]);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "warning: module '%s' already loaded", argv[1]);
return (CMD_WARN);
}
@@ -203,7 +206,8 @@ command_load_geli(int argc, char *argv[])
case 'n':
num = strtol(optarg, &cp, 0);
if (cp == optarg) {
- sprintf(command_errbuf, "bad key index '%s'", optarg);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "bad key index '%s'", optarg);
return(CMD_ERROR);
}
break;
@@ -342,8 +346,8 @@ file_load(char *filename, vm_offset_t dest, struct pre
if (error == EFTYPE)
continue; /* Unknown to this handler? */
if (error) {
- sprintf(command_errbuf, "can't load file '%s': %s",
- filename, strerror(error));
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "can't load file '%s': %s", filename, strerror(error));
break;
}
}
@@ -379,8 +383,8 @@ file_load_dependencies(struct preloaded_file *base_fil
*/
mp = file_findmodule(NULL, dmodname, verinfo);
if (mp == NULL) {
- sprintf(command_errbuf, "module '%s' exists but with wrong version",
- dmodname);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "module '%s' exists but with wrong version", dmodname);
error = ENOENT;
break;
}
@@ -419,12 +423,14 @@ file_loadraw(const char *fname, char *type, int insert
/* locate the file on the load path */
name = file_search(fname, NULL);
if (name == NULL) {
- sprintf(command_errbuf, "can't find '%s'", fname);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "can't find '%s'", fname);
return(NULL);
}
if ((fd = open(name, O_RDONLY)) < 0) {
- sprintf(command_errbuf, "can't open '%s': %s", name, strerror(errno));
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "can't open '%s': %s", name, strerror(errno));
free(name);
return(NULL);
}
@@ -441,7 +447,8 @@ file_loadraw(const char *fname, char *type, int insert
if (got == 0) /* end of file */
break;
if (got < 0) { /* error */
- sprintf(command_errbuf, "error reading '%s': %s", name, strerror(errno));
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "error reading '%s': %s", name, strerror(errno));
free(name);
close(fd);
return(NULL);
@@ -495,13 +502,15 @@ mod_load(char *modname, struct mod_depend *verinfo, in
free(mp->m_args);
mp->m_args = unargv(argc, argv);
#endif
- sprintf(command_errbuf, "warning: module '%s' already loaded", mp->m_name);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "warning: module '%s' already loaded", mp->m_name);
return (0);
}
/* locate file with the module on the search path */
filename = mod_searchmodule(modname, verinfo);
if (filename == NULL) {
- sprintf(command_errbuf, "can't find '%s'", modname);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "can't find '%s'", modname);
return (ENOENT);
}
err = mod_loadkld(filename, argc, argv);
@@ -524,7 +533,8 @@ mod_loadkld(const char *kldname, int argc, char *argv[
*/
filename = file_search(kldname, kld_ext_list);
if (filename == NULL) {
- sprintf(command_errbuf, "can't find '%s'", kldname);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "can't find '%s'", kldname);
return (ENOENT);
}
/*
@@ -532,7 +542,8 @@ mod_loadkld(const char *kldname, int argc, char *argv[
*/
fp = file_findfile(filename, NULL);
if (fp) {
- sprintf(command_errbuf, "warning: KLD '%s' already loaded", filename);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "warning: KLD '%s' already loaded", filename);
free(filename);
return (0);
}
@@ -556,8 +567,10 @@ mod_loadkld(const char *kldname, int argc, char *argv[
break;
}
} while(0);
- if (err == EFTYPE)
- sprintf(command_errbuf, "don't know how to load module '%s'", filename);
+ if (err == EFTYPE) {
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "don't know how to load module '%s'", filename);
+ }
if (err && fp)
file_discard(fp);
free(filename);
Modified: stable/11/sys/boot/common/ufsread.c
==============================================================================
--- stable/11/sys/boot/common/ufsread.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/common/ufsread.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -97,21 +97,21 @@ static __inline uint8_t
fsfind(const char *name, ufs_ino_t * ino)
{
static char buf[DEV_BSIZE];
- struct direct *d;
+ static struct direct d;
char *s;
ssize_t n;
fs_off = 0;
while ((n = fsread(*ino, buf, DEV_BSIZE)) > 0)
for (s = buf; s < buf + DEV_BSIZE;) {
- d = (void *)s;
+ memcpy(&d, s, sizeof(struct direct));
if (ls)
- printf("%s ", d->d_name);
- else if (!strcmp(name, d->d_name)) {
- *ino = d->d_ino;
- return d->d_type;
+ printf("%s ", d.d_name);
+ else if (!strcmp(name, d.d_name)) {
+ *ino = d.d_ino;
+ return d.d_type;
}
- s += d->d_reclen;
+ s += d.d_reclen;
}
if (n != -1 && ls)
printf("\n");
Modified: stable/11/sys/boot/efi/boot1/boot1.c
==============================================================================
--- stable/11/sys/boot/efi/boot1/boot1.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/efi/boot1/boot1.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -77,7 +77,8 @@ Malloc(size_t len, const char *file __unused, int line
void
Free(void *buf, const char *file __unused, int line __unused)
{
- (void)bs->FreePool(buf);
+ if (buf != NULL)
+ (void)bs->FreePool(buf);
}
/*
Modified: stable/11/sys/boot/efi/libefi/efi_console.c
==============================================================================
--- stable/11/sys/boot/efi/libefi/efi_console.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/efi/libefi/efi_console.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -51,6 +51,9 @@ void HO(void);
void end_term(void);
#endif
+static EFI_INPUT_KEY key_cur;
+static int key_pending;
+
static void efi_cons_probe(struct console *);
static int efi_cons_init(int);
void efi_cons_putchar(int);
@@ -436,14 +439,20 @@ efi_cons_getchar()
EFI_STATUS status;
UINTN junk;
- /* Try to read a key stroke. We wait for one if none is pending. */
- status = conin->ReadKeyStroke(conin, &key);
- while (status == EFI_NOT_READY) {
- /* Some EFI implementation (u-boot for example) do not support WaitForKey */
- if (conin->WaitForKey != NULL)
- BS->WaitForEvent(1, &conin->WaitForKey, &junk);
+ if (key_pending) {
+ key = key_cur;
+ key_pending = 0;
+ } else {
+ /* Try to read a key stroke. We wait for one if none is pending. */
status = conin->ReadKeyStroke(conin, &key);
+ while (status == EFI_NOT_READY) {
+ /* Some EFI implementation (u-boot for example) do not support WaitForKey */
+ if (conin->WaitForKey != NULL)
+ BS->WaitForEvent(1, &conin->WaitForKey, &junk);
+ status = conin->ReadKeyStroke(conin, &key);
+ }
}
+
switch (key.ScanCode) {
case 0x17: /* ESC */
return (0x1b); /* esc */
@@ -456,9 +465,20 @@ efi_cons_getchar()
int
efi_cons_poll()
{
+ EFI_INPUT_KEY key;
+ EFI_STATUS status;
- if (conin->WaitForKey == NULL)
- return (1);
+ if (conin->WaitForKey == NULL) {
+ if (key_pending)
+ return (1);
+ status = conin->ReadKeyStroke(conin, &key);
+ if (status == EFI_SUCCESS) {
+ key_cur = key;
+ key_pending = 1;
+ }
+ return (key_pending);
+ }
+
/* This can clear the signaled state. */
return (BS->CheckEvent(conin->WaitForKey) == EFI_SUCCESS);
}
Modified: stable/11/sys/boot/efi/libefi/time.c
==============================================================================
--- stable/11/sys/boot/efi/libefi/time.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/efi/libefi/time.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -228,7 +228,7 @@ time(time_t *tloc)
}
time_t
-getsecs()
+getsecs(void)
{
return time(0);
}
Modified: stable/11/sys/boot/efi/libefi/time_event.c
==============================================================================
--- stable/11/sys/boot/efi/libefi/time_event.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/efi/libefi/time_event.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -76,7 +76,7 @@ time(time_t *tloc)
}
time_t
-getsecs()
+getsecs(void)
{
return time(0);
}
Modified: stable/11/sys/boot/efi/loader/arch/amd64/framebuffer.c
==============================================================================
--- stable/11/sys/boot/efi/loader/arch/amd64/framebuffer.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/efi/loader/arch/amd64/framebuffer.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -474,8 +474,9 @@ command_gop(int argc, char *argv[])
status = BS->LocateProtocol(&gop_guid, NULL, (VOID **)&gop);
if (EFI_ERROR(status)) {
- sprintf(command_errbuf, "%s: Graphics Output Protocol not "
- "present (error=%lu)", argv[0], EFI_ERROR_CODE(status));
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "%s: Graphics Output Protocol not present (error=%lu)",
+ argv[0], EFI_ERROR_CODE(status));
return (CMD_ERROR);
}
@@ -494,9 +495,9 @@ command_gop(int argc, char *argv[])
}
status = gop->SetMode(gop, mode);
if (EFI_ERROR(status)) {
- sprintf(command_errbuf, "%s: Unable to set mode to "
- "%u (error=%lu)", argv[0], mode,
- EFI_ERROR_CODE(status));
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "%s: Unable to set mode to %u (error=%lu)",
+ argv[0], mode, EFI_ERROR_CODE(status));
return (CMD_ERROR);
}
} else if (!strcmp(argv[1], "get")) {
@@ -526,8 +527,8 @@ command_gop(int argc, char *argv[])
return (CMD_OK);
usage:
- sprintf(command_errbuf, "usage: %s [list | get | set <mode>]",
- argv[0]);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "usage: %s [list | get | set <mode>]", argv[0]);
return (CMD_ERROR);
}
@@ -542,8 +543,9 @@ command_uga(int argc, char *argv[])
status = BS->LocateProtocol(&uga_guid, NULL, (VOID **)&uga);
if (EFI_ERROR(status)) {
- sprintf(command_errbuf, "%s: UGA Protocol not present "
- "(error=%lu)", argv[0], EFI_ERROR_CODE(status));
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "%s: UGA Protocol not present (error=%lu)",
+ argv[0], EFI_ERROR_CODE(status));
return (CMD_ERROR);
}
@@ -551,8 +553,8 @@ command_uga(int argc, char *argv[])
goto usage;
if (efifb_from_uga(&efifb, uga) != CMD_OK) {
- sprintf(command_errbuf, "%s: Unable to get UGA information",
- argv[0]);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "%s: Unable to get UGA information", argv[0]);
return (CMD_ERROR);
}
@@ -561,6 +563,6 @@ command_uga(int argc, char *argv[])
return (CMD_OK);
usage:
- sprintf(command_errbuf, "usage: %s", argv[0]);
+ snprintf(command_errbuf, sizeof(command_errbuf), "usage: %s", argv[0]);
return (CMD_ERROR);
}
Modified: stable/11/sys/boot/efi/loader/main.c
==============================================================================
--- stable/11/sys/boot/efi/loader/main.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/efi/loader/main.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -828,8 +828,10 @@ command_efi_show(int argc, char *argv[])
EFI_GUID varguid = { 0,0,0,{0,0,0,0,0,0,0,0} };
EFI_GUID matchguid = { 0,0,0,{0,0,0,0,0,0,0,0} };
uint32_t uuid_status;
- CHAR16 varname[128];
+ CHAR16 *varname;
+ CHAR16 *newnm;
CHAR16 varnamearg[128];
+ UINTN varalloc;
UINTN varsz;
while ((ch = getopt(argc, argv, "ag:lv:")) != -1) {
@@ -924,10 +926,33 @@ command_efi_show(int argc, char *argv[])
* to specify the initial call must be a poiner to a NULL
* character.
*/
- varsz = nitems(varname);
+ varalloc = 1024;
+ varname = malloc(varalloc);
+ if (varname == NULL) {
+ printf("Can't allocate memory to get variables\n");
+ pager_close();
+ return (CMD_ERROR);
+ }
varname[0] = 0;
- while ((status = RS->GetNextVariableName(&varsz, varname, &varguid)) !=
- EFI_NOT_FOUND) {
+ while (1) {
+ varsz = varalloc;
+ status = RS->GetNextVariableName(&varsz, varname, &varguid);
+ if (status == EFI_BUFFER_TOO_SMALL) {
+ varalloc = varsz;
+ newnm = malloc(varalloc);
+ if (newnm == NULL) {
+ printf("Can't allocate memory to get variables\n");
+ free(varname);
+ pager_close();
+ return (CMD_ERROR);
+ }
+ memcpy(newnm, varname, varsz);
+ free(varname);
+ varname = newnm;
+ continue; /* Try again with bigger buffer */
+ }
+ if (status != EFI_SUCCESS)
+ break;
if (aflag) {
if (efi_print_var(varname, &varguid, lflag) != CMD_OK)
break;
@@ -948,6 +973,7 @@ command_efi_show(int argc, char *argv[])
}
}
}
+ free(varname);
pager_close();
return (CMD_OK);
Modified: stable/11/sys/boot/fdt/fdt_loader_cmd.c
==============================================================================
--- stable/11/sys/boot/fdt/fdt_loader_cmd.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/fdt/fdt_loader_cmd.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -195,14 +195,14 @@ fdt_load_dtb(vm_offset_t va)
COPYOUT(va, &header, sizeof(header));
err = fdt_check_header(&header);
if (err < 0) {
- if (err == -FDT_ERR_BADVERSION)
- sprintf(command_errbuf,
+ if (err == -FDT_ERR_BADVERSION) {
+ snprintf(command_errbuf, sizeof(command_errbuf),
"incompatible blob version: %d, should be: %d",
fdt_version(fdtp), FDT_LAST_SUPPORTED_VERSION);
-
- else
- sprintf(command_errbuf, "error validating blob: %s",
- fdt_strerror(err));
+ } else {
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "error validating blob: %s", fdt_strerror(err));
+ }
return (1);
}
@@ -237,8 +237,8 @@ fdt_load_dtb_addr(struct fdt_header *header)
fdtp_size = fdt_totalsize(header);
err = fdt_check_header(header);
if (err < 0) {
- sprintf(command_errbuf, "error validating blob: %s",
- fdt_strerror(err));
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "error validating blob: %s", fdt_strerror(err));
return (err);
}
free(fdtp);
@@ -264,7 +264,8 @@ fdt_load_dtb_file(const char * filename)
/* Attempt to load and validate a new dtb from a file. */
if ((bfp = file_loadraw(filename, "dtb", 1)) == NULL) {
- sprintf(command_errbuf, "failed to load file '%s'", filename);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "failed to load file '%s'", filename);
return (1);
}
if ((err = fdt_load_dtb(bfp->f_addr)) != 0) {
@@ -659,7 +660,8 @@ fdt_fixup_memory(struct fdt_mem_region *region, size_t
/* Create proper '/memory' node. */
memory = fdt_add_subnode(fdtp, root, "memory");
if (memory <= 0) {
- sprintf(command_errbuf, "Could not fixup '/memory' "
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "Could not fixup '/memory' "
"node, error code : %d!\n", memory);
return;
}
@@ -676,7 +678,8 @@ fdt_fixup_memory(struct fdt_mem_region *region, size_t
size_cellsp = (uint32_t *)fdt_getprop(fdtp, root, "#size-cells", NULL);
if (addr_cellsp == NULL || size_cellsp == NULL) {
- sprintf(command_errbuf, "Could not fixup '/memory' node : "
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "Could not fixup '/memory' node : "
"%s %s property not found in root node!\n",
(!addr_cellsp) ? "#address-cells" : "",
(!size_cellsp) ? "#size-cells" : "");
@@ -975,7 +978,8 @@ fdt_cmd_addr(int argc, char *argv[])
hdr = (struct fdt_header *)strtoul(addr, &cp, 16);
if (cp == addr) {
- sprintf(command_errbuf, "Invalid address: %s", addr);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "Invalid address: %s", addr);
return (CMD_ERROR);
}
@@ -1014,7 +1018,8 @@ fdt_cmd_cd(int argc, char *argv[])
o = fdt_path_offset(fdtp, path);
if (o < 0) {
- sprintf(command_errbuf, "could not find node: '%s'", path);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "could not find node: '%s'", path);
return (CMD_ERROR);
}
@@ -1022,8 +1027,8 @@ fdt_cmd_cd(int argc, char *argv[])
return (CMD_OK);
fail:
- sprintf(command_errbuf, "path too long: %d, max allowed: %d",
- len, FDT_CWD_LEN - 1);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "path too long: %d, max allowed: %d", len, FDT_CWD_LEN - 1);
return (CMD_ERROR);
}
@@ -1106,7 +1111,8 @@ fdt_cmd_ls(int argc, char *argv[])
o = fdt_path_offset(fdtp, path);
if (o < 0) {
- sprintf(command_errbuf, "could not find node: '%s'", path);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "could not find node: '%s'", path);
return (CMD_ERROR);
}
@@ -1552,7 +1558,8 @@ fdt_extract_nameloc(char **pathp, char **namep, int *n
return (1);
}
if (o < 0) {
- sprintf(command_errbuf, "could not find node: '%s'", path);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "could not find node: '%s'", path);
return (1);
}
*namep = name;
@@ -1599,7 +1606,8 @@ fdt_cmd_prop(int argc, char *argv[])
o = fdt_path_offset(fdtp, path);
if (o < 0) {
- sprintf(command_errbuf, "could not find node: '%s'", path);
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "could not find node: '%s'", path);
rv = CMD_ERROR;
goto out;
}
@@ -1692,8 +1700,9 @@ fdt_cmd_rm(int argc, char *argv[])
return (CMD_ERROR);
if ((rv = fdt_delprop(fdtp, o, propname)) != 0) {
- sprintf(command_errbuf, "could not delete"
- "%s\n", (rv == -FDT_ERR_NOTFOUND) ?
+ snprintf(command_errbuf, sizeof(command_errbuf),
+ "could not delete %s\n",
+ (rv == -FDT_ERR_NOTFOUND) ?
"(property/node does not exist)" : "");
return (CMD_ERROR);
Modified: stable/11/sys/boot/forth/loader.4th
==============================================================================
--- stable/11/sys/boot/forth/loader.4th Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/forth/loader.4th Thu Feb 8 02:44:21 2018 (r329010)
@@ -143,6 +143,8 @@ only forth definitions also support-functions
s" /boot/defaults/loader.conf" initialize
include_conf_files
include_nextboot_file
+ \ If the user defined a post-initialize hook, call it now
+ s" post-initialize" sfind if execute else drop then
\ Will *NOT* try to load kernel and modules if no configuration file
\ was successfully loaded!
any_conf_read? if
@@ -165,12 +167,14 @@ only forth definitions also support-functions
\
\ Overrides support.4th initialization word with one that does
\ everything start one does, short of loading the kernel and
-\ modules. Returns a flag
+\ modules. Returns a flag.
: initialize ( -- flag )
s" /boot/defaults/loader.conf" initialize
include_conf_files
include_nextboot_file
+ \ If the user defined a post-initialize hook, call it now
+ s" post-initialize" sfind if execute else drop then
any_conf_read?
;
Modified: stable/11/sys/boot/i386/Makefile.inc
==============================================================================
--- stable/11/sys/boot/i386/Makefile.inc Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/i386/Makefile.inc Thu Feb 8 02:44:21 2018 (r329010)
@@ -28,4 +28,9 @@ BTXLDR= ${BTXDIR}/btxldr/btxldr
BTXKERN= ${BTXDIR}/btx/btx
BTXCRT= ${BTXDIR}/lib/crt0.o
+# compact binary with no padding between text, data, bss
+LDSCRIPT= ${SRCTOP}/sys/boot/i386/boot.ldscript
+LDFLAGS_BIN=-e start -Ttext ${ORG} -Wl,-T,${LDSCRIPT},-S,--oformat,binary
+LD_FLAGS_BIN=-static -T ${LDSCRIPT} --gc-sections
+
.include "../Makefile.inc"
Copied: stable/11/sys/boot/i386/boot.ldscript (from r305353, head/sys/boot/i386/boot.ldscript)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/11/sys/boot/i386/boot.ldscript Thu Feb 8 02:44:21 2018 (r329010, copy of r305353, head/sys/boot/i386/boot.ldscript)
@@ -0,0 +1,11 @@
+/* $FreeBSD$ */
+/* Merge text, data and bss together almost no padding */
+OUTPUT_FORMAT("elf32-i386-freebsd")
+OUTPUT_ARCH(i386)
+ENTRY(_start)
+SECTIONS {
+ . = 0x08048000 + SIZEOF_HEADERS;
+ .text : { *(.text) } =0x90909090 /* Pad with nops, if needed */
+ .data : { *(.data) } _edata = .;
+ .bss : { *(.bss) } _end = .;
+}
Modified: stable/11/sys/boot/i386/boot0/Makefile
==============================================================================
--- stable/11/sys/boot/i386/boot0/Makefile Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/i386/boot0/Makefile Thu Feb 8 02:44:21 2018 (r329010)
@@ -40,6 +40,7 @@ BOOT_BOOT0_TICKS?= 0xb6
# The base address that we the boot0 code to to run it. Don't change this
# unless you are glutton for punishment.
BOOT_BOOT0_ORG?= 0x600
+ORG=${BOOT_BOOT0_ORG}
# Comm settings for boot0sio.
# Bit(s) Description
@@ -74,7 +75,7 @@ CFLAGS+=-DFLAGS=${BOOT_BOOT0_FLAGS} \
-DTICKS=${BOOT_BOOT0_TICKS} \
-DCOMSPEED=${BOOT_BOOT0_COMCONSOLE_SPEED}
-LDFLAGS=-e start -Ttext ${BOOT_BOOT0_ORG} -Wl,-N,-S,--oformat,binary
+LDFLAGS=${LDFLAGS_BIN}
.include <bsd.prog.mk>
Modified: stable/11/sys/boot/i386/boot2/Makefile
==============================================================================
--- stable/11/sys/boot/i386/boot2/Makefile Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/i386/boot2/Makefile Thu Feb 8 02:44:21 2018 (r329010)
@@ -49,7 +49,7 @@ CFLAGS.gcc+= -mno-align-long-strings
CFLAGS.clang+= -Oz ${CLANG_OPT_SMALL}
-LD_FLAGS=-static -N --gc-sections
+LD_FLAGS=${LD_FLAGS_BIN}
# Pick up ../Makefile.inc early.
.include <bsd.init.mk>
Modified: stable/11/sys/boot/i386/btx/btx/Makefile
==============================================================================
--- stable/11/sys/boot/i386/btx/btx/Makefile Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/i386/btx/btx/Makefile Thu Feb 8 02:44:21 2018 (r329010)
@@ -25,7 +25,7 @@ CFLAGS+=-DBTX_SERIAL -DSIOPRT=${BOOT_COMCONSOLE_PORT}
ORG= 0x9000
-LDFLAGS=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary
+LDFLAGS=${LDFLAGS_BIN}
.include <bsd.prog.mk>
Modified: stable/11/sys/boot/i386/btx/btxldr/Makefile
==============================================================================
--- stable/11/sys/boot/i386/btx/btxldr/Makefile Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/i386/btx/btxldr/Makefile Thu Feb 8 02:44:21 2018 (r329010)
@@ -12,7 +12,8 @@ CFLAGS+=-I${.CURDIR}/../../common
CFLAGS+=-DBTXLDR_VERBOSE
.endif
-LDFLAGS=-e start -Ttext ${LOADER_ADDRESS} -Wl,-N,-S,--oformat,binary
+ORG=${LOADER_ADDRESS}
+LDFLAGS=${LDFLAGS_BIN}
.include <bsd.prog.mk>
Modified: stable/11/sys/boot/i386/btx/btxldr/btxldr.S
==============================================================================
--- stable/11/sys/boot/i386/btx/btxldr/btxldr.S Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/i386/btx/btxldr/btxldr.S Thu Feb 8 02:44:21 2018 (r329010)
@@ -376,12 +376,12 @@ e_fmt: .asciz "Error: Client format not supported\n"
#ifdef BTXLDR_VERBOSE
m_mem: .asciz "Starting in protected mode (base mem=\0)\n"
m_esp: .asciz "Arguments passed (esp=\0):\n"
-m_args: .asciz"<howto="
- .asciz" bootdev="
- .asciz" junk="
- .asciz" "
- .asciz" "
- .asciz" bootinfo=\0>\n"
+m_args: .asciz "<howto="
+ .asciz " bootdev="
+ .asciz " junk="
+ .asciz " "
+ .asciz " "
+ .asciz " bootinfo=\0>\n"
m_rel_bi: .asciz "Relocated bootinfo (size=48) to \0\n"
m_rel_args: .asciz "Relocated arguments (size=18) to \0\n"
m_rel_btx: .asciz "Relocated kernel (size=\0) to \0\n"
Modified: stable/11/sys/boot/i386/cdboot/Makefile
==============================================================================
--- stable/11/sys/boot/i386/cdboot/Makefile Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/i386/cdboot/Makefile Thu Feb 8 02:44:21 2018 (r329010)
@@ -10,7 +10,7 @@ CFLAGS+=-I${.CURDIR}/../common
ORG= 0x7c00
-LDFLAGS=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary
+LDFLAGS=${LDFLAGS_BIN}
.include <bsd.prog.mk>
Modified: stable/11/sys/boot/i386/gptboot/Makefile
==============================================================================
--- stable/11/sys/boot/i386/gptboot/Makefile Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/i386/gptboot/Makefile Thu Feb 8 02:44:21 2018 (r329010)
@@ -47,7 +47,7 @@ LIBGELIBOOT= ${.OBJDIR}/../../geli/libgeliboot.a
OPENCRYPTO_XTS= xform_aes_xts.o
.endif
-LD_FLAGS=-static -N --gc-sections
+LD_FLAGS=${LD_FLAGS_BIN}
LIBSTAND= ${.OBJDIR}/../../libstand32/libstand.a
Modified: stable/11/sys/boot/i386/gptzfsboot/Makefile
==============================================================================
--- stable/11/sys/boot/i386/gptzfsboot/Makefile Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/i386/gptzfsboot/Makefile Thu Feb 8 02:44:21 2018 (r329010)
@@ -56,7 +56,7 @@ OPENCRYPTO_XTS= xform_aes_xts.o
CFLAGS.gcc+= --param max-inline-insns-single=100
-LD_FLAGS=-static -N --gc-sections
+LD_FLAGS=${LD_FLAGS_BIN}
LIBSTAND= ${.OBJDIR}/../../libstand32/libstand.a
Modified: stable/11/sys/boot/i386/libi386/biosdisk.c
==============================================================================
--- stable/11/sys/boot/i386/libi386/biosdisk.c Thu Feb 8 01:34:35 2018 (r329009)
+++ stable/11/sys/boot/i386/libi386/biosdisk.c Thu Feb 8 02:44:21 2018 (r329010)
@@ -244,6 +244,7 @@ static int
bd_int13probe(struct bdinfo *bd)
{
struct edd_params params;
+ int ret = 1; /* assume success */
v86.ctl = V86_FLAGS;
v86.addr = 0x13;
@@ -251,11 +252,14 @@ bd_int13probe(struct bdinfo *bd)
v86.edx = bd->bd_unit;
v86int();
+ /* Don't error out if we get bad sector number, try EDD as well */
if (V86_CY(v86.efl) || /* carry set */
- (v86.ecx & 0x3f) == 0 || /* absurd sector number */
(v86.edx & 0xff) <= (unsigned)(bd->bd_unit & 0x7f)) /* unit # bad */
return (0); /* skip device */
+ if ((v86.ecx & 0x3f) == 0) /* absurd sector number */
+ ret = 0; /* set error */
+
/* Convert max cyl # -> # of cylinders */
bd->bd_cyl = ((v86.ecx & 0xc0) << 2) + ((v86.ecx & 0xff00) >> 8) + 1;
/* Convert max head # -> # of heads */
@@ -280,7 +284,8 @@ bd_int13probe(struct bdinfo *bd)
if (V86_CY(v86.efl) || /* carry set */
(v86.ebx & 0xffff) != 0xaa55 || /* signature */
(v86.ecx & EDD_INTERFACE_FIXED_DISK) == 0)
- return (1);
+ return (ret); /* return code from int13 AH=08 */
+
/* EDD supported */
bd->bd_flags |= BD_MODEEDD1;
if ((v86.eax & 0xff00) >= 0x3000)
@@ -295,12 +300,22 @@ bd_int13probe(struct bdinfo *bd)
v86.esi = VTOPOFF(¶ms);
v86int();
if (!V86_CY(v86.efl)) {
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-stable-11
mailing list