Skip to content

Commit

Permalink
efi: Renames in handle_cmdline_files() to complete generalization.
Browse files Browse the repository at this point in the history
Rename variables to be not initrd specific, as now the function
loads arbitrary files.  This change is exclusively renames
and comment changes to reflect the generalization.

Signed-off-by: Roy Franz <roy.franz@linaro.org>
Acked-by: Mark Salter <msalter@redhat.com>
Reviewed-by: Grant Likely <grant.likely@linaro.org>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
  • Loading branch information
Roy Franz authored and Matt Fleming committed Sep 25, 2013
1 parent 46f4582 commit 36f8961
Showing 1 changed file with 46 additions and 46 deletions.
92 changes: 46 additions & 46 deletions drivers/firmware/efi/efi-stub-helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
*/
#define EFI_READ_CHUNK_SIZE (1024 * 1024)

struct initrd {
struct file_info {
efi_file_handle_t *handle;
u64 size;
};
Expand Down Expand Up @@ -264,10 +264,10 @@ static void efi_free(efi_system_table_t *sys_table_arg, unsigned long size,


/*
* Check the cmdline for a LILO-style initrd= arguments.
* Check the cmdline for a LILO-style file= arguments.
*
* We only support loading an initrd from the same filesystem as the
* kernel image.
* We only support loading a file from the same filesystem as
* the kernel image.
*/
static efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
efi_loaded_image_t *image,
Expand All @@ -276,19 +276,19 @@ static efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
unsigned long *load_addr,
unsigned long *load_size)
{
struct initrd *initrds;
unsigned long initrd_addr;
struct file_info *files;
unsigned long file_addr;
efi_guid_t fs_proto = EFI_FILE_SYSTEM_GUID;
u64 initrd_total;
u64 file_size_total;
efi_file_io_interface_t *io;
efi_file_handle_t *fh;
efi_status_t status;
int nr_initrds;
int nr_files;
char *str;
int i, j, k;

initrd_addr = 0;
initrd_total = 0;
file_addr = 0;
file_size_total = 0;

str = cmd_line;

Expand All @@ -303,7 +303,7 @@ static efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
if (!str || !*str)
return EFI_SUCCESS;

for (nr_initrds = 0; *str; nr_initrds++) {
for (nr_files = 0; *str; nr_files++) {
str = strstr(str, option_string);
if (!str)
break;
Expand All @@ -318,21 +318,21 @@ static efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
str++;
}

if (!nr_initrds)
if (!nr_files)
return EFI_SUCCESS;

status = efi_call_phys3(sys_table_arg->boottime->allocate_pool,
EFI_LOADER_DATA,
nr_initrds * sizeof(*initrds),
&initrds);
nr_files * sizeof(*files),
&files);
if (status != EFI_SUCCESS) {
efi_printk(sys_table_arg, "Failed to alloc mem for file load\n");
efi_printk(sys_table_arg, "Failed to alloc mem for file handle list\n");
goto fail;
}

str = cmd_line;
for (i = 0; i < nr_initrds; i++) {
struct initrd *initrd;
for (i = 0; i < nr_files; i++) {
struct file_info *file;
efi_file_handle_t *h;
efi_file_info_t *info;
efi_char16_t filename_16[256];
Expand All @@ -347,7 +347,7 @@ static efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,

str += strlen(option_string);

initrd = &initrds[i];
file = &files[i];
p = filename_16;

/* Skip any leading slashes */
Expand Down Expand Up @@ -378,13 +378,13 @@ static efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
image->device_handle, &fs_proto, &io);
if (status != EFI_SUCCESS) {
efi_printk(sys_table_arg, "Failed to handle fs_proto\n");
goto free_initrds;
goto free_files;
}

status = efi_call_phys2(io->open_volume, io, &fh);
if (status != EFI_SUCCESS) {
efi_printk(sys_table_arg, "Failed to open volume\n");
goto free_initrds;
goto free_files;
}
}

Expand All @@ -397,7 +397,7 @@ static efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
goto close_handles;
}

initrd->handle = h;
file->handle = h;

info_sz = 0;
status = efi_call_phys4(h->get_info, h, &info_guid,
Expand Down Expand Up @@ -431,74 +431,74 @@ static efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
goto close_handles;
}

initrd->size = file_sz;
initrd_total += file_sz;
file->size = file_sz;
file_size_total += file_sz;
}

if (initrd_total) {
if (file_size_total) {
unsigned long addr;

/*
* Multiple initrd's need to be at consecutive
* addresses in memory, so allocate enough memory for
* all the initrd's.
* Multiple files need to be at consecutive addresses in memory,
* so allocate enough memory for all the files. This is used
* for loading multiple files.
*/
status = efi_high_alloc(sys_table_arg, initrd_total, 0x1000,
&initrd_addr, max_addr);
status = efi_high_alloc(sys_table_arg, file_size_total, 0x1000,
&file_addr, max_addr);
if (status != EFI_SUCCESS) {
efi_printk(sys_table_arg, "Failed to alloc highmem for initrds\n");
efi_printk(sys_table_arg, "Failed to alloc highmem for files\n");
goto close_handles;
}

/* We've run out of free low memory. */
if (initrd_addr > max_addr) {
if (file_addr > max_addr) {
efi_printk(sys_table_arg, "We've run out of free low memory\n");
status = EFI_INVALID_PARAMETER;
goto free_initrd_total;
goto free_file_total;
}

addr = initrd_addr;
for (j = 0; j < nr_initrds; j++) {
addr = file_addr;
for (j = 0; j < nr_files; j++) {
u64 size;

size = initrds[j].size;
size = files[j].size;
while (size) {
u64 chunksize;
if (size > EFI_READ_CHUNK_SIZE)
chunksize = EFI_READ_CHUNK_SIZE;
else
chunksize = size;
status = efi_call_phys3(fh->read,
initrds[j].handle,
files[j].handle,
&chunksize, addr);
if (status != EFI_SUCCESS) {
efi_printk(sys_table_arg, "Failed to read file\n");
goto free_initrd_total;
goto free_file_total;
}
addr += chunksize;
size -= chunksize;
}

efi_call_phys1(fh->close, initrds[j].handle);
efi_call_phys1(fh->close, files[j].handle);
}

}

efi_call_phys1(sys_table_arg->boottime->free_pool, initrds);
efi_call_phys1(sys_table_arg->boottime->free_pool, files);

*load_addr = initrd_addr;
*load_size = initrd_total;
*load_addr = file_addr;
*load_size = file_size_total;

return status;

free_initrd_total:
efi_free(sys_table_arg, initrd_total, initrd_addr);
free_file_total:
efi_free(sys_table_arg, file_size_total, file_addr);

close_handles:
for (k = j; k < i; k++)
efi_call_phys1(fh->close, initrds[k].handle);
free_initrds:
efi_call_phys1(sys_table_arg->boottime->free_pool, initrds);
efi_call_phys1(fh->close, files[k].handle);
free_files:
efi_call_phys1(sys_table_arg->boottime->free_pool, files);
fail:
*load_addr = 0;
*load_size = 0;
Expand Down

0 comments on commit 36f8961

Please sign in to comment.