Compare commits

..

100 Commits

Author SHA1 Message Date
9ca522ba15 New fallout vault boy logo 2024-10-06 16:59:55 -04:00
3005ff4237 Change logo to fallout vault boy 2024-10-06 16:59:55 -04:00
d3bcf7e60e Add stylized name as logo 2024-10-06 16:59:55 -04:00
85f3fc6654 Only check webcam status on laptops 2024-08-30 12:35:45 -06:00
88f5720e16 MdeModulePkg/UsbBusDxe: fix NOOPT build error
gcc-11 (fedora 35):

/home/kraxel/projects/edk2/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.c: In function ?UsbIoBulkTransfer?:
/home/kraxel/projects/edk2/MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBus.c:277:12: error: ?UsbHcBulkTransfer? accessing 80 bytes in a region of size 8 [-Werror=stringop-overflow=]

Upstream commit ae8272ef78

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
2024-02-21 09:11:18 -07:00
27585e73da Update DBX to 2023-05-09
Ref: https://uefi.org/revocationlistfile
Signed-off-by: Tim Crawford <tcrawford@system76.com>
2023-06-27 08:16:14 -06:00
42a443d5cd SecurityPkg: Fix debug build
For some reason only DEBUG builds fail because of the unused variable.

Signed-off-by: Tim Crawford <tcrawford@system76.com>
2023-06-22 13:41:43 -06:00
c466cc2ca5 Add System76 Secure Boot keys
Signed-off-by: Tim Crawford <tcrawford@system76.com>
2023-03-07 18:10:00 -07:00
5c49aca613 Update DBX to 2022-09-07
Ref: https://uefi.org/revocationlistfile
Signed-off-by: Tim Crawford <tcrawford@system76.com>
2023-03-07 18:10:00 -07:00
99891bd41e SecureBootConfig: Remove blank line
Remove the blank between "Delete..." and "Restore...".

Signed-off-by: Tim Crawford <tcrawford@system76.com>
2023-03-07 10:10:35 -07:00
3485d55709 SecureBootConfig: Split long strings
firmware-setup does not wrap long lines, so manually split long strings.

Signed-off-by: Tim Crawford <tcrawford@system76.com>
2023-03-07 10:10:35 -07:00
c1a7127e01 SecureBootConfig: Clear PK and reset
Signed-off-by: Tim Crawford <tcrawford@system76.com>
2023-03-07 10:10:35 -07:00
2f21eddfb8 SecureBootConfig: Restore keys and reset
Signed-off-by: Tim Crawford <tcrawford@system76.com>
2023-03-07 10:10:35 -07:00
860c29c923 SecureBootConfig: Update variable and perform reset
Update the `SecureBootEnable` variable and perform a platform reset when
the enable/disable button is pressed.

Signed-off-by: Tim Crawford <tcrawford@system76.com>
2023-03-07 10:10:35 -07:00
8cfead2839 SecureBootConfig: Add text key to perform the actions
Signed-off-by: Tim Crawford <tcrawford@system76.com>
2023-03-07 10:10:35 -07:00
30f6b2f3c7 SecureBootConfig: Modify UI
Rewrite the UI based on feedback from enabling the module.

Signed-off-by: Tim Crawford <tcrawford@system76.com>
2023-03-07 10:10:35 -07:00
4de32568fa UiApp: Link to SecureBootConfig
Shoehorn in logic from Device Manager to show only the Secure Boot
Config entry under the firmware config form.

Signed-off-by: Tim Crawford <tcrawford@system76.com>
2023-03-07 10:10:35 -07:00
ff91020528 Notify System76 security callback prior to loading boot options 2023-03-06 15:01:34 -07:00
943773983d BaseTools: Fix DevicePath tool build failure issue
Fix the DevicePath tool build failure that was introduced by
the fixes: 22130dcd98 ("Basetools: turn off gcc12 warning").
Failure cases are:
1. clang 13.1.6 on macOS
2. gcc5.4

Reported-by: Rebecca Cran <rebecca@bsdio.com>
Reported-by: Yuwei Chen <yuwei.chen@intel.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Bob Feng <bob.c.feng@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Yuwei Chen <yuwei.chen@intel.com>
Cc: Rebecca Cran <rebecca@bsdio.com>
Reviewed-by: Yuwei Chen <yuwei.chen@intel.com>
2022-08-17 11:40:12 -06:00
e91ea5561d Basetools: turn off gcc12 warning
In function ?SetDevicePathEndNode?,
    inlined from ?FileDevicePath? at DevicePathUtilities.c:857:5:
DevicePathUtilities.c:321:3: error: writing 4 bytes into a region of size 1 [-Werror=stringop-overflow=]
  321 |   memcpy (Node, &mUefiDevicePathLibEndDevicePath, sizeof (mUefiDevicePathLibEndDevicePath));
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from UefiDevicePathLib.h:22,
                 from DevicePathUtilities.c:16:
../Include/Protocol/DevicePath.h: In function ?FileDevicePath?:
../Include/Protocol/DevicePath.h:51:9: note: destination object ?Type? of size 1
   51 |   UINT8 Type;       ///< 0x01 Hardware Device Path.
      |         ^~~~

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Bob Feng <bob.c.feng@intel.com>
2022-08-17 11:40:12 -06:00
5e86b202de BaseTools: fix gcc12 warning
Sdk/C/LzmaEnc.c: In function ?LzmaEnc_CodeOneMemBlock?:
Sdk/C/LzmaEnc.c:2828:19: error: storing the address of local variable ?outStream? in ?*p.rc.outStream? [-Werror=dangling-pointer=]
 2828 |   p->rc.outStream = &outStream.vt;
      |   ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
Sdk/C/LzmaEnc.c:2811:28: note: ?outStream? declared here
 2811 |   CLzmaEnc_SeqOutStreamBuf outStream;
      |                            ^~~~~~~~~
Sdk/C/LzmaEnc.c:2811:28: note: ?pp? declared here
Sdk/C/LzmaEnc.c:2828:19: error: storing the address of local variable ?outStream? in ?*(CLzmaEnc *)pp.rc.outStream? [-Werror=dangling-pointer=]
 2828 |   p->rc.outStream = &outStream.vt;
      |   ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
Sdk/C/LzmaEnc.c:2811:28: note: ?outStream? declared here
 2811 |   CLzmaEnc_SeqOutStreamBuf outStream;
      |                            ^~~~~~~~~
Sdk/C/LzmaEnc.c:2811:28: note: ?pp? declared here
cc1: all warnings being treated as errors

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Bob Feng <bob.c.feng@intel.com>
2022-08-17 11:40:12 -06:00
b764882195 BaseTools: fix gcc12 warning
GenFfs.c:545:5: error: pointer ?InFileHandle? used after ?fclose? [-Werror=use-after-free]
  545 |     Error(NULL, 0, 4001, "Resource", "memory cannot be allocated  of %s", InFileHandle);
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GenFfs.c:544:5: note: call to ?fclose? here
  544 |     fclose (InFileHandle);
      |     ^~~~~~~~~~~~~~~~~~~~~

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Bob Feng <bob.c.feng@intel.com>
2022-08-17 11:40:12 -06:00
a2abc5e15f UefiPayloadPkg: Add Pop!_OS Recovery to boot text
Preserve existing UI and add the note about pressing Space to go to
the systemd-boot menu for Pop!_OS Recovery.

Signed-off-by: Tim Crawford <tcrawford@system76.com>
2021-12-21 15:25:08 -07:00
a618e43977 MdeModulePkg/BmBootDesciption: Remove device prefixes
Remove the device prefixes to match current System76 firmware UI in the
One Time Boot menu.

Signed-off-by: Tim Crawford <tcrawford@system76.com>
2021-11-16 10:10:20 -07:00
bbc04972bc UefiPayloadPkg: Add PCI support from DuetPkg
In coreboot, we mark GPU prefmem above 4GB, because NVIDIA wants a lot
(16GB region on the 30 series), otherwise coreboot will obviously fail
to allocate the resources.

In EDK2, we then end up hitting this assert:

    InitRootBridge: populated root bus 0, with room for 36 subordinate bus(es)
    RootBridge: PciRoot(0x0)
      Support/Attr: 7001F / 7001F
        DmaAbove4G: No
    NoExtConfSpace: No
         AllocAttr: 0 ()
               Bus: 0 - 24 Translation=0
                Io: 1000 - EFFF Translation=0
               Mem: 80400000 - 1001FFFFFF Translation=0
        MemAbove4G: FFFFFFFFFFFFFFFF - 0 Translation=0
              PMem: FFFFFFFFFFFFFFFF - 0 Translation=0
       PMemAbove4G: FFFFFFFFFFFFFFFF - 0 Translation=0
    ASSERT [PciHostBridgeDxe] .../edk2/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c(120): Bridge->Mem.Limit < 0x0000000100000000ULL

So, bring back Pci*NoEnumerationDxe from the deleted DuetPkg, which
doesn't check anything and let's us boot.

Signed-off-by: Tim Crawford <tcrawford@system76.com>
2021-11-11 17:49:07 -07:00
61a7f360d9 UefiPayloadPkg: Add Intel GOP driver 2021-11-11 17:49:07 -07:00
fc1c47ccad UefiPayloadPkg: Add System76 Setup menu 2021-11-11 17:49:07 -07:00
fec64b04eb Update brotli to fix compiling with GCC 11 2021-11-11 17:49:07 -07:00
05aa27ef23 MdeModulePkg/BM: Update boot options on device change
Register an event to trigger when a block device is added or removed
that will update the list of boot options. Use a refreshguid to force
the form to display the changes if it already open.
2021-11-11 17:49:07 -07:00
06cc698885 MdeModulePkg/Core: Signal notify events on protocol removal
In order for BootManager to maintain a valid list of boot options, it
must know when the BlockIo protocol is also removed, not just added.
2021-11-11 17:49:07 -07:00
cb870a1ce9 UiApp: Dynamically generated firmware configuration information page
Signed-off-by: Jeremy Soller <jeremy@system76.com>
Signed-off-by: Tim Crawford <tcrawford@system76.com>
2021-11-11 17:49:07 -07:00
90e04a7e31 MdeModulePkg/BMM: Unregister F9 and F10 hotkeys 2021-11-11 17:49:07 -07:00
1d01d2a9a7 MdeModulePkg/BMM: Remove Commit/Discard buttons 2021-11-11 17:49:07 -07:00
70e9b22f5c MdeModulePkg/BMM: Save BootOrder on list update 2021-11-11 17:49:07 -07:00
e9d6369050 MdeModulePkg/BMM: Add some debug logging 2021-11-11 17:49:07 -07:00
58d6aae969 MdeModulePkg/UiApp: Add warning if no bootable options found 2021-11-11 17:49:07 -07:00
4e0fcaba18 MdeModulePkg/BootMaintenanceManagerUiLib: Make it look like current BMM 2021-11-11 17:49:07 -07:00
2d04a62512 MdeModulePkg/UiApp: Make it look like current FrontPage
Signed-off-by: Jeremy Soller <jeremy@system76.com>
Signed-off-by: Tim Crawford <tcrawford@system76.com>
2021-11-11 17:49:07 -07:00
8a0955dfa8 MdeModulePkg/BM: Make it look like current BootMngr 2021-11-11 17:49:07 -07:00
06f4583ea5 UefiPayloadPkg: Disable EFI shell 2021-11-02 19:24:49 -06:00
9daa69a59e UefiPayloadPkg: Add library for logging to EC
Make use of the SMFI command interface to forward logs from edk2 to
System76 EC.

Signed-off-by: Jeremy Soller <jeremy@system76.com>
Signed-off-by: Tim Crawford <tcrawford@system76.com>
2021-11-02 19:24:49 -06:00
9030464a1b fix secureboot
TODO: Proper integration
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
bcfe7a54aa UefiPayloadPkg/Include/Coreboot.h: Remove __packed
The keyword is not defined and will end as public variable beeing declared
in every source that includes the header.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
600c565eb2 Revert "UefiPayloadPkg: Add FV Guid for DXEFV and PLDFV"
This reverts commit 4bac086e8e.
Breaks coreboot integration.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
aae506ce44 UefiPayloadPkg/BlSMMStoreDxe: Support Secureboot
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
bf2ca74bb6 UefiPayloadPkg: Update APRIORI
Make sure that:
* FaultTolerantDxe is started before VariableRuntimeDxe
  This ensures that FailedTolerantPei is not required and faults when writing
  the variable store are discovered
* SMBUSConfigLoader is started right after VariableRuntimeDxe
  This ensured that the board specific variables are updated as soon as possible
* Start SmbiosDxe and BlSupportDxeSmbios early to install board specific NULL protocols
* Start SecureBootConfigDxe right after VariableRuntimeDxe to update SecureBootKeys before
  Tcg2Dxe starts

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
654e5958cd Fix TPM detection
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
9657bbe08f MdeModulePkg: Be more verbose about SecureBoot and the reason why the boot failed
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
10cbbe06d3 [HACK]UefiPayloadPkg: Fix TPM2 support without PEI
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
802391f1fe UefiPayloadPkg/SecureBootEnrollDefaultKeys: Make SecureBoot configurable
Signed-off-by: Christian Walter <christian.walter@9elements.com>
2021-11-02 19:24:49 -06:00
db04386fd9 UefiPayloadPkg: Check TPM PPI requests in PlatformBootManager
Test if the user need to confirm TPM Physical presence commands.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
7d5abcd016 UefiPayloadPkg: Parse coreboot's TPM PPI handoff buffer
Read the coreboot table containing the TPM PPI handoff buffer and
place it in gEfiTcgPhysicalPresenceInfoHob.

coreboot uses the same PPI interface as QEMU does and installs the
corresponding ACPI code to provide a full PPI interface to the OS.
The OS must reboot in order to execute the requests.

The corresponding coreboot patch can be found here:
https://review.coreboot.org/c/coreboot/+/45568

In a follow up commit the OvmfPkg PhysicalPresence library will be used
to confirm TPM PPI request. This is necessary as coreboot doesn't have
input drivers or a graphical UI that could be used.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
d296a36cc4 OvmfPkg/Library/Tcg2PhysicalPresenceLibQemu: Add timeout
Instead of waiting and infinite time, abort the TPM PPI request after
3 minutes. This allow to boot headless platforms where no keyboard is
attached or the user didn't made it in time.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
bdb15bf9ba OvmfPkg: Introduce Tcg2PhysicalPresencePlatformLib
Put the PPI configuration retriveal into an own library.
That will allow to reuse the code in the UefipayloadPkg, where the
firmware provides the ACPI tables, like QEMU does on OvmfPkg.

However one major difference is that the PPI interface in UefiPayloadPkg
is not backed by a MMIO device, but resides in DRAM and is shared with ACPI code.

Add an additional parameter to provide the location of the PPI and
test if the memory region has the correct attributes.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
25af751320 UefiPayloadPkg: Add TPM support
* Add support for TPM1.2 and TPM2.

This adds measured boot support and will be extended with Secureboot.

Signed-off-by: Christian Walter <christian.walter@9elements.com>
2021-11-02 19:24:49 -06:00
7f99fae217 UefiPayloadPkg: Advertise TPM support in BlSupportDxe
In BlSupportDxe read the AcpiBoardInfo and set PcdTpmInstanceGuid
to indicate that a TPM is likely present as TPM tables had been installed
by the bootloader.

The Tcg*Dxes will probe for the TPM, so no need to do it here as well.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
c134065066 UefiPayloadPkg: Check more ACPI tables
Probe for ACPI tables
* TPM2
* TCPA
and store the result in AcpiBoardInfo.

Will be used to determine if a TPM1.2 or TPM2.0 is present.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
eec38fd383 UefiPayloadPkg: Add Secureboot support
Must use RuntimeVariableDxe instead of EmuVariableDxe.
Currently doesn't boot on qemu.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
b9564773f1 UefiPayloadPkg: Scan for Option ROMs
Install the gPciPlatformProtocol to scan for Option ROMs.

For every device we probe the Option ROM and provide a pointer
to the activated BAR if found.

It's safe to assume that all ROM bars have been enumerated,
reserved in the bridge resources and are disabled by default.
This is made a mandatory bootloader requirement in the next commit.

Enabling them and leaving them enabled will do no harm.

This can easily be tested on qemu, where it will start finding Option ROMs
for VGA and network cards.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Signed-off-by: Marcello Sylvester Bauer <marcello.bauer@9elements.com>
Cc: Patrick Rudolph <patrick.rudolph@9elements.com>
Cc: Christian Walter <christian.walter@9elements.com>
Cc: Maurice Ma <maurice.ma@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
2021-11-02 19:24:49 -06:00
8c767bb014 Ps2KbdCtrller: Make wait for SUCCESS after BAT non-fatal
Recent model Chromebooks only return ACK, but not
BAT_SUCCESS, which causes hanging and failed ps2k init.
To mitigate this, make the absence of BAT_SUCCESS reply
non-fatal, and reduce the no-reply timeout from 4s to 1s.

Tested on google/dracia and purism/librem_14

Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:49 -06:00
7386ad5ae3 UefiPayloadPkg: don't set PcdDebugPropertyMask for release builds
Don't set PcdDebugPropertyMask for release builds, and properly set it
for debug builds based on SOURCE_DEBUG_ENABLE.

Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:49 -06:00
e727453a97 SdMmcPciDxe: Reduce timeout for SD card reset
Previous 1s timeout causeed stalls on boot splash with no benefit.
Reduced to 100ms and no interruptions to boot when no SD card inserted.

Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:49 -06:00
553bda4d8e BaseTools: array.fromstring and array.tostring removed in python 3.9
array.fromstring and array.tostring deprecated, and alias for
array.frombytes and array.tobytes. Deprecated since version 3.2,
have been removed in version python 3.9.

Cc: Bob Feng <bob.c.feng@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Signed-off-by: Yunhua Feng <fengyunhua@byosoft.com.cn>
2021-11-02 19:24:49 -06:00
3e7febc83c BlSMMStoreDxe: make error msgs unique
Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:49 -06:00
b664a5352c UefiPayloadPkg: Allow boot timeout to be set via cmd line
Allows for devices w/o internal display to set a longer timeout
via coreboot Kconfig

Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:49 -06:00
b376a7d60f ShellPkg: disable startup script, show welcome banner
Startup script does nothing other than confuse users.
Show a welcome banner and tell users how to exit.

Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:49 -06:00
3fb944f925 UefiPayloadPkg: Update APRIORI
Make sure that:
* FaultTolerantDxe is started before VariableRuntimeDxe
  This ensures that FailedTolerantPei is not required and faults when writing
  the variable store are discovered
* Start BlSupportDxeSmbios early to install board specific NULL protocols

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
1d70aa7a9b UefiCpuPkg: Disable MTRR programming for UefiPayloadPkg
The MTRRs have already been programmed by FSB.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
0bef9ccd43 UefiPayloadPkg: Add support for Firmware Volume Block Protocol
This adds support for FVB in order to support a platform independent
and non-volatile variable store on UefiPayloadPkg. It is required for
non-volatile variable support, TPM support, Secureboot support and more.

Since commit bc744f5893fc4d53275ed26dd8d968011c6a09c1 coreboot supports
the SMMSTORE v2 feature. It implements a SMI handler that is able to
write, read and erase pages in the boot media (SPI flash).
The communication is done using a fixed communication buffer that is
allocated in CBMEM. The existence of this optional feature is advertised
by a coreboot table.
When the SMMSTORE feature is not available the variable emulation is used
by setting PcdEmuVariableNvModeEnable to TRUE.

Add a library for SMMStore to be used in DXE.

The DXE component provides runtime services and takes care of virtual to
physical mapping the communication buffers between SMM and OS.

Make use of the APRIORI DXE to initialize an empty store on the first boot
and set the PCDs to sane values before the variable driver is loaded.

Tests on Intel(R) Xeon(R) E-2288G CPU @ 3.70G showed that the SMI isn't
triggered with a probability of 1:40 of all cases when called in a tight
loop. The CPU continues running and the SMI is triggeres asynchronously
a few clock cycles later. coreboot only handels synchronous APM request
and does nothing on asynchronous APM triggers.

As there's no livesign from SMM it's impossible to tell if the handler
has run. Just wait a bit and try again to trigger a synchronous SMI.

Tests confirmed that out of 5 million tries the SMI is now always handled.

Tested on Linux and Windows 10 on real hardware.
Currently this cannot be tested on coreboot and qemu as it doesn't support
the SMMSTORE on qemu.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
d3b38ea28a UefiPayloadPkg/Library/PlatformBootManagerLib: Remove broken VGA detection
This fixes an issue where the framebuffer provided by coreboot or
slimbootloader will only work on the primary VGA device. If the
framebuffer corresponds to a different device the screen will stay black.
In addition, the code doesn't work for multiple graphic cards, has
reference to non existing functions, and is a duplication of common code.

Call EfiBootManagerConnectVideoController on every display device found,
not only the legacy VGA device. This is the same as OvmfPkg does.

Allows to display output on the framebuffer set up by firmware, which might
not be the VGA device.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
69ae47ba5d UefiPayloadPkg: Add RNG support
Uses the RDRAND instruction if available and install EfiRngProtocol.
The protocol may be used by iPXE or the Linux kernel to gather entropy.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
95c492569f UefiPayloadPkg: Use new filesystem drivers
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
d996a4bc9f Add filesystem drivers
Add EXT2/EXT4, exFAT, NTFS filesystem drivers.
Do not add ISO9115 drivers as it breaks El Torito boot.
2021-11-02 19:24:49 -06:00
9f528fb4c0 MdeModulePkg/Usb/Keyboard.c: don't request protocol before setting
No need to check the interface protocol then conditionally setting,
just set it to BOOT_PROTOCOL and check for error.

This is what Linux does for HID devices as some don't follow the USB spec.
One example is the Aspeed BMC HID keyboard device, which adds a massive
boot delay without this patch as it doesn't respond to 'GetProtocolRequest'.

Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-11-02 19:24:49 -06:00
bbab5b95b4 MdeModulePkg/Usb/Keyboard.c: remove Get/SetConfig calls
SetConfig is already called during device enumeration,
no need to do it again here.

Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:49 -06:00
5e84cc0714 UefiPayloadPkg: Reduce timeout to 2s
Current firmware does not honor PcdPlatformBootTimeOut and hard-codes a
timeout of 2s.
2021-11-02 19:24:48 -06:00
2af54dd5bd UefiPayloadPkg: Stall before connecting devices
USB devices are not being detected when booting. Pause a bit for them to
be initialized and detected by EfiBootManagerConnectAll().
2021-11-02 19:24:48 -06:00
00283317d8 MdeModulePkg/BdsDxe: Forward any key for booting
Pressing escape will bring a user to the boot manager. Pressing any
other key will continue booting, forwarding the key to systemd-boot.
2021-11-02 19:24:48 -06:00
232f661f99 MdeModulePkg: Wait for input after boot failure
Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:48 -06:00
552ca5cc88 UefiPayloadPkg: Clear screen on boot error 2021-11-02 19:24:48 -06:00
94e7cfc7e7 UefiPayloadPkg: Copy PlatformBootManagerUnableToBoot() from OvmfPkg 2021-11-02 19:24:48 -06:00
de7030ed26 UefiPayloadPkg: Set ResetOnMemoryTypeInformationChange to FALSE
the default value, TRUE, causes reboots if a device boots to the
shell, exits, and then attempts to boot from another source.

Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:48 -06:00
587653cd8b MdeModulePkg/SdMmcPciHcDxe: add Bayhub support
Add support for Bayhub eMMC controller found on AMD
Stoneyridge Chromebooks.

Test: build/boot various google/kahlee-based devices

Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:48 -06:00
e167ed1a3d MdeModulePkg/GraphicsConsole: don't draw cursor at 0,0
Prevents cursor from flashing on screen when
changing modes or clearing the screen.

Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:48 -06:00
003534f8f0 MdeModulePkg/BmBootDesciption: Improve device descriptions
Add device type prefixes for USB, IDE, SATA, and NVMe drives.
Remove UEFI prefix, remove serial numbers.

Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:48 -06:00
a363907bc9 MdeModulePkg/BmBoot: skip secondary eMMC entries
Internal eMMC devices often show multiple entries, so skip
any after the initial entry.

Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:48 -06:00
530cc53f96 MdeModulePkg/Frontpage: get SMBIOS Data from table directly
rather than getting it from the EFI SMBIOS protocol

Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:48 -06:00
112268c70d MdeModulePkg/GraphicsConsole: Don't re-set video output mode
Fixes display resolution issues with booting OS X

Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:48 -06:00
726280b214 UefiPayloadPkg: Disable Device Manager 2021-11-02 19:24:48 -06:00
b1ab82d4c8 BmpSupportLib: fix BMP validation
BMP files by tools other than MS paint can have a
variable number of padding bytes, which results in
the DataSize being less than (ImageSize - HeaderSize).
Fix the check to be less stringent.

Test: use BMP created by/saved by Photoshop

Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:48 -06:00
2e16857f3d MdeModulePkg: load boot logo into BGRT table
This is a shoehorned-in implementation of an ACPI BGRT
table, ported pretty much directly from the version used
under CorebootPayloadPkg.

EDK2 provides a facility to do this already, but it assumes
the ACPI tables already exist as EFI structures, so would need
to write code to populate those using the tables already in RAM
created by coreboot. This seemed like the easier option ATM.

Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:48 -06:00
308f9a49b0 MdeModulePkg/BootLogoLib: Center logo 38.2% from top of screen
Use Microsoft's recommended positioning [1] for the boot logo.

> We recommend that the logo is placed with its center at 38.2% from the
> screen's top edge. This positioning is based on the golden ratio's
> visual aesthetics and matches the Windows 10 design proportions.

[1]: https://docs.microsoft.com/en-us/windows-hardware/drivers/bringup/boot-screen-components#position-the-logo-during-post
2021-11-02 19:24:48 -06:00
7ab09015b1 MdeModulePkg/Logo: Use System76 boot logo 2021-11-02 19:24:48 -06:00
d1c0828262 UefiPayloadPkg: Enable boot logo 2021-11-02 19:24:48 -06:00
b4dd94c217 UefiPayloadPkg: Show boot message as progress text
Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
2021-11-02 19:24:48 -06:00
f428f538b6 UefiPayloadPkg: Map ESC to Boot Manager
Change menu key from F2 to ESC, remove extranous text
2021-11-02 19:24:48 -06:00
75b91c0b9f UefiPayloadPkg: Enable PS2 keyboard by default 2021-10-21 21:32:54 -06:00
9f1dd0acb1 UefiPayloadPkg: Default to coreboot 2021-10-21 21:32:54 -06:00
6db1a5555a UefiPayloadPkg: Increase FV size
The following commits need additional space.

Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
2021-10-21 21:24:56 -06:00
72f8b9d80b UefiPayloadPkg: Fix the build error when enable Core ci for UefiPayloadPkg
V1: Add quotes when using $(ARCH) in .dsc and .fdf file.
The quotes are added due to the way by which Core ci parse the .dsc file.
Add UINTN in Hob.c to fix cast from pointer to integer of different size error.
V2: Delete lines which reference ShellBinPkg.The pkg doesn't exist in edk2.

Cc: Guo Dong <guo.dong@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Maurice Ma <maurice.ma@intel.com>
Cc: Benjamin You <benjamin.you@intel.com>
Signed-off-by: DunTan <dun.tan@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
Change-Id: I18c2027f57a4fbf291925a11226ed620b808a970
2021-10-21 21:24:48 -06:00
4723 changed files with 347607 additions and 386101 deletions

View File

@ -17,7 +17,7 @@ parameters:
jobs: jobs:
- job: Build_${{ parameters.tool_chain_tag }} - job: Build_${{ parameters.tool_chain_tag }}
timeoutInMinutes: 120
#Use matrix to speed up the build process #Use matrix to speed up the build process
strategy: strategy:
matrix: matrix:
@ -48,9 +48,6 @@ jobs:
TARGET_SECURITY: TARGET_SECURITY:
Build.Pkgs: 'SecurityPkg' Build.Pkgs: 'SecurityPkg'
Build.Targets: 'DEBUG,RELEASE,NO-TARGET' Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
TARGET_UEFIPAYLOAD:
Build.Pkgs: 'UefiPayloadPkg'
Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
TARGET_PLATFORMS: TARGET_PLATFORMS:
# For Platforms only check code. Leave it to Platform CI # For Platforms only check code. Leave it to Platform CI
# to build them. # to build them.

View File

@ -67,8 +67,7 @@ class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManag
"CryptoPkg", "CryptoPkg",
"UnitTestFrameworkPkg", "UnitTestFrameworkPkg",
"OvmfPkg", "OvmfPkg",
"RedfishPkg", "RedfishPkg"
"UefiPayloadPkg"
) )
def GetArchitecturesSupported(self): def GetArchitecturesSupported(self):

View File

@ -30,6 +30,7 @@ class EccCheck(ICiBuildPlugin):
}, },
""" """
ReModifyFile = re.compile(r'[B-Q,S-Z]+[\d]*\t(.*)')
FindModifyFile = re.compile(r'\+\+\+ b\/(.*)') FindModifyFile = re.compile(r'\+\+\+ b\/(.*)')
LineScopePattern = (r'@@ -\d*\,*\d* \+\d*\,*\d* @@.*') LineScopePattern = (r'@@ -\d*\,*\d* \+\d*\,*\d* @@.*')
LineNumRange = re.compile(r'@@ -\d*\,*\d* \+(\d*)\,*(\d*) @@.*') LineNumRange = re.compile(r'@@ -\d*\,*\d* \+(\d*)\,*(\d*) @@.*')
@ -68,174 +69,77 @@ class EccCheck(ICiBuildPlugin):
env.set_shell_var('WORKSPACE', workspace_path) env.set_shell_var('WORKSPACE', workspace_path)
env.set_shell_var('PACKAGES_PATH', os.pathsep.join(Edk2pathObj.PackagePathList)) env.set_shell_var('PACKAGES_PATH', os.pathsep.join(Edk2pathObj.PackagePathList))
self.ECC_PASS = True self.ECC_PASS = True
self.ApplyConfig(pkgconfig, workspace_path, basetools_path, packagename)
# Create temp directory modify_dir_list = self.GetModifyDir(packagename)
temp_path = os.path.join(workspace_path, 'Build', '.pytool', 'Plugin', 'EccCheck') patch = self.GetDiff(packagename)
try: ecc_diff_range = self.GetDiffRange(patch, packagename, workspace_path)
# Delete temp directory self.GenerateEccReport(modify_dir_list, ecc_diff_range, workspace_path, basetools_path)
if os.path.exists(temp_path): ecc_log = os.path.join(workspace_path, "Ecc.log")
shutil.rmtree(temp_path) self.RevertCode()
# Copy package being scanned to temp_path
shutil.copytree (
os.path.join(workspace_path, packagename),
os.path.join(temp_path, packagename),
symlinks=True
)
# Copy exception.xml to temp_path
shutil.copyfile (
os.path.join(basetools_path, "Source", "Python", "Ecc", "exception.xml"),
os.path.join(temp_path, "exception.xml")
)
# Output file to use for git diff operations
temp_diff_output = os.path.join (temp_path, 'diff.txt')
self.ApplyConfig(pkgconfig, temp_path, packagename)
modify_dir_list = self.GetModifyDir(packagename, temp_diff_output)
patch = self.GetDiff(packagename, temp_diff_output)
ecc_diff_range = self.GetDiffRange(patch, packagename, temp_path)
#
# Use temp_path as working directory when running ECC tool
#
self.GenerateEccReport(modify_dir_list, ecc_diff_range, temp_path, basetools_path)
ecc_log = os.path.join(temp_path, "Ecc.log")
if self.ECC_PASS: if self.ECC_PASS:
# Delete temp directory
if os.path.exists(temp_path):
shutil.rmtree(temp_path)
tc.SetSuccess() tc.SetSuccess()
self.RemoveFile(ecc_log)
return 0 return 0
else: else:
with open(ecc_log, encoding='utf8') as output: with open(ecc_log, encoding='utf8') as output:
ecc_output = output.readlines() ecc_output = output.readlines()
for line in ecc_output: for line in ecc_output:
logging.error(line.strip()) logging.error(line.strip())
# Delete temp directory self.RemoveFile(ecc_log)
if os.path.exists(temp_path): tc.SetFailed("EccCheck failed for {0}".format(packagename), "Ecc detected issues")
shutil.rmtree(temp_path)
tc.SetFailed("EccCheck failed for {0}".format(packagename), "CHECK FAILED")
return 1
except KeyboardInterrupt:
# If EccCheck is interrupted by keybard interrupt, then return failure
# Delete temp directory
if os.path.exists(temp_path):
shutil.rmtree(temp_path)
tc.SetFailed("EccCheck interrupted for {0}".format(packagename), "CHECK FAILED")
return 1
else:
# If EccCheck fails for any other exception type, raise the exception
# Delete temp directory
if os.path.exists(temp_path):
shutil.rmtree(temp_path)
tc.SetFailed("EccCheck exception for {0}".format(packagename), "CHECK FAILED")
raise
return 1 return 1
def GetDiff(self, pkg: str, temp_diff_output: str) -> List[str]: def RevertCode(self) -> None:
patch = [] submoudle_params = "submodule update --init"
# RunCmd("git", submoudle_params)
# Generate unified diff between origin/master and HEAD. reset_params = "reset HEAD --hard"
# RunCmd("git", reset_params)
params = "diff --output={} --unified=0 origin/master HEAD".format(temp_diff_output)
RunCmd("git", params) def GetDiff(self, pkg: str) -> List[str]:
with open(temp_diff_output) as file: return_buffer = StringIO()
patch = file.read().strip().split('\n') params = "diff --unified=0 origin/master HEAD"
RunCmd("git", params, outstream=return_buffer)
p = return_buffer.getvalue().strip()
patch = p.split("\n")
return_buffer.close()
return patch return patch
def GetModifyDir(self, pkg: str, temp_diff_output: str) -> List[str]: def RemoveFile(self, file: str) -> None:
# if os.path.exists(file):
# Generate diff between origin/master and HEAD using --diff-filter to os.remove(file)
# exclude deleted and renamed files that do not need to be scanned by return
# ECC. Also use --name-status to only generate the names of the files
# with differences. The output format of this git diff command is a
# list of files with the change status and the filename. The filename
# is always at the end of the line. Examples:
#
# M MdeModulePkg/Application/CapsuleApp/CapsuleApp.h
# M MdeModulePkg/Application/UiApp/FrontPage.h
#
params = "diff --output={} --diff-filter=dr --name-status origin/master HEAD".format(temp_diff_output)
RunCmd("git", params)
dir_list = []
with open(temp_diff_output) as file:
dir_list = file.read().strip().split('\n')
def GetModifyDir(self, pkg: str) -> List[str]:
return_buffer = StringIO()
params = "diff --name-status" + ' HEAD' + ' origin/master'
RunCmd("git", params, outstream=return_buffer)
p1 = return_buffer.getvalue().strip()
dir_list = p1.split("\n")
return_buffer.close()
modify_dir_list = [] modify_dir_list = []
for modify_dir in dir_list: for modify_dir in dir_list:
# file_path = self.ReModifyFile.findall(modify_dir)
# Parse file name from the end of the line if file_path:
# file_dir = os.path.dirname(file_path[0])
file_path = modify_dir.strip().split() else:
#
# Skip lines that do not have at least 2 elements (status and file name)
#
if len(file_path) < 2:
continue continue
# if pkg in file_dir and file_dir != pkg:
# Parse the directory name from the file name modify_dir_list.append('%s' % file_dir)
# else:
file_dir = os.path.dirname(file_path[-1])
#
# Skip directory names that do not start with the package being scanned.
#
if file_dir.split('/')[0] != pkg:
continue continue
#
# Skip directory names that are identical to the package being scanned.
# The assumption here is that there are no source files at the package
# root. Instead, the only expected files in the package root are
# EDK II meta data files (DEC, DSC, FDF).
#
if file_dir == pkg:
continue
#
# Skip directory names that are already in the modified dir list
#
if file_dir in modify_dir_list:
continue
#
# Add the candidate directory to scan to the modified dir list
#
modify_dir_list.append(file_dir)
# modify_dir_list = list(set(modify_dir_list))
# Remove duplicates from modify_dir_list return modify_dir_list
# Given a folder path, ECC performs a recursive scan of that folder.
# If a parent and child folder are both present in modify_dir_list,
# then ECC will perform redudanct scans of source files. In order
# to prevent redundant scans, if a parent and child folder are both
# present, then remove all the child folders.
#
# For example, if modified_dir_list contains the following elements:
# MdeModulePkg/Core/Dxe
# MdeModulePkg/Core/Dxe/Hand
# MdeModulePkg/Core/Dxe/Mem
#
# Then MdeModulePkg/Core/Dxe/Hand and MdeModulePkg/Core/Dxe/Mem should
# be removed because the files in those folders are covered by a scan
# of MdeModulePkg/Core/Dxe.
#
filtered_list = []
for dir1 in modify_dir_list:
Append = True
for dir2 in modify_dir_list:
if dir1 == dir2:
continue
common = os.path.commonpath([dir1, dir2])
if os.path.normpath(common) == os.path.normpath(dir2):
Append = False
break
if Append and dir1 not in filtered_list:
filtered_list.append(dir1)
return filtered_list
def GetDiffRange(self, patch_diff: List[str], pkg: str, temp_path: str) -> Dict[str, List[Tuple[int, int]]]: def GetDiffRange(self, patch_diff: List[str], pkg: str, workingdir: str) -> Dict[str, List[Tuple[int, int]]]:
IsDelete = True IsDelete = True
StartCheck = False StartCheck = False
range_directory: Dict[str, List[Tuple[int, int]]] = {} range_directory: Dict[str, List[Tuple[int, int]]] = {}
for line in patch_diff: for line in patch_diff:
modify_file = self.FindModifyFile.findall(line) modify_file = self.FindModifyFile.findall(line)
if modify_file and pkg in modify_file[0] and not StartCheck and os.path.isfile(modify_file[0]): if modify_file and pkg in modify_file[0] and not StartCheck and os.path.isfile(modify_file[0]):
modify_file_comment_dic = self.GetCommentRange(modify_file[0], temp_path) modify_file_comment_dic = self.GetCommentRange(modify_file[0], workingdir)
IsDelete = False IsDelete = False
StartCheck = True StartCheck = True
modify_file_dic = modify_file[0] modify_file_dic = modify_file[0]
@ -254,13 +158,11 @@ class EccCheck(ICiBuildPlugin):
range_directory[modify_file_dic].append(i) range_directory[modify_file_dic].append(i)
return range_directory return range_directory
def GetCommentRange(self, modify_file: str, temp_path: str) -> List[Tuple[int, int]]: def GetCommentRange(self, modify_file: str, workingdir: str) -> List[Tuple[int, int]]:
comment_range: List[Tuple[int, int]] = [] modify_file_path = os.path.join(workingdir, modify_file)
modify_file_path = os.path.join(temp_path, modify_file)
if not os.path.exists (modify_file_path):
return comment_range
with open(modify_file_path) as f: with open(modify_file_path) as f:
line_no = 1 line_no = 1
comment_range: List[Tuple[int, int]] = []
Start = False Start = False
for line in f: for line in f:
if line.startswith('/**'): if line.startswith('/**'):
@ -277,33 +179,35 @@ class EccCheck(ICiBuildPlugin):
return comment_range return comment_range
def GenerateEccReport(self, modify_dir_list: List[str], ecc_diff_range: Dict[str, List[Tuple[int, int]]], def GenerateEccReport(self, modify_dir_list: List[str], ecc_diff_range: Dict[str, List[Tuple[int, int]]],
temp_path: str, basetools_path: str) -> None: workspace_path: str, basetools_path: str) -> None:
ecc_need = False ecc_need = False
ecc_run = True ecc_run = True
config = os.path.normpath(os.path.join(basetools_path, "Source", "Python", "Ecc", "config.ini")) config = os.path.join(basetools_path, "Source", "Python", "Ecc", "config.ini")
exception = os.path.normpath(os.path.join(temp_path, "exception.xml")) exception = os.path.join(basetools_path, "Source", "Python", "Ecc", "exception.xml")
report = os.path.normpath(os.path.join(temp_path, "Ecc.csv")) report = os.path.join(workspace_path, "Ecc.csv")
for modify_dir in modify_dir_list: for modify_dir in modify_dir_list:
target = os.path.normpath(os.path.join(temp_path, modify_dir)) target = os.path.join(workspace_path, modify_dir)
logging.info('Run ECC tool for the commit in %s' % modify_dir) logging.info('Run ECC tool for the commit in %s' % modify_dir)
ecc_need = True ecc_need = True
ecc_params = "-c {0} -e {1} -t {2} -r {3}".format(config, exception, target, report) ecc_params = "-c {0} -e {1} -t {2} -r {3}".format(config, exception, target, report)
return_code = RunCmd("Ecc", ecc_params, workingdir=temp_path) return_code = RunCmd("Ecc", ecc_params, workingdir=workspace_path)
if return_code != 0: if return_code != 0:
ecc_run = False ecc_run = False
break break
if not ecc_run: if not ecc_run:
logging.error('Fail to run ECC tool') logging.error('Fail to run ECC tool')
self.ParseEccReport(ecc_diff_range, temp_path) self.ParseEccReport(ecc_diff_range, workspace_path)
if not ecc_need: if not ecc_need:
logging.info("Doesn't need run ECC check") logging.info("Doesn't need run ECC check")
revert_params = "checkout -- {}".format(exception)
RunCmd("git", revert_params)
return return
def ParseEccReport(self, ecc_diff_range: Dict[str, List[Tuple[int, int]]], temp_path: str) -> None: def ParseEccReport(self, ecc_diff_range: Dict[str, List[Tuple[int, int]]], workspace_path: str) -> None:
ecc_log = os.path.join(temp_path, "Ecc.log") ecc_log = os.path.join(workspace_path, "Ecc.log")
ecc_csv = os.path.join(temp_path, "Ecc.csv") ecc_csv = os.path.join(workspace_path, "Ecc.csv")
row_lines = [] row_lines = []
ignore_error_code = self.GetIgnoreErrorCode() ignore_error_code = self.GetIgnoreErrorCode()
if os.path.exists(ecc_csv): if os.path.exists(ecc_csv):
@ -332,16 +236,16 @@ class EccCheck(ICiBuildPlugin):
log.writelines(all_line) log.writelines(all_line)
return return
def ApplyConfig(self, pkgconfig: Dict[str, List[str]], temp_path: str, pkg: str) -> None: def ApplyConfig(self, pkgconfig: Dict[str, List[str]], workspace_path: str, basetools_path: str, pkg: str) -> None:
if "IgnoreFiles" in pkgconfig: if "IgnoreFiles" in pkgconfig:
for a in pkgconfig["IgnoreFiles"]: for a in pkgconfig["IgnoreFiles"]:
a = os.path.join(temp_path, pkg, a) a = os.path.join(workspace_path, pkg, a)
a = a.replace(os.sep, "/") a = a.replace(os.sep, "/")
logging.info("Ignoring Files {0}".format(a)) logging.info("Ignoring Files {0}".format(a))
if os.path.exists(a): if os.path.exists(a):
if os.path.isfile(a): if os.path.isfile(a):
os.remove(a) self.RemoveFile(a)
elif os.path.isdir(a): elif os.path.isdir(a):
shutil.rmtree(a) shutil.rmtree(a)
else: else:
@ -349,7 +253,7 @@ class EccCheck(ICiBuildPlugin):
if "ExceptionList" in pkgconfig: if "ExceptionList" in pkgconfig:
exception_list = pkgconfig["ExceptionList"] exception_list = pkgconfig["ExceptionList"]
exception_xml = os.path.join(temp_path, "exception.xml") exception_xml = os.path.join(basetools_path, "Source", "Python", "Ecc", "exception.xml")
try: try:
logging.info("Appending exceptions") logging.info("Appending exceptions")
self.AppendException(exception_list, exception_xml) self.AppendException(exception_list, exception_xml)

View File

@ -5,7 +5,6 @@
## ##
import os import os
import shutil
import logging import logging
import re import re
from io import StringIO from io import StringIO
@ -62,19 +61,12 @@ class LicenseCheck(ICiBuildPlugin):
# - Junit Logger # - Junit Logger
# - output_stream the StringIO output stream from this plugin via logging # - output_stream the StringIO output stream from this plugin via logging
def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, PLMHelper, tc, output_stream=None): def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, PLMHelper, tc, output_stream=None):
# Create temp directory return_buffer = StringIO()
temp_path = os.path.join(Edk2pathObj.WorkspacePath, 'Build', '.pytool', 'Plugin', 'LicenseCheck') params = "diff --unified=0 origin/master HEAD"
if not os.path.exists(temp_path): RunCmd("git", params, outstream=return_buffer)
os.makedirs(temp_path) p = return_buffer.getvalue().strip()
# Output file to use for git diff operations patch = p.split("\n")
temp_diff_output = os.path.join (temp_path, 'diff.txt') return_buffer.close()
params = "diff --output={} --unified=0 origin/master HEAD".format(temp_diff_output)
RunCmd("git", params)
with open(temp_diff_output) as file:
patch = file.read().strip().split("\n")
# Delete temp directory
if os.path.exists(temp_path):
shutil.rmtree(temp_path)
ignore_files = [] ignore_files = []
if "IgnoreFiles" in pkgconfig: if "IgnoreFiles" in pkgconfig:

View File

@ -1,120 +0,0 @@
# UncrustifyCheck Plugin
This CiBuildPlugin scans all the files in a given package and checks for coding standard compliance issues.
This plugin is enabled by default. If a package would like to prevent the plugin from reporting errors, it can do
so by enabling [`AuditOnly`](#auditonly) mode.
This plugin requires the directory containing the Uncrustify executable that should be used for this plugin to
be specified in an environment variable named `UNCRUSTIFY_CI_PATH`. This unique variable name is used to avoid confusion
with other paths to Uncrustify which might not be the expected build for use by this plugin.
By default, an Uncrustify configuration file named "uncrustify.cfg" located in the same directory as the plugin is
used. The value can be overridden to a package-specific path with the `ConfigFilePath` configuration file option.
* Uncrustify source code and documentation: https://github.com/uncrustify/uncrustify
* Project Mu Uncrustify fork source code and documentation: https://dev.azure.com/projectmu/Uncrustify
## Files Checked in a Package
By default, this plugin will discover all files in the package with the following default paths:
```python
[
# C source
"*.c",
"*.h"
]
```
From this list of files, any files ignored by Git or residing in a Git submodule will be removed. If Git is not
found, submodules are not found, or ignored files are not found no changes are made to the list of discovered files.
To control the paths checked in a given package, review the configuration options described in this file.
## Configuration
The plugin can be configured with a few optional configuration options.
``` yaml
"UncrustifyCheck": {
"AdditionalIncludePaths": [], # Additional paths to check formatting (wildcards supported).
"AuditOnly": False, # Don't fail the build if there are errors. Just log them.
"ConfigFilePath": "", # Custom path to an Uncrustify config file.
"IgnoreStandardPaths": [], # Standard Plugin defined paths that should be ignored.
"OutputFileDiffs": False, # Output chunks of formatting diffs in the test case log.
# This can significantly slow down the plugin on very large packages.
"SkipGitExclusions": False # Don't exclude git ignored files and files in git submodules.
}
```
### `AdditionalIncludePaths`
A package configuration file can specify any additional paths to be included with this option.
At this time, it is recommended all files run against the plugin be written in the C or C++ language.
### `AuditOnly`
`Boolean` - Default is `False`.
If `True`, run the test in an "audit only mode" which will log all errors but instead of failing the build, it will set
the test as skipped. This allows visibility into the failures without breaking the build.
### `ConfigFilePath`
`String` - Default is `"uncrustify.cfg"`
When specified in the config file, this is a package relative path to the Uncrustify configuration file.
### `IgnoreStandardPaths`
This plugin by default will check the below standard paths. A package configuration file can specify any of these paths
to be ignored.
```python
[
# C source
"*.c",
"*.h"
]
```
### `OutputFileDiffs`
`Boolean` - Default is `False`.
If `True`, output diffs of formatting changes into the test case log. This is helpful to exactly understand what changes
need to be made to the source code in order to fix a coding standard compliance issue.
Note that calculating the file diffs on a very large set of of results (e.g. >100 files) can significantly slow down
plugin execution.
### `SkipGitExclusions`
`Boolean` - Default is `False`.
By default, files in paths matched in a .gitignore file or a recognized git submodule are excluded. If this option
is `True`, the plugin will not attempt to recognize these files and exclude them.
## High-Level Plugin Operation
This plugin generates two main sets of temporary files:
1. A working directory in the directory `Build/.pytool/Plugin/Uncrustify`
2. For each source file with formatting errors, a sibling file with the `.uncrustify_plugin` extension
The working directory contains temporary files unique to operation of the plugin. All of these files are removed on
exit of the plugin including successful or unsuccessful execution (such as a Python exception occurring). If for any
reason, any files in the package exist prior to running the plugin with the `.uncrustify_plugin` extension, the plugin
will inform the user to remove these files and exit before running Uncrustify. This is to ensure the accuracy of the
results reported from each execution instance of the plugin.
The plugin determines the list of relevant files to check with Uncrustify and then invokes Uncrustify with that file
list. For any files not compliant to the configuration file provided, Uncrustify will generate a corresponding file
with the `.uncrustify_plugin` extension. The plugin discovers all of these files. If any such files are present, this
indicates a formatting issue was found and the test is marked failed (unless `AuditOnly` mode is enabled).
The test case log will contain a report of which files failed to format properly, allowing the user to run Uncrustify
against the file locally to fix the issue. If the `OutputFileDiffs` configuration option is set to `True`, the plugin
will output diff chunks for all code formatting issues in the test case log.

View File

@ -1,618 +0,0 @@
# @file UncrustifyCheck.py
#
# An edk2-pytool based plugin wrapper for Uncrustify
#
# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: BSD-2-Clause-Patent
##
import configparser
import difflib
import errno
import logging
import os
import pathlib
import shutil
import timeit
from edk2toolext.environment import version_aggregator
from edk2toolext.environment.plugin_manager import PluginManager
from edk2toolext.environment.plugintypes.ci_build_plugin import ICiBuildPlugin
from edk2toolext.environment.plugintypes.uefi_helper_plugin import HelperFunctions
from edk2toolext.environment.var_dict import VarDict
from edk2toollib.log.junit_report_format import JunitReportTestCase
from edk2toollib.uefi.edk2.path_utilities import Edk2Path
from edk2toollib.utility_functions import RunCmd
from io import StringIO
from typing import Any, Dict, List, Tuple
#
# Provide more user friendly messages for certain scenarios
#
class UncrustifyException(Exception):
def __init__(self, message, exit_code):
super().__init__(message)
self.exit_code = exit_code
class UncrustifyAppEnvVarNotFoundException(UncrustifyException):
def __init__(self, message):
super().__init__(message, -101)
class UncrustifyAppVersionErrorException(UncrustifyException):
def __init__(self, message):
super().__init__(message, -102)
class UncrustifyAppExecutionException(UncrustifyException):
def __init__(self, message):
super().__init__(message, -103)
class UncrustifyStalePluginFormattedFilesException(UncrustifyException):
def __init__(self, message):
super().__init__(message, -120)
class UncrustifyInputFileCreationErrorException(UncrustifyException):
def __init__(self, message):
super().__init__(message, -121)
class UncrustifyInvalidIgnoreStandardPathsException(UncrustifyException):
def __init__(self, message):
super().__init__(message, -122)
class UncrustifyGitIgnoreFileException(UncrustifyException):
def __init__(self, message):
super().__init__(message, -140)
class UncrustifyGitSubmoduleException(UncrustifyException):
def __init__(self, message):
super().__init__(message, -141)
class UncrustifyCheck(ICiBuildPlugin):
"""
A CiBuildPlugin that uses Uncrustify to check the source files in the
package being tested for coding standard issues.
By default, the plugin runs against standard C source file extensions but
its configuration can be modified through its configuration file.
Configuration options:
"UncrustifyCheck": {
"AdditionalIncludePaths": [], # Additional paths to check formatting (wildcards supported).
"AuditOnly": False, # Don't fail the build if there are errors. Just log them.
"ConfigFilePath": "", # Custom path to an Uncrustify config file.
"IgnoreStandardPaths": [], # Standard Plugin defined paths that should be ignored.
"OutputFileDiffs": False, # Output chunks of formatting diffs in the test case log.
# This can significantly slow down the plugin on very large packages.
"SkipGitExclusions": False # Don't exclude git ignored files and files in git submodules.
}
"""
#
# By default, use an "uncrustify.cfg" config file in the plugin directory
# A package can override this path via "ConfigFilePath"
#
# Note: Values specified via "ConfigFilePath" are relative to the package
#
DEFAULT_CONFIG_FILE_PATH = os.path.join(
pathlib.Path(__file__).parent.resolve(), "uncrustify.cfg")
#
# The extension used for formatted files produced by this plugin
#
FORMATTED_FILE_EXTENSION = ".uncrustify_plugin"
#
# A package can add any additional paths with "AdditionalIncludePaths"
# A package can remove any of these paths with "IgnoreStandardPaths"
#
STANDARD_PLUGIN_DEFINED_PATHS = ("*.c", "*.h")
#
# The Uncrustify application path should set in this environment variable
#
UNCRUSTIFY_PATH_ENV_KEY = "UNCRUSTIFY_CI_PATH"
def GetTestName(self, packagename: str, environment: VarDict) -> Tuple:
""" Provide the testcase name and classname for use in reporting
Args:
packagename: string containing name of package to build
environment: The VarDict for the test to run in
Returns:
A tuple containing the testcase name and the classname
(testcasename, classname)
testclassname: a descriptive string for the testcase can include whitespace
classname: should be patterned <packagename>.<plugin>.<optionally any unique condition>
"""
return ("Check file coding standard compliance in " + packagename, packagename + ".UncrustifyCheck")
def RunBuildPlugin(self, package_rel_path: str, edk2_path: Edk2Path, package_config: Dict[str, List[str]], environment_config: Any, plugin_manager: PluginManager, plugin_manager_helper: HelperFunctions, tc: JunitReportTestCase, output_stream=None) -> int:
"""
External function of plugin. This function is used to perform the task of the CiBuild Plugin.
Args:
- package_rel_path: edk2 workspace relative path to the package
- edk2_path: Edk2Path object with workspace and packages paths
- package_config: Dictionary with the package configuration
- environment_config: Environment configuration
- plugin_manager: Plugin Manager Instance
- plugin_manager_helper: Plugin Manager Helper Instance
- tc: JUnit test case
- output_stream: The StringIO output stream from this plugin (logging)
Returns
>0 : Number of errors found
0 : Passed successfully
-1 : Skipped for missing prereq
"""
try:
# Initialize plugin and check pre-requisites.
self._initialize_environment_info(
package_rel_path, edk2_path, package_config, tc)
self._initialize_configuration()
self._check_for_preexisting_formatted_files()
# Log important context information.
self._log_uncrustify_app_info()
# Get template file contents if specified
self._get_template_file_contents()
# Create meta input files & directories
self._create_temp_working_directory()
self._create_uncrustify_file_list_file()
self._run_uncrustify()
# Post-execution actions.
self._process_uncrustify_results()
except UncrustifyException as e:
self._tc.LogStdError(
f"Uncrustify error {e.exit_code}. Details:\n\n{str(e)}")
logging.warning(
f"Uncrustify error {e.exit_code}. Details:\n\n{str(e)}")
return -1
else:
if self._formatted_file_error_count > 0:
if self._audit_only_mode:
logging.info(
"Setting test as skipped since AuditOnly is enabled")
self._tc.SetSkipped()
return -1
else:
self._tc.SetFailed(
f"{self._plugin_name} failed due to {self._formatted_file_error_count} incorrectly formatted files.", "CHECK_FAILED")
else:
self._tc.SetSuccess()
return self._formatted_file_error_count
finally:
self._cleanup_temporary_formatted_files()
self._cleanup_temporary_directory()
def _initialize_configuration(self) -> None:
"""
Initializes plugin configuration.
"""
self._initialize_app_info()
self._initialize_config_file_info()
self._initialize_file_to_format_info()
self._initialize_test_case_output_options()
def _check_for_preexisting_formatted_files(self) -> None:
"""
Checks if any formatted files from prior execution are present.
Existence of such files is an unexpected condition. This might result
from an error that occurred during a previous run or a premature exit from a debug scenario. In any case, the package should be clean before starting a new run.
"""
pre_existing_formatted_file_count = len(
[str(path.resolve()) for path in pathlib.Path(self._abs_package_path).rglob(f'*{UncrustifyCheck.FORMATTED_FILE_EXTENSION}')])
if pre_existing_formatted_file_count > 0:
raise UncrustifyStalePluginFormattedFilesException(
f"{pre_existing_formatted_file_count} formatted files already exist. To prevent overwriting these files, please remove them before running this plugin.")
def _cleanup_temporary_directory(self) -> None:
"""
Cleans up the temporary directory used for this execution instance.
This removes the directory and all files created during this instance.
"""
if hasattr(self, '_working_dir'):
self._remove_tree(self._working_dir)
def _cleanup_temporary_formatted_files(self) -> None:
"""
Cleans up the temporary formmatted files produced by Uncrustify.
This will recursively remove all formatted files generated by Uncrustify
during this execution instance.
"""
if hasattr(self, '_abs_package_path'):
formatted_files = [str(path.resolve()) for path in pathlib.Path(
self._abs_package_path).rglob(f'*{UncrustifyCheck.FORMATTED_FILE_EXTENSION}')]
for formatted_file in formatted_files:
os.remove(formatted_file)
def _create_temp_working_directory(self) -> None:
"""
Creates the temporary directory used for this execution instance.
"""
self._working_dir = os.path.join(
self._abs_workspace_path, "Build", ".pytool", "Plugin", f"{self._plugin_name}")
try:
pathlib.Path(self._working_dir).mkdir(parents=True, exist_ok=True)
except OSError as e:
raise UncrustifyInputFileCreationErrorException(
f"Error creating plugin directory {self._working_dir}.\n\n{repr(e)}.")
def _create_uncrustify_file_list_file(self) -> None:
"""
Creates the file with the list of source files for Uncrustify to process.
"""
self._app_input_file_path = os.path.join(
self._working_dir, "uncrustify_file_list.txt")
with open(self._app_input_file_path, 'w', encoding='utf8') as f:
f.writelines(f"\n".join(self._abs_file_paths_to_format))
def _execute_uncrustify(self) -> None:
"""
Executes Uncrustify with the initialized configuration.
"""
output = StringIO()
self._app_exit_code = RunCmd(
self._app_path,
f"-c {self._app_config_file} -F {self._app_input_file_path} --if-changed --suffix {UncrustifyCheck.FORMATTED_FILE_EXTENSION}", outstream=output)
self._app_output = output.getvalue().strip().splitlines()
def _get_git_ignored_paths(self) -> List[str]:
""""
Returns a list of file absolute path strings to all files ignored in this git repository.
If git is not found, an empty list will be returned.
"""
if not shutil.which("git"):
logging.warn(
"Git is not found on this system. Git submodule paths will not be considered.")
return []
outstream_buffer = StringIO()
exit_code = RunCmd("git", "ls-files --other",
workingdir=self._abs_workspace_path, outstream=outstream_buffer, logging_level=logging.NOTSET)
if (exit_code != 0):
raise UncrustifyGitIgnoreFileException(
f"An error occurred reading git ignore settings. This will prevent Uncrustify from running against the expected set of files.")
# Note: This will potentially be a large list, but at least sorted
return outstream_buffer.getvalue().strip().splitlines()
def _get_git_submodule_paths(self) -> List[str]:
"""
Returns a list of directory absolute path strings to the root of each submodule in the workspace repository.
If git is not found, an empty list will be returned.
"""
if not shutil.which("git"):
logging.warn(
"Git is not found on this system. Git submodule paths will not be considered.")
return []
if os.path.isfile(os.path.join(self._abs_workspace_path, ".gitmodules")):
logging.info(
f".gitmodules file found. Excluding submodules in {self._package_name}.")
outstream_buffer = StringIO()
exit_code = RunCmd("git", "config --file .gitmodules --get-regexp path", workingdir=self._abs_workspace_path, outstream=outstream_buffer, logging_level=logging.NOTSET)
if (exit_code != 0):
raise UncrustifyGitSubmoduleException(
f".gitmodule file detected but an error occurred reading the file. Cannot proceed with unknown submodule paths.")
submodule_paths = []
for line in outstream_buffer.getvalue().strip().splitlines():
submodule_paths.append(
os.path.normpath(os.path.join(self._abs_workspace_path, line.split()[1])))
return submodule_paths
else:
return []
def _get_template_file_contents(self) -> None:
"""
Gets the contents of Uncrustify template files if they are specified
in the Uncrustify configuration file.
"""
self._file_template_contents = None
self._func_template_contents = None
# Allow no value to allow "set" statements in the config file which do
# not specify value assignment
parser = configparser.ConfigParser(allow_no_value=True)
with open(self._app_config_file, 'r') as cf:
parser.read_string("[dummy_section]\n" + cf.read())
try:
file_template_name = parser["dummy_section"]["cmt_insert_file_header"]
file_template_path = pathlib.Path(file_template_name)
if not file_template_path.is_file():
file_template_path = pathlib.Path(os.path.join(self._plugin_path, file_template_name))
self._file_template_contents = file_template_path.read_text()
except KeyError:
logging.warn("A file header template is not specified in the config file.")
except FileNotFoundError:
logging.warn("The specified file header template file was not found.")
try:
func_template_name = parser["dummy_section"]["cmt_insert_func_header"]
func_template_path = pathlib.Path(func_template_name)
if not func_template_path.is_file():
func_template_path = pathlib.Path(os.path.join(self._plugin_path, func_template_name))
self._func_template_contents = func_template_path.read_text()
except KeyError:
logging.warn("A function header template is not specified in the config file.")
except FileNotFoundError:
logging.warn("The specified function header template file was not found.")
def _initialize_app_info(self) -> None:
"""
Initialize Uncrustify application information.
This function will determine the application path and version.
"""
# Verify Uncrustify is specified in the environment.
if UncrustifyCheck.UNCRUSTIFY_PATH_ENV_KEY not in os.environ:
raise UncrustifyAppEnvVarNotFoundException(
f"Uncrustify environment variable {UncrustifyCheck.UNCRUSTIFY_PATH_ENV_KEY} is not present.")
self._app_path = shutil.which('uncrustify', path=os.environ[UncrustifyCheck.UNCRUSTIFY_PATH_ENV_KEY])
if self._app_path is None:
raise FileNotFoundError(
errno.ENOENT, os.strerror(errno.ENOENT), self._app_path)
self._app_path = os.path.normcase(os.path.normpath(self._app_path))
if not os.path.isfile(self._app_path):
raise FileNotFoundError(
errno.ENOENT, os.strerror(errno.ENOENT), self._app_path)
# Verify Uncrustify is present at the expected path.
return_buffer = StringIO()
ret = RunCmd(self._app_path, "--version", outstream=return_buffer)
if (ret != 0):
raise UncrustifyAppVersionErrorException(
f"Error occurred executing --version: {ret}.")
# Log Uncrustify version information.
self._app_version = return_buffer.getvalue().strip()
self._tc.LogStdOut(f"Uncrustify version: {self._app_version}")
version_aggregator.GetVersionAggregator().ReportVersion(
"Uncrustify", self._app_version, version_aggregator.VersionTypes.INFO)
def _initialize_config_file_info(self) -> None:
"""
Initialize Uncrustify configuration file info.
The config file path is relative to the package root.
"""
self._app_config_file = UncrustifyCheck.DEFAULT_CONFIG_FILE_PATH
if "ConfigFilePath" in self._package_config:
self._app_config_file = self._package_config["ConfigFilePath"].strip()
self._app_config_file = os.path.normpath(
os.path.join(self._abs_package_path, self._app_config_file))
if not os.path.isfile(self._app_config_file):
raise FileNotFoundError(
errno.ENOENT, os.strerror(errno.ENOENT), self._app_config_file)
def _initialize_environment_info(self, package_rel_path: str, edk2_path: Edk2Path, package_config: Dict[str, List[str]], tc: JunitReportTestCase) -> None:
"""
Initializes plugin environment information.
"""
self._abs_package_path = edk2_path.GetAbsolutePathOnThisSytemFromEdk2RelativePath(
package_rel_path)
self._abs_workspace_path = edk2_path.WorkspacePath
self._package_config = package_config
self._package_name = os.path.basename(
os.path.normpath(package_rel_path))
self._plugin_name = self.__class__.__name__
self._plugin_path = os.path.dirname(os.path.realpath(__file__))
self._rel_package_path = package_rel_path
self._tc = tc
def _initialize_file_to_format_info(self) -> None:
"""
Forms the list of source files for Uncrustify to process.
"""
# Create a list of all the package relative file paths in the package to run against Uncrustify.
rel_file_paths_to_format = list(
UncrustifyCheck.STANDARD_PLUGIN_DEFINED_PATHS)
# Allow the ci.yaml to remove any of the pre-defined standard paths
if "IgnoreStandardPaths" in self._package_config:
for a in self._package_config["IgnoreStandardPaths"]:
if a.strip() in rel_file_paths_to_format:
self._tc.LogStdOut(
f"Ignoring standard path due to ci.yaml ignore: {a}")
rel_file_paths_to_format.remove(a.strip())
else:
raise UncrustifyInvalidIgnoreStandardPathsException(f"Invalid IgnoreStandardPaths value: {a}")
# Allow the ci.yaml to specify additional include paths for this package
if "AdditionalIncludePaths" in self._package_config:
rel_file_paths_to_format.extend(
self._package_config["AdditionalIncludePaths"])
self._abs_file_paths_to_format = []
for path in rel_file_paths_to_format:
self._abs_file_paths_to_format.extend(
[str(path.resolve()) for path in pathlib.Path(self._abs_package_path).rglob(path)])
if not "SkipGitExclusions" in self._package_config or not self._package_config["SkipGitExclusions"]:
# Remove files ignored by git
logging.info(
f"{self._package_name} file count before git ignore file exclusion: {len(self._abs_file_paths_to_format)}")
ignored_paths = self._get_git_ignored_paths()
self._abs_file_paths_to_format = list(
set(self._abs_file_paths_to_format).difference(ignored_paths))
logging.info(
f"{self._package_name} file count after git ignore file exclusion: {len(self._abs_file_paths_to_format)}")
# Remove files in submodules
logging.info(
f"{self._package_name} file count before submodule exclusion: {len(self._abs_file_paths_to_format)}")
submodule_paths = tuple(self._get_git_submodule_paths())
for path in submodule_paths:
logging.info(f" submodule path: {path}")
self._abs_file_paths_to_format = [
f for f in self._abs_file_paths_to_format if not f.startswith(submodule_paths)]
logging.info(
f"{self._package_name} file count after submodule exclusion: {len(self._abs_file_paths_to_format)}")
# Sort the files for more consistent results
self._abs_file_paths_to_format.sort()
def _initialize_test_case_output_options(self) -> None:
"""
Initializes options that influence test case output.
"""
self._audit_only_mode = False
self._output_file_diffs = False
if "AuditOnly" in self._package_config and self._package_config["AuditOnly"]:
self._audit_only_mode = True
if "OutputFileDiffs" in self._package_config and self._package_config["OutputFileDiffs"]:
self._output_file_diffs = True
def _log_uncrustify_app_info(self) -> None:
"""
Logs Uncrustify application information.
"""
self._tc.LogStdOut(f"Found Uncrustify at {self._app_path}")
self._tc.LogStdOut(f"Uncrustify version: {self._app_version}")
self._tc.LogStdOut('\n')
logging.info(f"Found Uncrustify at {self._app_path}")
logging.info(f"Uncrustify version: {self._app_version}")
logging.info('\n')
def _process_uncrustify_results(self) -> None:
"""
Process the results from Uncrustify.
Determines whether formatting errors are present and logs failures.
"""
formatted_files = [str(path.resolve()) for path in pathlib.Path(
self._abs_package_path).rglob(f'*{UncrustifyCheck.FORMATTED_FILE_EXTENSION}')]
self._formatted_file_error_count = len(formatted_files)
if self._formatted_file_error_count > 0:
self._tc.LogStdError("Files with formatting errors:\n")
if self._output_file_diffs:
logging.info("Calculating file diffs. This might take a while...")
for formatted_file in formatted_files:
pre_formatted_file = formatted_file[:-
len(UncrustifyCheck.FORMATTED_FILE_EXTENSION)]
logging.error(pre_formatted_file)
if (self._output_file_diffs or
self._file_template_contents is not None or
self._func_template_contents is not None):
self._tc.LogStdError(
f"Formatting errors in {os.path.relpath(pre_formatted_file, self._abs_package_path)}\n")
with open(formatted_file) as ff:
formatted_file_text = ff.read()
if (self._file_template_contents is not None and
self._file_template_contents in formatted_file_text):
self._tc.LogStdError(f"File header is missing in {os.path.relpath(pre_formatted_file, self._abs_package_path)}\n")
if (self._func_template_contents is not None and
self._func_template_contents in formatted_file_text):
self._tc.LogStdError(f"A function header is missing in {os.path.relpath(pre_formatted_file, self._abs_package_path)}\n")
if self._output_file_diffs:
with open(pre_formatted_file) as pf:
pre_formatted_file_text = pf.read()
for line in difflib.unified_diff(pre_formatted_file_text.split('\n'), formatted_file_text.split('\n'), fromfile=pre_formatted_file, tofile=formatted_file, n=3):
self._tc.LogStdError(line)
self._tc.LogStdError('\n')
else:
self._tc.LogStdError(pre_formatted_file)
def _remove_tree(self, dir_path: str, ignore_errors: bool = False) -> None:
"""
Helper for removing a directory. Over time there have been
many private implementations of this due to reliability issues in the
shutil implementations. To consolidate on a single function this helper is added.
On error try to change file attributes. Also add retry logic.
This function is temporarily borrowed from edk2toollib.utility_functions
since the version used in edk2 is not recent enough to include the
function.
This function should be replaced by "RemoveTree" when it is available.
Args:
- dir_path: Path to directory to remove.
- ignore_errors: Whether to ignore errors during removal
"""
def _remove_readonly(func, path, _):
"""
Private function to attempt to change permissions on file/folder being deleted.
"""
os.chmod(path, os.stat.S_IWRITE)
func(path)
for _ in range(3): # retry up to 3 times
try:
shutil.rmtree(dir_path, ignore_errors=ignore_errors, onerror=_remove_readonly)
except OSError as err:
logging.warning(f"Failed to fully remove {dir_path}: {err}")
else:
break
else:
raise RuntimeError(f"Failed to remove {dir_path}")
def _run_uncrustify(self) -> None:
"""
Runs Uncrustify for this instance of plugin execution.
"""
logging.info("Executing Uncrustify. This might take a while...")
start_time = timeit.default_timer()
self._execute_uncrustify()
end_time = timeit.default_timer() - start_time
execution_summary = f"Uncrustify executed against {len(self._abs_file_paths_to_format)} files in {self._package_name} in {end_time:.2f} seconds.\n"
self._tc.LogStdOut(execution_summary)
logging.info(execution_summary)
if self._app_exit_code != 0 and self._app_exit_code != 1:
raise UncrustifyAppExecutionException(
f"Error {str(self._app_exit_code)} returned from Uncrustify:\n\n{str(self._app_output)}")

View File

@ -1,9 +0,0 @@
/** @file
Brief description of the file's purpose.
Detailed description of the file's contents and other useful
information for a person viewing the file for the first time.
<<Copyright>>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/

View File

@ -1,15 +0,0 @@
/**
Brief description of this function's purpose.
Follow it immediately with the detailed description.
@param[in] Arg1 Description of Arg1.
@param[in] Arg2 Description of Arg2 This is complicated and requires
multiple lines to describe.
@param[out] Arg3 Description of Arg3.
@param[in, out] Arg4 Description of Arg4.
@retval VAL_ONE Description of what VAL_ONE signifies.
@retval OTHER This is the only other return value. If there were other
return values, they would be listed.
**/

View File

@ -1,462 +0,0 @@
## @file
# Uncrustify Configuration File for EDK II C Code
#
# Coding Standard: https://edk2-docs.gitbook.io/edk-ii-c-coding-standards-specification/
#
# This configuration file is meant to be a "best attempt" to align with the
# definitions in the EDK II C Coding Standards Specification.
#
# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: BSD-2-Clause-Patent
##
# Force UTF-8 encoding (no UTF-16)
enable_digraphs = false
utf8_byte = false
utf8_force = true
# Code width / line splitting
#code_width =120 # TODO: This causes non-deterministic behaviour in some cases when code wraps
ls_code_width =false
ls_for_split_full =true
ls_func_split_full =true
pos_comma =trail
# 5.1.7 All files must end with CRLF
newlines = crlf
# 5.1.2 Do not use tab characters
cmt_convert_tab_to_spaces = true # Whether to convert all tabs to spaces in comments. If false, tabs in
# comments are left alone, unless used for indenting.
indent_columns = 2 # Number of spaces for indentation
indent_with_tabs = 0 # Do not use TAB characters
string_replace_tab_chars = true # Replace TAB with SPACE
# Note: This will break .robot files but is needed for edk2 style
# 5.2.1.1 There shall be only one statement on a line (statement ends with ;)
nl_multi_line_cond = true # Add a newline between ')' and '{' if the ')' is on a different line than
# the if/for/etc.
nl_after_semicolon = true # Whether to add a newline after semicolons, except in 'for' statements.
# 5.2.1.3 An open brace '{' goes on the same line as the closing parenthesis ')' of simple predicate expressions
mod_full_brace_do = add # Add or remove braces on a single-line 'do' statement.
mod_full_brace_for = add
mod_full_brace_function = add # Add or remove braces on a single-line function definition.
mod_full_brace_if = add # Add or remove braces on a single-line 'if' statement. Braces will not be
# removed if the braced statement contains an 'else'.
mod_full_brace_if_chain = false
mod_full_brace_while = add
# 5.2.1.4 A close brace '}' always goes at the beginning of the last line of the body
eat_blanks_after_open_brace = true
eat_blanks_before_close_brace = true # Whether to remove blank lines before '}'.
# 5.2.2.2 Always put space before and after binary operators.
sp_assign = add # Add or remove space around assignment operator '=', '+=', etc.
sp_assign_default = add
sp_bool = add # Add or remove space around boolean operators '&&' and '||'.
sp_compare = add # Add or remove space around compare operator '<', '>', '==', etc.
# 5.2.2.3 Do not put space between unary operators and their object
sp_addr = remove # A or remove space after the '&' (address-of) unary operator.
sp_incdec = remove # Add or remove space between '++' and '--' the word to which it is being
# applied, as in '(--x)' or 'y++;'.
sp_inv = remove # Add or remove space after the '~' (invert) unary operator.
sp_not = remove # Add or remove space after the '!' (not) unary operator.
sp_sign = remove # Add or remove space after '+' or '-', as in 'x = -5' or 'y = +7'.
# 5.2.2.4 Subsequent lines of multi-line function calls should line up two spaces from the beginning of the function
# name
nl_func_call_args_multi_line = true # Whether to add a newline after each ',' in a function call if '(' and ')'
# are in different lines.
nl_func_call_args_multi_line_ignore_closures = false
# - Indent each argument 2 spaces from the start of the function name. If a
# function is called through a structure or union member, of type
# pointer-to-function, then indent each argument 2 spaces from the start of the
# member name.
indent_func_call_edk2_style = true # Use EDK2 indentation style for function calls (**CUSTOM SETTING**)
indent_paren_after_func_call = true # Whether to indent the open parenthesis of a function call, if the
# parenthesis is on its own line.
# - Align the close parenthesis with the start of the last argument
indent_paren_close = 0 # How to indent a close parenthesis after a newline.
# (0: Body, 1: Openparenthesis, 2: Brace level)
# 5.2.2.5 Always put space after commas or semicolons that separate items
sp_after_comma = force # Add or remove space after ',', i.e. 'a,b' vs. 'a, b'.
sp_before_comma = remove # Add or remove space before ','.
# 5.2.2.6 Always put space before an open parenthesis
sp_after_sparen = add # Add or remove space after ')' of control statements.
sp_attribute_paren = add # Add or remove space between '__attribute__' and '('.
sp_before_sparen = force # Add or remove space before '(' of control statements
# ('if', 'for', 'switch', 'while', etc.).
sp_defined_paren = force # Add or remove space between 'defined' and '(' in '#if defined (FOO)'.
sp_func_call_paren = force # Add or remove space between function name and '(' on function calls.
sp_func_call_paren_empty = force # Add or remove space between function name and '()' on function calls
# without parameters. If set to ignore (the default), sp_func_call_paren is
# used.
sp_func_def_paren = add # Add or remove space between alias name and '(' of a non-pointer function
# type typedef.
sp_func_proto_paren = add # Add or remove space between function name and '()' on function declaration
sp_sizeof_paren = force # Add or remove space between 'sizeof' and '('.
sp_type_func = add # Add or remove space between return type and function name. A minimum of 1
# is forced except for pointer return types.
# Not specified, but also good style to remove spaces inside parentheses (Optional)
sp_cparen_oparen = remove # Add or remove space between back-to-back parentheses, i.e. ')(' vs. ') ('.
sp_inside_fparen = remove # Add or remove space inside function '(' and ')'.
sp_inside_fparens = remove # Add or remove space inside empty function '()'.
sp_inside_paren = remove # Add or remove space inside '(' and ')'.
sp_inside_paren_cast = remove # Add or remove spaces inside cast parentheses. '(int)x'
sp_inside_square = remove # Add or remove space inside a non-empty '[' and ']'.
sp_paren_paren = remove # Add or remove space between nested parentheses, i.e. '((' vs. ') )'.
sp_square_fparen = remove # Add or remove space between ']' and '(' when part of a function call.
# 5.2.2.7 Put a space before an open brace if it is not on its own line
sp_do_brace_open = force # Add or remove space between 'do' and '{'.
sp_paren_brace = force # Add or remove space between ')' and '{'.
sp_sparen_brace = force # Add or remove space between ')' and '{' of of control statements.
# 5.2.2.8 Do not put spaces around structure member and pointer operators
sp_after_byref = remove # Add or remove space after reference sign '&', if followed by a word.
sp_before_byref = add # Add or remove space before a reference sign '&'.
sp_deref = remove # Add or remove space after the '*' (dereference) unary operator. This does
# not affect the spacing after a '*' that is part of a type.
sp_member = remove # Add or remove space around the '.' or '->' operators.
# 5.2.2.9 Do not put spaces before open brackets of array subscripts
sp_before_square = remove # Add or remove space before '[' (except '[]').
sp_before_squares = remove # Add or remove space before '[]'.
sp_before_vardef_square = remove # Add or remove space before '[' for a variable definition.
# 5.2.2.10 Use extra parentheses rather than depending on in-depth knowledge of the order of precedence of C
mod_full_paren_if_bool = true # Whether to fully parenthesize Boolean expressions in 'while' and 'if'
# statement, as in 'if (a && b > c)' => 'if (a && (b > c))'.
# 5.2.2.11 Align a continuation line with the part of the line that it continues.
use_indent_continue_only_once = true
# Additional '{}' bracing rules (Optional)
# NOTE - The style guide specifies two different styles for braces,
# so these are ignored for now to allow developers some flexibility.
nl_after_brace_close = true # Whether to add a newline after '}'. Does not apply if followed by a
# necessary ';'.
nl_brace_else = remove # Add or remove newline between '}' and 'else'.
nl_brace_while = remove # Add or remove newline between '}' and 'while' of 'do' statement.
nl_do_brace = remove # Add or remove newline between 'do' and '{'.
nl_else_brace = remove # Add or remove newline between 'else' and '{'.
nl_else_if = remove # Add or remove newline between 'else' and 'if'.
nl_elseif_brace = remove # Add or remove newline between 'else if' and '{'.
nl_enum_brace = remove # Add or remove newline between 'enum' and '{'.
nl_fcall_brace = remove # Add or remove newline between a function call's ')' and '{',
# as in 'list_for_each(item, &list) { }'.
nl_for_brace = remove # Add or remove newline between 'for' and '{'.
nl_if_brace = remove # Add or remove newline between 'if' and '{'.
nl_struct_brace = remove # Add or remove newline between 'struct and '{'.
nl_switch_brace = remove # Add or remove newline between 'switch' and '{'.
nl_union_brace = remove # Add or remove newline between 'union' and '{'.
nl_while_brace = remove # Add or remove newline between 'while' and '{'.
# Additional whitespace rules (Optional)
sp_after_ptr_star = remove # Add or remove space after pointer star '*', if followed by a word.
# Useful when paired with align_var_def_star_style==2
sp_after_ptr_star_func = remove # Add or remove space after a pointer star '*', if followed by a function
# prototype or function definition.
sp_after_semi = remove # Add or remove space after ';', except when followed by a comment.
sp_before_case_colon = remove # Add or remove space before case ':'.
sp_before_ptr_star = add # Add or remove space before pointer star '*'.
sp_before_ptr_star_func = add # Add or remove space before a pointer star '*', if followed by a function
# prototype or function definition.
sp_before_semi = remove # Add or remove space before ';'
sp_before_semi_for = remove # Add or remove space before ';' in non-empty 'for' statements.
sp_before_semi_for_empty = add # Add or remove space before a semicolon of an empty part of a for statement
sp_between_ptr_star = remove # Add or remove space between pointer stars '*'. (ie, 'VOID **')
sp_brace_close_while = force # Add or remove space between '}' and 'while'.
sp_after_cast = remove
sp_after_type = add
sp_balance_nested_parens = false
sp_before_nl_cont = add
sp_before_square_asm_block = ignore
sp_before_unnamed_byref = add
sp_brace_brace = ignore
sp_brace_else = force
sp_brace_typedef = add
sp_case_label = force
sp_cmt_cpp_doxygen = true
sp_cond_colon = add
sp_cond_question = add
sp_cpp_cast_paren = force
sp_else_brace = force
sp_endif_cmt = force
sp_enum_assign = add
sp_inside_braces = force
sp_inside_braces_empty = force
sp_inside_braces_enum = force
sp_inside_braces_struct = force
sp_pp_concat = add
sp_pp_stringify = add
sp_return_paren = add
sp_special_semi = force
sp_while_paren_open = force
# Additional Indentation Rules
indent_access_spec = 1
indent_access_spec_body = false
indent_align_assign = true
indent_align_string = true
indent_bool_paren = true
indent_brace_parent = false
indent_braces = false
indent_braces_no_class = false
indent_braces_no_func = true
indent_braces_no_struct = false
indent_class = false
indent_class_colon = false
indent_cmt_with_tabs = false # Whether to indent comments that are not at a brace level with tabs on
# a tabstop. Requires indent_with_tabs=2. If false, will use spaces.
indent_col1_comment = true
indent_col1_multi_string_literal= true
indent_comma_paren = true
indent_else_if = true
indent_extern = false
indent_first_bool_expr = true
indent_func_def_param_paren_pos_threshold = 0
indent_func_param_double = false
indent_func_proto_param = true
indent_ignore_asm_block = true
indent_label = 1
indent_member = 2
indent_namespace = false
indent_param = 2
indent_paren_nl = false
indent_paren_open_brace = false
indent_preserve_sql = false
indent_relative_single_line_comments = false
indent_sing_line_comments = 0
indent_single_newlines = false
indent_square_nl = false
indent_switch_case = 2
indent_template_param = true
indent_var_def_blk = 0
indent_var_def_cont = false
# Tidy-up rules (Optional)
mod_move_case_break = true # Whether to move a 'break' that appears after a fully braced 'case'
# before the close brace, as in 'case X: { ... } break;' =>
# 'case X: { ... break; }'.
mod_pawn_semicolon = false
mod_remove_empty_return = false # Whether to remove a void 'return;' that appears as the last statement
# in a function.
mod_remove_extra_semicolon = true
mod_sort_import = false
mod_sort_include = false
mod_sort_using = false
nl_after_case = false # Whether to add a newline after a 'case' statement.
nl_end_of_file = force # Add or remove newline at the end of the file.
nl_end_of_file_min = 1 # The minimum number of newlines at the end of the file
nl_max = 2 # The maximum number of consecutive newlines (3 = 2 blank lines).
nl_start_of_file = remove # Add or remove newlines at the start of the file.
# Code alignment rules (Optional)
align_asm_colon = false
align_assign_span = 1 # The span for aligning on '=' in assignments.
align_assign_thresh = 0
align_edk2_style = true # Whether to apply edk2-specific alignment formatting
align_enum_equ_span = 1 # The span for aligning on '=' in enums.
align_func_params = true # Whether to align variable definitions in prototypes and functions.
align_func_params_gap = 2
align_func_params_span = 2 # The span for aligning parameter definitions in function on parameter name.
align_func_params_thresh = 0
align_func_proto_span = 0
align_keep_tabs = false
align_left_shift = false
align_mix_var_proto = false
align_nl_cont = false
align_oc_decl_colon = false
align_on_operator = false
align_on_tabstop = false
align_pp_define_gap = 2
align_pp_define_span = 1
align_right_cmt_at_col = 0 # Align trailing comment at or beyond column N; 'pulls in' comments as
# a bonus side effect (0=ignore)
align_right_cmt_gap = 0 # If a trailing comment is more than this number of columns away from the
# text it follows,
# it will qualify for being aligned. This has to be > 0 to do anything.
align_right_cmt_mix = false # If aligning comments, mix with comments after '}' and #endif with less
# than 3 spaces before the comment
align_right_cmt_same_level = true # Whether to only align trailing comments that are at the same brace level.
align_right_cmt_span = 2 # The span for aligning comments that end lines.
align_same_func_call_params = false
align_single_line_brace = true
align_single_line_func = true
align_struct_init_span = 1 # The span for aligning struct initializer values.
align_typedef_amp_style = 1
align_typedef_func = 1 # How to align typedef'd functions with other typedefs.
# (0: No align, 1: Align open paranthesis, 2: Align function type name)
align_typedef_gap = 2
align_typedef_span = 1 # The span for aligning single-line typedefs.
align_typedef_star_style = 1
align_var_def_amp_style = 1
align_var_def_attribute = true
align_var_def_colon = true # Whether to align the colon in struct bit fields.
align_var_def_gap = 2 # The gap (minimum spacing for aligned items) for variable definitions.
align_var_def_inline = false
align_var_def_span = 1 # The span (lines needed to align) for aligning variable definitions.
align_var_def_star_style = 1 # How to consider (or treat) the '*' in the alignment of variable
# definitions.
# 0: Part of the type 'void * foo;' (default)
# 1: Part of the variable 'void *foo;'
# 2: Dangling 'void *foo;'
# (Note - should also set sp_after_ptr_star=remove)
align_var_struct_gap = 4
align_var_struct_span = 8 # The span for aligning struct/union member definitions.
align_var_struct_thresh = 0
align_with_tabs = false
# Comment formatting
cmt_align_doxygen_javadoc_tags = true # Whether to align doxygen javadoc-style tags ('@param', '@return', etc.)
# TODO: Eats '[' in '[in]'
cmt_c_group = false
cmt_c_nl_end = true # Whether to add a newline before the closing '*/' of the combined c-comment.
cmt_c_nl_start = true
cmt_cpp_group = false
cmt_cpp_nl_end = true
cmt_cpp_nl_start = true
cmt_cpp_to_c = false
cmt_indent_multi = false # Whether to apply changes to multi-line comments, including cmt_width,
# keyword substitution and leading chars.
cmt_insert_before_preproc = false
#cmt_insert_file_header = default_file_header.txt
#cmt_insert_func_header = default_function_header.txt
cmt_multi_check_last = false
cmt_multi_first_len_minimum = 2
cmt_reflow_mode = 1 # How to reflow comments.
# (0:No reflow, 1:No touching at all, 2: Full reflow)
cmt_sp_after_star_cont = 0 # The number of spaces to insert after the star on subsequent comment lines.
cmt_sp_before_star_cont = 0 # The number of spaces to insert at the start of subsequent comment lines.
cmt_star_cont = false # Whether to put a star on subsequent comment lines.
cmt_width = 120 # Try to wrap comments at N columns.
sp_cmt_cpp_start = add # Add or remove space after the opening of a C++ comment, as in
# '// <here> A'. NOTE: Breaks indentation within comments.
# Function definitions / declarations
indent_func_call_param = false # Whether to indent continued function call parameters one indent level,
# rather than aligning parameters under the open parenthesis.
indent_func_class_param = false # Whether to indent continued function call declaration one indent level,
# rather than aligning parameters under the open parenthesis.
indent_func_ctor_var_param = false # Whether to indent continued class variable constructors one indent level,
# rather than aligning parameters under the open parenthesis.
indent_func_def_param = true # Whether to indent continued function definition parameters one indent
# level, rather than aligning parameters under the open parenthesis.
nl_fdef_brace = add # Add or remove newline between function signature and '{'.
nl_func_call_end_multi_line = true # Whether to add a newline before ')' in a function call if '(' and ')' are
# in different lines.
nl_func_call_paren = remove # Add or remove newline between a function name and the opening '(' in the
# call.
nl_func_call_start_multi_line = true # Whether to add a newline after '(' in a function call if '(' and ')' are
# in different lines.
nl_func_decl_args = force # Add or remove newline after each ',' in a function declaration.
nl_func_decl_empty = add # Add or remove newline between '()' in a function declaration.
nl_func_def_args = force # Add or remove newline after each ',' in a function definition.
nl_func_def_empty = add # Add or remove newline between '()' in a function definition.
nl_func_def_paren = remove # Add or remove newline between a function name and the opening '('
# in the definition.
nl_func_paren = remove # Add or remove newline between a function name and the opening '(' in
# the declaration.
nl_func_type_name = add # Add or remove newline between return type and function name in a function
# definition.
sp_fparen_brace = force # Add or remove space between ')' and '{' of function.
use_indent_func_call_param = true # indent_func_call_param will be used
# Additional Newline Rules
nl_after_brace_open = true # Whether to add a newline after '{'. This also adds a newline
# before the matching '}'.
nl_after_brace_open_cmt = true # Whether to add a newline between the open brace and a
# trailing single-line comment.
# Requires nl_after_brace_open = true.
nl_after_do = add # Add or remove blank line after 'do/while' statement.
nl_after_for = add # Add or remove blank line after 'for' statement.
nl_after_func_body = 2 # The number of newlines after '}' of a multi-line function body
nl_after_func_body_one_liner = 2
nl_after_func_proto = 2
nl_after_func_proto_group = 2
nl_after_if = add
nl_after_multiline_comment = false
nl_after_return = false
nl_after_struct = 2
nl_after_switch = add
nl_after_vbrace_close = true
nl_after_vbrace_open = true
nl_after_vbrace_open_empty = true
nl_after_while = add
nl_assign_leave_one_liners = true
nl_before_block_comment = 2
nl_before_case = false
nl_before_do = ignore
nl_before_for = ignore
nl_before_if = ignore
nl_before_switch = ignore
nl_before_while = ignore
nl_before_whole_file_ifdef = 2
nl_brace_brace = force
nl_brace_struct_var = remove
nl_case_colon_brace = add
nl_class_leave_one_liners = false
nl_collapse_empty_body = false
nl_comment_func_def = 1
nl_create_for_one_liner = false
nl_create_if_one_liner = false
nl_create_while_one_liner = false
nl_define_macro = false
nl_ds_struct_enum_close_brace = true
nl_ds_struct_enum_cmt = false
nl_enum_leave_one_liners = false
nl_func_decl_end = add
nl_func_decl_start = add
nl_func_def_end = add
nl_func_def_start = add
nl_func_leave_one_liners = false
nl_func_proto_type_name = add
nl_func_var_def_blk = 1
nl_getset_leave_one_liners = false
nl_if_leave_one_liners = false
nl_multi_line_define = false
nl_squeeze_ifdef = false
nl_var_def_blk_end = 0
nl_var_def_blk_start = 0
# Preprocessor Rules
pp_define_at_level = true
pp_if_indent_code = false
pp_indent_func_def = false
pp_indent_extern = false
pp_ignore_define_body = true # Workaround: Turn off processing for #define body
# (current rules do not work for some defines)
pp_indent = add
pp_indent_at_level = true
pp_indent_count = 2
pp_indent_if = 2
pp_indent_region = 2
pp_region_indent_code = false
pp_space = remove
#
# The tokens below are assigned specific types so they are always recognized properly.
#
# Explicitly define EDK II qualifiers
set QUALIFIER CONST
set QUALIFIER EFIAPI
set QUALIFIER IN
set QUALIFIER OPTIONAL
set QUALIFIER OUT
# Explicitly define EDK II types
set TYPE EFI_STATUS
set TYPE VOID

View File

@ -1,16 +0,0 @@
## @file
# Downloads the Uncrustify application from a Project Mu NuGet package.
#
# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: BSD-2-Clause-Patent
##
{
"id": "uncrustify-ci-1",
"scope": "cibuild",
"type": "nuget",
"name": "mu-uncrustify-release",
"source": "https://pkgs.dev.azure.com/projectmu/Uncrustify/_packaging/mu_uncrustify/nuget/v3/index.json",
"version": "73.0.3",
"flags": ["set_shell_var", "host_specific"],
"var_name": "UNCRUSTIFY_CI_PATH"
}

View File

@ -1,11 +0,0 @@
## @file
# CiBuildPlugin used to check coding standard compliance of EDK II style C source code
#
# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: BSD-2-Clause-Patent
##
{
"scope": "cibuild",
"name": "Uncrustify Coding Standard Test",
"module": "UncrustifyCheck"
}

View File

@ -264,10 +264,6 @@ BSD-2-Clause-Patent.
Run the Ecc tool on the package. The Ecc tool is available in the BaseTools Run the Ecc tool on the package. The Ecc tool is available in the BaseTools
package. It checks that the code complies to the EDKII coding standard. package. It checks that the code complies to the EDKII coding standard.
### Coding Standard Compliance - UncrustifyCheck
Runs the Uncrustify application to check for coding standard compliance issues.
## PyTool Scopes ## PyTool Scopes
Scopes are how the PyTool ext_dep, path_env, and plugins are activated. Meaning Scopes are how the PyTool ext_dep, path_env, and plugins are activated. Meaning

View File

@ -19,10 +19,7 @@
], ],
## Both file path and directory path are accepted. ## Both file path and directory path are accepted.
"IgnoreFiles": [ "IgnoreFiles": [
"Library/ArmSoftFloatLib/berkeley-softfloat-3", "Library/ArmSoftFloatLib/berkeley-softfloat-3"
"Library/ArmSoftFloatLib/ArmSoftFloatLib.c",
"Library/CompilerIntrinsicsLib",
"Universal/Smbios/SmbiosMiscDxe"
] ]
}, },

View File

@ -3,7 +3,6 @@
# #
# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR> # Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
# Copyright (c) 2011 - 2021, ARM Limited. All rights reserved. # Copyright (c) 2011 - 2021, ARM Limited. All rights reserved.
# Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
# #
# SPDX-License-Identifier: BSD-2-Clause-Patent # SPDX-License-Identifier: BSD-2-Clause-Patent
# #
@ -338,9 +337,9 @@
# UINT64 Mmio32CpuBase; // mapping target in 64-bit cpu-physical space # UINT64 Mmio32CpuBase; // mapping target in 64-bit cpu-physical space
# UINT64 Mmio64CpuBase; // mapping target in 64-bit cpu-physical space # UINT64 Mmio64CpuBase; // mapping target in 64-bit cpu-physical space
# #
# gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation = IoCpuBase - PcdPciIoBase; # PcdPciIoTranslation = IoCpuBase - PcdPciIoBase;
# gEfiMdePkgTokenSpaceGuid.PcdPciMmio32Translation = Mmio32CpuBase - (UINT64)PcdPciMmio32Base; # PcdPciMmio32Translation = Mmio32CpuBase - (UINT64)PcdPciMmio32Base;
# gEfiMdePkgTokenSpaceGuid.PcdPciMmio64Translation = Mmio64CpuBase - PcdPciMmio64Base; # PcdPciMmio64Translation = Mmio64CpuBase - PcdPciMmio64Base;
# #
# because (a) the target address space (ie. the cpu-physical space) is # because (a) the target address space (ie. the cpu-physical space) is
# 64-bit, and (b) the translation values are meant as offsets for *modular* # 64-bit, and (b) the translation values are meant as offsets for *modular*
@ -357,11 +356,11 @@
# UINT64 TranslatedMmio64Address; // output parameter # UINT64 TranslatedMmio64Address; // output parameter
# #
# TranslatedIoAddress = UntranslatedIoAddress + # TranslatedIoAddress = UntranslatedIoAddress +
# gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation; # PcdPciIoTranslation;
# TranslatedMmio32Address = (UINT64)UntranslatedMmio32Address + # TranslatedMmio32Address = (UINT64)UntranslatedMmio32Address +
# gEfiMdePkgTokenSpaceGuid.PcdPciMmio32Translation; # PcdPciMmio32Translation;
# TranslatedMmio64Address = UntranslatedMmio64Address + # TranslatedMmio64Address = UntranslatedMmio64Address +
# gEfiMdePkgTokenSpaceGuid.PcdPciMmio64Translation; # PcdPciMmio64Translation;
# #
# The modular arithmetic performed in UINT64 ensures that the translation # The modular arithmetic performed in UINT64 ensures that the translation
# works correctly regardless of the relation between IoCpuBase and # works correctly regardless of the relation between IoCpuBase and
@ -370,20 +369,16 @@
# #
gArmTokenSpaceGuid.PcdPciIoBase|0x0|UINT64|0x00000050 gArmTokenSpaceGuid.PcdPciIoBase|0x0|UINT64|0x00000050
gArmTokenSpaceGuid.PcdPciIoSize|0x0|UINT64|0x00000051 gArmTokenSpaceGuid.PcdPciIoSize|0x0|UINT64|0x00000051
gArmTokenSpaceGuid.PcdPciIoTranslation|0x0|UINT64|0x00000052
gArmTokenSpaceGuid.PcdPciMmio32Base|0x0|UINT32|0x00000053 gArmTokenSpaceGuid.PcdPciMmio32Base|0x0|UINT32|0x00000053
gArmTokenSpaceGuid.PcdPciMmio32Size|0x0|UINT32|0x00000054 gArmTokenSpaceGuid.PcdPciMmio32Size|0x0|UINT32|0x00000054
gArmTokenSpaceGuid.PcdPciMmio32Translation|0x0|UINT64|0x00000055
gArmTokenSpaceGuid.PcdPciMmio64Base|0x0|UINT64|0x00000056 gArmTokenSpaceGuid.PcdPciMmio64Base|0x0|UINT64|0x00000056
gArmTokenSpaceGuid.PcdPciMmio64Size|0x0|UINT64|0x00000057 gArmTokenSpaceGuid.PcdPciMmio64Size|0x0|UINT64|0x00000057
gArmTokenSpaceGuid.PcdPciMmio64Translation|0x0|UINT64|0x00000058
# #
# Inclusive range of allowed PCI buses. # Inclusive range of allowed PCI buses.
# #
gArmTokenSpaceGuid.PcdPciBusMin|0x0|UINT32|0x00000059 gArmTokenSpaceGuid.PcdPciBusMin|0x0|UINT32|0x00000059
gArmTokenSpaceGuid.PcdPciBusMax|0x0|UINT32|0x0000005A gArmTokenSpaceGuid.PcdPciBusMax|0x0|UINT32|0x0000005A
[PcdsDynamicEx]
#
# This dynamic PCD hold the GUID of a firmware FFS which contains
# the LinuxBoot payload.
#
gArmTokenSpaceGuid.PcdLinuxBootFileGuid|{0x0}|VOID*|0x0000005C

View File

@ -5,7 +5,6 @@
# Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.<BR> # Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.<BR>
# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> # Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
# Copyright (c) Microsoft Corporation.<BR> # Copyright (c) Microsoft Corporation.<BR>
# Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
# #
# SPDX-License-Identifier: BSD-2-Clause-Patent # SPDX-License-Identifier: BSD-2-Clause-Patent
# #
@ -151,7 +150,6 @@
ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciResetSystemLib.inf ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciResetSystemLib.inf
ArmPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf ArmPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBootManagerLib.inf
ArmPkg/Drivers/ArmCrashDumpDxe/ArmCrashDumpDxe.inf ArmPkg/Drivers/ArmCrashDumpDxe/ArmCrashDumpDxe.inf
ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf

View File

@ -26,9 +26,7 @@ ArmCrashDumpDxeInitialize (
Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&mCpu); Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&mCpu);
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR(Status);
return mCpu->RegisterInterruptHandler ( return mCpu->RegisterInterruptHandler (mCpu,
mCpu,
EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS, EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS,
&DefaultExceptionHandler &DefaultExceptionHandler);
);
} }

View File

@ -33,6 +33,7 @@ UINTN mGicNumInterrupts = 0;
HARDWARE_INTERRUPT_HANDLER *gRegisteredInterruptHandlers = NULL; HARDWARE_INTERRUPT_HANDLER *gRegisteredInterruptHandlers = NULL;
/** /**
Calculate GICD_ICFGRn base address and corresponding bit Calculate GICD_ICFGRn base address and corresponding bit
field Int_config[1] of the GIC distributor register. field Int_config[1] of the GIC distributor register.
@ -70,6 +71,8 @@ GicGetDistributorIcfgBaseAndBit (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Register Handler for the specified interrupt source. Register Handler for the specified interrupt source.
@ -134,28 +137,17 @@ CpuArchEventProtocolNotify (
// Unregister the default exception handler. // Unregister the default exception handler.
Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL); Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG (( DEBUG ((DEBUG_ERROR, "%a: Cpu->RegisterInterruptHandler() - %r\n",
DEBUG_ERROR, __FUNCTION__, Status));
"%a: Cpu->RegisterInterruptHandler() - %r\n",
__FUNCTION__,
Status
));
return; return;
} }
// Register to receive interrupts // Register to receive interrupts
Status = Cpu->RegisterInterruptHandler ( Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ,
Cpu, Context);
ARM_ARCH_EXCEPTION_IRQ,
Context
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG (( DEBUG ((DEBUG_ERROR, "%a: Cpu->RegisterInterruptHandler() - %r\n",
DEBUG_ERROR, __FUNCTION__, Status));
"%a: Cpu->RegisterInterruptHandler() - %r\n",
__FUNCTION__,
Status
));
} }
gBS->CloseEvent (Event); gBS->CloseEvent (Event);
@ -199,8 +191,7 @@ InstallAndRegisterInterruptService (
TPL_CALLBACK, TPL_CALLBACK,
CpuArchEventProtocolNotify, CpuArchEventProtocolNotify,
InterruptHandler, InterruptHandler,
&mCpuArchProtocolNotifyEventRegistration &mCpuArchProtocolNotifyEventRegistration);
);
// Register for an ExitBootServicesEvent // Register for an ExitBootServicesEvent
Status = gBS->CreateEvent ( Status = gBS->CreateEvent (

View File

@ -55,6 +55,7 @@ GicV3DxeInitialize (
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
); );
// Shared code // Shared code
/** /**

View File

@ -230,8 +230,7 @@ ArmGicSetInterruptPriority (
Revision = ArmGicGetSupportedArchRevision (); Revision = ArmGicGetSupportedArchRevision ();
if ((Revision == ARM_GIC_ARCH_REVISION_2) || if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
FeaturePcdGet (PcdArmGicV3WithV2Legacy) || FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
SourceIsSpi (Source)) SourceIsSpi (Source)) {
{
MmioAndThenOr32 ( MmioAndThenOr32 (
GicDistributorBase + ARM_GIC_ICDIPR + (4 * RegOffset), GicDistributorBase + ARM_GIC_ICDIPR + (4 * RegOffset),
~(0xff << RegShift), ~(0xff << RegShift),
@ -274,8 +273,7 @@ ArmGicEnableInterrupt (
Revision = ArmGicGetSupportedArchRevision (); Revision = ArmGicGetSupportedArchRevision ();
if ((Revision == ARM_GIC_ARCH_REVISION_2) || if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
FeaturePcdGet (PcdArmGicV3WithV2Legacy) || FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
SourceIsSpi (Source)) SourceIsSpi (Source)) {
{
// Write set-enable register // Write set-enable register
MmioWrite32 ( MmioWrite32 (
GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset), GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset),
@ -319,8 +317,7 @@ ArmGicDisableInterrupt (
Revision = ArmGicGetSupportedArchRevision (); Revision = ArmGicGetSupportedArchRevision ();
if ((Revision == ARM_GIC_ARCH_REVISION_2) || if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
FeaturePcdGet (PcdArmGicV3WithV2Legacy) || FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
SourceIsSpi (Source)) SourceIsSpi (Source)) {
{
// Write clear-enable register // Write clear-enable register
MmioWrite32 ( MmioWrite32 (
GicDistributorBase + ARM_GIC_ICDICER + (4 * RegOffset), GicDistributorBase + ARM_GIC_ICDICER + (4 * RegOffset),
@ -364,8 +361,7 @@ ArmGicIsInterruptEnabled (
Revision = ArmGicGetSupportedArchRevision (); Revision = ArmGicGetSupportedArchRevision ();
if ((Revision == ARM_GIC_ARCH_REVISION_2) || if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
FeaturePcdGet (PcdArmGicV3WithV2Legacy) || FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
SourceIsSpi (Source)) SourceIsSpi (Source)) {
{
Interrupts = ((MmioRead32 ( Interrupts = ((MmioRead32 (
GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset) GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset)
) )

View File

@ -261,13 +261,9 @@ GicV2SetTriggerType (
BOOLEAN SourceEnabled; BOOLEAN SourceEnabled;
if ( (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING) if ( (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)
&& (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH)) && (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH)) {
{ DEBUG ((DEBUG_ERROR, "Invalid interrupt trigger type: %d\n", \
DEBUG (( TriggerType));
DEBUG_ERROR,
"Invalid interrupt trigger type: %d\n", \
TriggerType
));
ASSERT (FALSE); ASSERT (FALSE);
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }

View File

@ -10,6 +10,7 @@
#include <Library/IoLib.h> #include <Library/IoLib.h>
#include <Library/ArmGicLib.h> #include <Library/ArmGicLib.h>
VOID VOID
EFIAPI EFIAPI
ArmGicV2EnableInterruptInterface ( ArmGicV2EnableInterruptInterface (

View File

@ -255,13 +255,9 @@ GicV3SetTriggerType (
BOOLEAN SourceEnabled; BOOLEAN SourceEnabled;
if ( (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING) if ( (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)
&& (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH)) && (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH)) {
{ DEBUG ((DEBUG_ERROR, "Invalid interrupt trigger type: %d\n", \
DEBUG (( TriggerType));
DEBUG_ERROR,
"Invalid interrupt trigger type: %d\n", \
TriggerType
));
ASSERT (FALSE); ASSERT (FALSE);
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
@ -348,6 +344,10 @@ GicV3ExitBootServicesEvent (
GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index); GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index);
} }
for (Index = 0; Index < mGicNumInterrupts; Index++) {
GicV3EndOfInterrupt (&gHardwareInterruptV3Protocol, Index);
}
// Disable Gic Interface // Disable Gic Interface
ArmGicV3DisableInterruptInterface (); ArmGicV3DisableInterruptInterface ();
@ -434,8 +434,8 @@ GicV3DxeInitialize (
if ((MmioRead32 ( if ((MmioRead32 (
mGicDistributorBase + ARM_GIC_ICDDCR mGicDistributorBase + ARM_GIC_ICDDCR
) & ARM_GIC_ICDDCR_DS) != 0) ) & ARM_GIC_ICDDCR_DS) != 0) {
{
// If the Disable Security (DS) control bit is set, we are dealing with a // If the Disable Security (DS) control bit is set, we are dealing with a
// GIC that has only one security state. In this case, let's assume we are // GIC that has only one security state. In this case, let's assume we are
// executing in non-secure state (which is appropriate for DXE modules) // executing in non-secure state (which is appropriate for DXE modules)

View File

@ -117,7 +117,7 @@ CpuIoCheckParameter (
// For FIFO type, the target address won't increase during the access, // For FIFO type, the target address won't increase during the access,
// so treat Count as 1 // so treat Count as 1
// //
if ((Width >= EfiCpuIoWidthFifoUint8) && (Width <= EfiCpuIoWidthFifoUint64)) { if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) {
Count = 1; Count = 1;
} }
@ -161,7 +161,6 @@ CpuIoCheckParameter (
if (MaxCount < (Count - 1)) { if (MaxCount < (Count - 1)) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
if (Address > LShiftU64 (MaxCount - Count + 1, Width)) { if (Address > LShiftU64 (MaxCount - Count + 1, Width)) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
@ -255,7 +254,6 @@ CpuMemoryServiceRead (
*((UINT64 *)Uint8Buffer) = MmioRead64 ((UINTN)Address); *((UINT64 *)Uint8Buffer) = MmioRead64 ((UINTN)Address);
} }
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -337,7 +335,6 @@ CpuMemoryServiceWrite (
MmioWrite64 ((UINTN)Address, *((UINT64 *)Uint8Buffer)); MmioWrite64 ((UINTN)Address, *((UINT64 *)Uint8Buffer));
} }
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -524,6 +521,7 @@ STATIC EFI_CPU_IO2_PROTOCOL mCpuIo2 = {
} }
}; };
/** /**
The user Entry Point for module CpuIo2Dxe. The user code starts with this function. The user Entry Point for module CpuIo2Dxe. The user code starts with this function.
@ -546,8 +544,7 @@ ArmPciCpuIo2Initialize (
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiCpuIo2ProtocolGuid); ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiCpuIo2ProtocolGuid);
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
&mHandle, &mHandle,
&gEfiCpuIo2ProtocolGuid, &gEfiCpuIo2ProtocolGuid, &mCpuIo2,
&mCpuIo2,
NULL NULL
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);

View File

@ -38,7 +38,7 @@
UefiBootServicesTableLib UefiBootServicesTableLib
[Pcd] [Pcd]
gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation gArmTokenSpaceGuid.PcdPciIoTranslation
[Protocols] [Protocols]
gEfiCpuIo2ProtocolGuid ## PRODUCES gEfiCpuIo2ProtocolGuid ## PRODUCES

View File

@ -53,6 +53,7 @@ typedef struct {
CLOCK_RATE_DWORD Rate; CLOCK_RATE_DWORD Rate;
} CLOCK_RATE_SET_ATTRIBUTES; } CLOCK_RATE_SET_ATTRIBUTES;
// Message parameters for CLOCK_CONFIG_SET command. // Message parameters for CLOCK_CONFIG_SET command.
typedef struct { typedef struct {
UINT32 ClockId; UINT32 ClockId;

View File

@ -124,9 +124,7 @@ ScmiCommandExecute (
Response = (SCMI_MESSAGE_RESPONSE*)MtlGetChannelPayload (Channel); Response = (SCMI_MESSAGE_RESPONSE*)MtlGetChannelPayload (Channel);
if (Response->Status != ScmiSuccess) { if (Response->Status != ScmiSuccess) {
DEBUG (( DEBUG ((DEBUG_ERROR, "SCMI error: ProtocolId = 0x%x, MessageId = 0x%x, error = %d\n",
DEBUG_ERROR,
"SCMI error: ProtocolId = 0x%x, MessageId = 0x%x, error = %d\n",
Command->ProtocolId, Command->ProtocolId,
Command->MessageId, Command->MessageId,
Response->Status Response->Status

View File

@ -256,6 +256,7 @@ BaseDiscoverListProtocols (
Skip = 0; Skip = 0;
while (Skip < TotalProtocols) { while (Skip < TotalProtocols) {
*MessageParams = Skip; *MessageParams = Skip;
// Note PayloadLength is a IN/OUT parameter. // Note PayloadLength is a IN/OUT parameter.

View File

@ -135,7 +135,6 @@ ClockGetClockAttributes (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// TRUE if bit 0 of ClockAttributes->Attributes is set. // TRUE if bit 0 of ClockAttributes->Attributes is set.
*Enabled = CLOCK_ENABLED (ClockAttributes->Attributes); *Enabled = CLOCK_ENABLED (ClockAttributes->Attributes);
@ -210,6 +209,7 @@ ClockDescribeRates (
*MessageParams++ = ClockId; *MessageParams++ = ClockId;
do { do {
*MessageParams = RateIndex; *MessageParams = RateIndex;
// Set Payload length, note PayloadLength is a IN/OUT parameter. // Set Payload length, note PayloadLength is a IN/OUT parameter.

View File

@ -88,8 +88,7 @@ ArmScmiDxeEntryPoint (
// Accept any version between SCMI v1.0 and SCMI v2.0 // Accept any version between SCMI v1.0 and SCMI v2.0
if ((Version < BASE_PROTOCOL_VERSION_V1) || if ((Version < BASE_PROTOCOL_VERSION_V1) ||
(Version > BASE_PROTOCOL_VERSION_V2)) (Version > BASE_PROTOCOL_VERSION_V2)) {
{
ASSERT (FALSE); ASSERT (FALSE);
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
@ -131,8 +130,7 @@ ArmScmiDxeEntryPoint (
// Install supported protocol on ImageHandle. // Install supported protocol on ImageHandle.
for (ProtocolIndex = 1; ProtocolIndex < ARRAY_SIZE (Protocols); for (ProtocolIndex = 1; ProtocolIndex < ARRAY_SIZE (Protocols);
ProtocolIndex++) ProtocolIndex++) {
{
for (Index = 0; Index < NumProtocols; Index++) { for (Index = 0; Index < NumProtocols; Index++) {
if (Protocols[ProtocolIndex].Id == SupportedList[Index]) { if (Protocols[ProtocolIndex].Id == SupportedList[Index]) {
Status = Protocols[ProtocolIndex].InitFn (&ImageHandle); Status = Protocols[ProtocolIndex].InitFn (&ImageHandle);
@ -140,7 +138,6 @@ ArmScmiDxeEntryPoint (
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
return Status; return Status;
} }
break; break;
} }
} }

View File

@ -8,7 +8,6 @@
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/ http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
DEN0056A_System_Control_and_Management_Interface.pdf DEN0056A_System_Control_and_Management_Interface.pdf
**/ **/
#ifndef SCMI_DXE_H_ #ifndef SCMI_DXE_H_
#define SCMI_DXE_H_ #define SCMI_DXE_H_

View File

@ -183,6 +183,7 @@ PerformanceDescribeLevels (
Cmd.MessageId = ScmiMessageIdPerformanceDescribeLevels; Cmd.MessageId = ScmiMessageIdPerformanceDescribeLevels;
do { do {
*MessageParams = LevelIndex; *MessageParams = LevelIndex;
// Note, PayloadLength is an IN/OUT parameter. // Note, PayloadLength is an IN/OUT parameter.
@ -218,6 +219,7 @@ PerformanceDescribeLevels (
sizeof (SCMI_PERFORMANCE_LEVEL) sizeof (SCMI_PERFORMANCE_LEVEL)
); );
} }
} while (ReturnRemainNumLevels != 0); } while (ReturnRemainNumLevels != 0);
*LevelArraySize = RequiredSize; *LevelArraySize = RequiredSize;

View File

@ -8,7 +8,6 @@
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/ http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
DEN0056A_System_Control_and_Management_Interface.pdf DEN0056A_System_Control_and_Management_Interface.pdf
**/ **/
#ifndef SCMI_PRIVATE_H_ #ifndef SCMI_PRIVATE_H_
#define SCMI_PRIVATE_H_ #define SCMI_PRIVATE_H_

View File

@ -52,11 +52,9 @@ PageAttributeToGcdAttribute (
GcdAttributes = EFI_MEMORY_WB; GcdAttributes = EFI_MEMORY_WB;
break; break;
default: default:
DEBUG (( DEBUG ((DEBUG_ERROR,
DEBUG_ERROR,
"PageAttributeToGcdAttribute: PageAttributes:0x%lX not supported.\n", "PageAttributeToGcdAttribute: PageAttributes:0x%lX not supported.\n",
PageAttributes PageAttributes));
));
ASSERT (0); ASSERT (0);
// The Global Coherency Domain (GCD) value is defined as a bit set. // The Global Coherency Domain (GCD) value is defined as a bit set.
// Returning 0 means no attribute has been set. // Returning 0 means no attribute has been set.
@ -65,8 +63,7 @@ PageAttributeToGcdAttribute (
// Determine protection attributes // Determine protection attributes
if (((PageAttributes & TT_AP_MASK) == TT_AP_NO_RO) || if (((PageAttributes & TT_AP_MASK) == TT_AP_NO_RO) ||
((PageAttributes & TT_AP_MASK) == TT_AP_RO_RO)) ((PageAttributes & TT_AP_MASK) == TT_AP_RO_RO)) {
{
// Read only cases map to write-protect // Read only cases map to write-protect
GcdAttributes |= EFI_MEMORY_RO; GcdAttributes |= EFI_MEMORY_RO;
} }
@ -91,7 +88,7 @@ GetFirstPageAttribute (
// Get the first entry of the table // Get the first entry of the table
FirstEntry = *FirstLevelTableAddress; FirstEntry = *FirstLevelTableAddress;
if ((TableLevel != 3) && ((FirstEntry & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY)) { if ((TableLevel != 3) && (FirstEntry & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY) {
// Only valid for Levels 0, 1 and 2 // Only valid for Levels 0, 1 and 2
// Get the attribute of the subsequent table // Get the attribute of the subsequent table
@ -141,18 +138,14 @@ GetNextEntryAttribute (
// If Entry is a Table Descriptor type entry then go through the sub-level table // If Entry is a Table Descriptor type entry then go through the sub-level table
if ((EntryType == TT_TYPE_BLOCK_ENTRY) || if ((EntryType == TT_TYPE_BLOCK_ENTRY) ||
((TableLevel == 3) && (EntryType == TT_TYPE_BLOCK_ENTRY_LEVEL3))) ((TableLevel == 3) && (EntryType == TT_TYPE_BLOCK_ENTRY_LEVEL3))) {
{
if ((*PrevEntryAttribute == INVALID_ENTRY) || (EntryAttribute != *PrevEntryAttribute)) { if ((*PrevEntryAttribute == INVALID_ENTRY) || (EntryAttribute != *PrevEntryAttribute)) {
if (*PrevEntryAttribute != INVALID_ENTRY) { if (*PrevEntryAttribute != INVALID_ENTRY) {
// Update GCD with the last region // Update GCD with the last region
SetGcdMemorySpaceAttributes ( SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,
MemorySpaceMap,
NumberOfDescriptors,
*StartGcdRegion, *StartGcdRegion,
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))) - *StartGcdRegion, (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))) - *StartGcdRegion,
PageAttributeToGcdAttribute (*PrevEntryAttribute) PageAttributeToGcdAttribute (*PrevEntryAttribute));
);
} }
// Start of the new region // Start of the new region
@ -166,24 +159,17 @@ GetNextEntryAttribute (
ASSERT (TableLevel < 3); ASSERT (TableLevel < 3);
// Increase the level number and scan the sub-level table // Increase the level number and scan the sub-level table
GetNextEntryAttribute ( GetNextEntryAttribute ((UINT64*)(Entry & TT_ADDRESS_MASK_DESCRIPTION_TABLE),
(UINT64 *)(Entry & TT_ADDRESS_MASK_DESCRIPTION_TABLE), TT_ENTRY_COUNT, TableLevel + 1,
TT_ENTRY_COUNT,
TableLevel + 1,
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))), (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))),
PrevEntryAttribute, PrevEntryAttribute, StartGcdRegion);
StartGcdRegion
);
} else { } else {
if (*PrevEntryAttribute != INVALID_ENTRY) { if (*PrevEntryAttribute != INVALID_ENTRY) {
// Update GCD with the last region // Update GCD with the last region
SetGcdMemorySpaceAttributes ( SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,
MemorySpaceMap,
NumberOfDescriptors,
*StartGcdRegion, *StartGcdRegion,
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))) - *StartGcdRegion, (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))) - *StartGcdRegion,
PageAttributeToGcdAttribute (*PrevEntryAttribute) PageAttributeToGcdAttribute (*PrevEntryAttribute));
);
// Start of the new region // Start of the new region
*StartGcdRegion = BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel)); *StartGcdRegion = BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel));
@ -246,24 +232,17 @@ SyncCacheConfig (
// We scan from the start of the memory map (ie: at the address 0x0) // We scan from the start of the memory map (ie: at the address 0x0)
BaseAddressGcdRegion = 0x0; BaseAddressGcdRegion = 0x0;
EndAddressGcdRegion = GetNextEntryAttribute ( EndAddressGcdRegion = GetNextEntryAttribute (FirstLevelTableAddress,
FirstLevelTableAddress, TableCount, TableLevel,
TableCount,
TableLevel,
BaseAddressGcdRegion, BaseAddressGcdRegion,
&PageAttribute, &PageAttribute, &BaseAddressGcdRegion);
&BaseAddressGcdRegion
);
// Update GCD with the last region if valid // Update GCD with the last region if valid
if (PageAttribute != INVALID_ENTRY) { if (PageAttribute != INVALID_ENTRY) {
SetGcdMemorySpaceAttributes ( SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,
MemorySpaceMap,
NumberOfDescriptors,
BaseAddressGcdRegion, BaseAddressGcdRegion,
EndAddressGcdRegion - BaseAddressGcdRegion, EndAddressGcdRegion - BaseAddressGcdRegion,
PageAttributeToGcdAttribute (PageAttribute) PageAttributeToGcdAttribute (PageAttribute));
);
} }
FreePool (MemorySpaceMap); FreePool (MemorySpaceMap);
@ -285,7 +264,6 @@ EfiAttributeToArmAttribute (
} else { } else {
ArmAttributes = TT_ATTR_INDX_DEVICE_MEMORY | TT_UXN_MASK | TT_PXN_MASK; ArmAttributes = TT_ATTR_INDX_DEVICE_MEMORY | TT_UXN_MASK | TT_PXN_MASK;
} }
break; break;
case EFI_MEMORY_WC: case EFI_MEMORY_WC:
ArmAttributes = TT_ATTR_INDX_MEMORY_NON_CACHEABLE; ArmAttributes = TT_ATTR_INDX_MEMORY_NON_CACHEABLE;
@ -305,7 +283,7 @@ EfiAttributeToArmAttribute (
// Determine protection attributes // Determine protection attributes
if ((EfiAttributes & EFI_MEMORY_RO) != 0) { if ((EfiAttributes & EFI_MEMORY_RO) != 0) {
ArmAttributes |= TT_AP_NO_RO; ArmAttributes |= TT_AP_RO_RO;
} }
// Process eXecute Never attribute // Process eXecute Never attribute
@ -352,10 +330,7 @@ GetMemoryRegionRec (
NextTranslationTable, // Address of the next level page table NextTranslationTable, // Address of the next level page table
TableLevel + 1, // Next Page Table level TableLevel + 1, // Next Page Table level
(UINTN*)TT_LAST_BLOCK_ADDRESS(NextTranslationTable, TT_ENTRY_COUNT), (UINTN*)TT_LAST_BLOCK_ADDRESS(NextTranslationTable, TT_ENTRY_COUNT),
BaseAddress, BaseAddress, RegionLength, RegionAttributes);
RegionLength,
RegionAttributes
);
// In case of 'Success', it means the end of the block region has been found into the upper // In case of 'Success', it means the end of the block region has been found into the upper
// level translation table // level translation table
@ -383,7 +358,6 @@ GetMemoryRegionRec (
// In case we have found the end of the region we return success // In case we have found the end of the region we return success
return EFI_SUCCESS; return EFI_SUCCESS;
} }
BlockEntry++; BlockEntry++;
} }
@ -414,14 +388,9 @@ GetMemoryRegion (
// Get the Table info from T0SZ // Get the Table info from T0SZ
GetRootTranslationTableInfo (T0SZ, &TableLevel, &EntryCount); GetRootTranslationTableInfo (T0SZ, &TableLevel, &EntryCount);
Status = GetMemoryRegionRec ( Status = GetMemoryRegionRec (TranslationTable, TableLevel,
TranslationTable,
TableLevel,
(UINTN*)TT_LAST_BLOCK_ADDRESS(TranslationTable, EntryCount), (UINTN*)TT_LAST_BLOCK_ADDRESS(TranslationTable, EntryCount),
BaseAddress, BaseAddress, RegionLength, RegionAttributes);
RegionLength,
RegionAttributes
);
// If the region continues up to the end of the root table then GetMemoryRegionRec() // If the region continues up to the end of the root table then GetMemoryRegionRec()
// will return EFI_NOT_FOUND // will return EFI_NOT_FOUND

View File

@ -206,7 +206,6 @@ SyncCacheConfigPage (
*NextRegionBase = BaseAddress | (i << TT_DESCRIPTOR_PAGE_BASE_SHIFT); *NextRegionBase = BaseAddress | (i << TT_DESCRIPTOR_PAGE_BASE_SHIFT);
NextPageAttributes = 0; NextPageAttributes = 0;
} }
*NextRegionLength += TT_DESCRIPTOR_PAGE_SIZE; *NextRegionLength += TT_DESCRIPTOR_PAGE_SIZE;
} }
@ -234,6 +233,7 @@ SyncCacheConfig (
UINTN NumberOfDescriptors; UINTN NumberOfDescriptors;
EFI_GCD_MEMORY_SPACE_DESCRIPTOR *MemorySpaceMap; EFI_GCD_MEMORY_SPACE_DESCRIPTOR *MemorySpaceMap;
DEBUG ((DEBUG_PAGE, "SyncCacheConfig()\n")); DEBUG ((DEBUG_PAGE, "SyncCacheConfig()\n"));
// This code assumes MMU is enabled and filed with section translations // This code assumes MMU is enabled and filed with section translations
@ -246,6 +246,7 @@ SyncCacheConfig (
Status = gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap); Status = gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
// The GCD implementation maintains its own copy of the state of memory space attributes. GCD needs // The GCD implementation maintains its own copy of the state of memory space attributes. GCD needs
// to know what the initial memory space attributes are. The CPU Arch. Protocol does not provide a // to know what the initial memory space attributes are. The CPU Arch. Protocol does not provide a
// GetMemoryAttributes function for GCD to get this so we must resort to calling GCD (as if we were // GetMemoryAttributes function for GCD to get this so we must resort to calling GCD (as if we were
@ -283,7 +284,6 @@ SyncCacheConfig (
NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(i << TT_DESCRIPTOR_SECTION_BASE_SHIFT); NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
NextSectionAttributes = SectionAttributes; NextSectionAttributes = SectionAttributes;
} }
NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE; NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE;
} else if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE(FirstLevelTable[i])) { } else if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE(FirstLevelTable[i])) {
// In this case any bits set in the 'NextSectionAttributes' are garbage and were set from // In this case any bits set in the 'NextSectionAttributes' are garbage and were set from
@ -292,14 +292,9 @@ SyncCacheConfig (
// section attributes into page attributes // section attributes into page attributes
NextSectionAttributes = 0; NextSectionAttributes = 0;
Status = SyncCacheConfigPage ( Status = SyncCacheConfigPage (
i, i,FirstLevelTable[i],
FirstLevelTable[i], NumberOfDescriptors, MemorySpaceMap,
NumberOfDescriptors, &NextRegionBase,&NextRegionLength,&NextSectionAttributes);
MemorySpaceMap,
&NextRegionBase,
&NextRegionLength,
&NextSectionAttributes
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
} else { } else {
// We do not support yet 16MB sections // We do not support yet 16MB sections
@ -318,7 +313,6 @@ SyncCacheConfig (
NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(i << TT_DESCRIPTOR_SECTION_BASE_SHIFT); NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
NextSectionAttributes = 0; NextSectionAttributes = 0;
} }
NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE; NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE;
} }
} // section entry loop } // section entry loop
@ -500,8 +494,7 @@ GetMemoryRegion (
break; break;
} }
} else if (((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) || } else if (((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) ||
((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SUPERSECTION)) ((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SUPERSECTION)) {
{
if ((SectionDescriptor & TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK) != *RegionAttributes) { if ((SectionDescriptor & TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK) != *RegionAttributes) {
// If the attributes of the section differ from the one targeted then we exit the loop // If the attributes of the section differ from the one targeted then we exit the loop
break; break;

View File

@ -49,6 +49,7 @@ CpuFlushCpuDataCache (
IN EFI_CPU_FLUSH_TYPE FlushType IN EFI_CPU_FLUSH_TYPE FlushType
) )
{ {
switch (FlushType) { switch (FlushType) {
case EfiCpuFlushTypeWriteBack: case EfiCpuFlushTypeWriteBack:
WriteBackDataCacheRange ((VOID *)(UINTN)Start, (UINTN)Length); WriteBackDataCacheRange ((VOID *)(UINTN)Start, (UINTN)Length);
@ -66,6 +67,7 @@ CpuFlushCpuDataCache (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
This function enables interrupt processing by the processor. This function enables interrupt processing by the processor.
@ -86,6 +88,7 @@ CpuEnableInterrupt (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
This function disables interrupt processing by the processor. This function disables interrupt processing by the processor.
@ -106,6 +109,7 @@ CpuDisableInterrupt (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
This function retrieves the processor's current interrupt state a returns it in This function retrieves the processor's current interrupt state a returns it in
State. If interrupts are currently enabled, then TRUE is returned. If interrupts State. If interrupts are currently enabled, then TRUE is returned. If interrupts
@ -134,6 +138,7 @@ CpuGetInterruptState (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
This function generates an INIT on the processor. If this function succeeds, then the This function generates an INIT on the processor. If this function succeeds, then the
processor will be reset, and control will not be returned to the caller. If InitType is processor will be reset, and control will not be returned to the caller. If InitType is
@ -242,8 +247,7 @@ CpuDxeInitialize (
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
&mCpuHandle, &mCpuHandle,
&gEfiCpuArchProtocolGuid, &gEfiCpuArchProtocolGuid, &mCpu,
&mCpu,
NULL NULL
); );

View File

@ -59,6 +59,7 @@ RegisterInterruptHandler (
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
); );
/** /**
This function registers and enables the handler specified by InterruptHandler for a processor This function registers and enables the handler specified by InterruptHandler for a processor
interrupt or exception type specified by InterruptType. If InterruptHandler is NULL, then the interrupt or exception type specified by InterruptType. If InterruptHandler is NULL, then the
@ -85,6 +86,7 @@ RegisterDebuggerInterruptHandler (
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
); );
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CpuSetMemoryAttributes ( CpuSetMemoryAttributes (

View File

@ -43,22 +43,19 @@ SearchGcdMemorySpaces (
*EndIndex = 0; *EndIndex = 0;
for (Index = 0; Index < NumberOfDescriptors; Index++) { for (Index = 0; Index < NumberOfDescriptors; Index++) {
if ((BaseAddress >= MemorySpaceMap[Index].BaseAddress) && if ((BaseAddress >= MemorySpaceMap[Index].BaseAddress) &&
(BaseAddress < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length))) (BaseAddress < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length))) {
{
*StartIndex = Index; *StartIndex = Index;
} }
if (((BaseAddress + Length - 1) >= MemorySpaceMap[Index].BaseAddress) && if (((BaseAddress + Length - 1) >= MemorySpaceMap[Index].BaseAddress) &&
((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length))) ((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length))) {
{
*EndIndex = Index; *EndIndex = Index;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
} }
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
/** /**
Sets the attributes for a specified range in Gcd Memory Space Map. Sets the attributes for a specified range in Gcd Memory Space Map.
@ -91,21 +88,14 @@ SetGcdMemorySpaceAttributes (
EFI_PHYSICAL_ADDRESS RegionStart; EFI_PHYSICAL_ADDRESS RegionStart;
UINT64 RegionLength; UINT64 RegionLength;
DEBUG (( DEBUG ((DEBUG_GCD, "SetGcdMemorySpaceAttributes[0x%lX; 0x%lX] = 0x%lX\n",
DEBUG_GCD, BaseAddress, BaseAddress + Length, Attributes));
"SetGcdMemorySpaceAttributes[0x%lX; 0x%lX] = 0x%lX\n",
BaseAddress,
BaseAddress + Length,
Attributes
));
// We do not support a smaller granularity than 4KB on ARM Architecture // We do not support a smaller granularity than 4KB on ARM Architecture
if ((Length & EFI_PAGE_MASK) != 0) { if ((Length & EFI_PAGE_MASK) != 0) {
DEBUG (( DEBUG ((DEBUG_WARN,
DEBUG_WARN,
"Warning: We do not support smaller granularity than 4KB on ARM Architecture (passed length: 0x%lX).\n", "Warning: We do not support smaller granularity than 4KB on ARM Architecture (passed length: 0x%lX).\n",
Length Length));
));
} }
// //
@ -130,7 +120,6 @@ SetGcdMemorySpaceAttributes (
if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeNonExistent) { if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeNonExistent) {
continue; continue;
} }
// //
// Calculate the start and end address of the overlapping range // Calculate the start and end address of the overlapping range
// //
@ -139,13 +128,11 @@ SetGcdMemorySpaceAttributes (
} else { } else {
RegionStart = MemorySpaceMap[Index].BaseAddress; RegionStart = MemorySpaceMap[Index].BaseAddress;
} }
if ((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length)) { if ((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length)) {
RegionLength = BaseAddress + Length - RegionStart; RegionLength = BaseAddress + Length - RegionStart;
} else { } else {
RegionLength = MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length - RegionStart; RegionLength = MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length - RegionStart;
} }
// //
// Set memory attributes according to MTRR attribute and the original attribute of descriptor // Set memory attributes according to MTRR attribute and the original attribute of descriptor
// //

View File

@ -79,8 +79,7 @@ PublishArmProcessorTable (
// Allocate runtime memory for ARM processor Table entries // Allocate runtime memory for ARM processor Table entries
ArmProcessorTable->ArmCpus = (ARM_CORE_INFO*)AllocateRuntimePool ( ArmProcessorTable->ArmCpus = (ARM_CORE_INFO*)AllocateRuntimePool (
ArmProcessorTable->NumberOfEntries * sizeof (ARM_CORE_INFO) ArmProcessorTable->NumberOfEntries * sizeof(ARM_CORE_INFO));
);
// Check if the memory allocation is successful or not // Check if the memory allocation is successful or not
ASSERT(NULL != ArmProcessorTable->ArmCpus); ASSERT(NULL != ArmProcessorTable->ArmCpus);

View File

@ -24,7 +24,7 @@ InitializeExceptions (
VectorInfo = (EFI_VECTOR_HANDOFF_INFO *)NULL; VectorInfo = (EFI_VECTOR_HANDOFF_INFO *)NULL;
Status = EfiGetSystemConfigurationTable(&gEfiVectorHandoffTableGuid, (VOID **)&VectorInfoList); Status = EfiGetSystemConfigurationTable(&gEfiVectorHandoffTableGuid, (VOID **)&VectorInfoList);
if ((Status == EFI_SUCCESS) && (VectorInfoList != NULL)) { if (Status == EFI_SUCCESS && VectorInfoList != NULL) {
VectorInfo = VectorInfoList; VectorInfo = VectorInfoList;
} }

View File

@ -16,6 +16,8 @@ Abstract:
**/ **/
// //
// The package level header files this module uses // The package level header files this module uses
// //

View File

@ -5,7 +5,6 @@
* SPDX-License-Identifier: BSD-2-Clause-Patent * SPDX-License-Identifier: BSD-2-Clause-Patent
* *
**/ **/
#ifndef GENERIC_WATCHDOG_H_ #ifndef GENERIC_WATCHDOG_H_
#define GENERIC_WATCHDOG_H_ #define GENERIC_WATCHDOG_H_

View File

@ -119,12 +119,8 @@ WatchdogInterruptHandler (
mWatchdogNotify (TimerPeriod + 1); mWatchdogNotify (TimerPeriod + 1);
} }
gRT->ResetSystem ( gRT->ResetSystem (EfiResetCold, EFI_TIMEOUT, StrSize (ResetString),
EfiResetCold, (CHAR16 *)ResetString);
EFI_TIMEOUT,
StrSize (ResetString),
(CHAR16 *)ResetString
);
// If we got here then the reset didn't work // If we got here then the reset didn't work
ASSERT (FALSE); ASSERT (FALSE);
@ -162,11 +158,11 @@ WatchdogRegisterHandler (
IN EFI_WATCHDOG_TIMER_NOTIFY NotifyFunction IN EFI_WATCHDOG_TIMER_NOTIFY NotifyFunction
) )
{ {
if ((mWatchdogNotify == NULL) && (NotifyFunction == NULL)) { if (mWatchdogNotify == NULL && NotifyFunction == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if ((mWatchdogNotify != NULL) && (NotifyFunction != NULL)) { if (mWatchdogNotify != NULL && NotifyFunction != NULL) {
return EFI_ALREADY_STARTED; return EFI_ALREADY_STARTED;
} }
@ -311,11 +307,8 @@ GenericWatchdogEntry (
EFI_STATUS Status; EFI_STATUS Status;
EFI_HANDLE Handle; EFI_HANDLE Handle;
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (&gHardwareInterrupt2ProtocolGuid, NULL,
&gHardwareInterrupt2ProtocolGuid, (VOID **)&mInterruptProtocol);
NULL,
(VOID **)&mInterruptProtocol
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
/* Make sure the Watchdog Timer Architectural Protocol has not been installed /* Make sure the Watchdog Timer Architectural Protocol has not been installed
@ -327,44 +320,33 @@ GenericWatchdogEntry (
ASSERT (mTimerFrequencyHz != 0); ASSERT (mTimerFrequencyHz != 0);
// Install interrupt handler // Install interrupt handler
Status = mInterruptProtocol->RegisterInterruptSource ( Status = mInterruptProtocol->RegisterInterruptSource (mInterruptProtocol,
mInterruptProtocol,
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum), FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
WatchdogInterruptHandler WatchdogInterruptHandler);
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
Status = mInterruptProtocol->SetTriggerType ( Status = mInterruptProtocol->SetTriggerType (mInterruptProtocol,
mInterruptProtocol,
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum), FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING);
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto UnregisterHandler; goto UnregisterHandler;
} }
// Install the Timer Architectural Protocol onto a new handle // Install the Timer Architectural Protocol onto a new handle
Handle = NULL; Handle = NULL;
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (&Handle,
&Handle, &gEfiWatchdogTimerArchProtocolGuid, &mWatchdogTimer,
&gEfiWatchdogTimerArchProtocolGuid, NULL);
&mWatchdogTimer,
NULL
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto UnregisterHandler; goto UnregisterHandler;
} }
// Register for an ExitBootServicesEvent // Register for an ExitBootServicesEvent
Status = gBS->CreateEvent ( Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY,
EVT_SIGNAL_EXIT_BOOT_SERVICES, WatchdogExitBootServicesEvent, NULL,
TPL_NOTIFY, &mEfiExitBootServicesEvent);
WatchdogExitBootServicesEvent,
NULL,
&mEfiExitBootServicesEvent
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
mNumTimerTicks = 0; mNumTimerTicks = 0;
@ -374,10 +356,8 @@ GenericWatchdogEntry (
UnregisterHandler: UnregisterHandler:
// Unregister the handler // Unregister the handler
mInterruptProtocol->RegisterInterruptSource ( mInterruptProtocol->RegisterInterruptSource (mInterruptProtocol,
mInterruptProtocol,
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum), FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
NULL NULL);
);
return Status; return Status;
} }

View File

@ -42,20 +42,14 @@ STATIC EFI_HANDLE mMmCommunicateHandle;
This function provides a service to send and receive messages from a registered UEFI service. This function provides a service to send and receive messages from a registered UEFI service.
@param[in] This The EFI_MM_COMMUNICATION_PROTOCOL instance. @param[in] This The EFI_MM_COMMUNICATION_PROTOCOL instance.
@param[in, out] CommBufferPhysical Physical address of the MM communication buffer @param[in] CommBufferPhysical Physical address of the MM communication buffer
@param[in, out] CommBufferVirtual Virtual address of the MM communication buffer @param[in] CommBufferVirtual Virtual address of the MM communication buffer
@param[in, out] CommSize The size of the data buffer being passed in. On input, @param[in] CommSize The size of the data buffer being passed in. On exit, the size of data
when not omitted, the buffer should cover EFI_MM_COMMUNICATE_HEADER being returned. Zero if the handler does not wish to reply with any data.
and the value of MessageLength field. On exit, the size This parameter is optional and may be NULL.
of data being returned. Zero if the handler does not
wish to reply with any data. This parameter is optional
and may be NULL.
@retval EFI_SUCCESS The message was successfully posted. @retval EFI_SUCCESS The message was successfully posted.
@retval EFI_INVALID_PARAMETER CommBufferPhysical or CommBufferVirtual was NULL, or @retval EFI_INVALID_PARAMETER CommBufferPhysical was NULL or CommBufferVirtual was NULL.
integer value pointed by CommSize does not cover
EFI_MM_COMMUNICATE_HEADER and the value of MessageLength
field.
@retval EFI_BAD_BUFFER_SIZE The buffer is too large for the MM implementation. @retval EFI_BAD_BUFFER_SIZE The buffer is too large for the MM implementation.
If this error is returned, the MessageLength field If this error is returned, the MessageLength field
in the CommBuffer header or the integer pointed by in the CommBuffer header or the integer pointed by
@ -88,11 +82,10 @@ MmCommunication2Communicate (
// //
// Check parameters // Check parameters
// //
if ((CommBufferVirtual == NULL) || (CommBufferPhysical == NULL)) { if (CommBufferVirtual == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
Status = EFI_SUCCESS;
CommunicateHeader = CommBufferVirtual; CommunicateHeader = CommBufferVirtual;
// CommBuffer is a mandatory parameter. Hence, Rely on // CommBuffer is a mandatory parameter. Hence, Rely on
// MessageLength + Header to ascertain the // MessageLength + Header to ascertain the
@ -102,41 +95,33 @@ MmCommunication2Communicate (
sizeof (CommunicateHeader->HeaderGuid) + sizeof (CommunicateHeader->HeaderGuid) +
sizeof (CommunicateHeader->MessageLength); sizeof (CommunicateHeader->MessageLength);
// If CommSize is not omitted, perform size inspection before proceeding. // If the length of the CommBuffer is 0 then return the expected length.
if (CommSize != NULL) { if (CommSize != 0) {
// This case can be used by the consumer of this driver to find out the // This case can be used by the consumer of this driver to find out the
// max size that can be used for allocating CommBuffer. // max size that can be used for allocating CommBuffer.
if ((*CommSize == 0) || if ((*CommSize == 0) ||
(*CommSize > mNsCommBuffMemRegion.Length)) (*CommSize > mNsCommBuffMemRegion.Length)) {
{
*CommSize = mNsCommBuffMemRegion.Length; *CommSize = mNsCommBuffMemRegion.Length;
Status = EFI_BAD_BUFFER_SIZE; return EFI_BAD_BUFFER_SIZE;
} }
// //
// CommSize should cover at least MessageLength + sizeof (EFI_MM_COMMUNICATE_HEADER); // CommSize must match MessageLength + sizeof (EFI_MM_COMMUNICATE_HEADER);
// //
if (*CommSize < BufferSize) { if (*CommSize != BufferSize) {
Status = EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
} }
// //
// If the message length is 0 or greater than what can be tolerated by the MM // If the buffer size is 0 or greater than what can be tolerated by the MM
// environment then return the expected size. // environment then return the expected size.
// //
if ((CommunicateHeader->MessageLength == 0) || if ((BufferSize == 0) ||
(BufferSize > mNsCommBuffMemRegion.Length)) (BufferSize > mNsCommBuffMemRegion.Length)) {
{
CommunicateHeader->MessageLength = mNsCommBuffMemRegion.Length - CommunicateHeader->MessageLength = mNsCommBuffMemRegion.Length -
sizeof (CommunicateHeader->HeaderGuid) - sizeof (CommunicateHeader->HeaderGuid) -
sizeof (CommunicateHeader->MessageLength); sizeof (CommunicateHeader->MessageLength);
Status = EFI_BAD_BUFFER_SIZE; return EFI_BAD_BUFFER_SIZE;
}
// MessageLength or CommSize check has failed, return here.
if (EFI_ERROR (Status)) {
return Status;
} }
// SMC Function ID // SMC Function ID
@ -234,19 +219,15 @@ NotifySetVirtualAddressMap (
(VOID **)&mNsCommBuffMemRegion.VirtualBase (VOID **)&mNsCommBuffMemRegion.VirtualBase
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG (( DEBUG ((DEBUG_ERROR, "NotifySetVirtualAddressMap():"
DEBUG_ERROR, " Unable to convert MM runtime pointer. Status:0x%r\n", Status));
"NotifySetVirtualAddressMap():"
" Unable to convert MM runtime pointer. Status:0x%r\n",
Status
));
} }
} }
STATIC STATIC
EFI_STATUS EFI_STATUS
GetMmCompatibility ( GetMmCompatibility ()
)
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT32 MmVersion; UINT32 MmVersion;
@ -260,24 +241,13 @@ GetMmCompatibility (
MmVersion = MmVersionArgs.Arg0; MmVersion = MmVersionArgs.Arg0;
if ((MM_MAJOR_VER(MmVersion) == MM_CALLER_MAJOR_VER) && if ((MM_MAJOR_VER(MmVersion) == MM_CALLER_MAJOR_VER) &&
(MM_MINOR_VER (MmVersion) >= MM_CALLER_MINOR_VER)) (MM_MINOR_VER(MmVersion) >= MM_CALLER_MINOR_VER)) {
{ DEBUG ((DEBUG_INFO, "MM Version: Major=0x%x, Minor=0x%x\n",
DEBUG (( MM_MAJOR_VER(MmVersion), MM_MINOR_VER(MmVersion)));
DEBUG_INFO,
"MM Version: Major=0x%x, Minor=0x%x\n",
MM_MAJOR_VER (MmVersion),
MM_MINOR_VER (MmVersion)
));
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
} else { } else {
DEBUG (( DEBUG ((DEBUG_ERROR, "Incompatible MM Versions.\n Current Version: Major=0x%x, Minor=0x%x.\n Expected: Major=0x%x, Minor>=0x%x.\n",
DEBUG_ERROR, MM_MAJOR_VER(MmVersion), MM_MINOR_VER(MmVersion), MM_CALLER_MAJOR_VER, MM_CALLER_MINOR_VER));
"Incompatible MM Versions.\n Current Version: Major=0x%x, Minor=0x%x.\n Expected: Major=0x%x, Minor>=0x%x.\n",
MM_MAJOR_VER (MmVersion),
MM_MINOR_VER (MmVersion),
MM_CALLER_MAJOR_VER,
MM_CALLER_MINOR_VER
));
Status = EFI_UNSUPPORTED; Status = EFI_UNSUPPORTED;
} }
@ -369,11 +339,8 @@ MmCommunication2Initialize (
EFI_MEMORY_RUNTIME EFI_MEMORY_RUNTIME
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG (( DEBUG ((DEBUG_ERROR, "MmCommunicateInitialize: "
DEBUG_ERROR, "Failed to add MM-NS Buffer Memory Space\n"));
"MmCommunicateInitialize: "
"Failed to add MM-NS Buffer Memory Space\n"
));
goto ReturnErrorStatus; goto ReturnErrorStatus;
} }
@ -383,11 +350,8 @@ MmCommunication2Initialize (
EFI_MEMORY_WB | EFI_MEMORY_XP | EFI_MEMORY_RUNTIME EFI_MEMORY_WB | EFI_MEMORY_XP | EFI_MEMORY_RUNTIME
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG (( DEBUG ((DEBUG_ERROR, "MmCommunicateInitialize: "
DEBUG_ERROR, "Failed to set MM-NS Buffer Memory attributes\n"));
"MmCommunicateInitialize: "
"Failed to set MM-NS Buffer Memory attributes\n"
));
goto CleanAddedMemorySpace; goto CleanAddedMemorySpace;
} }
@ -399,11 +363,8 @@ MmCommunication2Initialize (
&mMmCommunication2 &mMmCommunication2
); );
if (EFI_ERROR(Status)) { if (EFI_ERROR(Status)) {
DEBUG (( DEBUG ((DEBUG_ERROR, "MmCommunicationInitialize: "
DEBUG_ERROR, "Failed to install MM communication protocol\n"));
"MmCommunicationInitialize: "
"Failed to install MM communication protocol\n"
));
goto CleanAddedMemorySpace; goto CleanAddedMemorySpace;
} }
@ -420,24 +381,17 @@ MmCommunication2Initialize (
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
for (Index = 0; Index < ARRAY_SIZE (mGuidedEventGuid); Index++) { for (Index = 0; Index < ARRAY_SIZE (mGuidedEventGuid); Index++) {
Status = gBS->CreateEventEx ( Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_CALLBACK,
EVT_NOTIFY_SIGNAL, MmGuidedEventNotify, mGuidedEventGuid[Index],
TPL_CALLBACK, mGuidedEventGuid[Index], &mGuidedEvent[Index]);
MmGuidedEventNotify,
mGuidedEventGuid[Index],
mGuidedEventGuid[Index],
&mGuidedEvent[Index]
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
while (Index-- > 0) { while (Index-- > 0) {
gBS->CloseEvent (mGuidedEvent[Index]); gBS->CloseEvent (mGuidedEvent[Index]);
} }
goto UninstallProtocol; goto UninstallProtocol;
} }
} }
return EFI_SUCCESS; return EFI_SUCCESS;
UninstallProtocol: UninstallProtocol:

View File

@ -7,6 +7,7 @@
**/ **/
#include <PiDxe.h> #include <PiDxe.h>
#include <Library/ArmLib.h> #include <Library/ArmLib.h>
@ -305,6 +306,7 @@ TimerInterruptHandler (
// Check if the timer interrupt is active // Check if the timer interrupt is active
if ((ArmGenericTimerGetTimerCtrlReg () ) & ARM_ARCH_TIMER_ISTATUS) { if ((ArmGenericTimerGetTimerCtrlReg () ) & ARM_ARCH_TIMER_ISTATUS) {
if (mTimerNotifyFunction != 0) { if (mTimerNotifyFunction != 0) {
mTimerNotifyFunction (mTimerPeriod * mElapsedPeriod); mTimerNotifyFunction (mTimerPeriod * mElapsedPeriod);
} }
@ -336,6 +338,7 @@ TimerInterruptHandler (
gBS->RestoreTPL (OriginalTPL); gBS->RestoreTPL (OriginalTPL);
} }
/** /**
Initialize the state information for the Timer Architectural Protocol and Initialize the state information for the Timer Architectural Protocol and
the Timer Debug support protocol that allows the debugger to break into a the Timer Debug support protocol that allows the debugger to break into a
@ -409,8 +412,7 @@ TimerInitialize (
// Install the Timer Architectural Protocol onto a new handle // Install the Timer Architectural Protocol onto a new handle
Status = gBS->InstallMultipleProtocolInterfaces( Status = gBS->InstallMultipleProtocolInterfaces(
&Handle, &Handle,
&gEfiTimerArchProtocolGuid, &gEfiTimerArchProtocolGuid, &gTimer,
&gTimer,
NULL NULL
); );
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR(Status);

View File

@ -60,12 +60,10 @@ typedef struct {
SEMIHOST_DEVICE_PATH gDevicePath = { SEMIHOST_DEVICE_PATH gDevicePath = {
{ {
{ HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0 } { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0 } },
},
EFI_CALLER_ID_GUID EFI_CALLER_ID_GUID
}, },
{ END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 } { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 } }
}
}; };
typedef struct { typedef struct {
@ -117,6 +115,8 @@ FreeFCB (
FreePool (Fcb); FreePool (Fcb);
} }
EFI_STATUS EFI_STATUS
VolumeOpen ( VolumeOpen (
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This, IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
@ -193,14 +193,12 @@ FileOpen (
if ( (OpenMode != EFI_FILE_MODE_READ) && if ( (OpenMode != EFI_FILE_MODE_READ) &&
(OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE)) && (OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE)) &&
(OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE))) (OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE)) ) {
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if (((OpenMode & EFI_FILE_MODE_CREATE) != 0) && if (((OpenMode & EFI_FILE_MODE_CREATE) != 0) &&
((Attributes & EFI_FILE_DIRECTORY) != 0)) ((Attributes & EFI_FILE_DIRECTORY) != 0)) {
{
return EFI_WRITE_PROTECTED; return EFI_WRITE_PROTECTED;
} }
@ -209,15 +207,13 @@ FileOpen (
if (AsciiFileName == NULL) { if (AsciiFileName == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
UnicodeStrToAsciiStrS (FileName, AsciiFileName, Length); UnicodeStrToAsciiStrS (FileName, AsciiFileName, Length);
// Opening '/', '\', '.', or the NULL pathname is trying to open the root directory // Opening '/', '\', '.', or the NULL pathname is trying to open the root directory
if ((AsciiStrCmp (AsciiFileName, "\\") == 0) || if ((AsciiStrCmp (AsciiFileName, "\\") == 0) ||
(AsciiStrCmp (AsciiFileName, "/") == 0) || (AsciiStrCmp (AsciiFileName, "/") == 0) ||
(AsciiStrCmp (AsciiFileName, "") == 0) || (AsciiStrCmp (AsciiFileName, "") == 0) ||
(AsciiStrCmp (AsciiFileName, ".") == 0)) (AsciiStrCmp (AsciiFileName, ".") == 0) ) {
{
FreePool (AsciiFileName); FreePool (AsciiFileName);
return (VolumeOpen (&gSemihostFs, NewHandle)); return (VolumeOpen (&gSemihostFs, NewHandle));
} }
@ -236,7 +232,6 @@ FileOpen (
} else { } else {
SemihostMode = SEMIHOST_FILE_MODE_READ | SEMIHOST_FILE_MODE_BINARY | SEMIHOST_FILE_MODE_UPDATE; SemihostMode = SEMIHOST_FILE_MODE_READ | SEMIHOST_FILE_MODE_BINARY | SEMIHOST_FILE_MODE_UPDATE;
} }
Return = SemihostFileOpen (AsciiFileName, SemihostMode, &SemihostHandle); Return = SemihostFileOpen (AsciiFileName, SemihostMode, &SemihostHandle);
if (RETURN_ERROR (Return)) { if (RETURN_ERROR (Return)) {
@ -351,7 +346,6 @@ TruncateFile (
if (RETURN_ERROR (Return)) { if (RETURN_ERROR (Return)) {
goto Error; goto Error;
} }
Remaining -= ToRead; Remaining -= ToRead;
Read += ToRead; Read += ToRead;
} }
@ -385,12 +379,12 @@ Error:
if (FileHandle != 0) { if (FileHandle != 0) {
SemihostFileClose (FileHandle); SemihostFileClose (FileHandle);
} }
if (Buffer != NULL) { if (Buffer != NULL) {
FreePool (Buffer); FreePool (Buffer);
} }
return (Status); return (Status);
} }
/** /**
@ -426,7 +420,6 @@ FileClose (
if (Fcb->Info.FileSize < Fcb->Info.PhysicalSize) { if (Fcb->Info.FileSize < Fcb->Info.PhysicalSize) {
TruncateFile (Fcb->FileName, Fcb->Info.FileSize); TruncateFile (Fcb->FileName, Fcb->Info.FileSize);
} }
FreePool (Fcb->FileName); FreePool (Fcb->FileName);
} }
@ -478,7 +471,6 @@ FileDelete (
if (RETURN_ERROR (Return)) { if (RETURN_ERROR (Return)) {
return EFI_WARN_DELETE_FAILURE; return EFI_WARN_DELETE_FAILURE;
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} else { } else {
return EFI_WARN_DELETE_FAILURE; return EFI_WARN_DELETE_FAILURE;
@ -582,7 +574,6 @@ ExtendFile (
if (RETURN_ERROR (Return)) { if (RETURN_ERROR (Return)) {
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
Remaining -= WriteNb; Remaining -= WriteNb;
} }
@ -627,8 +618,7 @@ FileWrite (
// We cannot write a read-only file // We cannot write a read-only file
if ((Fcb->Info.Attribute & EFI_FILE_READ_ONLY) if ((Fcb->Info.Attribute & EFI_FILE_READ_ONLY)
|| !(Fcb->OpenMode & EFI_FILE_MODE_WRITE)) || !(Fcb->OpenMode & EFI_FILE_MODE_WRITE)) {
{
return EFI_ACCESS_DENIED; return EFI_ACCESS_DENIED;
} }
@ -642,7 +632,6 @@ FileWrite (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
Fcb->Info.FileSize = Fcb->Position; Fcb->Info.FileSize = Fcb->Position;
} }
@ -661,7 +650,6 @@ FileWrite (
if (RETURN_ERROR (Return)) { if (RETURN_ERROR (Return)) {
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
Fcb->Info.PhysicalSize = Length; Fcb->Info.PhysicalSize = Length;
return EFI_SUCCESS; return EFI_SUCCESS;
@ -730,7 +718,8 @@ FileSetPosition (
if (Position != 0) { if (Position != 0) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
} else { }
else {
// //
// UEFI Spec section 12.5: // UEFI Spec section 12.5:
// "Seeking to position 0xFFFFFFFFFFFFFFFF causes the current position to // "Seeking to position 0xFFFFFFFFFFFFFFFF causes the current position to
@ -739,7 +728,6 @@ FileSetPosition (
if (Position == 0xFFFFFFFFFFFFFFFF) { if (Position == 0xFFFFFFFFFFFFFFFF) {
Position = Fcb->Info.FileSize; Position = Fcb->Info.FileSize;
} }
Return = SemihostFileSeek (Fcb->SemihostHandle, MIN (Position, Fcb->Info.FileSize)); Return = SemihostFileSeek (Fcb->SemihostHandle, MIN (Position, Fcb->Info.FileSize));
if (RETURN_ERROR (Return)) { if (RETURN_ERROR (Return)) {
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
@ -901,8 +889,7 @@ FileGetInfo (
if ((This == NULL) || if ((This == NULL) ||
(InformationType == NULL) || (InformationType == NULL) ||
(BufferSize == NULL) || (BufferSize == NULL) ||
((Buffer == NULL) && (*BufferSize > 0))) ((Buffer == NULL) && (*BufferSize > 0)) ) {
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -981,7 +968,6 @@ SetFileInfo (
if (AsciiFileName == NULL) { if (AsciiFileName == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
UnicodeStrToAsciiStrS (Info->FileName, AsciiFileName, Length); UnicodeStrToAsciiStrS (Info->FileName, AsciiFileName, Length);
FileSizeIsDifferent = (Info->FileSize != Fcb->Info.FileSize); FileSizeIsDifferent = (Info->FileSize != Fcb->Info.FileSize);
@ -999,8 +985,7 @@ SetFileInfo (
// description. // description.
// //
if ((Fcb->OpenMode == EFI_FILE_MODE_READ) || if ((Fcb->OpenMode == EFI_FILE_MODE_READ) ||
(Fcb->Info.Attribute & EFI_FILE_READ_ONLY)) (Fcb->Info.Attribute & EFI_FILE_READ_ONLY) ) {
{
if (FileSizeIsDifferent || FileNameIsDifferent || ReadOnlyIsDifferent) { if (FileSizeIsDifferent || FileNameIsDifferent || ReadOnlyIsDifferent) {
Status = EFI_ACCESS_DENIED; Status = EFI_ACCESS_DENIED;
goto Error; goto Error;
@ -1021,7 +1006,6 @@ SetFileInfo (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto Error; goto Error;
} }
// //
// The read/write position from the host file system point of view // The read/write position from the host file system point of view
// is at the end of the file. If the position from this module // is at the end of the file. If the position from this module
@ -1032,14 +1016,12 @@ SetFileInfo (
FileSetPosition (&Fcb->File, Fcb->Position); FileSetPosition (&Fcb->File, Fcb->Position);
} }
} }
Fcb->Info.FileSize = FileSize; Fcb->Info.FileSize = FileSize;
Return = SemihostFileLength (Fcb->SemihostHandle, &Length); Return = SemihostFileLength (Fcb->SemihostHandle, &Length);
if (RETURN_ERROR (Return)) { if (RETURN_ERROR (Return)) {
goto Error; goto Error;
} }
Fcb->Info.PhysicalSize = Length; Fcb->Info.PhysicalSize = Length;
} }
@ -1066,7 +1048,6 @@ SetFileInfo (
if (RETURN_ERROR (Return)) { if (RETURN_ERROR (Return)) {
goto Error; goto Error;
} }
FreePool (Fcb->FileName); FreePool (Fcb->FileName);
Fcb->FileName = AsciiFileName; Fcb->FileName = AsciiFileName;
AsciiFileName = NULL; AsciiFileName = NULL;
@ -1138,24 +1119,19 @@ FileSetInfo (
if (Info->Size < (SIZE_OF_EFI_FILE_INFO + StrSize (Info->FileName))) { if (Info->Size < (SIZE_OF_EFI_FILE_INFO + StrSize (Info->FileName))) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if (BufferSize < Info->Size) { if (BufferSize < Info->Size) {
return EFI_BAD_BUFFER_SIZE; return EFI_BAD_BUFFER_SIZE;
} }
return SetFileInfo (Fcb, Info); return SetFileInfo (Fcb, Info);
} else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
SystemInfo = Buffer; SystemInfo = Buffer;
if (SystemInfo->Size < if (SystemInfo->Size <
(SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (SystemInfo->VolumeLabel))) (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (SystemInfo->VolumeLabel))) {
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if (BufferSize < SystemInfo->Size) { if (BufferSize < SystemInfo->Size) {
return EFI_BAD_BUFFER_SIZE; return EFI_BAD_BUFFER_SIZE;
} }
Buffer = SystemInfo->VolumeLabel; Buffer = SystemInfo->VolumeLabel;
if (StrSize (Buffer) > 0) { if (StrSize (Buffer) > 0) {
@ -1190,8 +1166,7 @@ FileFlush (
return EFI_SUCCESS; return EFI_SUCCESS;
} else { } else {
if ((Fcb->Info.Attribute & EFI_FILE_READ_ONLY) if ((Fcb->Info.Attribute & EFI_FILE_READ_ONLY)
|| !(Fcb->OpenMode & EFI_FILE_MODE_WRITE)) || !(Fcb->OpenMode & EFI_FILE_MODE_WRITE)) {
{
return EFI_ACCESS_DENIED; return EFI_ACCESS_DENIED;
} else { } else {
return EFI_SUCCESS; return EFI_SUCCESS;
@ -1217,10 +1192,8 @@ SemihostFsEntryPoint (
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
&gInstallHandle, &gInstallHandle,
&gEfiSimpleFileSystemProtocolGuid, &gEfiSimpleFileSystemProtocolGuid, &gSemihostFs,
&gSemihostFs, &gEfiDevicePathProtocolGuid, &gDevicePath,
&gEfiDevicePathProtocolGuid,
&gDevicePath,
NULL NULL
); );

View File

@ -243,3 +243,4 @@ FileFlush (
); );
#endif // SEMIHOST_FS_H_ #endif // SEMIHOST_FS_H_

View File

@ -9,6 +9,7 @@
**/ **/
#ifndef ASM_MACRO_IO_LIB_H_ #ifndef ASM_MACRO_IO_LIB_H_
#define ASM_MACRO_IO_LIB_H_ #define ASM_MACRO_IO_LIB_H_

View File

@ -9,6 +9,7 @@
**/ **/
#ifndef ASM_MACRO_IO_LIBV8_H_ #ifndef ASM_MACRO_IO_LIBV8_H_
#define ASM_MACRO_IO_LIBV8_H_ #define ASM_MACRO_IO_LIBV8_H_
@ -23,6 +24,7 @@
cbnz SAFE_XREG, 1f ;\ cbnz SAFE_XREG, 1f ;\
b . ;// We should never get here b . ;// We should never get here
// CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1 // CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1
// This only selects between EL1 and EL2 and EL3, else we die. // This only selects between EL1 and EL2 and EL3, else we die.
// Provide the Macro with a safe temp xreg to use. // Provide the Macro with a safe temp xreg to use.

View File

@ -152,6 +152,7 @@
#define TCR_EL1_TBI0_MASK (0x01UL << TCR_EL1_TBI0_FIELD) #define TCR_EL1_TBI0_MASK (0x01UL << TCR_EL1_TBI0_FIELD)
#define TCR_EL1_TBI1_MASK (0x01UL << TCR_EL1_TBI1_FIELD) #define TCR_EL1_TBI1_MASK (0x01UL << TCR_EL1_TBI1_FIELD)
#define TCR_EL23_T0SZ_FIELD (0) #define TCR_EL23_T0SZ_FIELD (0)
#define TCR_EL23_IRGN0_FIELD (8) #define TCR_EL23_IRGN0_FIELD (8)
#define TCR_EL23_ORGN0_FIELD (10) #define TCR_EL23_ORGN0_FIELD (10)
@ -165,6 +166,7 @@
#define TCR_EL23_TG0_MASK (0x01UL << TCR_EL23_TG0_FIELD) #define TCR_EL23_TG0_MASK (0x01UL << TCR_EL23_TG0_FIELD)
#define TCR_EL23_PS_MASK (0x07UL << TCR_EL23_PS_FIELD) #define TCR_EL23_PS_MASK (0x07UL << TCR_EL23_PS_FIELD)
#define TCR_RGN_OUTER_NON_CACHEABLE (0x0UL << 10) #define TCR_RGN_OUTER_NON_CACHEABLE (0x0UL << 10)
#define TCR_RGN_OUTER_WRITE_BACK_ALLOC (0x1UL << 10) #define TCR_RGN_OUTER_WRITE_BACK_ALLOC (0x1UL << 10)
#define TCR_RGN_OUTER_WRITE_THROUGH (0x2UL << 10) #define TCR_RGN_OUTER_WRITE_THROUGH (0x2UL << 10)
@ -193,3 +195,4 @@
// Uses LPAE Page Table format // Uses LPAE Page Table format
#endif // AARCH64_MMU_H_ #endif // AARCH64_MMU_H_

View File

@ -48,6 +48,7 @@
#define A9_SCU_SACR_OFFSET 0x50 #define A9_SCU_SACR_OFFSET 0x50
#define A9_SCU_SSACR_OFFSET 0x54 #define A9_SCU_SSACR_OFFSET 0x54
UINTN UINTN
EFIAPI EFIAPI
ArmGetScuBaseAddress ( ArmGetScuBaseAddress (
@ -55,3 +56,4 @@ ArmGetScuBaseAddress (
); );
#endif // ARM_CORTEX_A9_H_ #endif // ARM_CORTEX_A9_H_

View File

@ -41,6 +41,7 @@
#define CPSR_IRQ (1 << 7) #define CPSR_IRQ (1 << 7)
#define CPSR_FIQ (1 << 6) #define CPSR_FIQ (1 << 6)
// CPACR - Coprocessor Access Control Register definitions // CPACR - Coprocessor Access Control Register definitions
#define CPACR_CP_DENIED(cp) 0x00 #define CPACR_CP_DENIED(cp) 0x00
#define CPACR_CP_PRIV(cp) ((0x1 << ((cp) << 1)) & 0x0FFFFFFF) #define CPACR_CP_PRIV(cp) ((0x1 << ((cp) << 1)) & 0x0FFFFFFF)

View File

@ -33,6 +33,7 @@
#define TTBR_MP_NON_CACHEABLE ( TTBR_RGN_OUTER_NON_CACHEABLE | TTBR_RGN_INNER_NON_CACHEABLE ) #define TTBR_MP_NON_CACHEABLE ( TTBR_RGN_OUTER_NON_CACHEABLE | TTBR_RGN_INNER_NON_CACHEABLE )
#define TTBR_MP_WRITE_BACK_ALLOC ( TTBR_RGN_OUTER_WRITE_BACK_ALLOC | TTBR_RGN_INNER_WRITE_BACK_ALLOC | TTBR_SHAREABLE) #define TTBR_MP_WRITE_BACK_ALLOC ( TTBR_RGN_OUTER_WRITE_BACK_ALLOC | TTBR_RGN_INNER_WRITE_BACK_ALLOC | TTBR_SHAREABLE)
#define TRANSLATION_TABLE_SECTION_COUNT 4096 #define TRANSLATION_TABLE_SECTION_COUNT 4096
#define TRANSLATION_TABLE_SECTION_SIZE (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT) #define TRANSLATION_TABLE_SECTION_SIZE (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
#define TRANSLATION_TABLE_SECTION_ALIGNMENT (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT) #define TRANSLATION_TABLE_SECTION_ALIGNMENT (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)

View File

@ -14,7 +14,8 @@
#define MPIDR_U_BIT_MASK 0x40000000 #define MPIDR_U_BIT_MASK 0x40000000
typedef struct { typedef struct {
UINT64 Mpidr; UINT32 ClusterId;
UINT32 CoreId;
// MP Core Mailbox // MP Core Mailbox
EFI_PHYSICAL_ADDRESS MailboxSetAddress; EFI_PHYSICAL_ADDRESS MailboxSetAddress;
@ -42,6 +43,7 @@ typedef struct {
ARM_CORE_INFO *ArmCpus; ARM_CORE_INFO *ArmCpus;
} ARM_PROCESSOR_TABLE; } ARM_PROCESSOR_TABLE;
#define ARM_MP_CORE_INFO_GUID \ #define ARM_MP_CORE_INFO_GUID \
{ 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} } { 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} }

View File

@ -27,7 +27,8 @@ typedef union {
} CSSELR_DATA; } CSSELR_DATA;
/// The cache type values for the InD field of the CSSELR register /// The cache type values for the InD field of the CSSELR register
typedef enum { typedef enum
{
/// Select the data or unified cache /// Select the data or unified cache
CsselrCacheTypeDataOrUnified = 0, CsselrCacheTypeDataOrUnified = 0,
/// Select the instruction cache /// Select the instruction cache

View File

@ -17,6 +17,7 @@ typedef enum {
ARM_GIC_ARCH_REVISION_3 ARM_GIC_ARCH_REVISION_3
} ARM_GIC_ARCH_REVISION; } ARM_GIC_ARCH_REVISION;
ARM_GIC_ARCH_REVISION ARM_GIC_ARCH_REVISION
EFIAPI EFIAPI
ArmGicGetSupportedArchRevision ( ArmGicGetSupportedArchRevision (

View File

@ -52,6 +52,7 @@
#define ARM_GIC_ICDICFR_LEVEL_TRIGGERED 0x0 // Level triggered interrupt #define ARM_GIC_ICDICFR_LEVEL_TRIGGERED 0x0 // Level triggered interrupt
#define ARM_GIC_ICDICFR_EDGE_TRIGGERED 0x1 // Edge triggered interrupt #define ARM_GIC_ICDICFR_EDGE_TRIGGERED 0x1 // Edge triggered interrupt
// GIC Redistributor // GIC Redistributor
#define ARM_GICR_CTLR_FRAME_SIZE SIZE_64KB #define ARM_GICR_CTLR_FRAME_SIZE SIZE_64KB
#define ARM_GICR_SGI_PPI_FRAME_SIZE SIZE_64KB #define ARM_GICR_SGI_PPI_FRAME_SIZE SIZE_64KB

View File

@ -59,12 +59,8 @@ typedef struct {
ARM_MEMORY_REGION_ATTRIBUTES Attributes; ARM_MEMORY_REGION_ATTRIBUTES Attributes;
} ARM_MEMORY_REGION_DESCRIPTOR; } ARM_MEMORY_REGION_DESCRIPTOR;
typedef VOID (*CACHE_OPERATION)( typedef VOID (*CACHE_OPERATION)(VOID);
VOID typedef VOID (*LINE_OPERATION)(UINTN);
);
typedef VOID (*LINE_OPERATION)(
UINTN
);
// //
// ARM Processor Mode // ARM Processor Mode
@ -111,10 +107,6 @@ typedef enum {
#define GET_CORE_ID(MpId) ((MpId) & ARM_CORE_MASK) #define GET_CORE_ID(MpId) ((MpId) & ARM_CORE_MASK)
#define GET_CLUSTER_ID(MpId) (((MpId) & ARM_CLUSTER_MASK) >> 8) #define GET_CLUSTER_ID(MpId) (((MpId) & ARM_CLUSTER_MASK) >> 8)
#define GET_MPID(ClusterId, CoreId) (((ClusterId) << 8) | (CoreId)) #define GET_MPID(ClusterId, CoreId) (((ClusterId) << 8) | (CoreId))
#define GET_MPIDR_AFF0(MpId) ((MpId) & ARM_CORE_AFF0)
#define GET_MPIDR_AFF1(MpId) (((MpId) & ARM_CORE_AFF1) >> 8)
#define GET_MPIDR_AFF2(MpId) (((MpId) & ARM_CORE_AFF2) >> 16)
#define GET_MPIDR_AFF3(MpId) (((MpId) & ARM_CORE_AFF3) >> 32)
#define PRIMARY_CORE_ID (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK) #define PRIMARY_CORE_ID (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK)
/** Reads the CCSIDR register for the specified cache. /** Reads the CCSIDR register for the specified cache.
@ -191,6 +183,7 @@ ArmInvalidateDataCache (
VOID VOID
); );
VOID VOID
EFIAPI EFIAPI
ArmCleanInvalidateDataCache ( ArmCleanInvalidateDataCache (
@ -580,6 +573,7 @@ ArmWriteHVBar (
IN UINTN HypModeVectorBase IN UINTN HypModeVectorBase
); );
// //
// Helper functions for accessing CPU ACTLR // Helper functions for accessing CPU ACTLR
// //
@ -742,6 +736,7 @@ ArmGetPhysicalAddressBits (
VOID VOID
); );
/// ///
/// ID Register Helper functions /// ID Register Helper functions
/// ///
@ -773,7 +768,6 @@ ArmHasCcidx (
/// ///
/// AArch32-only ID Register Helper functions /// AArch32-only ID Register Helper functions
/// ///
/** /**
Check whether the CPU supports the Security extensions Check whether the CPU supports the Security extensions
@ -785,7 +779,6 @@ EFIAPI
ArmHasSecurityExtensions ( ArmHasSecurityExtensions (
VOID VOID
); );
#endif // MDE_CPU_ARM #endif // MDE_CPU_ARM
#endif // ARM_LIB_H_ #endif // ARM_LIB_H_

View File

@ -128,3 +128,4 @@ MtlReceiveMessage (
); );
#endif /* ARM_MTL_LIB_H_ */ #endif /* ARM_MTL_LIB_H_ */

View File

@ -1,6 +1,5 @@
/** @file /** @file
* *
* Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
* Copyright (c) 2012-2014, ARM Limited. All rights reserved. * Copyright (c) 2012-2014, ARM Limited. All rights reserved.
* *
* SPDX-License-Identifier: BSD-2-Clause-Patent * SPDX-License-Identifier: BSD-2-Clause-Patent
@ -38,76 +37,4 @@ ArmCallSmc (
IN OUT ARM_SMC_ARGS *Args IN OUT ARM_SMC_ARGS *Args
); );
/** Trigger an SMC call with 3 arguments.
@param Function The SMC function.
@param Arg1 Argument/result.
@param Arg2 Argument/result.
@param Arg3 Argument/result.
@return The SMC error code.
**/
UINTN
ArmCallSmc3 (
IN UINTN Function,
IN OUT UINTN *Arg1 OPTIONAL,
IN OUT UINTN *Arg2 OPTIONAL,
IN OUT UINTN *Arg3 OPTIONAL
);
/** Trigger an SMC call with 2 arguments.
@param Function The SMC function.
@param Arg1 Argument/result.
@param Arg2 Argument/result.
@param Arg3 Result.
@return The SMC error code.
**/
UINTN
ArmCallSmc2 (
IN UINTN Function,
IN OUT UINTN *Arg1 OPTIONAL,
IN OUT UINTN *Arg2 OPTIONAL,
OUT UINTN *Arg3 OPTIONAL
);
/** Trigger an SMC call with 1 argument.
@param Function The SMC function.
@param Arg1 Argument/result.
@param Arg2 Result.
@param Arg3 Result.
@return The SMC error code.
**/
UINTN
ArmCallSmc1 (
IN UINTN Function,
IN OUT UINTN *Arg1 OPTIONAL,
OUT UINTN *Arg2 OPTIONAL,
OUT UINTN *Arg3 OPTIONAL
);
/** Trigger an SMC call with 0 arguments.
@param Function The SMC function.
@param Arg1 Result.
@param Arg2 Result.
@param Arg3 Result.
@return The SMC error code.
**/
UINTN
ArmCallSmc0 (
IN UINTN Function,
OUT UINTN *Arg1 OPTIONAL,
OUT UINTN *Arg2 OPTIONAL,
OUT UINTN *Arg3 OPTIONAL
);
#endif // ARM_SMC_LIB_H_ #endif // ARM_SMC_LIB_H_

View File

@ -8,13 +8,15 @@
* *
**/ **/
#ifndef OEM_MISC_LIB_H_ #ifndef OEM_MISC_LIB_H_
#define OEM_MISC_LIB_H_ #define OEM_MISC_LIB_H_
#include <Uefi.h> #include <Uefi.h>
#include <IndustryStandard/SmBios.h> #include <IndustryStandard/SmBios.h>
typedef enum { typedef enum
{
CpuCacheL1 = 1, CpuCacheL1 = 1,
CpuCacheL2, CpuCacheL2,
CpuCacheL3, CpuCacheL3,
@ -25,7 +27,8 @@ typedef enum {
CpuCacheLevelMax CpuCacheLevelMax
} OEM_MISC_CPU_CACHE_LEVEL; } OEM_MISC_CPU_CACHE_LEVEL;
typedef struct { typedef struct
{
UINT8 Voltage; ///< Processor voltage UINT8 Voltage; ///< Processor voltage
UINT16 CurrentSpeed; ///< Current clock speed in MHz UINT16 CurrentSpeed; ///< Current clock speed in MHz
UINT16 MaxSpeed; ///< Maximum clock speed in MHz UINT16 MaxSpeed; ///< Maximum clock speed in MHz
@ -35,19 +38,17 @@ typedef struct {
UINT16 ThreadCount; ///< Number of threads per processor UINT16 ThreadCount; ///< Number of threads per processor
} OEM_MISC_PROCESSOR_DATA; } OEM_MISC_PROCESSOR_DATA;
typedef enum { typedef enum
{
ProductNameType01, ProductNameType01,
SerialNumType01, SerialNumType01,
UuidType01, UuidType01,
SystemManufacturerType01, SystemManufacturerType01,
VersionType01,
SkuNumberType01, SkuNumberType01,
FamilyType01, FamilyType01,
AssertTagType02, AssertTagType02,
SerialNumberType02, SerialNumberType02,
BoardManufacturerType02, BoardManufacturerType02,
ProductNameType02,
VersionType02,
SkuNumberType02, SkuNumberType02,
ChassisLocationType02, ChassisLocationType02,
AssetTagType03, AssetTagType03,
@ -56,8 +57,6 @@ typedef enum {
ChassisTypeType03, ChassisTypeType03,
ManufacturerType03, ManufacturerType03,
SkuNumberType03, SkuNumberType03,
ProcessorPartNumType04,
ProcessorSerialNumType04,
SmbiosHiiStringFieldMax SmbiosHiiStringFieldMax
} OEM_MISC_SMBIOS_HII_STRING_FIELD; } OEM_MISC_SMBIOS_HII_STRING_FIELD;

View File

@ -18,3 +18,4 @@
#define SCMI_MAX_STR_LEN 16 #define SCMI_MAX_STR_LEN 16
#endif /* ARM_SCMI_H_ */ #endif /* ARM_SCMI_H_ */

View File

@ -215,3 +215,4 @@ typedef struct _SCMI_CLOCK_PROTOCOL {
} SCMI_CLOCK_PROTOCOL; } SCMI_CLOCK_PROTOCOL;
#endif /* ARM_SCMI_CLOCK_PROTOCOL_H_ */ #endif /* ARM_SCMI_CLOCK_PROTOCOL_H_ */

View File

@ -256,3 +256,4 @@ typedef enum {
} SCMI_MESSAGE_ID_PERFORMANCE; } SCMI_MESSAGE_ID_PERFORMANCE;
#endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_H_ */ #endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_H_ */

View File

@ -7,6 +7,7 @@
**/ **/
#include <Base.h> #include <Base.h>
#include <Library/ArmLib.h> #include <Library/ArmLib.h>
#include <Library/BaseLib.h> #include <Library/BaseLib.h>
@ -24,6 +25,7 @@
#define MULT_U64_X_N MultU64x64 #define MULT_U64_X_N MultU64x64
#endif #endif
RETURN_STATUS RETURN_STATUS
EFIAPI EFIAPI
TimerConstructor ( TimerConstructor (
@ -34,6 +36,7 @@ TimerConstructor (
// Check if the ARM Generic Timer Extension is implemented. // Check if the ARM Generic Timer Extension is implemented.
// //
if (ArmIsArchTimerImplemented ()) { if (ArmIsArchTimerImplemented ()) {
// //
// Check if Architectural Timer frequency is pre-determined by the platform // Check if Architectural Timer frequency is pre-determined by the platform
// (ie. nonzero). // (ie. nonzero).
@ -56,7 +59,6 @@ TimerConstructor (
if (ArmHasSecurityExtensions ()) { if (ArmHasSecurityExtensions ()) {
ArmGenericTimerSetTimerFreq (PcdGet32 (PcdArmArchTimerFreqInHz)); ArmGenericTimerSetTimerFreq (PcdGet32 (PcdArmArchTimerFreqInHz));
} }
#endif #endif
} }
@ -66,8 +68,9 @@ TimerConstructor (
// If the reset value (0) is returned, just ASSERT. // If the reset value (0) is returned, just ASSERT.
// //
ASSERT (ArmGenericTimerGetTimerFreq () != 0); ASSERT (ArmGenericTimerGetTimerFreq () != 0);
} else { } else {
DEBUG ((DEBUG_ERROR, "ARM Architectural Timer is not available in the CPU, hence this library cannot be used.\n")); DEBUG ((EFI_D_ERROR, "ARM Architectural Timer is not available in the CPU, hence this library cannot be used.\n"));
ASSERT (0); ASSERT (0);
} }
@ -93,10 +96,10 @@ GetPlatformTimerFreq (
if (TimerFreq == 0) { if (TimerFreq == 0) {
TimerFreq = ArmGenericTimerGetTimerFreq (); TimerFreq = ArmGenericTimerGetTimerFreq ();
} }
return TimerFreq; return TimerFreq;
} }
/** /**
Stalls the CPU for the number of microseconds specified by MicroSeconds. Stalls the CPU for the number of microseconds specified by MicroSeconds.
@ -138,6 +141,7 @@ MicroSecondDelay (
return MicroSeconds; return MicroSeconds;
} }
/** /**
Stalls the CPU for at least the given number of nanoseconds. Stalls the CPU for at least the given number of nanoseconds.
@ -215,7 +219,7 @@ GetPerformanceCounter (
UINT64 UINT64
EFIAPI EFIAPI
GetPerformanceCounterProperties ( GetPerformanceCounterProperties (
OUT UINT64 *StartValue OPTIONAL, OUT UINT64 *StartValue, OPTIONAL
OUT UINT64 *EndValue OPTIONAL OUT UINT64 *EndValue OPTIONAL
) )
{ {
@ -263,8 +267,7 @@ GetTimeInNanoSecond (
DivU64x32Remainder ( DivU64x32Remainder (
Ticks, Ticks,
TimerFreq, TimerFreq,
&Remainder &Remainder),
),
1000000000U 1000000000U
); );
@ -275,8 +278,7 @@ GetTimeInNanoSecond (
NanoSeconds += DivU64x32 ( NanoSeconds += DivU64x32 (
MULT_U64_X_N ( MULT_U64_X_N (
(UINT64) Remainder, (UINT64) Remainder,
1000000000U 1000000000U),
),
TimerFreq TimerFreq
); );

View File

@ -34,7 +34,6 @@ CacheRangeOperation (
LineOperation(AlignedAddress); LineOperation(AlignedAddress);
AlignedAddress += LineLength; AlignedAddress += LineLength;
} }
ArmDataSynchronizationBarrier (); ArmDataSynchronizationBarrier ();
} }
@ -63,18 +62,11 @@ InvalidateInstructionCacheRange (
IN UINTN Length IN UINTN Length
) )
{ {
CacheRangeOperation ( CacheRangeOperation (Address, Length, ArmCleanDataCacheEntryToPoUByMVA,
Address, ArmDataCacheLineLength ());
Length, CacheRangeOperation (Address, Length,
ArmCleanDataCacheEntryToPoUByMVA,
ArmDataCacheLineLength ()
);
CacheRangeOperation (
Address,
Length,
ArmInvalidateInstructionCacheEntryToPoUByMVA, ArmInvalidateInstructionCacheEntryToPoUByMVA,
ArmInstructionCacheLineLength () ArmInstructionCacheLineLength ());
);
ArmInstructionSynchronizationBarrier (); ArmInstructionSynchronizationBarrier ();
@ -97,12 +89,8 @@ WriteBackInvalidateDataCacheRange (
IN UINTN Length IN UINTN Length
) )
{ {
CacheRangeOperation ( CacheRangeOperation(Address, Length, ArmCleanInvalidateDataCacheEntryByMVA,
Address, ArmDataCacheLineLength ());
Length,
ArmCleanInvalidateDataCacheEntryByMVA,
ArmDataCacheLineLength ()
);
return Address; return Address;
} }
@ -122,12 +110,8 @@ WriteBackDataCacheRange (
IN UINTN Length IN UINTN Length
) )
{ {
CacheRangeOperation ( CacheRangeOperation(Address, Length, ArmCleanDataCacheEntryByMVA,
Address, ArmDataCacheLineLength ());
Length,
ArmCleanDataCacheEntryByMVA,
ArmDataCacheLineLength ()
);
return Address; return Address;
} }
@ -138,11 +122,7 @@ InvalidateDataCacheRange (
IN UINTN Length IN UINTN Length
) )
{ {
CacheRangeOperation ( CacheRangeOperation(Address, Length, ArmInvalidateDataCacheEntryByMVA,
Address, ArmDataCacheLineLength ());
Length,
ArmInvalidateDataCacheEntryByMVA,
ArmDataCacheLineLength ()
);
return Address; return Address;
} }

View File

@ -69,6 +69,7 @@ CHAR8 *gLdmStack[] = {
#define LDM_EXT(_reg, _off) ((_reg == 13) ? gLdmStack[(_off)] : gLdmAdr[(_off)]) #define LDM_EXT(_reg, _off) ((_reg == 13) ? gLdmStack[(_off)] : gLdmAdr[(_off)])
#define SIGN(_U) ((_U) ? "" : "-") #define SIGN(_U) ((_U) ? "" : "-")
#define WRITE(_Write) ((_Write) ? "!" : "") #define WRITE(_Write) ((_Write) ? "!" : "")
#define BYTE(_B) ((_B) ? "B":"") #define BYTE(_B) ((_B) ? "B":"")
@ -109,11 +110,9 @@ MRegList (
} }
} }
} }
if (First) { if (First) {
AsciiStrCatS (mMregListStr, sizeof mMregListStr, "ERROR"); AsciiStrCatS (mMregListStr, sizeof mMregListStr, "ERROR");
} }
AsciiStrCatS (mMregListStr, sizeof mMregListStr, "}"); AsciiStrCatS (mMregListStr, sizeof mMregListStr, "}");
// BugBug: Make caller pass in buffer it is cleaner // BugBug: Make caller pass in buffer it is cleaner
@ -137,6 +136,7 @@ RotateRight (
return (Op >> Shift) | (Op << (32 - Shift)); return (Op >> Shift) | (Op << (32 - Shift));
} }
/** /**
Place a disassembly of **OpCodePtr into buffer, and update OpCodePtr to Place a disassembly of **OpCodePtr into buffer, and update OpCodePtr to
point to next instruction. point to next instruction.
@ -181,6 +181,7 @@ DisassembleArmInstruction (
Rd = (OpCode >> 12) & 0xf; Rd = (OpCode >> 12) & 0xf;
Rm = (OpCode & 0xf); Rm = (OpCode & 0xf);
if (Extended) { if (Extended) {
Index = AsciiSPrint (Buf, Size, "0x%08x ", OpCode); Index = AsciiSPrint (Buf, Size, "0x%08x ", OpCode);
Buf += Index; Buf += Index;
@ -196,7 +197,6 @@ DisassembleArmInstruction (
// A4.1.103 STREX{<cond>} <Rd>, <Rm>, [<Rn>] // A4.1.103 STREX{<cond>} <Rd>, <Rm>, [<Rn>]
AsciiSPrint (Buf, Size, "STREX%a %a, %a, [%a]", COND (OpCode), gReg[Rd], gReg[Rn], gReg[Rn]); AsciiSPrint (Buf, Size, "STREX%a %a, %a, [%a]", COND (OpCode), gReg[Rd], gReg[Rn], gReg[Rn]);
} }
return; return;
} }
@ -212,7 +212,6 @@ DisassembleArmInstruction (
// A4.1.98 STM{<cond>}<addressing_mode> <Rn>, <registers>^ // A4.1.98 STM{<cond>}<addressing_mode> <Rn>, <registers>^
AsciiSPrint (Buf, Size, "STM%a%a, %a%a, %a", COND (OpCode), LDM_EXT (Rn ,(OpCode >> 23) & 3), gReg[Rn], WRITE (Write), MRegList (OpCode), USER (WriteBack)); AsciiSPrint (Buf, Size, "STM%a%a, %a%a, %a", COND (OpCode), LDM_EXT (Rn ,(OpCode >> 23) & 3), gReg[Rn], WRITE (Write), MRegList (OpCode), USER (WriteBack));
} }
return; return;
} }
@ -224,7 +223,6 @@ DisassembleArmInstruction (
} else { } else {
Index = AsciiSPrint (Buf, Size, "%a%a%a%a %a, ", Load ? "LDR" : "STR", COND (OpCode), BYTE (WriteBack), (!(Pre) && Write) ? "T":"", gReg[Rd]); Index = AsciiSPrint (Buf, Size, "%a%a%a%a %a, ", Load ? "LDR" : "STR", COND (OpCode), BYTE (WriteBack), (!(Pre) && Write) ? "T":"", gReg[Rd]);
} }
if (Pre) { if (Pre) {
if (!Imm) { if (!Imm) {
// A5.2.2 [<Rn>, #+/-<offset_12>] // A5.2.2 [<Rn>, #+/-<offset_12>]
@ -257,8 +255,7 @@ DisassembleArmInstruction (
AsciiSPrint (&Buf[Index], Size - Index, "[%a, #%a%a, %a, #%d]%a", gReg[Rn], SIGN (Up), gReg[Rm], Type, ShiftImm, WRITE (Write)); AsciiSPrint (&Buf[Index], Size - Index, "[%a, #%a%a, %a, #%d]%a", gReg[Rn], SIGN (Up), gReg[Rm], Type, ShiftImm, WRITE (Write));
} }
} else { } else { // !Pre
// !Pre
if (!Imm) { if (!Imm) {
// A5.2.8 [<Rn>], #+/-<offset_12> // A5.2.8 [<Rn>], #+/-<offset_12>
AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a0x%x", gReg[Rn], SIGN (Up), Offset12); AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a0x%x", gReg[Rn], SIGN (Up), Offset12);
@ -290,7 +287,6 @@ DisassembleArmInstruction (
AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a%a, %a, #%d", gReg[Rn], SIGN (Up), gReg[Rm], Type, ShiftImm); AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a%a, %a, #%d", gReg[Rn], SIGN (Up), gReg[Rm], Type, ShiftImm);
} }
} }
return; return;
} }
@ -341,7 +337,6 @@ DisassembleArmInstruction (
AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a%a", gReg[Rn], SIGN (Up), gReg[Rm]); AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a%a", gReg[Rn], SIGN (Up), gReg[Rm]);
} }
} }
return; return;
} }
@ -376,20 +371,15 @@ DisassembleArmInstruction (
AsciiSPrint (Buf, Size, "CPS #0x%x", (OpCode & 0x2f)); AsciiSPrint (Buf, Size, "CPS #0x%x", (OpCode & 0x2f));
} else { } else {
IMod = (OpCode >> 18) & 0x3; IMod = (OpCode >> 18) & 0x3;
Index = AsciiSPrint ( Index = AsciiSPrint (Buf, Size, "CPS%a %a%a%a",
Buf,
Size,
"CPS%a %a%a%a",
(IMod == 3) ? "ID":"IE", (IMod == 3) ? "ID":"IE",
((OpCode & BIT8) != 0) ? "A":"", ((OpCode & BIT8) != 0) ? "A":"",
((OpCode & BIT7) != 0) ? "I":"", ((OpCode & BIT7) != 0) ? "I":"",
((OpCode & BIT6) != 0) ? "F" : "" ((OpCode & BIT6) != 0) ? "F":"");
);
if ((OpCode & BIT17) != 0) { if ((OpCode & BIT17) != 0) {
AsciiSPrint (&Buf[Index], Size - Index, ", #0x%x", OpCode & 0x1f); AsciiSPrint (&Buf[Index], Size - Index, ", #0x%x", OpCode & 0x1f);
} }
} }
return; return;
} }
@ -405,6 +395,7 @@ DisassembleArmInstruction (
return; return;
} }
if ((OpCode & 0x0db00000) == 0x01200000) { if ((OpCode & 0x0db00000) == 0x01200000) {
// A4.1.38 MSR{<cond>} CPSR_<fields>, #<immediate> MSR{<cond>} CPSR_<fields>, <Rm> // A4.1.38 MSR{<cond>} CPSR_<fields>, #<immediate> MSR{<cond>} CPSR_<fields>, <Rm>
if (Imm) { if (Imm) {
@ -414,7 +405,6 @@ DisassembleArmInstruction (
// MSR{<cond>} CPSR_<fields>, <Rm> // MSR{<cond>} CPSR_<fields>, <Rm>
AsciiSPrint (Buf, Size, "MRS%a %a_%a, %a", COND (OpCode), WriteBack ? "SPSR" : "CPSR", gReg[Rd]); AsciiSPrint (Buf, Size, "MRS%a %a_%a, %a", COND (OpCode), WriteBack ? "SPSR" : "CPSR", gReg[Rd]);
} }
return; return;
} }
@ -444,6 +434,7 @@ DisassembleArmInstruction (
// A5.5.5.2 [<Rn>, #+/-<offset_8>*4 ]! // A5.5.5.2 [<Rn>, #+/-<offset_8>*4 ]!
AsciiSPrint (&Buf[Index], Size - Index, "[%a, #%a0x%x*4]%a", gReg[Rn], SIGN (Up), OpCode & 0xff, WRITE (Write)); AsciiSPrint (&Buf[Index], Size - Index, "[%a, #%a0x%x*4]%a", gReg[Rn], SIGN (Up), OpCode & 0xff, WRITE (Write));
} }
} }
if ((OpCode & 0x0f000010) == 0x0e000010) { if ((OpCode & 0x0f000010) == 0x0e000010) {
@ -463,3 +454,4 @@ DisassembleArmInstruction (
*OpCodePtr += 1; *OpCodePtr += 1;
return; return;
} }

View File

@ -93,6 +93,9 @@ extern CHAR8 *gReg[];
#define THUMB2_MRS 235 #define THUMB2_MRS 235
#define THUMB2_MSR 236 #define THUMB2_MSR 236
typedef struct { typedef struct {
CHAR8 *Start; CHAR8 *Start;
UINT32 OpCode; UINT32 OpCode;
@ -199,6 +202,7 @@ THUMB_INSTRUCTIONS gOpThumb[] = {
{ "UXTH", 0xb280, 0xffc0, DATA_FORMAT5 }, { "UXTH", 0xb280, 0xffc0, DATA_FORMAT5 },
{ "IT", 0xbf00, 0xff00, IT_BLOCK } { "IT", 0xbf00, 0xff00, IT_BLOCK }
}; };
THUMB_INSTRUCTIONS gOpThumb2[] = { THUMB_INSTRUCTIONS gOpThumb2[] = {
@ -277,6 +281,7 @@ THUMB_INSTRUCTIONS gOpThumb2[] = {
{ "MLA", 0xfb000000, 0xfff000f0, THUMB2_4REGS }, // MLA <Rd>, <Rn>, <Rm>, <Ra> { "MLA", 0xfb000000, 0xfff000f0, THUMB2_4REGS }, // MLA <Rd>, <Rn>, <Rm>, <Ra>
{ "MLS", 0xfb000010, 0xfff000f0, THUMB2_4REGS }, // MLA <Rd>, <Rn>, <Rm>, <Ra> { "MLS", 0xfb000010, 0xfff000f0, THUMB2_4REGS }, // MLA <Rd>, <Rn>, <Rm>, <Ra>
{ "SMLABB", 0xfb100000, 0xfff000f0, THUMB2_4REGS }, // SMLABB <Rd>, <Rn>, <Rm>, <Ra> { "SMLABB", 0xfb100000, 0xfff000f0, THUMB2_4REGS }, // SMLABB <Rd>, <Rn>, <Rm>, <Ra>
{ "SMLABT", 0xfb100010, 0xfff000f0, THUMB2_4REGS }, // SMLABT <Rd>, <Rn>, <Rm>, <Ra> { "SMLABT", 0xfb100010, 0xfff000f0, THUMB2_4REGS }, // SMLABT <Rd>, <Rn>, <Rm>, <Ra>
{ "SMLABB", 0xfb100020, 0xfff000f0, THUMB2_4REGS }, // SMLATB <Rd>, <Rn>, <Rm>, <Ra> { "SMLABB", 0xfb100020, 0xfff000f0, THUMB2_4REGS }, // SMLATB <Rd>, <Rn>, <Rm>, <Ra>
@ -293,6 +298,7 @@ THUMB_INSTRUCTIONS gOpThumb2[] = {
{ "SMLAD", 0xfb200000, 0xfff000f0, THUMB2_4REGS }, // SMLAD <Rd>, <Rn>, <Rm>, <Ra> { "SMLAD", 0xfb200000, 0xfff000f0, THUMB2_4REGS }, // SMLAD <Rd>, <Rn>, <Rm>, <Ra>
{ "SMLADX", 0xfb200010, 0xfff000f0, THUMB2_4REGS }, // SMLADX <Rd>, <Rn>, <Rm>, <Ra> { "SMLADX", 0xfb200010, 0xfff000f0, THUMB2_4REGS }, // SMLADX <Rd>, <Rn>, <Rm>, <Ra>
{ "B", 0xf0008000, 0xf800d000, B_T3 }, // B<c> <label> { "B", 0xf0008000, 0xf800d000, B_T3 }, // B<c> <label>
{ "B", 0xf0009000, 0xf800d000, B_T4 }, // B<c> <label> { "B", 0xf0009000, 0xf800d000, B_T4 }, // B<c> <label>
{ "BL", 0xf000d000, 0xf800d000, B_T4 }, // BL<c> <label> { "BL", 0xf000d000, 0xf800d000, B_T4 }, // BL<c> <label>
@ -413,11 +419,9 @@ ThumbMRegList (
} }
} }
} }
if (First) { if (First) {
AsciiStrCatS (mThumbMregListStr, sizeof mThumbMregListStr, "ERROR"); AsciiStrCatS (mThumbMregListStr, sizeof mThumbMregListStr, "ERROR");
} }
AsciiStrCatS (mThumbMregListStr, sizeof mThumbMregListStr, "}"); AsciiStrCatS (mThumbMregListStr, sizeof mThumbMregListStr, "}");
// BugBug: Make caller pass in buffer it is cleaner // BugBug: Make caller pass in buffer it is cleaner
@ -517,7 +521,6 @@ DisassembleThumbInstruction (
*OpCodePtrPtr += 1; *OpCodePtrPtr += 1;
// Manage IT Block ItFlag TRUE means we are in an IT block // Manage IT Block ItFlag TRUE means we are in an IT block
/*if (*ItBlock != 0) { /*if (*ItBlock != 0) {
ItFlag = TRUE; ItFlag = TRUE;
*ItBlock -= 1; *ItBlock -= 1;
@ -532,7 +535,6 @@ DisassembleThumbInstruction (
} else { } else {
Offset = AsciiSPrint (Buf, Size, "%-6a", gOpThumb[Index].Start); Offset = AsciiSPrint (Buf, Size, "%-6a", gOpThumb[Index].Start);
} }
switch (gOpThumb[Index].AddressMode) { switch (gOpThumb[Index].AddressMode) {
case LOAD_STORE_FORMAT1: case LOAD_STORE_FORMAT1:
// A6.5.1 <Rd>, [<Rn>, #<5_bit_offset>] // A6.5.1 <Rd>, [<Rn>, #<5_bit_offset>]
@ -577,6 +579,7 @@ DisassembleThumbInstruction (
AsciiSPrint (&Buf[Offset], Size - Offset, " %a", ThumbMRegList ((OpCode & 0xff) | ((OpCode & BIT8) == BIT8 ? BIT14 : 0))); AsciiSPrint (&Buf[Offset], Size - Offset, " %a", ThumbMRegList ((OpCode & 0xff) | ((OpCode & BIT8) == BIT8 ? BIT14 : 0)));
return; return;
case IMMED_8: case IMMED_8:
// A6.7 <immed_8> // A6.7 <immed_8>
AsciiSPrint (&Buf[Offset], Size - Offset, " 0x%x", OpCode & 0xff); AsciiSPrint (&Buf[Offset], Size - Offset, " 0x%x", OpCode & 0xff);
@ -681,13 +684,13 @@ DisassembleThumbInstruction (
} else if ((OpCode & 0xf) == 0x8) { } else if ((OpCode & 0xf) == 0x8) {
*ItBlock = 1; *ItBlock = 1;
} }
AsciiSPrint (&Buf[Offset], Size - Offset, " %a", gCondition[(OpCode >> 4) & 0xf]); AsciiSPrint (&Buf[Offset], Size - Offset, " %a", gCondition[(OpCode >> 4) & 0xf]);
return; return;
} }
} }
} }
// Thumb2 are 32-bit instructions // Thumb2 are 32-bit instructions
*OpCodePtrPtr += 1; *OpCodePtrPtr += 1;
Rt = (OpCode32 >> 12) & 0xf; Rt = (OpCode32 >> 12) & 0xf;
@ -702,7 +705,6 @@ DisassembleThumbInstruction (
} else { } else {
Offset = AsciiSPrint (Buf, Size, " %-6a", gOpThumb2[Index].Start); Offset = AsciiSPrint (Buf, Size, " %-6a", gOpThumb2[Index].Start);
} }
switch (gOpThumb2[Index].AddressMode) { switch (gOpThumb2[Index].AddressMode) {
case B_T3: case B_T3:
Cond = gCondition[(OpCode32 >> 22) & 0xf]; Cond = gCondition[(OpCode32 >> 22) & 0xf];
@ -765,7 +767,6 @@ DisassembleThumbInstruction (
// U == 0 means subtrack, U == 1 means add // U == 0 means subtrack, U == 1 means add
Target = -Target; Target = -Target;
} }
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a", gReg[(OpCode32 >> 12) & 0xf], PcAlign4 (Pc) + Target); AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a", gReg[(OpCode32 >> 12) & 0xf], PcAlign4 (Pc) + Target);
return; return;
@ -777,7 +778,6 @@ DisassembleThumbInstruction (
} else { } else {
AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL #%d]", (OpCode32 >> 4) & 3); AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL #%d]", (OpCode32 >> 4) & 3);
} }
return; return;
case LDM_REG_IMM12: case LDM_REG_IMM12:
@ -788,7 +788,6 @@ DisassembleThumbInstruction (
} else { } else {
AsciiSPrint (&Buf[Offset], Size - Offset, ", #0x%x]", OpCode32 & 0xfff); AsciiSPrint (&Buf[Offset], Size - Offset, ", #0x%x]", OpCode32 & 0xfff);
} }
return; return;
case LDM_REG_IMM8: case LDM_REG_IMM8:
@ -806,7 +805,6 @@ DisassembleThumbInstruction (
} else { } else {
AsciiSPrint (&Buf[Offset], Size - Offset, "], #%a0x%x", UAdd?"":"-", OpCode32 & 0xff); AsciiSPrint (&Buf[Offset], Size - Offset, "], #%a0x%x", UAdd?"":"-", OpCode32 & 0xff);
} }
return; return;
case LDRD_REG_IMM8_SIGNED: case LDRD_REG_IMM8_SIGNED:
@ -826,7 +824,6 @@ DisassembleThumbInstruction (
AsciiSPrint (&Buf[Offset], Size - Offset, ", #%a0x%x", UAdd?"":"-", (OpCode32 & 0xff) << 2); AsciiSPrint (&Buf[Offset], Size - Offset, ", #%a0x%x", UAdd?"":"-", (OpCode32 & 0xff) << 2);
} }
} }
return; return;
case LDRD_REG_IMM8: case LDRD_REG_IMM8:
@ -836,7 +833,6 @@ DisassembleThumbInstruction (
// U == 0 means subtrack, U == 1 means add // U == 0 means subtrack, U == 1 means add
Target = -Target; Target = -Target;
} }
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, %a", gReg[Rt], gReg[Rt2], Pc + 4 + Target); AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, %a", gReg[Rt], gReg[Rt2], Pc + 4 + Target);
return; return;
@ -867,7 +863,6 @@ DisassembleThumbInstruction (
if ((OpCode32 & BIT20) == BIT20) { if ((OpCode32 & BIT20) == BIT20) {
Buf[Offset - 3] = 'S'; // assume %-6a Buf[Offset - 3] = 'S'; // assume %-6a
} }
Target = (OpCode32 & 0xff) | ((OpCode32 >> 4) & 0x700) | ((OpCode & BIT26) == BIT26 ? BIT11 : 0); Target = (OpCode32 & 0xff) | ((OpCode32 >> 4) & 0x700) | ((OpCode & BIT26) == BIT26 ? BIT11 : 0);
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, #0x%x", gReg[Rd], gReg[Rn], Target); AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, #0x%x", gReg[Rd], gReg[Rn], Target);
return; return;
@ -877,7 +872,6 @@ DisassembleThumbInstruction (
if ((OpCode32 & BIT20) == BIT20) { if ((OpCode32 & BIT20) == BIT20) {
Buf[Offset - 3] = 'S'; // assume %-6a Buf[Offset - 3] = 'S'; // assume %-6a
} }
Target = (OpCode32 & 0xff) | ((OpCode32 >> 4) & 0x700) | ((OpCode & BIT26) == BIT26 ? BIT11 : 0); Target = (OpCode32 & 0xff) | ((OpCode32 >> 4) & 0x700) | ((OpCode & BIT26) == BIT26 ? BIT11 : 0);
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, #0x%x", gReg[Rd], Target); AsciiSPrint (&Buf[Offset], Size - Offset, " %a, #0x%x", gReg[Rd], Target);
return; return;
@ -894,13 +888,11 @@ DisassembleThumbInstruction (
if ((OpCode32 & BIT20) == BIT20) { if ((OpCode32 & BIT20) == BIT20) {
Buf[Offset - 3] = 'S'; // assume %-6a Buf[Offset - 3] = 'S'; // assume %-6a
} }
Target = ((OpCode32 >> 6) & 3) | ((OpCode32 >> 10) & 0x1c0); Target = ((OpCode32 >> 6) & 3) | ((OpCode32 >> 10) & 0x1c0);
Offset += AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, %a", gReg[Rd], gReg[Rn], gReg[Rm]); Offset += AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, %a", gReg[Rd], gReg[Rn], gReg[Rm]);
if (Target != 0) { if (Target != 0) {
AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL %d", gShiftType[(OpCode >> 5) & 3], Target); AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL %d", gShiftType[(OpCode >> 5) & 3], Target);
} }
return; return;
case ADD_IMM5_2REG: case ADD_IMM5_2REG:
@ -911,12 +903,12 @@ DisassembleThumbInstruction (
AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL %d", gShiftType[(OpCode >> 5) & 3], Target); AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL %d", gShiftType[(OpCode >> 5) & 3], Target);
} }
case ASR_IMM5: case ASR_IMM5:
// ARS <Rd>, <Rm> #<const>} imm3:imm2 // ARS <Rd>, <Rm> #<const>} imm3:imm2
if ((OpCode32 & BIT20) == BIT20) { if ((OpCode32 & BIT20) == BIT20) {
Buf[Offset - 3] = 'S'; // assume %-6a Buf[Offset - 3] = 'S'; // assume %-6a
} }
Target = ((OpCode32 >> 6) & 3) | ((OpCode32 >> 10) & 0x1c0); Target = ((OpCode32 >> 6) & 3) | ((OpCode32 >> 10) & 0x1c0);
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a #%d", gReg[Rd], gReg[Rm], Target); AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a #%d", gReg[Rd], gReg[Rm], Target);
return; return;
@ -926,7 +918,6 @@ DisassembleThumbInstruction (
if ((OpCode32 & BIT20) == BIT20) { if ((OpCode32 & BIT20) == BIT20) {
Buf[Offset - 3] = 'S'; // assume %-6a Buf[Offset - 3] = 'S'; // assume %-6a
} }
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a %a", gReg[Rd], gReg[Rn], gReg[Rm]); AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a %a", gReg[Rd], gReg[Rn], gReg[Rm]);
return; return;
@ -938,7 +929,6 @@ DisassembleThumbInstruction (
} else { } else {
Target = PcAlign4 (Pc) + Target; Target = PcAlign4 (Pc) + Target;
} }
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, 0x%08x", gReg[Rd], Target); AsciiSPrint (&Buf[Offset], Size - Offset, " %a, 0x%08x", gReg[Rd], Target);
return; return;
@ -960,7 +950,6 @@ DisassembleThumbInstruction (
} else { } else {
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, #%d, #%d", gReg[Rd], gReg[Rn], LsBit, MsBit + 1); AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, #%d, #%d", gReg[Rd], gReg[Rn], LsBit, MsBit + 1);
} }
return; return;
case CPD_THUMB2: case CPD_THUMB2:
@ -975,7 +964,6 @@ DisassembleThumbInstruction (
if (Opc2 != 0) { if (Opc2 != 0) {
AsciiSPrint (&Buf[Offset], Size - Offset, ",#%d,", Opc2); AsciiSPrint (&Buf[Offset], Size - Offset, ",#%d,", Opc2);
} }
return; return;
case MRC_THUMB2: case MRC_THUMB2:
@ -989,7 +977,6 @@ DisassembleThumbInstruction (
if (Opc2 != 0) { if (Opc2 != 0) {
AsciiSPrint (&Buf[Offset], Size - Offset, ",#%d,", Opc2); AsciiSPrint (&Buf[Offset], Size - Offset, ",#%d,", Opc2);
} }
return; return;
case MRRC_THUMB2: case MRRC_THUMB2:
@ -1032,6 +1019,8 @@ DisassembleThumbInstruction (
AsciiSPrint (Buf, Size, "0x%08x", OpCode32); AsciiSPrint (Buf, Size, "0x%08x", OpCode32);
} }
VOID VOID
DisassembleArmInstruction ( DisassembleArmInstruction (
IN UINT32 **OpCodePtr, IN UINT32 **OpCodePtr,
@ -1040,6 +1029,7 @@ DisassembleArmInstruction (
IN BOOLEAN Extended IN BOOLEAN Extended
); );
/** /**
Place a disassembly of **OpCodePtr into buffer, and update OpCodePtr to Place a disassembly of **OpCodePtr into buffer, and update OpCodePtr to
point to next instruction. point to next instruction.
@ -1071,3 +1061,4 @@ DisassembleInstruction (
DisassembleArmInstruction ((UINT32 **)OpCodePtr, Buf, Size, Extended); DisassembleArmInstruction ((UINT32 **)OpCodePtr, Buf, Size, Extended);
} }
} }

View File

@ -35,7 +35,8 @@ ArchVectorConfig (
if (VectorBaseAddress == 0xFFFF0000) { if (VectorBaseAddress == 0xFFFF0000) {
// set SCTLR.V to enable high vectors // set SCTLR.V to enable high vectors
ArmSetHighVectors(); ArmSetHighVectors();
} else { }
else {
// Set SCTLR.V to 0 to enable VBAR to be used // Set SCTLR.V to 0 to enable VBAR to be used
ArmSetLowVectors(); ArmSetLowVectors();
} }

View File

@ -43,8 +43,7 @@ ExceptionHandlersEnd (
VOID VOID
); );
RETURN_STATUS RETURN_STATUS ArchVectorConfig(
ArchVectorConfig (
IN UINTN VectorBaseAddress IN UINTN VectorBaseAddress
); );
@ -67,6 +66,7 @@ STATIC CONST BOOLEAN gArmRelocateVectorTable = TRUE;
STATIC CONST BOOLEAN gArmRelocateVectorTable = FALSE; STATIC CONST BOOLEAN gArmRelocateVectorTable = FALSE;
#endif #endif
/** /**
Initializes all CPU exceptions entries and provides the default exception handlers. Initializes all CPU exceptions entries and provides the default exception handlers.
@ -96,10 +96,12 @@ InitializeCpuExceptionHandlers (
// if we are requested to copy exception handlers to another location // if we are requested to copy exception handlers to another location
if (gArmRelocateVectorTable) { if (gArmRelocateVectorTable) {
VectorBase = PcdGet64(PcdCpuVectorBaseAddress); VectorBase = PcdGet64(PcdCpuVectorBaseAddress);
Status = CopyExceptionHandlers(VectorBase); Status = CopyExceptionHandlers(VectorBase);
} else {
// use VBAR to point to where our exception handlers are }
else { // use VBAR to point to where our exception handlers are
// The vector table must be aligned for the architecture. If this // The vector table must be aligned for the architecture. If this
// assertion fails ensure the appropriate FFS alignment is in effect, // assertion fails ensure the appropriate FFS alignment is in effect,
@ -178,11 +180,12 @@ CopyExceptionHandlers (
// //
for (Index = 0; Index <= gMaxExceptionNumber; Index++) { for (Index = 0; Index <= gMaxExceptionNumber; Index++) {
if (!FeaturePcdGet(PcdDebuggerExceptionSupport) || if (!FeaturePcdGet(PcdDebuggerExceptionSupport) ||
(gDebuggerExceptionHandlers[Index] == 0) || (gDebuggerExceptionHandlers[Index] == (VOID *)gDebuggerNoHandlerValue)) (gDebuggerExceptionHandlers[Index] == 0) || (gDebuggerExceptionHandlers[Index] == (VOID *)gDebuggerNoHandlerValue)) {
{
Status = RegisterExceptionHandler(Index, NULL); Status = RegisterExceptionHandler(Index, NULL);
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR(Status);
} else { }
else {
// If the debugger has already hooked put its vector back // If the debugger has already hooked put its vector back
VectorBase[Index] = (UINT32)(UINTN)gDebuggerExceptionHandlers[Index]; VectorBase[Index] = (UINT32)(UINTN)gDebuggerExceptionHandlers[Index];
} }
@ -194,6 +197,7 @@ CopyExceptionHandlers (
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
/** /**
Initializes all CPU interrupt/exceptions entries and provides the default interrupt/exception handlers. Initializes all CPU interrupt/exceptions entries and provides the default interrupt/exception handlers.
@ -303,8 +307,9 @@ CommonCExceptionHandler (
gExceptionHandlers[ExceptionType](ExceptionType, SystemContext); gExceptionHandlers[ExceptionType](ExceptionType, SystemContext);
return; return;
} }
} else { }
DEBUG ((DEBUG_ERROR, "Unknown exception type %d\n", ExceptionType)); else {
DEBUG((EFI_D_ERROR, "Unknown exception type %d\n", ExceptionType));
ASSERT(FALSE); ASSERT(FALSE);
} }
@ -342,3 +347,4 @@ InitializeCpuExceptionHandlersEx (
{ {
return InitializeCpuExceptionHandlers (VectorInfo); return InitializeCpuExceptionHandlers (VectorInfo);
} }

View File

@ -71,6 +71,7 @@ ArmGenericTimerGetTimerVal (
return ArmReadCntpTval (); return ArmReadCntpTval ();
} }
VOID VOID
EFIAPI EFIAPI
ArmGenericTimerSetTimerVal ( ArmGenericTimerSetTimerVal (

View File

@ -71,6 +71,7 @@ ArmGenericTimerGetTimerVal (
return ArmReadCntvTval (); return ArmReadCntvTval ();
} }
VOID VOID
EFIAPI EFIAPI
ArmGenericTimerSetTimerVal ( ArmGenericTimerSetTimerVal (

View File

@ -38,7 +38,6 @@ ArmGicArchLibInitialize (
ArmGicV3SetControlSystemRegisterEnable (IccSre | ICC_SRE_EL2_SRE); ArmGicV3SetControlSystemRegisterEnable (IccSre | ICC_SRE_EL2_SRE);
IccSre = ArmGicV3GetControlSystemRegisterEnable (); IccSre = ArmGicV3GetControlSystemRegisterEnable ();
} }
if (IccSre & ICC_SRE_EL2_SRE) { if (IccSre & ICC_SRE_EL2_SRE) {
mGicArchRevision = ARM_GIC_ARCH_REVISION_3; mGicArchRevision = ARM_GIC_ARCH_REVISION_3;
goto Done; goto Done;

View File

@ -36,7 +36,6 @@ ArmGicGetSupportedArchRevision (
ArmGicV3SetControlSystemRegisterEnable (IccSre | ICC_SRE_EL2_SRE); ArmGicV3SetControlSystemRegisterEnable (IccSre | ICC_SRE_EL2_SRE);
IccSre = ArmGicV3GetControlSystemRegisterEnable (); IccSre = ArmGicV3GetControlSystemRegisterEnable ();
} }
if (IccSre & ICC_SRE_EL2_SRE) { if (IccSre & ICC_SRE_EL2_SRE) {
return ARM_GIC_ARCH_REVISION_3; return ARM_GIC_ARCH_REVISION_3;
} }

View File

@ -11,9 +11,7 @@
#ifndef AARCH64_LIB_H_ #ifndef AARCH64_LIB_H_
#define AARCH64_LIB_H_ #define AARCH64_LIB_H_
typedef VOID (*AARCH64_CACHE_OPERATION)( typedef VOID (*AARCH64_CACHE_OPERATION)(UINTN);
UINTN
);
VOID VOID
AArch64AllDataCachesOperation ( AArch64AllDataCachesOperation (
@ -55,3 +53,4 @@ ArmReadIdAA64Mmfr2 (
); );
#endif // AARCH64_LIB_H_ #endif // AARCH64_LIB_H_

View File

@ -23,9 +23,7 @@
#define ID_MMFR0_SHR_IMP_HW_COHERENT 1 #define ID_MMFR0_SHR_IMP_HW_COHERENT 1
#define ID_MMFR0_SHR_IGNORED 0xf #define ID_MMFR0_SHR_IGNORED 0xf
typedef VOID (*ARM_V7_CACHE_OPERATION)( typedef VOID (*ARM_V7_CACHE_OPERATION)(UINT32);
UINT32
);
VOID VOID
ArmV7AllDataCachesOperation ( ArmV7AllDataCachesOperation (
@ -67,3 +65,4 @@ ArmReadIdPfr1 (
); );
#endif // ARM_V7_LIB_H_ #endif // ARM_V7_LIB_H_

View File

@ -47,13 +47,12 @@ ArmMemoryAttributeToPageAttribute (
ASSERT (0); ASSERT (0);
case ARM_MEMORY_REGION_ATTRIBUTE_DEVICE: case ARM_MEMORY_REGION_ATTRIBUTE_DEVICE:
case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE: case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE:
if (ArmReadCurrentEL () == AARCH64_EL2) { if (ArmReadCurrentEL () == AARCH64_EL2)
return TT_ATTR_INDX_DEVICE_MEMORY | TT_XN_MASK; return TT_ATTR_INDX_DEVICE_MEMORY | TT_XN_MASK;
} else { else
return TT_ATTR_INDX_DEVICE_MEMORY | TT_UXN_MASK | TT_PXN_MASK; return TT_ATTR_INDX_DEVICE_MEMORY | TT_UXN_MASK | TT_PXN_MASK;
} }
} }
}
#define MIN_T0SZ 16 #define MIN_T0SZ 16
#define BITS_PER_LEVEL 9 #define BITS_PER_LEVEL 9
@ -108,15 +107,12 @@ FreePageTablesRecursive (
if (Level < 3) { if (Level < 3) {
for (Index = 0; Index < TT_ENTRY_COUNT; Index++) { for (Index = 0; Index < TT_ENTRY_COUNT; Index++) {
if ((TranslationTable[Index] & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY) { if ((TranslationTable[Index] & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY) {
FreePageTablesRecursive ( FreePageTablesRecursive ((VOID *)(UINTN)(TranslationTable[Index] &
(VOID *)(UINTN)(TranslationTable[Index] &
TT_ADDRESS_MASK_BLOCK_ENTRY), TT_ADDRESS_MASK_BLOCK_ENTRY),
Level + 1 Level + 1);
);
} }
} }
} }
FreePages (TranslationTable, 1); FreePages (TranslationTable, 1);
} }
@ -130,7 +126,6 @@ IsBlockEntry (
if (Level == 3) { if (Level == 3) {
return (Entry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY_LEVEL3; return (Entry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY_LEVEL3;
} }
return (Entry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY; return (Entry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY;
} }
@ -148,7 +143,6 @@ IsTableEntry (
// //
return FALSE; return FALSE;
} }
return (Entry & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY; return (Entry & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY;
} }
@ -176,16 +170,8 @@ UpdateRegionMappingRecursive (
BlockShift = (Level + 1) * BITS_PER_LEVEL + MIN_T0SZ; BlockShift = (Level + 1) * BITS_PER_LEVEL + MIN_T0SZ;
BlockMask = MAX_UINT64 >> BlockShift; BlockMask = MAX_UINT64 >> BlockShift;
DEBUG (( DEBUG ((DEBUG_VERBOSE, "%a(%d): %llx - %llx set %lx clr %lx\n", __FUNCTION__,
DEBUG_VERBOSE, Level, RegionStart, RegionEnd, AttributeSetMask, AttributeClearMask));
"%a(%d): %llx - %llx set %lx clr %lx\n",
__FUNCTION__,
Level,
RegionStart,
RegionEnd,
AttributeSetMask,
AttributeClearMask
));
for (; RegionStart < RegionEnd; RegionStart = BlockEnd) { for (; RegionStart < RegionEnd; RegionStart = BlockEnd) {
BlockEnd = MIN (RegionEnd, (RegionStart | BlockMask) + 1); BlockEnd = MIN (RegionEnd, (RegionStart | BlockMask) + 1);
@ -201,9 +187,8 @@ UpdateRegionMappingRecursive (
// we cannot replace it with a block entry without potentially losing // we cannot replace it with a block entry without potentially losing
// attribute information, so keep the table entry in that case. // attribute information, so keep the table entry in that case.
// //
if ((Level == 0) || (((RegionStart | BlockEnd) & BlockMask) != 0) || if (Level == 0 || ((RegionStart | BlockEnd) & BlockMask) != 0 ||
(IsTableEntry (*Entry, Level) && (AttributeClearMask != 0))) (IsTableEntry (*Entry, Level) && AttributeClearMask != 0)) {
{
ASSERT (Level < 3); ASSERT (Level < 3);
if (!IsTableEntry (*Entry, Level)) { if (!IsTableEntry (*Entry, Level)) {
@ -231,14 +216,9 @@ UpdateRegionMappingRecursive (
// We are splitting an existing block entry, so we have to populate // We are splitting an existing block entry, so we have to populate
// the new table with the attributes of the block entry it replaces. // the new table with the attributes of the block entry it replaces.
// //
Status = UpdateRegionMappingRecursive ( Status = UpdateRegionMappingRecursive (RegionStart & ~BlockMask,
RegionStart & ~BlockMask, (RegionStart | BlockMask) + 1, *Entry & TT_ATTRIBUTES_MASK,
(RegionStart | BlockMask) + 1, 0, TranslationTable, Level + 1);
*Entry & TT_ATTRIBUTES_MASK,
0,
TranslationTable,
Level + 1
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
// //
// The range we passed to UpdateRegionMappingRecursive () is block // The range we passed to UpdateRegionMappingRecursive () is block
@ -256,14 +236,9 @@ UpdateRegionMappingRecursive (
// //
// Recurse to the next level // Recurse to the next level
// //
Status = UpdateRegionMappingRecursive ( Status = UpdateRegionMappingRecursive (RegionStart, BlockEnd,
RegionStart, AttributeSetMask, AttributeClearMask, TranslationTable,
BlockEnd, Level + 1);
AttributeSetMask,
AttributeClearMask,
TranslationTable,
Level + 1
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
if (!IsTableEntry (*Entry, Level)) { if (!IsTableEntry (*Entry, Level)) {
// //
@ -275,18 +250,13 @@ UpdateRegionMappingRecursive (
// //
FreePageTablesRecursive (TranslationTable, Level + 1); FreePageTablesRecursive (TranslationTable, Level + 1);
} }
return Status; return Status;
} }
if (!IsTableEntry (*Entry, Level)) { if (!IsTableEntry (*Entry, Level)) {
EntryValue = (UINTN)TranslationTable | TT_TYPE_TABLE_ENTRY; EntryValue = (UINTN)TranslationTable | TT_TYPE_TABLE_ENTRY;
ReplaceTableEntry ( ReplaceTableEntry (Entry, EntryValue, RegionStart,
Entry, IsBlockEntry (*Entry, Level));
EntryValue,
RegionStart,
IsBlockEntry (*Entry, Level)
);
} }
} else { } else {
EntryValue = (*Entry & AttributeClearMask) | AttributeSetMask; EntryValue = (*Entry & AttributeClearMask) | AttributeSetMask;
@ -310,7 +280,6 @@ UpdateRegionMappingRecursive (
} }
} }
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -331,14 +300,9 @@ UpdateRegionMapping (
T0SZ = ArmGetTCR () & TCR_T0SZ_MASK; T0SZ = ArmGetTCR () & TCR_T0SZ_MASK;
return UpdateRegionMappingRecursive ( return UpdateRegionMappingRecursive (RegionStart, RegionStart + RegionLength,
RegionStart, AttributeSetMask, AttributeClearMask, ArmGetTTBR0BaseAddress (),
RegionStart + RegionLength, GetRootTableLevel (T0SZ));
AttributeSetMask,
AttributeClearMask,
ArmGetTTBR0BaseAddress (),
GetRootTableLevel (T0SZ)
);
} }
STATIC STATIC
@ -382,9 +346,8 @@ GcdAttributeToPageAttribute (
break; break;
} }
if (((GcdAttributes & EFI_MEMORY_XP) != 0) || if ((GcdAttributes & EFI_MEMORY_XP) != 0 ||
((GcdAttributes & EFI_MEMORY_CACHETYPE_MASK) == EFI_MEMORY_UC)) (GcdAttributes & EFI_MEMORY_CACHETYPE_MASK) == EFI_MEMORY_UC) {
{
if (ArmReadCurrentEL () == AARCH64_EL2) { if (ArmReadCurrentEL () == AARCH64_EL2) {
PageAttributes |= TT_XN_MASK; PageAttributes |= TT_XN_MASK;
} else { } else {
@ -393,7 +356,7 @@ GcdAttributeToPageAttribute (
} }
if ((GcdAttributes & EFI_MEMORY_RO) != 0) { if ((GcdAttributes & EFI_MEMORY_RO) != 0) {
PageAttributes |= TT_AP_NO_RO; PageAttributes |= TT_AP_RO_RO;
} }
return PageAttributes | TT_AF; return PageAttributes | TT_AF;
@ -422,12 +385,8 @@ ArmSetMemoryAttributes (
TT_PXN_MASK | TT_XN_MASK); TT_PXN_MASK | TT_XN_MASK);
} }
return UpdateRegionMapping ( return UpdateRegionMapping (BaseAddress, Length, PageAttributes,
BaseAddress, PageAttributeMask);
Length,
PageAttributes,
PageAttributeMask
);
} }
STATIC STATIC
@ -460,8 +419,7 @@ ArmSetMemoryRegionNoExec (
BaseAddress, BaseAddress,
Length, Length,
Val, Val,
~TT_ADDRESS_MASK_BLOCK_ENTRY ~TT_ADDRESS_MASK_BLOCK_ENTRY);
);
} }
EFI_STATUS EFI_STATUS
@ -479,8 +437,7 @@ ArmClearMemoryRegionNoExec (
BaseAddress, BaseAddress,
Length, Length,
0, 0,
Mask Mask);
);
} }
EFI_STATUS EFI_STATUS
@ -492,9 +449,8 @@ ArmSetMemoryRegionReadOnly (
return SetMemoryRegionAttribute ( return SetMemoryRegionAttribute (
BaseAddress, BaseAddress,
Length, Length,
TT_AP_NO_RO, TT_AP_RO_RO,
~TT_ADDRESS_MASK_BLOCK_ENTRY ~TT_ADDRESS_MASK_BLOCK_ENTRY);
);
} }
EFI_STATUS EFI_STATUS
@ -506,9 +462,8 @@ ArmClearMemoryRegionReadOnly (
return SetMemoryRegionAttribute ( return SetMemoryRegionAttribute (
BaseAddress, BaseAddress,
Length, Length,
TT_AP_NO_RW, TT_AP_RW_RW,
~(TT_ADDRESS_MASK_BLOCK_ENTRY | TT_AP_MASK) ~(TT_ADDRESS_MASK_BLOCK_ENTRY | TT_AP_MASK));
);
} }
EFI_STATUS EFI_STATUS
@ -568,11 +523,9 @@ ArmConfigureMmu (
} else if (MaxAddress < SIZE_256TB) { } else if (MaxAddress < SIZE_256TB) {
TCR |= TCR_PS_256TB; TCR |= TCR_PS_256TB;
} else { } else {
DEBUG (( DEBUG ((DEBUG_ERROR,
DEBUG_ERROR,
"ArmConfigureMmu: The MaxAddress 0x%lX is not supported by this MMU configuration.\n", "ArmConfigureMmu: The MaxAddress 0x%lX is not supported by this MMU configuration.\n",
MaxAddress MaxAddress));
));
ASSERT (0); // Bigger than 48-bit memory space are not supported ASSERT (0); // Bigger than 48-bit memory space are not supported
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
@ -594,11 +547,9 @@ ArmConfigureMmu (
} else if (MaxAddress < SIZE_256TB) { } else if (MaxAddress < SIZE_256TB) {
TCR |= TCR_IPS_256TB; TCR |= TCR_IPS_256TB;
} else { } else {
DEBUG (( DEBUG ((DEBUG_ERROR,
DEBUG_ERROR,
"ArmConfigureMmu: The MaxAddress 0x%lX is not supported by this MMU configuration.\n", "ArmConfigureMmu: The MaxAddress 0x%lX is not supported by this MMU configuration.\n",
MaxAddress MaxAddress));
));
ASSERT (0); // Bigger than 48-bit memory space are not supported ASSERT (0); // Bigger than 48-bit memory space are not supported
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
@ -628,7 +579,6 @@ ArmConfigureMmu (
if (TranslationTable == NULL) { if (TranslationTable == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
// //
// We set TTBR0 just after allocating the table to retrieve its location from // We set TTBR0 just after allocating the table to retrieve its location from
// the subsequent functions without needing to pass this value across the // the subsequent functions without needing to pass this value across the
@ -649,10 +599,8 @@ ArmConfigureMmu (
// Make sure we are not inadvertently hitting in the caches // Make sure we are not inadvertently hitting in the caches
// when populating the page tables. // when populating the page tables.
// //
InvalidateDataCacheRange ( InvalidateDataCacheRange (TranslationTable,
TranslationTable, RootTableEntryCount * sizeof (UINT64));
RootTableEntryCount * sizeof (UINT64)
);
ZeroMem (TranslationTable, RootTableEntryCount * sizeof (UINT64)); ZeroMem (TranslationTable, RootTableEntryCount * sizeof (UINT64));
while (MemoryTable->Length != 0) { while (MemoryTable->Length != 0) {
@ -660,7 +608,6 @@ ArmConfigureMmu (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto FreeTranslationTable; goto FreeTranslationTable;
} }
MemoryTable++; MemoryTable++;
} }
@ -702,10 +649,8 @@ ArmMmuBaseLibConstructor (
// The ArmReplaceLiveTranslationEntry () helper function may be invoked // The ArmReplaceLiveTranslationEntry () helper function may be invoked
// with the MMU off so we have to ensure that it gets cleaned to the PoC // with the MMU off so we have to ensure that it gets cleaned to the PoC
// //
WriteBackDataCacheRange ( WriteBackDataCacheRange ((VOID *)(UINTN)ArmReplaceLiveTranslationEntry,
(VOID *)(UINTN)ArmReplaceLiveTranslationEntry, ArmReplaceLiveTranslationEntrySize);
ArmReplaceLiveTranslationEntrySize
);
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }

View File

@ -37,21 +37,18 @@ ArmMmuPeiLibConstructor (
// is executing from DRAM, we only need to perform the cache maintenance // is executing from DRAM, we only need to perform the cache maintenance
// when not executing in place. // when not executing in place.
// //
if (((UINTN)FileInfo.Buffer <= (UINTN)ArmReplaceLiveTranslationEntry) && if ((UINTN)FileInfo.Buffer <= (UINTN)ArmReplaceLiveTranslationEntry &&
((UINTN)FileInfo.Buffer + FileInfo.BufferSize >= ((UINTN)FileInfo.Buffer + FileInfo.BufferSize >=
(UINTN)ArmReplaceLiveTranslationEntry + ArmReplaceLiveTranslationEntrySize)) (UINTN)ArmReplaceLiveTranslationEntry + ArmReplaceLiveTranslationEntrySize)) {
{ DEBUG ((EFI_D_INFO, "ArmMmuLib: skipping cache maintenance on XIP PEIM\n"));
DEBUG ((DEBUG_INFO, "ArmMmuLib: skipping cache maintenance on XIP PEIM\n"));
} else { } else {
DEBUG ((DEBUG_INFO, "ArmMmuLib: performing cache maintenance on shadowed PEIM\n")); DEBUG ((EFI_D_INFO, "ArmMmuLib: performing cache maintenance on shadowed PEIM\n"));
// //
// The ArmReplaceLiveTranslationEntry () helper function may be invoked // The ArmReplaceLiveTranslationEntry () helper function may be invoked
// with the MMU off so we have to ensure that it gets cleaned to the PoC // with the MMU off so we have to ensure that it gets cleaned to the PoC
// //
WriteBackDataCacheRange ( WriteBackDataCacheRange ((VOID *)(UINTN)ArmReplaceLiveTranslationEntry,
(VOID *)(UINTN)ArmReplaceLiveTranslationEntry, ArmReplaceLiveTranslationEntrySize);
ArmReplaceLiveTranslationEntrySize
);
} }
return RETURN_SUCCESS; return RETURN_SUCCESS;

View File

@ -76,7 +76,6 @@ PreferNonshareableMemory (
ASSERT (FALSE); ASSERT (FALSE);
return FALSE; return FALSE;
} }
return Val != ID_MMFR0_SHR_IMP_HW_COHERENT; return Val != ID_MMFR0_SHR_IMP_HW_COHERENT;
} }
@ -141,8 +140,7 @@ PopulateLevel2PageTable (
// Allocate a Level2 Page Table for this Section // Allocate a Level2 Page Table for this Section
TranslationTable = (UINTN)AllocateAlignedPages ( TranslationTable = (UINTN)AllocateAlignedPages (
EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_PAGE_SIZE), EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_PAGE_SIZE),
TRANSLATION_TABLE_PAGE_ALIGNMENT TRANSLATION_TABLE_PAGE_ALIGNMENT);
);
// Translate the Section Descriptor into Page Descriptor // Translate the Section Descriptor into Page Descriptor
SectionDescriptor = TT_DESCRIPTOR_PAGE_TYPE_PAGE | ConvertSectionAttributesToPageAttributes (*SectionEntry, FALSE); SectionDescriptor = TT_DESCRIPTOR_PAGE_TYPE_PAGE | ConvertSectionAttributesToPageAttributes (*SectionEntry, FALSE);
@ -153,10 +151,8 @@ PopulateLevel2PageTable (
// Make sure we are not inadvertently hitting in the caches // Make sure we are not inadvertently hitting in the caches
// when populating the page tables // when populating the page tables
// //
InvalidateDataCacheRange ( InvalidateDataCacheRange ((VOID *)TranslationTable,
(VOID *)TranslationTable, TRANSLATION_TABLE_PAGE_SIZE);
TRANSLATION_TABLE_PAGE_SIZE
);
// Populate the new Level2 Page Table for the section // Populate the new Level2 Page Table for the section
PageEntry = (UINT32*)TranslationTable; PageEntry = (UINT32*)TranslationTable;
@ -176,16 +172,13 @@ PopulateLevel2PageTable (
} else { } else {
TranslationTable = (UINTN)AllocateAlignedPages ( TranslationTable = (UINTN)AllocateAlignedPages (
EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_PAGE_SIZE), EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_PAGE_SIZE),
TRANSLATION_TABLE_PAGE_ALIGNMENT TRANSLATION_TABLE_PAGE_ALIGNMENT);
);
// //
// Make sure we are not inadvertently hitting in the caches // Make sure we are not inadvertently hitting in the caches
// when populating the page tables // when populating the page tables
// //
InvalidateDataCacheRange ( InvalidateDataCacheRange ((VOID *)TranslationTable,
(VOID *)TranslationTable, TRANSLATION_TABLE_PAGE_SIZE);
TRANSLATION_TABLE_PAGE_SIZE
);
ZeroMem ((VOID *)TranslationTable, TRANSLATION_TABLE_PAGE_SIZE); ZeroMem ((VOID *)TranslationTable, TRANSLATION_TABLE_PAGE_SIZE);
*SectionEntry = (TranslationTable & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK) | *SectionEntry = (TranslationTable & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK) |
@ -209,10 +202,8 @@ PopulateLevel2PageTable (
// [speculatively] since the previous invalidate are evicted again. // [speculatively] since the previous invalidate are evicted again.
// //
ArmDataMemoryBarrier (); ArmDataMemoryBarrier ();
InvalidateDataCacheRange ( InvalidateDataCacheRange ((UINT32 *)TranslationTable + FirstPageOffset,
(UINT32 *)TranslationTable + FirstPageOffset, RemainLength / TT_DESCRIPTOR_PAGE_SIZE * sizeof (*PageEntry));
RemainLength / TT_DESCRIPTOR_PAGE_SIZE * sizeof (*PageEntry)
);
} }
STATIC STATIC
@ -283,9 +274,8 @@ FillTranslationTable (
SectionEntry = TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS(TranslationTable, MemoryRegion->VirtualBase); SectionEntry = TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS(TranslationTable, MemoryRegion->VirtualBase);
while (RemainLength != 0) { while (RemainLength != 0) {
if ((PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE == 0) && if (PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE == 0 &&
(RemainLength >= TT_DESCRIPTOR_SECTION_SIZE)) RemainLength >= TT_DESCRIPTOR_SECTION_SIZE) {
{
// Case: Physical address aligned on the Section Size (1MB) && the length // Case: Physical address aligned on the Section Size (1MB) && the length
// is greater than the Section Size // is greater than the Section Size
*SectionEntry = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(PhysicalBase) | Attributes; *SectionEntry = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(PhysicalBase) | Attributes;
@ -301,21 +291,14 @@ FillTranslationTable (
PhysicalBase += TT_DESCRIPTOR_SECTION_SIZE; PhysicalBase += TT_DESCRIPTOR_SECTION_SIZE;
RemainLength -= TT_DESCRIPTOR_SECTION_SIZE; RemainLength -= TT_DESCRIPTOR_SECTION_SIZE;
} else { } else {
PageMapLength = MIN ( PageMapLength = MIN ((UINT32)RemainLength, TT_DESCRIPTOR_SECTION_SIZE -
(UINT32)RemainLength, (PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE));
TT_DESCRIPTOR_SECTION_SIZE -
(PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE)
);
// Case: Physical address aligned on the Section Size (1MB) && the length // Case: Physical address aligned on the Section Size (1MB) && the length
// does not fill a section // does not fill a section
// Case: Physical address NOT aligned on the Section Size (1MB) // Case: Physical address NOT aligned on the Section Size (1MB)
PopulateLevel2PageTable ( PopulateLevel2PageTable (SectionEntry, PhysicalBase, PageMapLength,
SectionEntry, MemoryRegion->Attributes);
PhysicalBase,
PageMapLength,
MemoryRegion->Attributes
);
// //
// Issue a DMB to ensure that the page table entry update made it to // Issue a DMB to ensure that the page table entry update made it to
@ -349,8 +332,7 @@ ArmConfigureMmu (
TranslationTable = AllocateAlignedPages ( TranslationTable = AllocateAlignedPages (
EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_SECTION_SIZE), EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_SECTION_SIZE),
TRANSLATION_TABLE_SECTION_ALIGNMENT TRANSLATION_TABLE_SECTION_ALIGNMENT);
);
if (TranslationTable == NULL) { if (TranslationTable == NULL) {
return RETURN_OUT_OF_RESOURCES; return RETURN_OUT_OF_RESOURCES;
} }
@ -407,8 +389,7 @@ ArmConfigureMmu (
// //
ArmSetTTBCR (0); ArmSetTTBCR (0);
ArmSetDomainAccessControl ( ArmSetDomainAccessControl (DOMAIN_ACCESS_CONTROL_NONE(15) |
DOMAIN_ACCESS_CONTROL_NONE (15) |
DOMAIN_ACCESS_CONTROL_NONE(14) | DOMAIN_ACCESS_CONTROL_NONE(14) |
DOMAIN_ACCESS_CONTROL_NONE(13) | DOMAIN_ACCESS_CONTROL_NONE(13) |
DOMAIN_ACCESS_CONTROL_NONE(12) | DOMAIN_ACCESS_CONTROL_NONE(12) |
@ -423,8 +404,7 @@ ArmConfigureMmu (
DOMAIN_ACCESS_CONTROL_NONE( 3) | DOMAIN_ACCESS_CONTROL_NONE( 3) |
DOMAIN_ACCESS_CONTROL_NONE( 2) | DOMAIN_ACCESS_CONTROL_NONE( 2) |
DOMAIN_ACCESS_CONTROL_NONE( 1) | DOMAIN_ACCESS_CONTROL_NONE( 1) |
DOMAIN_ACCESS_CONTROL_CLIENT (0) DOMAIN_ACCESS_CONTROL_CLIENT(0));
);
ArmEnableInstructionCache(); ArmEnableInstructionCache();
ArmEnableDataCache(); ArmEnableDataCache();

View File

@ -206,6 +206,7 @@ UpdatePageEntries (
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
Offset += TT_DESCRIPTOR_PAGE_SIZE; Offset += TT_DESCRIPTOR_PAGE_SIZE;
} // End first level translation table loop } // End first level translation table loop
return Status; return Status;
@ -302,8 +303,7 @@ UpdateSectionEntries (
(FirstLevelIdx + i) << TT_DESCRIPTOR_SECTION_BASE_SHIFT, (FirstLevelIdx + i) << TT_DESCRIPTOR_SECTION_BASE_SHIFT,
TT_DESCRIPTOR_SECTION_SIZE, TT_DESCRIPTOR_SECTION_SIZE,
Attributes, Attributes,
NULL NULL);
);
} else { } else {
// still a section entry // still a section entry
@ -355,22 +355,19 @@ ArmSetMemoryAttributes (
FlushTlbs = FALSE; FlushTlbs = FALSE;
while (Length > 0) { while (Length > 0) {
if ((BaseAddress % TT_DESCRIPTOR_SECTION_SIZE == 0) && if ((BaseAddress % TT_DESCRIPTOR_SECTION_SIZE == 0) &&
(Length >= TT_DESCRIPTOR_SECTION_SIZE)) Length >= TT_DESCRIPTOR_SECTION_SIZE) {
{
ChunkLength = Length - Length % TT_DESCRIPTOR_SECTION_SIZE; ChunkLength = Length - Length % TT_DESCRIPTOR_SECTION_SIZE;
DEBUG (( DEBUG ((DEBUG_PAGE,
DEBUG_PAGE,
"SetMemoryAttributes(): MMU section 0x%lx length 0x%lx to %lx\n", "SetMemoryAttributes(): MMU section 0x%lx length 0x%lx to %lx\n",
BaseAddress, BaseAddress, ChunkLength, Attributes));
ChunkLength,
Attributes
));
Status = UpdateSectionEntries (BaseAddress, ChunkLength, Attributes); Status = UpdateSectionEntries (BaseAddress, ChunkLength, Attributes);
FlushTlbs = TRUE; FlushTlbs = TRUE;
} else { } else {
// //
// Process page by page until the next section boundary, but only if // Process page by page until the next section boundary, but only if
// we have more than a section's worth of area to deal with after that. // we have more than a section's worth of area to deal with after that.
@ -381,20 +378,12 @@ ArmSetMemoryAttributes (
ChunkLength = Length; ChunkLength = Length;
} }
DEBUG (( DEBUG ((DEBUG_PAGE,
DEBUG_PAGE,
"SetMemoryAttributes(): MMU page 0x%lx length 0x%lx to %lx\n", "SetMemoryAttributes(): MMU page 0x%lx length 0x%lx to %lx\n",
BaseAddress, BaseAddress, ChunkLength, Attributes));
ChunkLength,
Attributes
));
Status = UpdatePageEntries ( Status = UpdatePageEntries (BaseAddress, ChunkLength, Attributes,
BaseAddress, &FlushTlbs);
ChunkLength,
Attributes,
&FlushTlbs
);
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
@ -408,7 +397,6 @@ ArmSetMemoryAttributes (
if (FlushTlbs) { if (FlushTlbs) {
ArmInvalidateTlb (); ArmInvalidateTlb ();
} }
return Status; return Status;
} }

View File

@ -65,7 +65,7 @@ LibResetSystem (
ArmCallSmc (&ArmSmcArgs); ArmCallSmc (&ArmSmcArgs);
// We should never be here // We should never be here
DEBUG ((DEBUG_ERROR, "%a: PSCI Reset failed\n", __FUNCTION__)); DEBUG ((EFI_D_ERROR, "%a: PSCI Reset failed\n", __FUNCTION__));
CpuDeadLoop (); CpuDeadLoop ();
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }

View File

@ -1,129 +0,0 @@
/** @file
SMC helper functions.
Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <Library/ArmSmcLib.h>
#include <Library/BaseMemoryLib.h>
/** Triggers an SMC call with 3 arguments.
@param Function The SMC function.
@param Arg1 Argument/result.
@param Arg2 Argument/result.
@param Arg3 Argument/result.
@return The SMC error code.
**/
UINTN
ArmCallSmc3 (
IN UINTN Function,
IN OUT UINTN *Arg1 OPTIONAL,
IN OUT UINTN *Arg2 OPTIONAL,
IN OUT UINTN *Arg3 OPTIONAL
)
{
ARM_SMC_ARGS Args;
UINTN ErrorCode;
ZeroMem (&Args, sizeof (ARM_SMC_ARGS));
Args.Arg0 = Function;
if (Arg1 != NULL) {
Args.Arg1 = *Arg1;
}
if (Arg2 != NULL) {
Args.Arg2 = *Arg2;
}
if (Arg3 != NULL) {
Args.Arg3 = *Arg3;
}
ArmCallSmc (&Args);
ErrorCode = Args.Arg0;
if (Arg1 != NULL) {
*Arg1 = Args.Arg1;
}
if (Arg2 != NULL) {
*Arg2 = Args.Arg2;
}
if (Arg3 != NULL) {
*Arg3 = Args.Arg3;
}
return ErrorCode;
}
/** Trigger an SMC call with 2 arguments.
@param Function The SMC function.
@param Arg1 Argument/result.
@param Arg2 Argument/result.
@param Arg3 Result.
@return The SMC error code.
**/
UINTN
ArmCallSmc2 (
IN UINTN Function,
IN OUT UINTN *Arg1 OPTIONAL,
IN OUT UINTN *Arg2 OPTIONAL,
OUT UINTN *Arg3 OPTIONAL
)
{
return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);
}
/** Trigger an SMC call with 1 argument.
@param Function The SMC function.
@param Arg1 Argument/result.
@param Arg2 Result.
@param Arg3 Result.
@return The SMC error code.
**/
UINTN
ArmCallSmc1 (
IN UINTN Function,
IN OUT UINTN *Arg1 OPTIONAL,
OUT UINTN *Arg2 OPTIONAL,
OUT UINTN *Arg3 OPTIONAL
)
{
return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);
}
/** Trigger an SMC call with 0 arguments.
@param Function The SMC function.
@param Arg1 Result.
@param Arg2 Result.
@param Arg3 Result.
@return The SMC error code.
**/
UINTN
ArmCallSmc0 (
IN UINTN Function,
OUT UINTN *Arg1 OPTIONAL,
OUT UINTN *Arg2 OPTIONAL,
OUT UINTN *Arg3 OPTIONAL
)
{
return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);
}

View File

@ -20,9 +20,6 @@
[Sources.AARCH64] [Sources.AARCH64]
AArch64/ArmSmc.S AArch64/ArmSmc.S
[Sources]
ArmSmc.c
[Packages] [Packages]
MdePkg/MdePkg.dec MdePkg/MdePkg.dec
ArmPkg/ArmPkg.dec ArmPkg/ArmPkg.dec

View File

@ -1,5 +1,4 @@
// //
// Copyright (c) 2021, NUVIA Inc. All rights reserved.
// Copyright (c) 2016, Linaro Limited. All rights reserved. // Copyright (c) 2016, Linaro Limited. All rights reserved.
// //
// SPDX-License-Identifier: BSD-2-Clause-Patent // SPDX-License-Identifier: BSD-2-Clause-Patent
@ -8,7 +7,6 @@
#include <Base.h> #include <Base.h>
#include <Library/ArmSmcLib.h> #include <Library/ArmSmcLib.h>
#include <IndustryStandard/ArmStdSmc.h>
VOID VOID
ArmCallSmc ( ArmCallSmc (
@ -16,86 +14,3 @@ ArmCallSmc (
) )
{ {
} }
/** Triggers an SMC call with 3 arguments.
@param Function The SMC function.
@param Arg1 Argument/result.
@param Arg2 Argument/result.
@param Arg3 Argument/result.
@return The SMC error code.
**/
UINTN
ArmCallSmc3 (
IN UINTN Function,
IN OUT UINTN *Arg1 OPTIONAL,
IN OUT UINTN *Arg2 OPTIONAL,
IN OUT UINTN *Arg3 OPTIONAL
)
{
return SMC_ARCH_CALL_NOT_SUPPORTED;
}
/** Trigger an SMC call with 2 arguments.
@param Function The SMC function.
@param Arg1 Argument/result.
@param Arg2 Argument/result.
@param Arg3 Result.
@return The SMC error code.
**/
UINTN
ArmCallSmc2 (
IN UINTN Function,
IN OUT UINTN *Arg1 OPTIONAL,
IN OUT UINTN *Arg2 OPTIONAL,
OUT UINTN *Arg3 OPTIONAL
)
{
return SMC_ARCH_CALL_NOT_SUPPORTED;
}
/** Trigger an SMC call with 1 argument.
@param Function The SMC function.
@param Arg1 Argument/result.
@param Arg2 Result.
@param Arg3 Result.
@return The SMC error code.
**/
UINTN
ArmCallSmc1 (
IN UINTN Function,
IN OUT UINTN *Arg1 OPTIONAL,
OUT UINTN *Arg2 OPTIONAL,
OUT UINTN *Arg3 OPTIONAL
)
{
return SMC_ARCH_CALL_NOT_SUPPORTED;
}
/** Trigger an SMC call with 0 arguments.
@param Function The SMC function.
@param Arg1 Result.
@param Arg2 Result.
@param Arg3 Result.
@return The SMC error code.
**/
UINTN
ArmCallSmc0 (
IN UINTN Function,
OUT UINTN *Arg1 OPTIONAL,
OUT UINTN *Arg2 OPTIONAL,
OUT UINTN *Arg3 OPTIONAL
)
{
return SMC_ARCH_CALL_NOT_SUPPORTED;
}

View File

@ -31,8 +31,11 @@ ResetCold (
VOID VOID
) )
{ {
ARM_SMC_ARGS ArmSmcArgs;
// Send a PSCI 0.2 SYSTEM_RESET command // Send a PSCI 0.2 SYSTEM_RESET command
ArmCallSmc0 (ARM_SMC_ID_PSCI_SYSTEM_RESET, NULL, NULL, NULL); ArmSmcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_RESET;
ArmCallSmc (&ArmSmcArgs);
} }
/** /**
@ -63,8 +66,11 @@ ResetShutdown (
VOID VOID
) )
{ {
ARM_SMC_ARGS ArmSmcArgs;
// Send a PSCI 0.2 SYSTEM_OFF command // Send a PSCI 0.2 SYSTEM_OFF command
ArmCallSmc0 (ARM_SMC_ID_PSCI_SYSTEM_OFF, NULL, NULL, NULL); ArmSmcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_OFF;
ArmCallSmc (&ArmSmcArgs);
} }
/** /**

View File

@ -25,18 +25,12 @@ typedef uint64_t aeabi_double_t;
* Helpers to convert between float32 and aeabi_float_t, and float64 and * Helpers to convert between float32 and aeabi_float_t, and float64 and
* aeabi_double_t used by the AEABI functions below. * aeabi_double_t used by the AEABI functions below.
*/ */
static aeabi_float_t static aeabi_float_t f32_to_f(float32_t val)
f32_to_f (
float32_t val
)
{ {
return val.v; return val.v;
} }
static float32_t static float32_t f32_from_f(aeabi_float_t val)
f32_from_f (
aeabi_float_t val
)
{ {
float32_t res; float32_t res;
@ -45,18 +39,12 @@ f32_from_f (
return res; return res;
} }
static aeabi_double_t static aeabi_double_t f64_to_d(float64_t val)
f64_to_d (
float64_t val
)
{ {
return val.v; return val.v;
} }
static float64_t static float64_t f64_from_d(aeabi_double_t val)
f64_from_d (
aeabi_double_t val
)
{ {
float64_t res; float64_t res;
@ -76,47 +64,29 @@ f64_from_d (
* Table 2, Standard aeabi_double_t precision floating-point arithmetic helper * Table 2, Standard aeabi_double_t precision floating-point arithmetic helper
* functions * functions
*/ */
aeabi_double_t
__aeabi_dadd ( aeabi_double_t __aeabi_dadd(aeabi_double_t a, aeabi_double_t b)
aeabi_double_t a,
aeabi_double_t b
)
{ {
return f64_to_d(f64_add(f64_from_d(a), f64_from_d(b))); return f64_to_d(f64_add(f64_from_d(a), f64_from_d(b)));
} }
aeabi_double_t aeabi_double_t __aeabi_ddiv(aeabi_double_t a, aeabi_double_t b)
__aeabi_ddiv (
aeabi_double_t a,
aeabi_double_t b
)
{ {
return f64_to_d(f64_div(f64_from_d(a), f64_from_d(b))); return f64_to_d(f64_div(f64_from_d(a), f64_from_d(b)));
} }
aeabi_double_t aeabi_double_t __aeabi_dmul(aeabi_double_t a, aeabi_double_t b)
__aeabi_dmul (
aeabi_double_t a,
aeabi_double_t b
)
{ {
return f64_to_d(f64_mul(f64_from_d(a), f64_from_d(b))); return f64_to_d(f64_mul(f64_from_d(a), f64_from_d(b)));
} }
aeabi_double_t
__aeabi_drsub ( aeabi_double_t __aeabi_drsub(aeabi_double_t a, aeabi_double_t b)
aeabi_double_t a,
aeabi_double_t b
)
{ {
return f64_to_d(f64_sub(f64_from_d(b), f64_from_d(a))); return f64_to_d(f64_sub(f64_from_d(b), f64_from_d(a)));
} }
aeabi_double_t aeabi_double_t __aeabi_dsub(aeabi_double_t a, aeabi_double_t b)
__aeabi_dsub (
aeabi_double_t a,
aeabi_double_t b
)
{ {
return f64_to_d(f64_sub(f64_from_d(a), f64_from_d(b))); return f64_to_d(f64_sub(f64_from_d(a), f64_from_d(b)));
} }
@ -124,47 +94,28 @@ __aeabi_dsub (
/* /*
* Table 3, double precision floating-point comparison helper functions * Table 3, double precision floating-point comparison helper functions
*/ */
int
__aeabi_dcmpeq ( int __aeabi_dcmpeq(aeabi_double_t a, aeabi_double_t b)
aeabi_double_t a,
aeabi_double_t b
)
{ {
return f64_eq(f64_from_d(a), f64_from_d(b)); return f64_eq(f64_from_d(a), f64_from_d(b));
} }
int int __aeabi_dcmplt(aeabi_double_t a, aeabi_double_t b)
__aeabi_dcmplt (
aeabi_double_t a,
aeabi_double_t b
)
{ {
return f64_lt(f64_from_d(a), f64_from_d(b)); return f64_lt(f64_from_d(a), f64_from_d(b));
} }
int int __aeabi_dcmple(aeabi_double_t a, aeabi_double_t b)
__aeabi_dcmple (
aeabi_double_t a,
aeabi_double_t b
)
{ {
return f64_le(f64_from_d(a), f64_from_d(b)); return f64_le(f64_from_d(a), f64_from_d(b));
} }
int int __aeabi_dcmpge(aeabi_double_t a, aeabi_double_t b)
__aeabi_dcmpge (
aeabi_double_t a,
aeabi_double_t b
)
{ {
return f64_le(f64_from_d(b), f64_from_d(a)); return f64_le(f64_from_d(b), f64_from_d(a));
} }
int int __aeabi_dcmpgt(aeabi_double_t a, aeabi_double_t b)
__aeabi_dcmpgt (
aeabi_double_t a,
aeabi_double_t b
)
{ {
return f64_lt(f64_from_d(b), f64_from_d(a)); return f64_lt(f64_from_d(b), f64_from_d(a));
} }
@ -173,47 +124,28 @@ __aeabi_dcmpgt (
* Table 4, Standard single precision floating-point arithmetic helper * Table 4, Standard single precision floating-point arithmetic helper
* functions * functions
*/ */
aeabi_float_t
__aeabi_fadd ( aeabi_float_t __aeabi_fadd(aeabi_float_t a, aeabi_float_t b)
aeabi_float_t a,
aeabi_float_t b
)
{ {
return f32_to_f(f32_add(f32_from_f(a), f32_from_f(b))); return f32_to_f(f32_add(f32_from_f(a), f32_from_f(b)));
} }
aeabi_float_t aeabi_float_t __aeabi_fdiv(aeabi_float_t a, aeabi_float_t b)
__aeabi_fdiv (
aeabi_float_t a,
aeabi_float_t b
)
{ {
return f32_to_f(f32_div(f32_from_f(a), f32_from_f(b))); return f32_to_f(f32_div(f32_from_f(a), f32_from_f(b)));
} }
aeabi_float_t aeabi_float_t __aeabi_fmul(aeabi_float_t a, aeabi_float_t b)
__aeabi_fmul (
aeabi_float_t a,
aeabi_float_t b
)
{ {
return f32_to_f(f32_mul(f32_from_f(a), f32_from_f(b))); return f32_to_f(f32_mul(f32_from_f(a), f32_from_f(b)));
} }
aeabi_float_t aeabi_float_t __aeabi_frsub(aeabi_float_t a, aeabi_float_t b)
__aeabi_frsub (
aeabi_float_t a,
aeabi_float_t b
)
{ {
return f32_to_f(f32_sub(f32_from_f(b), f32_from_f(a))); return f32_to_f(f32_sub(f32_from_f(b), f32_from_f(a)));
} }
aeabi_float_t aeabi_float_t __aeabi_fsub(aeabi_float_t a, aeabi_float_t b)
__aeabi_fsub (
aeabi_float_t a,
aeabi_float_t b
)
{ {
return f32_to_f(f32_sub(f32_from_f(a), f32_from_f(b))); return f32_to_f(f32_sub(f32_from_f(a), f32_from_f(b)));
} }
@ -222,47 +154,28 @@ __aeabi_fsub (
* Table 5, Standard single precision floating-point comparison helper * Table 5, Standard single precision floating-point comparison helper
* functions * functions
*/ */
int
__aeabi_fcmpeq ( int __aeabi_fcmpeq(aeabi_float_t a, aeabi_float_t b)
aeabi_float_t a,
aeabi_float_t b
)
{ {
return f32_eq(f32_from_f(a), f32_from_f(b)); return f32_eq(f32_from_f(a), f32_from_f(b));
} }
int int __aeabi_fcmplt(aeabi_float_t a, aeabi_float_t b)
__aeabi_fcmplt (
aeabi_float_t a,
aeabi_float_t b
)
{ {
return f32_lt(f32_from_f(a), f32_from_f(b)); return f32_lt(f32_from_f(a), f32_from_f(b));
} }
int int __aeabi_fcmple(aeabi_float_t a, aeabi_float_t b)
__aeabi_fcmple (
aeabi_float_t a,
aeabi_float_t b
)
{ {
return f32_le(f32_from_f(a), f32_from_f(b)); return f32_le(f32_from_f(a), f32_from_f(b));
} }
int int __aeabi_fcmpge(aeabi_float_t a, aeabi_float_t b)
__aeabi_fcmpge (
aeabi_float_t a,
aeabi_float_t b
)
{ {
return f32_le(f32_from_f(b), f32_from_f(a)); return f32_le(f32_from_f(b), f32_from_f(a));
} }
int int __aeabi_fcmpgt(aeabi_float_t a, aeabi_float_t b)
__aeabi_fcmpgt (
aeabi_float_t a,
aeabi_float_t b
)
{ {
return f32_lt(f32_from_f(b), f32_from_f(a)); return f32_lt(f32_from_f(b), f32_from_f(a));
} }
@ -270,66 +183,43 @@ __aeabi_fcmpgt (
/* /*
* Table 6, Standard floating-point to integer conversions * Table 6, Standard floating-point to integer conversions
*/ */
int
__aeabi_d2iz ( int __aeabi_d2iz(aeabi_double_t a)
aeabi_double_t a
)
{ {
return f64_to_i32_r_minMag(f64_from_d(a), false); return f64_to_i32_r_minMag(f64_from_d(a), false);
} }
unsigned unsigned __aeabi_d2uiz(aeabi_double_t a)
__aeabi_d2uiz (
aeabi_double_t a
)
{ {
return f64_to_ui32_r_minMag(f64_from_d(a), false); return f64_to_ui32_r_minMag(f64_from_d(a), false);
} }
long long long long __aeabi_d2lz(aeabi_double_t a)
__aeabi_d2lz (
aeabi_double_t a
)
{ {
return f64_to_i64_r_minMag(f64_from_d(a), false); return f64_to_i64_r_minMag(f64_from_d(a), false);
} }
unsigned long long unsigned long long __aeabi_d2ulz(aeabi_double_t a)
__aeabi_d2ulz (
aeabi_double_t a
)
{ {
return f64_to_ui64_r_minMag(f64_from_d(a), false); return f64_to_ui64_r_minMag(f64_from_d(a), false);
} }
int int __aeabi_f2iz(aeabi_float_t a)
__aeabi_f2iz (
aeabi_float_t a
)
{ {
return f32_to_i32_r_minMag(f32_from_f(a), false); return f32_to_i32_r_minMag(f32_from_f(a), false);
} }
unsigned unsigned __aeabi_f2uiz(aeabi_float_t a)
__aeabi_f2uiz (
aeabi_float_t a
)
{ {
return f32_to_ui32_r_minMag(f32_from_f(a), false); return f32_to_ui32_r_minMag(f32_from_f(a), false);
} }
long long long long __aeabi_f2lz(aeabi_float_t a)
__aeabi_f2lz (
aeabi_float_t a
)
{ {
return f32_to_i64_r_minMag(f32_from_f(a), false); return f32_to_i64_r_minMag(f32_from_f(a), false);
} }
unsigned long long unsigned long long __aeabi_f2ulz(aeabi_float_t a)
__aeabi_f2ulz (
aeabi_float_t a
)
{ {
return f32_to_ui64_r_minMag(f32_from_f(a), false); return f32_to_ui64_r_minMag(f32_from_f(a), false);
} }
@ -337,18 +227,13 @@ __aeabi_f2ulz (
/* /*
* Table 7, Standard conversions between floating types * Table 7, Standard conversions between floating types
*/ */
aeabi_float_t
__aeabi_d2f ( aeabi_float_t __aeabi_d2f(aeabi_double_t a)
aeabi_double_t a
)
{ {
return f32_to_f(f64_to_f32(f64_from_d(a))); return f32_to_f(f64_to_f32(f64_from_d(a)));
} }
aeabi_double_t aeabi_double_t __aeabi_f2d(aeabi_float_t a)
__aeabi_f2d (
aeabi_float_t a
)
{ {
return f64_to_d(f32_to_f64(f32_from_f(a))); return f64_to_d(f32_to_f64(f32_from_f(a)));
} }
@ -356,66 +241,43 @@ __aeabi_f2d (
/* /*
* Table 8, Standard integer to floating-point conversions * Table 8, Standard integer to floating-point conversions
*/ */
aeabi_double_t
__aeabi_i2d ( aeabi_double_t __aeabi_i2d(int a)
int a
)
{ {
return f64_to_d(i32_to_f64(a)); return f64_to_d(i32_to_f64(a));
} }
aeabi_double_t aeabi_double_t __aeabi_ui2d(unsigned a)
__aeabi_ui2d (
unsigned a
)
{ {
return f64_to_d(ui32_to_f64(a)); return f64_to_d(ui32_to_f64(a));
} }
aeabi_double_t aeabi_double_t __aeabi_l2d(long long a)
__aeabi_l2d (
long long a
)
{ {
return f64_to_d(i64_to_f64(a)); return f64_to_d(i64_to_f64(a));
} }
aeabi_double_t aeabi_double_t __aeabi_ul2d(unsigned long long a)
__aeabi_ul2d (
unsigned long long a
)
{ {
return f64_to_d(ui64_to_f64(a)); return f64_to_d(ui64_to_f64(a));
} }
aeabi_float_t aeabi_float_t __aeabi_i2f(int a)
__aeabi_i2f (
int a
)
{ {
return f32_to_f(i32_to_f32(a)); return f32_to_f(i32_to_f32(a));
} }
aeabi_float_t aeabi_float_t __aeabi_ui2f(unsigned a)
__aeabi_ui2f (
unsigned a
)
{ {
return f32_to_f(ui32_to_f32(a)); return f32_to_f(ui32_to_f32(a));
} }
aeabi_float_t aeabi_float_t __aeabi_l2f(long long a)
__aeabi_l2f (
long long a
)
{ {
return f32_to_f(i64_to_f32(a)); return f32_to_f(i64_to_f32(a));
} }
aeabi_float_t aeabi_float_t __aeabi_ul2f(unsigned long long a)
__aeabi_ul2f (
unsigned long long a
)
{ {
return f32_to_f(ui64_to_f32(a)); return f32_to_f(ui64_to_f32(a));
} }

View File

@ -13,21 +13,10 @@ typedef unsigned __int64 size_t;
typedef unsigned __int32 size_t; typedef unsigned __int32 size_t;
#endif #endif
int int memcmp(void *, void *, size_t);
memcmp (
void *,
void *,
size_t
);
#pragma intrinsic(memcmp) #pragma intrinsic(memcmp)
#pragma function(memcmp) #pragma function(memcmp)
int int memcmp(const void *s1, const void *s2, size_t n)
memcmp (
const void *s1,
const void *s2,
size_t n
)
{ {
unsigned char const *t1; unsigned char const *t1;
unsigned char const *t2; unsigned char const *t2;
@ -36,10 +25,8 @@ memcmp (
t2 = s2; t2 = s2;
while (n-- != 0) { while (n-- != 0) {
if (*t1 != *t2) { if (*t1 != *t2)
return (int)*t1 - (int)*t2; return (int)*t1 - (int)*t2;
}
t1++; t1++;
t2++; t2++;
} }

View File

@ -9,12 +9,7 @@
typedef __SIZE_TYPE__ size_t; typedef __SIZE_TYPE__ size_t;
static void static void __memcpy(void *dest, const void *src, size_t n)
__memcpy (
void *dest,
const void *src,
size_t n
)
{ {
unsigned char *d; unsigned char *d;
unsigned char const *s; unsigned char const *s;
@ -27,12 +22,7 @@ __memcpy (
} }
} }
void * void *memcpy(void *dest, const void *src, size_t n)
memcpy (
void *dest,
const void *src,
size_t n
)
{ {
__memcpy(dest, src, n); __memcpy(dest, src, n);
return dest; return dest;
@ -41,27 +31,12 @@ memcpy (
#ifdef __arm__ #ifdef __arm__
__attribute__((__alias__("__memcpy"))) __attribute__((__alias__("__memcpy")))
void void __aeabi_memcpy(void *dest, const void *src, size_t n);
__aeabi_memcpy (
void *dest,
const void *src,
size_t n
);
__attribute__((__alias__("__memcpy"))) __attribute__((__alias__("__memcpy")))
void void __aeabi_memcpy4(void *dest, const void *src, size_t n);
__aeabi_memcpy4 (
void *dest,
const void *src,
size_t n
);
__attribute__((__alias__("__memcpy"))) __attribute__((__alias__("__memcpy")))
void void __aeabi_memcpy8(void *dest, const void *src, size_t n);
__aeabi_memcpy8 (
void *dest,
const void *src,
size_t n
);
#endif #endif

View File

@ -13,21 +13,10 @@ typedef unsigned __int64 size_t;
typedef unsigned __int32 size_t; typedef unsigned __int32 size_t;
#endif #endif
void * void* memcpy(void *, const void *, size_t);
memcpy (
void *,
const void *,
size_t
);
#pragma intrinsic(memcpy) #pragma intrinsic(memcpy)
#pragma function(memcpy) #pragma function(memcpy)
void * void* memcpy(void *dest, const void *src, size_t n)
memcpy (
void *dest,
const void *src,
size_t n
)
{ {
unsigned char *d; unsigned char *d;
unsigned char const *s; unsigned char const *s;

View File

@ -13,21 +13,10 @@ typedef unsigned __int64 size_t;
typedef unsigned __int32 size_t; typedef unsigned __int32 size_t;
#endif #endif
void * void* memmove(void *, const void *, size_t);
memmove (
void *,
const void *,
size_t
);
#pragma intrinsic(memmove) #pragma intrinsic(memmove)
#pragma function(memmove) #pragma function(memmove)
void * void* memmove(void *dest, const void *src, size_t n)
memmove (
void *dest,
const void *src,
size_t n
)
{ {
unsigned char *d; unsigned char *d;
unsigned char const *s; unsigned char const *s;

View File

@ -10,12 +10,7 @@
typedef __SIZE_TYPE__ size_t; typedef __SIZE_TYPE__ size_t;
static __attribute__((__used__)) static __attribute__((__used__))
void * void *__memset(void *s, int c, size_t n)
__memset (
void *s,
int c,
size_t n
)
{ {
unsigned char *d; unsigned char *d;
@ -35,62 +30,30 @@ __memset (
// our memset() 'weak' to let the other implementation take precedence. // our memset() 'weak' to let the other implementation take precedence.
// //
__attribute__((__weak__, __alias__("__memset"))) __attribute__((__weak__, __alias__("__memset")))
void * void *memset(void *dest, int c, size_t n);
memset (
void *dest,
int c,
size_t n
);
#ifdef __arm__ #ifdef __arm__
void void __aeabi_memset(void *dest, size_t n, int c)
__aeabi_memset (
void *dest,
size_t n,
int c
)
{ {
__memset(dest, c, n); __memset(dest, c, n);
} }
__attribute__((__alias__("__aeabi_memset"))) __attribute__((__alias__("__aeabi_memset")))
void void __aeabi_memset4(void *dest, size_t n, int c);
__aeabi_memset4 (
void *dest,
size_t n,
int c
);
__attribute__((__alias__("__aeabi_memset"))) __attribute__((__alias__("__aeabi_memset")))
void void __aeabi_memset8(void *dest, size_t n, int c);
__aeabi_memset8 (
void *dest,
size_t n,
int c
);
void void __aeabi_memclr(void *dest, size_t n)
__aeabi_memclr (
void *dest,
size_t n
)
{ {
__memset(dest, 0, n); __memset(dest, 0, n);
} }
__attribute__((__alias__("__aeabi_memclr"))) __attribute__((__alias__("__aeabi_memclr")))
void void __aeabi_memclr4(void *dest, size_t n);
__aeabi_memclr4 (
void *dest,
size_t n
);
__attribute__((__alias__("__aeabi_memclr"))) __attribute__((__alias__("__aeabi_memclr")))
void void __aeabi_memclr8(void *dest, size_t n);
__aeabi_memclr8 (
void *dest,
size_t n
);
#endif #endif

View File

@ -13,21 +13,10 @@ typedef unsigned __int64 size_t;
typedef unsigned __int32 size_t; typedef unsigned __int32 size_t;
#endif #endif
void * void* memset(void *, int, size_t);
memset (
void *,
int,
size_t
);
#pragma intrinsic(memset) #pragma intrinsic(memset)
#pragma function(memset) #pragma function(memset)
void * void *memset(void *s, int c, size_t n)
memset (
void *s,
int c,
size_t n
)
{ {
unsigned char *d; unsigned char *d;

View File

@ -22,6 +22,7 @@
#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \ #define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
(ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1)) (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))
// Vector Table for Sec Phase // Vector Table for Sec Phase
VOID VOID
DebugAgentVectorTable ( DebugAgentVectorTable (
@ -124,6 +125,7 @@ GetFfsFile (
FileState = GetFileState (ErasePolarity, FfsFileHeader); FileState = GetFileState (ErasePolarity, FfsFileHeader);
switch (FileState) { switch (FileState) {
case EFI_FILE_HEADER_INVALID: case EFI_FILE_HEADER_INVALID:
FileOffset += sizeof(EFI_FFS_FILE_HEADER); FileOffset += sizeof(EFI_FFS_FILE_HEADER);
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof(EFI_FFS_FILE_HEADER)); FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof(EFI_FFS_FILE_HEADER));
@ -159,7 +161,6 @@ GetFfsFile (
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
} }
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
@ -267,7 +268,7 @@ VOID
EFIAPI EFIAPI
InitializeDebugAgent ( InitializeDebugAgent (
IN UINT32 InitFlag, IN UINT32 InitFlag,
IN VOID *Context OPTIONAL, IN VOID *Context, OPTIONAL
IN DEBUG_AGENT_CONTINUE Function OPTIONAL IN DEBUG_AGENT_CONTINUE Function OPTIONAL
) )
{ {
@ -334,3 +335,4 @@ SaveAndSetDebugTimerInterrupt (
{ {
return FALSE; return FALSE;
} }

View File

@ -17,6 +17,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/PeCoffExtraActionLib.h> #include <Library/PeCoffExtraActionLib.h>
#include <Library/PrintLib.h> #include <Library/PrintLib.h>
/** /**
If the build is done on cygwin the paths are cygpaths. If the build is done on cygwin the paths are cygpaths.
/cygdrive/c/tmp.txt vs c:\tmp.txt so we need to convert /cygdrive/c/tmp.txt vs c:\tmp.txt so we need to convert
@ -56,6 +57,7 @@ DeCygwinPathIfNeeded (
return Temp; return Temp;
} }
/** /**
Performs additional actions after a PE/COFF image has been loaded and relocated. Performs additional actions after a PE/COFF image has been loaded and relocated.
@ -79,22 +81,24 @@ PeCoffLoaderRelocateImageExtraAction (
#ifdef __CC_ARM #ifdef __CC_ARM
#if (__ARMCC_VERSION < 500000) #if (__ARMCC_VERSION < 500000)
// Print out the command for the RVD debugger to load symbols for this image // Print out the command for the RVD debugger to load symbols for this image
DEBUG ((DEBUG_LOAD | DEBUG_INFO, "load /a /ni /np %a &0x%p\n", DeCygwinPathIfNeeded (ImageContext->PdbPointer, Temp, sizeof (Temp)), (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders))); DEBUG ((EFI_D_LOAD | EFI_D_INFO, "load /a /ni /np %a &0x%p\n", DeCygwinPathIfNeeded (ImageContext->PdbPointer, Temp, sizeof (Temp)), (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders)));
#else #else
// Print out the command for the DS-5 to load symbols for this image // Print out the command for the DS-5 to load symbols for this image
DEBUG ((DEBUG_LOAD | DEBUG_INFO, "add-symbol-file %a 0x%p\n", DeCygwinPathIfNeeded (ImageContext->PdbPointer, Temp, sizeof (Temp)), (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders))); DEBUG ((EFI_D_LOAD | EFI_D_INFO, "add-symbol-file %a 0x%p\n", DeCygwinPathIfNeeded (ImageContext->PdbPointer, Temp, sizeof (Temp)), (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders)));
#endif #endif
#elif __GNUC__ #elif __GNUC__
// This may not work correctly if you generate PE/COFF directly as then the Offset would not be required // This may not work correctly if you generate PE/COFF directly as then the Offset would not be required
DEBUG ((DEBUG_LOAD | DEBUG_INFO, "add-symbol-file %a 0x%p\n", DeCygwinPathIfNeeded (ImageContext->PdbPointer, Temp, sizeof (Temp)), (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders))); DEBUG ((EFI_D_LOAD | EFI_D_INFO, "add-symbol-file %a 0x%p\n", DeCygwinPathIfNeeded (ImageContext->PdbPointer, Temp, sizeof (Temp)), (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders)));
#else #else
DEBUG ((DEBUG_LOAD | DEBUG_INFO, "Loading driver at 0x%11p EntryPoint=0x%11p\n", (VOID *)(UINTN)ImageContext->ImageAddress, FUNCTION_ENTRY_POINT (ImageContext->EntryPoint))); DEBUG ((EFI_D_LOAD | EFI_D_INFO, "Loading driver at 0x%11p EntryPoint=0x%11p\n", (VOID *)(UINTN) ImageContext->ImageAddress, FUNCTION_ENTRY_POINT (ImageContext->EntryPoint)));
#endif #endif
} else { } else {
DEBUG ((DEBUG_LOAD | DEBUG_INFO, "Loading driver at 0x%11p EntryPoint=0x%11p\n", (VOID *)(UINTN)ImageContext->ImageAddress, FUNCTION_ENTRY_POINT (ImageContext->EntryPoint))); DEBUG ((EFI_D_LOAD | EFI_D_INFO, "Loading driver at 0x%11p EntryPoint=0x%11p\n", (VOID *)(UINTN) ImageContext->ImageAddress, FUNCTION_ENTRY_POINT (ImageContext->EntryPoint)));
} }
} }
/** /**
Performs additional actions just before a PE/COFF image is unloaded. Any resources Performs additional actions just before a PE/COFF image is unloaded. Any resources
that were allocated by PeCoffLoaderRelocateImageExtraAction() must be freed. that were allocated by PeCoffLoaderRelocateImageExtraAction() must be freed.

View File

@ -48,75 +48,43 @@ DescribeInstructionOrDataAbort (
CHAR8 *AbortCause; CHAR8 *AbortCause;
switch (Iss & 0x3f) { switch (Iss & 0x3f) {
case 0x0: AbortCause = "Address size fault, zeroth level of translation or translation table base register"; case 0x0: AbortCause = "Address size fault, zeroth level of translation or translation table base register"; break;
break; case 0x1: AbortCause = "Address size fault, first level"; break;
case 0x1: AbortCause = "Address size fault, first level"; case 0x2: AbortCause = "Address size fault, second level"; break;
break; case 0x3: AbortCause = "Address size fault, third level"; break;
case 0x2: AbortCause = "Address size fault, second level"; case 0x4: AbortCause = "Translation fault, zeroth level"; break;
break; case 0x5: AbortCause = "Translation fault, first level"; break;
case 0x3: AbortCause = "Address size fault, third level"; case 0x6: AbortCause = "Translation fault, second level"; break;
break; case 0x7: AbortCause = "Translation fault, third level"; break;
case 0x4: AbortCause = "Translation fault, zeroth level"; case 0x9: AbortCause = "Access flag fault, first level"; break;
break; case 0xa: AbortCause = "Access flag fault, second level"; break;
case 0x5: AbortCause = "Translation fault, first level"; case 0xb: AbortCause = "Access flag fault, third level"; break;
break; case 0xd: AbortCause = "Permission fault, first level"; break;
case 0x6: AbortCause = "Translation fault, second level"; case 0xe: AbortCause = "Permission fault, second level"; break;
break; case 0xf: AbortCause = "Permission fault, third level"; break;
case 0x7: AbortCause = "Translation fault, third level"; case 0x10: AbortCause = "Synchronous external abort"; break;
break; case 0x18: AbortCause = "Synchronous parity error on memory access"; break;
case 0x9: AbortCause = "Access flag fault, first level"; case 0x11: AbortCause = "Asynchronous external abort"; break;
break; case 0x19: AbortCause = "Asynchronous parity error on memory access"; break;
case 0xa: AbortCause = "Access flag fault, second level"; case 0x14: AbortCause = "Synchronous external abort on translation table walk, zeroth level"; break;
break; case 0x15: AbortCause = "Synchronous external abort on translation table walk, first level"; break;
case 0xb: AbortCause = "Access flag fault, third level"; case 0x16: AbortCause = "Synchronous external abort on translation table walk, second level"; break;
break; case 0x17: AbortCause = "Synchronous external abort on translation table walk, third level"; break;
case 0xd: AbortCause = "Permission fault, first level"; case 0x1c: AbortCause = "Synchronous parity error on memory access on translation table walk, zeroth level"; break;
break; case 0x1d: AbortCause = "Synchronous parity error on memory access on translation table walk, first level"; break;
case 0xe: AbortCause = "Permission fault, second level"; case 0x1e: AbortCause = "Synchronous parity error on memory access on translation table walk, second level"; break;
break; case 0x1f: AbortCause = "Synchronous parity error on memory access on translation table walk, third level"; break;
case 0xf: AbortCause = "Permission fault, third level"; case 0x21: AbortCause = "Alignment fault"; break;
break; case 0x22: AbortCause = "Debug event"; break;
case 0x10: AbortCause = "Synchronous external abort"; case 0x30: AbortCause = "TLB conflict abort"; break;
break;
case 0x18: AbortCause = "Synchronous parity error on memory access";
break;
case 0x11: AbortCause = "Asynchronous external abort";
break;
case 0x19: AbortCause = "Asynchronous parity error on memory access";
break;
case 0x14: AbortCause = "Synchronous external abort on translation table walk, zeroth level";
break;
case 0x15: AbortCause = "Synchronous external abort on translation table walk, first level";
break;
case 0x16: AbortCause = "Synchronous external abort on translation table walk, second level";
break;
case 0x17: AbortCause = "Synchronous external abort on translation table walk, third level";
break;
case 0x1c: AbortCause = "Synchronous parity error on memory access on translation table walk, zeroth level";
break;
case 0x1d: AbortCause = "Synchronous parity error on memory access on translation table walk, first level";
break;
case 0x1e: AbortCause = "Synchronous parity error on memory access on translation table walk, second level";
break;
case 0x1f: AbortCause = "Synchronous parity error on memory access on translation table walk, third level";
break;
case 0x21: AbortCause = "Alignment fault";
break;
case 0x22: AbortCause = "Debug event";
break;
case 0x30: AbortCause = "TLB conflict abort";
break;
case 0x33: case 0x33:
case 0x34: AbortCause = "IMPLEMENTATION DEFINED"; case 0x34: AbortCause = "IMPLEMENTATION DEFINED"; break;
break;
case 0x35: case 0x35:
case 0x36: AbortCause = "Domain fault"; case 0x36: AbortCause = "Domain fault"; break;
break; default: AbortCause = ""; break;
default: AbortCause = "";
break;
} }
DEBUG ((DEBUG_ERROR, "\n%a: %a\n", AbortType, AbortCause)); DEBUG ((EFI_D_ERROR, "\n%a: %a\n", AbortType, AbortCause));
} }
STATIC STATIC
@ -133,22 +101,17 @@ DescribeExceptionSyndrome (
Iss = Esr & 0x00ffffff; Iss = Esr & 0x00ffffff;
switch (Ec) { switch (Ec) {
case 0x15: Message = "SVC executed in AArch64"; case 0x15: Message = "SVC executed in AArch64"; break;
break;
case 0x20: case 0x20:
case 0x21: DescribeInstructionOrDataAbort ("Instruction abort", Iss); case 0x21: DescribeInstructionOrDataAbort ("Instruction abort", Iss); return;
return; case 0x22: Message = "PC alignment fault"; break;
case 0x22: Message = "PC alignment fault"; case 0x23: Message = "SP alignment fault"; break;
break;
case 0x23: Message = "SP alignment fault";
break;
case 0x24: case 0x24:
case 0x25: DescribeInstructionOrDataAbort ("Data abort", Iss); case 0x25: DescribeInstructionOrDataAbort ("Data abort", Iss); return;
return;
default: return; default: return;
} }
DEBUG ((DEBUG_ERROR, "\n %a \n", Message)); DEBUG ((EFI_D_ERROR, "\n %a \n", Message));
} }
#ifndef MDEPKG_NDEBUG #ifndef MDEPKG_NDEBUG
@ -163,14 +126,12 @@ BaseName (
Str = FullName + AsciiStrLen (FullName); Str = FullName + AsciiStrLen (FullName);
while (--Str > FullName) { while (--Str > FullName) {
if ((*Str == '/') || (*Str == '\\')) { if (*Str == '/' || *Str == '\\') {
return Str + 1; return Str + 1;
} }
} }
return Str; return Str;
} }
#endif #endif
/** /**
@ -199,10 +160,8 @@ DefaultExceptionHandler (
if (gST->ConOut != NULL) { if (gST->ConOut != NULL) {
AsciiPrint (Message); AsciiPrint (Message);
} }
CpuDeadLoop (); CpuDeadLoop ();
} }
mRecursiveException = TRUE; mRecursiveException = TRUE;
CharCount = AsciiSPrint (Buffer,sizeof (Buffer),"\n\n%a Exception at 0x%016lx\n", gExceptionTypeString[ExceptionType], SystemContext.SystemContextAArch64->ELR); CharCount = AsciiSPrint (Buffer,sizeof (Buffer),"\n\n%a Exception at 0x%016lx\n", gExceptionTypeString[ExceptionType], SystemContext.SystemContextAArch64->ELR);
@ -221,16 +180,11 @@ DefaultExceptionHandler (
PrevPdb = Pdb = GetImageName (SystemContext.SystemContextAArch64->ELR, &ImageBase, &PeCoffSizeOfHeader); PrevPdb = Pdb = GetImageName (SystemContext.SystemContextAArch64->ELR, &ImageBase, &PeCoffSizeOfHeader);
if (Pdb != NULL) { if (Pdb != NULL) {
DEBUG (( DEBUG ((EFI_D_ERROR, "PC 0x%012lx (0x%012lx+0x%08x) [ 0] %a\n",
DEBUG_ERROR, SystemContext.SystemContextAArch64->ELR, ImageBase,
"PC 0x%012lx (0x%012lx+0x%08x) [ 0] %a\n", SystemContext.SystemContextAArch64->ELR - ImageBase, BaseName (Pdb)));
SystemContext.SystemContextAArch64->ELR,
ImageBase,
SystemContext.SystemContextAArch64->ELR - ImageBase,
BaseName (Pdb)
));
} else { } else {
DEBUG ((DEBUG_ERROR, "PC 0x%012lx\n", SystemContext.SystemContextAArch64->ELR)); DEBUG ((EFI_D_ERROR, "PC 0x%012lx\n", SystemContext.SystemContextAArch64->ELR));
} }
if ((UINT64 *)SystemContext.SystemContextAArch64->FP != 0) { if ((UINT64 *)SystemContext.SystemContextAArch64->FP != 0) {
@ -242,7 +196,6 @@ DefaultExceptionHandler (
RootFp[0] = SystemContext.SystemContextAArch64->FP; RootFp[0] = SystemContext.SystemContextAArch64->FP;
RootFp[1] = SystemContext.SystemContextAArch64->LR; RootFp[1] = SystemContext.SystemContextAArch64->LR;
} }
for (Fp = RootFp; Fp[0] != 0; Fp = (UINT64 *)Fp[0]) { for (Fp = RootFp; Fp[0] != 0; Fp = (UINT64 *)Fp[0]) {
Pdb = GetImageName (Fp[1], &ImageBase, &PeCoffSizeOfHeader); Pdb = GetImageName (Fp[1], &ImageBase, &PeCoffSizeOfHeader);
if (Pdb != NULL) { if (Pdb != NULL) {
@ -250,84 +203,71 @@ DefaultExceptionHandler (
Idx++; Idx++;
PrevPdb = Pdb; PrevPdb = Pdb;
} }
DEBUG ((EFI_D_ERROR, "PC 0x%012lx (0x%012lx+0x%08x) [% 2d] %a\n",
DEBUG (( Fp[1], ImageBase, Fp[1] - ImageBase, Idx, BaseName (Pdb)));
DEBUG_ERROR,
"PC 0x%012lx (0x%012lx+0x%08x) [% 2d] %a\n",
Fp[1],
ImageBase,
Fp[1] - ImageBase,
Idx,
BaseName (Pdb)
));
} else { } else {
DEBUG ((DEBUG_ERROR, "PC 0x%012lx\n", Fp[1])); DEBUG ((EFI_D_ERROR, "PC 0x%012lx\n", Fp[1]));
} }
} }
PrevPdb = Pdb = GetImageName (SystemContext.SystemContextAArch64->ELR, &ImageBase, &PeCoffSizeOfHeader); PrevPdb = Pdb = GetImageName (SystemContext.SystemContextAArch64->ELR, &ImageBase, &PeCoffSizeOfHeader);
if (Pdb != NULL) { if (Pdb != NULL) {
DEBUG ((DEBUG_ERROR, "\n[ 0] %a\n", Pdb)); DEBUG ((EFI_D_ERROR, "\n[ 0] %a\n", Pdb));
} }
Idx = 0; Idx = 0;
for (Fp = RootFp; Fp[0] != 0; Fp = (UINT64 *)Fp[0]) { for (Fp = RootFp; Fp[0] != 0; Fp = (UINT64 *)Fp[0]) {
Pdb = GetImageName (Fp[1], &ImageBase, &PeCoffSizeOfHeader); Pdb = GetImageName (Fp[1], &ImageBase, &PeCoffSizeOfHeader);
if ((Pdb != NULL) && (Pdb != PrevPdb)) { if (Pdb != NULL && Pdb != PrevPdb) {
DEBUG ((DEBUG_ERROR, "[% 2d] %a\n", ++Idx, Pdb)); DEBUG ((EFI_D_ERROR, "[% 2d] %a\n", ++Idx, Pdb));
PrevPdb = Pdb; PrevPdb = Pdb;
} }
} }
} }
DEBUG_CODE_END (); DEBUG_CODE_END ();
DEBUG ((DEBUG_ERROR, "\n X0 0x%016lx X1 0x%016lx X2 0x%016lx X3 0x%016lx\n", SystemContext.SystemContextAArch64->X0, SystemContext.SystemContextAArch64->X1, SystemContext.SystemContextAArch64->X2, SystemContext.SystemContextAArch64->X3)); DEBUG ((EFI_D_ERROR, "\n X0 0x%016lx X1 0x%016lx X2 0x%016lx X3 0x%016lx\n", SystemContext.SystemContextAArch64->X0, SystemContext.SystemContextAArch64->X1, SystemContext.SystemContextAArch64->X2, SystemContext.SystemContextAArch64->X3));
DEBUG ((DEBUG_ERROR, " X4 0x%016lx X5 0x%016lx X6 0x%016lx X7 0x%016lx\n", SystemContext.SystemContextAArch64->X4, SystemContext.SystemContextAArch64->X5, SystemContext.SystemContextAArch64->X6, SystemContext.SystemContextAArch64->X7)); DEBUG ((EFI_D_ERROR, " X4 0x%016lx X5 0x%016lx X6 0x%016lx X7 0x%016lx\n", SystemContext.SystemContextAArch64->X4, SystemContext.SystemContextAArch64->X5, SystemContext.SystemContextAArch64->X6, SystemContext.SystemContextAArch64->X7));
DEBUG ((DEBUG_ERROR, " X8 0x%016lx X9 0x%016lx X10 0x%016lx X11 0x%016lx\n", SystemContext.SystemContextAArch64->X8, SystemContext.SystemContextAArch64->X9, SystemContext.SystemContextAArch64->X10, SystemContext.SystemContextAArch64->X11)); DEBUG ((EFI_D_ERROR, " X8 0x%016lx X9 0x%016lx X10 0x%016lx X11 0x%016lx\n", SystemContext.SystemContextAArch64->X8, SystemContext.SystemContextAArch64->X9, SystemContext.SystemContextAArch64->X10, SystemContext.SystemContextAArch64->X11));
DEBUG ((DEBUG_ERROR, " X12 0x%016lx X13 0x%016lx X14 0x%016lx X15 0x%016lx\n", SystemContext.SystemContextAArch64->X12, SystemContext.SystemContextAArch64->X13, SystemContext.SystemContextAArch64->X14, SystemContext.SystemContextAArch64->X15)); DEBUG ((EFI_D_ERROR, " X12 0x%016lx X13 0x%016lx X14 0x%016lx X15 0x%016lx\n", SystemContext.SystemContextAArch64->X12, SystemContext.SystemContextAArch64->X13, SystemContext.SystemContextAArch64->X14, SystemContext.SystemContextAArch64->X15));
DEBUG ((DEBUG_ERROR, " X16 0x%016lx X17 0x%016lx X18 0x%016lx X19 0x%016lx\n", SystemContext.SystemContextAArch64->X16, SystemContext.SystemContextAArch64->X17, SystemContext.SystemContextAArch64->X18, SystemContext.SystemContextAArch64->X19)); DEBUG ((EFI_D_ERROR, " X16 0x%016lx X17 0x%016lx X18 0x%016lx X19 0x%016lx\n", SystemContext.SystemContextAArch64->X16, SystemContext.SystemContextAArch64->X17, SystemContext.SystemContextAArch64->X18, SystemContext.SystemContextAArch64->X19));
DEBUG ((DEBUG_ERROR, " X20 0x%016lx X21 0x%016lx X22 0x%016lx X23 0x%016lx\n", SystemContext.SystemContextAArch64->X20, SystemContext.SystemContextAArch64->X21, SystemContext.SystemContextAArch64->X22, SystemContext.SystemContextAArch64->X23)); DEBUG ((EFI_D_ERROR, " X20 0x%016lx X21 0x%016lx X22 0x%016lx X23 0x%016lx\n", SystemContext.SystemContextAArch64->X20, SystemContext.SystemContextAArch64->X21, SystemContext.SystemContextAArch64->X22, SystemContext.SystemContextAArch64->X23));
DEBUG ((DEBUG_ERROR, " X24 0x%016lx X25 0x%016lx X26 0x%016lx X27 0x%016lx\n", SystemContext.SystemContextAArch64->X24, SystemContext.SystemContextAArch64->X25, SystemContext.SystemContextAArch64->X26, SystemContext.SystemContextAArch64->X27)); DEBUG ((EFI_D_ERROR, " X24 0x%016lx X25 0x%016lx X26 0x%016lx X27 0x%016lx\n", SystemContext.SystemContextAArch64->X24, SystemContext.SystemContextAArch64->X25, SystemContext.SystemContextAArch64->X26, SystemContext.SystemContextAArch64->X27));
DEBUG ((DEBUG_ERROR, " X28 0x%016lx FP 0x%016lx LR 0x%016lx \n", SystemContext.SystemContextAArch64->X28, SystemContext.SystemContextAArch64->FP, SystemContext.SystemContextAArch64->LR)); DEBUG ((EFI_D_ERROR, " X28 0x%016lx FP 0x%016lx LR 0x%016lx \n", SystemContext.SystemContextAArch64->X28, SystemContext.SystemContextAArch64->FP, SystemContext.SystemContextAArch64->LR));
/* We save these as 128bit numbers, but have to print them as two 64bit numbers, /* We save these as 128bit numbers, but have to print them as two 64bit numbers,
so swap the 64bit words to correctly represent a 128bit number. */ so swap the 64bit words to correctly represent a 128bit number. */
DEBUG ((DEBUG_ERROR, "\n V0 0x%016lx %016lx V1 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V0[1], SystemContext.SystemContextAArch64->V0[0], SystemContext.SystemContextAArch64->V1[1], SystemContext.SystemContextAArch64->V1[0])); DEBUG ((EFI_D_ERROR, "\n V0 0x%016lx %016lx V1 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V0[1], SystemContext.SystemContextAArch64->V0[0], SystemContext.SystemContextAArch64->V1[1], SystemContext.SystemContextAArch64->V1[0]));
DEBUG ((DEBUG_ERROR, " V2 0x%016lx %016lx V3 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V2[1], SystemContext.SystemContextAArch64->V2[0], SystemContext.SystemContextAArch64->V3[1], SystemContext.SystemContextAArch64->V3[0])); DEBUG ((EFI_D_ERROR, " V2 0x%016lx %016lx V3 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V2[1], SystemContext.SystemContextAArch64->V2[0], SystemContext.SystemContextAArch64->V3[1], SystemContext.SystemContextAArch64->V3[0]));
DEBUG ((DEBUG_ERROR, " V4 0x%016lx %016lx V5 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V4[1], SystemContext.SystemContextAArch64->V4[0], SystemContext.SystemContextAArch64->V5[1], SystemContext.SystemContextAArch64->V5[0])); DEBUG ((EFI_D_ERROR, " V4 0x%016lx %016lx V5 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V4[1], SystemContext.SystemContextAArch64->V4[0], SystemContext.SystemContextAArch64->V5[1], SystemContext.SystemContextAArch64->V5[0]));
DEBUG ((DEBUG_ERROR, " V6 0x%016lx %016lx V7 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V6[1], SystemContext.SystemContextAArch64->V6[0], SystemContext.SystemContextAArch64->V7[1], SystemContext.SystemContextAArch64->V7[0])); DEBUG ((EFI_D_ERROR, " V6 0x%016lx %016lx V7 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V6[1], SystemContext.SystemContextAArch64->V6[0], SystemContext.SystemContextAArch64->V7[1], SystemContext.SystemContextAArch64->V7[0]));
DEBUG ((DEBUG_ERROR, " V8 0x%016lx %016lx V9 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V8[1], SystemContext.SystemContextAArch64->V8[0], SystemContext.SystemContextAArch64->V9[1], SystemContext.SystemContextAArch64->V9[0])); DEBUG ((EFI_D_ERROR, " V8 0x%016lx %016lx V9 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V8[1], SystemContext.SystemContextAArch64->V8[0], SystemContext.SystemContextAArch64->V9[1], SystemContext.SystemContextAArch64->V9[0]));
DEBUG ((DEBUG_ERROR, " V10 0x%016lx %016lx V11 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V10[1], SystemContext.SystemContextAArch64->V10[0], SystemContext.SystemContextAArch64->V11[1], SystemContext.SystemContextAArch64->V11[0])); DEBUG ((EFI_D_ERROR, " V10 0x%016lx %016lx V11 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V10[1], SystemContext.SystemContextAArch64->V10[0], SystemContext.SystemContextAArch64->V11[1], SystemContext.SystemContextAArch64->V11[0]));
DEBUG ((DEBUG_ERROR, " V12 0x%016lx %016lx V13 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V12[1], SystemContext.SystemContextAArch64->V12[0], SystemContext.SystemContextAArch64->V13[1], SystemContext.SystemContextAArch64->V13[0])); DEBUG ((EFI_D_ERROR, " V12 0x%016lx %016lx V13 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V12[1], SystemContext.SystemContextAArch64->V12[0], SystemContext.SystemContextAArch64->V13[1], SystemContext.SystemContextAArch64->V13[0]));
DEBUG ((DEBUG_ERROR, " V14 0x%016lx %016lx V15 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V14[1], SystemContext.SystemContextAArch64->V14[0], SystemContext.SystemContextAArch64->V15[1], SystemContext.SystemContextAArch64->V15[0])); DEBUG ((EFI_D_ERROR, " V14 0x%016lx %016lx V15 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V14[1], SystemContext.SystemContextAArch64->V14[0], SystemContext.SystemContextAArch64->V15[1], SystemContext.SystemContextAArch64->V15[0]));
DEBUG ((DEBUG_ERROR, " V16 0x%016lx %016lx V17 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V16[1], SystemContext.SystemContextAArch64->V16[0], SystemContext.SystemContextAArch64->V17[1], SystemContext.SystemContextAArch64->V17[0])); DEBUG ((EFI_D_ERROR, " V16 0x%016lx %016lx V17 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V16[1], SystemContext.SystemContextAArch64->V16[0], SystemContext.SystemContextAArch64->V17[1], SystemContext.SystemContextAArch64->V17[0]));
DEBUG ((DEBUG_ERROR, " V18 0x%016lx %016lx V19 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V18[1], SystemContext.SystemContextAArch64->V18[0], SystemContext.SystemContextAArch64->V19[1], SystemContext.SystemContextAArch64->V19[0])); DEBUG ((EFI_D_ERROR, " V18 0x%016lx %016lx V19 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V18[1], SystemContext.SystemContextAArch64->V18[0], SystemContext.SystemContextAArch64->V19[1], SystemContext.SystemContextAArch64->V19[0]));
DEBUG ((DEBUG_ERROR, " V20 0x%016lx %016lx V21 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V20[1], SystemContext.SystemContextAArch64->V20[0], SystemContext.SystemContextAArch64->V21[1], SystemContext.SystemContextAArch64->V21[0])); DEBUG ((EFI_D_ERROR, " V20 0x%016lx %016lx V21 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V20[1], SystemContext.SystemContextAArch64->V20[0], SystemContext.SystemContextAArch64->V21[1], SystemContext.SystemContextAArch64->V21[0]));
DEBUG ((DEBUG_ERROR, " V22 0x%016lx %016lx V23 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V22[1], SystemContext.SystemContextAArch64->V22[0], SystemContext.SystemContextAArch64->V23[1], SystemContext.SystemContextAArch64->V23[0])); DEBUG ((EFI_D_ERROR, " V22 0x%016lx %016lx V23 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V22[1], SystemContext.SystemContextAArch64->V22[0], SystemContext.SystemContextAArch64->V23[1], SystemContext.SystemContextAArch64->V23[0]));
DEBUG ((DEBUG_ERROR, " V24 0x%016lx %016lx V25 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V24[1], SystemContext.SystemContextAArch64->V24[0], SystemContext.SystemContextAArch64->V25[1], SystemContext.SystemContextAArch64->V25[0])); DEBUG ((EFI_D_ERROR, " V24 0x%016lx %016lx V25 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V24[1], SystemContext.SystemContextAArch64->V24[0], SystemContext.SystemContextAArch64->V25[1], SystemContext.SystemContextAArch64->V25[0]));
DEBUG ((DEBUG_ERROR, " V26 0x%016lx %016lx V27 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V26[1], SystemContext.SystemContextAArch64->V26[0], SystemContext.SystemContextAArch64->V27[1], SystemContext.SystemContextAArch64->V27[0])); DEBUG ((EFI_D_ERROR, " V26 0x%016lx %016lx V27 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V26[1], SystemContext.SystemContextAArch64->V26[0], SystemContext.SystemContextAArch64->V27[1], SystemContext.SystemContextAArch64->V27[0]));
DEBUG ((DEBUG_ERROR, " V28 0x%016lx %016lx V29 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V28[1], SystemContext.SystemContextAArch64->V28[0], SystemContext.SystemContextAArch64->V29[1], SystemContext.SystemContextAArch64->V29[0])); DEBUG ((EFI_D_ERROR, " V28 0x%016lx %016lx V29 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V28[1], SystemContext.SystemContextAArch64->V28[0], SystemContext.SystemContextAArch64->V29[1], SystemContext.SystemContextAArch64->V29[0]));
DEBUG ((DEBUG_ERROR, " V30 0x%016lx %016lx V31 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V30[1], SystemContext.SystemContextAArch64->V30[0], SystemContext.SystemContextAArch64->V31[1], SystemContext.SystemContextAArch64->V31[0])); DEBUG ((EFI_D_ERROR, " V30 0x%016lx %016lx V31 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V30[1], SystemContext.SystemContextAArch64->V30[0], SystemContext.SystemContextAArch64->V31[1], SystemContext.SystemContextAArch64->V31[0]));
DEBUG ((DEBUG_ERROR, "\n SP 0x%016lx ELR 0x%016lx SPSR 0x%08lx FPSR 0x%08lx\n ESR 0x%08lx FAR 0x%016lx\n", SystemContext.SystemContextAArch64->SP, SystemContext.SystemContextAArch64->ELR, SystemContext.SystemContextAArch64->SPSR, SystemContext.SystemContextAArch64->FPSR, SystemContext.SystemContextAArch64->ESR, SystemContext.SystemContextAArch64->FAR)); DEBUG ((EFI_D_ERROR, "\n SP 0x%016lx ELR 0x%016lx SPSR 0x%08lx FPSR 0x%08lx\n ESR 0x%08lx FAR 0x%016lx\n", SystemContext.SystemContextAArch64->SP, SystemContext.SystemContextAArch64->ELR, SystemContext.SystemContextAArch64->SPSR, SystemContext.SystemContextAArch64->FPSR, SystemContext.SystemContextAArch64->ESR, SystemContext.SystemContextAArch64->FAR));
DEBUG ((DEBUG_ERROR, "\n ESR : EC 0x%02x IL 0x%x ISS 0x%08x\n", (SystemContext.SystemContextAArch64->ESR & 0xFC000000) >> 26, (SystemContext.SystemContextAArch64->ESR >> 25) & 0x1, SystemContext.SystemContextAArch64->ESR & 0x1FFFFFF)); DEBUG ((EFI_D_ERROR, "\n ESR : EC 0x%02x IL 0x%x ISS 0x%08x\n", (SystemContext.SystemContextAArch64->ESR & 0xFC000000) >> 26, (SystemContext.SystemContextAArch64->ESR >> 25) & 0x1, SystemContext.SystemContextAArch64->ESR & 0x1FFFFFF ));
DescribeExceptionSyndrome (SystemContext.SystemContextAArch64->ESR); DescribeExceptionSyndrome (SystemContext.SystemContextAArch64->ESR);
DEBUG ((DEBUG_ERROR, "\nStack dump:\n")); DEBUG ((EFI_D_ERROR, "\nStack dump:\n"));
for (Offset = -256; Offset < 256; Offset += 32) { for (Offset = -256; Offset < 256; Offset += 32) {
DEBUG (( DEBUG ((EFI_D_ERROR, "%c %013lx: %016lx %016lx %016lx %016lx\n",
DEBUG_ERROR,
"%c %013lx: %016lx %016lx %016lx %016lx\n",
Offset == 0 ? '>' : ' ', Offset == 0 ? '>' : ' ',
SystemContext.SystemContextAArch64->SP + Offset, SystemContext.SystemContextAArch64->SP + Offset,
*(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset), *(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset),
*(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 8), *(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 8),
*(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 16), *(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 16),
*(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 24) *(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 24)));
));
} }
ASSERT (FALSE); ASSERT (FALSE);

View File

@ -134,38 +134,22 @@ FaultStatusToString (
CHAR8 *FaultSource; CHAR8 *FaultSource;
switch (Status) { switch (Status) {
case 0x01: FaultSource = "Alignment fault"; case 0x01: FaultSource = "Alignment fault"; break;
break; case 0x02: FaultSource = "Debug event fault"; break;
case 0x02: FaultSource = "Debug event fault"; case 0x03: FaultSource = "Access Flag fault on Section"; break;
break; case 0x04: FaultSource = "Cache maintenance operation fault[2]"; break;
case 0x03: FaultSource = "Access Flag fault on Section"; case 0x05: FaultSource = "Translation fault on Section"; break;
break; case 0x06: FaultSource = "Access Flag fault on Page"; break;
case 0x04: FaultSource = "Cache maintenance operation fault[2]"; case 0x07: FaultSource = "Translation fault on Page"; break;
break; case 0x08: FaultSource = "Precise External Abort"; break;
case 0x05: FaultSource = "Translation fault on Section"; case 0x09: FaultSource = "Domain fault on Section"; break;
break; case 0x0b: FaultSource = "Domain fault on Page"; break;
case 0x06: FaultSource = "Access Flag fault on Page"; case 0x0c: FaultSource = "External abort on translation, first level"; break;
break; case 0x0d: FaultSource = "Permission fault on Section"; break;
case 0x07: FaultSource = "Translation fault on Page"; case 0x0e: FaultSource = "External abort on translation, second level"; break;
break; case 0x0f: FaultSource = "Permission fault on Page"; break;
case 0x08: FaultSource = "Precise External Abort"; case 0x16: FaultSource = "Imprecise External Abort"; break;
break; default: FaultSource = "No function"; break;
case 0x09: FaultSource = "Domain fault on Section";
break;
case 0x0b: FaultSource = "Domain fault on Page";
break;
case 0x0c: FaultSource = "External abort on translation, first level";
break;
case 0x0d: FaultSource = "Permission fault on Section";
break;
case 0x0e: FaultSource = "External abort on translation, second level";
break;
case 0x0f: FaultSource = "Permission fault on Page";
break;
case 0x16: FaultSource = "Imprecise External Abort";
break;
default: FaultSource = "No function";
break;
} }
return FaultSource; return FaultSource;
@ -207,14 +191,8 @@ DefaultExceptionHandler (
PcAdjust = 0; PcAdjust = 0;
CharCount = AsciiSPrint ( CharCount = AsciiSPrint (Buffer,sizeof (Buffer),"\n%a Exception PC at 0x%08x CPSR 0x%08x ",
Buffer, gExceptionTypeString[ExceptionType], SystemContext.SystemContextArm->PC, SystemContext.SystemContextArm->CPSR);
sizeof (Buffer),
"\n%a Exception PC at 0x%08x CPSR 0x%08x ",
gExceptionTypeString[ExceptionType],
SystemContext.SystemContextArm->PC,
SystemContext.SystemContextArm->CPSR
);
SerialPortWrite ((UINT8 *)Buffer, CharCount); SerialPortWrite ((UINT8 *)Buffer, CharCount);
if (gST->ConOut != NULL) { if (gST->ConOut != NULL) {
AsciiPrint (Buffer); AsciiPrint (Buffer);
@ -232,12 +210,12 @@ DefaultExceptionHandler (
UINT32 ItBlock; UINT32 ItBlock;
CpsrString (SystemContext.SystemContextArm->CPSR, CpsrStr); CpsrString (SystemContext.SystemContextArm->CPSR, CpsrStr);
DEBUG ((DEBUG_ERROR, "%a\n", CpsrStr)); DEBUG ((EFI_D_ERROR, "%a\n", CpsrStr));
Pdb = GetImageName (SystemContext.SystemContextArm->PC, &ImageBase, &PeCoffSizeOfHeader); Pdb = GetImageName (SystemContext.SystemContextArm->PC, &ImageBase, &PeCoffSizeOfHeader);
Offset = SystemContext.SystemContextArm->PC - ImageBase; Offset = SystemContext.SystemContextArm->PC - ImageBase;
if (Pdb != NULL) { if (Pdb != NULL) {
DEBUG ((DEBUG_ERROR, "%a\n", Pdb)); DEBUG ((EFI_D_ERROR, "%a\n", Pdb));
// //
// A PE/COFF image loads its headers into memory so the headers are // A PE/COFF image loads its headers into memory so the headers are
@ -247,13 +225,13 @@ DefaultExceptionHandler (
// you need to subtract out the size of the PE/COFF header to get // you need to subtract out the size of the PE/COFF header to get
// get the offset that matches the link map. // get the offset that matches the link map.
// //
DEBUG ((DEBUG_ERROR, "loaded at 0x%08x (PE/COFF offset) 0x%x (ELF or Mach-O offset) 0x%x", ImageBase, Offset, Offset - PeCoffSizeOfHeader)); DEBUG ((EFI_D_ERROR, "loaded at 0x%08x (PE/COFF offset) 0x%x (ELF or Mach-O offset) 0x%x", ImageBase, Offset, Offset - PeCoffSizeOfHeader));
// If we come from an image it is safe to show the instruction. We know it should not fault // If we come from an image it is safe to show the instruction. We know it should not fault
DisAsm = (UINT8 *)(UINTN)SystemContext.SystemContextArm->PC; DisAsm = (UINT8 *)(UINTN)SystemContext.SystemContextArm->PC;
ItBlock = 0; ItBlock = 0;
DisassembleInstruction (&DisAsm, (SystemContext.SystemContextArm->CPSR & BIT5) == BIT5, TRUE, &ItBlock, Buffer, sizeof (Buffer)); DisassembleInstruction (&DisAsm, (SystemContext.SystemContextArm->CPSR & BIT5) == BIT5, TRUE, &ItBlock, Buffer, sizeof (Buffer));
DEBUG ((DEBUG_ERROR, "\n%a", Buffer)); DEBUG ((EFI_D_ERROR, "\n%a", Buffer));
switch (ExceptionType) { switch (ExceptionType) {
case EXCEPT_ARM_UNDEFINED_INSTRUCTION: case EXCEPT_ARM_UNDEFINED_INSTRUCTION:
@ -267,28 +245,28 @@ DefaultExceptionHandler (
default: default:
break; break;
} }
}
}
DEBUG_CODE_END (); DEBUG_CODE_END ();
DEBUG ((DEBUG_ERROR, "\n R0 0x%08x R1 0x%08x R2 0x%08x R3 0x%08x\n", SystemContext.SystemContextArm->R0, SystemContext.SystemContextArm->R1, SystemContext.SystemContextArm->R2, SystemContext.SystemContextArm->R3)); DEBUG ((EFI_D_ERROR, "\n R0 0x%08x R1 0x%08x R2 0x%08x R3 0x%08x\n", SystemContext.SystemContextArm->R0, SystemContext.SystemContextArm->R1, SystemContext.SystemContextArm->R2, SystemContext.SystemContextArm->R3));
DEBUG ((DEBUG_ERROR, " R4 0x%08x R5 0x%08x R6 0x%08x R7 0x%08x\n", SystemContext.SystemContextArm->R4, SystemContext.SystemContextArm->R5, SystemContext.SystemContextArm->R6, SystemContext.SystemContextArm->R7)); DEBUG ((EFI_D_ERROR, " R4 0x%08x R5 0x%08x R6 0x%08x R7 0x%08x\n", SystemContext.SystemContextArm->R4, SystemContext.SystemContextArm->R5, SystemContext.SystemContextArm->R6, SystemContext.SystemContextArm->R7));
DEBUG ((DEBUG_ERROR, " R8 0x%08x R9 0x%08x R10 0x%08x R11 0x%08x\n", SystemContext.SystemContextArm->R8, SystemContext.SystemContextArm->R9, SystemContext.SystemContextArm->R10, SystemContext.SystemContextArm->R11)); DEBUG ((EFI_D_ERROR, " R8 0x%08x R9 0x%08x R10 0x%08x R11 0x%08x\n", SystemContext.SystemContextArm->R8, SystemContext.SystemContextArm->R9, SystemContext.SystemContextArm->R10, SystemContext.SystemContextArm->R11));
DEBUG ((DEBUG_ERROR, " R12 0x%08x SP 0x%08x LR 0x%08x PC 0x%08x\n", SystemContext.SystemContextArm->R12, SystemContext.SystemContextArm->SP, SystemContext.SystemContextArm->LR, SystemContext.SystemContextArm->PC)); DEBUG ((EFI_D_ERROR, " R12 0x%08x SP 0x%08x LR 0x%08x PC 0x%08x\n", SystemContext.SystemContextArm->R12, SystemContext.SystemContextArm->SP, SystemContext.SystemContextArm->LR, SystemContext.SystemContextArm->PC));
DEBUG ((DEBUG_ERROR, "DFSR 0x%08x DFAR 0x%08x IFSR 0x%08x IFAR 0x%08x\n", SystemContext.SystemContextArm->DFSR, SystemContext.SystemContextArm->DFAR, SystemContext.SystemContextArm->IFSR, SystemContext.SystemContextArm->IFAR)); DEBUG ((EFI_D_ERROR, "DFSR 0x%08x DFAR 0x%08x IFSR 0x%08x IFAR 0x%08x\n", SystemContext.SystemContextArm->DFSR, SystemContext.SystemContextArm->DFAR, SystemContext.SystemContextArm->IFSR, SystemContext.SystemContextArm->IFAR));
// Bit10 is Status[4] Bit3:0 is Status[3:0] // Bit10 is Status[4] Bit3:0 is Status[3:0]
DfsrStatus = (SystemContext.SystemContextArm->DFSR & 0xf) | ((SystemContext.SystemContextArm->DFSR >> 6) & 0x10); DfsrStatus = (SystemContext.SystemContextArm->DFSR & 0xf) | ((SystemContext.SystemContextArm->DFSR >> 6) & 0x10);
DfsrWrite = (SystemContext.SystemContextArm->DFSR & BIT11) != 0; DfsrWrite = (SystemContext.SystemContextArm->DFSR & BIT11) != 0;
if (DfsrStatus != 0x00) { if (DfsrStatus != 0x00) {
DEBUG ((DEBUG_ERROR, " %a: %a 0x%08x\n", FaultStatusToString (DfsrStatus), DfsrWrite ? "write to" : "read from", SystemContext.SystemContextArm->DFAR)); DEBUG ((EFI_D_ERROR, " %a: %a 0x%08x\n", FaultStatusToString (DfsrStatus), DfsrWrite ? "write to" : "read from", SystemContext.SystemContextArm->DFAR));
} }
IfsrStatus = (SystemContext.SystemContextArm->IFSR & 0xf) | ((SystemContext.SystemContextArm->IFSR >> 6) & 0x10); IfsrStatus = (SystemContext.SystemContextArm->IFSR & 0xf) | ((SystemContext.SystemContextArm->IFSR >> 6) & 0x10);
if (IfsrStatus != 0) { if (IfsrStatus != 0) {
DEBUG ((DEBUG_ERROR, " Instruction %a at 0x%08x\n", FaultStatusToString (SystemContext.SystemContextArm->IFSR & 0xf), SystemContext.SystemContextArm->IFAR)); DEBUG ((EFI_D_ERROR, " Instruction %a at 0x%08x\n", FaultStatusToString (SystemContext.SystemContextArm->IFSR & 0xf), SystemContext.SystemContextArm->IFAR));
} }
DEBUG ((DEBUG_ERROR, "\n")); DEBUG ((EFI_D_ERROR, "\n"));
ASSERT (FALSE); ASSERT (FALSE);
CpuDeadLoop (); // may return if executing under a debugger CpuDeadLoop (); // may return if executing under a debugger

View File

@ -53,11 +53,9 @@ GetImageName (
for (Entry = 0; Entry < DebugTableHeader->TableSize; Entry++, DebugTable++) { for (Entry = 0; Entry < DebugTableHeader->TableSize; Entry++, DebugTable++) {
if (DebugTable->NormalImage != NULL) { if (DebugTable->NormalImage != NULL) {
if ((DebugTable->NormalImage->ImageInfoType == EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL) && if ((DebugTable->NormalImage->ImageInfoType == EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL) &&
(DebugTable->NormalImage->LoadedImageProtocolInstance != NULL)) (DebugTable->NormalImage->LoadedImageProtocolInstance != NULL)) {
{
if ((Address >= (CHAR8 *)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase) && if ((Address >= (CHAR8 *)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase) &&
(Address <= ((CHAR8 *)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase + DebugTable->NormalImage->LoadedImageProtocolInstance->ImageSize))) (Address <= ((CHAR8 *)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase + DebugTable->NormalImage->LoadedImageProtocolInstance->ImageSize))) {
{
*ImageBase = (UINTN)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase; *ImageBase = (UINTN)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase;
*PeCoffSizeOfHeaders = PeCoffGetSizeOfHeaders ((VOID *)(UINTN)*ImageBase); *PeCoffSizeOfHeaders = PeCoffGetSizeOfHeaders ((VOID *)(UINTN)*ImageBase);
return PeCoffLoaderGetPdbPointer (DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase); return PeCoffLoaderGetPdbPointer (DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase);
@ -68,3 +66,4 @@ GetImageName (
return NULL; return NULL;
} }

View File

@ -1,187 +0,0 @@
/** @file
Implementation for PlatformBootManagerLib library class interfaces.
Copyright (C) 2015-2016, Red Hat, Inc.
Copyright (c) 2014 - 2019, ARM Ltd. All rights reserved.<BR>
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <Uefi.h>
#include <Guid/EventGroup.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/DevicePathLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/UefiBootManagerLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Protocol/LoadedImage.h>
#include <Protocol/PlatformBootManager.h>
/**
Register a boot option using a file GUID in the FV.
@param FileGuid The file GUID name in the FV.
@param Description The description of the boot option.
@param Attributes The attributes of the boot option.
**/
STATIC
VOID
PlatformRegisterFvBootOption (
CONST EFI_GUID *FileGuid,
CHAR16 *Description,
UINT32 Attributes
)
{
EFI_STATUS Status;
INTN OptionIndex;
EFI_BOOT_MANAGER_LOAD_OPTION NewOption;
EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions;
UINTN BootOptionCount;
MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode;
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
Status = gBS->HandleProtocol (
gImageHandle,
&gEfiLoadedImageProtocolGuid,
(VOID **)&LoadedImage
);
ASSERT_EFI_ERROR (Status);
EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid);
DevicePath = DevicePathFromHandle (LoadedImage->DeviceHandle);
ASSERT (DevicePath != NULL);
DevicePath = AppendDevicePathNode (
DevicePath,
(EFI_DEVICE_PATH_PROTOCOL *)&FileNode
);
ASSERT (DevicePath != NULL);
Status = EfiBootManagerInitializeLoadOption (
&NewOption,
LoadOptionNumberUnassigned,
LoadOptionTypeBoot,
Attributes,
Description,
DevicePath,
NULL,
0
);
ASSERT_EFI_ERROR (Status);
FreePool (DevicePath);
BootOptions = EfiBootManagerGetLoadOptions (
&BootOptionCount,
LoadOptionTypeBoot
);
OptionIndex = EfiBootManagerFindLoadOption (
&NewOption,
BootOptions,
BootOptionCount
);
if (OptionIndex == -1) {
Status = EfiBootManagerAddLoadOptionVariable (&NewOption, MAX_UINTN);
ASSERT_EFI_ERROR (Status);
}
EfiBootManagerFreeLoadOption (&NewOption);
EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount);
}
/**
Do the platform specific action before the console is connected.
Such as:
Update console variable;
Register new Driver#### or Boot####;
Signal ReadyToLock event.
**/
VOID
EFIAPI
PlatformBootManagerBeforeConsole (
VOID
)
{
//
// Signal EndOfDxe PI Event
//
EfiEventGroupSignal (&gEfiEndOfDxeEventGroupGuid);
}
/**
Do the platform specific action after the console is connected.
Such as:
Dynamically switch output mode;
Signal console ready platform customized event;
Run diagnostics like memory testing;
Connect certain devices;
Dispatch additional option roms.
**/
VOID
EFIAPI
PlatformBootManagerAfterConsole (
VOID
)
{
EFI_GUID LinuxBootFileGuid;
CopyGuid (&LinuxBootFileGuid, PcdGetPtr (PcdLinuxBootFileGuid));
if (!CompareGuid (&LinuxBootFileGuid, &gZeroGuid)) {
//
// Register LinuxBoot
//
PlatformRegisterFvBootOption (
&LinuxBootFileGuid,
L"LinuxBoot",
LOAD_OPTION_ACTIVE
);
} else {
DEBUG ((DEBUG_ERROR, "%a: PcdLinuxBootFileGuid was not set!\n", __FUNCTION__));
}
}
/**
This function is called each second during the boot manager waits the
timeout.
@param TimeoutRemain The remaining timeout.
**/
VOID
EFIAPI
PlatformBootManagerWaitCallback (
UINT16 TimeoutRemain
)
{
return;
}
/**
The function is called when no boot option could be launched,
including platform recovery options and options pointing to applications
built into firmware volumes.
If this function returns, BDS attempts to enter an infinite loop.
**/
VOID
EFIAPI
PlatformBootManagerUnableToBoot (
VOID
)
{
return;
}

View File

@ -1,58 +0,0 @@
## @file
# Implementation for PlatformBootManagerLib library class interfaces.
#
# Copyright (C) 2015-2016, Red Hat, Inc.
# Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
# Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR>
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
##
[Defines]
INF_VERSION = 0x0001001B
BASE_NAME = LinuxBootBootManagerLib
FILE_GUID = 1FA91547-DB23-4F6A-8AF8-3B9782A7F917
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
LIBRARY_CLASS = PlatformBootManagerLib|DXE_DRIVER
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = ARM AARCH64
#
[Sources]
LinuxBootBm.c
[Packages]
ArmPkg/ArmPkg.dec
MdeModulePkg/MdeModulePkg.dec
MdePkg/MdePkg.dec
ShellPkg/ShellPkg.dec
[LibraryClasses]
BaseLib
BaseMemoryLib
DebugLib
MemoryAllocationLib
PcdLib
PrintLib
UefiBootManagerLib
UefiBootServicesTableLib
UefiLib
UefiRuntimeServicesTableLib
[Pcd]
gArmTokenSpaceGuid.PcdLinuxBootFileGuid
[Guids]
gEfiEndOfDxeEventGroupGuid
gUefiShellFileGuid
gZeroGuid
[Protocols]
gEfiLoadedImageProtocolGuid

View File

@ -41,8 +41,7 @@ IsOpteePresent (
if ((ArmSmcArgs.Arg0 == OPTEE_OS_UID0) && if ((ArmSmcArgs.Arg0 == OPTEE_OS_UID0) &&
(ArmSmcArgs.Arg1 == OPTEE_OS_UID1) && (ArmSmcArgs.Arg1 == OPTEE_OS_UID1) &&
(ArmSmcArgs.Arg2 == OPTEE_OS_UID2) && (ArmSmcArgs.Arg2 == OPTEE_OS_UID2) &&
(ArmSmcArgs.Arg3 == OPTEE_OS_UID3)) (ArmSmcArgs.Arg3 == OPTEE_OS_UID3)) {
{
return TRUE; return TRUE;
} else { } else {
return FALSE; return FALSE;
@ -442,8 +441,7 @@ OpteeInvokeFunction (
InvokeFunctionArg->Params, InvokeFunctionArg->Params,
OPTEE_MAX_CALL_PARAMS, OPTEE_MAX_CALL_PARAMS,
MessageArg->Params MessageArg->Params
) != 0) ) != 0) {
{
MessageArg->Return = OPTEE_ERROR_COMMUNICATION; MessageArg->Return = OPTEE_ERROR_COMMUNICATION;
MessageArg->ReturnOrigin = OPTEE_ORIGIN_COMMUNICATION; MessageArg->ReturnOrigin = OPTEE_ORIGIN_COMMUNICATION;
} }

View File

@ -2,10 +2,9 @@
Implementation for PlatformBootManagerLib library class interfaces. Implementation for PlatformBootManagerLib library class interfaces.
Copyright (C) 2015-2016, Red Hat, Inc. Copyright (C) 2015-2016, Red Hat, Inc.
Copyright (c) 2014 - 2021, ARM Ltd. All rights reserved.<BR> Copyright (c) 2014 - 2019, ARM Ltd. All rights reserved.<BR>
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
Copyright (c) 2021, Semihalf All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
@ -20,7 +19,6 @@
#include <Library/UefiBootManagerLib.h> #include <Library/UefiBootManagerLib.h>
#include <Library/UefiLib.h> #include <Library/UefiLib.h>
#include <Library/UefiRuntimeServicesTableLib.h> #include <Library/UefiRuntimeServicesTableLib.h>
#include <Protocol/BootManagerPolicy.h>
#include <Protocol/DevicePath.h> #include <Protocol/DevicePath.h>
#include <Protocol/EsrtManagement.h> #include <Protocol/EsrtManagement.h>
#include <Protocol/GraphicsOutput.h> #include <Protocol/GraphicsOutput.h>
@ -29,7 +27,6 @@
#include <Protocol/PciIo.h> #include <Protocol/PciIo.h>
#include <Protocol/PciRootBridgeIo.h> #include <Protocol/PciRootBridgeIo.h>
#include <Protocol/PlatformBootManager.h> #include <Protocol/PlatformBootManager.h>
#include <Guid/BootDiscoveryPolicy.h>
#include <Guid/EventGroup.h> #include <Guid/EventGroup.h>
#include <Guid/NonDiscoverableDevice.h> #include <Guid/NonDiscoverableDevice.h>
#include <Guid/TtyTerm.h> #include <Guid/TtyTerm.h>
@ -91,6 +88,7 @@ STATIC PLATFORM_SERIAL_CONSOLE mSerialConsole = {
} }
}; };
#pragma pack (1) #pragma pack (1)
typedef struct { typedef struct {
USB_CLASS_DEVICE_PATH Keyboard; USB_CLASS_DEVICE_PATH Keyboard;
@ -123,6 +121,7 @@ STATIC PLATFORM_USB_KEYBOARD mUsbKeyboard = {
} }
}; };
/** /**
Check if the handle satisfies a particular condition. Check if the handle satisfies a particular condition.
@ -141,6 +140,7 @@ BOOLEAN
IN CONST CHAR16 *ReportText IN CONST CHAR16 *ReportText
); );
/** /**
Process a handle. Process a handle.
@ -181,24 +181,14 @@ FilterAndProcess (
UINTN NoHandles; UINTN NoHandles;
UINTN Idx; UINTN Idx;
Status = gBS->LocateHandleBuffer ( Status = gBS->LocateHandleBuffer (ByProtocol, ProtocolGuid,
ByProtocol, NULL /* SearchKey */, &NoHandles, &Handles);
ProtocolGuid,
NULL /* SearchKey */,
&NoHandles,
&Handles
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
// //
// This is not an error, just an informative condition. // This is not an error, just an informative condition.
// //
DEBUG (( DEBUG ((EFI_D_VERBOSE, "%a: %g: %r\n", __FUNCTION__, ProtocolGuid,
DEBUG_VERBOSE, Status));
"%a: %g: %r\n",
__FUNCTION__,
ProtocolGuid,
Status
));
return; return;
} }
@ -219,7 +209,7 @@ FilterAndProcess (
DevicePathText = Fallback; DevicePathText = Fallback;
} }
if ((Filter == NULL) || Filter (Handles[Idx], DevicePathText)) { if (Filter == NULL || Filter (Handles[Idx], DevicePathText)) {
Process (Handles[Idx], DevicePathText); Process (Handles[Idx], DevicePathText);
} }
@ -227,10 +217,10 @@ FilterAndProcess (
FreePool (DevicePathText); FreePool (DevicePathText);
} }
} }
gBS->FreePool (Handles); gBS->FreePool (Handles);
} }
/** /**
This FILTER_FUNCTION checks if a handle corresponds to a PCI display device. This FILTER_FUNCTION checks if a handle corresponds to a PCI display device.
**/ **/
@ -246,11 +236,8 @@ IsPciDisplay (
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
PCI_TYPE00 Pci; PCI_TYPE00 Pci;
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (Handle, &gEfiPciIoProtocolGuid,
Handle, (VOID**)&PciIo);
&gEfiPciIoProtocolGuid,
(VOID **)&PciIo
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
// //
// This is not an error worth reporting. // This is not an error worth reporting.
@ -258,21 +245,17 @@ IsPciDisplay (
return FALSE; return FALSE;
} }
Status = PciIo->Pci.Read ( Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, 0 /* Offset */,
PciIo, sizeof Pci / sizeof (UINT32), &Pci);
EfiPciIoWidthUint32,
0 /* Offset */,
sizeof Pci / sizeof (UINT32),
&Pci
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: %s: %r\n", __FUNCTION__, ReportText, Status)); DEBUG ((EFI_D_ERROR, "%a: %s: %r\n", __FUNCTION__, ReportText, Status));
return FALSE; return FALSE;
} }
return IS_PCI_DISPLAY (&Pci); return IS_PCI_DISPLAY (&Pci);
} }
/** /**
This FILTER_FUNCTION checks if a handle corresponds to a non-discoverable This FILTER_FUNCTION checks if a handle corresponds to a non-discoverable
USB host controller. USB host controller.
@ -288,25 +271,22 @@ IsUsbHost (
NON_DISCOVERABLE_DEVICE *Device; NON_DISCOVERABLE_DEVICE *Device;
EFI_STATUS Status; EFI_STATUS Status;
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (Handle,
Handle,
&gEdkiiNonDiscoverableDeviceProtocolGuid, &gEdkiiNonDiscoverableDeviceProtocolGuid,
(VOID **)&Device (VOID **)&Device);
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return FALSE; return FALSE;
} }
if (CompareGuid (Device->Type, &gEdkiiNonDiscoverableUhciDeviceGuid) || if (CompareGuid (Device->Type, &gEdkiiNonDiscoverableUhciDeviceGuid) ||
CompareGuid (Device->Type, &gEdkiiNonDiscoverableEhciDeviceGuid) || CompareGuid (Device->Type, &gEdkiiNonDiscoverableEhciDeviceGuid) ||
CompareGuid (Device->Type, &gEdkiiNonDiscoverableXhciDeviceGuid)) CompareGuid (Device->Type, &gEdkiiNonDiscoverableXhciDeviceGuid)) {
{
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
/** /**
This CALLBACK_FUNCTION attempts to connect a handle non-recursively, asking This CALLBACK_FUNCTION attempts to connect a handle non-recursively, asking
the matching driver to produce all first-level child handles. the matching driver to produce all first-level child handles.
@ -327,15 +307,11 @@ Connect (
NULL, // RemainingDevicePath -- produce all children NULL, // RemainingDevicePath -- produce all children
FALSE // Recursive FALSE // Recursive
); );
DEBUG (( DEBUG ((EFI_ERROR (Status) ? EFI_D_ERROR : EFI_D_VERBOSE, "%a: %s: %r\n",
EFI_ERROR (Status) ? DEBUG_ERROR : DEBUG_VERBOSE, __FUNCTION__, ReportText, Status));
"%a: %s: %r\n",
__FUNCTION__,
ReportText,
Status
));
} }
/** /**
This CALLBACK_FUNCTION retrieves the EFI_DEVICE_PATH_PROTOCOL from the This CALLBACK_FUNCTION retrieves the EFI_DEVICE_PATH_PROTOCOL from the
handle, and adds it to ConOut and ErrOut. handle, and adds it to ConOut and ErrOut.
@ -353,46 +329,27 @@ AddOutput (
DevicePath = DevicePathFromHandle (Handle); DevicePath = DevicePathFromHandle (Handle);
if (DevicePath == NULL) { if (DevicePath == NULL) {
DEBUG (( DEBUG ((EFI_D_ERROR, "%a: %s: handle %p: device path not found\n",
DEBUG_ERROR, __FUNCTION__, ReportText, Handle));
"%a: %s: handle %p: device path not found\n",
__FUNCTION__,
ReportText,
Handle
));
return; return;
} }
Status = EfiBootManagerUpdateConsoleVariable (ConOut, DevicePath, NULL); Status = EfiBootManagerUpdateConsoleVariable (ConOut, DevicePath, NULL);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG (( DEBUG ((EFI_D_ERROR, "%a: %s: adding to ConOut: %r\n", __FUNCTION__,
DEBUG_ERROR, ReportText, Status));
"%a: %s: adding to ConOut: %r\n",
__FUNCTION__,
ReportText,
Status
));
return; return;
} }
Status = EfiBootManagerUpdateConsoleVariable (ErrOut, DevicePath, NULL); Status = EfiBootManagerUpdateConsoleVariable (ErrOut, DevicePath, NULL);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG (( DEBUG ((EFI_D_ERROR, "%a: %s: adding to ErrOut: %r\n", __FUNCTION__,
DEBUG_ERROR, ReportText, Status));
"%a: %s: adding to ErrOut: %r\n",
__FUNCTION__,
ReportText,
Status
));
return; return;
} }
DEBUG (( DEBUG ((EFI_D_VERBOSE, "%a: %s: added to ConOut and ErrOut\n", __FUNCTION__,
DEBUG_VERBOSE, ReportText));
"%a: %s: added to ConOut and ErrOut\n",
__FUNCTION__,
ReportText
));
} }
STATIC STATIC
@ -443,33 +400,25 @@ PlatformRegisterFvBootOption (
FreePool (DevicePath); FreePool (DevicePath);
BootOptions = EfiBootManagerGetLoadOptions ( BootOptions = EfiBootManagerGetLoadOptions (
&BootOptionCount, &BootOptionCount, LoadOptionTypeBoot
LoadOptionTypeBoot
); );
OptionIndex = EfiBootManagerFindLoadOption ( OptionIndex = EfiBootManagerFindLoadOption (
&NewOption, &NewOption, BootOptions, BootOptionCount
BootOptions,
BootOptionCount
); );
if (OptionIndex == -1) { if (OptionIndex == -1) {
Status = EfiBootManagerAddLoadOptionVariable (&NewOption, MAX_UINTN); Status = EfiBootManagerAddLoadOptionVariable (&NewOption, MAX_UINTN);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Status = EfiBootManagerAddKeyOptionVariable ( Status = EfiBootManagerAddKeyOptionVariable (NULL,
NULL, (UINT16)NewOption.OptionNumber, 0, Key, NULL);
(UINT16)NewOption.OptionNumber,
0,
Key,
NULL
);
ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED); ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED);
} }
EfiBootManagerFreeLoadOption (&NewOption); EfiBootManagerFreeLoadOption (&NewOption);
EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount); EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount);
} }
STATIC STATIC
VOID VOID
GetPlatformOptions ( GetPlatformOptions (
@ -485,15 +434,11 @@ GetPlatformOptions (
UINTN Index; UINTN Index;
UINTN BootCount; UINTN BootCount;
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (&gPlatformBootManagerProtocolGuid, NULL,
&gPlatformBootManagerProtocolGuid, (VOID **)&PlatformBootManager);
NULL,
(VOID **)&PlatformBootManager
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return; return;
} }
Status = PlatformBootManager->GetPlatformBootOptionsAndKeys ( Status = PlatformBootManager->GetPlatformBootOptionsAndKeys (
&BootCount, &BootCount,
&BootOptions, &BootOptions,
@ -502,7 +447,6 @@ GetPlatformOptions (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return; return;
} }
// //
// Fetch the existent boot options. If there are none, CurrentBootCount // Fetch the existent boot options. If there are none, CurrentBootCount
// will be zeroed. // will be zeroed.
@ -544,16 +488,10 @@ GetPlatformOptions (
MAX_UINTN MAX_UINTN
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG (( DEBUG ((DEBUG_ERROR, "%a: failed to register \"%s\": %r\n",
DEBUG_ERROR, __FUNCTION__, BootOptions[Index].Description, Status));
"%a: failed to register \"%s\": %r\n",
__FUNCTION__,
BootOptions[Index].Description,
Status
));
continue; continue;
} }
BootOptionNumber = BootOptions[Index].OptionNumber; BootOptionNumber = BootOptions[Index].OptionNumber;
} }
@ -572,16 +510,10 @@ GetPlatformOptions (
NULL NULL
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG (( DEBUG ((DEBUG_ERROR, "%a: failed to register hotkey for \"%s\": %r\n",
DEBUG_ERROR, __FUNCTION__, BootOptions[Index].Description, Status));
"%a: failed to register hotkey for \"%s\": %r\n",
__FUNCTION__,
BootOptions[Index].Description,
Status
));
} }
} }
EfiBootManagerFreeLoadOptions (CurrentBootOptions, CurrentBootOptionCount); EfiBootManagerFreeLoadOptions (CurrentBootOptions, CurrentBootOptionCount);
EfiBootManagerFreeLoadOptions (BootOptions, BootCount); EfiBootManagerFreeLoadOptions (BootOptions, BootCount);
FreePool (BootKeys); FreePool (BootKeys);
@ -619,27 +551,19 @@ PlatformRegisterOptionsAndKeys (
Status = EfiBootManagerGetBootManagerMenu (&BootOption); Status = EfiBootManagerGetBootManagerMenu (&BootOption);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Status = EfiBootManagerAddKeyOptionVariable ( Status = EfiBootManagerAddKeyOptionVariable (
NULL, NULL, (UINT16) BootOption.OptionNumber, 0, &F2, NULL
(UINT16)BootOption.OptionNumber,
0,
&F2,
NULL
); );
ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED); ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED);
Status = EfiBootManagerAddKeyOptionVariable ( Status = EfiBootManagerAddKeyOptionVariable (
NULL, NULL, (UINT16) BootOption.OptionNumber, 0, &Esc, NULL
(UINT16)BootOption.OptionNumber,
0,
&Esc,
NULL
); );
ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED); ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED);
} }
// //
// BDS Platform Functions // BDS Platform Functions
// //
/** /**
Do the platform init, can be customized by OEM/IBV Do the platform init, can be customized by OEM/IBV
Possible things that can be done in PlatformBootManagerBeforeConsole: Possible things that can be done in PlatformBootManagerBeforeConsole:
@ -699,45 +623,27 @@ PlatformBootManagerBeforeConsole (
// //
// Add the hardcoded short-form USB keyboard device path to ConIn. // Add the hardcoded short-form USB keyboard device path to ConIn.
// //
EfiBootManagerUpdateConsoleVariable ( EfiBootManagerUpdateConsoleVariable (ConIn,
ConIn, (EFI_DEVICE_PATH_PROTOCOL *)&mUsbKeyboard, NULL);
(EFI_DEVICE_PATH_PROTOCOL *)&mUsbKeyboard,
NULL
);
// //
// Add the hardcoded serial console device path to ConIn, ConOut, ErrOut. // Add the hardcoded serial console device path to ConIn, ConOut, ErrOut.
// //
STATIC_ASSERT ( STATIC_ASSERT (FixedPcdGet8 (PcdDefaultTerminalType) == 4,
FixedPcdGet8 (PcdDefaultTerminalType) == 4, "PcdDefaultTerminalType must be TTYTERM");
"PcdDefaultTerminalType must be TTYTERM" STATIC_ASSERT (FixedPcdGet8 (PcdUartDefaultParity) != 0,
); "PcdUartDefaultParity must be set to an actual value, not 'default'");
STATIC_ASSERT ( STATIC_ASSERT (FixedPcdGet8 (PcdUartDefaultStopBits) != 0,
FixedPcdGet8 (PcdUartDefaultParity) != 0, "PcdUartDefaultStopBits must be set to an actual value, not 'default'");
"PcdUartDefaultParity must be set to an actual value, not 'default'"
);
STATIC_ASSERT (
FixedPcdGet8 (PcdUartDefaultStopBits) != 0,
"PcdUartDefaultStopBits must be set to an actual value, not 'default'"
);
CopyGuid (&mSerialConsole.TermType.Guid, &gEfiTtyTermGuid); CopyGuid (&mSerialConsole.TermType.Guid, &gEfiTtyTermGuid);
EfiBootManagerUpdateConsoleVariable ( EfiBootManagerUpdateConsoleVariable (ConIn,
ConIn, (EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole, NULL);
(EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole, EfiBootManagerUpdateConsoleVariable (ConOut,
NULL (EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole, NULL);
); EfiBootManagerUpdateConsoleVariable (ErrOut,
EfiBootManagerUpdateConsoleVariable ( (EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole, NULL);
ConOut,
(EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole,
NULL
);
EfiBootManagerUpdateConsoleVariable (
ErrOut,
(EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole,
NULL
);
// //
// Register platform-specific boot options and keyboard shortcuts. // Register platform-specific boot options and keyboard shortcuts.
@ -759,11 +665,8 @@ HandleCapsules (
DEBUG ((DEBUG_INFO, "%a: processing capsules ...\n", __FUNCTION__)); DEBUG ((DEBUG_INFO, "%a: processing capsules ...\n", __FUNCTION__));
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (&gEsrtManagementProtocolGuid, NULL,
&gEsrtManagementProtocolGuid, (VOID **)&EsrtManagement);
NULL,
(VOID **)&EsrtManagement
);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
EsrtManagement->SyncEsrtFmp (); EsrtManagement->SyncEsrtFmp ();
} }
@ -773,22 +676,14 @@ HandleCapsules (
// //
HobPointer.Raw = GetHobList (); HobPointer.Raw = GetHobList ();
NeedReset = FALSE; NeedReset = FALSE;
while ((HobPointer.Raw = GetNextHob ( while ((HobPointer.Raw = GetNextHob (EFI_HOB_TYPE_UEFI_CAPSULE,
EFI_HOB_TYPE_UEFI_CAPSULE, HobPointer.Raw)) != NULL) {
HobPointer.Raw
)) != NULL)
{
CapsuleHeader = (VOID *)(UINTN)HobPointer.Capsule->BaseAddress; CapsuleHeader = (VOID *)(UINTN)HobPointer.Capsule->BaseAddress;
Status = ProcessCapsuleImage (CapsuleHeader); Status = ProcessCapsuleImage (CapsuleHeader);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG (( DEBUG ((DEBUG_ERROR, "%a: failed to process capsule %p - %r\n",
DEBUG_ERROR, __FUNCTION__, CapsuleHeader, Status));
"%a: failed to process capsule %p - %r\n",
__FUNCTION__,
CapsuleHeader,
Status
));
return; return;
} }
@ -797,130 +692,17 @@ HandleCapsules (
} }
if (NeedReset) { if (NeedReset) {
DEBUG (( DEBUG ((DEBUG_WARN, "%a: capsule update successful, resetting ...\n",
DEBUG_WARN, __FUNCTION__));
"%a: capsule update successful, resetting ...\n",
__FUNCTION__
));
gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
CpuDeadLoop(); CpuDeadLoop();
} }
} }
#define VERSION_STRING_PREFIX L"Tianocore/EDK2 firmware version " #define VERSION_STRING_PREFIX L"Tianocore/EDK2 firmware version "
/**
This functions checks the value of BootDiscoverPolicy variable and
connect devices of class specified by that variable. Then it refreshes
Boot order for newly discovered boot device.
@retval EFI_SUCCESS Devices connected successfully or connection
not required.
@retval others Return values from GetVariable(), LocateProtocol()
and ConnectDeviceClass().
**/
STATIC
EFI_STATUS
BootDiscoveryPolicyHandler (
VOID
)
{
EFI_STATUS Status;
UINT32 DiscoveryPolicy;
UINT32 DiscoveryPolicyOld;
UINTN Size;
EFI_BOOT_MANAGER_POLICY_PROTOCOL *BMPolicy;
EFI_GUID *Class;
Size = sizeof (DiscoveryPolicy);
Status = gRT->GetVariable (
BOOT_DISCOVERY_POLICY_VAR,
&gBootDiscoveryPolicyMgrFormsetGuid,
NULL,
&Size,
&DiscoveryPolicy
);
if (Status == EFI_NOT_FOUND) {
DiscoveryPolicy = PcdGet32 (PcdBootDiscoveryPolicy);
Status = PcdSet32S (PcdBootDiscoveryPolicy, DiscoveryPolicy);
if (Status == EFI_NOT_FOUND) {
return EFI_SUCCESS;
} else if (EFI_ERROR (Status)) {
return Status;
}
} else if (EFI_ERROR (Status)) {
return Status;
}
if (DiscoveryPolicy == BDP_CONNECT_MINIMAL) {
return EFI_SUCCESS;
}
switch (DiscoveryPolicy) {
case BDP_CONNECT_NET:
Class = &gEfiBootManagerPolicyNetworkGuid;
break;
case BDP_CONNECT_ALL:
Class = &gEfiBootManagerPolicyConnectAllGuid;
break;
default:
DEBUG ((
DEBUG_INFO,
"%a - Unexpected DiscoveryPolicy (0x%x). Run Minimal Discovery Policy\n",
__FUNCTION__,
DiscoveryPolicy
));
return EFI_SUCCESS;
}
Status = gBS->LocateProtocol (
&gEfiBootManagerPolicyProtocolGuid,
NULL,
(VOID **)&BMPolicy
);
if (EFI_ERROR (Status)) {
DEBUG ((
DEBUG_INFO,
"%a - Failed to locate gEfiBootManagerPolicyProtocolGuid."
"Driver connect will be skipped.\n",
__FUNCTION__
));
return Status;
}
Status = BMPolicy->ConnectDeviceClass (BMPolicy, Class);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a - ConnectDeviceClass returns - %r\n", __FUNCTION__, Status));
return Status;
}
//
// Refresh Boot Options if Boot Discovery Policy has been changed
//
Size = sizeof (DiscoveryPolicyOld);
Status = gRT->GetVariable (
BOOT_DISCOVERY_POLICY_OLD_VAR,
&gBootDiscoveryPolicyMgrFormsetGuid,
NULL,
&Size,
&DiscoveryPolicyOld
);
if ((Status == EFI_NOT_FOUND) || (DiscoveryPolicyOld != DiscoveryPolicy)) {
EfiBootManagerRefreshAllBootOption ();
Status = gRT->SetVariable (
BOOT_DISCOVERY_POLICY_OLD_VAR,
&gBootDiscoveryPolicyMgrFormsetGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
sizeof (DiscoveryPolicyOld),
&DiscoveryPolicy
);
}
return EFI_SUCCESS;
}
/** /**
Do the platform specific action after the console is ready Do the platform specific action after the console is ready
Possible things that can be done in PlatformBootManagerAfterConsole: Possible things that can be done in PlatformBootManagerAfterConsole:
@ -953,42 +735,24 @@ PlatformBootManagerAfterConsole (
Status = BootLogoEnableLogo (); Status = BootLogoEnableLogo ();
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
if (FirmwareVerLength > 0) { if (FirmwareVerLength > 0) {
Print ( Print (VERSION_STRING_PREFIX L"%s\n",
VERSION_STRING_PREFIX L"%s\n", PcdGetPtr (PcdFirmwareVersionString));
PcdGetPtr (PcdFirmwareVersionString)
);
} }
Print (L"Press ESCAPE for boot options "); Print (L"Press ESCAPE for boot options ");
} else if (FirmwareVerLength > 0) { } else if (FirmwareVerLength > 0) {
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (gST->ConsoleOutHandle,
gST->ConsoleOutHandle, &gEfiGraphicsOutputProtocolGuid, (VOID **)&GraphicsOutput);
&gEfiGraphicsOutputProtocolGuid,
(VOID **)&GraphicsOutput
);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
PosX = (GraphicsOutput->Mode->Info->HorizontalResolution - PosX = (GraphicsOutput->Mode->Info->HorizontalResolution -
(StrLen (VERSION_STRING_PREFIX) + FirmwareVerLength) * (StrLen (VERSION_STRING_PREFIX) + FirmwareVerLength) *
EFI_GLYPH_WIDTH) / 2; EFI_GLYPH_WIDTH) / 2;
PosY = 0; PosY = 0;
PrintXY ( PrintXY (PosX, PosY, NULL, NULL, VERSION_STRING_PREFIX L"%s",
PosX, PcdGetPtr (PcdFirmwareVersionString));
PosY,
NULL,
NULL,
VERSION_STRING_PREFIX L"%s",
PcdGetPtr (PcdFirmwareVersionString)
);
} }
} }
//
// Connect device specified by BootDiscoverPolicy variable and
// refresh Boot order for newly discovered boot devices
//
BootDiscoveryPolicyHandler ();
// //
// On ARM, there is currently no reason to use the phased capsule // On ARM, there is currently no reason to use the phased capsule
// update approach where some capsules are dispatched before EndOfDxe // update approach where some capsules are dispatched before EndOfDxe
@ -1063,10 +827,8 @@ PlatformBootManagerUnableToBoot (
// //
// Record the total number of boot configured boot options // Record the total number of boot configured boot options
// //
BootOptions = EfiBootManagerGetLoadOptions ( BootOptions = EfiBootManagerGetLoadOptions (&OldBootOptionCount,
&OldBootOptionCount, LoadOptionTypeBoot);
LoadOptionTypeBoot
);
EfiBootManagerFreeLoadOptions (BootOptions, OldBootOptionCount); EfiBootManagerFreeLoadOptions (BootOptions, OldBootOptionCount);
// //
@ -1078,10 +840,8 @@ PlatformBootManagerUnableToBoot (
// //
// Record the updated number of boot configured boot options // Record the updated number of boot configured boot options
// //
BootOptions = EfiBootManagerGetLoadOptions ( BootOptions = EfiBootManagerGetLoadOptions (&NewBootOptionCount,
&NewBootOptionCount, LoadOptionTypeBoot);
LoadOptionTypeBoot
);
EfiBootManagerFreeLoadOptions (BootOptions, NewBootOptionCount); EfiBootManagerFreeLoadOptions (BootOptions, NewBootOptionCount);
// //
@ -1093,11 +853,8 @@ PlatformBootManagerUnableToBoot (
// //
if (!PcdGetBool (PcdEmuVariableNvModeEnable)) { if (!PcdGetBool (PcdEmuVariableNvModeEnable)) {
if (NewBootOptionCount != OldBootOptionCount) { if (NewBootOptionCount != OldBootOptionCount) {
DEBUG (( DEBUG ((DEBUG_WARN, "%a: rebooting after refreshing all boot options\n",
DEBUG_WARN, __FUNCTION__));
"%a: rebooting after refreshing all boot options\n",
__FUNCTION__
));
gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
} }
} }

Some files were not shown because too many files have changed in this diff Show More