From nobody Mon Feb 9 00:01:46 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1688171536; cv=none; d=zohomail.com; s=zohoarc; b=ITqA0M35yl/ZLKoIaFPttkICcw8E8VpXPg16YLBOZP35yQsqgKggX/0E35BBazV0bZYBKkQu+bk1JIeu4+lwVnwH7vQsv67UJuAlmiMxm/QYic6UqKUljoSEe3bDp+ARVDGRHSV37N/4aaVTlkNzU/WvUl4BQLHGD2v8LFO3JZg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1688171536; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=e69b5gTZ8xv/z3fBnKcGKtSZdG5ASDalrjgP59JhG/4=; b=jD2+BNdZVrYa6CDsLN2dTzROIKui1egmsvgfiJU4YeVSfbY7HSOaU6S/rk42vBvKg+Pu1qzOtAct6SoS35f35rGz9M4jYkSqumE9Jq8oENqxSa2LIJflfJ3X6vLwHlbNQ9arx8peOdCTiv4xb+EYCFoAYAEfIqPIWxAwZurnJgg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1688171536878220.32777882752714; Fri, 30 Jun 2023 17:32:16 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.557667.871228 (Exim 4.92) (envelope-from ) id 1qFOWi-0008SK-KP; Sat, 01 Jul 2023 00:31:48 +0000 Received: by outflank-mailman (output) from mailman id 557667.871228; Sat, 01 Jul 2023 00:31:48 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qFOWi-0008SD-HG; Sat, 01 Jul 2023 00:31:48 +0000 Received: by outflank-mailman (input) for mailman id 557667; Sat, 01 Jul 2023 00:31:47 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1qFOWh-0007yM-JQ for xen-devel@lists.xenproject.org; Sat, 01 Jul 2023 00:31:47 +0000 Received: from mail-pf1-x431.google.com (mail-pf1-x431.google.com [2607:f8b0:4864:20::431]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id a6965cda-17a6-11ee-8611-37d641c3527e; Sat, 01 Jul 2023 02:31:43 +0200 (CEST) Received: by mail-pf1-x431.google.com with SMTP id d2e1a72fcca58-6686708c986so2016989b3a.0 for ; Fri, 30 Jun 2023 17:31:43 -0700 (PDT) Received: from cog-dev.home ([70.103.208.83]) by smtp.gmail.com with ESMTPSA id s68-20020a632c47000000b0055b61cd99a1sm1824296pgs.81.2023.06.30.17.31.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 30 Jun 2023 17:31:40 -0700 (PDT) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list X-Inumbo-ID: a6965cda-17a6-11ee-8611-37d641c3527e DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1688171501; x=1690763501; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=e69b5gTZ8xv/z3fBnKcGKtSZdG5ASDalrjgP59JhG/4=; b=Uc+bsWyiiVRS6/ak3e7nNWgvDsm07FG9aSfYXLG6IdDkmxgRSFs8uj9+KckytCzS6t 6cDUUVJnRV2B2uZpOKB8qCmEVxhmGYx0aZjVKSVjY4eRB204KAdIfUnuekcB5E/arvLv /R+PwTzfUoF7fsOw2xAR6DYwcPKA5LOxk9TjklR3PEEGvRChPatSxmuxUs5dCzCf5/X0 qc3MzRPX5q8WSOrLf6e0PkvnwGBP5EC2RADreBhEVPcI9SHFkaCCgXOJE1ievl9VWVY4 Cei44fivdtBK1Gc03Mm4fxWEIrO5kuUNHy95/FOobl6bJitol09+NoU/pYc6CDwJ8kd+ 0uVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1688171501; x=1690763501; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=e69b5gTZ8xv/z3fBnKcGKtSZdG5ASDalrjgP59JhG/4=; b=Fxyh/4e5wzn2e2yLqb31MBsN1AyWcXfbuqDNyM3cKxAqbQQwX/P3u+vZ4l2c0Bzmle p34PT//Kf++n0AZnJ+z4LGwQ/bXI8c20qnCm9ImT14qwnXN9oHFYiZJZzwQKSYPAKJyr sJOM1B0WF1uaG3qH6nQDgR+ZAc5ec3h0xH6Wi4jhsYNGCCoPKWTZQJsjDdCUau1tGVFz XOlbmHjZPKD5qA8Rx3MF8A8ZBF44KChgeRZhJMCxD1rwezGRG+LgLCQAbZOIqYwLhGtr a9egVXR1eRn6EQEhflwqhgybAwHHSM+RWVlmhK0m/jOsKy7Kf0PQY6xFsgInAEJ6FpvS RxJw== X-Gm-Message-State: ABy/qLbPXKt5I9R9nydBlAtCaac/OdSa9+gfiEDjy4icqUJJXT6YePsl FUn/PDy+LCutjosmYALWB2HlF7fHZOA= X-Google-Smtp-Source: APBJJlGMtpigqkyzfp5YokZTkCRps/5vTqNDZCZQZ1cAwWcehJ1Acq2dvmwyA19KQ10YdU1J+7JULQ== X-Received: by 2002:a05:6a00:2488:b0:681:142f:e8e3 with SMTP id c8-20020a056a00248800b00681142fe8e3mr5518207pfv.14.1688171501037; Fri, 30 Jun 2023 17:31:41 -0700 (PDT) Sender: Christopher Clark From: Christopher Clark To: xen-devel@lists.xenproject.org Cc: Daniel Smith , stefano.stabellini@amd.com, Andrew Cooper , George Dunlap , Jan Beulich , Julien Grall , Stefano Stabellini , Wei Liu , Bertrand Marquis , Luca Fancellu , Volodymyr Babchuk , Rich Persaud Subject: [PATCH 01/11] x86 setup: move x86 boot module counting into a new boot_info struct Date: Fri, 30 Jun 2023 17:31:22 -0700 Message-Id: <20230701003132.2210306-2-christopher.w.clark@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230701003132.2210306-1-christopher.w.clark@gmail.com> References: <20230701003132.2210306-1-christopher.w.clark@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1688171537558100005 Content-Type: text/plain; charset="utf-8" An initial step towards a non-multiboot internal representation of boot modules for common code, starting with x86 setup and converting the fields that are accessed for the startup calculations. Introduce a new header, , and populate it with a new boot_info structure initially containing a count of the number of boot modules. The naming of the header, structure and fields is derived from the boot structures on Arm -- see arm/include/asm/setup.h -- as part of work towards aligning common architecture-neutral boot logic and structures. No functional change intended. Signed-off-by: Christopher Clark Signed-off-by: Daniel P. Smith changes since v1: - patch is a subset of patches 2 and 3 --- xen/arch/x86/setup.c | 58 +++++++++++++++++++++++--------------- xen/include/xen/bootinfo.h | 20 +++++++++++++ 2 files changed, 55 insertions(+), 23 deletions(-) create mode 100644 xen/include/xen/bootinfo.h diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 74e3915a4d..708639b236 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -268,7 +269,16 @@ static int __init cf_check parse_acpi_param(const char= *s) custom_param("acpi", parse_acpi_param); =20 static const module_t *__initdata initial_images; -static unsigned int __initdata nr_initial_images; +static struct boot_info __initdata *boot_info; + +static void __init multiboot_to_bootinfo(multiboot_info_t *mbi) +{ + static struct boot_info __initdata info; + + info.nr_mods =3D mbi->mods_count; + + boot_info =3D &info; +} =20 unsigned long __init initial_images_nrpages(nodeid_t node) { @@ -277,7 +287,7 @@ unsigned long __init initial_images_nrpages(nodeid_t no= de) unsigned long nr; unsigned int i; =20 - for ( nr =3D i =3D 0; i < nr_initial_images; ++i ) + for ( nr =3D i =3D 0; i < boot_info->nr_mods; ++i ) { unsigned long start =3D initial_images[i].mod_start; unsigned long end =3D start + PFN_UP(initial_images[i].mod_end); @@ -293,7 +303,7 @@ void __init discard_initial_images(void) { unsigned int i; =20 - for ( i =3D 0; i < nr_initial_images; ++i ) + for ( i =3D 0; i < boot_info->nr_mods; ++i ) { uint64_t start =3D (uint64_t)initial_images[i].mod_start << PAGE_S= HIFT; =20 @@ -301,7 +311,7 @@ void __init discard_initial_images(void) start + PAGE_ALIGN(initial_images[i].mod_end)); } =20 - nr_initial_images =3D 0; + boot_info->nr_mods =3D 0; initial_images =3D NULL; } =20 @@ -1020,6 +1030,8 @@ void __init noreturn __start_xen(unsigned long mbi_p) mod =3D __va(mbi->mods_addr); } =20 + multiboot_to_bootinfo(mbi); + loader =3D (mbi->flags & MBI_LOADERNAME) ? (char *)__va(mbi->boot_loader_name) : "unknown"; =20 @@ -1127,18 +1139,18 @@ void __init noreturn __start_xen(unsigned long mbi_= p) bootsym(boot_edd_info_nr)); =20 /* Check that we have at least one Multiboot module. */ - if ( !(mbi->flags & MBI_MODULES) || (mbi->mods_count =3D=3D 0) ) + if ( !(mbi->flags & MBI_MODULES) || (boot_info->nr_mods =3D=3D 0) ) panic("dom0 kernel not specified. Check bootloader configuration\n= "); =20 /* Check that we don't have a silly number of modules. */ - if ( mbi->mods_count > sizeof(module_map) * 8 ) + if ( boot_info->nr_mods > sizeof(module_map) * 8 ) { - mbi->mods_count =3D sizeof(module_map) * 8; + boot_info->nr_mods =3D sizeof(module_map) * 8; printk("Excessive multiboot modules - using the first %u only\n", - mbi->mods_count); + boot_info->nr_mods); } =20 - bitmap_fill(module_map, mbi->mods_count); + bitmap_fill(module_map, boot_info->nr_mods); __clear_bit(0, module_map); /* Dom0 kernel is always first */ =20 if ( pvh_boot ) @@ -1311,9 +1323,9 @@ void __init noreturn __start_xen(unsigned long mbi_p) kexec_reserve_area(&boot_e820); =20 initial_images =3D mod; - nr_initial_images =3D mbi->mods_count; + boot_info->nr_mods =3D boot_info->nr_mods; =20 - for ( i =3D 0; !efi_enabled(EFI_LOADER) && i < mbi->mods_count; i++ ) + for ( i =3D 0; !efi_enabled(EFI_LOADER) && i < boot_info->nr_mods; i++= ) { if ( mod[i].mod_start & (PAGE_SIZE - 1) ) panic("Bootloader didn't honor module alignment request\n"); @@ -1337,8 +1349,8 @@ void __init noreturn __start_xen(unsigned long mbi_p) * respective reserve_e820_ram() invocation below. No need to * query efi_boot_mem_unused() here, though. */ - mod[mbi->mods_count].mod_start =3D virt_to_mfn(_stext); - mod[mbi->mods_count].mod_end =3D __2M_rwdata_end - _stext; + mod[boot_info->nr_mods].mod_start =3D virt_to_mfn(_stext); + mod[boot_info->nr_mods].mod_end =3D __2M_rwdata_end - _stext; } =20 modules_headroom =3D bzimage_headroom(bootstrap_map(mod), mod->mod_end= ); @@ -1398,7 +1410,7 @@ void __init noreturn __start_xen(unsigned long mbi_p) { /* Don't overlap with modules. */ end =3D consider_modules(s, e, reloc_size + mask, - mod, mbi->mods_count, -1); + mod, boot_info->nr_mods, -1); end &=3D ~mask; } else @@ -1419,7 +1431,7 @@ void __init noreturn __start_xen(unsigned long mbi_p) } =20 /* Is the region suitable for relocating the multiboot modules? */ - for ( j =3D mbi->mods_count - 1; j >=3D 0; j-- ) + for ( j =3D boot_info->nr_mods - 1; j >=3D 0; j-- ) { unsigned long headroom =3D j ? 0 : modules_headroom; unsigned long size =3D PAGE_ALIGN(headroom + mod[j].mod_end); @@ -1429,7 +1441,7 @@ void __init noreturn __start_xen(unsigned long mbi_p) =20 /* Don't overlap with other modules (or Xen itself). */ end =3D consider_modules(s, e, size, mod, - mbi->mods_count + relocated, j); + boot_info->nr_mods + relocated, j); =20 if ( highmem_start && end > highmem_start ) continue; @@ -1456,7 +1468,7 @@ void __init noreturn __start_xen(unsigned long mbi_p) { /* Don't overlap with modules (or Xen itself). */ e =3D consider_modules(s, e, PAGE_ALIGN(kexec_crash_area.size)= , mod, - mbi->mods_count + relocated, -1); + boot_info->nr_mods + relocated, -1); if ( s >=3D e ) break; if ( e > kexec_crash_area_limit ) @@ -1471,7 +1483,7 @@ void __init noreturn __start_xen(unsigned long mbi_p) =20 if ( modules_headroom && !mod->reserved ) panic("Not enough memory to relocate the dom0 kernel image\n"); - for ( i =3D 0; i < mbi->mods_count; ++i ) + for ( i =3D 0; i < boot_info->nr_mods; ++i ) { uint64_t s =3D (uint64_t)mod[i].mod_start << PAGE_SHIFT; =20 @@ -1540,7 +1552,7 @@ void __init noreturn __start_xen(unsigned long mbi_p) ASSERT(j); } map_e =3D boot_e820.map[j].addr + boot_e820.map[j].size; - for ( j =3D 0; j < mbi->mods_count; ++j ) + for ( j =3D 0; j < boot_info->nr_mods; ++j ) { uint64_t end =3D pfn_to_paddr(mod[j].mod_start) + mod[j].mod_end; @@ -1616,7 +1628,7 @@ void __init noreturn __start_xen(unsigned long mbi_p) } } =20 - for ( i =3D 0; i < mbi->mods_count; ++i ) + for ( i =3D 0; i < boot_info->nr_mods; ++i ) { set_pdx_range(mod[i].mod_start, mod[i].mod_start + PFN_UP(mod[i].mod_end)); @@ -1999,8 +2011,8 @@ void __init noreturn __start_xen(unsigned long mbi_p) cpu_has_nx ? XENLOG_INFO : XENLOG_WARNING "Warning: ", cpu_has_nx ? "" : "not "); =20 - initrdidx =3D find_first_bit(module_map, mbi->mods_count); - if ( bitmap_weight(module_map, mbi->mods_count) > 1 ) + initrdidx =3D find_first_bit(module_map, boot_info->nr_mods); + if ( bitmap_weight(module_map, boot_info->nr_mods) > 1 ) printk(XENLOG_WARNING "Multiple initrd candidates, picking module #%u\n", initrdidx); @@ -2010,7 +2022,7 @@ void __init noreturn __start_xen(unsigned long mbi_p) * above our heap. The second module, if present, is an initrd ramdisk. */ dom0 =3D create_dom0(mod, modules_headroom, - initrdidx < mbi->mods_count ? mod + initrdidx : NUL= L, + initrdidx < boot_info->nr_mods ? mod + initrdidx : = NULL, kextra, loader); if ( !dom0 ) panic("Could not set up DOM0 guest OS\n"); diff --git a/xen/include/xen/bootinfo.h b/xen/include/xen/bootinfo.h new file mode 100644 index 0000000000..6a7d55d20e --- /dev/null +++ b/xen/include/xen/bootinfo.h @@ -0,0 +1,20 @@ +#ifndef __XEN_BOOTINFO_H__ +#define __XEN_BOOTINFO_H__ + +#include + +struct boot_info { + unsigned int nr_mods; +}; + +#endif + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ --=20 2.25.1