Base System Architecture (BSA) specification describes a hardware system architecture based on the Arm 64-bit architecture. System software such as operating systems, hypervisors, and firmware rely on this. It addresses PE features and key aspects of system architecture.
For more information, see BSA specification
BSA Architecture Compliance Suite (ACS) is a collection of self-checking, portable C-based tests. This suite includes a set of examples of the invariant behaviors that are provided by the BSA specification, so that you can verify if these behaviour have been interpreted correctly. Most of the tests are executed from UEFI (Unified Extensible Firmware Interface) Shell by executing the BSA UEFI shell application. A few tests are executed by running the BSA ACS Linux application which in turn depends on the BSA ACS Linux kernel module.
- Code quality: v1.0.4
- The tests are written for version 1.0 of the BSA specification.
- The compliance suite is not a substitute for design verification.
- To review the BSA ACS logs, Arm licensees can contact Arm directly through their partner managers.
- To pick up the release version of the code, checkout the corresponding tag from the main branch.
- To get the latest version of the code with bug fixes and new features, use the main branch.
- For information on the test scenarios currently implemented for platform using Device tree, see Scenario Document.
- For information on the test scenarios currently implemented for platform using ACPI table, see Scenario Document.
Bare-metal reference code is added as part of this release. For more information, see
- Arm BSA ACS Bare-metal User Guide.
- Bare-metal Code.
Note: The Baremetal PCIe enumeration code provided as part of the BSA ACS should be used and should not be replaced. This code is vital in analyzing of the test result.
Prebuilt images for each release are available in the prebuilt_images folder of the main branch. You can choose to use these images or build your own image by following the steps below. If you choose to use the prebuilt image, see the Test suite execution section below for details on how to run the application.
Before you start the ACS build, ensure that the following requirements are met.
- Any mainstream Linux-based OS distribution running on a x86 or AArch64 machine.
- git clone the EDK2 tree. Recommended edk2 tag is edk2-stable202208
- git clone the EDK2 port of libc to local <edk2_path>.
- GCC 7.5 or a later toolchain for Linux from here.
- Install the build prerequisite packages to build EDK2.
Note: - The details of the packages are beyond the scope of this document.
- GCC 7.5 is recommended toolchain, build issues are observed with toolchain version 10.xx and above.
- cd local_edk2_path
- git submodule update --init --recursive
- git clone https://github.com/ARM-software/bsa-acs.git ShellPkg/Application/bsa-acs
- Add the following to the [LibraryClasses.common] section in ShellPkg/ShellPkg.dsc
BsaValLib|ShellPkg/Application/bsa-acs/val/BsaValLib.inf BsaPalLib|ShellPkg/Application/bsa-acs/platform/pal_uefi_acpi/BsaPalLib.inf
- Add the following in the [components] section of ShellPkg/ShellPkg.dsc
ShellPkg/Application/bsa-acs/uefi_app/BsaAcs.inf
- cd local_edk2_path
- git submodule update --init --recursive
- git clone https://github.com/ARM-software/bsa-acs.git ShellPkg/Application/bsa-acs
- Add the following to the [LibraryClasses.common] section in ShellPkg/ShellPkg.dsc
FdtLib|EmbeddedPkg/Library/FdtLib/FdtLib.inf BsaValLib|ShellPkg/Application/bsa-acs/val/BsaValLib.inf BsaPalLib|ShellPkg/Application/bsa-acs/platform/pal_uefi_dt/BsaPalLib.inf
- Add the following in the [components] section of ShellPkg/ShellPkg.dsc
ShellPkg/Application/bsa-acs/uefi_app/BsaAcs.inf
- In IR systems, ACS efi application runs on top of efi shell which runs on u-boot as efi payload.
- Below change in edk2 code MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.c is required before compiling for IR system.
-Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &gHiiConfigRouting); -ASSERT_EFI_ERROR (Status); +//Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &gHiiConfigRouting); +//ASSERT_EFI_ERROR (Status);
- export GCC49_AARCH64_PREFIX= GCC7.5 toolchain path pointing to /bin/aarch64-linux-gnu- in case of x86 machine.
For an AArch64 build it should point to /usr/bin/ - export PACKAGES_PATH= path pointing to edk2-libc
- source edksetup.sh
- make -C BaseTools/Source/C
- source ShellPkg/Application/bsa-acs/tools/scripts/acsbuild.sh
The EFI executable file is generated at <edk2_path>/Build/Shell/DEBUG_GCC49/AARCH64/Bsa.efi
- If the system supports LPIs (Interrupt ID > 8192) then Firmware should support installation of handler for LPI interrupts.
- If you are using edk2, change the ArmGic driver in the ArmPkg to support installation of handler for LPIs.
- Add the following in edk2/ArmPkg/Drivers/ArmGic/GicV3/ArmGicV3Dxe.c
- After [#define ARM_GIC_DEFAULT_PRIORITY 0x80] +#define ARM_GIC_MAX_NUM_INTERRUPT 16384 - Change this in GicV3DxeInitialize function. -mGicNumInterrupts = ArmGicGetMaxNumInterrupts (mGicDistributorBase); +mGicNumInterrupts = ARM_GIC_MAX_NUM_INTERRUPT;
The execution of the compliance suite varies depending on the test environment. The following steps assume that the test suite is invoked through the ACS UEFI shell application.
On a system where a USB port is available and functional, perform the following steps:
- Copy 'Bsa.efi' and 'Shell.efi' to a USB Flash drive.
- Boot the system to U-Boot shell.
- Plug in the USB flash drive to one of the functional USB ports on the system.
- To determine the file system number of the plugged-in USB drive, execute command
usb start
- Copy the 'Shell.efi' to memory location using the command
Syntax: fatload usb <dev_num> ${kernel_addr_r} Shell.efi
Eg: fatload usb 0 ${kernel_addr_r} Shell.efi
This boots the system to UEFI Shell. - To determine the file system number of the plugged-in USB drive, execute 'map -r' command.
- Type 'fs' where '' is replaced by the number determined in step 5.
- To start the compliance tests, run the executable Bsa.efi with the appropriate parameters.
- Copy the UART console output to a log file. Note: 'Shell.efi' is available in the pebuilt_images/IR
On an emulation environment with secondary storage, perform the following steps:
- Create an image file which contains the 'Bsa.efi' file. For example:
- mkfs.vfat -C -n HD0 hda.img 2097152
- sudo mount -o rw,loop=/dev/loop0,uid=`whoami`,gid=`whoami` hda.img /mnt/bsa In case loop0 is busy, please specify the one that is free.
- sudo cp "/Bsa.efi" /mnt/bsa/
- sudo umount /mnt/bsa
- Load the image file to the secondary storage using a backdoor. The steps to load the image file are emulation environment-specific and beyond the scope of this document.
- Boot the system to UEFI shell.
- To determine the file system number of the secondary storage, execute 'map -r' command.
- Type 'fs' where '' is replaced by the number determined in step 4.
- To start the compliance tests, run the executable Bsa.efi with the appropriate parameters.
- Copy the UART console output to a log file for analysis and certification.
- For information on the BSA uefi shell application parameters, see the User Guide.
On an emulation platform where secondary storage is not available, perform the following steps:
- Add the path to 'Bsa.efi' file in the UEFI FD file.
- Build UEFI image including the UEFI Shell.
- Boot the system to UEFI shell.
- Run the executable 'Bsa.efi' to start the compliance tests. For details about the parameters,see the User Guide.
- Copy the UART console output to a log file for analysis and certification.
Certain Peripheral, PCIe and Memory map tests require Linux operating system.This chapter provides information on building and executing these tests from the Linux application.
This section lists the porting and build steps for the kernel module. The patch for the kernel tree and the Linux PAL are hosted separately on linux-acs repo
- Linux kernel source version 5.11, 5.13, 5.15, 6.0.
- Linaro GCC tool chain 7.5 or above.
- Build environment for AArch64 Linux kernel.
NOTE: - Linux version 6.0 is recommened version.
- GCC 7.5 is recommended toolchain, build issues are observed with toolchain version 10.xx and above.
- git clone https://git.gitlab.arm.com/linux-arm/linux-acs.git bsa-acs-drv
- git clone https://github.com/ARM-software/bsa-acs.git bsa-acs
- git clone https://github.com/torvalds/linux.git -b v6.0
- export CROSS_COMPILE=<GCC7.5 toolchain path> pointing to /bin/aarch64-linux-gnu-
- git apply <local_dir>/bsa-acs-drv/kernel/src/0001-BSA-ACS-Linux-6.0.patch to your kernel source tree.
- make ARCH=arm64 defconfig && make -j $(nproc) ARCH=arm64
NOTE: The steps mentions Linux version 6.0, as it is latest version which is verified at ACS end.
- cd <local_dir>/bsa-acs-drv/files
- export CROSS_COMPILE=/bin/aarch64-linux-gnu-
- export KERNEL_SRC=
- ./setup.sh <local_dir/bsa-acs>
- ./linux_bsa_acs.sh
Successful completion of above steps will generate bsa_acs.ko
- cd /linux_app/bsa-acs-app
- export CROSS_COMPILE=/bin/aarch64-linux-gnu-
- make
Successful completion of above steps will generate executable file bsa
Before the BSA ACS Linux application can be run, load the BSA ACS kernel module using the insmod command.
shell> insmod bsa_acs.ko
shell> ./bsa
- For information on the BSA Linux application parameters, see the User Guide.
The Arm SystemReady ACS test suite may run at a higher privilege level. An attacker may utilize these tests to elevate the privilege which can potentially reveal the platform security assets. To prevent the leakage of Secure information, Arm strongly recommends that you run the ACS test suite only on development platforms. If it is run on production systems, the system should be scrubbed after running the test suite.
- ITS rules are available only for systems that present firmware compliant to SBBR.
- Some PCIe and Exerciser test are dependent on PCIe features supported by the test system.
Please fill the required API's with test system information.
- pal_pcie_p2p_support : If the test system PCIe supports peer to peer transaction.
- pal_pcie_is_cache_present : If the test system supports PCIe address translation cache.
- pal_pcie_get_legacy_ir_map : Fill system legacy ir map Below exerciser capabilities are required by exerciser test.
- MSI-X interrupt generation.
- Incoming Transaction Monitoring(order, type).
- Initiating transacions from and to the exerciser.
- Ability to check on BDF and register address seen for each configuration address along with access type.
BSA Spec Version | BSA ACS Version | BSA Tag ID | Pre-Si Support |
---|---|---|---|
BSA v1.0 | v1.0.4 | v23.03_REL1.0.4 | Yes |
BSA v1.0 | v1.0.3 | v23.01_REL1.0.3 | No |
BSA v1.0 | v1.0.2 | v22.10_REL1.0.2 | No |
BSA v1.0 | v1.0.1 | v22.06_REL1.0.1 | No |
BSA v1.0 | v1.0 | v21.09_REL1.0 | No |
BSA ACS is distributed under Apache v2.0 License.
- For feedback, use the GitHub Issue Tracker that is associated with this repository.
- For support, send an email to "[email protected]" with details.
- Arm licensees may contact Arm directly through their partner managers.
- Arm welcomes code contributions through GitHub pull requests. See the GitHub documentation on how to raise pull requests.
Copyright (c) 2021-2023, Arm Limited and Contributors. All rights reserved.