
On Thu, 2018-03-15 at 15:43 -0700, Ivan Gorinov wrote:
Make a copy of DTB data with setup_data header and insert new item into the the setup data linked list.
This doesn't explain "Why?" you are doing that. What the problem? Why it's a problem?
Signed-off-by: Ivan Gorinov ivan.gorinov@intel.com
arch/x86/include/asm/bootparam.h | 1 + arch/x86/lib/zimage.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+)
diff --git a/arch/x86/include/asm/bootparam.h b/arch/x86/include/asm/bootparam.h index 90768a9..ea25cf7 100644 --- a/arch/x86/include/asm/bootparam.h +++ b/arch/x86/include/asm/bootparam.h @@ -12,6 +12,7 @@ /* setup data types */ #define SETUP_NONE 0 #define SETUP_E820_EXT 1 +#define SETUP_DTB 2
/* extensible setup data list node */ struct setup_data { diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c index 2a82bc8..41ad4c7 100644 --- a/arch/x86/lib/zimage.c +++ b/arch/x86/lib/zimage.c @@ -14,6 +14,8 @@ */
#include <common.h> +#include <malloc.h> +#include <asm/global_data.h> #include <asm/acpi_table.h> #include <asm/io.h> #include <asm/ptrace.h> @@ -95,6 +97,35 @@ static int get_boot_protocol(struct setup_header *hdr) } }
+static int setup_device_tree(struct setup_header *hdr) +{
- const void *fdt_blob = gd->fdt_blob;
- struct setup_data *sd;
- int size;
- if (!fdt_blob)
return 0;
- size = fdt_totalsize(fdt_blob);
- if (size < 0)
return -EINVAL;
- size += sizeof(struct setup_data);
- sd = (struct setup_data *)malloc(size);
- if (!sd) {
printf("Not enough memory for DTB setup data\n");
return -ENOMEM;
- }
- sd->next = hdr->setup_data;
- sd->type = SETUP_DTB;
- sd->len = fdt_totalsize(fdt_blob);
- memcpy(sd->data, fdt_blob, sd->len);
- hdr->setup_data = (unsigned long)sd;
- return 0;
+}
struct boot_params *load_zimage(char *image, unsigned long kernel_size, ulong *load_addressp) { @@ -262,6 +293,7 @@ int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot, #endif
setup_video(&setup_base->screen_info);
setup_device_tree(hdr);
return 0;
}