[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 08/12] x86/boot: convert domain construction to use boot info


  • To: "Daniel P. Smith" <dpsmith@xxxxxxxxxxxxxxxxxxxx>, <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Jason Andryuk <jason.andryuk@xxxxxxx>
  • Date: Wed, 6 Nov 2024 18:06:06 -0500
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=apertussolutions.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0)
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=5iai/JAWZ6mHE2y4PmwDHPIH979Wi3idCSHmAzSPwNQ=; b=Xv+ItW+HZI2b+Ppf8c8uxNJbmrP6hjeGkNHTJtyvtvS2d7b7UhM0D3GCbDzl6yCCNzs398tP2DCcR8coRbrJwXjV1K54CPZ16b0qbzTbd0lg2toDIa3jlrJwOr6MhB+1Vwvk28EHOQu7K6DfW9LsaylTJU0DKYI66HZA6C4406eP5uYndnYTYB3JS7BWAAUak8rxzXnE3N0o7O0kJV8fMscCT4XcZoEDPuXHhnqLlAwXus2D7GnMUlxKxAmw5ZedYzG8xXSfeyt4LU73xi9TRWbT/4HfsbBGaVl4Bry08T9MfFS7evaTicoB7EcX5QWHX25JcKd6o0NCxrU9tT9Piw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=mPqMr8a8aTIOI7c9yE9zclxFMDHi0+ELA0rKhku7osgNuOmPYhLwMVTiuiN3R907kUczwEH8/W99cVXAI91GT7Vi+t7lpYGrIeHzf0JdlsT9h6Qy2aURktF3pMWXAMbk85q8i07x1xOo7AqTnv6IS9kg6zrU7+tp8T+a/jz+DAnCXZDm3Nup/lcTvHKOP/Nee0xKLEv4THrnWYftQl27w+PwfuDO7foMZoiPGID52mHfeTb2XoSnuFdshw+6fgDlDYjqkIRq7OViLBT9l31KlkUGXdlzcxK4Kr6QVanSLWcbhLa62wv9vqHOKPcUMlYlRsQlwTVGxpZUORfP5U0Jlw==
  • Cc: <christopher.w.clark@xxxxxxxxx>, <stefano.stabellini@xxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Delivery-date: Wed, 06 Nov 2024 23:06:27 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 2024-11-02 13:25, Daniel P. Smith wrote:
With all the components used to construct dom0 encapsulated in struct boot_info
and struct boot_module, it is no longer necessary to pass all them as
parameters down the domain construction call chain. Change the parameter list
to pass the struct boot_info instance and the struct domain reference.

Signed-off-by: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx>
---
Changes since v5:
- renamed from "x86/boot: convert create_dom0 to use boot info"

Changes since v5:
- change headroom back to unsigned long
- make mod_idx unsigned int
---
  xen/arch/x86/dom0_build.c             |  9 ++--
  xen/arch/x86/hvm/dom0_build.c         | 49 +++++++++++++---------
  xen/arch/x86/include/asm/dom0_build.h | 13 ++----
  xen/arch/x86/include/asm/setup.h      |  7 ++--
  xen/arch/x86/pv/dom0_build.c          | 59 ++++++++++++++++-----------
  xen/arch/x86/setup.c                  | 33 ++++++++-------
  6 files changed, 95 insertions(+), 75 deletions(-)


diff --git a/xen/arch/x86/hvm/dom0_build.c b/xen/arch/x86/hvm/dom0_build.c
index a4ac262db463..cd97f94a168a 100644
--- a/xen/arch/x86/hvm/dom0_build.c
+++ b/xen/arch/x86/hvm/dom0_build.c

@@ -1301,16 +1302,25 @@ static void __hwdom_init pvh_setup_mmcfg(struct domain 
*d)
      }
  }
