108 lines
3.5 KiB
Diff
108 lines
3.5 KiB
Diff
|
From 47514c996fac5e6f13ef3a4c5e23f1c5cffabb7b Mon Sep 17 00:00:00 2001
|
||
|
From: Matt Fleming <matt.fleming@intel.com>
|
||
|
Date: Thu, 10 Apr 2014 14:11:45 +0100
|
||
|
Subject: [PATCH 3/3] efi: Pass correct file handle to efi_file_{read,close}
|
||
|
|
||
|
We're currently passing the file handle for the root file system to
|
||
|
efi_file_read() and efi_file_close(), instead of the file handle for the
|
||
|
file we wish to read/close.
|
||
|
|
||
|
While this has worked up until now, it seems that it has only been by
|
||
|
pure luck. Olivier explains,
|
||
|
|
||
|
"The issue is the UEFI Fat driver might return the same function for
|
||
|
'fh->read()' and 'h->read()'. While in our case it does not work with
|
||
|
a different implementation of EFI_SIMPLE_FILE_SYSTEM_PROTOCOL. In our
|
||
|
case, we return a different pointer when reading a directory and
|
||
|
reading a file."
|
||
|
|
||
|
Fixing this actually clears up the two functions because we can drop one
|
||
|
of the arguments, and instead only pass a file 'handle' argument.
|
||
|
|
||
|
Reported-by: Olivier Martin <olivier.martin@arm.com>
|
||
|
Reviewed-by: Olivier Martin <olivier.martin@arm.com>
|
||
|
Reviewed-by: Mark Rutland <mark.rutland@arm.com>
|
||
|
Cc: Leif Lindholm <leif.lindholm@linaro.org>
|
||
|
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
||
|
---
|
||
|
arch/x86/boot/compressed/eboot.c | 12 ++++++------
|
||
|
drivers/firmware/efi/efi-stub-helper.c | 6 +++---
|
||
|
2 files changed, 9 insertions(+), 9 deletions(-)
|
||
|
|
||
|
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
|
||
|
index 91d17007323b..4703a6c4b8e3 100644
|
||
|
--- a/arch/x86/boot/compressed/eboot.c
|
||
|
+++ b/arch/x86/boot/compressed/eboot.c
|
||
|
@@ -167,31 +167,31 @@ efi_file_size(efi_system_table_t *sys_table, void *__fh,
|
||
|
}
|
||
|
|
||
|
static inline efi_status_t
|
||
|
-efi_file_read(void *__fh, void *handle, unsigned long *size, void *addr)
|
||
|
+efi_file_read(void *handle, unsigned long *size, void *addr)
|
||
|
{
|
||
|
unsigned long func;
|
||
|
|
||
|
if (efi_early->is64) {
|
||
|
- efi_file_handle_64_t *fh = __fh;
|
||
|
+ efi_file_handle_64_t *fh = handle;
|
||
|
|
||
|
func = (unsigned long)fh->read;
|
||
|
return efi_early->call(func, handle, size, addr);
|
||
|
} else {
|
||
|
- efi_file_handle_32_t *fh = __fh;
|
||
|
+ efi_file_handle_32_t *fh = handle;
|
||
|
|
||
|
func = (unsigned long)fh->read;
|
||
|
return efi_early->call(func, handle, size, addr);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
-static inline efi_status_t efi_file_close(void *__fh, void *handle)
|
||
|
+static inline efi_status_t efi_file_close(void *handle)
|
||
|
{
|
||
|
if (efi_early->is64) {
|
||
|
- efi_file_handle_64_t *fh = __fh;
|
||
|
+ efi_file_handle_64_t *fh = handle;
|
||
|
|
||
|
return efi_early->call((unsigned long)fh->close, handle);
|
||
|
} else {
|
||
|
- efi_file_handle_32_t *fh = __fh;
|
||
|
+ efi_file_handle_32_t *fh = handle;
|
||
|
|
||
|
return efi_early->call((unsigned long)fh->close, handle);
|
||
|
}
|
||
|
diff --git a/drivers/firmware/efi/efi-stub-helper.c b/drivers/firmware/efi/efi-stub-helper.c
|
||
|
index ff50aeebf0d9..2c41eaece2c1 100644
|
||
|
--- a/drivers/firmware/efi/efi-stub-helper.c
|
||
|
+++ b/drivers/firmware/efi/efi-stub-helper.c
|
||
|
@@ -397,7 +397,7 @@ static efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
|
||
|
else
|
||
|
chunksize = size;
|
||
|
|
||
|
- status = efi_file_read(fh, files[j].handle,
|
||
|
+ status = efi_file_read(files[j].handle,
|
||
|
&chunksize,
|
||
|
(void *)addr);
|
||
|
if (status != EFI_SUCCESS) {
|
||
|
@@ -408,7 +408,7 @@ static efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
|
||
|
size -= chunksize;
|
||
|
}
|
||
|
|
||
|
- efi_file_close(fh, files[j].handle);
|
||
|
+ efi_file_close(files[j].handle);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
@@ -425,7 +425,7 @@ free_file_total:
|
||
|
|
||
|
close_handles:
|
||
|
for (k = j; k < i; k++)
|
||
|
- efi_file_close(fh, files[k].handle);
|
||
|
+ efi_file_close(files[k].handle);
|
||
|
free_files:
|
||
|
efi_call_early(free_pool, files);
|
||
|
fail:
|
||
|
--
|
||
|
1.9.0
|
||
|
|