From bf3d0660932584ec05ee6accb1411c984a1b59d1 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Wed, 11 Oct 2023 00:52:50 +0200 Subject: [PATCH] Add kernel(7) --firmware option. --- kernel/kernel.cpp | 23 ++++++++++++++++++++++- kernel/kernelinfo.cpp | 19 ++++++++----------- kernel/kernelinfo.h | 1 + share/man/man7/kernel.7 | 9 +++++++++ utils/kernelinfo.1 | 2 +- 5 files changed, 41 insertions(+), 13 deletions(-) diff --git a/kernel/kernel.cpp b/kernel/kernel.cpp index 5e9ccc46..63666966 100644 --- a/kernel/kernel.cpp +++ b/kernel/kernel.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2018, 2021-2022 Jonas 'Sortie' Termansen. + * Copyright (c) 2011-2018, 2021-2023 Jonas 'Sortie' Termansen. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -233,6 +233,13 @@ extern "C" void KernelInit(unsigned long magic, multiboot_info_t* bootinfo_p) if ( !(kernel_options = strdup(cmdline ? cmdline : "")) ) Panic("Failed to allocate kernel command line"); +#if defined(__i386__) || defined(__x86_64__) + // TODO: Detect EFI. + kernel_firmware = "bios"; +#else + #warning "Name your system firmware here" + kernel_firmware = "unknown"; +#endif int argmax = 1; argv = new char*[argmax + 1]; @@ -288,6 +295,20 @@ extern "C" void KernelInit(unsigned long magic, multiboot_info_t* bootinfo_p) enable_network_drivers = true; else if ( !strcmp(arg, "--no-random-seed") ) no_random_seed = true; + else if ( !strncmp(arg, "--firmware=", strlen("--firmware=")) ) + { + const char* firmware = arg + strlen("--firmware="); +#if defined(__i386__) || defined(__x86_64__) + if ( !strcmp(firmware, "bios") || !strcmp(firmware, "pc") ) + kernel_firmware = "bios"; + else if ( !strcmp(firmware, "efi") ) + kernel_firmware = "efi"; + else +#endif + { + PanicF("Unsupported firmware option: %s", firmware); + } + } else { Log::PrintF("\r\e[J"); diff --git a/kernel/kernelinfo.cpp b/kernel/kernelinfo.cpp index 30899d55..a56f64fd 100644 --- a/kernel/kernelinfo.cpp +++ b/kernel/kernelinfo.cpp @@ -34,20 +34,17 @@ namespace Sortix { char* kernel_options; +const char* kernel_firmware; static const char* KernelInfo(const char* req) { - if ( strcmp(req, "name") == 0 ) { return BRAND_KERNEL_NAME; } - if ( strcmp(req, "version") == 0 ) { return VERSIONSTR; } - if ( strcmp(req, "tagline") == 0 ) { return BRAND_RELEASE_TAGLINE; } - if ( strcmp(req, "options") == 0 ) { return kernel_options; } - if ( strcmp(req, "builddate") == 0 ) { return __DATE__; } - if ( strcmp(req, "buildtime") == 0 ) { return __TIME__; } -#if defined(__i386__) || defined(__x86_64__) - if ( strcmp(req, "firmware") == 0 ) { return "bios"; } -#else - #warning "Name your system firmware here" -#endif + if ( strcmp(req, "name") == 0 ) return BRAND_KERNEL_NAME; + if ( strcmp(req, "version") == 0 ) return VERSIONSTR; + if ( strcmp(req, "tagline") == 0 ) return BRAND_RELEASE_TAGLINE; + if ( strcmp(req, "options") == 0 ) return kernel_options; + if ( strcmp(req, "builddate") == 0 ) return __DATE__; + if ( strcmp(req, "buildtime") == 0 ) return __TIME__; + if ( strcmp(req, "firmware") == 0 ) return kernel_firmware; return NULL; } diff --git a/kernel/kernelinfo.h b/kernel/kernelinfo.h index 1b49e77a..c0ecc406 100644 --- a/kernel/kernelinfo.h +++ b/kernel/kernelinfo.h @@ -23,6 +23,7 @@ namespace Sortix { extern char* kernel_options; +extern const char* kernel_firmware; } // namespace Sortix diff --git a/share/man/man7/kernel.7 b/share/man/man7/kernel.7 index 29a4385d..ff9815ce 100644 --- a/share/man/man7/kernel.7 +++ b/share/man/man7/kernel.7 @@ -10,6 +10,7 @@ .Op Fl \-enable-em .Op Fl \-disable-network-drivers .Op Fl \-enable-network-drivers +.Op Fl \-firmware Ns = Ns Oo Sy bios "|" Sy efi "|" pc Oc .Op Fl \-no-random-seed .Op Fl \- .Op Ar init ... @@ -64,6 +65,14 @@ driver. .It Fl \-enable-network-drivers Do initialize network drivers. This is the default behavior. +.It Fl \-firmware Ns = Ns Oo Sy bios "|" Sy efi "|" pc Oc +Informs the kernel the system is booted using +.Sy bios or +.Sy efi . +The +.Sy pc +value is a synonym for +.Sy bios . .It Fl \-no-random-seed Don't warn if no random seed file was loaded by the bootloader (usually from .Pa /boot/random.seed ) . diff --git a/utils/kernelinfo.1 b/utils/kernelinfo.1 index f1fba49a..d864b285 100644 --- a/utils/kernelinfo.1 +++ b/utils/kernelinfo.1 @@ -30,7 +30,7 @@ The date on which the current kernel was built. .It Sy buildtime The time at which the current kernel was built. .It Sy firmware -The firmware of the system (e.g. "bios" or "uefi") +The firmware of the system (e.g. "bios" or "efi") .El .Sh EXIT STATUS .Nm