-int __init dom0_construct_pvh(struct domain *d, const module_t *image,
-                              unsigned long image_headroom,
-                              module_t *initrd,
-                              const char *cmdline)
+int __init dom0_construct_pvh(struct boot_info *bi, struct domain *d)
  {
      paddr_t entry, start_info;
+    struct boot_module *image;
+    struct boot_module *initrd = NULL;
      int rc;
printk(XENLOG_INFO "*** Building a PVH Dom%d ***\n", d->domain_id); + rc = first_boot_module_index(bi, BOOTMOD_KERNEL);
+    if ( unlikely(rc < 0 || rc > bi->nr_modules) )

Here and ...

+        panic("Missing kernel boot module for %pd construction\n", d);
+
+    image = &bi->mods[rc];
+
+    rc = first_boot_module_index(bi, BOOTMOD_RAMDISK);
+    if ( rc > 0 || rc < bi->nr_modules )

... here. Can we just check rc < bi->nr_modules for validity? Valid modules are 0...nr_modules and not found is MAX_NR_BOOTMODS + 1. It eliminates these unecessary double checks. This would apply to 04/12 "x86/boot: introduce module release" as well.

+        initrd = &bi->mods[rc];
+
      if ( is_hardware_domain(d) )
      {
          /*


diff --git a/xen/arch/x86/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c
index c1f44502a1ac..594874cd8d85 100644
--- a/xen/arch/x86/pv/dom0_build.c
+++ b/xen/arch/x86/pv/dom0_build.c

@@ -374,10 +371,13 @@ static int __init dom0_construct(struct domain *d,
      unsigned int flush_flags = 0;
      start_info_t *si;
      struct vcpu *v = d->vcpu[0];
-    void *image_base = bootstrap_map(image);
-    unsigned long image_len = image->mod_end;
-    void *image_start = image_base + image_headroom;
-    unsigned long initrd_len = initrd ? initrd->mod_end : 0;
+    struct boot_module *image;
+    struct boot_module *initrd = NULL;
+    void *image_base;
+    unsigned long image_len;
+    void *image_start;
+    unsigned long initrd_len = 0;
+    const char *cmdline;
      l4_pgentry_t *l4tab = NULL, *l4start = NULL;
      l3_pgentry_t *l3tab = NULL, *l3start = NULL;
      l2_pgentry_t *l2tab = NULL, *l2start = NULL;
@@ -414,6 +414,23 @@ static int __init dom0_construct(struct domain *d,
printk(XENLOG_INFO "*** Building a PV Dom%d ***\n", d->domain_id); + i = first_boot_module_index(bi, BOOTMOD_KERNEL);
+    if ( unlikely(i < 0 || i > bi->nr_modules) )

Single check here.

+        panic("Missing kernel boot module for %pd construction\n", d);
+
+    image = &bi->mods[i];
+    image_base = bootstrap_map_bm(image);
+    image_len = image->mod->mod_end;
+    image_start = image_base + image->headroom;
+    cmdline = __va(image->cmdline_pa);
+
+    i = first_boot_module_index(bi, BOOTMOD_RAMDISK);
+    if ( i > 0 || i < bi->nr_modules )
+    {
+        initrd = &bi->mods[i];
+        initrd_len = initrd->mod->mod_end;
+    }
+
      d->max_pages = ~0U;
if ( (rc = bzimage_parse(image_base, &image_start, &image_len)) != 0 )
@@ -613,7 +630,7 @@ static int __init dom0_construct(struct domain *d,
          initrd_pfn = vinitrd_start ?
                       (vinitrd_start - v_start) >> PAGE_SHIFT :
                       domain_tot_pages(d);
-        initrd_mfn = mfn = initrd->mod_start;
+        initrd_mfn = mfn = initrd->mod->mod_start;

MISRA doesn't like these assignment chains?

          count = PFN_UP(initrd_len);
          if ( d->arch.physaddr_bitsize &&
               ((mfn + count - 1) >> (d->arch.physaddr_bitsize - PAGE_SHIFT)) )
@@ -628,17 +645,17 @@ static int __init dom0_construct(struct domain *d,
                      free_domheap_pages(page, order);
                      page += 1UL << order;
                  }
-            memcpy(page_to_virt(page), mfn_to_virt(initrd->mod_start),
+            memcpy(page_to_virt(page), mfn_to_virt(initrd->mod->mod_start),
                     initrd_len);
-            release_module(initrd, true);
-            initrd->mod_start = initrd_mfn = mfn_x(page_to_mfn(page));
+            release_boot_module(initrd, true);
+            initrd->mod->mod_start = initrd_mfn = mfn_x(page_to_mfn(page));

Assignment chain here.

          }
          else
          {
              while ( count-- )
                  if ( assign_pages(mfn_to_page(_mfn(mfn++)), 1, d, 0) )
                      BUG();
-            release_module(initrd, false);
+            release_boot_module(initrd, false);
          }
iommu_memory_setup(d, "initrd", mfn_to_page(_mfn(initrd_mfn)),

diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index aba9df8620ef..d9785acf89b6 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -977,10 +977,7 @@ static unsigned int __init copy_bios_e820(struct e820entry 
*map, unsigned int li
      return n;
  }
-static struct domain *__init create_dom0(const module_t *image,
-                                         unsigned long headroom,
-                                         module_t *initrd, const char *kextra,
-                                         const char *loader)
+static struct domain *__init create_dom0(struct boot_info *bi)
  {
      static char __initdata cmdline[MAX_GUEST_CMDLINE];
@@ -997,6 +994,14 @@ static struct domain *__init create_dom0(const module_t *image,
      };
      struct domain *d;
      domid_t domid;
+    struct boot_module *image;
+    unsigned int idx;
+
+    idx = first_boot_module_index(bi, BOOTMOD_KERNEL);
+    if ( unlikely(idx < 0 || idx > bi->nr_modules) )

Single check here please.

Regards,
Jason

+        panic("Missing kernel boot module for building Dom0\n");
+
+    image = &bi->mods[idx];
if ( opt_dom0_pvh )
      {



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.