summaryrefslogtreecommitdiffstats
path: root/sys/boot/efi
diff options
context:
space:
mode:
Diffstat (limited to 'sys/boot/efi')
-rw-r--r--sys/boot/efi/include/efilib.h1
-rw-r--r--sys/boot/efi/libefi/bootinfo.c3
-rw-r--r--sys/boot/efi/libefi/libefi.c14
-rw-r--r--sys/boot/efi/loader/main.c18
-rw-r--r--sys/boot/efi/loader/version2
5 files changed, 24 insertions, 14 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.
OpenPOWER on IntegriCloud