#include <sys/param.h>
#include <efi.h>
#include <efiapi.h>
#include "libsa.h"
#include "efiboot.h"
extern EFI_BOOT_SERVICES *BS;
#define RISCV_EFI_BOOT_PROTOCOL_GUID \
{ 0xccd15fec, 0x6f73, 0x4eec, { 0x83, 0x95, 0x3e, 0x69, 0xe4, 0xb9, 0x40, 0xbf } }
INTERFACE_DECL(_RISCV_EFI_BOOT_PROTOCOL);
typedef
EFI_STATUS
(EFIAPI *EFI_GET_BOOT_HARTID) (
IN struct _RISCV_EFI_BOOT_PROTOCOL *This,
OUT UINTN *BootHartId
);
typedef struct _RISCV_EFI_BOOT_PROTOCOL {
UINT64 Revision;
EFI_GET_BOOT_HARTID GetBootHartId;
} RISCV_EFI_BOOT_PROTOCOL;
static EFI_GUID riscv_guid = RISCV_EFI_BOOT_PROTOCOL_GUID;
int32_t
efi_get_boot_hart_id(void)
{
EFI_STATUS status;
RISCV_EFI_BOOT_PROTOCOL *riscv = NULL;
UINTN hartid;
status = BS->LocateProtocol(&riscv_guid, NULL, (void **)&riscv);
if (riscv == NULL || EFI_ERROR(status))
return -1;
status = riscv->GetBootHartId(riscv, &hartid);
if (status == EFI_SUCCESS)
return hartid;
return -1;
}