[PATCH 15/18] Generalize handle_ramdisks() and rename to handle_cmdline_files().

2013-09-22 Thread Roy Franz
The handle_cmdline_files now takes the option to handle as a string,
and returns the loaded data through parameters, rather than taking
an x86 specific setup_header structure.  For ARM, this will be used
to load a device tree blob in addition to initrd images.

Signed-off-by: Roy Franz 
Acked-by: Mark Salter 
Reviewed-by: Grant Likely 
---
 arch/x86/boot/compressed/eboot.c   |9 +-
 drivers/firmware/efi/efi-stub-helper.c |   51 +++-
 2 files changed, 38 insertions(+), 22 deletions(-)

diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
index 8b86772..a5628cd 100644
--- a/arch/x86/boot/compressed/eboot.c
+++ b/arch/x86/boot/compressed/eboot.c
@@ -442,6 +442,8 @@ struct boot_params *make_boot_params(void *handle, 
efi_system_table_t *_table)
u16 *s2;
u8 *s1;
int i;
+   unsigned long ramdisk_addr;
+   unsigned long ramdisk_size;
 
sys_table = _table;
 
@@ -499,9 +501,14 @@ struct boot_params *make_boot_params(void *handle, 
efi_system_table_t *_table)
 
memset(sdt, 0, sizeof(*sdt));
 
-   status = handle_ramdisks(sys_table, image, hdr);
+   status = handle_cmdline_files(sys_table, image,
+ (char *)(unsigned long)hdr->cmd_line_ptr,
+ "initrd=", hdr->initrd_addr_max,
+ _addr, _size);
if (status != EFI_SUCCESS)
goto fail2;
+   hdr->ramdisk_image = ramdisk_addr;
+   hdr->ramdisk_size = ramdisk_size;
 
return boot_params;
 fail2:
