Add an arch tag to simplify multi-arch netboot
This commit is contained in:
parent
a627c732d5
commit
2f04affae7
|
@ -95,9 +95,11 @@ Editor control options.
|
||||||
* `EDITOR_VALIDATION` - If set to `no`, the editor will not alert you about invalid keys / syntax errors. Defaults to `yes`.
|
* `EDITOR_VALIDATION` - If set to `no`, the editor will not alert you about invalid keys / syntax errors. Defaults to `yes`.
|
||||||
|
|
||||||
*Locally assignable (non protocol specific)* keys are:
|
*Locally assignable (non protocol specific)* keys are:
|
||||||
|
* `ARCH` - The architecture of the kernel/executable. Valid architectures are: `i386`, `x86_64`, and `aarch64`.
|
||||||
* `COMMENT` - An optional comment string that will be displayed by the bootloader on the menu when an entry is selected.
|
* `COMMENT` - An optional comment string that will be displayed by the bootloader on the menu when an entry is selected.
|
||||||
* `PROTOCOL` - The boot protocol that will be used to boot the kernel. Valid protocols are: `linux`, `limine`, `chainload`, `chainload_next`, `multiboot` (or `multiboot1`), and `multiboot2`.
|
* `PROTOCOL` - The boot protocol that will be used to boot the kernel. Valid protocols are: `linux`, `limine`, `chainload`, `chainload_next`, `multiboot` (or `multiboot1`), and `multiboot2`.
|
||||||
* `CMDLINE` - The command line string to be passed to the kernel/executable. Can be omitted.
|
* `CMDLINE` - The command line string to be passed to the kernel/executable. Can be omitted.
|
||||||
|
* `KERNEL_ARCH` - Alias of `ARCH`.
|
||||||
* `KERNEL_CMDLINE` - Alias of `CMDLINE`.
|
* `KERNEL_CMDLINE` - Alias of `CMDLINE`.
|
||||||
|
|
||||||
*Locally assignable (protocol specific)* keys are:
|
*Locally assignable (protocol specific)* keys are:
|
||||||
|
|
|
@ -98,20 +98,25 @@ static struct menu_entry *create_menu_tree(struct menu_entry *parent,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct menu_entry *entry = ext_mem_alloc(sizeof(struct menu_entry));
|
size_t entry_size;
|
||||||
|
char *config_entry = config_get_entry(&entry_size, i);
|
||||||
|
|
||||||
|
const char *arch = config_get_value(config_entry, 0, "KERNEL_ARCH");
|
||||||
|
if (arch == NULL)
|
||||||
|
arch = config_get_value(config_entry, 0, "ARCH");
|
||||||
|
if (arch != NULL && strcmp(arch, get_arch_name()) != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
struct menu_entry *entry = ext_mem_alloc(sizeof(struct menu_entry));
|
||||||
if (root == NULL)
|
if (root == NULL)
|
||||||
root = entry;
|
root = entry;
|
||||||
|
|
||||||
config_get_entry_name(name, i, 64);
|
config_get_entry_name(name, i, 64);
|
||||||
|
|
||||||
bool default_expanded = name[current_depth] == '+';
|
bool default_expanded = name[current_depth] == '+';
|
||||||
|
|
||||||
strcpy(entry->name, name + current_depth + default_expanded);
|
strcpy(entry->name, name + current_depth + default_expanded);
|
||||||
entry->parent = parent;
|
entry->parent = parent;
|
||||||
|
|
||||||
size_t entry_size;
|
|
||||||
char *config_entry = config_get_entry(&entry_size, i);
|
|
||||||
entry->body = ext_mem_alloc(entry_size + 1);
|
entry->body = ext_mem_alloc(entry_size + 1);
|
||||||
memcpy(entry->body, config_entry, entry_size);
|
memcpy(entry->body, config_entry, entry_size);
|
||||||
entry->body[entry_size] = 0;
|
entry->body[entry_size] = 0;
|
||||||
|
|
|
@ -21,6 +21,20 @@ UINT32 efi_desc_ver = 0;
|
||||||
|
|
||||||
bool editor_enabled = true;
|
bool editor_enabled = true;
|
||||||
|
|
||||||
|
const char *get_arch_name(void) {
|
||||||
|
#ifdef __i386__
|
||||||
|
return "i386";
|
||||||
|
#elif defined (__x86_64__)
|
||||||
|
return "x86_64";
|
||||||
|
#elif defined (__aarch64__)
|
||||||
|
return "aarch64";
|
||||||
|
#elif defined (__riscv64)
|
||||||
|
return "riscv64";
|
||||||
|
#else
|
||||||
|
#error "Unknown architecture"
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
bool parse_resolution(size_t *width, size_t *height, size_t *bpp, const char *buf) {
|
bool parse_resolution(size_t *width, size_t *height, size_t *bpp, const char *buf) {
|
||||||
size_t res[3] = {0};
|
size_t res[3] = {0};
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,8 @@ extern bool stage3_loaded;
|
||||||
|
|
||||||
extern bool quiet, serial, editor_enabled, hash_mismatch_panic;
|
extern bool quiet, serial, editor_enabled, hash_mismatch_panic;
|
||||||
|
|
||||||
|
const char *get_arch_name(void);
|
||||||
|
|
||||||
bool parse_resolution(size_t *width, size_t *height, size_t *bpp, const char *buf);
|
bool parse_resolution(size_t *width, size_t *height, size_t *bpp, const char *buf);
|
||||||
|
|
||||||
void get_absolute_path(char *path_ptr, const char *path, const char *pwd);
|
void get_absolute_path(char *path_ptr, const char *path, const char *pwd);
|
||||||
|
|
|
@ -84,9 +84,11 @@ static size_t get_prev_line(size_t index, const char *buffer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *VALID_KEYS[] = {
|
static const char *VALID_KEYS[] = {
|
||||||
|
"ARCH",
|
||||||
"COMMENT",
|
"COMMENT",
|
||||||
"PROTOCOL",
|
"PROTOCOL",
|
||||||
"CMDLINE",
|
"CMDLINE",
|
||||||
|
"KERNEL_ARCH",
|
||||||
"KERNEL_CMDLINE",
|
"KERNEL_CMDLINE",
|
||||||
"KERNEL_PATH",
|
"KERNEL_PATH",
|
||||||
"INITRD_PATH",
|
"INITRD_PATH",
|
||||||
|
|
Loading…
Reference in New Issue