From: Roy Franz <roy.franz@linaro.org>
To: xen-devel@lists.xen.org, ian.campbell@citrix.com,
stefano.stabellini@citrix.com, tim@xen.org, jbeulich@suse.com,
keir@xen.org
Cc: Roy Franz <roy.franz@linaro.org>,
fu.wei@linaro.org, linaro-uefi@lists.linaro.org
Subject: [PATCH V2 04/12] Refactor read_file() so it can be shared.
Date: Mon, 21 Jul 2014 17:43:27 -0700 [thread overview]
Message-ID: <1405989815-25236-5-git-send-email-roy.franz@linaro.org> (raw)
In-Reply-To: <1405989815-25236-1-git-send-email-roy.franz@linaro.org>
The read_file() function updated some multiboot specific data structures
as it was loading a file. These changes make read_file() more generic,
and create a load_file() wrapper for x86 that updates the multiboot
data structures. read_file() no longer does special handling of
the configuration file, as this was only needed to avoid adding
it to the multiboot structures. read_file() and load_file() return
error codes rather than directly exiting on error to facilicate
sharing. Different architectures may require different max allocation
addresses so take that as an argument.
Signed-off-by: Roy Franz <roy.franz@linaro.org>
---
xen/arch/x86/efi/boot.c | 89 ++++++++++++++++++++++++++++++++-----------------
1 file changed, 59 insertions(+), 30 deletions(-)
diff --git a/xen/arch/x86/efi/boot.c b/xen/arch/x86/efi/boot.c
index c0546ec..17aaa67 100644
--- a/xen/arch/x86/efi/boot.c
+++ b/xen/arch/x86/efi/boot.c
@@ -338,7 +338,7 @@ static CHAR16 *__init point_tail(CHAR16 *fn)
}
static bool_t __init read_file(EFI_FILE_HANDLE dir_handle, CHAR16 *name,
- struct file *file)
+ struct file *file, EFI_PHYSICAL_ADDRESS max_addr)
{
EFI_FILE_HANDLE FileHandle = NULL;
UINT64 size;
@@ -346,11 +346,14 @@ static bool_t __init read_file(EFI_FILE_HANDLE dir_handle, CHAR16 *name,
CHAR16 *what = NULL;
if ( !name )
- PrintErrMesgExit(L"No filename", EFI_OUT_OF_RESOURCES);
+ {
+ PrintErrMesg(L"No Filename", EFI_OUT_OF_RESOURCES);
+ return 0;
+ }
+
ret = dir_handle->Open(dir_handle, &FileHandle, name,
EFI_FILE_MODE_READ, 0);
- if ( file == &cfg && ret == EFI_NOT_FOUND )
- return 0;
+
if ( EFI_ERROR(ret) )
what = L"Open";
else
@@ -367,8 +370,7 @@ static bool_t __init read_file(EFI_FILE_HANDLE dir_handle, CHAR16 *name,
what = what ?: L"Seek";
else
{
- file->addr = min(1UL << (32 + PAGE_SHIFT),
- HYPERVISOR_VIRT_END - DIRECTMAP_VIRT_START);
+ file->addr = max_addr;
ret = efi_bs->AllocatePages(AllocateMaxAddress, EfiLoaderData,
PFN_UP(size), &file->addr);
}
@@ -379,25 +381,17 @@ static bool_t __init read_file(EFI_FILE_HANDLE dir_handle, CHAR16 *name,
}
else
{
- if ( file != &cfg )
- {
- PrintStr(name);
- PrintStr(L": ");
- DisplayUint(file->addr, 2 * sizeof(file->addr));
- PrintStr(L"-");
- DisplayUint(file->addr + size, 2 * sizeof(file->addr));
- PrintStr(newline);
- mb_modules[mbi.mods_count].mod_start = file->addr >> PAGE_SHIFT;
- mb_modules[mbi.mods_count].mod_end = size;
- ++mbi.mods_count;
- }
file->size = size;
ret = FileHandle->Read(FileHandle, &file->size, file->ptr);
if ( !EFI_ERROR(ret) && file->size != size )
ret = EFI_ABORTED;
if ( EFI_ERROR(ret) )
- what = L"Read";
+ {
+ what = what ?: L"Read";
+ efi_bs->FreePages(file->addr, PFN_UP(file->size));
+ file->addr = 0;
+ }
}
if ( FileHandle )
@@ -405,12 +399,21 @@ static bool_t __init read_file(EFI_FILE_HANDLE dir_handle, CHAR16 *name,
if ( what )
{
- PrintErr(what);
- PrintErr(L" failed for ");
- PrintErrMesgExit(name, ret);
+ PrintErrMesg(what, ret);
+ PrintErr(L"Unable to load file");
+ return 0;
+ }
+ else
+ {
+ PrintStr(name);
+ PrintStr(L": ");
+ DisplayUint(file->addr, 2 * sizeof(file->addr));
+ PrintStr(L"-");
+ DisplayUint(file->addr + file->size, 2 * sizeof(file->addr));
+ PrintStr(newline);
+ return 1;
}
- return 1;
}
static void __init pre_parse(const struct file *cfg)
@@ -470,6 +473,21 @@ static char *__init get_value(const struct file *cfg, const char *section,
}
return NULL;
}
+/* Only call with non-config files. */
+bool_t __init load_file(EFI_FILE_HANDLE dir_handle, CHAR16 *name,
+ struct file *file)
+{
+ EFI_PHYSICAL_ADDRESS max = min(1UL << (32 + PAGE_SHIFT),
+ HYPERVISOR_VIRT_END - DIRECTMAP_VIRT_START);
+ if ( read_file(dir_handle, name, file, max) )
+ {
+ mb_modules[mbi.mods_count].mod_start = file->addr >> PAGE_SHIFT;
+ mb_modules[mbi.mods_count].mod_end = file->size;
+ ++mbi.mods_count;
+ return 1;
+ }
+ return 0;
+}
static void __init split_value(char *s)
{
@@ -692,6 +710,9 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
struct e820entry *e;
u64 efer;
bool_t base_video = 0;
+ bool_t load_ok = 0;
+ EFI_PHYSICAL_ADDRESS max_addr = min(1UL << (32 + PAGE_SHIFT),
+ HYPERVISOR_VIRT_END - DIRECTMAP_VIRT_START);
efi_ih = ImageHandle;
efi_bs = SystemTable->BootServices;
@@ -831,7 +852,7 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
while ( (tail = point_tail(file_name)) != NULL )
{
wstrcpy(tail, L".cfg");
- if ( read_file(dir_handle, file_name, &cfg) )
+ if ( read_file(dir_handle, file_name, &cfg, max_addr) )
break;
*tail = 0;
}
@@ -841,7 +862,7 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
PrintStr(file_name);
PrintStr(L"'\r\n");
}
- else if ( !read_file(dir_handle, cfg_file_name, &cfg) )
+ else if ( !read_file(dir_handle, cfg_file_name, &cfg, max_addr) )
blexit(L"Configuration file not found.");
pre_parse(&cfg);
@@ -860,7 +881,7 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
break;
efi_bs->FreePages(cfg.addr, PFN_UP(cfg.size));
cfg.addr = 0;
- if ( !read_file(dir_handle, s2w(&name), &cfg) )
+ if ( !read_file(dir_handle, s2w(&name), &cfg, max_addr) )
{
PrintStr(L"Chained configuration file '");
PrintStr(name.w);
@@ -873,8 +894,10 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
if ( !name.s )
blexit(L"No Dom0 kernel image specified.");
split_value(name.s);
- read_file(dir_handle, s2w(&name), &kernel);
+ load_ok = load_file(dir_handle, s2w(&name), &kernel);
efi_bs->FreePool(name.w);
+ if ( !load_ok )
+ blexit(L"Unable to load Dom0 Kernel image.");
if ( !EFI_ERROR(efi_bs->LocateProtocol(&shim_lock_guid, NULL,
(void **)&shim_lock)) &&
@@ -885,8 +908,10 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
if ( name.s )
{
split_value(name.s);
- read_file(dir_handle, s2w(&name), &ramdisk);
+ load_ok = load_file(dir_handle, s2w(&name), &ramdisk);
efi_bs->FreePool(name.w);
+ if ( !load_ok )
+ blexit(L"Unable to load ramdisk image.");
}
name.s = get_value(&cfg, section.s, "ucode");
@@ -896,16 +921,20 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
microcode_set_module(mbi.mods_count);
split_value(name.s);
- read_file(dir_handle, s2w(&name), &ucode);
+ load_ok = load_file(dir_handle, s2w(&name), &ucode);
efi_bs->FreePool(name.w);
+ if ( !load_ok )
+ blexit(L"Unable to load ucode image.");
}
name.s = get_value(&cfg, section.s, "xsm");
if ( name.s )
{
split_value(name.s);
- read_file(dir_handle, s2w(&name), &xsm);
+ load_ok = load_file(dir_handle, s2w(&name), &xsm);
efi_bs->FreePool(name.w);
+ if ( !load_ok )
+ blexit(L"Unable to load ucode image.");
}
name.s = get_value(&cfg, section.s, "options");
--
2.0.0
next prev parent reply other threads:[~2014-07-22 0:43 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-22 0:43 [PATCH V2 00/12] arm64 EFI stub Roy Franz
2014-07-22 0:43 ` [PATCH V2 01/12] Create efi-shared.[ch], and move string functions Roy Franz
2014-07-23 16:31 ` Jan Beulich
2014-07-28 15:41 ` Ian Campbell
2014-07-28 15:52 ` Jan Beulich
2014-07-28 15:56 ` Ian Campbell
2014-07-28 16:00 ` Jan Beulich
2014-07-28 16:04 ` Ian Campbell
2014-07-28 16:10 ` Jan Beulich
2014-08-06 23:55 ` Roy Franz
2014-08-07 6:17 ` Jan Beulich
2014-08-09 0:27 ` Roy Franz
2014-08-06 23:42 ` Roy Franz
2014-07-22 0:43 ` [PATCH V2 02/12] rename printErrMsg to PrintErrMesgExit Roy Franz
2014-07-23 16:33 ` Jan Beulich
2014-07-22 0:43 ` [PATCH V2 03/12] Refactor get_parent_handle for sharing Roy Franz
2014-07-23 16:37 ` Jan Beulich
2014-07-22 0:43 ` Roy Franz [this message]
2014-07-24 7:09 ` [PATCH V2 04/12] Refactor read_file() so it can be shared Jan Beulich
2014-08-06 18:38 ` Roy Franz
2014-08-07 6:20 ` Jan Beulich
2014-08-07 17:26 ` Roy Franz
2014-07-22 0:43 ` [PATCH V2 05/12] replace split_value() with truncate_string() Roy Franz
2014-07-24 7:19 ` Jan Beulich
2014-08-06 22:37 ` Roy Franz
2014-08-07 6:24 ` Jan Beulich
2014-08-18 23:38 ` Roy Franz
2014-08-19 12:56 ` Jan Beulich
2014-07-22 0:43 ` [PATCH V2 06/12] add read_config_file() function for XEN EFI config file Roy Franz
2014-07-24 7:32 ` Jan Beulich
2014-08-06 22:42 ` Roy Franz
2014-07-22 0:43 ` [PATCH V2 07/12] create handle_cmdline() function Roy Franz
2014-07-24 7:36 ` Jan Beulich
2014-07-28 15:44 ` Ian Campbell
2014-07-28 15:57 ` Jan Beulich
2014-07-22 0:43 ` [PATCH V2 08/12] Refactor get_argv() for sharing Roy Franz
2014-07-24 7:38 ` Jan Beulich
2014-07-22 0:43 ` [PATCH V2 09/12] Move shared EFI functions to efi-shared.c Roy Franz
2014-07-22 0:43 ` [PATCH V2 10/12] add arm64 cache flushing code from linux Roy Franz
2014-07-28 15:53 ` Ian Campbell
2014-07-28 16:24 ` Ian Campbell
2014-07-22 0:43 ` [PATCH V2 11/12] Add fdt_create_empty_tree() function Roy Franz
2014-07-22 16:36 ` [Linaro-uefi] " Julien Grall
2014-07-22 17:12 ` Roy Franz
2014-07-22 17:15 ` Julien Grall
2014-07-23 9:58 ` Ian Campbell
2014-07-23 16:15 ` Roy Franz
2014-07-22 0:43 ` [PATCH V2 12/12] Add EFI stub for arm64 Roy Franz
2014-07-29 9:46 ` Ian Campbell
2014-07-28 15:30 ` [PATCH V2 00/12] arm64 EFI stub Ian Campbell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1405989815-25236-5-git-send-email-roy.franz@linaro.org \
--to=roy.franz@linaro.org \
--cc=fu.wei@linaro.org \
--cc=ian.campbell@citrix.com \
--cc=jbeulich@suse.com \
--cc=keir@xen.org \
--cc=linaro-uefi@lists.linaro.org \
--cc=stefano.stabellini@citrix.com \
--cc=tim@xen.org \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).