Hi Stefano,

On 01/08/18 00:27, Stefano Stabellini wrote:
Don't add duplicate boot modules (same kind and same start address).

Please explain why you don't want to duplicate it.


Mark kernels and ramdisks of "xen,domain" nodes as BOOTMOD_KERNEL_DOMAIN
and BOOTMOD_RAMDISK_DOMAIN respectively, to avoid getting confused in
kernel_probe, where we try to guess which is the dom0 kernel and initrd
to be compatible with older versions of the multiboot spec.

In patch #9, you wrote we don't want duplication because of the free function. But it would be possible to have all the domains (including Dom0) to use the same kernel.

It would be better to find a different way to find Dom0 information. One way would be to add a flag in the boot module.


Signed-off-by: Stefano Stabellini <stefa...@xilinx.com>

---
Changes in v2:
- new patch
---
  xen/arch/arm/bootfdt.c      | 7 +++++++
  xen/arch/arm/setup.c        | 9 +++++++++
  xen/include/asm-arm/setup.h | 2 ++
  3 files changed, 18 insertions(+)

diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c
index 6f44022..dbaa8f4 100644
--- a/xen/arch/arm/bootfdt.c
+++ b/xen/arch/arm/bootfdt.c
@@ -256,6 +256,13 @@ static void __init process_multiboot_node(const void *fdt, 
int node,
              kind = BOOTMOD_XSM;
      }
+ if ( fdt_node_check_compatible(fdt, parent_node, "xen,domain") == 0 )
+    {
+        if ( kind == BOOTMOD_KERNEL )
+            kind = BOOTMOD_KERNEL_DOMAIN;
+        if ( kind == BOOTMOD_RAMDISK )
+            kind = BOOTMOD_RAMDISK_DOMAIN;
+    }
      add_boot_module(kind, start, size);
      add_boot_cmdline(fdt, node, fdt_get_name(fdt, parent_node, &len), kind);
  }
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index 67ab1fd..b1a117f 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -204,6 +204,7 @@ struct bootmodule __init *add_boot_module(bootmodule_kind 
kind,
  {
      struct bootmodules *mods = &bootinfo.modules;
      struct bootmodule *mod;
+    int i;

unsigned please.

if ( mods->nr_mods == MAX_MODULES )
      {
@@ -211,6 +212,12 @@ struct bootmodule __init *add_boot_module(bootmodule_kind 
kind,
                 boot_module_kind_as_string(kind), start, start + size);
          return NULL;
      }
+    for ( i = 0 ; i < mods->nr_mods ; i++ )
+    {
+        mod = &mods->module[i];
+        if ( mod->kind == kind && mod->start == start )
+            return mod;
+    }
mod = &mods->module[mods->nr_mods++];
      mod->kind = kind;
@@ -257,6 +264,8 @@ const char * __init 
boot_module_kind_as_string(bootmodule_kind kind)
      case BOOTMOD_KERNEL:  return "Kernel";
      case BOOTMOD_RAMDISK: return "Ramdisk";
      case BOOTMOD_XSM:     return "XSM";
+    case BOOTMOD_KERNEL_DOMAIN:  return "DomU Kernel";
+    case BOOTMOD_RAMDISK_DOMAIN: return "DomU Ramdisk";
      case BOOTMOD_UNKNOWN: return "Unknown";
      default: BUG();
      }
diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h
index cb7da51..353c32a 100644
--- a/xen/include/asm-arm/setup.h
+++ b/xen/include/asm-arm/setup.h
@@ -16,6 +16,8 @@ typedef enum {
      BOOTMOD_KERNEL,
      BOOTMOD_RAMDISK,
      BOOTMOD_XSM,
+    BOOTMOD_KERNEL_DOMAIN,
+    BOOTMOD_RAMDISK_DOMAIN,
      BOOTMOD_UNKNOWN
  }  bootmodule_kind;

Cheers,

--
Julien Grall

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Reply via email to