On Wed, Sep 07, 2022 at 09:32:12AM +0000, Chang, Abner wrote: > [AMD Official Use Only - General] > > Hi Sunil and UefiCpuPkg maintainers, > For CpuDxe case, I think we should abstract CpuDxe to accommodate all > processor architectures instead of having copy for each archs. CpuDxeCommon.c > can have the generic protocol structure and the installation functions, and > CpuDxeCommon.h has the general definitions. So does CpuMp related files. Move > processor architecture dependent files to under arch folders. AMD may have > some differences with Intel so we will have CpuDxeAmd.inf under CpuDxe\. AMD > is revising SmmFeatureCpuLib base on the similar concept. I think this makes > the module looks simple and architectural. Furthermore, the similar concept > should apply to all modules (if necessary) under UefiCpuPkg. > I think we should revise CpuDxe before adding new arch such as RISC-V and > Loongson64 to this module. Thanks Abner!. I have sent V2 in the current form itself since I had to move DSC to OvmfPkg instead of edk2-platforms.
I am not sure whether we really need this level of restructuring since I didn't find much to share between architectures. Thats why, I just made current sources as x86 speicifc and added RISC-V sources. Anyway, let me wait for maintainers feedback. Do you have a patch already for this restructuring? If so, I can rebase RISC-V changes on top of it if maintainers accept the approach. Thanks Sunil > > Here is a BZ for UefiCpuPkg rearchitecture, > https://bugzilla.tianocore.org/show_bug.cgi?id=3860 > > Abner > > Something looks like below, > CpuDxe\X86\Ia32\ > \IA32\CpuAsm.asm > \IA32\PageAttribute.c > \X86\X64\ > \X64\CpuAsm.asm > \X64\PageAttribute.c > \X86\CpuGdt.c > \CpuGdt.h > \CpuPageTable.C > \CpuPageTableh.h > \CpuDxe.c > \RISCV\RISCV64\ > \RISCV64\CpuDxe.h > \CpuDxe.c > \ARM\ARM\ > \AARCH64\ > \CpuDxe.c > \CpuDxeCommon.c > \CpuMpCommon.c > \CpuDxeCommon.h > \CpuMpCommon.h > \CpuDxe.inf > > > > -----Original Message----- > > From: Sunil V L <suni...@ventanamicro.com> > > Sent: Wednesday, September 7, 2022 1:09 AM > > To: devel@edk2.groups.io > > Cc: Jian J Wang <jian.j.w...@intel.com>; Liming Gao > > <gaolim...@byosoft.com.cn>; Eric Dong <eric.d...@intel.com>; Ray Ni > > <ray...@intel.com>; Rahul Kumar <rahul1.ku...@intel.com>; Debkumar De > > <debkumar...@intel.com>; Catharine West <catharine.w...@intel.com>; > > Daniel Schaefer <g...@danielschaefer.me>; Chang, Abner > > <abner.ch...@amd.com>; Leif Lindholm <quic_llind...@quicinc.com>; Ard > > Biesheuvel <a...@kernel.org>; Heinrich Schuchardt > > <heinrich.schucha...@canonical.com>; Anup Patel > > <apa...@ventanamicro.com>; Sunil V L <suni...@ventanamicro.com> > > Subject: [RFC PATCH 16/17] UefiCpuPkg/CpuDxe: Add RISC-V support in > > CpuDxe module > > > > [CAUTION: External Email] > > > > This DXE module initializes the RISC-V CPU by installing the CPU specific > > ARCH > > protocol handlers. This also initializes the RISCV_EFI_BOOT_PROTOCOL which > > is required on RISC-V platforms. > > > > Signed-off-by: Sunil V L <suni...@ventanamicro.com> > > --- > > UefiCpuPkg/CpuDxe/CpuDxe.inf | 16 +- > > UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.c | 337 > > +++++++++++++++++++++++++++++ > > UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.h | 200 +++++++++++++++++ > > 3 files changed, 552 insertions(+), 1 deletion(-) create mode 100644 > > UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.c > > create mode 100644 UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.h > > > > diff --git a/UefiCpuPkg/CpuDxe/CpuDxe.inf > > b/UefiCpuPkg/CpuDxe/CpuDxe.inf index 4f2ea42f16..17cf2b1ecd 100644 > > --- a/UefiCpuPkg/CpuDxe/CpuDxe.inf > > +++ b/UefiCpuPkg/CpuDxe/CpuDxe.inf > > @@ -1,8 +1,12 @@ > > ## @file > > > > -# CPU driver installs CPU Architecture Protocol and CPU MP protocol. > > > > +# On X86, CPU driver installs CPU Architecture Protocol and CPU MP > > protocol. > > > > +# > > > > +# On RISC-V, CPU driver installs CPU Architecture Protocol and RISC-V > > +boot > > > > +# protocol > > > > # > > > > # Copyright (c) 2008 - 2019, Intel Corporation. All rights reserved.<BR> > > > > # Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> > > > > +# Copyright (c) 2022, Ventana Micro Systems Inc. All rights > > +reserved.<BR> > > > > # > > > > # SPDX-License-Identifier: BSD-2-Clause-Patent > > > > # > > > > @@ -44,6 +48,9 @@ > > MtrrLib > > > > UefiCpuLib > > > > > > > > +[LibraryClasses.RISCV64] > > > > + RiscVSbiLib > > > > + > > > > [Sources.IA32, Sources.X64] > > > > CpuDxe.c > > > > CpuDxe.h > > > > @@ -62,11 +69,18 @@ > > X64/CpuAsm.nasm > > > > X64/PagingAttribute.c > > > > > > > > +[Sources.RISCV64] > > > > + RiscV64/CpuDxe.c > > > > + RiscV64/CpuDxe.h > > > > + > > > > [Protocols] > > > > gEfiCpuArchProtocolGuid ## PRODUCES > > > > gEfiMpServiceProtocolGuid ## PRODUCES > > > > gEfiSmmBase2ProtocolGuid ## SOMETIMES_CONSUMES > > > > > > > > +[Protocols.RISCV64] > > > > + gRiscVEfiBootProtocolGuid ## PRODUCES > > > > + > > > > [Guids] > > > > gIdleLoopEventGuid ## CONSUMES ## > > Event > > > > gEfiVectorHandoffTableGuid ## SOMETIMES_CONSUMES ## > > SystemTable > > > > diff --git a/UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.c > > b/UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.c > > new file mode 100644 > > index 0000000000..4112b6b8c6 > > --- /dev/null > > +++ b/UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.c > > @@ -0,0 +1,337 @@ > > +/** @file > > > > + RISC-V CPU DXE driver. > > > > + > > > > + Copyright (c) 2016 - 2022, Hewlett Packard Enterprise Development LP. > > + All rights reserved.<BR> > > > > + Copyright (c) 2022, Ventana Micro Systems Inc. All rights > > + reserved.<BR> > > > > + > > > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > > > + > > > > +**/ > > > > + > > > > +#include <Library/PcdLib.h> > > > > +#include <Register/RiscV64/RiscVAsm.h> > > > > +#include "CpuDxe.h" > > > > + > > > > +// > > > > +// Global Variables > > > > +// > > > > +STATIC BOOLEAN mInterruptState = FALSE; > > > > +STATIC EFI_HANDLE mCpuHandle = NULL; > > > > +STATIC UINTN mBootHartId; > > > > +RISCV_EFI_BOOT_PROTOCOL gRiscvBootProtocol; > > > > + > > > > +EFI_STATUS > > > > +EFIAPI > > > > +RiscvGetBootHartId ( > > > > + IN RISCV_EFI_BOOT_PROTOCOL *This, > > > > + OUT UINTN *BootHartId > > > > + ) > > > > +{ > > > > + if((This != &gRiscvBootProtocol) || (BootHartId == NULL)) { > > > > + return EFI_INVALID_PARAMETER; > > > > + } > > > > + > > > > + *BootHartId = mBootHartId; > > > > + return EFI_SUCCESS; > > > > +} > > > > + > > > > +RISCV_EFI_BOOT_PROTOCOL gRiscvBootProtocol = { > > > > + RISCV_EFI_BOOT_PROTOCOL_LATEST_VERSION, > > > > + RiscvGetBootHartId > > > > +}; > > > > + > > > > +EFI_CPU_ARCH_PROTOCOL gCpu = { > > > > + CpuFlushCpuDataCache, > > > > + CpuEnableInterrupt, > > > > + CpuDisableInterrupt, > > > > + CpuGetInterruptState, > > > > + CpuInit, > > > > + CpuRegisterInterruptHandler, > > > > + CpuGetTimerValue, > > > > + CpuSetMemoryAttributes, > > > > + 1, // NumberOfTimers > > > > + 4 // DmaBufferAlignment > > > > +}; > > > > + > > > > +// > > > > +// CPU Arch Protocol Functions > > > > +// > > > > + > > > > +/** > > > > + Flush CPU data cache. If the instruction cache is fully coherent > > > > + with all DMA operations then function can just return EFI_SUCCESS. > > > > + > > > > + @param This Protocol instance structure > > > > + @param Start Physical address to start flushing from. > > > > + @param Length Number of bytes to flush. Round up to chipset > > > > + granularity. > > > > + @param FlushType Specifies the type of flush operation to > > perform. > > > > + > > > > + @retval EFI_SUCCESS If cache was flushed > > > > + @retval EFI_UNSUPPORTED If flush type is not supported. > > > > + @retval EFI_DEVICE_ERROR If requested range could not be flushed. > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +CpuFlushCpuDataCache ( > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > + IN EFI_PHYSICAL_ADDRESS Start, > > > > + IN UINT64 Length, > > > > + IN EFI_CPU_FLUSH_TYPE FlushType > > > > + ) > > > > +{ > > > > + return EFI_SUCCESS; > > > > +} > > > > + > > > > +/** > > > > + Enables CPU interrupts. > > > > + > > > > + @param This Protocol instance structure > > > > + > > > > + @retval EFI_SUCCESS If interrupts were enabled in the CPU > > > > + @retval EFI_DEVICE_ERROR If interrupts could not be enabled on the CPU. > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +CpuEnableInterrupt ( > > > > + IN EFI_CPU_ARCH_PROTOCOL *This > > > > + ) > > > > +{ > > > > + EnableInterrupts (); > > > > + mInterruptState = TRUE; > > > > + return EFI_SUCCESS; > > > > +} > > > > + > > > > +/** > > > > + Disables CPU interrupts. > > > > + > > > > + @param This Protocol instance structure > > > > + > > > > + @retval EFI_SUCCESS If interrupts were disabled in the CPU. > > > > + @retval EFI_DEVICE_ERROR If interrupts could not be disabled on the CPU. > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +CpuDisableInterrupt ( > > > > + IN EFI_CPU_ARCH_PROTOCOL *This > > > > + ) > > > > +{ > > > > + DisableInterrupts (); > > > > + mInterruptState = FALSE; > > > > + return EFI_SUCCESS; > > > > +} > > > > + > > > > +/** > > > > + Return the state of interrupts. > > > > + > > > > + @param This Protocol instance structure > > > > + @param State Pointer to the CPU's current interrupt > > state > > > > + > > > > + @retval EFI_SUCCESS If interrupts were disabled in the CPU. > > > > + @retval EFI_INVALID_PARAMETER State is NULL. > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +CpuGetInterruptState ( > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > + OUT BOOLEAN *State > > > > + ) > > > > +{ > > > > + if (State == NULL) { > > > > + return EFI_INVALID_PARAMETER; > > > > + } > > > > + > > > > + *State = mInterruptState; > > > > + return EFI_SUCCESS; > > > > +} > > > > + > > > > +/** > > > > + Generates an INIT to the CPU. > > > > + > > > > + @param This Protocol instance structure > > > > + @param InitType Type of CPU INIT to perform > > > > + > > > > + @retval EFI_SUCCESS If CPU INIT occurred. This value should never > > be > > > > + seen. > > > > + @retval EFI_DEVICE_ERROR If CPU INIT failed. > > > > + @retval EFI_UNSUPPORTED Requested type of CPU INIT not supported. > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +CpuInit ( > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > + IN EFI_CPU_INIT_TYPE InitType > > > > + ) > > > > +{ > > > > + return EFI_UNSUPPORTED; > > > > +} > > > > + > > > > +/** > > > > + Registers a function to be called from the CPU interrupt handler. > > > > + > > > > + @param This Protocol instance structure > > > > + @param InterruptType Defines which interrupt to hook. IA-32 > > > > + valid range is 0x00 through 0xFF > > > > + @param InterruptHandler A pointer to a function of type > > > > + EFI_CPU_INTERRUPT_HANDLER that is > > + called > > > > + when a processor interrupt occurs. A > > + null > > > > + pointer is an error condition. > > > > + > > > > + @retval EFI_SUCCESS If handler installed or uninstalled. > > > > + @retval EFI_ALREADY_STARTED InterruptHandler is not NULL, and a > > handler > > > > + for InterruptType was previously > > installed. > > > > + @retval EFI_INVALID_PARAMETER InterruptHandler is NULL, and a > > + handler for > > > > + InterruptType was not previously > > installed. > > > > + @retval EFI_UNSUPPORTED The interrupt specified by InterruptType > > > > + is not supported. > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +CpuRegisterInterruptHandler ( > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > + IN EFI_EXCEPTION_TYPE InterruptType, > > > > + IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler > > > > + ) > > > > +{ > > > > + return RegisterCpuInterruptHandler (InterruptType, InterruptHandler); > > > > +} > > > > + > > > > +/** > > > > + Returns a timer value from one of the CPU's internal timers. There is > > + no > > > > + inherent time interval between ticks but is a function of the CPU > > frequency. > > > > + > > > > + @param This - Protocol instance structure. > > > > + @param TimerIndex - Specifies which CPU timer is requested. > > > > + @param TimerValue - Pointer to the returned timer value. > > > > + @param TimerPeriod - A pointer to the amount of time that passes > > > > + in femtoseconds (10-15) for each > > + increment > > > > + of TimerValue. If TimerValue does not > > > > + increment at a predictable rate, then 0 > > + is > > > > + returned. The amount of time that has > > > > + passed between two calls to > > + GetTimerValue() > > > > + can be calculated with the formula > > > > + (TimerValue2 - TimerValue1) * TimerPeriod. > > > > + This parameter is optional and may be NULL. > > > > + > > > > + @retval EFI_SUCCESS - If the CPU timer count was returned. > > > > + @retval EFI_UNSUPPORTED - If the CPU does not have any readable > > timers. > > > > + @retval EFI_DEVICE_ERROR - If an error occurred while reading the > > timer. > > > > + @retval EFI_INVALID_PARAMETER - TimerIndex is not valid or TimerValue > > is NULL. > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +CpuGetTimerValue ( > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > + IN UINT32 TimerIndex, > > > > + OUT UINT64 *TimerValue, > > > > + OUT UINT64 *TimerPeriod OPTIONAL > > > > + ) > > > > +{ > > > > + return EFI_UNSUPPORTED; > > > > +} > > > > + > > > > +/** > > > > + Implementation of SetMemoryAttributes() service of CPU Architecture > > Protocol. > > > > + > > > > + This function modifies the attributes for the memory region specified > > + by BaseAddress and > > > > + Length from their current attributes to the attributes specified by > > Attributes. > > > > + > > > > + @param This The EFI_CPU_ARCH_PROTOCOL instance. > > > > + @param BaseAddress The physical address that is the start address > > of a > > memory region. > > > > + @param Length The size in bytes of the memory region. > > > > + @param Attributes The bit mask of attributes to set for the memory > > region. > > > > + > > > > + @retval EFI_SUCCESS The attributes were set for the memory > > region. > > > > + @retval EFI_ACCESS_DENIED The attributes for the memory resource > > range specified by > > > > + BaseAddress and Length cannot be modified. > > > > + @retval EFI_INVALID_PARAMETER Length is zero. > > > > + Attributes specified an illegal > > + combination of attributes that > > > > + cannot be set together. > > > > + @retval EFI_OUT_OF_RESOURCES There are not enough system > > resources > > + to modify the attributes of > > > > + the memory resource range. > > > > + @retval EFI_UNSUPPORTED The processor does not support one or > > more bytes of the memory > > > > + resource range specified by BaseAddress > > and Length. > > > > + The bit mask of attributes is not > > + support for the memory resource > > > > + range specified by BaseAddress and Length. > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +CpuSetMemoryAttributes ( > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > > > > + IN UINT64 Length, > > > > + IN UINT64 Attributes > > > > + ) > > > > +{ > > > > + DEBUG ((DEBUG_INFO, "%a: Set memory attributes not supported yet\n", > > + __FUNCTION__)); > > > > + return EFI_SUCCESS; > > > > +} > > > > + > > > > +/** > > > > + Initialize the state information for the CPU Architectural Protocol. > > > > + > > > > + @param ImageHandle Image handle this driver. > > > > + @param SystemTable Pointer to the System Table. > > > > + > > > > + @retval EFI_SUCCESS Thread can be successfully created > > > > + @retval EFI_OUT_OF_RESOURCES Cannot allocate protocol data structure > > > > + @retval EFI_DEVICE_ERROR Cannot create the thread > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +InitializeCpu ( > > > > + IN EFI_HANDLE ImageHandle, > > > > + IN EFI_SYSTEM_TABLE *SystemTable > > > > + ) > > > > +{ > > > > + EFI_STATUS Status; > > > > + EFI_RISCV_FIRMWARE_CONTEXT *FirmwareContext; > > > > + > > > > + GetFirmwareContextPointer (&FirmwareContext); > > > > + ASSERT (FirmwareContext != NULL); > > > > + if (FirmwareContext == NULL) { > > > > + DEBUG ((DEBUG_ERROR, "Failed to get the pointer of > > + EFI_RISCV_FIRMWARE_CONTEXT\n")); > > > > + return EFI_NOT_FOUND; > > > > + } > > > > + DEBUG ((DEBUG_INFO, " %a: Firmware Context is at 0x%x.\n", > > + __FUNCTION__, FirmwareContext)); > > > > + > > > > + mBootHartId = FirmwareContext->BootHartId; > > > > + DEBUG ((DEBUG_INFO, " %a: mBootHartId = 0x%x.\n", __FUNCTION__, > > + mBootHartId)); > > > > + > > > > + > > > > + InitializeCpuExceptionHandlers(NULL); > > > > + > > > > + // > > > > + // Make sure interrupts are disabled > > > > + // > > > > + DisableInterrupts (); > > > > + > > > > + Status = gBS->InstallProtocolInterface (&ImageHandle, > > > > + &gRiscVEfiBootProtocolGuid, > > > > + EFI_NATIVE_INTERFACE, > > > > + &gRiscvBootProtocol > > > > + ); > > > > + > > > > + ASSERT_EFI_ERROR (Status); > > > > + > > > > + // > > > > + // Install CPU Architectural Protocol > > > > + // > > > > + Status = gBS->InstallMultipleProtocolInterfaces ( > > > > + &mCpuHandle, > > > > + &gEfiCpuArchProtocolGuid, > > > > + &gCpu, > > > > + NULL > > > > + ); > > > > + ASSERT_EFI_ERROR (Status); > > > > + return Status; > > > > +} > > > > diff --git a/UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.h > > b/UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.h > > new file mode 100644 > > index 0000000000..f039759dbd > > --- /dev/null > > +++ b/UefiCpuPkg/CpuDxe/RiscV64/CpuDxe.h > > @@ -0,0 +1,200 @@ > > +/** @file > > > > + RISC-V CPU DXE module header file. > > > > + > > > > + Copyright (c) 2016 - 2022, Hewlett Packard Enterprise Development LP. > > + All rights reserved.<BR> > > > > + Copyright (c) 2022, Ventana Micro Systems Inc. All rights > > + reserved.<BR> > > > > + > > > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > > > + > > > > +**/ > > > > + > > > > +#ifndef CPU_DXE_H_ > > > > +#define CPU_DXE_H_ > > > > + > > > > +#include <PiDxe.h> > > > > + > > > > +#include <Protocol/Cpu.h> > > > > +#include <Protocol/RiscVBootProtocol.h> > > > > +#include <Library/RiscVSbiLib.h> > > > > +#include <Library/BaseLib.h> > > > > +#include <Library/CpuExceptionHandlerLib.h> > > > > +#include <Library/DebugLib.h> > > > > +#include <Library/UefiBootServicesTableLib.h> > > > > +#include <Library/UefiDriverEntryPoint.h> > > > > + > > > > +/** > > > > + Flush CPU data cache. If the instruction cache is fully coherent > > > > + with all DMA operations then function can just return EFI_SUCCESS. > > > > + > > > > + @param This Protocol instance structure > > > > + @param Start Physical address to start flushing from. > > > > + @param Length Number of bytes to flush. Round up to chipset > > > > + granularity. > > > > + @param FlushType Specifies the type of flush operation to > > perform. > > > > + > > > > + @retval EFI_SUCCESS If cache was flushed > > > > + @retval EFI_UNSUPPORTED If flush type is not supported. > > > > + @retval EFI_DEVICE_ERROR If requested range could not be flushed. > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +CpuFlushCpuDataCache ( > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > + IN EFI_PHYSICAL_ADDRESS Start, > > > > + IN UINT64 Length, > > > > + IN EFI_CPU_FLUSH_TYPE FlushType > > > > + ); > > > > + > > > > +/** > > > > + Enables CPU interrupts. > > > > + > > > > + @param This Protocol instance structure > > > > + > > > > + @retval EFI_SUCCESS If interrupts were enabled in the CPU > > > > + @retval EFI_DEVICE_ERROR If interrupts could not be enabled on the CPU. > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +CpuEnableInterrupt ( > > > > + IN EFI_CPU_ARCH_PROTOCOL *This > > > > + ); > > > > + > > > > +/** > > > > + Disables CPU interrupts. > > > > + > > > > + @param This Protocol instance structure > > > > + > > > > + @retval EFI_SUCCESS If interrupts were disabled in the CPU. > > > > + @retval EFI_DEVICE_ERROR If interrupts could not be disabled on the CPU. > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +CpuDisableInterrupt ( > > > > + IN EFI_CPU_ARCH_PROTOCOL *This > > > > + ); > > > > + > > > > +/** > > > > + Return the state of interrupts. > > > > + > > > > + @param This Protocol instance structure > > > > + @param State Pointer to the CPU's current interrupt > > state > > > > + > > > > + @retval EFI_SUCCESS If interrupts were disabled in the CPU. > > > > + @retval EFI_INVALID_PARAMETER State is NULL. > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +CpuGetInterruptState ( > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > + OUT BOOLEAN *State > > > > + ); > > > > + > > > > +/** > > > > + Generates an INIT to the CPU. > > > > + > > > > + @param This Protocol instance structure > > > > + @param InitType Type of CPU INIT to perform > > > > + > > > > + @retval EFI_SUCCESS If CPU INIT occurred. This value should never > > be > > > > + seen. > > > > + @retval EFI_DEVICE_ERROR If CPU INIT failed. > > > > + @retval EFI_UNSUPPORTED Requested type of CPU INIT not supported. > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +CpuInit ( > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > + IN EFI_CPU_INIT_TYPE InitType > > > > + ); > > > > + > > > > +/** > > > > + Registers a function to be called from the CPU interrupt handler. > > > > + > > > > + @param This Protocol instance structure > > > > + @param InterruptType Defines which interrupt to hook. IA-32 > > > > + valid range is 0x00 through 0xFF > > > > + @param InterruptHandler A pointer to a function of type > > > > + EFI_CPU_INTERRUPT_HANDLER that is > > + called > > > > + when a processor interrupt occurs. A > > + null > > > > + pointer is an error condition. > > > > + > > > > + @retval EFI_SUCCESS If handler installed or uninstalled. > > > > + @retval EFI_ALREADY_STARTED InterruptHandler is not NULL, and a > > handler > > > > + for InterruptType was previously > > installed. > > > > + @retval EFI_INVALID_PARAMETER InterruptHandler is NULL, and a > > + handler for > > > > + InterruptType was not previously > > installed. > > > > + @retval EFI_UNSUPPORTED The interrupt specified by InterruptType > > > > + is not supported. > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +CpuRegisterInterruptHandler ( > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > + IN EFI_EXCEPTION_TYPE InterruptType, > > > > + IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler > > > > + ); > > > > + > > > > +/** > > > > + Returns a timer value from one of the CPU's internal timers. There is > > + no > > > > + inherent time interval between ticks but is a function of the CPU > > frequency. > > > > + > > > > + @param This - Protocol instance structure. > > > > + @param TimerIndex - Specifies which CPU timer is requested. > > > > + @param TimerValue - Pointer to the returned timer value. > > > > + @param TimerPeriod - A pointer to the amount of time that passes > > > > + in femtoseconds (10-15) for each > > + increment > > > > + of TimerValue. If TimerValue does not > > > > + increment at a predictable rate, then 0 > > + is > > > > + returned. The amount of time that has > > > > + passed between two calls to > > + GetTimerValue() > > > > + can be calculated with the formula > > > > + (TimerValue2 - TimerValue1) * TimerPeriod. > > > > + This parameter is optional and may be NULL. > > > > + > > > > + @retval EFI_SUCCESS - If the CPU timer count was returned. > > > > + @retval EFI_UNSUPPORTED - If the CPU does not have any readable > > timers. > > > > + @retval EFI_DEVICE_ERROR - If an error occurred while reading the > > timer. > > > > + @retval EFI_INVALID_PARAMETER - TimerIndex is not valid or TimerValue > > is NULL. > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +CpuGetTimerValue ( > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > + IN UINT32 TimerIndex, > > > > + OUT UINT64 *TimerValue, > > > > + OUT UINT64 *TimerPeriod OPTIONAL > > > > + ); > > > > + > > > > +/** > > > > + Set memory cacheability attributes for given range of memeory. > > > > + > > > > + @param This Protocol instance structure > > > > + @param BaseAddress Specifies the start address of the > > > > + memory range > > > > + @param Length Specifies the length of the memory range > > > > + @param Attributes The memory cacheability for the memory > > range > > > > + > > > > + @retval EFI_SUCCESS If the cacheability of that memory range > > is > > > > + set successfully > > > > + @retval EFI_UNSUPPORTED If the desired operation cannot be done > > > > + @retval EFI_INVALID_PARAMETER The input parameter is not correct, > > > > + such as Length = 0 > > > > + > > > > +**/ > > > > +EFI_STATUS > > > > +EFIAPI > > > > +CpuSetMemoryAttributes ( > > > > + IN EFI_CPU_ARCH_PROTOCOL *This, > > > > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > > > > + IN UINT64 Length, > > > > + IN UINT64 Attributes > > > > + ); > > > > + > > > > +#endif > > > > -- > > 2.25.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#93396): https://edk2.groups.io/g/devel/message/93396 Mute This Topic: https://groups.io/mt/93506303/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-