diff options
-rw-r--r-- | arch/arm/dts/rk3288-evb.dtsi | 2 | ||||
-rw-r--r-- | arch/arm/dts/rk3288-firefly.dtsi | 2 | ||||
-rw-r--r-- | arch/arm/dts/rk3288-tinker.dtsi | 2 | ||||
-rw-r--r-- | arch/arm/dts/rk3288-veyron.dtsi | 2 | ||||
-rw-r--r-- | arch/arm/dts/rk3288.dtsi | 2 | ||||
-rw-r--r-- | arch/arm/dts/rk3328.dtsi | 2 | ||||
-rw-r--r-- | arch/arm/dts/rk3399-puma.dtsi | 2 | ||||
-rw-r--r-- | arch/arm/dts/rk3399.dtsi | 4 | ||||
-rw-r--r-- | arch/x86/cpu/efi/payload.c | 119 | ||||
-rw-r--r-- | arch/x86/include/asm/bootparam.h | 1 | ||||
-rw-r--r-- | arch/x86/include/asm/zimage.h | 1 | ||||
-rw-r--r-- | arch/x86/lib/zimage.c | 9 | ||||
-rw-r--r-- | drivers/usb/host/dwc2.c | 37 | ||||
-rw-r--r-- | drivers/usb/host/ehci-generic.c | 56 | ||||
-rw-r--r-- | drivers/usb/host/ehci-hcd.c | 66 | ||||
-rw-r--r-- | drivers/usb/host/ehci-pci.c | 31 | ||||
-rw-r--r-- | drivers/usb/host/ehci.h | 5 | ||||
-rw-r--r-- | include/configs/x86-common.h | 2 | ||||
-rw-r--r-- | include/efi.h | 13 | ||||
-rw-r--r-- | include/generic-phy.h | 1 | ||||
-rw-r--r-- | lib/efi/efi_stub.c | 4 |
21 files changed, 281 insertions, 82 deletions
diff --git a/arch/arm/dts/rk3288-evb.dtsi b/arch/arm/dts/rk3288-evb.dtsi index 17c79d3c27..ce75bd5d28 100644 --- a/arch/arm/dts/rk3288-evb.dtsi +++ b/arch/arm/dts/rk3288-evb.dtsi @@ -19,8 +19,6 @@ keys: gpio-keys { compatible = "gpio-keys"; - #address-cells = <1>; - #size-cells = <0>; button@0 { gpio-key,wakeup = <1>; diff --git a/arch/arm/dts/rk3288-firefly.dtsi b/arch/arm/dts/rk3288-firefly.dtsi index de5e8f2e8d..2239ab9f59 100644 --- a/arch/arm/dts/rk3288-firefly.dtsi +++ b/arch/arm/dts/rk3288-firefly.dtsi @@ -25,8 +25,6 @@ keys: gpio-keys { compatible = "gpio-keys"; - #address-cells = <1>; - #size-cells = <0>; button@0 { gpio-key,wakeup = <1>; diff --git a/arch/arm/dts/rk3288-tinker.dtsi b/arch/arm/dts/rk3288-tinker.dtsi index a752458663..2f816af47f 100644 --- a/arch/arm/dts/rk3288-tinker.dtsi +++ b/arch/arm/dts/rk3288-tinker.dtsi @@ -55,8 +55,6 @@ gpio-keys { compatible = "gpio-keys"; - #address-cells = <1>; - #size-cells = <0>; autorepeat; pinctrl-names = "default"; diff --git a/arch/arm/dts/rk3288-veyron.dtsi b/arch/arm/dts/rk3288-veyron.dtsi index 4b66f6be3c..92b68878fd 100644 --- a/arch/arm/dts/rk3288-veyron.dtsi +++ b/arch/arm/dts/rk3288-veyron.dtsi @@ -83,8 +83,6 @@ gpio_keys: gpio-keys { compatible = "gpio-keys"; - #address-cells = <1>; - #size-cells = <0>; pinctrl-names = "default"; pinctrl-0 = <&pwr_key_h>; diff --git a/arch/arm/dts/rk3288.dtsi b/arch/arm/dts/rk3288.dtsi index 9f3f6f5051..273d38c84f 100644 --- a/arch/arm/dts/rk3288.dtsi +++ b/arch/arm/dts/rk3288.dtsi @@ -841,8 +841,6 @@ #size-cells = <0>; status = "disabled"; ports { - #address-cells = <1>; - #size-cells = <0>; reg = <1>; mipi_in: port { #address-cells = <1>; diff --git a/arch/arm/dts/rk3328.dtsi b/arch/arm/dts/rk3328.dtsi index 6095a124b0..2d80addbb0 100644 --- a/arch/arm/dts/rk3328.dtsi +++ b/arch/arm/dts/rk3328.dtsi @@ -189,8 +189,6 @@ u-boot,dm-pre-reloc; compatible = "rockchip,rk3328-grf", "syscon", "simple-mfd"; reg = <0x0 0xff100000 0x0 0x1000>; - #address-cells = <1>; - #size-cells = <1>; io_domains: io-domains { compatible = "rockchip,rk3328-io-voltage-domain"; diff --git a/arch/arm/dts/rk3399-puma.dtsi b/arch/arm/dts/rk3399-puma.dtsi index 35840319ff..6e7e1e3528 100644 --- a/arch/arm/dts/rk3399-puma.dtsi +++ b/arch/arm/dts/rk3399-puma.dtsi @@ -208,8 +208,6 @@ }; &hdmi { - #address-cells = <1>; - #size-cells = <0>; #sound-dai-cells = <0>; status = "okay"; }; diff --git a/arch/arm/dts/rk3399.dtsi b/arch/arm/dts/rk3399.dtsi index 83c257b122..a55a6c6eb9 100644 --- a/arch/arm/dts/rk3399.dtsi +++ b/arch/arm/dts/rk3399.dtsi @@ -1015,8 +1015,6 @@ u-boot,dm-pre-reloc; compatible = "rockchip,rk3399-pmugrf", "syscon", "simple-mfd"; reg = <0x0 0xff320000 0x0 0x1000>; - #address-cells = <1>; - #size-cells = <1>; pmu_io_domains: io-domains { compatible = "rockchip,rk3399-pmu-io-voltage-domain"; @@ -1493,8 +1491,6 @@ #size-cells = <0>; status = "disabled"; ports { - #address-cells = <1>; - #size-cells = <0>; reg = <1>; mipi_in: port { #address-cells = <1>; diff --git a/arch/x86/cpu/efi/payload.c b/arch/x86/cpu/efi/payload.c index 4649bfe86e..c323c7b19a 100644 --- a/arch/x86/cpu/efi/payload.c +++ b/arch/x86/cpu/efi/payload.c @@ -8,6 +8,8 @@ #include <efi.h> #include <errno.h> #include <usb.h> +#include <asm/bootparam.h> +#include <asm/e820.h> #include <asm/post.h> DECLARE_GLOBAL_DATA_PTR; @@ -168,3 +170,120 @@ int last_stage_init(void) return 0; } + +unsigned int install_e820_map(unsigned int max_entries, + struct e820_entry *entries) +{ + struct efi_mem_desc *desc, *end; + struct efi_entry_memmap *map; + int size, ret; + efi_physical_addr_t last_end_addr = 0; + struct e820_entry *last_entry = NULL; + __u32 e820_type; + unsigned int num_entries = 0; + + ret = efi_info_get(EFIET_MEMORY_MAP, (void **)&map, &size); + if (ret) { + printf("Cannot find EFI memory map tables, ret=%d\n", ret); + + return -ENODEV; + } + + end = (struct efi_mem_desc *)((ulong)map + size); + for (desc = map->desc; desc < end; + desc = efi_get_next_mem_desc(map, desc)) { + if (desc->num_pages == 0) + continue; + + switch (desc->type) { + case EFI_LOADER_CODE: + case EFI_LOADER_DATA: + case EFI_BOOT_SERVICES_CODE: + case EFI_BOOT_SERVICES_DATA: + case EFI_CONVENTIONAL_MEMORY: + e820_type = E820_RAM; + break; + + case EFI_RESERVED_MEMORY_TYPE: + case EFI_RUNTIME_SERVICES_CODE: + case EFI_RUNTIME_SERVICES_DATA: + case EFI_MMAP_IO: + case EFI_MMAP_IO_PORT: + case EFI_PAL_CODE: + e820_type = E820_RESERVED; + break; + + case EFI_ACPI_RECLAIM_MEMORY: + e820_type = E820_ACPI; + break; + + case EFI_ACPI_MEMORY_NVS: + e820_type = E820_NVS; + break; + + case EFI_UNUSABLE_MEMORY: + e820_type = E820_UNUSABLE; + break; + + default: + printf("Invalid EFI memory descriptor type (0x%x)!\n", + desc->type); + continue; + } + + if (last_entry != NULL && last_entry->type == e820_type && + desc->physical_start == last_end_addr) { + last_entry->size += (desc->num_pages << EFI_PAGE_SHIFT); + last_end_addr += (desc->num_pages << EFI_PAGE_SHIFT); + } else { + if (num_entries >= E820MAX) + break; + + entries[num_entries].addr = desc->physical_start; + entries[num_entries].size = desc->num_pages; + entries[num_entries].size <<= EFI_PAGE_SHIFT; + entries[num_entries].type = e820_type; + last_entry = &entries[num_entries]; + last_end_addr = last_entry->addr + last_entry->size; + num_entries++; + } + } + + return num_entries; +} + +void setup_efi_info(struct efi_info *efi_info) +{ + struct efi_entry_systable *table; + struct efi_entry_memmap *map; + char *signature; + int size, ret; + + memset(efi_info, 0, sizeof(struct efi_info)); + + ret = efi_info_get(EFIET_SYS_TABLE, (void **)&table, &size); + if (ret) { + printf("Cannot find EFI system table, ret=%d\n", ret); + return; + } + efi_info->efi_systab = (u32)(table->sys_table); + + ret = efi_info_get(EFIET_MEMORY_MAP, (void **)&map, &size); + if (ret) { + printf("Cannot find EFI memory map tables, ret=%d\n", ret); + return; + } + efi_info->efi_memdesc_size = map->desc_size; + efi_info->efi_memdesc_version = map->version; + efi_info->efi_memmap = (u32)(map->desc); + efi_info->efi_memmap_size = size - sizeof(struct efi_entry_memmap); + +#ifdef CONFIG_EFI_STUB_64BIT + efi_info->efi_systab_hi = table->sys_table >> 32; + efi_info->efi_memmap_hi = (u64)(u32)(map->desc) >> 32; + signature = EFI64_LOADER_SIGNATURE; +#else + signature = EFI32_LOADER_SIGNATURE; +#endif + memcpy(&efi_info->efi_loader_signature, signature, 4); +} diff --git a/arch/x86/include/asm/bootparam.h b/arch/x86/include/asm/bootparam.h index 0386cbeca5..dfbd4b4bba 100644 --- a/arch/x86/include/asm/bootparam.h +++ b/arch/x86/include/asm/bootparam.h @@ -69,7 +69,6 @@ struct setup_header { __u64 pref_address; __u32 init_size; __u32 handover_offset; - __u64 acpi_rsdp_addr; } __attribute__((packed)); struct sys_desc_table { diff --git a/arch/x86/include/asm/zimage.h b/arch/x86/include/asm/zimage.h index 03bed54d0b..80e128ccf3 100644 --- a/arch/x86/include/asm/zimage.h +++ b/arch/x86/include/asm/zimage.h @@ -35,5 +35,6 @@ struct boot_params *load_zimage(char *image, unsigned long kernel_size, int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot, unsigned long initrd_addr, unsigned long initrd_size); void setup_video(struct screen_info *screen_info); +void setup_efi_info(struct efi_info *efi_info); #endif diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c index 04ed972482..230b38e938 100644 --- a/arch/x86/lib/zimage.c +++ b/arch/x86/lib/zimage.c @@ -287,14 +287,13 @@ int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot, hdr->hardware_subarch = X86_SUBARCH_INTEL_MID; #endif -#ifdef CONFIG_GENERATE_ACPI_TABLE - if (bootproto >= 0x020e) - hdr->acpi_rsdp_addr = acpi_get_rsdp_addr(); -#endif - setup_device_tree(hdr, (const void *)env_get_hex("fdtaddr", 0)); setup_video(&setup_base->screen_info); +#ifdef CONFIG_EFI_STUB + setup_efi_info(&setup_base->efi_info); +#endif + return 0; } diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c index cbe065bbaf..b6f008a400 100644 --- a/drivers/usb/host/dwc2.c +++ b/drivers/usb/host/dwc2.c @@ -15,6 +15,7 @@ #include <wait_bit.h> #include <asm/io.h> #include <power/regulator.h> +#include <reset.h> #include "dwc2.h" @@ -49,6 +50,8 @@ struct dwc2_priv { */ bool hnp_srp_disable; bool oc_disable; + + struct reset_ctl_bulk resets; }; #ifndef CONFIG_DM_USB @@ -1124,11 +1127,43 @@ int _submit_int_msg(struct dwc2_priv *priv, struct usb_device *dev, } } +static int dwc2_reset(struct udevice *dev) +{ + int ret; + struct dwc2_priv *priv = dev_get_priv(dev); + + ret = reset_get_bulk(dev, &priv->resets); + if (ret) { + dev_warn(dev, "Can't get reset: %d\n", ret); + /* Return 0 if error due to !CONFIG_DM_RESET and reset + * DT property is not present. + */ + if (ret == -ENOENT || ret == -ENOTSUPP) + return 0; + else + return ret; + } + + ret = reset_deassert_bulk(&priv->resets); + if (ret) { + reset_release_bulk(&priv->resets); + dev_err(dev, "Failed to reset: %d\n", ret); + return ret; + } + + return 0; +} + static int dwc2_init_common(struct udevice *dev, struct dwc2_priv *priv) { struct dwc2_core_regs *regs = priv->regs; uint32_t snpsid; int i, j; + int ret; + + ret = dwc2_reset(dev); + if (ret) + return ret; snpsid = readl(®s->gsnpsid); dev_info(dev, "Core Release: %x.%03x\n", @@ -1303,6 +1338,8 @@ static int dwc2_usb_remove(struct udevice *dev) dwc2_uninit_common(priv->regs); + reset_release_bulk(&priv->resets); + return 0; } diff --git a/drivers/usb/host/ehci-generic.c b/drivers/usb/host/ehci-generic.c index 5a56f66cfa..cc2f33826a 100644 --- a/drivers/usb/host/ehci-generic.c +++ b/drivers/usb/host/ehci-generic.c @@ -26,56 +26,6 @@ struct generic_ehci { int reset_count; }; -static int ehci_setup_phy(struct udevice *dev, int index) -{ - struct generic_ehci *priv = dev_get_priv(dev); - int ret; - - ret = generic_phy_get_by_index(dev, index, &priv->phy); - if (ret) { - if (ret != -ENOENT) { - dev_err(dev, "failed to get usb phy\n"); - return ret; - } - } else { - ret = generic_phy_init(&priv->phy); - if (ret) { - dev_err(dev, "failed to init usb phy\n"); - return ret; - } - - ret = generic_phy_power_on(&priv->phy); - if (ret) { - dev_err(dev, "failed to power on usb phy\n"); - return generic_phy_exit(&priv->phy); - } - } - - return 0; -} - -static int ehci_shutdown_phy(struct udevice *dev) -{ - struct generic_ehci *priv = dev_get_priv(dev); - int ret = 0; - - if (generic_phy_valid(&priv->phy)) { - ret = generic_phy_power_off(&priv->phy); - if (ret) { - dev_err(dev, "failed to power off usb phy\n"); - return ret; - } - - ret = generic_phy_exit(&priv->phy); - if (ret) { - dev_err(dev, "failed to power off usb phy\n"); - return ret; - } - } - - return 0; -} - static int ehci_usb_probe(struct udevice *dev) { struct generic_ehci *priv = dev_get_priv(dev); @@ -145,7 +95,7 @@ static int ehci_usb_probe(struct udevice *dev) } } - err = ehci_setup_phy(dev, 0); + err = ehci_setup_phy(dev, &priv->phy, 0); if (err) goto reset_err; @@ -160,7 +110,7 @@ static int ehci_usb_probe(struct udevice *dev) return 0; phy_err: - ret = ehci_shutdown_phy(dev); + ret = ehci_shutdown_phy(dev, &priv->phy); if (ret) dev_err(dev, "failed to shutdown usb phy\n"); @@ -185,7 +135,7 @@ static int ehci_usb_remove(struct udevice *dev) if (ret) return ret; - ret = ehci_shutdown_phy(dev); + ret = ehci_shutdown_phy(dev, &priv->phy); if (ret) return ret; diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 663f748ffc..199b3a8b26 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -1675,3 +1675,69 @@ struct dm_usb_ops ehci_usb_ops = { }; #endif + +#ifdef CONFIG_PHY +int ehci_setup_phy(struct udevice *dev, struct phy *phy, int index) +{ + int ret; + + if (!phy) + return 0; + + ret = generic_phy_get_by_index(dev, index, phy); + if (ret) { + if (ret != -ENOENT) { + dev_err(dev, "failed to get usb phy\n"); + return ret; + } + } else { + ret = generic_phy_init(phy); + if (ret) { + dev_err(dev, "failed to init usb phy\n"); + return ret; + } + + ret = generic_phy_power_on(phy); + if (ret) { + dev_err(dev, "failed to power on usb phy\n"); + return generic_phy_exit(phy); + } + } + + return 0; +} + +int ehci_shutdown_phy(struct udevice *dev, struct phy *phy) +{ + int ret = 0; + + if (!phy) + return 0; + + if (generic_phy_valid(phy)) { + ret = generic_phy_power_off(phy); + if (ret) { + dev_err(dev, "failed to power off usb phy\n"); + return ret; + } + + ret = generic_phy_exit(phy); + if (ret) { + dev_err(dev, "failed to power off usb phy\n"); + return ret; + } + } + + return 0; +} +#else +int ehci_setup_phy(struct udevice *dev, struct phy *phy, int index) +{ + return 0; +} + +int ehci_shutdown_phy(struct udevice *dev, struct phy *phy) +{ + return 0; +} +#endif diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index a56e5bd144..6150f3d888 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c @@ -16,17 +16,23 @@ /* Information about a USB port */ struct ehci_pci_priv { struct ehci_ctrl ehci; + struct phy phy; }; #ifdef CONFIG_DM_USB - -static void ehci_pci_init(struct udevice *dev, struct ehci_hccr **ret_hccr, +static int ehci_pci_init(struct udevice *dev, struct ehci_hccr **ret_hccr, struct ehci_hcor **ret_hcor) { + struct ehci_pci_priv *priv = dev_get_priv(dev); struct ehci_hccr *hccr; struct ehci_hcor *hcor; + int ret; u32 cmd; + ret = ehci_setup_phy(dev, &priv->phy, 0); + if (ret) + return ret; + hccr = (struct ehci_hccr *)dm_pci_map_bar(dev, PCI_BASE_ADDRESS_0, PCI_REGION_MEM); hcor = (struct ehci_hcor *)((uintptr_t) hccr + @@ -43,6 +49,8 @@ static void ehci_pci_init(struct udevice *dev, struct ehci_hccr **ret_hccr, dm_pci_read_config32(dev, PCI_COMMAND, &cmd); cmd |= PCI_COMMAND_MASTER; dm_pci_write_config32(dev, PCI_COMMAND, cmd); + + return 0; } #else @@ -120,12 +128,27 @@ static int ehci_pci_probe(struct udevice *dev) { struct ehci_hccr *hccr; struct ehci_hcor *hcor; + int ret; - ehci_pci_init(dev, &hccr, &hcor); + ret = ehci_pci_init(dev, &hccr, &hcor); + if (ret) + return ret; return ehci_register(dev, hccr, hcor, NULL, 0, USB_INIT_HOST); } +static int ehci_pci_remove(struct udevice *dev) +{ + struct ehci_pci_priv *priv = dev_get_priv(dev); + int ret; + + ret = ehci_deregister(dev); + if (ret) + return ret; + + return ehci_shutdown_phy(dev, &priv->phy); +} + static const struct udevice_id ehci_pci_ids[] = { { .compatible = "ehci-pci" }, { } @@ -135,7 +158,7 @@ U_BOOT_DRIVER(ehci_pci) = { .name = "ehci_pci", .id = UCLASS_USB, .probe = ehci_pci_probe, - .remove = ehci_deregister, + .remove = ehci_pci_remove, .of_match = ehci_pci_ids, .ops = &ehci_usb_ops, .platdata_auto_alloc_size = sizeof(struct usb_platdata), diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index 07de472f91..7945016624 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h @@ -9,6 +9,7 @@ #define USB_EHCI_H #include <usb.h> +#include <generic-phy.h> /* Section 2.2.3 - N_PORTS */ #define MAX_HC_PORTS 15 @@ -288,4 +289,8 @@ int ehci_register(struct udevice *dev, struct ehci_hccr *hccr, int ehci_deregister(struct udevice *dev); extern struct dm_usb_ops ehci_usb_ops; +/* EHCI PHY functions */ +int ehci_setup_phy(struct udevice *dev, struct phy *phy, int index); +int ehci_shutdown_phy(struct udevice *dev, struct phy *phy); + #endif /* USB_EHCI_H */ diff --git a/include/configs/x86-common.h b/include/configs/x86-common.h index cc621cb942..f0b027e69c 100644 --- a/include/configs/x86-common.h +++ b/include/configs/x86-common.h @@ -107,7 +107,7 @@ #define CONFIG_BOOTFILE "bzImage" #define CONFIG_LOADADDR 0x1000000 #define CONFIG_RAMDISK_ADDR 0x4000000 -#ifdef CONFIG_GENERATE_ACPI_TABLE +#if defined(CONFIG_GENERATE_ACPI_TABLE) || defined(CONFIG_EFI_STUB) #define CONFIG_OTHBOOTARGS "othbootargs=\0" #else #define CONFIG_OTHBOOTARGS "othbootargs=acpi=off\0" diff --git a/include/efi.h b/include/efi.h index 7e7c1cafc2..e1854ecd23 100644 --- a/include/efi.h +++ b/include/efi.h @@ -41,6 +41,9 @@ #define efi_va_end va_end #endif /* __x86_64__ */ +#define EFI32_LOADER_SIGNATURE "EL32" +#define EFI64_LOADER_SIGNATURE "EL64" + struct efi_device_path; typedef struct { @@ -248,6 +251,7 @@ enum efi_entry_t { EFIET_END, /* Signals this is the last (empty) entry */ EFIET_MEMORY_MAP, EFIET_GOP_MODE, + EFIET_SYS_TABLE, /* Number of entries */ EFIET_MEMORY_COUNT, @@ -338,6 +342,15 @@ struct efi_entry_gopmode { } info[]; }; +/** + * struct efi_entry_systable - system table passed to U-Boot + * + * @sys_table: EFI system table address + */ +struct efi_entry_systable { + efi_physical_addr_t sys_table; +}; + static inline struct efi_mem_desc *efi_get_next_mem_desc( struct efi_entry_memmap *map, struct efi_mem_desc *desc) { diff --git a/include/generic-phy.h b/include/generic-phy.h index 3d26249fae..947c582f68 100644 --- a/include/generic-phy.h +++ b/include/generic-phy.h @@ -7,6 +7,7 @@ #ifndef __GENERIC_PHY_H #define __GENERIC_PHY_H +struct ofnode_phandle_args; /** * struct phy - A handle to (allowing control of) a single phy port. diff --git a/lib/efi/efi_stub.c b/lib/efi/efi_stub.c index 1b495ec81b..12e3d637dd 100644 --- a/lib/efi/efi_stub.c +++ b/lib/efi/efi_stub.c @@ -277,6 +277,7 @@ efi_status_t EFIAPI efi_main(efi_handle_t image, struct efi_entry_memmap map; struct efi_gop *gop; struct efi_entry_gopmode mode; + struct efi_entry_systable table; efi_guid_t efi_gop_guid = EFI_GOP_GUID; efi_uintn_t key, desc_size, size; efi_status_t ret; @@ -335,6 +336,9 @@ efi_status_t EFIAPI efi_main(efi_handle_t image, return ret; } + table.sys_table = (ulong)sys_table; + add_entry_addr(priv, EFIET_SYS_TABLE, &table, sizeof(table), NULL, 0); + ret = boot->exit_boot_services(image, key); if (ret) { /* |