From b7fed38c88b4ae9e35991b1c3966365739e0771c Mon Sep 17 00:00:00 2001 From: nia Date: Tue, 7 Sep 2021 11:41:31 +0000 Subject: [PATCH] Remove banner printing code from bootloaders, add it to libsa. This harmonizes efiboot and the various x86 bootloaders to use shared code for printing the banner. By friendly coincidence, it also adds support for specifying 'banner=' in arm efiboot's boot.cfg, as on x86. --- sys/arch/i386/stand/boot/boot2.c | 46 +++++---------------- sys/arch/i386/stand/efiboot/boot.c | 38 ++++------------- sys/arch/i386/stand/efiboot/efiboot.h | 3 +- sys/arch/i386/stand/pxeboot/main.c | 30 +++++--------- sys/lib/libsa/bootcfg.c | 25 +++++++++++- sys/lib/libsa/bootcfg.h | 3 +- sys/stand/efiboot/boot.c | 59 +-------------------------- sys/stand/efiboot/efiboot.h | 3 +- 8 files changed, 58 insertions(+), 149 deletions(-) diff --git a/sys/arch/i386/stand/boot/boot2.c b/sys/arch/i386/stand/boot/boot2.c index 141e3dcd49d9..3f3396a4cd11 100644 --- a/sys/arch/i386/stand/boot/boot2.c +++ b/sys/arch/i386/stand/boot/boot2.c @@ -1,4 +1,4 @@ -/* $NetBSD: boot2.c,v 1.77 2021/06/21 19:52:17 nia Exp $ */ +/* $NetBSD: boot2.c,v 1.78 2021/09/07 11:41:31 nia Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -121,7 +121,6 @@ static const char *default_part_name; char *sprint_bootsel(const char *); static void bootit(const char *, int); -void print_banner(void); void boot2(int, uint64_t); void command_help(char *); @@ -298,35 +297,6 @@ bootit(const char *filename, int howto) printf("boot returned\n"); } -void -print_banner(void) -{ - - clearit(); -#ifndef SMALL - int n; - if (bootcfg_info.banner[0]) { - for (n = 0; n < BOOTCFG_MAXBANNER && bootcfg_info.banner[n]; - n++) - printf("%s\n", bootcfg_info.banner[n]); - } else { -#endif /* !SMALL */ - printf("\n" - " \\-__,------,___.\n" - " \\ __,---` %s (from NetBSD %s)\n" - " \\ `---,_. Revision %s\n" - " \\-,_____,.---` Memory: %d/%d k\n" - " \\\n" - " \\\n" - " \\\n", - bootprog_name, bootprog_kernrev, - bootprog_rev, - getbasemem(), getextmem()); -#ifndef SMALL - } -#endif /* !SMALL */ -} - /* * Called from the initial entry point boot_start in biosboot.S * @@ -379,10 +349,12 @@ boot2(int biosdev, uint64_t biossector) * If console set in boot.cfg, switch to it. * This will print the banner, so we don't need to explicitly do it */ - if (bootcfg_info.consdev) + if (bootcfg_info.consdev) { command_consdev(bootcfg_info.consdev); - else - print_banner(); + } else { + clearit(); + print_bootcfg_banner(bootprog_name, bootprog_rev); + } /* Display the menu, if applicable */ twiddle_toggle = 0; @@ -393,7 +365,8 @@ boot2(int biosdev, uint64_t biossector) #else twiddle_toggle = 0; - print_banner(); + clearit(); + print_bootcfg_banner(bootprog_name, bootprog_rev); #endif printf("Press return to boot now, any other key for boot menu\n"); @@ -616,7 +589,8 @@ command_consdev(char *arg) } initio(cdp->tag); - print_banner(); + clearit(); + print_bootcfg_banner(bootprog_name, bootprog_rev); return; } error: diff --git a/sys/arch/i386/stand/efiboot/boot.c b/sys/arch/i386/stand/efiboot/boot.c index aa12407827cc..abf09bd8806b 100644 --- a/sys/arch/i386/stand/efiboot/boot.c +++ b/sys/arch/i386/stand/efiboot/boot.c @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.19 2021/06/22 19:53:58 nia Exp $ */ +/* $NetBSD: boot.c,v 1.20 2021/09/07 11:41:31 nia Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -277,31 +277,6 @@ bootit(const char *filename, int howto) printf("boot returned\n"); } -void -print_banner(void) -{ - int n; - - clearit(); - if (bootcfg_info.banner[0]) { - for (n = 0; n < BOOTCFG_MAXBANNER && bootcfg_info.banner[n]; - n++) - printf("%s\n", bootcfg_info.banner[n]); - } else { - printf("\n" - " \\-__,------,___.\n" - " \\ __,---` %s (from NetBSD %s)\n" - " \\ `---,_. Revision %s\n" - " \\-,_____,.---` Memory: %d/%d k\n" - " \\\n" - " \\\n" - " \\\n", - bootprog_name, bootprog_kernrev, - bootprog_rev, - getbasemem(), getextmem()); - } -} - void boot(void) { @@ -344,10 +319,12 @@ boot(void) * If console set in boot.cfg, switch to it. * This will print the banner, so we don't need to explicitly do it */ - if (bootcfg_info.consdev) + if (bootcfg_info.consdev) { command_consdev(bootcfg_info.consdev); - else - print_banner(); + } else { + clearit(); + print_bootcfg_banner(bootprog_name, bootprog_rev); + } /* Display the menu, if applicable */ twiddle_toggle = 0; @@ -602,7 +579,8 @@ command_consdev(char *arg) } } efi_consinit(cdp->tag, ioport, speed); - print_banner(); + clearit(); + print_bootcfg_banner(bootprog_name, bootprog_rev); return; } } diff --git a/sys/arch/i386/stand/efiboot/efiboot.h b/sys/arch/i386/stand/efiboot/efiboot.h index b7e8e0dc1577..50cfc53e3ed7 100644 --- a/sys/arch/i386/stand/efiboot/efiboot.h +++ b/sys/arch/i386/stand/efiboot/efiboot.h @@ -1,4 +1,4 @@ -/* $NetBSD: efiboot.h,v 1.10 2019/09/13 02:19:45 manu Exp $ */ +/* $NetBSD: efiboot.h,v 1.11 2021/09/07 11:41:31 nia Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -41,7 +41,6 @@ extern EFI_GUID GraphicsOutputProtocol; /* boot.c */ void boot(void); void clearit(void); -void print_banner(void); /* efiboot.c */ extern EFI_HANDLE IH; diff --git a/sys/arch/i386/stand/pxeboot/main.c b/sys/arch/i386/stand/pxeboot/main.c index 77b73bedcb3b..b57d0b0a4582 100644 --- a/sys/arch/i386/stand/pxeboot/main.c +++ b/sys/arch/i386/stand/pxeboot/main.c @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.31 2014/06/28 09:16:18 rtr Exp $ */ +/* $NetBSD: main.c,v 1.32 2021/09/07 11:41:32 nia Exp $ */ /* * Copyright (c) 1996 @@ -106,20 +106,6 @@ bootit(const char *filename, int howto) return (-1); } -static void -print_banner(void) -{ - int base = getbasemem(); - int ext = getextmem(); - - clearit(); - printf("\n" - ">> NetBSD/x86 PXE boot, Revision %s (from NetBSD %s)\n" - ">> Memory: %d/%d k\n", - bootprog_rev, bootprog_kernrev, - base, ext); -} - int main(void) { @@ -148,10 +134,12 @@ main(void) * If console set in boot.cfg, switch to it. * This will print the banner, so we don't need to explicitly do it */ - if (bootcfg_info.consdev) + if (bootcfg_info.consdev) { command_consdev(bootcfg_info.consdev); - else - print_banner(); + } else { + clearit(); + print_bootcfg_banner(bootprog_name, bootprog_rev); + } /* Display the menu, if applicable */ twiddle_toggle = 0; @@ -161,7 +149,8 @@ main(void) } #else twiddle_toggle = 0; - print_banner(); + clearit(); + print_bootcfg_banner(bootprog_name, bootprog_rev); #endif printf("Press return to boot now, any other key for boot menu\n"); @@ -254,7 +243,8 @@ command_consdev(char *arg) for (cdp = cons_devs; cdp->name; cdp++) { if (!strcmp(arg, cdp->name)) { initio(cdp->tag); - print_banner(); + clearit(); + print_bootcfg_banner(bootprog_name, bootprog_rev); return; } } diff --git a/sys/lib/libsa/bootcfg.c b/sys/lib/libsa/bootcfg.c index a0e7c9635c2e..dca1ffccb40d 100644 --- a/sys/lib/libsa/bootcfg.c +++ b/sys/lib/libsa/bootcfg.c @@ -1,4 +1,4 @@ -/* $NetBSD: bootcfg.c,v 1.6 2021/05/30 05:59:23 mlelstv Exp $ */ +/* $NetBSD: bootcfg.c,v 1.7 2021/09/07 11:41:31 nia Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -278,3 +278,26 @@ perform_bootcfg(const char *conf, bootcfg_command command, const off_t maxsz) return 0; } + +void +print_bootcfg_banner(const char *bootprog_name, const char *bootprog_rev) +{ + int n = 0; + + if (bootcfg_info.banner[0]) { + for (; n < BOOTCFG_MAXBANNER && bootcfg_info.banner[n]; n++) + printf("%s\n", bootcfg_info.banner[n]); + return; + } + + /* If the user has not specified a banner, print a default one. */ + + printf("\n"); + printf(" \\\\-__,------,___.\n"); + printf(" \\\\ __,---` %s\n", bootprog_name); + printf(" \\\\ `---,_. Revision %s\n", bootprog_rev); + printf(" \\\\-,_____,.---`\n"); + printf(" \\\\\n"); + printf(" \\\\\n"); + printf(" \\\\\n\n"); +} diff --git a/sys/lib/libsa/bootcfg.h b/sys/lib/libsa/bootcfg.h index 27993da4eafc..79e04e2d48e3 100644 --- a/sys/lib/libsa/bootcfg.h +++ b/sys/lib/libsa/bootcfg.h @@ -1,4 +1,4 @@ -/* $NetBSD: bootcfg.h,v 1.4 2021/05/30 05:59:23 mlelstv Exp $ */ +/* $NetBSD: bootcfg.h,v 1.5 2021/09/07 11:41:31 nia Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -54,5 +54,6 @@ extern struct bootcfg_def bootcfg_info; int perform_bootcfg(const char *, bootcfg_command, const off_t); void bootcfg_do_noop(const char *, char *); +void print_bootcfg_banner(const char *, const char *); #endif /* !_BOOTCFG_H */ diff --git a/sys/stand/efiboot/boot.c b/sys/stand/efiboot/boot.c index 1302fb63233f..c37714911c1e 100644 --- a/sys/stand/efiboot/boot.c +++ b/sys/stand/efiboot/boot.c @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.35 2021/07/24 10:22:28 jmcneill Exp $ */ +/* $NetBSD: boot.c,v 1.36 2021/09/07 11:41:31 nia Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -451,61 +451,6 @@ set_bootargs(const char *arg) return 0; } -static void -get_memory_info(uint64_t *ptotal) -{ - EFI_MEMORY_DESCRIPTOR *md, *memmap; - UINTN nentries, mapkey, descsize; - UINT32 descver; - uint64_t totalpg = 0; - int n; - - memmap = LibMemoryMap(&nentries, &mapkey, &descsize, &descver); - for (n = 0, md = memmap; n < nentries; n++, md = NextMemoryDescriptor(md, descsize)) { - if ((md->Attribute & EFI_MEMORY_WB) == 0) { - continue; - } - totalpg += md->NumberOfPages; - } - - *ptotal = totalpg * EFI_PAGE_SIZE; -} - -static void -format_bytes(uint64_t val, uint64_t *pdiv, const char **punit) -{ - static const char *units[] = { "KB", "MB", "GB" }; - unsigned n; - - *punit = "bytes"; - *pdiv = 1; - - for (n = 0; n < __arraycount(units) && val >= 1024 * 10; n++) { - *punit = units[n]; - *pdiv *= 1024; - val /= 1024; - } -} - -void -print_banner(void) -{ - const char *total_unit; - uint64_t total, total_div; - - get_memory_info(&total); - format_bytes(total, &total_div, &total_unit); - - printf(" \\-__,------,___.\n"); - printf(" \\ __,---` %s\n", bootprog_name); - printf(" \\ `---,_. Revision %s\n", bootprog_rev); - printf(" \\-,_____,.---` Memory: %" PRIu64 " %s\n", - total / total_div, total_unit); - printf(" \\\n"); - printf(" \\\n"); - printf(" \\\n\n"); -} - void boot(void) { @@ -520,7 +465,7 @@ boot(void) if (bootcfg_info.clear) uefi_call_wrapper(ST->ConOut->ClearScreen, 1, ST->ConOut); - print_banner(); + print_bootcfg_banner(bootprog_name, bootprog_rev); /* Display menu if configured */ if (bootcfg_info.nummenu > 0) { diff --git a/sys/stand/efiboot/efiboot.h b/sys/stand/efiboot/efiboot.h index a04421d38b9a..f7426c91ca0b 100644 --- a/sys/stand/efiboot/efiboot.h +++ b/sys/stand/efiboot/efiboot.h @@ -1,4 +1,4 @@ -/* $NetBSD: efiboot.h,v 1.15 2021/06/20 19:10:47 jmcneill Exp $ */ +/* $NetBSD: efiboot.h,v 1.16 2021/09/07 11:41:31 nia Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka @@ -51,7 +51,6 @@ extern struct fs_ops nfs_fs_ops; /* boot.c */ void boot(void); void clearit(void); -void print_banner(void); extern const struct boot_command commands[]; void command_help(char *); int set_default_device(const char *);