mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2025-09-23 06:41:36 +02:00
Pull request efi-2023-04-rc1-3
Documentation: * Improve the sl-mx8mm documenation * Clean up README, move some section to HTML * Man-pages for the mtime and sleep command * Description of reducible builds * Document dynamic event handlers UEFI: * Support scrolling in eficonfig command Other: * fix mtest on 64 bit systems -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEbcT5xx8ppvoGt20zxIHbvCwFGsQFAmPUIOwACgkQxIHbvCwF GsR+txAAhrFDZcQrXpdtaP0ywx6T7zdrbEjYItywDTY2Luun9EAcLI/UUbBwQjxL Mumou2umY1ff+HqV8eCYA9UyVm5ztg8vpJo4oDMiUlS5o4dHLSJ1CUvsl4r25I8J NfGyE/iyRyHhDanjGo1gGnRbeXnz4pigtEXa9XOcaSlFezV2UeXWw8LWSo0iTQK+ 94+yJsCe+ZIOfpRX20trPb2VtbDPWHIjo+cb+HG3xdgUvL5kUZR/9NvG3npshJBy lcclRHc2jL405GGuZGtzKDNigkLBQn1NhA8NluD+SATXQnWdg2zMyc15D6UV2V3u 82N33eNr/vobRtvt5cSVm7IP91PFAxNkA/rPRTShOluSa5MCZSDBF8esKOv1OngK HQLHEvV80H6qU6cWsG1L7INc2kSTRO71vDcsASnfh4gGTHwczOUUEo3oeiaEy5HA m6U02ymVdtXWuzA0XbrhbjGXHUp9TthdZT2UKDxGFrfPFO+gEtyVeINTBYgNkopc inqHdV0eDyTVl24TcimVoEEt/16W9MYa9K+hu0FLHshRR0mpRDlhC058SwRseZCL 6qfuqmF5W0y5vFTWXPAiN1HmyusklTl3XIMrV/LX1bKJBZdOB71V+9OMbRirqiWS a7H05IPYili4l/1iSEoPRsxTP+rWcXKP21AAjIk1CtXW9OeOu8w= =FY9O -----END PGP SIGNATURE----- Merge tag 'efi-2023-04-rc1-3' of https://source.denx.de/u-boot/custodians/u-boot-efi Pull request efi-2023-04-rc1-3 Documentation: * Improve the sl-mx8mm documenation * Clean up README, move some section to HTML * Man-pages for the mtime and sleep command * Description of reducible builds * Document dynamic event handlers UEFI: * Support scrolling in eficonfig command Other: * fix mtest on 64 bit systems
This commit is contained in:
commit
aa7c61f629
296
README
296
README
@ -28,20 +28,16 @@ load and run it dynamically.
|
|||||||
Status:
|
Status:
|
||||||
=======
|
=======
|
||||||
|
|
||||||
In general, all boards for which a configuration option exists in the
|
In general, all boards for which a default configuration file exists in the
|
||||||
Makefile have been tested to some extent and can be considered
|
configs/ directory have been tested to some extent and can be considered
|
||||||
"working". In fact, many of them are used in production systems.
|
"working". In fact, many of them are used in production systems.
|
||||||
|
|
||||||
In case of problems see the CHANGELOG file to find out who contributed
|
In case of problems you can use
|
||||||
the specific port. In addition, there are various MAINTAINERS files
|
|
||||||
scattered throughout the U-Boot source identifying the people or
|
|
||||||
companies responsible for various boards and subsystems.
|
|
||||||
|
|
||||||
Note: As of August, 2010, there is no longer a CHANGELOG file in the
|
scripts/get_maintainer.pl <path>
|
||||||
actual U-Boot source tree; however, it can be created dynamically
|
|
||||||
from the Git log using:
|
|
||||||
|
|
||||||
make CHANGELOG
|
to identify the people or companies responsible for various boards and
|
||||||
|
subsystems. Or have a look at the git log.
|
||||||
|
|
||||||
|
|
||||||
Where to get help:
|
Where to get help:
|
||||||
@ -109,60 +105,6 @@ the string "u_boot" or on "U_BOOT". Example:
|
|||||||
IH_OS_U_BOOT u_boot_hush_start
|
IH_OS_U_BOOT u_boot_hush_start
|
||||||
|
|
||||||
|
|
||||||
Versioning:
|
|
||||||
===========
|
|
||||||
|
|
||||||
Starting with the release in October 2008, the names of the releases
|
|
||||||
were changed from numerical release numbers without deeper meaning
|
|
||||||
into a time stamp based numbering. Regular releases are identified by
|
|
||||||
names consisting of the calendar year and month of the release date.
|
|
||||||
Additional fields (if present) indicate release candidates or bug fix
|
|
||||||
releases in "stable" maintenance trees.
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
U-Boot v2009.11 - Release November 2009
|
|
||||||
U-Boot v2009.11.1 - Release 1 in version November 2009 stable tree
|
|
||||||
U-Boot v2010.09-rc1 - Release candidate 1 for September 2010 release
|
|
||||||
|
|
||||||
|
|
||||||
Directory Hierarchy:
|
|
||||||
====================
|
|
||||||
|
|
||||||
/arch Architecture-specific files
|
|
||||||
/arc Files generic to ARC architecture
|
|
||||||
/arm Files generic to ARM architecture
|
|
||||||
/m68k Files generic to m68k architecture
|
|
||||||
/microblaze Files generic to microblaze architecture
|
|
||||||
/mips Files generic to MIPS architecture
|
|
||||||
/nios2 Files generic to Altera NIOS2 architecture
|
|
||||||
/powerpc Files generic to PowerPC architecture
|
|
||||||
/riscv Files generic to RISC-V architecture
|
|
||||||
/sandbox Files generic to HW-independent "sandbox"
|
|
||||||
/sh Files generic to SH architecture
|
|
||||||
/x86 Files generic to x86 architecture
|
|
||||||
/xtensa Files generic to Xtensa architecture
|
|
||||||
/api Machine/arch-independent API for external apps
|
|
||||||
/board Board-dependent files
|
|
||||||
/boot Support for images and booting
|
|
||||||
/cmd U-Boot commands functions
|
|
||||||
/common Misc architecture-independent functions
|
|
||||||
/configs Board default configuration files
|
|
||||||
/disk Code for disk drive partition handling
|
|
||||||
/doc Documentation (a mix of ReST and READMEs)
|
|
||||||
/drivers Device drivers
|
|
||||||
/dts Makefile for building internal U-Boot fdt.
|
|
||||||
/env Environment support
|
|
||||||
/examples Example code for standalone applications, etc.
|
|
||||||
/fs Filesystem code (cramfs, ext2, jffs2, etc.)
|
|
||||||
/include Header Files
|
|
||||||
/lib Library routines generic to all architectures
|
|
||||||
/Licenses Various license files
|
|
||||||
/net Networking code
|
|
||||||
/post Power On Self Test
|
|
||||||
/scripts Various build scripts and Makefiles
|
|
||||||
/test Various unit test files
|
|
||||||
/tools Tools to build and sign FIT images, etc.
|
|
||||||
|
|
||||||
Software Configuration:
|
Software Configuration:
|
||||||
=======================
|
=======================
|
||||||
|
|
||||||
@ -189,7 +131,7 @@ board. This allows feature development which is not board- or architecture-
|
|||||||
specific to be undertaken on a native platform. The sandbox is also used to
|
specific to be undertaken on a native platform. The sandbox is also used to
|
||||||
run some of U-Boot's tests.
|
run some of U-Boot's tests.
|
||||||
|
|
||||||
See doc/arch/sandbox.rst for more details.
|
See doc/arch/sandbox/sandbox.rst for more details.
|
||||||
|
|
||||||
|
|
||||||
Board Initialisation Flow:
|
Board Initialisation Flow:
|
||||||
@ -1717,17 +1659,6 @@ This firmware often needs to be loaded during U-Boot booting.
|
|||||||
- CONFIG_SYS_MC_RSV_MEM_ALIGN
|
- CONFIG_SYS_MC_RSV_MEM_ALIGN
|
||||||
Define alignment of reserved memory MC requires
|
Define alignment of reserved memory MC requires
|
||||||
|
|
||||||
Reproducible builds
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
In order to achieve reproducible builds, timestamps used in the U-Boot build
|
|
||||||
process have to be set to a fixed value.
|
|
||||||
|
|
||||||
This is done using the SOURCE_DATE_EPOCH environment variable.
|
|
||||||
SOURCE_DATE_EPOCH is to be set on the build host's shell, not as a configuration
|
|
||||||
option for U-Boot or an environment variable in U-Boot.
|
|
||||||
|
|
||||||
SOURCE_DATE_EPOCH should be set to a number of seconds since the epoch, in UTC.
|
|
||||||
|
|
||||||
Building the Software:
|
Building the Software:
|
||||||
======================
|
======================
|
||||||
@ -2526,35 +2457,6 @@ configuration to your "File transfer protocols" section:
|
|||||||
Y kermit /usr/bin/kermit -i -l %l -r N D Y N N
|
Y kermit /usr/bin/kermit -i -l %l -r N D Y N N
|
||||||
|
|
||||||
|
|
||||||
NetBSD Notes:
|
|
||||||
=============
|
|
||||||
|
|
||||||
Starting at version 0.9.2, U-Boot supports NetBSD both as host
|
|
||||||
(build U-Boot) and target system (boots NetBSD/mpc8xx).
|
|
||||||
|
|
||||||
Building requires a cross environment; it is known to work on
|
|
||||||
NetBSD/i386 with the cross-powerpc-netbsd-1.3 package (you will also
|
|
||||||
need gmake since the Makefiles are not compatible with BSD make).
|
|
||||||
Note that the cross-powerpc package does not install include files;
|
|
||||||
attempting to build U-Boot will fail because <machine/ansi.h> is
|
|
||||||
missing. This file has to be installed and patched manually:
|
|
||||||
|
|
||||||
# cd /usr/pkg/cross/powerpc-netbsd/include
|
|
||||||
# mkdir powerpc
|
|
||||||
# ln -s powerpc machine
|
|
||||||
# cp /usr/src/sys/arch/powerpc/include/ansi.h powerpc/ansi.h
|
|
||||||
# ${EDIT} powerpc/ansi.h ## must remove __va_list, _BSD_VA_LIST
|
|
||||||
|
|
||||||
Native builds *don't* work due to incompatibilities between native
|
|
||||||
and U-Boot include files.
|
|
||||||
|
|
||||||
Booting assumes that (the first part of) the image booted is a
|
|
||||||
stage-2 loader which in turn loads and then invokes the kernel
|
|
||||||
proper. Loader sources will eventually appear in the NetBSD source
|
|
||||||
tree (probably in sys/arc/mpc8xx/stand/u-boot_stage2/); in the
|
|
||||||
meantime, see ftp://ftp.denx.de/pub/u-boot/ppcboot_stage2.tar.gz
|
|
||||||
|
|
||||||
|
|
||||||
Implementation Internals:
|
Implementation Internals:
|
||||||
=========================
|
=========================
|
||||||
|
|
||||||
@ -2788,182 +2690,10 @@ running from ROM, and because the code will have to be relocated to a
|
|||||||
new address in RAM.
|
new address in RAM.
|
||||||
|
|
||||||
|
|
||||||
U-Boot Porting Guide:
|
Contributing
|
||||||
----------------------
|
============
|
||||||
|
|
||||||
[Based on messages by Jerry Van Baren in the U-Boot-Users mailing
|
The U-Boot projects depends on contributions from the user community.
|
||||||
list, October 2002]
|
If you want to participate, please, have a look at the 'General'
|
||||||
|
section of https://u-boot.readthedocs.io/en/latest/develop/index.html
|
||||||
|
where we describe coding standards and the patch submission process.
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
sighandler_t no_more_time;
|
|
||||||
|
|
||||||
signal(SIGALRM, no_more_time);
|
|
||||||
alarm(PROJECT_DEADLINE - toSec (3 * WEEK));
|
|
||||||
|
|
||||||
if (available_money > available_manpower) {
|
|
||||||
Pay consultant to port U-Boot;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Download latest U-Boot source;
|
|
||||||
|
|
||||||
Subscribe to u-boot mailing list;
|
|
||||||
|
|
||||||
if (clueless)
|
|
||||||
email("Hi, I am new to U-Boot, how do I get started?");
|
|
||||||
|
|
||||||
while (learning) {
|
|
||||||
Read the README file in the top level directory;
|
|
||||||
Read https://www.denx.de/wiki/bin/view/DULG/Manual;
|
|
||||||
Read applicable doc/README.*;
|
|
||||||
Read the source, Luke;
|
|
||||||
/* find . -name "*.[chS]" | xargs grep -i <keyword> */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (available_money > toLocalCurrency ($2500))
|
|
||||||
Buy a BDI3000;
|
|
||||||
else
|
|
||||||
Add a lot of aggravation and time;
|
|
||||||
|
|
||||||
if (a similar board exists) { /* hopefully... */
|
|
||||||
cp -a board/<similar> board/<myboard>
|
|
||||||
cp include/configs/<similar>.h include/configs/<myboard>.h
|
|
||||||
} else {
|
|
||||||
Create your own board support subdirectory;
|
|
||||||
Create your own board include/configs/<myboard>.h file;
|
|
||||||
}
|
|
||||||
Edit new board/<myboard> files
|
|
||||||
Edit new include/configs/<myboard>.h
|
|
||||||
|
|
||||||
while (!accepted) {
|
|
||||||
while (!running) {
|
|
||||||
do {
|
|
||||||
Add / modify source code;
|
|
||||||
} until (compiles);
|
|
||||||
Debug;
|
|
||||||
if (clueless)
|
|
||||||
email("Hi, I am having problems...");
|
|
||||||
}
|
|
||||||
Send patch file to the U-Boot email list;
|
|
||||||
if (reasonable critiques)
|
|
||||||
Incorporate improvements from email list code review;
|
|
||||||
else
|
|
||||||
Defend code as written;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void no_more_time (int sig)
|
|
||||||
{
|
|
||||||
hire_a_guru();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Coding Standards:
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
All contributions to U-Boot should conform to the Linux kernel
|
|
||||||
coding style; see the kernel coding style guide at
|
|
||||||
https://www.kernel.org/doc/html/latest/process/coding-style.html, and the
|
|
||||||
script "scripts/Lindent" in your Linux kernel source directory.
|
|
||||||
|
|
||||||
Source files originating from a different project (for example the
|
|
||||||
MTD subsystem) are generally exempt from these guidelines and are not
|
|
||||||
reformatted to ease subsequent migration to newer versions of those
|
|
||||||
sources.
|
|
||||||
|
|
||||||
Please note that U-Boot is implemented in C (and to some small parts in
|
|
||||||
Assembler); no C++ is used, so please do not use C++ style comments (//)
|
|
||||||
in your code.
|
|
||||||
|
|
||||||
Please also stick to the following formatting rules:
|
|
||||||
- remove any trailing white space
|
|
||||||
- use TAB characters for indentation and vertical alignment, not spaces
|
|
||||||
- make sure NOT to use DOS '\r\n' line feeds
|
|
||||||
- do not add more than 2 consecutive empty lines to source files
|
|
||||||
- do not add trailing empty lines to source files
|
|
||||||
|
|
||||||
Submissions which do not conform to the standards may be returned
|
|
||||||
with a request to reformat the changes.
|
|
||||||
|
|
||||||
|
|
||||||
Submitting Patches:
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
Since the number of patches for U-Boot is growing, we need to
|
|
||||||
establish some rules. Submissions which do not conform to these rules
|
|
||||||
may be rejected, even when they contain important and valuable stuff.
|
|
||||||
|
|
||||||
Please see https://www.denx.de/wiki/U-Boot/Patches for details.
|
|
||||||
|
|
||||||
Patches shall be sent to the u-boot mailing list <u-boot@lists.denx.de>;
|
|
||||||
see https://lists.denx.de/listinfo/u-boot
|
|
||||||
|
|
||||||
When you send a patch, please include the following information with
|
|
||||||
it:
|
|
||||||
|
|
||||||
* For bug fixes: a description of the bug and how your patch fixes
|
|
||||||
this bug. Please try to include a way of demonstrating that the
|
|
||||||
patch actually fixes something.
|
|
||||||
|
|
||||||
* For new features: a description of the feature and your
|
|
||||||
implementation.
|
|
||||||
|
|
||||||
* For major contributions, add a MAINTAINERS file with your
|
|
||||||
information and associated file and directory references.
|
|
||||||
|
|
||||||
* When you add support for a new board, don't forget to add a
|
|
||||||
maintainer e-mail address to the boards.cfg file, too.
|
|
||||||
|
|
||||||
* If your patch adds new configuration options, don't forget to
|
|
||||||
document these in the README file.
|
|
||||||
|
|
||||||
* The patch itself. If you are using git (which is *strongly*
|
|
||||||
recommended) you can easily generate the patch using the
|
|
||||||
"git format-patch". If you then use "git send-email" to send it to
|
|
||||||
the U-Boot mailing list, you will avoid most of the common problems
|
|
||||||
with some other mail clients.
|
|
||||||
|
|
||||||
If you cannot use git, use "diff -purN OLD NEW". If your version of
|
|
||||||
diff does not support these options, then get the latest version of
|
|
||||||
GNU diff.
|
|
||||||
|
|
||||||
The current directory when running this command shall be the parent
|
|
||||||
directory of the U-Boot source tree (i. e. please make sure that
|
|
||||||
your patch includes sufficient directory information for the
|
|
||||||
affected files).
|
|
||||||
|
|
||||||
We prefer patches as plain text. MIME attachments are discouraged,
|
|
||||||
and compressed attachments must not be used.
|
|
||||||
|
|
||||||
* If one logical set of modifications affects or creates several
|
|
||||||
files, all these changes shall be submitted in a SINGLE patch file.
|
|
||||||
|
|
||||||
* Changesets that contain different, unrelated modifications shall be
|
|
||||||
submitted as SEPARATE patches, one patch per changeset.
|
|
||||||
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
|
|
||||||
* Before sending the patch, run the buildman script on your patched
|
|
||||||
source tree and make sure that no errors or warnings are reported
|
|
||||||
for any of the boards.
|
|
||||||
|
|
||||||
* Keep your modifications to the necessary minimum: A patch
|
|
||||||
containing several unrelated changes or arbitrary reformats will be
|
|
||||||
returned with a request to re-formatting / split it.
|
|
||||||
|
|
||||||
* If you modify existing code, make sure that your new code does not
|
|
||||||
add to the memory footprint of the code ;-) Small is beautiful!
|
|
||||||
When adding new features, these should compile conditionally only
|
|
||||||
(using #ifdef), and the resulting code with the new feature
|
|
||||||
disabled must not need more memory than the old code without your
|
|
||||||
modification.
|
|
||||||
|
|
||||||
* Remember that there is a size limit of 100 kB per message on the
|
|
||||||
u-boot mailing list. Bigger patches will be moderated. If they are
|
|
||||||
reasonable and not too big, they will be acknowledged. But patches
|
|
||||||
bigger than the size limit should be avoided.
|
|
||||||
|
401
cmd/eficonfig.c
401
cmd/eficonfig.c
@ -22,9 +22,21 @@
|
|||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
|
||||||
static struct efi_simple_text_input_protocol *cin;
|
static struct efi_simple_text_input_protocol *cin;
|
||||||
|
const char *eficonfig_menu_desc =
|
||||||
|
" Press UP/DOWN to move, ENTER to select, ESC/CTRL+C to quit";
|
||||||
|
|
||||||
|
static const char *eficonfig_change_boot_order_desc =
|
||||||
|
" Press UP/DOWN to move, +/- to change orde\n"
|
||||||
|
" Press SPACE to activate or deactivate the entry\n"
|
||||||
|
" Select [Save] to complete, ESC/CTRL+C to quit";
|
||||||
|
|
||||||
|
static struct efi_simple_text_output_protocol *cout;
|
||||||
|
static int avail_row;
|
||||||
|
|
||||||
#define EFICONFIG_DESCRIPTION_MAX 32
|
#define EFICONFIG_DESCRIPTION_MAX 32
|
||||||
#define EFICONFIG_OPTIONAL_DATA_MAX 64
|
#define EFICONFIG_OPTIONAL_DATA_MAX 64
|
||||||
|
#define EFICONFIG_MENU_HEADER_ROW_NUM 3
|
||||||
|
#define EFICONFIG_MENU_DESC_ROW_NUM 5
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct eficonfig_filepath_info - structure to be used to store file path
|
* struct eficonfig_filepath_info - structure to be used to store file path
|
||||||
@ -104,6 +116,41 @@ struct eficonfig_boot_order_data {
|
|||||||
bool active;
|
bool active;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct eficonfig_save_boot_order_data - structure to be used to change boot order
|
||||||
|
*
|
||||||
|
* @efi_menu: pointer to efimenu structure
|
||||||
|
* @selected: flag to indicate user selects "Save" entry
|
||||||
|
*/
|
||||||
|
struct eficonfig_save_boot_order_data {
|
||||||
|
struct efimenu *efi_menu;
|
||||||
|
bool selected;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct eficonfig_menu_adjust - update start and end entry index
|
||||||
|
*
|
||||||
|
* @efi_menu: pointer to efimenu structure
|
||||||
|
* @add: flag to add or substract the index
|
||||||
|
*/
|
||||||
|
static void eficonfig_menu_adjust(struct efimenu *efi_menu, bool add)
|
||||||
|
{
|
||||||
|
if (add)
|
||||||
|
++efi_menu->active;
|
||||||
|
else
|
||||||
|
--efi_menu->active;
|
||||||
|
|
||||||
|
if (add && efi_menu->end < efi_menu->active) {
|
||||||
|
efi_menu->start++;
|
||||||
|
efi_menu->end++;
|
||||||
|
} else if (!add && efi_menu->start > efi_menu->active) {
|
||||||
|
efi_menu->start--;
|
||||||
|
efi_menu->end--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#define eficonfig_menu_up(_a) eficonfig_menu_adjust(_a, false)
|
||||||
|
#define eficonfig_menu_down(_a) eficonfig_menu_adjust(_a, true)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* eficonfig_print_msg() - print message
|
* eficonfig_print_msg() - print message
|
||||||
*
|
*
|
||||||
@ -134,23 +181,21 @@ void eficonfig_print_msg(char *msg)
|
|||||||
*
|
*
|
||||||
* @data: pointer to the data associated with each menu entry
|
* @data: pointer to the data associated with each menu entry
|
||||||
*/
|
*/
|
||||||
static void eficonfig_print_entry(void *data)
|
void eficonfig_print_entry(void *data)
|
||||||
{
|
{
|
||||||
struct eficonfig_entry *entry = data;
|
struct eficonfig_entry *entry = data;
|
||||||
int reverse = (entry->efi_menu->active == entry->num);
|
bool reverse = (entry->efi_menu->active == entry->num);
|
||||||
|
|
||||||
/* TODO: support scroll or page for many entries */
|
if (entry->efi_menu->start > entry->num || entry->efi_menu->end < entry->num)
|
||||||
|
return;
|
||||||
|
|
||||||
/*
|
printf(ANSI_CURSOR_POSITION, (entry->num - entry->efi_menu->start) +
|
||||||
* Move cursor to line where the entry will be drawn (entry->num)
|
EFICONFIG_MENU_HEADER_ROW_NUM + 1, 7);
|
||||||
* First 3 lines(menu header) + 1 empty line
|
|
||||||
*/
|
|
||||||
printf(ANSI_CURSOR_POSITION, entry->num + 4, 7);
|
|
||||||
|
|
||||||
if (reverse)
|
if (reverse)
|
||||||
puts(ANSI_COLOR_REVERSE);
|
puts(ANSI_COLOR_REVERSE);
|
||||||
|
|
||||||
printf("%s", entry->title);
|
printf(ANSI_CLEAR_LINE "%s", entry->title);
|
||||||
|
|
||||||
if (reverse)
|
if (reverse)
|
||||||
puts(ANSI_COLOR_RESET);
|
puts(ANSI_COLOR_RESET);
|
||||||
@ -161,7 +206,7 @@ static void eficonfig_print_entry(void *data)
|
|||||||
*
|
*
|
||||||
* @m: pointer to the menu structure
|
* @m: pointer to the menu structure
|
||||||
*/
|
*/
|
||||||
static void eficonfig_display_statusline(struct menu *m)
|
void eficonfig_display_statusline(struct menu *m)
|
||||||
{
|
{
|
||||||
struct eficonfig_entry *entry;
|
struct eficonfig_entry *entry;
|
||||||
|
|
||||||
@ -171,10 +216,10 @@ static void eficonfig_display_statusline(struct menu *m)
|
|||||||
printf(ANSI_CURSOR_POSITION
|
printf(ANSI_CURSOR_POSITION
|
||||||
"\n%s\n"
|
"\n%s\n"
|
||||||
ANSI_CURSOR_POSITION ANSI_CLEAR_LINE ANSI_CURSOR_POSITION
|
ANSI_CURSOR_POSITION ANSI_CLEAR_LINE ANSI_CURSOR_POSITION
|
||||||
" Press UP/DOWN to move, ENTER to select, ESC/CTRL+C to quit"
|
"%s"
|
||||||
ANSI_CLEAR_LINE_TO_END ANSI_CURSOR_POSITION ANSI_CLEAR_LINE,
|
ANSI_CLEAR_LINE_TO_END,
|
||||||
1, 1, entry->efi_menu->menu_header, entry->efi_menu->count + 5, 1,
|
1, 1, entry->efi_menu->menu_header, avail_row + 4, 1,
|
||||||
entry->efi_menu->count + 6, 1, entry->efi_menu->count + 7, 1);
|
avail_row + 5, 1, entry->efi_menu->menu_desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -183,7 +228,7 @@ static void eficonfig_display_statusline(struct menu *m)
|
|||||||
* @data: pointer to the efimenu structure
|
* @data: pointer to the efimenu structure
|
||||||
* Return: key string to identify the selected entry
|
* Return: key string to identify the selected entry
|
||||||
*/
|
*/
|
||||||
static char *eficonfig_choice_entry(void *data)
|
char *eficonfig_choice_entry(void *data)
|
||||||
{
|
{
|
||||||
struct cli_ch_state s_cch, *cch = &s_cch;
|
struct cli_ch_state s_cch, *cch = &s_cch;
|
||||||
struct list_head *pos, *n;
|
struct list_head *pos, *n;
|
||||||
@ -199,12 +244,14 @@ static char *eficonfig_choice_entry(void *data)
|
|||||||
switch (key) {
|
switch (key) {
|
||||||
case BKEY_UP:
|
case BKEY_UP:
|
||||||
if (efi_menu->active > 0)
|
if (efi_menu->active > 0)
|
||||||
--efi_menu->active;
|
eficonfig_menu_up(efi_menu);
|
||||||
|
|
||||||
/* no menu key selected, regenerate menu */
|
/* no menu key selected, regenerate menu */
|
||||||
return NULL;
|
return NULL;
|
||||||
case BKEY_DOWN:
|
case BKEY_DOWN:
|
||||||
if (efi_menu->active < efi_menu->count - 1)
|
if (efi_menu->active < efi_menu->count - 1)
|
||||||
++efi_menu->active;
|
eficonfig_menu_down(efi_menu);
|
||||||
|
|
||||||
/* no menu key selected, regenerate menu */
|
/* no menu key selected, regenerate menu */
|
||||||
return NULL;
|
return NULL;
|
||||||
case BKEY_SELECT:
|
case BKEY_SELECT:
|
||||||
@ -361,9 +408,17 @@ out:
|
|||||||
*
|
*
|
||||||
* @efi_menu: pointer to the efimenu structure
|
* @efi_menu: pointer to the efimenu structure
|
||||||
* @menu_header: pointer to the menu header string
|
* @menu_header: pointer to the menu header string
|
||||||
|
* @menu_desc: pointer to the menu description
|
||||||
|
* @display_statusline: function pointer to draw statusline
|
||||||
|
* @item_data_print: function pointer to draw the menu item
|
||||||
|
* @item_choice: function pointer to handle the key press
|
||||||
* Return: status code
|
* Return: status code
|
||||||
*/
|
*/
|
||||||
efi_status_t eficonfig_process_common(struct efimenu *efi_menu, char *menu_header)
|
efi_status_t eficonfig_process_common(struct efimenu *efi_menu,
|
||||||
|
char *menu_header, const char *menu_desc,
|
||||||
|
void (*display_statusline)(struct menu *),
|
||||||
|
void (*item_data_print)(void *),
|
||||||
|
char *(*item_choice)(void *))
|
||||||
{
|
{
|
||||||
struct menu *menu;
|
struct menu *menu;
|
||||||
void *choice = NULL;
|
void *choice = NULL;
|
||||||
@ -376,16 +431,19 @@ efi_status_t eficonfig_process_common(struct efimenu *efi_menu, char *menu_heade
|
|||||||
|
|
||||||
efi_menu->delay = -1;
|
efi_menu->delay = -1;
|
||||||
efi_menu->active = 0;
|
efi_menu->active = 0;
|
||||||
|
efi_menu->start = 0;
|
||||||
|
efi_menu->end = avail_row - 1;
|
||||||
|
|
||||||
if (menu_header) {
|
if (menu_header) {
|
||||||
efi_menu->menu_header = strdup(menu_header);
|
efi_menu->menu_header = strdup(menu_header);
|
||||||
if (!efi_menu->menu_header)
|
if (!efi_menu->menu_header)
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
if (menu_desc)
|
||||||
|
efi_menu->menu_desc = menu_desc;
|
||||||
|
|
||||||
menu = menu_create(NULL, 0, 1, eficonfig_display_statusline,
|
menu = menu_create(NULL, 0, 1, display_statusline, item_data_print,
|
||||||
eficonfig_print_entry, eficonfig_choice_entry,
|
item_choice, efi_menu);
|
||||||
efi_menu);
|
|
||||||
if (!menu)
|
if (!menu)
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
|
|
||||||
@ -644,7 +702,12 @@ static efi_status_t eficonfig_select_volume(struct eficonfig_select_file_info *f
|
|||||||
if (ret != EFI_SUCCESS)
|
if (ret != EFI_SUCCESS)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ret = eficonfig_process_common(efi_menu, " ** Select Volume **");
|
ret = eficonfig_process_common(efi_menu, " ** Select Volume **",
|
||||||
|
eficonfig_menu_desc,
|
||||||
|
eficonfig_display_statusline,
|
||||||
|
eficonfig_print_entry,
|
||||||
|
eficonfig_choice_entry);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
efi_free_pool(volume_handles);
|
efi_free_pool(volume_handles);
|
||||||
list_for_each_safe(pos, n, &efi_menu->list) {
|
list_for_each_safe(pos, n, &efi_menu->list) {
|
||||||
@ -819,7 +882,11 @@ static efi_status_t eficonfig_show_file_selection(struct eficonfig_select_file_i
|
|||||||
if (ret != EFI_SUCCESS)
|
if (ret != EFI_SUCCESS)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
ret = eficonfig_process_common(efi_menu, " ** Select File **");
|
ret = eficonfig_process_common(efi_menu, " ** Select File **",
|
||||||
|
eficonfig_menu_desc,
|
||||||
|
eficonfig_display_statusline,
|
||||||
|
eficonfig_print_entry,
|
||||||
|
eficonfig_choice_entry);
|
||||||
err:
|
err:
|
||||||
EFI_CALL(f->close(f));
|
EFI_CALL(f->close(f));
|
||||||
eficonfig_destroy(efi_menu);
|
eficonfig_destroy(efi_menu);
|
||||||
@ -980,7 +1047,11 @@ efi_status_t eficonfig_process_show_file_option(void *data)
|
|||||||
if (!efi_menu)
|
if (!efi_menu)
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
|
||||||
ret = eficonfig_process_common(efi_menu, " ** Update File **");
|
ret = eficonfig_process_common(efi_menu, " ** Update File **",
|
||||||
|
eficonfig_menu_desc,
|
||||||
|
eficonfig_display_statusline,
|
||||||
|
eficonfig_print_entry,
|
||||||
|
eficonfig_choice_entry);
|
||||||
if (ret != EFI_SUCCESS) /* User selects "Clear" or "Quit" */
|
if (ret != EFI_SUCCESS) /* User selects "Clear" or "Quit" */
|
||||||
ret = EFI_NOT_READY;
|
ret = EFI_NOT_READY;
|
||||||
|
|
||||||
@ -1326,7 +1397,12 @@ static efi_status_t eficonfig_show_boot_option(struct eficonfig_boot_option *bo,
|
|||||||
if (ret != EFI_SUCCESS)
|
if (ret != EFI_SUCCESS)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ret = eficonfig_process_common(efi_menu, header_str);
|
ret = eficonfig_process_common(efi_menu, header_str,
|
||||||
|
eficonfig_menu_desc,
|
||||||
|
eficonfig_display_statusline,
|
||||||
|
eficonfig_print_entry,
|
||||||
|
eficonfig_choice_entry);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
eficonfig_destroy(efi_menu);
|
eficonfig_destroy(efi_menu);
|
||||||
|
|
||||||
@ -1745,7 +1821,11 @@ static efi_status_t eficonfig_show_boot_selection(unsigned int *selected)
|
|||||||
if (ret != EFI_SUCCESS)
|
if (ret != EFI_SUCCESS)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ret = eficonfig_process_common(efi_menu, " ** Select Boot Option **");
|
ret = eficonfig_process_common(efi_menu, " ** Select Boot Option **",
|
||||||
|
eficonfig_menu_desc,
|
||||||
|
eficonfig_display_statusline,
|
||||||
|
eficonfig_print_entry,
|
||||||
|
eficonfig_choice_entry);
|
||||||
out:
|
out:
|
||||||
list_for_each_safe(pos, n, &efi_menu->list) {
|
list_for_each_safe(pos, n, &efi_menu->list) {
|
||||||
entry = list_entry(pos, struct eficonfig_entry, list);
|
entry = list_entry(pos, struct eficonfig_entry, list);
|
||||||
@ -1810,63 +1890,48 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* eficonfig_display_change_boot_order() - display the BootOrder list
|
* eficonfig_print_change_boot_order_entry() - print the boot option entry
|
||||||
*
|
*
|
||||||
* @efi_menu: pointer to the efimenu structure
|
* @data: pointer to the data associated with each menu entry
|
||||||
* Return: status code
|
|
||||||
*/
|
*/
|
||||||
static void eficonfig_display_change_boot_order(struct efimenu *efi_menu)
|
static void eficonfig_print_change_boot_order_entry(void *data)
|
||||||
{
|
{
|
||||||
bool reverse;
|
struct eficonfig_entry *entry = data;
|
||||||
struct list_head *pos, *n;
|
bool reverse = (entry->efi_menu->active == entry->num);
|
||||||
struct eficonfig_entry *entry;
|
|
||||||
|
|
||||||
printf(ANSI_CLEAR_CONSOLE ANSI_CURSOR_POSITION
|
if (entry->efi_menu->start > entry->num || entry->efi_menu->end < entry->num)
|
||||||
"\n ** Change Boot Order **\n"
|
return;
|
||||||
ANSI_CURSOR_POSITION
|
|
||||||
" Press UP/DOWN to move, +/- to change order"
|
|
||||||
ANSI_CURSOR_POSITION
|
|
||||||
" Press SPACE to activate or deactivate the entry"
|
|
||||||
ANSI_CURSOR_POSITION
|
|
||||||
" Select [Save] to complete, ESC/CTRL+C to quit"
|
|
||||||
ANSI_CURSOR_POSITION ANSI_CLEAR_LINE,
|
|
||||||
1, 1, efi_menu->count + 5, 1, efi_menu->count + 6, 1,
|
|
||||||
efi_menu->count + 7, 1, efi_menu->count + 8, 1);
|
|
||||||
|
|
||||||
/* draw boot option list */
|
printf(ANSI_CURSOR_POSITION ANSI_CLEAR_LINE,
|
||||||
list_for_each_safe(pos, n, &efi_menu->list) {
|
(entry->num - entry->efi_menu->start) + EFICONFIG_MENU_HEADER_ROW_NUM + 1, 7);
|
||||||
entry = list_entry(pos, struct eficonfig_entry, list);
|
|
||||||
reverse = (entry->num == efi_menu->active);
|
|
||||||
|
|
||||||
printf(ANSI_CURSOR_POSITION, entry->num + 4, 7);
|
if (reverse)
|
||||||
|
puts(ANSI_COLOR_REVERSE);
|
||||||
|
|
||||||
if (reverse)
|
if (entry->num < entry->efi_menu->count - 2) {
|
||||||
puts(ANSI_COLOR_REVERSE);
|
if (((struct eficonfig_boot_order_data *)entry->data)->active)
|
||||||
|
printf("[*] ");
|
||||||
if (entry->num < efi_menu->count - 2) {
|
else
|
||||||
if (((struct eficonfig_boot_order_data *)entry->data)->active)
|
printf("[ ] ");
|
||||||
printf("[*] ");
|
|
||||||
else
|
|
||||||
printf("[ ] ");
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("%s", entry->title);
|
|
||||||
|
|
||||||
if (reverse)
|
|
||||||
puts(ANSI_COLOR_RESET);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("%s", entry->title);
|
||||||
|
|
||||||
|
if (reverse)
|
||||||
|
puts(ANSI_COLOR_RESET);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* eficonfig_choice_change_boot_order() - handle the BootOrder update
|
* eficonfig_choice_change_boot_order() - user key input handler
|
||||||
*
|
*
|
||||||
* @efi_menu: pointer to the efimenu structure
|
* @data: pointer to the menu entry
|
||||||
* Return: status code
|
* Return: key string to identify the selected entry
|
||||||
*/
|
*/
|
||||||
static efi_status_t eficonfig_choice_change_boot_order(struct efimenu *efi_menu)
|
char *eficonfig_choice_change_boot_order(void *data)
|
||||||
{
|
{
|
||||||
struct cli_ch_state s_cch, *cch = &s_cch;
|
struct cli_ch_state s_cch, *cch = &s_cch;
|
||||||
struct list_head *pos, *n;
|
struct list_head *pos, *n;
|
||||||
|
struct efimenu *efi_menu = data;
|
||||||
enum bootmenu_key key = BKEY_NONE;
|
enum bootmenu_key key = BKEY_NONE;
|
||||||
struct eficonfig_entry *entry, *tmp;
|
struct eficonfig_entry *entry, *tmp;
|
||||||
|
|
||||||
@ -1876,7 +1941,8 @@ static efi_status_t eficonfig_choice_change_boot_order(struct efimenu *efi_menu)
|
|||||||
|
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case BKEY_PLUS:
|
case BKEY_PLUS:
|
||||||
if (efi_menu->active > 0) {
|
if (efi_menu->active > 0 &&
|
||||||
|
efi_menu->active < efi_menu->count - 2) {
|
||||||
list_for_each_safe(pos, n, &efi_menu->list) {
|
list_for_each_safe(pos, n, &efi_menu->list) {
|
||||||
entry = list_entry(pos, struct eficonfig_entry, list);
|
entry = list_entry(pos, struct eficonfig_entry, list);
|
||||||
if (entry->num == efi_menu->active)
|
if (entry->num == efi_menu->active)
|
||||||
@ -1887,12 +1953,15 @@ static efi_status_t eficonfig_choice_change_boot_order(struct efimenu *efi_menu)
|
|||||||
tmp->num++;
|
tmp->num++;
|
||||||
list_del(&tmp->list);
|
list_del(&tmp->list);
|
||||||
list_add(&tmp->list, &entry->list);
|
list_add(&tmp->list, &entry->list);
|
||||||
|
|
||||||
|
eficonfig_menu_up(efi_menu);
|
||||||
}
|
}
|
||||||
fallthrough;
|
return NULL;
|
||||||
case BKEY_UP:
|
case BKEY_UP:
|
||||||
if (efi_menu->active > 0)
|
if (efi_menu->active > 0)
|
||||||
--efi_menu->active;
|
eficonfig_menu_up(efi_menu);
|
||||||
return EFI_NOT_READY;
|
|
||||||
|
return NULL;
|
||||||
case BKEY_MINUS:
|
case BKEY_MINUS:
|
||||||
if (efi_menu->active < efi_menu->count - 3) {
|
if (efi_menu->active < efi_menu->count - 3) {
|
||||||
list_for_each_safe(pos, n, &efi_menu->list) {
|
list_for_each_safe(pos, n, &efi_menu->list) {
|
||||||
@ -1906,22 +1975,32 @@ static efi_status_t eficonfig_choice_change_boot_order(struct efimenu *efi_menu)
|
|||||||
list_del(&entry->list);
|
list_del(&entry->list);
|
||||||
list_add(&entry->list, &tmp->list);
|
list_add(&entry->list, &tmp->list);
|
||||||
|
|
||||||
++efi_menu->active;
|
eficonfig_menu_down(efi_menu);
|
||||||
}
|
}
|
||||||
return EFI_NOT_READY;
|
return NULL;
|
||||||
case BKEY_DOWN:
|
case BKEY_DOWN:
|
||||||
if (efi_menu->active < efi_menu->count - 1)
|
if (efi_menu->active < efi_menu->count - 1)
|
||||||
++efi_menu->active;
|
eficonfig_menu_down(efi_menu);
|
||||||
return EFI_NOT_READY;
|
|
||||||
|
return NULL;
|
||||||
case BKEY_SELECT:
|
case BKEY_SELECT:
|
||||||
/* "Save" */
|
/* "Save" */
|
||||||
if (efi_menu->active == efi_menu->count - 2)
|
if (efi_menu->active == efi_menu->count - 2) {
|
||||||
return EFI_SUCCESS;
|
list_for_each_prev_safe(pos, n, &efi_menu->list) {
|
||||||
|
entry = list_entry(pos, struct eficonfig_entry, list);
|
||||||
|
if (entry->num == efi_menu->active)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return entry->key;
|
||||||
|
}
|
||||||
/* "Quit" */
|
/* "Quit" */
|
||||||
if (efi_menu->active == efi_menu->count - 1)
|
if (efi_menu->active == efi_menu->count - 1) {
|
||||||
return EFI_ABORTED;
|
entry = list_last_entry(&efi_menu->list,
|
||||||
|
struct eficonfig_entry,
|
||||||
|
list);
|
||||||
|
return entry->key;
|
||||||
|
}
|
||||||
|
/* Pressed key is not valid, wait next key press */
|
||||||
break;
|
break;
|
||||||
case BKEY_SPACE:
|
case BKEY_SPACE:
|
||||||
if (efi_menu->active < efi_menu->count - 2) {
|
if (efi_menu->active < efi_menu->count - 2) {
|
||||||
@ -1931,20 +2010,84 @@ static efi_status_t eficonfig_choice_change_boot_order(struct efimenu *efi_menu)
|
|||||||
struct eficonfig_boot_order_data *data = entry->data;
|
struct eficonfig_boot_order_data *data = entry->data;
|
||||||
|
|
||||||
data->active = !data->active;
|
data->active = !data->active;
|
||||||
return EFI_NOT_READY;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* Pressed key is not valid, wait next key press */
|
||||||
break;
|
break;
|
||||||
case BKEY_QUIT:
|
case BKEY_QUIT:
|
||||||
return EFI_ABORTED;
|
entry = list_last_entry(&efi_menu->list,
|
||||||
|
struct eficonfig_entry, list);
|
||||||
|
return entry->key;
|
||||||
default:
|
default:
|
||||||
/* Pressed key is not valid, no need to regenerate the menu */
|
/* Pressed key is not valid, wait next key press */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* eficonfig_process_save_boot_order() - callback function for "Save" entry
|
||||||
|
*
|
||||||
|
* @data: pointer to the data
|
||||||
|
* Return: status code
|
||||||
|
*/
|
||||||
|
static efi_status_t eficonfig_process_save_boot_order(void *data)
|
||||||
|
{
|
||||||
|
u32 count = 0;
|
||||||
|
efi_status_t ret;
|
||||||
|
efi_uintn_t size;
|
||||||
|
struct list_head *pos, *n;
|
||||||
|
u16 *new_bootorder;
|
||||||
|
struct efimenu *efi_menu;
|
||||||
|
struct eficonfig_entry *entry;
|
||||||
|
struct eficonfig_save_boot_order_data *save_data = data;
|
||||||
|
|
||||||
|
efi_menu = save_data->efi_menu;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The change boot order menu always has "Save" and "Quit" entries.
|
||||||
|
* !(efi_menu->count - 2) means there is no user defined boot option.
|
||||||
|
*/
|
||||||
|
if (!(efi_menu->count - 2))
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
|
||||||
|
new_bootorder = calloc(1, (efi_menu->count - 2) * sizeof(u16));
|
||||||
|
if (!new_bootorder) {
|
||||||
|
ret = EFI_OUT_OF_RESOURCES;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create new BootOrder */
|
||||||
|
count = 0;
|
||||||
|
list_for_each_safe(pos, n, &efi_menu->list) {
|
||||||
|
struct eficonfig_boot_order_data *data;
|
||||||
|
|
||||||
|
entry = list_entry(pos, struct eficonfig_entry, list);
|
||||||
|
/* exit the loop when iteration reaches "Save" */
|
||||||
|
if (!strncmp(entry->title, "Save", strlen("Save")))
|
||||||
|
break;
|
||||||
|
|
||||||
|
data = entry->data;
|
||||||
|
if (data->active)
|
||||||
|
new_bootorder[count++] = data->boot_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
size = count * sizeof(u16);
|
||||||
|
ret = efi_set_variable_int(u"BootOrder", &efi_global_variable_guid,
|
||||||
|
EFI_VARIABLE_NON_VOLATILE |
|
||||||
|
EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
||||||
|
EFI_VARIABLE_RUNTIME_ACCESS,
|
||||||
|
size, new_bootorder, false);
|
||||||
|
|
||||||
|
save_data->selected = true;
|
||||||
|
out:
|
||||||
|
free(new_bootorder);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* eficonfig_add_change_boot_order_entry() - add boot order entry
|
* eficonfig_add_change_boot_order_entry() - add boot order entry
|
||||||
*
|
*
|
||||||
@ -2020,6 +2163,7 @@ static efi_status_t eficonfig_create_change_boot_order_entry(struct efimenu *efi
|
|||||||
efi_status_t ret;
|
efi_status_t ret;
|
||||||
u16 *var_name16 = NULL;
|
u16 *var_name16 = NULL;
|
||||||
efi_uintn_t size, buf_size;
|
efi_uintn_t size, buf_size;
|
||||||
|
struct eficonfig_save_boot_order_data *save_data;
|
||||||
|
|
||||||
/* list the load option in the order of BootOrder variable */
|
/* list the load option in the order of BootOrder variable */
|
||||||
for (i = 0; i < num; i++) {
|
for (i = 0; i < num; i++) {
|
||||||
@ -2070,7 +2214,17 @@ static efi_status_t eficonfig_create_change_boot_order_entry(struct efimenu *efi
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = eficonfig_append_menu_entry(efi_menu, title, NULL, NULL);
|
save_data = malloc(sizeof(struct eficonfig_save_boot_order_data));
|
||||||
|
if (!save_data) {
|
||||||
|
ret = EFI_OUT_OF_RESOURCES;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
save_data->efi_menu = efi_menu;
|
||||||
|
save_data->selected = false;
|
||||||
|
|
||||||
|
ret = eficonfig_append_menu_entry(efi_menu, title,
|
||||||
|
eficonfig_process_save_boot_order,
|
||||||
|
save_data);
|
||||||
if (ret != EFI_SUCCESS)
|
if (ret != EFI_SUCCESS)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@ -2093,7 +2247,6 @@ out:
|
|||||||
*/
|
*/
|
||||||
static efi_status_t eficonfig_process_change_boot_order(void *data)
|
static efi_status_t eficonfig_process_change_boot_order(void *data)
|
||||||
{
|
{
|
||||||
u32 count;
|
|
||||||
u16 *bootorder;
|
u16 *bootorder;
|
||||||
efi_status_t ret;
|
efi_status_t ret;
|
||||||
efi_uintn_t num, size;
|
efi_uintn_t num, size;
|
||||||
@ -2114,47 +2267,24 @@ static efi_status_t eficonfig_process_change_boot_order(void *data)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
eficonfig_display_change_boot_order(efi_menu);
|
ret = eficonfig_process_common(efi_menu,
|
||||||
|
" ** Change Boot Order **",
|
||||||
ret = eficonfig_choice_change_boot_order(efi_menu);
|
eficonfig_change_boot_order_desc,
|
||||||
if (ret == EFI_SUCCESS) {
|
eficonfig_display_statusline,
|
||||||
u16 *new_bootorder;
|
eficonfig_print_change_boot_order_entry,
|
||||||
|
eficonfig_choice_change_boot_order);
|
||||||
new_bootorder = calloc(1, (efi_menu->count - 2) * sizeof(u16));
|
/* exit from the menu if user selects the "Save" entry. */
|
||||||
if (!new_bootorder) {
|
if (ret == EFI_SUCCESS && efi_menu->active == (efi_menu->count - 2)) {
|
||||||
ret = EFI_OUT_OF_RESOURCES;
|
list_for_each_prev_safe(pos, n, &efi_menu->list) {
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create new BootOrder */
|
|
||||||
count = 0;
|
|
||||||
list_for_each_safe(pos, n, &efi_menu->list) {
|
|
||||||
struct eficonfig_boot_order_data *data;
|
|
||||||
|
|
||||||
entry = list_entry(pos, struct eficonfig_entry, list);
|
entry = list_entry(pos, struct eficonfig_entry, list);
|
||||||
/* exit the loop when iteration reaches "Save" */
|
if (entry->num == efi_menu->active)
|
||||||
if (!strncmp(entry->title, "Save", strlen("Save")))
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
data = entry->data;
|
|
||||||
if (data->active)
|
|
||||||
new_bootorder[count++] = data->boot_index;
|
|
||||||
}
|
}
|
||||||
|
if (((struct eficonfig_save_boot_order_data *)entry->data)->selected)
|
||||||
size = count * sizeof(u16);
|
break;
|
||||||
ret = efi_set_variable_int(u"BootOrder", &efi_global_variable_guid,
|
|
||||||
EFI_VARIABLE_NON_VOLATILE |
|
|
||||||
EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
|
||||||
EFI_VARIABLE_RUNTIME_ACCESS,
|
|
||||||
size, new_bootorder, false);
|
|
||||||
|
|
||||||
free(new_bootorder);
|
|
||||||
goto out;
|
|
||||||
} else if (ret == EFI_NOT_READY) {
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
if (ret != EFI_SUCCESS)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
free(bootorder);
|
free(bootorder);
|
||||||
@ -2500,6 +2630,7 @@ static efi_status_t eficonfig_init(void)
|
|||||||
efi_status_t ret = EFI_SUCCESS;
|
efi_status_t ret = EFI_SUCCESS;
|
||||||
static bool init;
|
static bool init;
|
||||||
struct efi_handler *handler;
|
struct efi_handler *handler;
|
||||||
|
unsigned long columns, rows;
|
||||||
|
|
||||||
if (!init) {
|
if (!init) {
|
||||||
ret = efi_search_protocol(efi_root, &efi_guid_text_input_protocol, &handler);
|
ret = efi_search_protocol(efi_root, &efi_guid_text_input_protocol, &handler);
|
||||||
@ -2510,6 +2641,23 @@ static efi_status_t eficonfig_init(void)
|
|||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL);
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL);
|
||||||
if (ret != EFI_SUCCESS)
|
if (ret != EFI_SUCCESS)
|
||||||
return ret;
|
return ret;
|
||||||
|
ret = efi_search_protocol(efi_root, &efi_guid_text_output_protocol, &handler);
|
||||||
|
if (ret != EFI_SUCCESS)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = efi_protocol_open(handler, (void **)&cout, efi_root, NULL,
|
||||||
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL);
|
||||||
|
if (ret != EFI_SUCCESS)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
cout->query_mode(cout, cout->mode->mode, &columns, &rows);
|
||||||
|
avail_row = rows - (EFICONFIG_MENU_HEADER_ROW_NUM +
|
||||||
|
EFICONFIG_MENU_DESC_ROW_NUM);
|
||||||
|
if (avail_row <= 0) {
|
||||||
|
eficonfig_print_msg("Console size is too small!");
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
/* TODO: Should we check the minimum column size? */
|
||||||
}
|
}
|
||||||
|
|
||||||
init = true;
|
init = true;
|
||||||
@ -2567,7 +2715,12 @@ static int do_eficonfig(struct cmd_tbl *cmdtp, int flag, int argc, char *const a
|
|||||||
if (!efi_menu)
|
if (!efi_menu)
|
||||||
return CMD_RET_FAILURE;
|
return CMD_RET_FAILURE;
|
||||||
|
|
||||||
ret = eficonfig_process_common(efi_menu, " ** UEFI Maintenance Menu **");
|
ret = eficonfig_process_common(efi_menu,
|
||||||
|
" ** UEFI Maintenance Menu **",
|
||||||
|
eficonfig_menu_desc,
|
||||||
|
eficonfig_display_statusline,
|
||||||
|
eficonfig_print_entry,
|
||||||
|
eficonfig_choice_entry);
|
||||||
eficonfig_destroy(efi_menu);
|
eficonfig_destroy(efi_menu);
|
||||||
|
|
||||||
if (ret == EFI_ABORTED)
|
if (ret == EFI_ABORTED)
|
||||||
|
@ -410,7 +410,10 @@ static efi_status_t enumerate_and_show_signature_database(void *varname)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), " ** Show Signature Database (%ls) **", (u16 *)varname);
|
snprintf(buf, sizeof(buf), " ** Show Signature Database (%ls) **", (u16 *)varname);
|
||||||
ret = eficonfig_process_common(efi_menu, buf);
|
ret = eficonfig_process_common(efi_menu, buf, eficonfig_menu_desc,
|
||||||
|
eficonfig_display_statusline,
|
||||||
|
eficonfig_print_entry,
|
||||||
|
eficonfig_choice_entry);
|
||||||
out:
|
out:
|
||||||
list_for_each_safe(pos, n, &efi_menu->list) {
|
list_for_each_safe(pos, n, &efi_menu->list) {
|
||||||
entry = list_entry(pos, struct eficonfig_entry, list);
|
entry = list_entry(pos, struct eficonfig_entry, list);
|
||||||
@ -472,7 +475,11 @@ static efi_status_t eficonfig_process_set_secure_boot_key(void *data)
|
|||||||
efi_menu = eficonfig_create_fixed_menu(key_config_menu_items,
|
efi_menu = eficonfig_create_fixed_menu(key_config_menu_items,
|
||||||
ARRAY_SIZE(key_config_menu_items));
|
ARRAY_SIZE(key_config_menu_items));
|
||||||
|
|
||||||
ret = eficonfig_process_common(efi_menu, header_str);
|
ret = eficonfig_process_common(efi_menu, header_str,
|
||||||
|
eficonfig_menu_desc,
|
||||||
|
eficonfig_display_statusline,
|
||||||
|
eficonfig_print_entry,
|
||||||
|
eficonfig_choice_entry);
|
||||||
eficonfig_destroy(efi_menu);
|
eficonfig_destroy(efi_menu);
|
||||||
|
|
||||||
if (ret == EFI_ABORTED)
|
if (ret == EFI_ABORTED)
|
||||||
@ -518,7 +525,12 @@ efi_status_t eficonfig_process_secure_boot_config(void *data)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = eficonfig_process_common(efi_menu, header_str);
|
ret = eficonfig_process_common(efi_menu, header_str,
|
||||||
|
eficonfig_menu_desc,
|
||||||
|
eficonfig_display_statusline,
|
||||||
|
eficonfig_print_entry,
|
||||||
|
eficonfig_choice_entry);
|
||||||
|
|
||||||
eficonfig_destroy(efi_menu);
|
eficonfig_destroy(efi_menu);
|
||||||
|
|
||||||
if (ret == EFI_ABORTED)
|
if (ret == EFI_ABORTED)
|
||||||
|
26
cmd/mem.c
26
cmd/mem.c
@ -818,8 +818,8 @@ static ulong mem_test_alt(vu_long *buf, ulong start_addr, ulong end_addr,
|
|||||||
*
|
*
|
||||||
* Returns: 0 if the test succeeds, 1 if the test fails.
|
* Returns: 0 if the test succeeds, 1 if the test fails.
|
||||||
*/
|
*/
|
||||||
pattern = (vu_long) 0xaaaaaaaa;
|
pattern = (vu_long)0xaaaaaaaaaaaaaaaa;
|
||||||
anti_pattern = (vu_long) 0x55555555;
|
anti_pattern = (vu_long)0x5555555555555555;
|
||||||
|
|
||||||
debug("%s:%d: length = 0x%.8lx\n", __func__, __LINE__, num_words);
|
debug("%s:%d: length = 0x%.8lx\n", __func__, __LINE__, num_words);
|
||||||
/*
|
/*
|
||||||
@ -970,7 +970,7 @@ static ulong test_bitflip_comparison(volatile unsigned long *bufa,
|
|||||||
|
|
||||||
max = sizeof(unsigned long) * 8;
|
max = sizeof(unsigned long) * 8;
|
||||||
for (k = 0; k < max; k++) {
|
for (k = 0; k < max; k++) {
|
||||||
q = 0x00000001L << k;
|
q = 1UL << k;
|
||||||
for (j = 0; j < 8; j++) {
|
for (j = 0; j < 8; j++) {
|
||||||
schedule();
|
schedule();
|
||||||
q = ~q;
|
q = ~q;
|
||||||
@ -1009,6 +1009,7 @@ static ulong mem_test_quick(vu_long *buf, ulong start_addr, ulong end_addr,
|
|||||||
ulong errs = 0;
|
ulong errs = 0;
|
||||||
ulong incr, length;
|
ulong incr, length;
|
||||||
ulong val, readback;
|
ulong val, readback;
|
||||||
|
const int plen = 2 * sizeof(ulong);
|
||||||
|
|
||||||
/* Alternate the pattern */
|
/* Alternate the pattern */
|
||||||
incr = 1;
|
incr = 1;
|
||||||
@ -1020,17 +1021,17 @@ static ulong mem_test_quick(vu_long *buf, ulong start_addr, ulong end_addr,
|
|||||||
* the "negative" patterns and increment the "positive"
|
* the "negative" patterns and increment the "positive"
|
||||||
* patterns to preserve this feature.
|
* patterns to preserve this feature.
|
||||||
*/
|
*/
|
||||||
if (pattern & 0x80000000)
|
if (pattern > (ulong)LONG_MAX)
|
||||||
pattern = -pattern; /* complement & increment */
|
pattern = -pattern; /* complement & increment */
|
||||||
else
|
else
|
||||||
pattern = ~pattern;
|
pattern = ~pattern;
|
||||||
}
|
}
|
||||||
length = (end_addr - start_addr) / sizeof(ulong);
|
length = (end_addr - start_addr) / sizeof(ulong);
|
||||||
end = buf + length;
|
end = buf + length;
|
||||||
printf("\rPattern %08lX Writing..."
|
printf("\rPattern %0*lX Writing..."
|
||||||
"%12s"
|
"%12s"
|
||||||
"\b\b\b\b\b\b\b\b\b\b",
|
"\b\b\b\b\b\b\b\b\b\b",
|
||||||
pattern, "");
|
plen, pattern, "");
|
||||||
|
|
||||||
for (addr = buf, val = pattern; addr < end; addr++) {
|
for (addr = buf, val = pattern; addr < end; addr++) {
|
||||||
schedule();
|
schedule();
|
||||||
@ -1046,10 +1047,9 @@ static ulong mem_test_quick(vu_long *buf, ulong start_addr, ulong end_addr,
|
|||||||
if (readback != val) {
|
if (readback != val) {
|
||||||
ulong offset = addr - buf;
|
ulong offset = addr - buf;
|
||||||
|
|
||||||
printf("\nMem error @ 0x%08X: "
|
printf("\nMem error @ 0x%0*lX: found %0*lX, expected %0*lX\n",
|
||||||
"found %08lX, expected %08lX\n",
|
plen, start_addr + offset * sizeof(vu_long),
|
||||||
(uint)(uintptr_t)(start_addr + offset*sizeof(vu_long)),
|
plen, readback, plen, val);
|
||||||
readback, val);
|
|
||||||
errs++;
|
errs++;
|
||||||
if (ctrlc())
|
if (ctrlc())
|
||||||
return -1;
|
return -1;
|
||||||
@ -1135,11 +1135,7 @@ static int do_mem_mtest(struct cmd_tbl *cmdtp, int flag, int argc,
|
|||||||
|
|
||||||
unmap_sysmem((void *)buf);
|
unmap_sysmem((void *)buf);
|
||||||
|
|
||||||
if (errs == -1UL) {
|
printf("\nTested %d iteration(s) with %lu errors.\n", iteration, count);
|
||||||
/* Memory test was aborted - write a newline to finish off */
|
|
||||||
putc('\n');
|
|
||||||
}
|
|
||||||
printf("Tested %d iteration(s) with %lu errors.\n", iteration, count);
|
|
||||||
|
|
||||||
return errs != 0;
|
return errs != 0;
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ with an i.MX8M-Mini SoC, 1/2/4 GB LPDDR4 RAM, SPI NOR, eMMC and PMIC.
|
|||||||
The matching evaluation boards (Board-Line, BL) have two Ethernet ports,
|
The matching evaluation boards (Board-Line, BL) have two Ethernet ports,
|
||||||
USB 2.0, HDMI/LVDS, SD card, CAN, RS485, RS232 and much more.
|
USB 2.0, HDMI/LVDS, SD card, CAN, RS485, RS232 and much more.
|
||||||
|
|
||||||
The OSM-S i.MX8MM is compliant to the Open Standard Module (OSM) 1.0
|
The OSM-S i.MX8MM is compliant to the Open Standard Module (OSM) 1.1
|
||||||
specification, size S (https://sget.org/standards/osm).
|
specification, size S (https://sget.org/standards/osm).
|
||||||
|
|
||||||
Quick Start
|
Quick Start
|
||||||
@ -20,25 +20,38 @@ Quick Start
|
|||||||
- Build U-Boot
|
- Build U-Boot
|
||||||
- Boot
|
- Boot
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
To build on a x86-64 host machine, you need a GNU cross toolchain for the
|
||||||
|
target architecture (aarch64). Check your distros package manager or
|
||||||
|
download and install the necessary tools (``aarch64-linux-gnu-*``) manually.
|
||||||
|
|
||||||
Get and Build the Trusted Firmware-A (TF-A)
|
Get and Build the Trusted Firmware-A (TF-A)
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Note: builddir is U-Boot build directory (source directory for in-tree builds)
|
|
||||||
|
|
||||||
There are two sources for the TF-A. Mainline and NXP. Get the one you prefer
|
There are two sources for the TF-A. Mainline and NXP. Get the one you prefer
|
||||||
(support and features might differ).
|
(support and features might differ).
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
If you are using GCC 12 and you get compiler/linker errors, try to add the
|
||||||
|
following arguments to your make command as workaround:
|
||||||
|
``CFLAGS="-Wno-array-bounds" LDFLAGS="--no-warn-rwx-segments"``
|
||||||
|
|
||||||
**NXP's imx-atf**
|
**NXP's imx-atf**
|
||||||
|
|
||||||
1. Get TF-A from: https://source.codeaurora.org/external/imx/imx-atf, branch: imx_5.4.70_2.3.0
|
1. Get TF-A from: https://github.com/nxp-imx/imx-atf, branch: lf_v2.6
|
||||||
2. Apply the patch to select the correct UART for the console, otherwise the TF-A will lock up during boot.
|
2. Build
|
||||||
3. Build
|
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
$ make PLAT=imx8mm bl31
|
$ make PLAT=imx8mm CROSS_COMPILE=aarch64-linux-gnu- IMX_BOOT_UART_BASE="0x30880000" bl31
|
||||||
$ cp build/imx8mm/release/bl31.bin $(builddir)
|
$ cp build/imx8mm/release/bl31.bin $(builddir)
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
*builddir* is U-Boot's build directory (source directory for in-tree builds)
|
||||||
|
|
||||||
**Mainline TF-A**
|
**Mainline TF-A**
|
||||||
|
|
||||||
1. Get TF-A from: https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/, tag: v2.4
|
1. Get TF-A from: https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/, tag: v2.4
|
||||||
@ -54,10 +67,13 @@ Get the DDR firmware
|
|||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
$ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.9.bin
|
$ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.18.bin
|
||||||
$ chmod +x firmware-imx-8.9.bin
|
$ chmod +x firmware-imx-8.18.bin
|
||||||
$ ./firmware-imx-8.9.bin
|
$ ./firmware-imx-8.18.bin
|
||||||
$ cp firmware-imx-8.9/firmware/ddr/synopsys/lpddr4*.bin $(builddir)
|
$ cp firmware-imx-8.18/firmware/ddr/synopsys/lpddr4_pmu_train_1d_imem.bin $(builddir)
|
||||||
|
$ cp firmware-imx-8.18/firmware/ddr/synopsys/lpddr4_pmu_train_1d_dmem.bin $(builddir)
|
||||||
|
$ cp firmware-imx-8.18/firmware/ddr/synopsys/lpddr4_pmu_train_2d_imem.bin $(builddir)
|
||||||
|
$ cp firmware-imx-8.18/firmware/ddr/synopsys/lpddr4_pmu_train_2d_dmem.bin $(builddir)
|
||||||
|
|
||||||
Build U-Boot
|
Build U-Boot
|
||||||
^^^^^^^^^^^^
|
^^^^^^^^^^^^
|
||||||
@ -65,9 +81,9 @@ Build U-Boot
|
|||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
$ make kontron-sl-mx8mm_defconfig
|
$ make kontron-sl-mx8mm_defconfig
|
||||||
$ make
|
$ make CROSS_COMPILE=aarch64-linux-gnu-
|
||||||
|
|
||||||
Burn the flash.bin to SD card at an offset of 33 KiB:
|
Copy the flash.bin to SD card at an offset of 33 KiB:
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
@ -76,7 +92,39 @@ Burn the flash.bin to SD card at an offset of 33 KiB:
|
|||||||
Boot
|
Boot
|
||||||
^^^^
|
^^^^
|
||||||
|
|
||||||
Put the SD card in the slot on the board and apply power.
|
Put the SD card in the slot on the board and apply power. Check the serial
|
||||||
|
console for output.
|
||||||
|
|
||||||
|
Flash the Bootloader to SPI NOR
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
1. Determine and note the exact size of the ``flash.bin`` image in bytes (e.g.
|
||||||
|
by running ``ls -l flash.bin``)
|
||||||
|
|
||||||
|
2. On the U-Boot CLI copy the bootloader from SD card to RAM:
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
mmc dev 1
|
||||||
|
mmc read $loadaddr 0x42 0x1000
|
||||||
|
|
||||||
|
3. Erase the SPI NOR flash:
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
sf probe
|
||||||
|
sf erase 0x0 0x200000
|
||||||
|
|
||||||
|
4. Copy the bootloader from RAM to SPI NOR. For the last parameter of the
|
||||||
|
command, use the size determined in step 1 in **hexadecimal notation**:
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
sf write $loadaddr 0x400 0x13B6F0
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
To be able to boot from SPI NOR the OTP fuses need to be set accordingly.
|
||||||
|
|
||||||
Further Information
|
Further Information
|
||||||
-------------------
|
-------------------
|
||||||
|
@ -478,7 +478,8 @@ or:
|
|||||||
+-------+--------+---------+------------------------+------------------------+
|
+-------+--------+---------+------------------------+------------------------+
|
||||||
|
|
||||||
And the 4th partition (Rootfs) is marked bootable with a file extlinux.conf
|
And the 4th partition (Rootfs) is marked bootable with a file extlinux.conf
|
||||||
following the Generic Distribution feature (doc/develop/distro.rst for use).
|
following the Generic Distribution feature (see :doc:`../../develop/distro` for
|
||||||
|
use).
|
||||||
|
|
||||||
The size of fip or ssbl partition must be enough for the associated binary file,
|
The size of fip or ssbl partition must be enough for the associated binary file,
|
||||||
4MB and 2MB are default values.
|
4MB and 2MB are default values.
|
||||||
|
1
doc/build/index.rst
vendored
1
doc/build/index.rst
vendored
@ -9,6 +9,7 @@ Build U-Boot
|
|||||||
source
|
source
|
||||||
gcc
|
gcc
|
||||||
clang
|
clang
|
||||||
|
reproducible
|
||||||
docker
|
docker
|
||||||
tools
|
tools
|
||||||
buildman
|
buildman
|
||||||
|
25
doc/build/reproducible.rst
vendored
Normal file
25
doc/build/reproducible.rst
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
Reproducible builds
|
||||||
|
===================
|
||||||
|
|
||||||
|
In order to achieve reproducible builds, timestamps used in the U-Boot build
|
||||||
|
process have to be set to a fixed value.
|
||||||
|
|
||||||
|
This is done using the SOURCE_DATE_EPOCH environment variable which specifies
|
||||||
|
the number of seconds since 1970-01-01T00:00:00Z.
|
||||||
|
|
||||||
|
Example
|
||||||
|
-------
|
||||||
|
|
||||||
|
To build the sandbox with 2023-01-01T00:00:00Z as timestamp we can use:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
make sandbox_defconfig
|
||||||
|
SOURCE_DATE_EPOCH=1672531200 make
|
||||||
|
|
||||||
|
This date is shown when we launch U-Boot:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
./u-boot -T
|
||||||
|
U-Boot 2023.01 (Jan 01 2023 - 00:00:00 +0000)
|
76
doc/develop/directories.rst
Normal file
76
doc/develop/directories.rst
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
Directory hierarchy
|
||||||
|
===================
|
||||||
|
|
||||||
|
.. list-table::
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
* - Directory path
|
||||||
|
- Usage
|
||||||
|
* - /arch
|
||||||
|
- Architecture-specific files
|
||||||
|
* - /arch/arc
|
||||||
|
- Files relating to ARC architecture
|
||||||
|
* - /arch/arm
|
||||||
|
- Files relating to ARM architecture
|
||||||
|
* - /arch/m68k
|
||||||
|
- Files relating to m68k architecture
|
||||||
|
* - /arch/microblaze
|
||||||
|
- Files relating to microblaze architecture
|
||||||
|
* - /arch/mips
|
||||||
|
- Files relating to MIPS architecture
|
||||||
|
* - /arch/nios2
|
||||||
|
- Files relating to Altera NIOS2 architecture
|
||||||
|
* - /arch/powerpc
|
||||||
|
- Files relating to PowerPC architecture
|
||||||
|
* - /arch/riscv
|
||||||
|
- Files relating to RISC-V architecture
|
||||||
|
* - /arch/sandbox
|
||||||
|
- Files relating to HW-independent "sandbox"
|
||||||
|
* - /arch/sh
|
||||||
|
- Files relating to SH architecture
|
||||||
|
* - /arch/x86
|
||||||
|
- Files relating to x86 architecture
|
||||||
|
* - /arch/xtensa
|
||||||
|
- Files relating to Xtensa architecture
|
||||||
|
* - /api
|
||||||
|
- Machine/arch-independent API for external apps
|
||||||
|
* - /board
|
||||||
|
- Board-dependent files
|
||||||
|
* - /boot
|
||||||
|
- Support for images and booting
|
||||||
|
* - /cmd
|
||||||
|
- U-Boot commands functions
|
||||||
|
* - /common
|
||||||
|
- Misc architecture-independent functions
|
||||||
|
* - /configs
|
||||||
|
- Board default configuration files
|
||||||
|
* - /disk
|
||||||
|
- Code for disk drive partition handling
|
||||||
|
* - /doc
|
||||||
|
- Documentation (a mix of ReST and READMEs)
|
||||||
|
* - /drivers
|
||||||
|
- Device drivers
|
||||||
|
* - /dts
|
||||||
|
- Makefile for building internal U-Boot fdt.
|
||||||
|
* - /env
|
||||||
|
- Environment support
|
||||||
|
* - /examples
|
||||||
|
- Example code for standalone applications, etc.
|
||||||
|
* - /fs
|
||||||
|
- Filesystem code (cramfs, ext2, jffs2, etc.)
|
||||||
|
* - /include
|
||||||
|
- Header Files
|
||||||
|
* - /lib
|
||||||
|
- Library routines relating to all architectures
|
||||||
|
* - /Licenses
|
||||||
|
- Various license files
|
||||||
|
* - /net
|
||||||
|
- Networking code
|
||||||
|
* - /post
|
||||||
|
- Power On Self Test
|
||||||
|
* - /scripts
|
||||||
|
- Various build scripts and Makefiles
|
||||||
|
* - /test
|
||||||
|
- Various unit test files
|
||||||
|
* - /tools
|
||||||
|
- Tools to build and sign FIT images, etc.
|
@ -64,3 +64,26 @@ in an image, use $(CROSS_COMPILE)nm::
|
|||||||
|
|
||||||
nm u-boot |grep evspy |grep list
|
nm u-boot |grep evspy |grep list
|
||||||
00000000002d6300 D _u_boot_list_2_evspy_info_2_EVT_MISC_INIT_F
|
00000000002d6300 D _u_boot_list_2_evspy_info_2_EVT_MISC_INIT_F
|
||||||
|
|
||||||
|
Logging is also available. Events use category `LOGC_EVENT`, so you can enable
|
||||||
|
logging on that, or add `#define LOG_DEBUG` to the top of `common/event.c` to
|
||||||
|
see events being sent.
|
||||||
|
|
||||||
|
|
||||||
|
Dynamic events
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Static events provide a way of dealing with events known at build time. In some
|
||||||
|
cases we want to attach an event handler at runtime. For example, we may wish
|
||||||
|
to be notified when a particular device is probed or removed.
|
||||||
|
|
||||||
|
This can be handled by enabling `CONFIG_EVENT_DYNAMIC`. It is then possible to
|
||||||
|
call `event_register()` to register a new handler for a particular event.
|
||||||
|
|
||||||
|
Dynamic event handlers are called after all the static event spy handlers have
|
||||||
|
been processed. Of course, since dynamic event handlers are created at runtime
|
||||||
|
it is not possible to use the `event_dump.py` to see them.
|
||||||
|
|
||||||
|
At present there is no way to list dynamic event handlers from the command line,
|
||||||
|
nor to deregister a dynamic event handler. These features can be added when
|
||||||
|
needed.
|
||||||
|
@ -24,6 +24,7 @@ Implementation
|
|||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
|
directories
|
||||||
bloblist
|
bloblist
|
||||||
bootstd
|
bootstd
|
||||||
ci_testing
|
ci_testing
|
||||||
|
@ -11,22 +11,23 @@ mkeficapsule \- Generate EFI capsule file for U-Boot
|
|||||||
.RI [ options ] " " [ image-blob ] " " capsule-file
|
.RI [ options ] " " [ image-blob ] " " capsule-file
|
||||||
|
|
||||||
.SH "DESCRIPTION"
|
.SH "DESCRIPTION"
|
||||||
|
The
|
||||||
.B mkeficapsule
|
.B mkeficapsule
|
||||||
command is used to create an EFI capsule file for use with the U-Boot
|
command is used to create an EFI capsule file to be used by U-Boot for firmware
|
||||||
EFI capsule update.
|
updates.
|
||||||
A capsule file may contain various type of firmware blobs which
|
A capsule file may contain various types of firmware blobs which are to be
|
||||||
are to be applied to the system and must be placed in the specific
|
applied to the system.
|
||||||
directory on the UEFI system partition.
|
If a capsule file is placed in the /EFI/CapusuleUpdate directory of the EFI
|
||||||
An update will be automatically executed at next reboot.
|
system partition, U-Boot will try to execute the update at the next reboot.
|
||||||
|
|
||||||
Optionally, a capsule file can be signed with a given private key.
|
Optionally, a capsule file can be signed with a given private key.
|
||||||
In this case, the update will be authenticated by verifying the signature
|
In this case, the update will be authenticated by verifying the signature
|
||||||
before applying.
|
before applying.
|
||||||
|
|
||||||
Additionally, an empty capsule file can be generated for acceptance or
|
Additionally, an empty capsule file can be generated to indicate the acceptance
|
||||||
rejection of firmware images by a governing component like an Operating
|
or rejection of firmware images by a governing component like an operating
|
||||||
System. The empty capsules do not require an image-blob input file.
|
system.
|
||||||
|
Empty capsules do not require an image-blob input file.
|
||||||
|
|
||||||
.B mkeficapsule
|
.B mkeficapsule
|
||||||
takes any type of image files when generating non empty capsules, including:
|
takes any type of image files when generating non empty capsules, including:
|
||||||
|
@ -17,7 +17,7 @@ Description
|
|||||||
The *bdinfo* command prints information about the board.
|
The *bdinfo* command prints information about the board.
|
||||||
|
|
||||||
Example
|
Example
|
||||||
=======
|
-------
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
|
@ -12,33 +12,27 @@ Synopis
|
|||||||
font select <name> [<size>]
|
font select <name> [<size>]
|
||||||
font size <size>
|
font size <size>
|
||||||
|
|
||||||
|
|
||||||
Description
|
Description
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
The *font* command allows selection of the font to use on the video console.
|
The *font* command allows selection of the font to use on the video console.
|
||||||
This is available when the Truetype console is in use. This is the case when
|
This is available when the TrueType console is in use.
|
||||||
`CONFIG_CONSOLE_TRUETYPE` is enabled.
|
|
||||||
|
|
||||||
|
|
||||||
font list
|
font list
|
||||||
~~~~~~~~~
|
~~~~~~~~~
|
||||||
|
|
||||||
This lists the available fonts, using the name of the font file in the build.
|
This lists the available fonts, using the name of the font file in the build.
|
||||||
|
|
||||||
|
|
||||||
font select
|
font select
|
||||||
~~~~~~~~~~~
|
~~~~~~~~~~~
|
||||||
|
|
||||||
This selects a new font and optionally changes the size.
|
This selects a new font and optionally changes the size.
|
||||||
|
|
||||||
|
|
||||||
font size
|
font size
|
||||||
~~~~~~~~~
|
~~~~~~~~~
|
||||||
|
|
||||||
This changes the font size only.
|
This changes the font size only.
|
||||||
|
|
||||||
|
|
||||||
Examples
|
Examples
|
||||||
--------
|
--------
|
||||||
|
|
||||||
@ -50,3 +44,14 @@ Examples
|
|||||||
=> font size 40
|
=> font size 40
|
||||||
=> font select cantoraone_regular 20
|
=> font select cantoraone_regular 20
|
||||||
=>
|
=>
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
-------------
|
||||||
|
|
||||||
|
The command is only available if CONFIG_CONSOLE_TRUETYPE=y.
|
||||||
|
|
||||||
|
Return value
|
||||||
|
------------
|
||||||
|
|
||||||
|
The return value $? is 0 (true) if the command completes.
|
||||||
|
The return value is 1 (false) if the command fails.
|
||||||
|
66
doc/usage/cmd/mtest.rst
Normal file
66
doc/usage/cmd/mtest.rst
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
.. SPDX-License-Identifier: GPL-2.0+
|
||||||
|
.. Copyright 2022, Heinrich Schuchardt <xypron.glpk@gmx.de>
|
||||||
|
|
||||||
|
mtest command
|
||||||
|
=============
|
||||||
|
|
||||||
|
Synopsis
|
||||||
|
--------
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
mtest [start [end [pattern [iterations]]]]
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
|
||||||
|
The *mtest* command tests the random access memory. It writes long values, reads
|
||||||
|
them back and checks for differences. The test can be interrupted with CTRL+C.
|
||||||
|
|
||||||
|
The default test uses *pattern* as first value to be written and varies it
|
||||||
|
between memory addresses.
|
||||||
|
|
||||||
|
An alternative test can be selected with CONFIG_SYS_ALT_MEMTEST=y. It uses
|
||||||
|
multiple hard coded bit patterns.
|
||||||
|
|
||||||
|
With CONFIGSYS_ALT_MEMTEST_BITFLIP=y a further test is executed. It writes long
|
||||||
|
values offset by half the size of long and checks if writing to the one address
|
||||||
|
causes bit flips at the other address.
|
||||||
|
|
||||||
|
start
|
||||||
|
start address of the memory range tested, defaults to
|
||||||
|
CONFIG_SYS_MEMTEST_START
|
||||||
|
|
||||||
|
end
|
||||||
|
end address of the memory range tested, defaults to
|
||||||
|
CONFIG_SYS_MEMTEST_END. If CONFIGSYS_ALT_MEMTEST_BITFLIP=y, a value will
|
||||||
|
be written to this address. Otherwise it is excluded from the range.
|
||||||
|
|
||||||
|
pattern
|
||||||
|
pattern to be written to memory. This is a 64bit value on 64bit systems
|
||||||
|
and a 32bit value on 32bit systems. It defaults to 0. The value is
|
||||||
|
ignored if CONFIG_SYS_ALT_MEMTEST=y.
|
||||||
|
|
||||||
|
iterations
|
||||||
|
number of test repetitions. If the value is not provided the test will
|
||||||
|
not terminate automatically. Enter CTRL+C instead.
|
||||||
|
|
||||||
|
Examples
|
||||||
|
--------
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
=> mtest 1000 2000 0x55aa55aa55aa55aa 10
|
||||||
|
Testing 00001000 ... 00002000:
|
||||||
|
Pattern AA55AA55AA55AA55 Writing... Reading...
|
||||||
|
Tested 16 iteration(s) with 0 errors.
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
-------------
|
||||||
|
|
||||||
|
The mtest command is enabled by CONFIG_CMD_MEMTEST=y.
|
||||||
|
|
||||||
|
Return value
|
||||||
|
------------
|
||||||
|
|
||||||
|
The return value $? is 0 (true) if the command succeeds, 1 (false) otherwise.
|
45
doc/usage/cmd/sleep.rst
Normal file
45
doc/usage/cmd/sleep.rst
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
.. SPDX-License-Identifier: GPL-2.0+
|
||||||
|
.. Copyright 2023, Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
|
||||||
|
|
||||||
|
sleep command
|
||||||
|
=============
|
||||||
|
|
||||||
|
Synopsis
|
||||||
|
--------
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
sleep <delay>
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
|
||||||
|
The *sleep* command waits for *delay* seconds. It can be interrupted by
|
||||||
|
CTRL+C.
|
||||||
|
|
||||||
|
delay
|
||||||
|
delay in seconds. The value is decimal and can be fractional.
|
||||||
|
|
||||||
|
Example
|
||||||
|
-------
|
||||||
|
|
||||||
|
The current data and time is display before and after sleeping for 3.2
|
||||||
|
seconds:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
=> date; sleep 3.2; date
|
||||||
|
Date: 2023-01-21 (Saturday) Time: 16:02:41
|
||||||
|
Date: 2023-01-21 (Saturday) Time: 16:02:44
|
||||||
|
=>
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
-------------
|
||||||
|
|
||||||
|
The command is only available if CONFIG_CMD_SLEEP=y.
|
||||||
|
|
||||||
|
Return value
|
||||||
|
------------
|
||||||
|
|
||||||
|
The return value $? is 0 (true) if the command completes.
|
||||||
|
The return value is 1 (false) if the command is interrupted by CTRL+C.
|
@ -63,6 +63,7 @@ Shell commands
|
|||||||
cmd/mbr
|
cmd/mbr
|
||||||
cmd/md
|
cmd/md
|
||||||
cmd/mmc
|
cmd/mmc
|
||||||
|
cmd/mtest
|
||||||
cmd/part
|
cmd/part
|
||||||
cmd/pause
|
cmd/pause
|
||||||
cmd/pinmux
|
cmd/pinmux
|
||||||
@ -76,6 +77,7 @@ Shell commands
|
|||||||
cmd/scp03
|
cmd/scp03
|
||||||
cmd/setexpr
|
cmd/setexpr
|
||||||
cmd/size
|
cmd/size
|
||||||
|
cmd/sleep
|
||||||
cmd/sound
|
cmd/sound
|
||||||
cmd/source
|
cmd/source
|
||||||
cmd/temperature
|
cmd/temperature
|
||||||
|
@ -9,12 +9,14 @@
|
|||||||
#define _EFI_CONFIG_H
|
#define _EFI_CONFIG_H
|
||||||
|
|
||||||
#include <efi_loader.h>
|
#include <efi_loader.h>
|
||||||
|
#include <menu.h>
|
||||||
|
|
||||||
#define EFICONFIG_ENTRY_NUM_MAX 99
|
#define EFICONFIG_ENTRY_NUM_MAX INT_MAX
|
||||||
#define EFICONFIG_VOLUME_PATH_MAX 512
|
#define EFICONFIG_VOLUME_PATH_MAX 512
|
||||||
#define EFICONFIG_FILE_PATH_MAX 512
|
#define EFICONFIG_FILE_PATH_MAX 512
|
||||||
#define EFICONFIG_FILE_PATH_BUF_SIZE (EFICONFIG_FILE_PATH_MAX * sizeof(u16))
|
#define EFICONFIG_FILE_PATH_BUF_SIZE (EFICONFIG_FILE_PATH_MAX * sizeof(u16))
|
||||||
|
|
||||||
|
extern const char *eficonfig_menu_desc;
|
||||||
typedef efi_status_t (*eficonfig_entry_func)(void *data);
|
typedef efi_status_t (*eficonfig_entry_func)(void *data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -45,14 +47,20 @@ struct eficonfig_entry {
|
|||||||
* @active: active menu entry index
|
* @active: active menu entry index
|
||||||
* @count: total count of menu entry
|
* @count: total count of menu entry
|
||||||
* @menu_header: menu header string
|
* @menu_header: menu header string
|
||||||
|
* @menu_desc: menu description string
|
||||||
* @list: menu entry list structure
|
* @list: menu entry list structure
|
||||||
|
* @start: top menu index to draw
|
||||||
|
* @end: bottom menu index to draw
|
||||||
*/
|
*/
|
||||||
struct efimenu {
|
struct efimenu {
|
||||||
int delay;
|
int delay;
|
||||||
int active;
|
int active;
|
||||||
int count;
|
int count;
|
||||||
char *menu_header;
|
char *menu_header;
|
||||||
|
const char *menu_desc;
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
|
int start;
|
||||||
|
int end;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -86,9 +94,16 @@ struct eficonfig_select_file_info {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void eficonfig_print_msg(char *msg);
|
void eficonfig_print_msg(char *msg);
|
||||||
|
void eficonfig_print_entry(void *data);
|
||||||
|
void eficonfig_display_statusline(struct menu *m);
|
||||||
|
char *eficonfig_choice_entry(void *data);
|
||||||
void eficonfig_destroy(struct efimenu *efi_menu);
|
void eficonfig_destroy(struct efimenu *efi_menu);
|
||||||
efi_status_t eficonfig_process_quit(void *data);
|
efi_status_t eficonfig_process_quit(void *data);
|
||||||
efi_status_t eficonfig_process_common(struct efimenu *efi_menu, char *menu_header);
|
efi_status_t eficonfig_process_common(struct efimenu *efi_menu,
|
||||||
|
char *menu_header, const char *menu_desc,
|
||||||
|
void (*display_statusline)(struct menu *),
|
||||||
|
void (*item_data_print)(void *),
|
||||||
|
char *(*item_choice)(void *));
|
||||||
efi_status_t eficonfig_process_select_file(void *data);
|
efi_status_t eficonfig_process_select_file(void *data);
|
||||||
efi_status_t eficonfig_get_unused_bootoption(u16 *buf,
|
efi_status_t eficonfig_get_unused_bootoption(u16 *buf,
|
||||||
efi_uintn_t buf_size, u32 *index);
|
efi_uintn_t buf_size, u32 *index);
|
||||||
|
@ -328,6 +328,7 @@ extern const efi_guid_t efi_esrt_guid;
|
|||||||
extern const efi_guid_t smbios_guid;
|
extern const efi_guid_t smbios_guid;
|
||||||
/*GUID of console */
|
/*GUID of console */
|
||||||
extern const efi_guid_t efi_guid_text_input_protocol;
|
extern const efi_guid_t efi_guid_text_input_protocol;
|
||||||
|
extern const efi_guid_t efi_guid_text_output_protocol;
|
||||||
|
|
||||||
extern char __efi_runtime_start[], __efi_runtime_stop[];
|
extern char __efi_runtime_start[], __efi_runtime_stop[];
|
||||||
extern char __efi_runtime_rel_start[], __efi_runtime_rel_stop[];
|
extern char __efi_runtime_rel_start[], __efi_runtime_rel_stop[];
|
||||||
|
@ -535,7 +535,7 @@ const char *spl_board_loader_name(u32 boot_device);
|
|||||||
void __noreturn jump_to_image_linux(struct spl_image_info *spl_image);
|
void __noreturn jump_to_image_linux(struct spl_image_info *spl_image);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* jump_to_image_linux() - Jump to OP-TEE OS from SPL
|
* jump_to_image_optee() - Jump to OP-TEE OS from SPL
|
||||||
*
|
*
|
||||||
* This jumps into OP-TEE OS using the information in @spl_image.
|
* This jumps into OP-TEE OS using the information in @spl_image.
|
||||||
*
|
*
|
||||||
|
@ -1949,6 +1949,7 @@ efi_status_t efi_load_image_from_path(bool boot_policy,
|
|||||||
efi_uintn_t buffer_size;
|
efi_uintn_t buffer_size;
|
||||||
uint64_t addr, pages;
|
uint64_t addr, pages;
|
||||||
const efi_guid_t *guid;
|
const efi_guid_t *guid;
|
||||||
|
struct efi_handler *handler;
|
||||||
|
|
||||||
/* In case of failure nothing is returned */
|
/* In case of failure nothing is returned */
|
||||||
*buffer = NULL;
|
*buffer = NULL;
|
||||||
@ -1970,11 +1971,11 @@ efi_status_t efi_load_image_from_path(bool boot_policy,
|
|||||||
}
|
}
|
||||||
if (ret != EFI_SUCCESS)
|
if (ret != EFI_SUCCESS)
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
ret = EFI_CALL(efi_handle_protocol(device, guid,
|
ret = efi_search_protocol(device, guid, &handler);
|
||||||
(void **)&load_file_protocol));
|
|
||||||
if (ret != EFI_SUCCESS)
|
if (ret != EFI_SUCCESS)
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
buffer_size = 0;
|
buffer_size = 0;
|
||||||
|
load_file_protocol = handler->protocol_interface;
|
||||||
ret = EFI_CALL(load_file_protocol->load_file(
|
ret = EFI_CALL(load_file_protocol->load_file(
|
||||||
load_file_protocol, rem, boot_policy,
|
load_file_protocol, rem, boot_policy,
|
||||||
&buffer_size, NULL));
|
&buffer_size, NULL));
|
||||||
|
@ -115,7 +115,7 @@ efi_status_t efi_esrt_allocate_install(u32 num_entries)
|
|||||||
u32 size = efi_esrt_entries_to_size(num_entries);
|
u32 size = efi_esrt_entries_to_size(num_entries);
|
||||||
efi_guid_t esrt_guid = efi_esrt_guid;
|
efi_guid_t esrt_guid = efi_esrt_guid;
|
||||||
|
|
||||||
/* Reserve num_pages for ESRT */
|
/* Reserve memory for ESRT */
|
||||||
ret = efi_allocate_pool(EFI_BOOT_SERVICES_DATA, size,
|
ret = efi_allocate_pool(EFI_BOOT_SERVICES_DATA, size,
|
||||||
(void **)&new_esrt);
|
(void **)&new_esrt);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user