diff options
-rw-r--r-- | sys/boot/efi/include/efilib.h | 1 | ||||
-rw-r--r-- | sys/boot/efi/libefi/bootinfo.c | 3 | ||||
-rw-r--r-- | sys/boot/efi/libefi/libefi.c | 14 | ||||
-rw-r--r-- | sys/boot/efi/loader/main.c | 18 | ||||
-rw-r--r-- | sys/boot/efi/loader/version | 2 | ||||
-rw-r--r-- | sys/boot/ia64/common/bootinfo.c | 3 | ||||
-rw-r--r-- | sys/boot/ia64/efi/main.c | 18 | ||||
-rw-r--r-- | sys/boot/ia64/efi/version | 2 |
8 files changed, 33 insertions, 28 deletions
diff --git a/sys/boot/efi/include/efilib.h b/sys/boot/efi/include/efilib.h index 695f334..1e7b269 100644 --- a/sys/boot/efi/include/efilib.h +++ b/sys/boot/efi/include/efilib.h @@ -31,6 +31,7 @@ extern EFI_SYSTEM_TABLE *ST; extern EFI_BOOT_SERVICES *BS; extern EFI_RUNTIME_SERVICES *RS; +void *efi_get_table(EFI_GUID *tbl); void efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table); EFI_STATUS main(int argc, CHAR16 *argv[]); diff --git a/sys/boot/efi/libefi/bootinfo.c b/sys/boot/efi/libefi/bootinfo.c index 484f226..def4bfb 100644 --- a/sys/boot/efi/libefi/bootinfo.c +++ b/sys/boot/efi/libefi/bootinfo.c @@ -39,6 +39,8 @@ #include "bootstrap.h" +static EFI_GUID hcdp = HCDP_TABLE_GUID; + /* * Return a 'boothowto' value corresponding to the kernel arguments in * (kargs) and any relevant environment variables. @@ -300,6 +302,7 @@ bi_load(struct bootinfo *bi, struct preloaded_file *fp, UINTN *mapkey, bi->bi_symtab = ssym; bi->bi_esymtab = esym; + bi->bi_hcdp = (uint64_t)efi_get_table(&hcdp); /* DIG64 HCDP table addr. */ fpswa_init(&bi->bi_fpswa); /* find FPSWA interface */ /* find the last module in the chain */ diff --git a/sys/boot/efi/libefi/libefi.c b/sys/boot/efi/libefi/libefi.c index e28d8db..5ef97f4 100644 --- a/sys/boot/efi/libefi/libefi.c +++ b/sys/boot/efi/libefi/libefi.c @@ -59,6 +59,20 @@ arg_skipword(CHAR16 *argp) return (argp); } +void * +efi_get_table(EFI_GUID *tbl) +{ + EFI_GUID *id; + int i; + + for (i = 0; i < ST->NumberOfTableEntries; i++) { + id = &ST->ConfigurationTable[i].VendorGuid; + if (!memcmp(id, tbl, sizeof(EFI_GUID))) + return (ST->ConfigurationTable[i].VendorTable); + } + return (NULL); +} + void exit(EFI_STATUS exit_code) { diff --git a/sys/boot/efi/loader/main.c b/sys/boot/efi/loader/main.c index 51ac572..82979e2 100644 --- a/sys/boot/efi/loader/main.c +++ b/sys/boot/efi/loader/main.c @@ -72,13 +72,8 @@ find_pal_proc(void) }; u_int8_t *p; - for (i = 0; i < ST->NumberOfTableEntries; i++) { - if (!memcmp(&ST->ConfigurationTable[i].VendorGuid, - &sal, sizeof(EFI_GUID))) - saltab = ST->ConfigurationTable[i].VendorTable; - } - - if (!saltab) { + saltab = efi_get_table(&sal); + if (saltab == NULL) { printf("Can't find SAL System Table\n"); return; } @@ -336,13 +331,8 @@ command_sal(int argc, char *argv[]) }; u_int8_t *p; - for (i = 0; i < ST->NumberOfTableEntries; i++) { - if (!memcmp(&ST->ConfigurationTable[i].VendorGuid, - &sal, sizeof(EFI_GUID))) - saltab = ST->ConfigurationTable[i].VendorTable; - } - - if (!saltab) { + saltab = efi_get_table(&sal); + if (saltab == NULL) { printf("Can't find SAL System Table\n"); return CMD_ERROR; } diff --git a/sys/boot/efi/loader/version b/sys/boot/efi/loader/version index 9ef0fcb..71f9400 100644 --- a/sys/boot/efi/loader/version +++ b/sys/boot/efi/loader/version @@ -3,6 +3,8 @@ $FreeBSD$ NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE. The format of this file is important. Make sure the current version number is on line 6. +1.1: Pass the HCDP table address to the kernel via bootinfo if one + is present in the EFI system table. 1.0: Don't map the I/O port range. We expect the kernel to do it. It was done in the loader as a debugging aid and not intended as a service/feature. diff --git a/sys/boot/ia64/common/bootinfo.c b/sys/boot/ia64/common/bootinfo.c index 484f226..def4bfb 100644 --- a/sys/boot/ia64/common/bootinfo.c +++ b/sys/boot/ia64/common/bootinfo.c @@ -39,6 +39,8 @@ #include "bootstrap.h" +static EFI_GUID hcdp = HCDP_TABLE_GUID; + /* * Return a 'boothowto' value corresponding to the kernel arguments in * (kargs) and any relevant environment variables. @@ -300,6 +302,7 @@ bi_load(struct bootinfo *bi, struct preloaded_file *fp, UINTN *mapkey, bi->bi_symtab = ssym; bi->bi_esymtab = esym; + bi->bi_hcdp = (uint64_t)efi_get_table(&hcdp); /* DIG64 HCDP table addr. */ fpswa_init(&bi->bi_fpswa); /* find FPSWA interface */ /* find the last module in the chain */ diff --git a/sys/boot/ia64/efi/main.c b/sys/boot/ia64/efi/main.c index 51ac572..82979e2 100644 --- a/sys/boot/ia64/efi/main.c +++ b/sys/boot/ia64/efi/main.c @@ -72,13 +72,8 @@ find_pal_proc(void) }; u_int8_t *p; - for (i = 0; i < ST->NumberOfTableEntries; i++) { - if (!memcmp(&ST->ConfigurationTable[i].VendorGuid, - &sal, sizeof(EFI_GUID))) - saltab = ST->ConfigurationTable[i].VendorTable; - } - - if (!saltab) { + saltab = efi_get_table(&sal); + if (saltab == NULL) { printf("Can't find SAL System Table\n"); return; } @@ -336,13 +331,8 @@ command_sal(int argc, char *argv[]) }; u_int8_t *p; - for (i = 0; i < ST->NumberOfTableEntries; i++) { - if (!memcmp(&ST->ConfigurationTable[i].VendorGuid, - &sal, sizeof(EFI_GUID))) - saltab = ST->ConfigurationTable[i].VendorTable; - } - - if (!saltab) { + saltab = efi_get_table(&sal); + if (saltab == NULL) { printf("Can't find SAL System Table\n"); return CMD_ERROR; } diff --git a/sys/boot/ia64/efi/version b/sys/boot/ia64/efi/version index 9ef0fcb..71f9400 100644 --- a/sys/boot/ia64/efi/version +++ b/sys/boot/ia64/efi/version @@ -3,6 +3,8 @@ $FreeBSD$ NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE. The format of this file is important. Make sure the current version number is on line 6. +1.1: Pass the HCDP table address to the kernel via bootinfo if one + is present in the EFI system table. 1.0: Don't map the I/O port range. We expect the kernel to do it. It was done in the loader as a debugging aid and not intended as a service/feature. |