diff --git a/drivers/firmware/efi/efi-stub-helper.c 
b/drivers/firmware/efi/efi-stub-helper.c
index 73cf86b..d2d845f 100644
--- a/drivers/firmware/efi/efi-stub-helper.c
+++ b/drivers/firmware/efi/efi-stub-helper.c
@@ -267,9 +267,12 @@ static void efi_free(efi_system_table_t *sys_table_arg, 
unsigned long size,
  * We only support loading an initrd from the same filesystem as the
  * kernel image.
  */
-static efi_status_t handle_ramdisks(efi_system_table_t *sys_table_arg,
-   efi_loaded_image_t *image,
-   struct setup_header *hdr)
+static efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
+efi_loaded_image_t *image,
+char *cmd_line, char *option_string,
+unsigned long max_addr,
+unsigned long *load_addr,
+unsigned long *load_size)
 {
struct initrd *initrds;
unsigned long initrd_addr;
@@ -285,19 +288,25 @@ static efi_status_t handle_ramdisks(efi_system_table_t 
*sys_table_arg,
initrd_addr = 0;
initrd_total = 0;
 
-   str = (char *)(unsigned long)hdr->cmd_line_ptr;
+   str = cmd_line;
 
j = 0;  /* See close_handles */
 
+   if (!load_addr || !load_size)
+   return EFI_INVALID_PARAMETER;
+
+   *load_addr = 0;
+   *load_size = 0;
+
if (!str || !*str)
return EFI_SUCCESS;
 
for (nr_initrds = 0; *str; nr_initrds++) {
-   str = strstr(str, "initrd=");
+   str = strstr(str, option_string);
if (!str)
break;
 
-   str += 7;
+   str += strlen(option_string);
 
/* Skip any leading slashes */
while (*str == '/' || *str == '\\')
@@ -315,11 +324,11 @@ static efi_status_t handle_ramdisks(efi_system_table_t 
*sys_table_arg,
nr_initrds * sizeof(*initrds),
);
if (status != EFI_SUCCESS) {
-   efi_printk(sys_table_arg, "Failed to alloc mem for initrds\n");
+   efi_printk(sys_table_arg, "Failed to alloc mem for file 
load\n");
goto fail;
}
 
-   str = (char *)(unsigned long)hdr->cmd_line_ptr;
+   str = cmd_line;
for (i = 0; i < nr_initrds; i++) {
struct initrd *initrd;
efi_file_handle_t *h;
@@ -330,11 +339,11 @@ static efi_status_t handle_ramdisks(efi_system_table_t 
*sys_table_arg,
efi_char16_t *p;
u64 file_sz;
 
-   str = strstr(str, "initrd=");
+   str = strstr(str, option_string);
if (!str)
break;
 
-   str += 7;
+   str += strlen(option_string);
 
initrd = [i];
p = filename_16;
@@ -380,7 +389,7 @@ static efi_status_t handle_ramdisks(efi_system_table_t 
*sys_table_arg,
status = efi_call_phys5(fh->open, fh, , filename_16,
EFI_FILE_MODE_READ, (u64)0);
if (status != EFI_SUCCESS) {
-   efi_printk(sys_table_arg, "Failed to open 

[PATCH 15/18] Generalize handle_ramdisks() and rename to handle_cmdline_files().

2013-09-22 Thread Roy Franz
The handle_cmdline_files now takes the option to handle as a string,
and returns the loaded data through parameters, rather than taking
an x86 specific setup_header structure.  For ARM, this will be used
to load a device tree blob in addition to initrd images.

Signed-off-by: Roy Franz roy.fr...@linaro.org
Acked-by: Mark Salter msal...@redhat.com
Reviewed-by: Grant Likely grant.lik...@linaro.org
---
 arch/x86/boot/compressed/eboot.c   |9 +-
 drivers/firmware/efi/efi-stub-helper.c |   51 +++-
 2 files changed, 38 insertions(+), 22 deletions(-)

diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
index 8b86772..a5628cd 100644
--- a/arch/x86/boot/compressed/eboot.c
+++ b/arch/x86/boot/compressed/eboot.c
@@ -442,6 +442,8 @@ struct boot_params *make_boot_params(void *handle, 
efi_system_table_t *_table)
u16 *s2;
u8 *s1;
int i;
+   unsigned long ramdisk_addr;
+   unsigned long ramdisk_size;
 
sys_table = _table;
 
@@ -499,9 +501,14 @@ struct boot_params *make_boot_params(void *handle, 
efi_system_table_t *_table)
 
memset(sdt, 0, sizeof(*sdt));
 
-   status = handle_ramdisks(sys_table, image, hdr);
+   status = handle_cmdline_files(sys_table, image,
+ (char *)(unsigned long)hdr-cmd_line_ptr,
+ initrd=, hdr-initrd_addr_max,
+ ramdisk_addr, ramdisk_size);
if (status != EFI_SUCCESS)
goto fail2;
+   hdr-ramdisk_image = ramdisk_addr;
+   hdr-ramdisk_size = ramdisk_size;
 
return boot_params;
 fail2:
diff --git a/drivers/firmware/efi/efi-stub-helper.c 
b/drivers/firmware/efi/efi-stub-helper.c
index 73cf86b..d2d845f 100644
--- a/drivers/firmware/efi/efi-stub-helper.c
+++ b/drivers/firmware/efi/efi-stub-helper.c
@@ -267,9 +267,12 @@ static void efi_free(efi_system_table_t *sys_table_arg, 
unsigned long size,
  * We only support loading an initrd from the same filesystem as the
  * kernel image.
  */
-static efi_status_t handle_ramdisks(efi_system_table_t *sys_table_arg,
-   efi_loaded_image_t *image,
-   struct setup_header *hdr)
+static efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
+efi_loaded_image_t *image,
+char *cmd_line, char *option_string,
+unsigned long max_addr,
+unsigned long *load_addr,
+unsigned long *load_size)
 {
struct initrd *initrds;
unsigned long initrd_addr;
@@ -285,19 +288,25 @@ static efi_status_t handle_ramdisks(efi_system_table_t 
*sys_table_arg,
initrd_addr = 0;
initrd_total = 0;
 
-   str = (char *)(unsigned long)hdr-cmd_line_ptr;
+   str = cmd_line;
 
j = 0;  /* See close_handles */
 
+   if (!load_addr || !load_size)
+   return EFI_INVALID_PARAMETER;
+
+   *load_addr = 0;
+   *load_size = 0;
+
if (!str || !*str)
return EFI_SUCCESS;
 
for (nr_initrds = 0; *str; nr_initrds++) {
-   str = strstr(str, initrd=);
+   str = strstr(str, option_string);
if (!str)
break;
 
-   str += 7;
+   str += strlen(option_string);
 
/* Skip any leading slashes */
while (*str == '/' || *str == '\\')
@@ -315,11 +324,11 @@ static efi_status_t handle_ramdisks(efi_system_table_t 
*sys_table_arg,
nr_initrds * sizeof(*initrds),
initrds);
if (status != EFI_SUCCESS) {
-   efi_printk(sys_table_arg, Failed to alloc mem for initrds\n);
+   efi_printk(sys_table_arg, Failed to alloc mem for file 
load\n);
goto fail;
}
 
-   str = (char *)(unsigned long)hdr-cmd_line_ptr;
+   str = cmd_line;
for (i = 0; i  nr_initrds; i++) {
struct initrd *initrd;
efi_file_handle_t *h;
@@ -330,11 +339,11 @@ static efi_status_t handle_ramdisks(efi_system_table_t 
*sys_table_arg,
efi_char16_t *p;
u64 file_sz;
 
-   str = strstr(str, initrd=);
+   str = strstr(str, option_string);
if (!str)
break;
 
-   str += 7;
+   str += strlen(option_string);
 
initrd = initrds[i];
p = filename_16;
@@ -380,7 +389,7 @@ static efi_status_t handle_ramdisks(efi_system_table_t 
*sys_table_arg,
status = efi_call_phys5(fh-open, fh, h, filename_16,
EFI_FILE_MODE_READ, (u64)0);
if (status !=