summaryrefslogtreecommitdiffstats
path: root/ArmPkg
Commit message (Collapse)AuthorAgeFilesLines
* ArmPkg: ArmFfaStandaloneMmLib: Fix non-FFA pathKun Qin12 days1-1/+18
| | | | | | | | | | ArmFfaLibCommonInit will return EFI_UNSUPPORTED when there is no FFA supported on the platform. This is expected behavior. However, the return of error code will incur program asserts. This change fixed the non-FFA path for the Standalone MM instance. Signed-off-by: Kun Qin <kun.qin@microsoft.com>
* MdePkg: Move StackCheckLibStaticInit to StackCheckLibOliver Smith-Denny2025-02-071-0/+1
| | | | | | | | | | | | | | | This commit oves StackCheckLib from a NULL lib to an instance of StackCheckLib. This requires every entry point to add a library dependency on StackCheckLib. It also requires every SEC module to have a dependency on StackCheckLib because there is no standard SEC entry point. It allows for greater flexibility for a platform to apply stack cookies and simplifies DSC logic. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Oliver Smith-Denny <osde@microsoft.com>
* ArmPkg: Retire ArmDisassemblerLibArd Biesheuvel2025-01-317-1657/+0
| | | | | | No longer used anywhere so can be retired. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg: Stop using ArmDisassemblerLibArd Biesheuvel2025-01-305-35/+1
| | | | | | | | | | | | | | | | | | | | ArmDisassemblerLib is used to pretty print the instruction that triggered an unhandled exception, but it was never implemented for AARCH64, and according to the existing file comment, Thumb2 support (which is used predominantly when building EDK2 for 32-bit ARM due to its smaller size) is incomplete. The DEBUG diagnostics that are produced on an unhandled exception are generally sufficient to dump the entire executable that triggered it, and so this disassembly is of limited value, especially because it doesn't work on AARCH64. So let's start getting rid of it, by dropping references to it in code and in the various .INF and .DSC files. Once out-of-tree platforms have been allowed to catch up, we can remove the library implementation and its class definition entirely. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg,ArmPkg/ArmExceptionLib: drop vector relocation variant/supportLeif Lindholm2025-01-309-252/+21
| | | | | | | | | | | | There were several bugs in the vector table relocation code which means it can't really have been used by anyone on AArch64 in the last decade or so. So delete the support code from the library, as well as the ArmRelocateExceptionLib.inf file. This gets rid of PcdDebuggerExceptionSupport (including a duff reference in CpuDxe), PcdCpuVectorBaseAddress and PcdRelocateVectorTable. Signed-off-by: Leif Lindholm <leif.lindholm@oss.qualcomm.com>
* ArmPkg/ArmGicDxe: Map GIC MMIO regions before useArd Biesheuvel2025-01-303-11/+62
| | | | | | | | | | | | | | | The GIC driver itself has intimate knowledge of the hardware, and so it is the best suited to create the mappings of the MMIO control regions, in case they have not been mapped yet by the platform code. So call in the the CPU arch protocol to map the CPU interface, distributor and redistributor regions as they are discovered by the GIC driver startup code. Note that creating these mappings has no effect if the regions in question have already been mapped with the correct attributes. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGicDxe: Remove pointless passing around of MMIO addressesArd Biesheuvel2025-01-301-29/+12
| | | | | | | | The GIC distributor and redistributor addresses that are passed into the interrupt enable and disable routines are always the same, so just use the global variables directly. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGicDxe: Avoid pointless repeated iteration over GIC framesArd Biesheuvel2025-01-301-46/+13
| | | | | | | | | The GIC DXE driver only runs on the boot CPU, and so there is really no point in iterating over all the redistributor frames every time an interrupt is enabled, disabled or its state tested. Instead, do this only at load time. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGicDxe: Replace CpuArch registration event with DEPEXArd Biesheuvel2025-01-305-66/+20
| | | | | | | | | | | | Instead of relying on a protocol notification event to register the core IRQ interrupt handler with CPU arch protocol once it becomes available, use a DEPEX to ensure that the GIC driver is not dispatched at all until the CPU arch protocol has turned up. This will allow the GIC driver to use other CPU arch protocol methods, such as the ones needed to map the GIC MMIO regions at driver startup. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/CpuDxe: Replace DEPEX on h/w protocol with event notificationArd Biesheuvel2025-01-302-4/+106
| | | | | | | | | | | | | | | | | | | | | | | | | Currently, ArmPkg's CpuDxe DEPEXes on the hardware interrupt protocol, to ensure that it is not dispatched before the GIC driver. This way, the CpuDxe driver is guaranteed not to enable interrupts on the CPU side before the GIC driver has had the opportunity to configure the interrupts on the distribution side. However, this prevents the GIC driver from using any of the CPU arch protocol interfaces, such as mapping memory, which it may need to do on platforms where the GIC MMIO regions are not mapped yet when the driver is started. So instead, use a protocol notification on the hardware interrupt protocol, which is installed by the GIC driver (as well as other existing interrupt controller drivers for platforms that do not implement a GIC) after it starts up and deasserts and disables all incoming interrupts. Manipulate the interrupt state as usual only after this notification has been received. Before that, keep track of the caller's intent regarding the interrupt enabled state in a shadow variable, but do not actually enable interrupt delivery to the CPU just yet. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/CpuDxe: Remove rudimentary vector handoff logicArd Biesheuvel2025-01-303-43/+5
| | | | | | | | | | | | | | | | There is some fossilized code in the CpuDxe driver startup code that permits a vector table to be inherited from the PEI stage, but this code is essentially dead on ARM platforms, given that the VectorInfo argument passed to InitializeCpuExceptionHandlers() is ignored, and no code appears to exist that would result in the gEfiVectorHandoffTableGuid configuration table ever being populated. Also, due to prior refactoring, the code that disables and re-enables IRQs and FIQs is completely pointless, and can simply be removed. That, in turn, allows the CPU arch protocol parameter to be dropped from the prototype of InitializeExceptions(). Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/CpuDxe: Use STATIC linkage where possibleArd Biesheuvel2025-01-302-1/+10
| | | | | | | | Use static linkage for variables and routines that are not referenced from other objects. This is generally preferred, because it gives the compiler more freedom for optimization. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/CpuDxe: Fix error handling in driver initializationArd Biesheuvel2025-01-301-4/+10
| | | | | | | | | | | | | | | | | | | Failure to install the CPU arch protocol is a fatal error, so treat it as such, rather than ignore it, even though we won't get very far if this driver fails to dispatch - at least, we will get an error in a DEBUG build rather than a mysterious failure due to unsatisfied DEPEXes. Failure to install the idle loop event handler is not a fatal error, and it should not cause the driver to exit with an error, as this will unload the driver and keep the installed CPU arch protocol pointer dangling. So keep the ASSERT() on the return value, but return EFI_SUCCESS once we're past the point where the CPU arch protocol has been installed. Since the protocol is never uninstalled, make the CPU handle function local, as there is no point in keeping its value around. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGicDxe: Use EOImode 0x0 on GICv3Ard Biesheuvel2025-01-175-1/+50
| | | | | | | | | | When re-entering EDK2 from a high level OS such as Linux, the GICv3 may be configured to use split priority drop and deactivate (EOImode == 1), whereas EDK2's GICv3 driver assumes the default setting of EOImode == 0. So clear the EOImode bit explicitly when taking control of the GIC. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGic: Rename directory to ArmGicDxeArd Biesheuvel2025-01-1711-3/+3
| | | | | | | | | | Now that ArmPkg/Drivers/ArmGic no longer carries a combination of libraries and DXE drivers, rename the directory to the more idiomatic ArmPkg/Drivers/ArmGicDxe Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGic: Implement GICv3+ version of GIC driverArd Biesheuvel2025-01-173-0/+65
| | | | | | | | | | Most platforms do not require the flexibility of the ordinary GIC driver, which supports both GICv2 and GICv3+, and decides at runtime which version to use. So expose a GICv3+ version, which only supports a GICv3 or newer. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGic: Implement GICv2-only version of GIC driverArd Biesheuvel2025-01-172-0/+52
| | | | | | | | | | Most platforms do not require the flexibility of the ordinary GIC driver, which supports both GICv2 and GICv3+, and decides at runtime which version to use. So expose a GICv2 only version, which only supports a GICv2. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg: Retire ArmGicLib implementationsArd Biesheuvel2025-01-172-32/+0
| | | | | | | | | | | | Retire all implementations of the ArmGicLib library class, which are no longer used. For now, retain the library header and library class declaration: the header file only contains pre-processor defines derived from the GIC architecture spec, and so this code should probably move into MdePkg at a later moment. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGic: Incorporate v3 code from ArmGicLibArd Biesheuvel2025-01-173-47/+53
| | | | | | | | Move the remaining code in ArmGicLib into ArmGicDxe, its only user, and drop the dependency on ArmGicLib. Note that ArmGicDxe has an undeclared dependency on ArmLib, so declare that instead. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGic: Retire ArmGicArchLibArd Biesheuvel2025-01-178-205/+0
| | | | | | | | | ArmGicArchLib is no longer use so remove all remaining references and implementations. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGic: Move some GIC defines into ArmGicLib.hArd Biesheuvel2025-01-171-0/+8
| | | | | | | | Before getting rid of ArmGicArchLib entirely, preserve some GIC architecture related preprocessor defines by moving them into ArmGicLib.h instead. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGic: Move GICv3 sysreg check into ArmGicDxeArd Biesheuvel2025-01-172-10/+39
| | | | | | | | | | | | | | | | | | ArmGicArchLib implements a check on the accessibility of the GIC system register interface, which is a prerequisite for using the GIC in v3 mode. It might be possible to use GICv2 compatibility mode on poorly configured platforms where the GIC is v3 capable but not accessible, but in most cases, the GIC is driven in its native mode. This check is now only carried out in a single place, and there is not really any reason to keep this in a separate library. Even though ArmVirtPkg implements its own version, the basic check (and enablement of the sysreg interface) is still needed. So move this check into the DXE driver itself, and drop the dependency on ArmGicArchLib. This allows it to be retired in a subsequent patch. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGic: Move GICv2 specific EOI/ACK routines into v2 driverArd Biesheuvel2025-01-174-68/+50
| | | | | | | | ArmGicDxe is the only remaining user of ArmGicLib, and so there is no need for the abstraction, which is drawn at an arbitrary boundary anyway. So remove the remaining V2 specific code into the DXE driver. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGic: Move remaining shared code into ArmGicDxeArd Biesheuvel2025-01-175-77/+61
| | | | | | | Move the remaining ArmGicLib code that is shared between the v2 and v3 GIC DXE drivers into ArmGicCommonDxe.c Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGic: Drop declarations for non-existent functionsArd Biesheuvel2025-01-171-32/+0
| | | | | | Drop some ArmGicLib declarations that don't actually exist in the code. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGic: Disentangle ArmGicEnableDistributor () versionsArd Biesheuvel2025-01-175-44/+25
| | | | | | | | Split ArmGicEnableDistributor () into GICv2 and v3 specific versions, and move them into their single respective callers, so that the original can be dropped from ArmGicLib altogether. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGic: Disentangle v2 and v3 versions of IRQ en/disable APIsArd Biesheuvel2025-01-175-333/+303
| | | | | | | | | ArmGicLib is agnostic about the difference between v2 and v3, but its APIs are only called from code that is either v2-specific or v3-specific. That makes the generic interface kind of pointless, and we can just merge this code into the callers. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGic: Remove ArmGicEndOfInterrupt () APIArd Biesheuvel2025-01-172-26/+0
| | | | | | | | ArmGicEndOfInterrupt () is never used: the v2 and v3 versions of the driver call respective specific versions directly, and so this API can be removed. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGic: Remove ArmGicSendSgiTo () APIArd Biesheuvel2025-01-172-26/+0
| | | | | | | ArmGicSendSgiTo () is never used, and is fundamentally tied to multi-CPU operation which is no longer supported. So drop the implementation. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGic: drop ArmGicEnableInterruptInterface from ArmGicLibArd Biesheuvel2025-01-173-49/+1
| | | | | | | | | The ArmGicLib API exposes ArmGicEnableInterruptInterface () and ArmGicDisableInterruptInterface (), but only the former is actually used, and only from the GICv2 driver. So drop the API entirely, and invoke the v2 version of the underlying interface directly. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* ArmPkg/ArmGic: Drop GICv2 legacy supportArd Biesheuvel2025-01-175-63/+23
| | | | | | | | | | | | | | | | | Support for GICv2 legacy mode was introduced to accommodate secure world firmware that was lagging behind in terms of development, and was running the GIC in v2 mode on the secure side for lack of a GICv3 driver. As per the GIC architecture, the non-secure world can only run the GIC in v3 mode if the secure world does so too. At this point, there is no longer a need to for this fallback: GICv2 support it still needed for platforms such as Raspberry Pi 4 that do not implement GICv3 at all. But on platforms that do implement it, falling back to GICv2 is unnecessary. Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
* StandaloneMmPkg: move core entry point lib and cpu driver to ArmPkgLevi Yun2025-01-1714-1/+2945
| | | | | | | | | | | | StandaloneMmCpu driver is only used for Arm architecture and StandaloneMmCoreEntryPointLib for Arm has specific implementation with StandaloneMmCpu driver. Move StandaloneMmCpu Driver and StandaloneMmCoreEntryPointLib for Arm to ArmPkg. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
* ArmPkg: Add StandaloneMm stack size Pcdlevi.yun2025-01-171-0/+5
| | | | | | | StandaloneMm Arm uses stack allocated in data section. This patch adds Pcd which specify the stack size of StandaloneMm. Signed-off-by: levi.yun <yeoreum.yun@arm.com>
* ArmPkg/MmCommunication: add helper function converting smc returnlevi.yun2025-01-172-46/+60
| | | | | | Add helper function converting smc return value to efi status. Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
* AmrPkg/MmCommunication: move Mmcommunicate.h to common includelevi.yun2025-01-174-14/+12
| | | | | | | MmCommunication.h is used in MmCommunicationDxe/Pei both. Move this header file to common include. Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
* ArmPkg/MmCommunicationPei: Mmcommunication via FF-ALevi Yun2025-01-172-69/+372
| | | | | | | Support Mmcommunication protocol via FF-A with StandaloneMm. For this, FF-A v1.2 is required. Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
* ArmPkg/MmCommunicationDxe: Mmcommunication via FF-ALevi Yun2025-01-172-52/+308
| | | | | | Support Mmcommunication protocol via FF-A with StandaloneMm. Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
* ArmPkg/Library: Update StandaloneMmuLib with FF-A v1.2 with page granulirtyLevi Yun2025-01-172-138/+250
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The StandaloneMm implementation for Arm sets up the stack in the early startup code using the data section reserved in the assembly code. When TF-A loads the StandaloneMM binary in the DRAM it maps the entire StandaloneMM memory region as Read Only. Therefore, the initial startup assembly code updates the mem permissions of the stack region to Read Write. However, when the StandaloneMmCore is loaded the function UpdateMmFoundationPeCoffPermissions() starts applying the memory permissions based on the PE COFF sections as below: A. If the section is not executable, it first removes the executable permission of the section by calling TextUpdate(). TextUpdate() is the StandaloneMM MMU library function ArmSetMemoryRegionNoExec(). B. It then checks if the section is writable, and if it is it calls ReadWriteUpdater(), which invokes the StandaloneMM MMU library function ArmClearMemoryRegionReadOnly() to make the section writable. However, this results in the stack being made read-only between A and B. To understand this please see the following flow. 1. TF-A sets the entire StandaloneMM region as Read Only. 2. The stack is reserved in the data section by the early assembly entry point code. +--------------------+ <--- Start of Data Section | | | Data Section | | | | +----------------+ | <--- Stack region | | Stack | | | +----------------+ | | | +--------------------+ 3. The StanaloneMM early entry point code updates the attributes of the stack to Read Write. 4. When UpdateMmFoundationPeCoffPermissions() sets the permission of the data section to remove the Execute attribute, it calls ArmSetMemoryRegionNoExec(). 5. The ArmSetMemoryRegionNoExec() implementation gets the attributes of the first granule which is at the start of the data section, then clears the execute permission and applies the attribute for the entire data section. 6. Since TF-A has mapped the entire section as read only the first granule of the data section is read only and therefore the stack region attributes are changed to Read Only no execute. 7. Since the stack is read only after point A any updates to the stack result in an exception. To resolve this issue with update the library with FF-A v1.2, get/set memory permission per page unit. Links: https://developer.arm.com/documentation/den0140/latest/ [0] Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
* ArmPkg: Add ArmFfaLib used in StandaloneMmLevi Yun2025-01-174-0/+147
| | | | | | | Add ArmFfaLib used in StandaloneMmCore/StandaloneMm Driver. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
* ArmPkg: Add ArmFfaLib used in PEIMLevi Yun2025-01-173-0/+145
| | | | | | Add ArmFfaLib used in PEIM. Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
* ArmPkg: Add ArmFfaLib used in Dxe driverLevi Yun2025-01-177-0/+1386
| | | | | | Add ArmFfaLib used in Dxe driver Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
* ArmPkg: Add ArmFfaLib.hLevi Yun2025-01-172-0/+296
| | | | | | Add ArmFfaLib.h which defines interfaces correspond to FF-A ABIs. Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
* ArmPkg: Remove PcdFfaEnabledLevi Yun2025-01-172-10/+0
| | | | | | | | | | PcdFfaEnabled is no more used because ArmFfaLib could find whether FF-A is supported dynamically. This patch removes usage of PcdFfaEnabled. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
* ArmPkg: Add FF-A related dynamic Pcd and GuidLevi Yun2025-01-171-0/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | To communicate with spmc or spmd, UEFI needs to map the Rx/Tx buffer (which is a global resource in a partition) by getting the required information from the partition descriptor. for this, Define ArmFfaLib related Pcd and Guid. Pcd: - PcdFfaLibConduitSmc conudit to use ArmFfaLib. - PcdFfaTxBufeer address of Tx buffer. - PcdFfaRxBuffer: address of Rx buffer. - PcdTxRxPageCount: specify buffer size with EFI_PAGE_SIZE unit. - PcdFfaExitBootEventRegistered: check exit boot event registered to unmap rx/tx buffer. Guid: - gArmFfaRxTxBufferInfoGuid: This is used in Hob to get Rx/Tx buffer information to pass Rx/Tx buffer information via HobList if Rx/Tx Buffer mapped in PEI phase. Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
* ArmPkg: Add FF-A partition information headerLevi Yun2025-01-171-0/+99
| | | | | | | | | | Partition descriptor is used to get partition information via FFA_PARTITION_INFO_GET or FFA_PARTITION_INFO_GET_REGS FF-A ABI. Adds defines for partition descriptor and some macros used to call above ABIs. Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
* ArmPkg/IndustryStandard: Introduce ArmFfaBootInfo.hLevi Yun2025-01-171-0/+110
| | | | | | | | | | ArmFfaBootInfo.h contains boot information used in FF-A [0]. This boot information will be used to initalize firmware (i.e) StandaloneMm. Links: https://developer.arm.com/documentation/den0077/latest/ [0] Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
* ArmPkg/IndustryStandard: Update ArmFfaSvc.hLevi Yun2025-01-171-26/+197
| | | | | | | | | | | | Update ArmFfaSvc.h defines & macros with FF-A v1.2 [0] and FF-A Memory Mangement Protocol [1]. This also changes naming convention used in it. Link: https://developer.arm.com/documentation/den0077/latest/ [0] Link: https://developer.arm.com/documentation/den0140/latest/ [1] Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
* ArmPkg/StandaloneMmMmuLib: Introduce a SPM_MM status helper fucntionlevi.yun2025-01-171-18/+28
| | | | | | | Introduce a new helper function SpmMmStatusToEfiStatus() to convert the SPM_MM status values to EFI_STATUS values. Signed-off-by: Levi yun <yeoreum.yun@arm.com>
* ArmPkg/IndustryStandard: Change naming convention in ArmMmSvc.hlevi.yun2025-01-172-53/+70
| | | | | | | | | | | | Change naming convention in ArmMmSvc.h with MM to SPM_MM This would make it clear to discern ABI protocol used to communicate with secure partition. Continuous-integration-options: PatchCheck.ignore-multi-package Signed-off-by: Levi Yun <yeoreum.yun@arm.com>
* ArmPkg/Library: Introduce ArmTransferListLiblevi.yun2025-01-176-0/+443
| | | | | | | | | | | | ArmTransferList is used to pass boot information according to firmware handoff protocol specification [0]. When initializing StandaloneMm, it gets boot information from the PHIT HOB in the TransferList. [0] https://github.com/FirmwareHandoff/firmware_handoff Signed-off-by: Levi Yun <yeoreum.yun@arm.com>