From 2be007da2ca5cac1127a428f59d5e9026d176202 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Tue, 22 Nov 2016 15:12:34 -0800 Subject: [PATCH] efi - Add EFI run-time ABI support (2) * Files forgotten in last commit. Fix ABI (microsoft call ABI is used for EFI direct calls). --- sys/platform/pc64/x86_64/machdep.c | 2 ++ sys/sys/efi.h | 30 +++++++++++++++++++----------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/sys/platform/pc64/x86_64/machdep.c b/sys/platform/pc64/x86_64/machdep.c index 5b6fdc62cc..c22acb6463 100644 --- a/sys/platform/pc64/x86_64/machdep.c +++ b/sys/platform/pc64/x86_64/machdep.c @@ -163,6 +163,7 @@ extern vm_offset_t ksym_start, ksym_end; struct privatespace CPU_prvspace_bsp __aligned(4096); struct privatespace *CPU_prvspace[MAXCPU] = { &CPU_prvspace_bsp }; +vm_paddr_t efi_systbl_phys; int _udatasel, _ucodesel, _ucode32sel; u_long atdevbase; int64_t tsc_offsets[MAXCPU]; @@ -2244,6 +2245,7 @@ hammer_time(u_int64_t modulep, u_int64_t physfree) ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t); ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t); #endif + efi_systbl_phys = MD_FETCH(kmdp, MODINFOMD_FW_HANDLE, vm_paddr_t); if (boothowto & RB_VERBOSE) bootverbose++; diff --git a/sys/sys/efi.h b/sys/sys/efi.h index b9b6fad5da..946b191fcb 100644 --- a/sys/sys/efi.h +++ b/sys/sys/efi.h @@ -116,24 +116,32 @@ struct efi_tblhdr { uint32_t __res; }; +#define EFIABI __attribute__((ms_abi)) + struct efi_rt { struct efi_tblhdr rt_hdr; - efi_status (*rt_gettime)(struct efi_tm *, struct efi_tmcap *); - efi_status (*rt_settime)(struct efi_tm *); + efi_status (*rt_gettime)(struct efi_tm *, struct efi_tmcap *) + EFIABI; + efi_status (*rt_settime)(struct efi_tm *) + EFIABI; efi_status (*rt_getwaketime)(uint8_t *, uint8_t *, - struct efi_tm *); - efi_status (*rt_setwaketime)(uint8_t, struct efi_tm *); + struct efi_tm *) EFIABI; + efi_status (*rt_setwaketime)(uint8_t, struct efi_tm *) + EFIABI; efi_status (*rt_setvirtual)(u_long, u_long, uint32_t, - struct efi_md *); - efi_status (*rt_cvtptr)(u_long, void **); + struct efi_md *) EFIABI; + efi_status (*rt_cvtptr)(u_long, void **) + EFIABI; efi_status (*rt_getvar)(efi_char *, struct uuid *, uint32_t *, - u_long *, void *); - efi_status (*rt_scanvar)(u_long *, efi_char *, struct uuid *); + u_long *, void *) EFIABI; + efi_status (*rt_scanvar)(u_long *, efi_char *, struct uuid *) + EFIABI; efi_status (*rt_setvar)(efi_char *, struct uuid *, uint32_t, - u_long, void *); - efi_status (*rt_gethicnt)(uint32_t *); + u_long, void *) EFIABI; + efi_status (*rt_gethicnt)(uint32_t *) + EFIABI; efi_status (*rt_reset)(enum efi_reset, efi_status, u_long, - efi_char *); + efi_char *) EFIABI; }; struct efi_systbl { -- 2.41.0