armv8: Improve handling of multiboot info
authorDaniel Schwyn <daniel.schwyn@inf.ethz.ch>
Fri, 7 Jun 2019 14:39:48 +0000 (16:39 +0200)
committerDaniel Schwyn <daniel.schwyn@inf.ethz.ch>
Fri, 27 Sep 2019 07:55:33 +0000 (09:55 +0200)
Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>

include/multiboot2.h
kernel/arch/armv8/startup_arch.c

index 0d74fc4..48086bd 100644 (file)
@@ -379,7 +379,19 @@ struct multiboot_tag_efi_mmap
   multiboot_uint32_t descr_size;
   multiboot_uint32_t descr_vers;
   multiboot_uint8_t efi_mmap[0];
-}; 
+};
+
+struct multiboot_info
+{
+  /* contains the total size of boot information including this field and terminating tag in bytes  */
+  multiboot_uint32_t total_size;
+
+  /* is always set to zero and must be ignored by OS image */
+  multiboot_uint32_t reserved;
+
+  /* The tags follow after this in memory */
+  struct multiboot_tag tags[];
+};
 
 #define MULTIBOOT_MODULE_SIZE(mod)      ((mod).mod_end - (mod).mod_start)
 
index 03651a5..60bec45 100644 (file)
@@ -187,11 +187,11 @@ load_init_image(
     *init_ep = *got_base = 0;
 
     /* Load init ELF64 binary */
-    struct multiboot_tag *multiboot =
-            (struct multiboot_tag *) local_phys_to_mem(
+    struct multiboot_info *multiboot =
+            (struct multiboot_info *) local_phys_to_mem(
                     armv8_glbl_core_data->multiboot_image.base);
     struct multiboot_tag_module_64 *module = multiboot2_find_module_64(
-            multiboot, armv8_glbl_core_data->multiboot_image.length, name);
+            multiboot->tags, multiboot->total_size - 8, name);
     if (module == NULL) {
         panic("Could not find init module!");
     }
@@ -225,8 +225,8 @@ void create_module_caps(struct spawn_state *st)
     errval_t err;
 
     /* Create caps for multiboot modules */
-    struct multiboot_tag *multiboot =
-        (struct multiboot_tag *)local_phys_to_mem(armv8_glbl_core_data->multiboot_image.base);
+    struct multiboot_info *multiboot =
+        (struct multiboot_info *)local_phys_to_mem(armv8_glbl_core_data->multiboot_image.base);
 
     // Allocate strings area
     lpaddr_t mmstrings_phys = bsp_alloc_phys(BASE_PAGE_SIZE);
@@ -246,21 +246,19 @@ void create_module_caps(struct spawn_state *st)
 
     /* Walk over multiboot modules, creating frame caps */
     size_t position = 0;
-    size_t size = armv8_glbl_core_data->multiboot_image.length;
-
     struct mem_region *region;
 
     lpaddr_t acpi_base = (lpaddr_t)-1;
     /* add the ACPI regions */
     struct multiboot_tag_new_acpi *acpi_new;
     acpi_new = (struct multiboot_tag_new_acpi *)
-           multiboot2_find_tag(multiboot, size, MULTIBOOT_TAG_TYPE_ACPI_NEW);
+           multiboot2_find_tag(multiboot->tags, multiboot->total_size - 8, MULTIBOOT_TAG_TYPE_ACPI_NEW);
     if (acpi_new) {
         acpi_base = mem_to_local_phys((lvaddr_t)&acpi_new->rsdp[0]);
     } else {
         struct multiboot_tag_old_acpi *acpi_old;
         acpi_old = (struct multiboot_tag_old_acpi *)
-           multiboot2_find_tag(multiboot, size, MULTIBOOT_TAG_TYPE_ACPI_OLD);
+           multiboot2_find_tag(multiboot->tags, multiboot->total_size - 8, MULTIBOOT_TAG_TYPE_ACPI_OLD);
         if (acpi_old) {
             acpi_base = mem_to_local_phys((lvaddr_t)&acpi_old->rsdp[0]);
         }
@@ -275,7 +273,7 @@ void create_module_caps(struct spawn_state *st)
     /* add the module regions */
     position = 0;
     struct multiboot_tag_module_64 *module = (struct multiboot_tag_module_64 *)
-            multiboot2_find_tag(multiboot, size, MULTIBOOT_TAG_TYPE_MODULE_64);
+            multiboot2_find_tag(multiboot->tags, multiboot->total_size - 8, MULTIBOOT_TAG_TYPE_MODULE_64);
     while (module) {
         // Set memory regions within bootinfo
         region = &bootinfo->regions[bootinfo->regions_length++];
@@ -309,7 +307,7 @@ void create_module_caps(struct spawn_state *st)
         module = ((void *) module) + module->size;
         position += module->size;
         module = (struct multiboot_tag_module_64 *) multiboot2_find_tag(
-                (struct multiboot_tag *)module, size - position,
+                (struct multiboot_tag *)module, (multiboot->total_size - 8) - position,
                 MULTIBOOT_TAG_TYPE_MODULE_64);
     }
 }