Merge tag 'efi-2022-04-rc1-3' of https://source.denx.de/u-boot/custodians/u-boot-efi
Pull request for efi-2022-04-rc1-3 Documentation: * update Nokia RX-51 documentation and move it to rst * describe boot switch settings for HiFive Unmatched board UEFI: * fix the checking of images hashes and signatures * provide the RISCV_EFI_BOOT_PROTOCOL
This commit is contained in:
@@ -4,5 +4,5 @@ S: Maintained
|
|||||||
F: board/nokia/rx51/
|
F: board/nokia/rx51/
|
||||||
F: include/configs/nokia_rx51.h
|
F: include/configs/nokia_rx51.h
|
||||||
F: configs/nokia_rx51_defconfig
|
F: configs/nokia_rx51_defconfig
|
||||||
F: doc/README.nokia_rx51
|
F: doc/board/nokia/rx51.rst
|
||||||
F: test/nokia_rx51_test.sh
|
F: test/nokia_rx51_test.sh
|
||||||
|
@@ -1,96 +0,0 @@
|
|||||||
Board: Nokia RX-51 aka N900
|
|
||||||
|
|
||||||
This board definition results in a u-boot.bin which can be chainloaded
|
|
||||||
from NOLO in qemu or on a real N900. It does very little hardware config
|
|
||||||
because NOLO has already configured the board. Only needed is enabling
|
|
||||||
internal eMMC memory via twl4030 regulator which is not enabled by NOLO.
|
|
||||||
|
|
||||||
NOLO is expecting a kernel image and will treat any image it finds in
|
|
||||||
onenand as such. This u-boot is intended to be flashed to the N900 like
|
|
||||||
a kernel. In order to transparently boot the original kernel, it will be
|
|
||||||
appended to u-boot.bin at 0x40000. NOLO will load the entire image into
|
|
||||||
(random) memory and execute u-boot, which saves hw revision, boot reason
|
|
||||||
and boot mode ATAGs set by NOLO. Then the bootscripts will attempt to load
|
|
||||||
uImage, zImage or boot.scr from a fat or ext2/3/4 filesystem on external
|
|
||||||
SD card or internal eMMC memory. If this fails or keyboard is closed then
|
|
||||||
the appended kernel image will be booted using some generated and some
|
|
||||||
stored ATAGs (see boot order).
|
|
||||||
|
|
||||||
For generating combined image of u-boot and kernel (either in uImage or zImage
|
|
||||||
format) there is a simple script called u-boot-gen-combined. It is available in
|
|
||||||
following repository:
|
|
||||||
|
|
||||||
https://github.com/pali/u-boot-maemo
|
|
||||||
|
|
||||||
There is support for hardware watchdog. Hardware watchdog is started by
|
|
||||||
NOLO so u-boot must kick watchdog to prevent reboot device (but not very
|
|
||||||
often, max every 2 seconds). There is also support for framebuffer display
|
|
||||||
output with ANSI escape codes and the N900 HW keyboard input.
|
|
||||||
|
|
||||||
When U-Boot is starting it enable IBE bit in Auxiliary Control Register,
|
|
||||||
which is needed for Thumb-2 ISA support. It is workaround for errata 430973.
|
|
||||||
|
|
||||||
Default boot order:
|
|
||||||
|
|
||||||
* 0. if keyboard is closed boot automatically attached kernel image
|
|
||||||
* 1. try boot from external SD card
|
|
||||||
* 2. try boot from internal eMMC memory
|
|
||||||
* 3. try boot from attached kernel image
|
|
||||||
|
|
||||||
Boot from SD or eMMC in this order:
|
|
||||||
|
|
||||||
* 1.
|
|
||||||
* 1.1 find boot.scr on first fat partition
|
|
||||||
* 1.2 find uImage on first fat partition
|
|
||||||
* 1.3 find zImage on first fat partition
|
|
||||||
* 1.4 same order for 2. - 4. fat partition
|
|
||||||
* 2. same as 1. but for ext2/3 partition
|
|
||||||
* 3. same as 1. but for ext4 partition
|
|
||||||
|
|
||||||
|
|
||||||
Available additional commands/variables:
|
|
||||||
|
|
||||||
* run sdboot - Boot from external SD card (see boot order)
|
|
||||||
* run emmcboot - Boot from internal eMMC memory (see boot order)
|
|
||||||
* run attachboot - Boot attached kernel image (attached to U-Boot binary)
|
|
||||||
|
|
||||||
* run scriptload - Load boot script ${mmcscriptfile}
|
|
||||||
* run scriptboot - Run loaded boot script
|
|
||||||
* run kernload - Load kernel image ${mmckernfile}
|
|
||||||
* run initrdload - Load initrd image ${mmcinitrdfile}
|
|
||||||
* run kernboot - Boot loaded kernel image
|
|
||||||
* run kerninitrdboot - Boot loaded kernel image with loaded initrd image
|
|
||||||
|
|
||||||
* run trymmcscriptboot - Try to load and boot script ${mmcscriptfile}
|
|
||||||
* run trymmckernboot - Try to load and boot kernel image ${mmckernfile}
|
|
||||||
* run trymmckerninitrdboot - Try to load and boot kernel image ${mmckernfile}
|
|
||||||
with initrd image ${mmcinitrdfile}
|
|
||||||
|
|
||||||
Additional variables for loading files from mmc:
|
|
||||||
|
|
||||||
* mmc ${mmcnum} (0 - external, 1 - internal)
|
|
||||||
* partition number ${mmcpart} (1 - 4)
|
|
||||||
* parition type ${mmctype} (fat, ext2, ext4)
|
|
||||||
|
|
||||||
Additional variables for booting kernel:
|
|
||||||
|
|
||||||
* setup_omap_atag - Add OMAP table into atags structure (needs maemo kernel)
|
|
||||||
* setup_console_atag - Enable serial console in OMAP table
|
|
||||||
* setup_boot_reason_atag - Change boot reason in OMAP table
|
|
||||||
* setup_boot_mode_atag - Change boot mode in OMAP table
|
|
||||||
|
|
||||||
Variable setup_omap_atag is automatically set when booting attached kernel.
|
|
||||||
When variable setup_omap_atag is set, variable setup_console_atag is unset
|
|
||||||
and u-boot standard output is set to serial then setup_console_atag is
|
|
||||||
automatically set to 1. So output from Maemo kernel would go to serial port.
|
|
||||||
|
|
||||||
UBIFS support:
|
|
||||||
|
|
||||||
UBIFS support is disabled, because U-Boot image is too big and cannot be
|
|
||||||
flashed with attached zImage to RX-51 kernel nand area. For enabling UBIFS
|
|
||||||
support add following lines into file configs/nokia_rx51_defconfig
|
|
||||||
|
|
||||||
CONFIG_CMD_UBI=y
|
|
||||||
CONFIG_CMD_UBIFS=y
|
|
||||||
CONFIG_MTD_UBI_FASTMAP=y
|
|
||||||
CONFIG_MTD_UBI_FASTMAP_AUTOCONVERT=1
|
|
@@ -22,6 +22,7 @@ Board-specific doc
|
|||||||
intel/index
|
intel/index
|
||||||
kontron/index
|
kontron/index
|
||||||
microchip/index
|
microchip/index
|
||||||
|
nokia/index
|
||||||
nxp/index
|
nxp/index
|
||||||
openpiton/index
|
openpiton/index
|
||||||
qualcomm/index
|
qualcomm/index
|
||||||
|
9
doc/board/nokia/index.rst
Normal file
9
doc/board/nokia/index.rst
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
.. SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
|
Nokia
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
rx51
|
162
doc/board/nokia/rx51.rst
Normal file
162
doc/board/nokia/rx51.rst
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
.. SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
|
Nokia RX-51 aka N900
|
||||||
|
====================
|
||||||
|
|
||||||
|
The ``nokia_rx51_defconfig`` configuration file results in a ``u-boot.bin``
|
||||||
|
which can be chainloaded by the Nokia second stage bootloader (NOLO) in QEMU or
|
||||||
|
on a real N900. It does very little hardware configuration because NOLO has
|
||||||
|
already configured the board. It is only needed to enable the internal eMMC
|
||||||
|
memory via the twl4030 regulator which is not enabled by NOLO.
|
||||||
|
|
||||||
|
NOLO is expecting a kernel image and will treat any image it finds in
|
||||||
|
OneNAND as such. This u-boot is intended to be flashed to the N900 like
|
||||||
|
a kernel. In order to transparently boot the original kernel, it will be
|
||||||
|
appended to ``u-boot.bin`` at 0x40000. NOLO will load the entire image into
|
||||||
|
(random) memory and execute U-Boot, which saves hardware revision, boot reason
|
||||||
|
and boot mode ATAGs set by NOLO. Then the bootscripts will attempt to load
|
||||||
|
``uImage``, ``zImage`` or ``boot.scr`` file from a FAT or ext2/3/4 filesystem
|
||||||
|
on external SD card or internal eMMC memory. If this fails or keyboard is
|
||||||
|
closed then the appended kernel image will be booted using some generated
|
||||||
|
and some stored ATAGs (see boot order).
|
||||||
|
|
||||||
|
For generating combined image of U-Boot and kernel (either in uImage or zImage
|
||||||
|
format) there is a simple script called ``u-boot-gen-combined``. It is available
|
||||||
|
in following repository: https://github.com/pali/u-boot-maemo.
|
||||||
|
|
||||||
|
To generate the ``combined.bin`` image from ``u-boot.bin`` and ``kernel.bin``
|
||||||
|
(in either uImage or zImage format) use:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
sh u-boot-gen-combined u-boot.bin kernel.bin combined.bin
|
||||||
|
|
||||||
|
The original Maemo Fremantle PR1.3 zImage kernel binary is available at:
|
||||||
|
http://repository.maemo.org/pool/maemo5.0/free/k/kernel/kernel_2.6.28-20103103+0m5_armel.deb
|
||||||
|
|
||||||
|
To unpack it (from DEB/AR, TAR and FIASCO) execute the following commands:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
ar x kernel_2.6.28-20103103+0m5_armel.deb data.tar.gz
|
||||||
|
tar -O -xf data.tar.gz ./boot/zImage-2.6.28-20103103+0m5.fiasco > kernel_2.6.28-20103103+0m5.fiasco
|
||||||
|
0xFFFF -M kernel_2.6.28-20103103+0m5.fiasco -u
|
||||||
|
|
||||||
|
The flashed image must start with a 2 KiB ``NOLO!img`` header which contains
|
||||||
|
size of the image. The header consists of the bytes
|
||||||
|
``NOLO!img\x02\x00\x00\x00\x00\x00\x00\x00`` followed by the 4 byte little
|
||||||
|
endian size of the image. The rest of the 2 KiB header just contains zero bytes.
|
||||||
|
|
||||||
|
The Nokia proprietary flasher and also the open source 0xFFFF flasher
|
||||||
|
automatically prepend the required ``NOLO!img`` header and both applications
|
||||||
|
expect that the image does not contain a ``NOLO!img`` header. Adding a
|
||||||
|
``NOLO!img`` header is required only in case of using the ``nandwrite`` tool for
|
||||||
|
flashing.
|
||||||
|
|
||||||
|
The open source 0xFFFF flasher is available in the following repository:
|
||||||
|
https://github.com/pali/0xFFFF
|
||||||
|
|
||||||
|
It is possible to load ``u-boot.bin`` via USB to the N900 RAM and boot it
|
||||||
|
without needing to flash it. This is done via 0xFFFF running on the host PC:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
0xFFFF -m u-boot.bin -l -b
|
||||||
|
|
||||||
|
0xFFFF also supports flashing a kernel image either via USB or directly on
|
||||||
|
N900 device. Flashing u-boot/kernel/combined image is done as:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
0xFFFF -m combined.bin -f
|
||||||
|
|
||||||
|
Via 0xFFFF it is also possible to generate a standard flashable image in
|
||||||
|
Nokia FIASCO format which contains metadata information like device
|
||||||
|
identification (RX-51) and version string (v2021.04):
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
0xFFFF -m RX-51:v2021.04:kernel:u-boot.bin -g u-boot.fiasco
|
||||||
|
|
||||||
|
There is support for the hardware watchdog. The hardware watchdog is started by
|
||||||
|
NOLO so U-Boot must reset the watchdog to prevent rebooting the device (but not
|
||||||
|
very often, max every 2 seconds). There is also support for framebuffer display
|
||||||
|
output with ANSI escape codes and the N900 hardware keyboard input.
|
||||||
|
|
||||||
|
When U-Boot is starting it sets the IBE bit in the Auxiliary Control Register,
|
||||||
|
which is needed for Thumb-2 ISA support. This is a workaround for erratum
|
||||||
|
430973.
|
||||||
|
|
||||||
|
Default boot order
|
||||||
|
------------------
|
||||||
|
|
||||||
|
0. if keyboard is closed boot automatically attached kernel image
|
||||||
|
1. try boot from external SD card
|
||||||
|
2. try boot from internal eMMC memory
|
||||||
|
3. try boot from attached kernel image
|
||||||
|
|
||||||
|
Boot from SD or eMMC in this order:
|
||||||
|
|
||||||
|
1. boot from FAT partition
|
||||||
|
|
||||||
|
a. find ``boot.scr`` on first FAT partition
|
||||||
|
b. find ``uImage`` on first FAT partition
|
||||||
|
c. find ``zImage`` on first FAT partition
|
||||||
|
d. same order for 2nd - 4th FAT partition
|
||||||
|
|
||||||
|
2. same as 1. but for ext2/3/4 partition
|
||||||
|
|
||||||
|
Available additional commands/variables
|
||||||
|
---------------------------------------
|
||||||
|
|
||||||
|
* run sdboot - Boot from external SD card (see boot order)
|
||||||
|
* run emmcboot - Boot from internal eMMC memory (see boot order)
|
||||||
|
* run attachboot - Boot attached kernel image (attached to U-Boot binary)
|
||||||
|
|
||||||
|
\
|
||||||
|
|
||||||
|
* run scriptload - Load boot script ``${mmcscriptfile}``
|
||||||
|
* run scriptboot - Run loaded boot script
|
||||||
|
* run kernload - Load kernel image ``${mmckernfile}``
|
||||||
|
* run initrdload - Load initrd image ``${mmcinitrdfile}``
|
||||||
|
* run kernboot - Boot loaded kernel image
|
||||||
|
* run kerninitrdboot - Boot loaded kernel image with loaded initrd image
|
||||||
|
|
||||||
|
\
|
||||||
|
|
||||||
|
* run trymmcscriptboot - Try to load and boot script ``${mmcscriptfile}``
|
||||||
|
* run trymmckernboot - Try to load and boot kernel image ``${mmckernfile}``
|
||||||
|
* run trymmckerninitrdboot - Try to load and boot kernel image ``${mmckernfile}``
|
||||||
|
with initrd image ``${mmcinitrdfile}``
|
||||||
|
|
||||||
|
Additional variables for loading files from mmc
|
||||||
|
-----------------------------------------------
|
||||||
|
|
||||||
|
* mmc ``${mmcnum}`` (0 - external, 1 - internal)
|
||||||
|
* partition number ``${mmcpart}`` (1 - 4)
|
||||||
|
* partition type ``${mmctype}`` (fat, ext2, ext4; ext2 is just alias for ext4)
|
||||||
|
|
||||||
|
Additional variables for booting a kernel
|
||||||
|
-----------------------------------------
|
||||||
|
|
||||||
|
* ``setup_omap_atag`` - Add OMAP table into atags structure (needed for maemo kernel)
|
||||||
|
* ``setup_console_atag`` - Enable serial console in OMAP table
|
||||||
|
* ``setup_boot_reason_atag`` - Change boot reason in OMAP table
|
||||||
|
* ``setup_boot_mode_atag`` - Change boot mode in OMAP table
|
||||||
|
|
||||||
|
Variable ``setup_omap_atag`` is automatically set when booting attached kernel.
|
||||||
|
When variable ``setup_omap_atag`` is set, variable ``setup_console_atag`` is unset
|
||||||
|
and u-boot standard output is set to serial then ``setup_console_atag`` is
|
||||||
|
automatically set to 1. So output from Maemo kernel would go to serial port.
|
||||||
|
|
||||||
|
UBIFS support
|
||||||
|
-------------
|
||||||
|
|
||||||
|
UBIFS support is disabled, because U-Boot image is too big and cannot be
|
||||||
|
flashed with attached kernel image to RX-51 kernel nand area. For enabling
|
||||||
|
UBIFS support add following lines into file ``configs/nokia_rx51_defconfig``::
|
||||||
|
|
||||||
|
CONFIG_CMD_UBI=y
|
||||||
|
CONFIG_CMD_UBIFS=y
|
||||||
|
CONFIG_MTD_UBI_FASTMAP=y
|
||||||
|
CONFIG_MTD_UBI_FASTMAP_AUTOCONVERT=1
|
@@ -20,8 +20,11 @@ The support for following drivers are already enabled:
|
|||||||
4. SiFive SPI Driver.
|
4. SiFive SPI Driver.
|
||||||
5. MMC SPI Driver for MMC/SD support.
|
5. MMC SPI Driver for MMC/SD support.
|
||||||
|
|
||||||
Booting from uSD using U-Boot SPL
|
Booting from micro SD card using U-Boot SPL
|
||||||
---------------------------------
|
-------------------------------------------
|
||||||
|
|
||||||
|
Booting from an SD card requires that the boot mode selection DIP switches
|
||||||
|
MSEL[3:0] are set to 1011.
|
||||||
|
|
||||||
Building
|
Building
|
||||||
--------
|
--------
|
||||||
|
@@ -438,6 +438,10 @@ struct efi_runtime_services {
|
|||||||
EFI_GUID(0x607f766c, 0x7455, 0x42be, 0x93, \
|
EFI_GUID(0x607f766c, 0x7455, 0x42be, 0x93, \
|
||||||
0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f)
|
0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f)
|
||||||
|
|
||||||
|
#define RISCV_EFI_BOOT_PROTOCOL_GUID \
|
||||||
|
EFI_GUID(0xccd15fec, 0x6f73, 0x4eec, 0x83, \
|
||||||
|
0x95, 0x3e, 0x69, 0xe4, 0xb9, 0x40, 0xbf)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct efi_configuration_table - EFI Configuration Table
|
* struct efi_configuration_table - EFI Configuration Table
|
||||||
*
|
*
|
||||||
@@ -1845,9 +1849,21 @@ struct efi_system_resource_table {
|
|||||||
#define LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MAX 0x00004000
|
#define LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MAX 0x00004000
|
||||||
|
|
||||||
/* Certificate types in signature database */
|
/* Certificate types in signature database */
|
||||||
|
#define EFI_CERT_SHA1_GUID \
|
||||||
|
EFI_GUID(0x826ca512, 0xcf10, 0x4ac9, 0xb1, 0x87, \
|
||||||
|
0xbe, 0x01, 0x49, 0x66, 0x31, 0xbd)
|
||||||
|
#define EFI_CERT_SHA224_GUID \
|
||||||
|
EFI_GUID(0xb6e5233, 0xa65c, 0x44c9, 0x94, 0x07, \
|
||||||
|
0xd9, 0xab, 0x83, 0xbf, 0xc8, 0xbd)
|
||||||
#define EFI_CERT_SHA256_GUID \
|
#define EFI_CERT_SHA256_GUID \
|
||||||
EFI_GUID(0xc1c41626, 0x504c, 0x4092, 0xac, 0xa9, \
|
EFI_GUID(0xc1c41626, 0x504c, 0x4092, 0xac, 0xa9, \
|
||||||
0x41, 0xf9, 0x36, 0x93, 0x43, 0x28)
|
0x41, 0xf9, 0x36, 0x93, 0x43, 0x28)
|
||||||
|
#define EFI_CERT_SHA384_GUID \
|
||||||
|
EFI_GUID(0xff3e5307, 0x9fd0, 0x48c9, 0x85, 0xf1, \
|
||||||
|
0x8a, 0xd5, 0x6c, 0x70, 0x1e, 0x01)
|
||||||
|
#define EFI_CERT_SHA512_GUID \
|
||||||
|
EFI_GUID(0x93e0fae, 0xa6c4, 0x4f50, 0x9f, 0x1b, \
|
||||||
|
0xd4, 0x1e, 0x2b, 0x89, 0xc1, 0x9a)
|
||||||
#define EFI_CERT_RSA2048_GUID \
|
#define EFI_CERT_RSA2048_GUID \
|
||||||
EFI_GUID(0x3c5766e8, 0x269c, 0x4e34, 0xaa, 0x14, \
|
EFI_GUID(0x3c5766e8, 0x269c, 0x4e34, 0xaa, 0x14, \
|
||||||
0xed, 0x77, 0x6e, 0x85, 0xb3, 0xb6)
|
0xed, 0x77, 0x6e, 0x85, 0xb3, 0xb6)
|
||||||
|
@@ -527,6 +527,8 @@ efi_status_t efi_disk_register(void);
|
|||||||
efi_status_t efi_rng_register(void);
|
efi_status_t efi_rng_register(void);
|
||||||
/* Called by efi_init_obj_list() to install EFI_TCG2_PROTOCOL */
|
/* Called by efi_init_obj_list() to install EFI_TCG2_PROTOCOL */
|
||||||
efi_status_t efi_tcg2_register(void);
|
efi_status_t efi_tcg2_register(void);
|
||||||
|
/* Called by efi_init_obj_list() to install RISCV_EFI_BOOT_PROTOCOL */
|
||||||
|
efi_status_t efi_riscv_register(void);
|
||||||
/* Called by efi_init_obj_list() to do initial measurement */
|
/* Called by efi_init_obj_list() to do initial measurement */
|
||||||
efi_status_t efi_tcg2_do_initial_measurement(void);
|
efi_status_t efi_tcg2_do_initial_measurement(void);
|
||||||
/* measure the pe-coff image, extend PCR and add Event Log */
|
/* measure the pe-coff image, extend PCR and add Event Log */
|
||||||
@@ -910,7 +912,8 @@ struct x509_certificate;
|
|||||||
struct pkcs7_message;
|
struct pkcs7_message;
|
||||||
|
|
||||||
bool efi_signature_lookup_digest(struct efi_image_regions *regs,
|
bool efi_signature_lookup_digest(struct efi_image_regions *regs,
|
||||||
struct efi_signature_store *db);
|
struct efi_signature_store *db,
|
||||||
|
bool dbx);
|
||||||
bool efi_signature_verify(struct efi_image_regions *regs,
|
bool efi_signature_verify(struct efi_image_regions *regs,
|
||||||
struct pkcs7_message *msg,
|
struct pkcs7_message *msg,
|
||||||
struct efi_signature_store *db,
|
struct efi_signature_store *db,
|
||||||
|
24
include/efi_riscv.h
Normal file
24
include/efi_riscv.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||||
|
/*
|
||||||
|
* RISCV_EFI_BOOT_PROTOCOL
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022 Ventana Micro Systems Inc
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <efi_api.h>
|
||||||
|
|
||||||
|
#define RISCV_EFI_BOOT_PROTOCOL_REVISION 0x00010000
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct riscv_efi_boot_protocol - RISCV_EFI_BOOT_PROTOCOL
|
||||||
|
* @revision: Version of the protocol implemented
|
||||||
|
* @get_boot_hartid: Get the boot hart ID
|
||||||
|
*/
|
||||||
|
struct riscv_efi_boot_protocol {
|
||||||
|
u64 revision;
|
||||||
|
|
||||||
|
efi_status_t (EFIAPI * get_boot_hartid) (struct riscv_efi_boot_protocol *this,
|
||||||
|
efi_uintn_t *boot_hartid);
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct riscv_efi_boot_protocol riscv_efi_boot_prot;
|
@@ -369,4 +369,14 @@ config EFI_ESRT
|
|||||||
help
|
help
|
||||||
Enabling this option creates the ESRT UEFI system table.
|
Enabling this option creates the ESRT UEFI system table.
|
||||||
|
|
||||||
|
config EFI_RISCV_BOOT_PROTOCOL
|
||||||
|
bool "RISCV_EFI_BOOT_PROTOCOL support"
|
||||||
|
default y
|
||||||
|
depends on RISCV
|
||||||
|
help
|
||||||
|
The EFI_RISCV_BOOT_PROTOCOL is used to transfer the boot hart ID
|
||||||
|
to the next boot stage. It should be enabled as it is meant to
|
||||||
|
replace the transfer via the device-tree. The latter is not
|
||||||
|
possible on systems using ACPI.
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
@@ -62,6 +62,7 @@ obj-$(CONFIG_GENERATE_ACPI_TABLE) += efi_acpi.o
|
|||||||
obj-$(CONFIG_GENERATE_SMBIOS_TABLE) += efi_smbios.o
|
obj-$(CONFIG_GENERATE_SMBIOS_TABLE) += efi_smbios.o
|
||||||
obj-$(CONFIG_EFI_RNG_PROTOCOL) += efi_rng.o
|
obj-$(CONFIG_EFI_RNG_PROTOCOL) += efi_rng.o
|
||||||
obj-$(CONFIG_EFI_TCG2_PROTOCOL) += efi_tcg2.o
|
obj-$(CONFIG_EFI_TCG2_PROTOCOL) += efi_tcg2.o
|
||||||
|
obj-$(CONFIG_EFI_RISCV_BOOT_PROTOCOL) += efi_riscv.o
|
||||||
obj-$(CONFIG_EFI_LOAD_FILE2_INITRD) += efi_load_initrd.o
|
obj-$(CONFIG_EFI_LOAD_FILE2_INITRD) += efi_load_initrd.o
|
||||||
obj-$(CONFIG_EFI_SIGNATURE_SUPPORT) += efi_signature.o
|
obj-$(CONFIG_EFI_SIGNATURE_SUPPORT) += efi_signature.o
|
||||||
|
|
||||||
|
@@ -1084,7 +1084,7 @@ static const struct efi_file_handle efi_file_handle_protocol = {
|
|||||||
* efi_file_from_path() - open file via device path
|
* efi_file_from_path() - open file via device path
|
||||||
*
|
*
|
||||||
* @fp: device path
|
* @fp: device path
|
||||||
* @return: EFI_FILE_PROTOCOL for the file or NULL
|
* Return: EFI_FILE_PROTOCOL for the file or NULL
|
||||||
*/
|
*/
|
||||||
struct efi_file_handle *efi_file_from_path(struct efi_device_path *fp)
|
struct efi_file_handle *efi_file_from_path(struct efi_device_path *fp)
|
||||||
{
|
{
|
||||||
|
@@ -97,8 +97,8 @@ void *memset(void *s, int c, size_t n)
|
|||||||
*
|
*
|
||||||
* We do nothing here.
|
* We do nothing here.
|
||||||
*
|
*
|
||||||
* @param func_ptr Pointer to function being entered
|
* func_ptr: Pointer to function being entered
|
||||||
* @param caller Pointer to function which called this function
|
* caller: Pointer to function which called this function
|
||||||
*/
|
*/
|
||||||
void __attribute__((no_instrument_function))
|
void __attribute__((no_instrument_function))
|
||||||
__cyg_profile_func_enter(void *func_ptr, void *caller)
|
__cyg_profile_func_enter(void *func_ptr, void *caller)
|
||||||
@@ -113,8 +113,8 @@ __cyg_profile_func_enter(void *func_ptr, void *caller)
|
|||||||
*
|
*
|
||||||
* We do nothing here.
|
* We do nothing here.
|
||||||
*
|
*
|
||||||
* @param func_ptr Pointer to function being entered
|
* func_ptr: Pointer to function being entered
|
||||||
* @param caller Pointer to function which called this function
|
* caller: Pointer to function which called this function
|
||||||
*/
|
*/
|
||||||
void __attribute__((no_instrument_function))
|
void __attribute__((no_instrument_function))
|
||||||
__cyg_profile_func_exit(void *func_ptr, void *caller)
|
__cyg_profile_func_exit(void *func_ptr, void *caller)
|
||||||
|
@@ -407,7 +407,7 @@ out:
|
|||||||
* @width: width of rectangle
|
* @width: width of rectangle
|
||||||
* @height: height of rectangle
|
* @height: height of rectangle
|
||||||
* @delta: length in bytes of a line in the pixel buffer (optional)
|
* @delta: length in bytes of a line in the pixel buffer (optional)
|
||||||
* @return: status code
|
* Return: status code
|
||||||
*/
|
*/
|
||||||
efi_status_t EFIAPI gop_blt(struct efi_gop *this, struct efi_gop_pixel *buffer,
|
efi_status_t EFIAPI gop_blt(struct efi_gop *this, struct efi_gop_pixel *buffer,
|
||||||
u32 operation, efi_uintn_t sx,
|
u32 operation, efi_uintn_t sx,
|
||||||
|
@@ -545,13 +545,13 @@ static bool efi_image_unsigned_authenticate(struct efi_image_regions *regs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* try black-list first */
|
/* try black-list first */
|
||||||
if (efi_signature_lookup_digest(regs, dbx)) {
|
if (efi_signature_lookup_digest(regs, dbx, true)) {
|
||||||
EFI_PRINT("Image is not signed and its digest found in \"dbx\"\n");
|
EFI_PRINT("Image is not signed and its digest found in \"dbx\"\n");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* try white-list */
|
/* try white-list */
|
||||||
if (efi_signature_lookup_digest(regs, db))
|
if (efi_signature_lookup_digest(regs, db, false))
|
||||||
ret = true;
|
ret = true;
|
||||||
else
|
else
|
||||||
EFI_PRINT("Image is not signed and its digest not found in \"db\" or \"dbx\"\n");
|
EFI_PRINT("Image is not signed and its digest not found in \"db\" or \"dbx\"\n");
|
||||||
@@ -633,7 +633,7 @@ static bool efi_image_authenticate(void *efi, size_t efi_size)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (efi_signature_lookup_digest(regs, dbx)) {
|
if (efi_signature_lookup_digest(regs, dbx, true)) {
|
||||||
EFI_PRINT("Image's digest was found in \"dbx\"\n");
|
EFI_PRINT("Image's digest was found in \"dbx\"\n");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@@ -734,7 +734,7 @@ static bool efi_image_authenticate(void *efi, size_t efi_size)
|
|||||||
|
|
||||||
EFI_PRINT("Signature was not verified by \"db\"\n");
|
EFI_PRINT("Signature was not verified by \"db\"\n");
|
||||||
|
|
||||||
if (efi_signature_lookup_digest(regs, db)) {
|
if (efi_signature_lookup_digest(regs, db, false)) {
|
||||||
ret = true;
|
ret = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
60
lib/efi_loader/efi_riscv.c
Normal file
60
lib/efi_loader/efi_riscv.c
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
/*
|
||||||
|
* Defines APIs that allow an OS to interact with UEFI firmware to query
|
||||||
|
* information about the boot hart ID.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022, Ventana Micro Systems Inc
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LOG_CATEGORY LOGC_EFI
|
||||||
|
#include <common.h>
|
||||||
|
#include <efi_loader.h>
|
||||||
|
#include <efi_variable.h>
|
||||||
|
#include <log.h>
|
||||||
|
#include <asm/global_data.h>
|
||||||
|
#include <efi_riscv.h>
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
static const efi_guid_t efi_guid_riscv_boot_protocol = RISCV_EFI_BOOT_PROTOCOL_GUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* efi_riscv_get_boot_hartid() - return boot hart ID
|
||||||
|
* @this: RISCV_EFI_BOOT_PROTOCOL instance
|
||||||
|
* @boot_hartid: caller allocated memory to return boot hart id
|
||||||
|
* Return: status code
|
||||||
|
*/
|
||||||
|
static efi_status_t EFIAPI
|
||||||
|
efi_riscv_get_boot_hartid(struct riscv_efi_boot_protocol *this,
|
||||||
|
efi_uintn_t *boot_hartid)
|
||||||
|
{
|
||||||
|
EFI_ENTRY("%p, %p", this, boot_hartid);
|
||||||
|
|
||||||
|
if (this != &riscv_efi_boot_prot || !boot_hartid)
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
*boot_hartid = gd->arch.boot_hart;
|
||||||
|
|
||||||
|
return EFI_EXIT(EFI_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct riscv_efi_boot_protocol riscv_efi_boot_prot = {
|
||||||
|
.revision = RISCV_EFI_BOOT_PROTOCOL_REVISION,
|
||||||
|
.get_boot_hartid = efi_riscv_get_boot_hartid
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* efi_riscv_register() - register RISCV_EFI_BOOT_PROTOCOL
|
||||||
|
*
|
||||||
|
* Return: status code
|
||||||
|
*/
|
||||||
|
efi_status_t efi_riscv_register(void)
|
||||||
|
{
|
||||||
|
efi_status_t ret = EFI_SUCCESS;
|
||||||
|
|
||||||
|
ret = efi_add_protocol(efi_root, &efi_guid_riscv_boot_protocol,
|
||||||
|
(void *)&riscv_efi_boot_prot);
|
||||||
|
if (ret != EFI_SUCCESS)
|
||||||
|
log_err("Cannot install RISCV_EFI_BOOT_PROTOCOL\n");
|
||||||
|
return ret;
|
||||||
|
}
|
@@ -247,6 +247,12 @@ efi_status_t efi_init_obj_list(void)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IS_ENABLED(CONFIG_EFI_RISCV_BOOT_PROTOCOL)) {
|
||||||
|
ret = efi_riscv_register();
|
||||||
|
if (ret != EFI_SUCCESS)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
/* Secure boot */
|
/* Secure boot */
|
||||||
ret = efi_init_secure_boot();
|
ret = efi_init_secure_boot();
|
||||||
if (ret != EFI_SUCCESS)
|
if (ret != EFI_SUCCESS)
|
||||||
|
@@ -146,10 +146,35 @@ static bool efi_hash_regions(struct image_region *regs, int count,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hash_algo_supported - check if the requested hash algorithm is supported
|
||||||
|
* @guid: guid of the algorithm
|
||||||
|
*
|
||||||
|
* Return: true if supported false otherwise
|
||||||
|
*/
|
||||||
|
static bool hash_algo_supported(const efi_guid_t guid)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
const efi_guid_t unsupported_hashes[] = {
|
||||||
|
EFI_CERT_SHA1_GUID,
|
||||||
|
EFI_CERT_SHA224_GUID,
|
||||||
|
EFI_CERT_SHA384_GUID,
|
||||||
|
EFI_CERT_SHA512_GUID,
|
||||||
|
};
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(unsupported_hashes); i++) {
|
||||||
|
if (!guidcmp(&unsupported_hashes[i], &guid))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* efi_signature_lookup_digest - search for an image's digest in sigdb
|
* efi_signature_lookup_digest - search for an image's digest in sigdb
|
||||||
* @regs: List of regions to be authenticated
|
* @regs: List of regions to be authenticated
|
||||||
* @db: Signature database for trusted certificates
|
* @db: Signature database for trusted certificates
|
||||||
|
* @dbx Caller needs to set this to true if he is searching dbx
|
||||||
*
|
*
|
||||||
* A message digest of image pointed to by @regs is calculated and
|
* A message digest of image pointed to by @regs is calculated and
|
||||||
* its hash value is compared to entries in signature database pointed
|
* its hash value is compared to entries in signature database pointed
|
||||||
@@ -158,13 +183,16 @@ static bool efi_hash_regions(struct image_region *regs, int count,
|
|||||||
* Return: true if found, false if not
|
* Return: true if found, false if not
|
||||||
*/
|
*/
|
||||||
bool efi_signature_lookup_digest(struct efi_image_regions *regs,
|
bool efi_signature_lookup_digest(struct efi_image_regions *regs,
|
||||||
struct efi_signature_store *db)
|
struct efi_signature_store *db,
|
||||||
|
bool dbx)
|
||||||
|
|
||||||
{
|
{
|
||||||
struct efi_signature_store *siglist;
|
struct efi_signature_store *siglist;
|
||||||
struct efi_sig_data *sig_data;
|
struct efi_sig_data *sig_data;
|
||||||
void *hash = NULL;
|
void *hash = NULL;
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
bool hash_done = false;
|
||||||
|
|
||||||
EFI_PRINT("%s: Enter, %p, %p\n", __func__, regs, db);
|
EFI_PRINT("%s: Enter, %p, %p\n", __func__, regs, db);
|
||||||
|
|
||||||
@@ -172,17 +200,27 @@ bool efi_signature_lookup_digest(struct efi_image_regions *regs,
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
for (siglist = db; siglist; siglist = siglist->next) {
|
for (siglist = db; siglist; siglist = siglist->next) {
|
||||||
/* TODO: support other hash algorithms */
|
/*
|
||||||
if (guidcmp(&siglist->sig_type, &efi_guid_sha256)) {
|
* if the hash algorithm is unsupported and we get an entry in
|
||||||
EFI_PRINT("Digest algorithm is not supported: %pUs\n",
|
* dbx reject the image
|
||||||
&siglist->sig_type);
|
*/
|
||||||
break;
|
if (dbx && !hash_algo_supported(siglist->sig_type)) {
|
||||||
}
|
found = true;
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
* Only support sha256 for now, that's what
|
||||||
|
* hash-to-efi-sig-list produces
|
||||||
|
*/
|
||||||
|
if (guidcmp(&siglist->sig_type, &efi_guid_sha256))
|
||||||
|
continue;
|
||||||
|
|
||||||
if (!efi_hash_regions(regs->reg, regs->num, &hash, &size)) {
|
if (!hash_done &&
|
||||||
|
!efi_hash_regions(regs->reg, regs->num, &hash, &size)) {
|
||||||
EFI_PRINT("Digesting an image failed\n");
|
EFI_PRINT("Digesting an image failed\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
hash_done = true;
|
||||||
|
|
||||||
for (sig_data = siglist->sig_data_list; sig_data;
|
for (sig_data = siglist->sig_data_list; sig_data;
|
||||||
sig_data = sig_data->next) {
|
sig_data = sig_data->next) {
|
||||||
|
@@ -133,7 +133,7 @@ efi_status_t print_device_path(struct efi_device_path *device_path,
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systab: system table
|
* @systab: system table
|
||||||
* @return: status code
|
* Return: status code
|
||||||
*/
|
*/
|
||||||
efi_status_t EFIAPI efi_main(efi_handle_t handle,
|
efi_status_t EFIAPI efi_main(efi_handle_t handle,
|
||||||
struct efi_system_table *systab)
|
struct efi_system_table *systab)
|
||||||
|
@@ -495,7 +495,7 @@ efi_status_t do_save(u16 *filename)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systab: system table
|
* @systab: system table
|
||||||
* @return: status code
|
* Return: status code
|
||||||
*/
|
*/
|
||||||
efi_status_t EFIAPI efi_main(efi_handle_t image_handle,
|
efi_status_t EFIAPI efi_main(efi_handle_t image_handle,
|
||||||
struct efi_system_table *systab)
|
struct efi_system_table *systab)
|
||||||
|
@@ -149,7 +149,7 @@ static int teardown(struct efi_unit_test *test, unsigned int *failures)
|
|||||||
* Check that a test requiring reset exists.
|
* Check that a test requiring reset exists.
|
||||||
*
|
*
|
||||||
* @testname: name of the test
|
* @testname: name of the test
|
||||||
* @return: test, or NULL if not found
|
* Return: test, or NULL if not found
|
||||||
*/
|
*/
|
||||||
static bool need_reset(const u16 *testname)
|
static bool need_reset(const u16 *testname)
|
||||||
{
|
{
|
||||||
@@ -170,7 +170,7 @@ static bool need_reset(const u16 *testname)
|
|||||||
* Check that a test exists.
|
* Check that a test exists.
|
||||||
*
|
*
|
||||||
* @testname: name of the test
|
* @testname: name of the test
|
||||||
* @return: test, or NULL if not found
|
* Return: test, or NULL if not found
|
||||||
*/
|
*/
|
||||||
static struct efi_unit_test *find_test(const u16 *testname)
|
static struct efi_unit_test *find_test(const u16 *testname)
|
||||||
{
|
{
|
||||||
|
@@ -94,7 +94,7 @@ static void EFIAPI notify(struct efi_event *event, void *context)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -198,7 +198,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
/*
|
/*
|
||||||
* Tear down unit test.
|
* Tear down unit test.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int teardown(void)
|
static int teardown(void)
|
||||||
{
|
{
|
||||||
@@ -225,7 +225,7 @@ static int teardown(void)
|
|||||||
/*
|
/*
|
||||||
* Execute unit test.
|
* Execute unit test.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -180,7 +180,7 @@ static efi_handle_t disk_handle;
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -240,7 +240,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
/*
|
/*
|
||||||
* Tear down unit test.
|
* Tear down unit test.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int teardown(void)
|
static int teardown(void)
|
||||||
{
|
{
|
||||||
@@ -292,7 +292,7 @@ static efi_uintn_t dp_size(struct efi_device_path *dp)
|
|||||||
/*
|
/*
|
||||||
* Execute unit test.
|
* Execute unit test.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -68,7 +68,7 @@ static int check_table(const void *table)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -85,7 +85,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
* A table is installed, updated, removed. The table entry and the
|
* A table is installed, updated, removed. The table entry and the
|
||||||
* triggering of events is checked.
|
* triggering of events is checked.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -274,7 +274,7 @@ void efi_st_printc(int color, const char *fmt, ...)
|
|||||||
/*
|
/*
|
||||||
* Reads an Unicode character from the input device.
|
* Reads an Unicode character from the input device.
|
||||||
*
|
*
|
||||||
* @return: Unicode character
|
* Return: Unicode character
|
||||||
*/
|
*/
|
||||||
u16 efi_st_get_key(void)
|
u16 efi_st_get_key(void)
|
||||||
{
|
{
|
||||||
|
@@ -68,7 +68,7 @@ static int check_table(const void *table)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -112,7 +112,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
*
|
*
|
||||||
* Check tables after ExitBootServices()
|
* Check tables after ExitBootServices()
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -49,7 +49,7 @@ static int setup(const efi_handle_t img_handle,
|
|||||||
*
|
*
|
||||||
* @length: length of the media device node
|
* @length: length of the media device node
|
||||||
* @dp: device path
|
* @dp: device path
|
||||||
* @return: status code
|
* Return: status code
|
||||||
*/
|
*/
|
||||||
static int create_single_node_device_path(unsigned int length,
|
static int create_single_node_device_path(unsigned int length,
|
||||||
struct efi_device_path **dp)
|
struct efi_device_path **dp)
|
||||||
|
@@ -108,7 +108,7 @@ static void *lib_test_get_esrt(void)
|
|||||||
* @esrt: pointer to the ESRT
|
* @esrt: pointer to the ESRT
|
||||||
* @img_info: an image_info_descriptor output by the FMP get_image_info
|
* @img_info: an image_info_descriptor output by the FMP get_image_info
|
||||||
*
|
*
|
||||||
* @return: true if matching ESRT entry is found and if all the ESRT entry fields match the
|
* Return: true if matching ESRT entry is found and if all the ESRT entry fields match the
|
||||||
* corresponding @img_info fields.
|
* corresponding @img_info fields.
|
||||||
*/
|
*/
|
||||||
static bool lib_test_check_uuid_entry(struct efi_system_resource_table *esrt,
|
static bool lib_test_check_uuid_entry(struct efi_system_resource_table *esrt,
|
||||||
@@ -168,7 +168,7 @@ static bool lib_test_check_uuid_entry(struct efi_system_resource_table *esrt,
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -185,7 +185,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
*
|
*
|
||||||
* Uninstall the test FMP.
|
* Uninstall the test FMP.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int teardown(void)
|
static int teardown(void)
|
||||||
{
|
{
|
||||||
|
@@ -38,7 +38,7 @@ static void EFIAPI notify(struct efi_event *event, void *context)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -54,7 +54,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
* Create multiple events in an event group. Signal each event once and check
|
* Create multiple events in an event group. Signal each event once and check
|
||||||
* that all events are notified once in each round.
|
* that all events are notified once in each round.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -39,7 +39,7 @@ static void EFIAPI notify(struct efi_event *event, void *context)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -69,7 +69,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
*
|
*
|
||||||
* Close the events created in setup.
|
* Close the events created in setup.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int teardown(void)
|
static int teardown(void)
|
||||||
{
|
{
|
||||||
@@ -103,7 +103,7 @@ static int teardown(void)
|
|||||||
* Run a 100 ms single shot timer and check that it is called once
|
* Run a 100 ms single shot timer and check that it is called once
|
||||||
* while waiting for 100 ms periodic timer for two periods.
|
* while waiting for 100 ms periodic timer for two periods.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -99,7 +99,7 @@ static efi_status_t decompress(u8 **image)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -118,7 +118,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
*
|
*
|
||||||
* Load and start the application image.
|
* Load and start the application image.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -63,7 +63,7 @@ static void EFIAPI ebs_notify(struct efi_event *event, void *context)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -101,7 +101,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
* Call ExitBootServices again and check that the notification function is
|
* Call ExitBootServices again and check that the notification function is
|
||||||
* not called again.
|
* not called again.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -165,7 +165,7 @@ static void *efi_st_get_config_table(const efi_guid_t *guid)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t img_handle,
|
static int setup(const efi_handle_t img_handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -192,7 +192,7 @@ static int setup(const efi_handle_t img_handle,
|
|||||||
/*
|
/*
|
||||||
* Execute unit test.
|
* Execute unit test.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -18,7 +18,7 @@ static struct efi_gop *gop;
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -39,7 +39,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
/*
|
/*
|
||||||
* Tear down unit test.
|
* Tear down unit test.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int teardown(void)
|
static int teardown(void)
|
||||||
{
|
{
|
||||||
@@ -49,7 +49,7 @@ static int teardown(void)
|
|||||||
/*
|
/*
|
||||||
* Execute unit test.
|
* Execute unit test.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -28,7 +28,7 @@ static struct efi_hii_string_protocol *hii_string_protocol;
|
|||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -1033,7 +1033,7 @@ static int test_hii_string_protocol(void)
|
|||||||
/*
|
/*
|
||||||
* Execute unit test.
|
* Execute unit test.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success, EFI_ST_FAILURE for failure
|
* Return: EFI_ST_SUCCESS for success, EFI_ST_FAILURE for failure
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -284,7 +284,7 @@ static struct efi_load_file_protocol lf2_prot = {load_file2};
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int efi_st_load_file_setup(const efi_handle_t handle,
|
static int efi_st_load_file_setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -326,7 +326,7 @@ static int efi_st_load_file_setup(const efi_handle_t handle,
|
|||||||
/*
|
/*
|
||||||
* Tear down unit test.
|
* Tear down unit test.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int efi_st_load_file_teardown(void)
|
static int efi_st_load_file_teardown(void)
|
||||||
{
|
{
|
||||||
@@ -377,7 +377,7 @@ static int efi_st_load_file_teardown(void)
|
|||||||
* Try loading an image via the EFI_LOAD_FILE_PROTOCOL and the
|
* Try loading an image via the EFI_LOAD_FILE_PROTOCOL and the
|
||||||
* EFI_LOAD_FILE2_PROTOCOL. Finally execute the image.
|
* EFI_LOAD_FILE2_PROTOCOL. Finally execute the image.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int efi_st_load_file_execute(void)
|
static int efi_st_load_file_execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -411,7 +411,7 @@ static efi_status_t decompress(u8 **image)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -447,7 +447,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
*
|
*
|
||||||
* Uninstall protocols and free memory.
|
* Uninstall protocols and free memory.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int teardown(void)
|
static int teardown(void)
|
||||||
{
|
{
|
||||||
@@ -486,7 +486,7 @@ static int teardown(void)
|
|||||||
*
|
*
|
||||||
* Load and start the application image.
|
* Load and start the application image.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -21,7 +21,7 @@ static efi_guid_t loaded_image_protocol_guid = EFI_LOADED_IMAGE_PROTOCOL_GUID;
|
|||||||
*
|
*
|
||||||
* @image_handle: handle of the loaded image
|
* @image_handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: status code
|
* Return: status code
|
||||||
*/
|
*/
|
||||||
static efi_status_t EFIAPI check_loaded_image_protocol
|
static efi_status_t EFIAPI check_loaded_image_protocol
|
||||||
(efi_handle_t image_handle, struct efi_system_table *systable)
|
(efi_handle_t image_handle, struct efi_system_table *systable)
|
||||||
@@ -60,7 +60,7 @@ static efi_status_t EFIAPI check_loaded_image_protocol
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: status code
|
* Return: status code
|
||||||
*/
|
*/
|
||||||
efi_status_t EFIAPI efi_main(efi_handle_t handle,
|
efi_status_t EFIAPI efi_main(efi_handle_t handle,
|
||||||
struct efi_system_table *systable)
|
struct efi_system_table *systable)
|
||||||
|
@@ -17,7 +17,7 @@ static struct efi_runtime_services *runtime;
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -29,7 +29,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
/*
|
/*
|
||||||
* Execute unit test.
|
* Execute unit test.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -20,7 +20,7 @@ static efi_guid_t efi_rng_guid = EFI_RNG_PROTOCOL_GUID;
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -35,7 +35,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
* Retrieve available RNG algorithms.
|
* Retrieve available RNG algorithms.
|
||||||
* Retrieve two random values and compare them.
|
* Retrieve two random values and compare them.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -19,7 +19,7 @@ static struct efi_runtime_services *runtime;
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -35,7 +35,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
* Set a new value and read it back.
|
* Set a new value and read it back.
|
||||||
* Set the real time clock back the current time.
|
* Set the real time clock back the current time.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -73,7 +73,7 @@ static void EFIAPI notify(struct efi_event *event, void *context)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -176,7 +176,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
* The triggering of the EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event is checked via
|
* The triggering of the EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event is checked via
|
||||||
* the call count of the notification function.
|
* the call count of the notification function.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -77,7 +77,7 @@ static unsigned int net_ip_id;
|
|||||||
*
|
*
|
||||||
* @buf: IP header
|
* @buf: IP header
|
||||||
* @len: length of header in bytes
|
* @len: length of header in bytes
|
||||||
* @return: checksum
|
* Return: checksum
|
||||||
*/
|
*/
|
||||||
static unsigned int efi_ip_checksum(const void *buf, size_t len)
|
static unsigned int efi_ip_checksum(const void *buf, size_t len)
|
||||||
{
|
{
|
||||||
@@ -175,7 +175,7 @@ static efi_status_t send_dhcp_discover(void)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -282,7 +282,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
* A DHCP discover message is sent. The test is successful if a
|
* A DHCP discover message is sent. The test is successful if a
|
||||||
* DHCP reply is received within 10 seconds.
|
* DHCP reply is received within 10 seconds.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
@@ -422,7 +422,7 @@ received:
|
|||||||
* Close the timer event created in setup.
|
* Close the timer event created in setup.
|
||||||
* Shut down the network adapter.
|
* Shut down the network adapter.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int teardown(void)
|
static int teardown(void)
|
||||||
{
|
{
|
||||||
|
@@ -79,7 +79,7 @@ static efi_status_t decompress(u8 **image)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -96,7 +96,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
/*
|
/*
|
||||||
* Tear down unit test.
|
* Tear down unit test.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int teardown(void)
|
static int teardown(void)
|
||||||
{
|
{
|
||||||
@@ -117,7 +117,7 @@ static int teardown(void)
|
|||||||
*
|
*
|
||||||
* Load and start the application image.
|
* Load and start the application image.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -79,7 +79,7 @@ static efi_status_t decompress(u8 **image)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -96,7 +96,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
/*
|
/*
|
||||||
* Tear down unit test.
|
* Tear down unit test.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int teardown(void)
|
static int teardown(void)
|
||||||
{
|
{
|
||||||
@@ -117,7 +117,7 @@ static int teardown(void)
|
|||||||
*
|
*
|
||||||
* Load and start the application image.
|
* Load and start the application image.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -612,7 +612,7 @@ static efi_status_t setup_smbios_table(const struct efi_system_table *systable)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: status code
|
* Return: status code
|
||||||
*/
|
*/
|
||||||
static int efi_st_tcg2_setup(const efi_handle_t img_handle,
|
static int efi_st_tcg2_setup(const efi_handle_t img_handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -949,7 +949,7 @@ static int efi_st_tcg2_execute(void)
|
|||||||
/*
|
/*
|
||||||
* efi_st_tcg2_teardown() - Tear down unit test
|
* efi_st_tcg2_teardown() - Tear down unit test
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int efi_st_tcg2_teardown(void)
|
static int efi_st_tcg2_teardown(void)
|
||||||
{
|
{
|
||||||
|
@@ -21,7 +21,7 @@ static struct efi_boot_services *boottime;
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -34,7 +34,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
/*
|
/*
|
||||||
* Execute unit test.
|
* Execute unit test.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -45,7 +45,7 @@ static efi_status_t EFIAPI efi_key_notify_function
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -93,7 +93,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
*
|
*
|
||||||
* Unregister notify function.
|
* Unregister notify function.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int teardown(void)
|
static int teardown(void)
|
||||||
{
|
{
|
||||||
@@ -112,7 +112,7 @@ static int teardown(void)
|
|||||||
/*
|
/*
|
||||||
* Execute unit test.
|
* Execute unit test.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
/*
|
/*
|
||||||
* Execute unit test.
|
* Execute unit test.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -37,7 +37,7 @@ static void EFIAPI notify(struct efi_event *event, void *context)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -68,7 +68,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
*
|
*
|
||||||
* Close the events created in setup.
|
* Close the events created in setup.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int teardown(void)
|
static int teardown(void)
|
||||||
{
|
{
|
||||||
@@ -106,7 +106,7 @@ static int teardown(void)
|
|||||||
* Lower the TPL level and check that the queued notification
|
* Lower the TPL level and check that the queued notification
|
||||||
* function is called.
|
* function is called.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -19,7 +19,7 @@ struct aligned_buffer {
|
|||||||
* occurs.
|
* occurs.
|
||||||
*
|
*
|
||||||
* @addr: address to read
|
* @addr: address to read
|
||||||
* @return: value at the address
|
* Return: value at the address
|
||||||
*/
|
*/
|
||||||
static inline u32 deref(u32 *addr)
|
static inline u32 deref(u32 *addr)
|
||||||
{
|
{
|
||||||
@@ -37,7 +37,7 @@ static inline u32 deref(u32 *addr)
|
|||||||
* Execute unit test.
|
* Execute unit test.
|
||||||
* An unaligned memory access is executed. The result is checked.
|
* An unaligned memory access is executed. The result is checked.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -65,7 +65,7 @@ static void EFIAPI notify(struct efi_event *event, void *context)
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup(const efi_handle_t handle,
|
static int setup(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -98,7 +98,7 @@ static int setup(const efi_handle_t handle,
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup_timer(const efi_handle_t handle,
|
static int setup_timer(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -112,7 +112,7 @@ static int setup_timer(const efi_handle_t handle,
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systable: system table
|
* @systable: system table
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int setup_reboot(const efi_handle_t handle,
|
static int setup_reboot(const efi_handle_t handle,
|
||||||
const struct efi_system_table *systable)
|
const struct efi_system_table *systable)
|
||||||
@@ -126,7 +126,7 @@ static int setup_reboot(const efi_handle_t handle,
|
|||||||
*
|
*
|
||||||
* Close the events created in setup.
|
* Close the events created in setup.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int teardown(void)
|
static int teardown(void)
|
||||||
{
|
{
|
||||||
@@ -166,7 +166,7 @@ static int teardown(void)
|
|||||||
* Run a 1350 ms single shot timer and check that the 600ms timer has
|
* Run a 1350 ms single shot timer and check that the 600ms timer has
|
||||||
* been called 2 times.
|
* been called 2 times.
|
||||||
*
|
*
|
||||||
* @return: EFI_ST_SUCCESS for success
|
* Return: EFI_ST_SUCCESS for success
|
||||||
*/
|
*/
|
||||||
static int execute(void)
|
static int execute(void)
|
||||||
{
|
{
|
||||||
|
@@ -405,7 +405,7 @@ out:
|
|||||||
*
|
*
|
||||||
* @handle: handle of the loaded image
|
* @handle: handle of the loaded image
|
||||||
* @systab: system table
|
* @systab: system table
|
||||||
* @return: status code
|
* Return: status code
|
||||||
*/
|
*/
|
||||||
efi_status_t EFIAPI efi_main(efi_handle_t image_handle,
|
efi_status_t EFIAPI efi_main(efi_handle_t image_handle,
|
||||||
struct efi_system_table *systab)
|
struct efi_system_table *systab)
|
||||||
|
@@ -220,7 +220,13 @@ static const struct {
|
|||||||
"TCG2 Final Events Table",
|
"TCG2 Final Events Table",
|
||||||
EFI_TCG2_FINAL_EVENTS_TABLE_GUID,
|
EFI_TCG2_FINAL_EVENTS_TABLE_GUID,
|
||||||
},
|
},
|
||||||
|
#ifdef CONFIG_EFI_RISCV_BOOT_PROTOCOL
|
||||||
|
{
|
||||||
|
"RISC-V Boot",
|
||||||
|
RISCV_EFI_BOOT_PROTOCOL_GUID,
|
||||||
|
},
|
||||||
#endif
|
#endif
|
||||||
|
#endif /* CONFIG_CMD_EFIDEBUG */
|
||||||
#ifdef CONFIG_CMD_NVEDIT_EFI
|
#ifdef CONFIG_CMD_NVEDIT_EFI
|
||||||
/* signature database */
|
/* signature database */
|
||||||
{
|
{
|
||||||
|
@@ -7,6 +7,7 @@
|
|||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -51,27 +52,132 @@ static struct option options[] = {
|
|||||||
static void print_usage(void)
|
static void print_usage(void)
|
||||||
{
|
{
|
||||||
printf("Usage: %s [options] <output file>\n"
|
printf("Usage: %s [options] <output file>\n"
|
||||||
"Options:\n"
|
"Options:\n"
|
||||||
|
|
||||||
"\t-f, --fit <fit image> new FIT image file\n"
|
"\t-f, --fit <fit image> new FIT image file\n"
|
||||||
"\t-r, --raw <raw image> new raw image file\n"
|
"\t-r, --raw <raw image> new raw image file\n"
|
||||||
"\t-i, --index <index> update image index\n"
|
"\t-i, --index <index> update image index\n"
|
||||||
"\t-I, --instance <instance> update hardware instance\n"
|
"\t-I, --instance <instance> update hardware instance\n"
|
||||||
"\t-h, --help print a help message\n",
|
"\t-h, --help print a help message\n",
|
||||||
tool_name);
|
tool_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* read_bin_file - read a firmware binary file
|
||||||
|
* @bin: Path to a firmware binary file
|
||||||
|
* @data: Pointer to pointer of allocated buffer
|
||||||
|
* @bin_size: Size of allocated buffer
|
||||||
|
*
|
||||||
|
* Read out a content of binary, @bin, into @data.
|
||||||
|
* A caller should free @data.
|
||||||
|
*
|
||||||
|
* Return:
|
||||||
|
* * 0 - on success
|
||||||
|
* * -1 - on failure
|
||||||
|
*/
|
||||||
|
static int read_bin_file(char *bin, void **data, off_t *bin_size)
|
||||||
|
{
|
||||||
|
FILE *g;
|
||||||
|
struct stat bin_stat;
|
||||||
|
void *buf;
|
||||||
|
size_t size;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
g = fopen(bin, "r");
|
||||||
|
if (!g) {
|
||||||
|
fprintf(stderr, "cannot open %s\n", bin);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (stat(bin, &bin_stat) < 0) {
|
||||||
|
fprintf(stderr, "cannot determine the size of %s\n", bin);
|
||||||
|
ret = -1;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
if (bin_stat.st_size > SIZE_MAX) {
|
||||||
|
fprintf(stderr, "file size is too large for malloc: %s\n", bin);
|
||||||
|
ret = -1;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
buf = malloc(bin_stat.st_size);
|
||||||
|
if (!buf) {
|
||||||
|
fprintf(stderr, "cannot allocate memory: %zx\n",
|
||||||
|
(size_t)bin_stat.st_size);
|
||||||
|
ret = -1;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
size = fread(buf, 1, bin_stat.st_size, g);
|
||||||
|
if (size < bin_stat.st_size) {
|
||||||
|
fprintf(stderr, "read failed (%zx)\n", size);
|
||||||
|
ret = -1;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
*data = buf;
|
||||||
|
*bin_size = bin_stat.st_size;
|
||||||
|
err:
|
||||||
|
fclose(g);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* write_capsule_file - write a capsule file
|
||||||
|
* @bin: FILE stream
|
||||||
|
* @data: Pointer to data
|
||||||
|
* @bin_size: Size of data
|
||||||
|
*
|
||||||
|
* Write out data, @data, with the size @bin_size.
|
||||||
|
*
|
||||||
|
* Return:
|
||||||
|
* * 0 - on success
|
||||||
|
* * -1 - on failure
|
||||||
|
*/
|
||||||
|
static int write_capsule_file(FILE *f, void *data, size_t size, const char *msg)
|
||||||
|
{
|
||||||
|
size_t size_written;
|
||||||
|
|
||||||
|
size_written = fwrite(data, 1, size, f);
|
||||||
|
if (size_written < size) {
|
||||||
|
fprintf(stderr, "%s: write failed (%zx != %zx)\n", msg,
|
||||||
|
size_written, size);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create_fwbin - create an uefi capsule file
|
||||||
|
* @path: Path to a created capsule file
|
||||||
|
* @bin: Path to a firmware binary to encapsulate
|
||||||
|
* @guid: GUID of related FMP driver
|
||||||
|
* @index: Index number in capsule
|
||||||
|
* @instance: Instance number in capsule
|
||||||
|
* @mcount: Monotonic count in authentication information
|
||||||
|
* @private_file: Path to a private key file
|
||||||
|
* @cert_file: Path to a certificate file
|
||||||
|
*
|
||||||
|
* This function actually does the job of creating an uefi capsule file.
|
||||||
|
* All the arguments must be supplied.
|
||||||
|
* If either @private_file ror @cert_file is NULL, the capsule file
|
||||||
|
* won't be signed.
|
||||||
|
*
|
||||||
|
* Return:
|
||||||
|
* * 0 - on success
|
||||||
|
* * -1 - on failure
|
||||||
|
*/
|
||||||
static int create_fwbin(char *path, char *bin, efi_guid_t *guid,
|
static int create_fwbin(char *path, char *bin, efi_guid_t *guid,
|
||||||
unsigned long index, unsigned long instance)
|
unsigned long index, unsigned long instance)
|
||||||
{
|
{
|
||||||
struct efi_capsule_header header;
|
struct efi_capsule_header header;
|
||||||
struct efi_firmware_management_capsule_header capsule;
|
struct efi_firmware_management_capsule_header capsule;
|
||||||
struct efi_firmware_management_capsule_image_header image;
|
struct efi_firmware_management_capsule_image_header image;
|
||||||
FILE *f, *g;
|
FILE *f;
|
||||||
struct stat bin_stat;
|
void *data;
|
||||||
u8 *data;
|
off_t bin_size;
|
||||||
size_t size;
|
|
||||||
u64 offset;
|
u64 offset;
|
||||||
|
int ret;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("For output: %s\n", path);
|
printf("For output: %s\n", path);
|
||||||
@@ -79,25 +185,28 @@ static int create_fwbin(char *path, char *bin, efi_guid_t *guid,
|
|||||||
printf("\tindex: %ld\n\tinstance: %ld\n", index, instance);
|
printf("\tindex: %ld\n\tinstance: %ld\n", index, instance);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
g = fopen(bin, "r");
|
f = NULL;
|
||||||
if (!g) {
|
data = NULL;
|
||||||
printf("cannot open %s\n", bin);
|
ret = -1;
|
||||||
return -1;
|
|
||||||
}
|
/*
|
||||||
if (stat(bin, &bin_stat) < 0) {
|
* read a firmware binary
|
||||||
printf("cannot determine the size of %s\n", bin);
|
*/
|
||||||
goto err_1;
|
if (read_bin_file(bin, &data, &bin_size))
|
||||||
}
|
goto err;
|
||||||
data = malloc(bin_stat.st_size);
|
|
||||||
if (!data) {
|
/*
|
||||||
printf("cannot allocate memory: %zx\n", (size_t)bin_stat.st_size);
|
* write a capsule file
|
||||||
goto err_1;
|
*/
|
||||||
}
|
|
||||||
f = fopen(path, "w");
|
f = fopen(path, "w");
|
||||||
if (!f) {
|
if (!f) {
|
||||||
printf("cannot open %s\n", path);
|
fprintf(stderr, "cannot open %s\n", path);
|
||||||
goto err_2;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* capsule file header
|
||||||
|
*/
|
||||||
header.capsule_guid = efi_guid_fm_capsule;
|
header.capsule_guid = efi_guid_fm_capsule;
|
||||||
header.header_size = sizeof(header);
|
header.header_size = sizeof(header);
|
||||||
/* TODO: The current implementation ignores flags */
|
/* TODO: The current implementation ignores flags */
|
||||||
@@ -105,70 +214,57 @@ static int create_fwbin(char *path, char *bin, efi_guid_t *guid,
|
|||||||
header.capsule_image_size = sizeof(header)
|
header.capsule_image_size = sizeof(header)
|
||||||
+ sizeof(capsule) + sizeof(u64)
|
+ sizeof(capsule) + sizeof(u64)
|
||||||
+ sizeof(image)
|
+ sizeof(image)
|
||||||
+ bin_stat.st_size;
|
+ bin_size;
|
||||||
|
if (write_capsule_file(f, &header, sizeof(header),
|
||||||
size = fwrite(&header, 1, sizeof(header), f);
|
"Capsule header"))
|
||||||
if (size < sizeof(header)) {
|
goto err;
|
||||||
printf("write failed (%zx)\n", size);
|
|
||||||
goto err_3;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* firmware capsule header
|
||||||
|
* This capsule has only one firmware capsule image.
|
||||||
|
*/
|
||||||
capsule.version = 0x00000001;
|
capsule.version = 0x00000001;
|
||||||
capsule.embedded_driver_count = 0;
|
capsule.embedded_driver_count = 0;
|
||||||
capsule.payload_item_count = 1;
|
capsule.payload_item_count = 1;
|
||||||
size = fwrite(&capsule, 1, sizeof(capsule), f);
|
if (write_capsule_file(f, &capsule, sizeof(capsule),
|
||||||
if (size < (sizeof(capsule))) {
|
"Firmware capsule header"))
|
||||||
printf("write failed (%zx)\n", size);
|
goto err;
|
||||||
goto err_3;
|
|
||||||
}
|
|
||||||
offset = sizeof(capsule) + sizeof(u64);
|
|
||||||
size = fwrite(&offset, 1, sizeof(offset), f);
|
|
||||||
if (size < sizeof(offset)) {
|
|
||||||
printf("write failed (%zx)\n", size);
|
|
||||||
goto err_3;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
offset = sizeof(capsule) + sizeof(u64);
|
||||||
|
if (write_capsule_file(f, &offset, sizeof(offset),
|
||||||
|
"Offset to capsule image"))
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* firmware capsule image header
|
||||||
|
*/
|
||||||
image.version = 0x00000003;
|
image.version = 0x00000003;
|
||||||
memcpy(&image.update_image_type_id, guid, sizeof(*guid));
|
memcpy(&image.update_image_type_id, guid, sizeof(*guid));
|
||||||
image.update_image_index = index;
|
image.update_image_index = index;
|
||||||
image.reserved[0] = 0;
|
image.reserved[0] = 0;
|
||||||
image.reserved[1] = 0;
|
image.reserved[1] = 0;
|
||||||
image.reserved[2] = 0;
|
image.reserved[2] = 0;
|
||||||
image.update_image_size = bin_stat.st_size;
|
image.update_image_size = bin_size;
|
||||||
image.update_vendor_code_size = 0; /* none */
|
image.update_vendor_code_size = 0; /* none */
|
||||||
image.update_hardware_instance = instance;
|
image.update_hardware_instance = instance;
|
||||||
image.image_capsule_support = 0;
|
image.image_capsule_support = 0;
|
||||||
|
if (write_capsule_file(f, &image, sizeof(image),
|
||||||
|
"Firmware capsule image header"))
|
||||||
|
goto err;
|
||||||
|
|
||||||
size = fwrite(&image, 1, sizeof(image), f);
|
/*
|
||||||
if (size < sizeof(image)) {
|
* firmware binary
|
||||||
printf("write failed (%zx)\n", size);
|
*/
|
||||||
goto err_3;
|
if (write_capsule_file(f, data, bin_size, "Firmware binary"))
|
||||||
}
|
goto err;
|
||||||
size = fread(data, 1, bin_stat.st_size, g);
|
|
||||||
if (size < bin_stat.st_size) {
|
|
||||||
printf("read failed (%zx)\n", size);
|
|
||||||
goto err_3;
|
|
||||||
}
|
|
||||||
size = fwrite(data, 1, bin_stat.st_size, f);
|
|
||||||
if (size < bin_stat.st_size) {
|
|
||||||
printf("write failed (%zx)\n", size);
|
|
||||||
goto err_3;
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(f);
|
ret = 0;
|
||||||
fclose(g);
|
err:
|
||||||
|
if (f)
|
||||||
|
fclose(f);
|
||||||
free(data);
|
free(data);
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
|
|
||||||
err_3:
|
|
||||||
fclose(f);
|
|
||||||
err_2:
|
|
||||||
free(data);
|
|
||||||
err_1:
|
|
||||||
fclose(g);
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -194,7 +290,7 @@ int main(int argc, char **argv)
|
|||||||
switch (c) {
|
switch (c) {
|
||||||
case 'f':
|
case 'f':
|
||||||
if (file) {
|
if (file) {
|
||||||
printf("Image already specified\n");
|
fprintf(stderr, "Image already specified\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
file = optarg;
|
file = optarg;
|
||||||
@@ -202,7 +298,7 @@ int main(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
if (file) {
|
if (file) {
|
||||||
printf("Image already specified\n");
|
fprintf(stderr, "Image already specified\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
file = optarg;
|
file = optarg;
|
||||||
@@ -234,7 +330,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
if (create_fwbin(argv[optind], file, guid, index, instance)
|
if (create_fwbin(argv[optind], file, guid, index, instance)
|
||||||
< 0) {
|
< 0) {
|
||||||
printf("Creating firmware capsule failed\n");
|
fprintf(stderr, "Creating firmware capsule failed\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user