]> git.proxmox.com Git - mirror_qemu.git/commitdiff
hw/xtensa/xtfpga: refactor bootparameters filling
authorMax Filippov <jcmvbkbc@gmail.com>
Sat, 21 Jun 2014 09:10:38 +0000 (13:10 +0400)
committerMax Filippov <jcmvbkbc@gmail.com>
Sat, 28 Jun 2014 22:32:42 +0000 (02:32 +0400)
Separate filling first/last tag and size calculation from the kernel
command line setup.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
hw/xtensa/bootparam.h
hw/xtensa/xtfpga.c

index e6cf3b1492bec2c194a8fde2ab5ed5333924b87f..e839bee5764ef225c635cda6fea5e81d800b66ac 100644 (file)
@@ -16,6 +16,11 @@ typedef struct BpTag {
     uint16_t size;
 } BpTag;
 
+static inline size_t get_tag_size(size_t data_size)
+{
+    return data_size + sizeof(BpTag) + 4;
+}
+
 static inline ram_addr_t put_tag(ram_addr_t addr, uint16_t tag,
         size_t size, const void *data)
 {
index 6d070b0d64299b95419265c26a2d67d20fd8ccca..689d07843b45f28dcd00df5780d867aa34d6fa1a 100644 (file)
@@ -237,26 +237,30 @@ static void lx_init(const LxBoardDesc *board, MachineState *machine)
 
     /* Use presence of kernel file name as 'boot from SRAM' switch. */
     if (kernel_filename) {
+        size_t bp_size = 2 * get_tag_size(0);
+        uint32_t tagptr = 0xfe000000 + board->sram_size;
+        uint32_t cur_tagptr;
+
         rom = g_malloc(sizeof(*rom));
         memory_region_init_ram(rom, NULL, "lx60.sram", board->sram_size);
         vmstate_register_ram_global(rom);
         memory_region_add_subregion(system_memory, 0xfe000000, rom);
 
+        if (kernel_cmdline) {
+            bp_size += get_tag_size(strlen(kernel_cmdline) + 1);
+        }
+
         /* Put kernel bootparameters to the end of that SRAM */
+        tagptr = (tagptr - bp_size) & ~0xff;
+        cur_tagptr = put_tag(tagptr, BP_TAG_FIRST, 0, NULL);
+
         if (kernel_cmdline) {
-            size_t cmdline_size = strlen(kernel_cmdline) + 1;
-            size_t bp_size = sizeof(BpTag[4]) + cmdline_size;
-            uint32_t tagptr = (0xfe000000 + board->sram_size - bp_size) & ~0xff;
-
-            env->regs[2] = tagptr;
-
-            tagptr = put_tag(tagptr, BP_TAG_FIRST, 0, NULL);
-            if (cmdline_size > 1) {
-                tagptr = put_tag(tagptr, BP_TAG_COMMAND_LINE,
-                        cmdline_size, kernel_cmdline);
-            }
-            tagptr = put_tag(tagptr, BP_TAG_LAST, 0, NULL);
+            cur_tagptr = put_tag(cur_tagptr, BP_TAG_COMMAND_LINE,
+                                 strlen(kernel_cmdline) + 1, kernel_cmdline);
         }
+        cur_tagptr = put_tag(cur_tagptr, BP_TAG_LAST, 0, NULL);
+        env->regs[2] = tagptr;
+
         uint64_t elf_entry;
         uint64_t elf_lowaddr;
         int success = load_elf(kernel_filename, translate_phys_addr, cpu,