mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-08-24 02:48:51 +09:00
![Alexander Graf](/assets/img/avatar_default.png)
EFI payloads can query for the device they were booted from. Because we have a disconnect between loading binaries and running binaries, we passed in a dummy device path so far. Unfortunately that breaks grub2's logic to find its configuration file from the same device it was booted from. This patch adds logic to have the "load" command call into our efi code to set the device path to the one we last loaded a binary from. With this grub2 properly detects where we got booted from and can find its configuration file, even when searching by-partition. Signed-off-by: Alexander Graf <agraf@suse.de>
91 lines
2.7 KiB
C
91 lines
2.7 KiB
C
/*
|
|
* Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
|
|
*
|
|
* Inspired by cmd_ext_common.c, cmd_fat.c.
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <command.h>
|
|
#include <fs.h>
|
|
#include <efi_loader.h>
|
|
|
|
static int do_size_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
return do_size(cmdtp, flag, argc, argv, FS_TYPE_ANY);
|
|
}
|
|
|
|
U_BOOT_CMD(
|
|
size, 4, 0, do_size_wrapper,
|
|
"determine a file's size",
|
|
"<interface> <dev[:part]> <filename>\n"
|
|
" - Find file 'filename' from 'dev' on 'interface'\n"
|
|
" and determine its size."
|
|
);
|
|
|
|
static int do_load_wrapper(cmd_tbl_t *cmdtp, int flag, int argc,
|
|
char * const argv[])
|
|
{
|
|
efi_set_bootdev(argv[1], (argc > 2) ? argv[2] : "");
|
|
return do_load(cmdtp, flag, argc, argv, FS_TYPE_ANY);
|
|
}
|
|
|
|
U_BOOT_CMD(
|
|
load, 7, 0, do_load_wrapper,
|
|
"load binary file from a filesystem",
|
|
"<interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]\n"
|
|
" - Load binary file 'filename' from partition 'part' on device\n"
|
|
" type 'interface' instance 'dev' to address 'addr' in memory.\n"
|
|
" 'bytes' gives the size to load in bytes.\n"
|
|
" If 'bytes' is 0 or omitted, the file is read until the end.\n"
|
|
" 'pos' gives the file byte position to start reading from.\n"
|
|
" If 'pos' is 0 or omitted, the file is read from the start."
|
|
)
|
|
|
|
static int do_save_wrapper(cmd_tbl_t *cmdtp, int flag, int argc,
|
|
char * const argv[])
|
|
{
|
|
return do_save(cmdtp, flag, argc, argv, FS_TYPE_ANY);
|
|
}
|
|
|
|
U_BOOT_CMD(
|
|
save, 7, 0, do_save_wrapper,
|
|
"save file to a filesystem",
|
|
"<interface> <dev[:part]> <addr> <filename> bytes [pos]\n"
|
|
" - Save binary file 'filename' to partition 'part' on device\n"
|
|
" type 'interface' instance 'dev' from addr 'addr' in memory.\n"
|
|
" 'bytes' gives the size to save in bytes and is mandatory.\n"
|
|
" 'pos' gives the file byte position to start writing to.\n"
|
|
" If 'pos' is 0 or omitted, the file is written from the start."
|
|
)
|
|
|
|
static int do_ls_wrapper(cmd_tbl_t *cmdtp, int flag, int argc,
|
|
char * const argv[])
|
|
{
|
|
return do_ls(cmdtp, flag, argc, argv, FS_TYPE_ANY);
|
|
}
|
|
|
|
U_BOOT_CMD(
|
|
ls, 4, 1, do_ls_wrapper,
|
|
"list files in a directory (default /)",
|
|
"<interface> [<dev[:part]> [directory]]\n"
|
|
" - List files in directory 'directory' of partition 'part' on\n"
|
|
" device type 'interface' instance 'dev'."
|
|
)
|
|
|
|
static int do_fstype_wrapper(cmd_tbl_t *cmdtp, int flag, int argc,
|
|
char * const argv[])
|
|
{
|
|
return do_fs_type(cmdtp, flag, argc, argv);
|
|
}
|
|
|
|
U_BOOT_CMD(
|
|
fstype, 4, 1, do_fstype_wrapper,
|
|
"Look up a filesystem type",
|
|
"<interface> <dev>:<part>\n"
|
|
"- print filesystem type\n"
|
|
"fstype <interface> <dev>:<part> <varname>\n"
|
|
"- set environment variable to filesystem type\n"
|
|
);
|