From 569df8aca8fd4b218dd83e286ff4730ef690bfff Mon Sep 17 00:00:00 2001 From: mintsuki Date: Sun, 1 Nov 2020 10:31:35 +0100 Subject: [PATCH] Use URIs everywhere, update config documentation. Fixes #48 --- CONFIG.md | 34 ++++++++++++++++++++-------------- limine.bin | Bin 32768 -> 32768 bytes stage2/lib/blib.c | 15 +++++++++++---- stage2/main.c | 6 ++---- stage2/protos/linux.c | 14 ++------------ stage2/protos/stivale.c | 12 +----------- stage2/protos/stivale2.c | 12 +----------- test/limine.cfg | 4 ++-- 8 files changed, 39 insertions(+), 58 deletions(-) diff --git a/CONFIG.md b/CONFIG.md index 9160561b..5a4e2fd7 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -19,6 +19,8 @@ although usually one would put them at the beginning of the config. Some *local assignments* are shared between entries using any *protocol*, while other *local assignments* are specific to a given *protocol*. +Some keys take *URIs* as values; these are described in the next section. + *Globally assignable* keys are: * `TIMEOUT` - Specifies the timeout in seconds before the first *entry* is automatically booted. * `DEFAULT_ENTRY` - 0-based entry index of the entry which will be automatically selected at startup. If unspecified, it is `0`. @@ -27,33 +29,37 @@ Some *local assignments* are shared between entries using any *protocol*, while * `THEME_MARGIN` - Set the amount of margin around the terminal. Ignored if `GRAPHICS` is not `yes`. * `THEME_MARGIN_GRADIENT` - Set the thickness in pixel for the gradient around the terminal. Ignored if `GRAPHICS` is not `yes`. * `BACKGROUND_DRIVE` - Drive where to find the background .BMP file. Assume boot drive if unspecified. Ignored if `GRAPHICS` is not `yes`. -* `BACKGROUND_PARTITION` - Partition where to find the background .BMP file. Ignored if `GRAPHICS` is not `yes`. * `BACKGROUND_PATH` - Path where to find the background .BMP file. Ignored if `GRAPHICS` is not `yes`. *Locally assignable (non protocol specific)* keys are: * `PROTOCOL` - The boot protocol that will be used to boot the kernel. Valid protocols are: `linux`, `stivale`, `stivale2`, `chainload`. -* `KERNEL_PROTO` - Alias of `PROTOCOL`. * `CMDLINE` - The command line string to be passed to the kernel. Can be omitted. * `KERNEL_CMDLINE` - Alias of `CMDLINE`. *Locally assignable (protocol specific)* keys are: * Linux protocol: - * `KERNEL_DRIVE` - The BIOS drive (in decimal) where the kernel resides (if unspecified, boot drive is assumed). - * `KERNEL_PARTITION` - The index (in decimal) of the partition containing the kernel. - * `KERNEL_PATH` - The path of the kernel in said partition, forward slashes to delimit directories. - * `INITRD_PARTITION` - Partition index of the initial ramdisk. - * `INITRD_PATH` - The path to the initial ramdisk. + * `KERNEL_PATH` - The URI path of the kernel. + * `INITRD_PATH` - The URI path to the initial ramdisk. * stivale and stivale2 protocols: - * `KERNEL_DRIVE` - The BIOS drive (in decimal) where the kernel resides (if unspecified, boot drive is assumed). - * `KERNEL_PARTITION` - The index (in decimal) of the partition containing the kernel. - * `KERNEL_PATH` - The path of the kernel in said partition, forward slashes to delimit directories. - * `MODULE_PARTITION` - Partition index of a module. - * `MODULE_PATH` - The path to a module. + * `KERNEL_PATH` - The URI path of the kernel. + * `MODULE_PATH` - The URI path to a module. * `MODULE_STRING` - A string to be passed to a module. * Chainload protocol: - * `DRIVE` - The BIOS drive (in decimal) to chainload. - * `PARTITION` - The partition index (in decimal) to chainload (if omitted, chainload the drive's bootsector). + * `DRIVE` - The URI to a drive to chainload. Note that one can define these 3 variable multiple times to specify multiple modules. The entries will be matched in order. E.g.: the 1st partition entry will be matched to the 1st path and the 1st string entry that appear, and so on. + +## URIs + +A URI is a path that Limine uses to locate resources in the whole system. It is +comprised of a *resource*, a *root*, and a *path*. It takes the form of: +``` +resource://root/path +``` + +The format for `root` changes depending on the resource used. + +A resource can be one of the following: +* `bios` - The `root` takes the form of `drive:partition`; for example: `bios://3:1/...` would use BIOS drive 3, partition 1. Partitions and BIOS drives are both 1-based. Omitting the drive is possible; for example: `bios://:2/...`. Omitting the drive makes Limine use the boot drive. diff --git a/limine.bin b/limine.bin index aaee5376bb00342b8ce36f67833805c4c0b00c94..2fa7e59f69f8b5d0abac09f805735f17212571b9 100644 GIT binary patch delta 22556 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 16) { + panic("BIOS drive number outside range 1-16"); + } + *drive = (strtoui(loc) - 1) + 0x80; + } loc += i + 1; break; } @@ -35,7 +39,10 @@ static bool parse_bios_partition(char *loc, uint8_t *drive, uint8_t *partition) if (*loc == 0) return false; - *partition = strtoui(loc); + if (strtoui(loc) < 1 || strtoui(loc) > 256) { + panic("BIOS partition number outside range 1-256"); + } + *partition = strtoui(loc) - 1; return true; } diff --git a/stage2/main.c b/stage2/main.c index ae754e1d..6a0107ef 100644 --- a/stage2/main.c +++ b/stage2/main.c @@ -60,10 +60,8 @@ void entry(uint8_t _boot_drive) { char *cmdline = menu(boot_drive); char proto[32]; - if (!config_get_value(proto, 0, 32, "KERNEL_PROTO")) { - if (!config_get_value(proto, 0, 32, "PROTOCOL")) { - panic("PROTOCOL not specified"); - } + if (!config_get_value(proto, 0, 32, "PROTOCOL")) { + panic("PROTOCOL not specified"); } if (!strcmp(proto, "stivale")) { diff --git a/stage2/protos/linux.c b/stage2/protos/linux.c index d525dc74..62261882 100644 --- a/stage2/protos/linux.c +++ b/stage2/protos/linux.c @@ -130,19 +130,9 @@ void linux_load(char *cmdline) { if (!config_get_value(initrd_path, 0, 64, "INITRD_PATH")) panic("INITRD_PATH not specified"); - int initrd_part; { - char buf[32]; - if (!config_get_value(buf, 0, 32, "INITRD_PARTITION")) { - initrd_part = kernel->partition; - } else { - initrd_part = (int)strtoui(buf); - } - } - struct file_handle initrd; - if (fopen(&initrd, kernel->disk, initrd_part, initrd_path)) { - panic("Failed to open initrd"); - } + if (!uri_open(&initrd, initrd_path)) + panic("Could not open initrd"); print("Loading initrd...\n"); memmap_alloc_range(INITRD_LOAD_ADDR, initrd.size, 0); diff --git a/stage2/protos/stivale.c b/stage2/protos/stivale.c index 50cbeb23..cdbd144c 100644 --- a/stage2/protos/stivale.c +++ b/stage2/protos/stivale.c @@ -129,19 +129,9 @@ void stivale_load(char *cmdline) { m->string[0] = '\0'; } - int part; { - char buf[32]; - if (!config_get_value(buf, i, 32, "MODULE_PARTITION")) { - part = kernel->partition; - } else { - part = (int)strtoui(buf); - } - } - struct file_handle f; - if (fopen(&f, kernel->disk, part, module_file)) { + if (!uri_open(&f, module_file)) panic("Requested module with path \"%s\" not found!\n", module_file); - } void *module_addr = (void *)(((uint32_t)top_used_addr & 0xfff) ? ((uint32_t)top_used_addr & ~((uint32_t)0xfff)) + 0x1000 : diff --git a/stage2/protos/stivale2.c b/stage2/protos/stivale2.c index 6aedbd05..59708522 100644 --- a/stage2/protos/stivale2.c +++ b/stage2/protos/stivale2.c @@ -181,19 +181,9 @@ void stivale2_load(char *cmdline) { m->string[0] = '\0'; } - int part; { - char buf[32]; - if (!config_get_value(buf, i, 32, "MODULE_PARTITION")) { - part = kernel->partition; - } else { - part = (int)strtoui(buf); - } - } - struct file_handle f; - if (fopen(&f, kernel->disk, part, module_file)) { + if (uri_open(&f, module_file)) panic("Requested module with path \"%s\" not found!\n", module_file); - } void *module_addr = (void *)(((uint32_t)top_used_addr & 0xfff) ? ((uint32_t)top_used_addr & ~((uint32_t)0xfff)) + 0x1000 : diff --git a/test/limine.cfg b/test/limine.cfg index 330d0549..e1d7cf7a 100644 --- a/test/limine.cfg +++ b/test/limine.cfg @@ -20,11 +20,11 @@ BACKGROUND_PATH=bg.bmp :Stivale Test PROTOCOL=stivale -KERNEL_PATH=bios://:0/boot/test.elf +KERNEL_PATH=bios://:1/boot/test.elf KERNEL_CMDLINE=Hi! This is an example! :Stivale2 Test PROTOCOL=stivale2 -KERNEL_PATH=bios://:0/boot/test.elf +KERNEL_PATH=bios://:1/boot/test.elf KERNEL_CMDLINE=Woah! Another example!