From nobody Mon Feb 9 15:49:49 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=suse.com ARC-Seal: i=1; a=rsa-sha256; t=1601014861; cv=none; d=zohomail.com; s=zohoarc; b=I/NbS07WcViqZVOO+nUVMDcIvWmVz77d/tQfgKxjsgtVGBeXxo77GuSo7eWKP0A8XIwyUlu0oCjFV3YU/OMDvy+cDUgKSGQrtyon6aICdJoP+3zHqvCClLHpWl7DcenLg9EEMYlL1eV4oU0TV1WklRgRmjjgVDIScbAUCwdS6J0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1601014861; 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=RxQT5GqxULjW+/bO7Bu3gT13lS41GQ9AYZk6ZaY5Fi4=; b=i9HcDU5MJ8KbrxlTXC86UKSeiR8kBVnm5OtuUd6kTruzdKMPzWMbwa6Ov0QDpmYEp4prvbP3DsCT4QdULSmAT9mT++qWphh0UkWB8fL5oNeKZjV59D2mJGC7FvQtneHt7NGnwZ9JZ1JrsYnv54EXcHo3f1MGvQPKsrDika92cQg= 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) header.from= Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1601014861345267.8028306770441; Thu, 24 Sep 2020 23:21:01 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1kLh63-0006L7-B5; Fri, 25 Sep 2020 06:20:43 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1kLh62-0006JE-RK for xen-devel@lists.xenproject.org; Fri, 25 Sep 2020 06:20:42 +0000 Received: from mx2.suse.de (unknown [195.135.220.15]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 125fdf91-0a91-4c58-ab05-d9d3cc9008a3; Fri, 25 Sep 2020 06:20:37 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 876C2B12F; Fri, 25 Sep 2020 06:20:36 +0000 (UTC) X-Inumbo-ID: 125fdf91-0a91-4c58-ab05-d9d3cc9008a3 X-Virus-Scanned: by amavisd-new at test-mx.suse.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1601014836; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RxQT5GqxULjW+/bO7Bu3gT13lS41GQ9AYZk6ZaY5Fi4=; b=KtgBsfE+AkTJeIv5EA3uFNN9Go+plt45vECVpm7m/CZAiB/1FaeiRISGwOPT+xDMrDCgLJ CWvF/kOHGYjvZL0OzcEwbMRgg+EgrrwkDlTf/ciplWgXRWLgVaEC7BNgiRnlcwUNZpFjKF 5nTFgQ0AftoXZOzs3btkB9SeFDdDBuE= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Samuel Thibault , Ian Jackson , Wei Liu , Anthony PERARD Subject: [PATCH v2 3/3] tools/lixenguest: hide struct elf_dom_parms layout from users Date: Fri, 25 Sep 2020 08:20:31 +0200 Message-Id: <20200925062031.12200-4-jgross@suse.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200925062031.12200-1-jgross@suse.com> References: <20200925062031.12200-1-jgross@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" X-ZohoMail-DKIM: pass (identity @suse.com) Content-Type: text/plain; charset="utf-8" Don't include struct elf_dom_parms in struct xc_dom_image, but rather use a pointer to reference it. Together with adding accessor functions for the externally needed elements this enables to drop including the Xen private header xen/libelf/libelf.h from xenguest.h. Fixes: 7e0165c19387 ("tools/libxc: untangle libxenctrl from libxenguest") Signed-off-by: Juergen Gross --- stubdom/grub/kexec.c | 18 +++--- tools/libs/guest/include/xenguest.h | 29 +++------- tools/libs/guest/xg_dom_core.c | 85 +++++++++++++++++++++++------ tools/libs/guest/xg_private.h | 1 + tools/libxl/libxl_x86_acpi.c | 5 +- 5 files changed, 88 insertions(+), 50 deletions(-) diff --git a/stubdom/grub/kexec.c b/stubdom/grub/kexec.c index e9a69d2a32..3da80b5b4a 100644 --- a/stubdom/grub/kexec.c +++ b/stubdom/grub/kexec.c @@ -222,6 +222,7 @@ void kexec(void *kernel, long kernel_size, void *module= , long module_size, char char features[] =3D ""; struct mmu_update *m2p_updates; unsigned long nr_m2p_updates; + uint64_t virt_base; =20 DEBUG("booting with cmdline %s\n", cmdline); xc_handle =3D xc_interface_open(0,0,0); @@ -294,10 +295,11 @@ void kexec(void *kernel, long kernel_size, void *modu= le, long module_size, char goto out; } =20 + virt_base =3D xc_dom_virt_base(dom); /* copy hypercall page */ /* TODO: domctl instead, but requires privileges */ - if (dom->parms.virt_hypercall !=3D -1) { - pfn =3D PHYS_PFN(dom->parms.virt_hypercall - dom->parms.virt_base); + if (xc_dom_virt_hypercall(dom) !=3D -1) { + pfn =3D PHYS_PFN(xc_dom_virt_hypercall(dom) - virt_base); memcpy((void *) pages[pfn], hypercall_page, PAGE_SIZE); } =20 @@ -313,11 +315,11 @@ void kexec(void *kernel, long kernel_size, void *modu= le, long module_size, char /* Move current console, xenstore and boot MFNs to the allocated place= */ do_exchange(dom, dom->console_pfn, start_info.console.domU.mfn); do_exchange(dom, dom->xenstore_pfn, start_info.store_mfn); - DEBUG("virt base at %llx\n", dom->parms.virt_base); + DEBUG("virt base at %llx\n", virt_base); DEBUG("bootstack_pfn %lx\n", dom->bootstack_pfn); - _boot_target =3D dom->parms.virt_base + PFN_PHYS(dom->bootstack_pfn); + _boot_target =3D virt_base + PFN_PHYS(dom->bootstack_pfn); DEBUG("_boot_target %lx\n", _boot_target); - do_exchange(dom, PHYS_PFN(_boot_target - dom->parms.virt_base), + do_exchange(dom, PHYS_PFN(_boot_target - virt_base), virt_to_mfn(&_boot_page)); =20 if ( dom->arch_hooks->setup_pgtables ) @@ -373,13 +375,13 @@ void kexec(void *kernel, long kernel_size, void *modu= le, long module_size, char _boot_oldpdmfn =3D virt_to_mfn(start_info.pt_base); DEBUG("boot old pd mfn %lx\n", _boot_oldpdmfn); DEBUG("boot pd virt %lx\n", dom->pgtables_seg.vstart); - _boot_pdmfn =3D dom->pv_p2m[PHYS_PFN(dom->pgtables_seg.vstart - dom->p= arms.virt_base)]; + _boot_pdmfn =3D dom->pv_p2m[PHYS_PFN(dom->pgtables_seg.vstart - virt_b= ase)]; DEBUG("boot pd mfn %lx\n", _boot_pdmfn); _boot_stack =3D _boot_target + PAGE_SIZE; DEBUG("boot stack %lx\n", _boot_stack); - _boot_start_info =3D dom->parms.virt_base + PFN_PHYS(dom->start_info_p= fn); + _boot_start_info =3D virt_base + PFN_PHYS(dom->start_info_pfn); DEBUG("boot start info %lx\n", _boot_start_info); - _boot_start =3D dom->parms.virt_entry; + _boot_start =3D xc_dom_virt_entry(dom); DEBUG("boot start %lx\n", _boot_start); =20 /* Keep only useful entries */ diff --git a/tools/libs/guest/include/xenguest.h b/tools/libs/guest/include= /xenguest.h index dba6a21643..a9984dbea5 100644 --- a/tools/libs/guest/include/xenguest.h +++ b/tools/libs/guest/include/xenguest.h @@ -22,8 +22,6 @@ #ifndef XENGUEST_H #define XENGUEST_H =20 -#include - #define XC_NUMA_NO_NODE (~0U) =20 #define XCFLAGS_LIVE (1 << 0) @@ -109,7 +107,7 @@ struct xc_dom_image { uint32_t f_requested[XENFEAT_NR_SUBMAPS]; =20 /* info from (elf) kernel image */ - struct elf_dom_parms parms; + struct elf_dom_parms *parms; char *guest_type; =20 /* memory layout */ @@ -390,6 +388,13 @@ void *xc_dom_pfn_to_ptr_retcount(struct xc_dom_image *= dom, xen_pfn_t first, xen_pfn_t count, xen_pfn_t *count_out); void xc_dom_unmap_one(struct xc_dom_image *dom, xen_pfn_t pfn); void xc_dom_unmap_all(struct xc_dom_image *dom); +void *xc_dom_vaddr_to_ptr(struct xc_dom_image *dom, + xen_vaddr_t vaddr, size_t *safe_region_out); +uint64_t xc_dom_virt_base(struct xc_dom_image *dom); +uint64_t xc_dom_virt_entry(struct xc_dom_image *dom); +uint64_t xc_dom_virt_hypercall(struct xc_dom_image *dom); +char *xc_dom_guest_os(struct xc_dom_image *dom); +bool xc_dom_feature_get(struct xc_dom_image *dom, unsigned int nr); =20 static inline void *xc_dom_seg_to_ptr_pages(struct xc_dom_image *dom, struct xc_dom_seg *seg, @@ -411,24 +416,6 @@ static inline void *xc_dom_seg_to_ptr(struct xc_dom_im= age *dom, return xc_dom_seg_to_ptr_pages(dom, seg, &dummy); } =20 -static inline void *xc_dom_vaddr_to_ptr(struct xc_dom_image *dom, - xen_vaddr_t vaddr, - size_t *safe_region_out) -{ - unsigned int page_size =3D XC_DOM_PAGE_SIZE(dom); - xen_pfn_t page =3D (vaddr - dom->parms.virt_base) / page_size; - unsigned int offset =3D (vaddr - dom->parms.virt_base) % page_size; - xen_pfn_t safe_region_count; - void *ptr; - - *safe_region_out =3D 0; - ptr =3D xc_dom_pfn_to_ptr_retcount(dom, page, 0, &safe_region_count); - if ( ptr =3D=3D NULL ) - return ptr; - *safe_region_out =3D (safe_region_count << XC_DOM_PAGE_SHIFT(dom)) - o= ffset; - return ptr + offset; -} - static inline xen_pfn_t xc_dom_p2m(struct xc_dom_image *dom, xen_pfn_t pfn) { if ( xc_dom_translated(dom) ) diff --git a/tools/libs/guest/xg_dom_core.c b/tools/libs/guest/xg_dom_core.c index c0d4a0aa2f..f846d8e1ed 100644 --- a/tools/libs/guest/xg_dom_core.c +++ b/tools/libs/guest/xg_dom_core.c @@ -735,6 +735,7 @@ void xc_dom_release(struct xc_dom_image *dom) xc_dom_unmap_all(dom); xc_dom_free_all(dom); free(dom->arch_private); + free(dom->parms); free(dom); } =20 @@ -753,6 +754,12 @@ struct xc_dom_image *xc_dom_allocate(xc_interface *xch, memset(dom, 0, sizeof(*dom)); dom->xch =3D xch; =20 + dom->parms =3D malloc(sizeof(*dom->parms)); + if (!dom->parms) + goto err; + memset(dom->parms, 0, sizeof(*dom->parms)); + dom->alloc_malloc +=3D sizeof(*dom->parms); + dom->max_kernel_size =3D XC_DOM_DECOMPRESS_MAX; dom->max_module_size =3D XC_DOM_DECOMPRESS_MAX; dom->max_devicetree_size =3D XC_DOM_DECOMPRESS_MAX; @@ -762,12 +769,12 @@ struct xc_dom_image *xc_dom_allocate(xc_interface *xc= h, if ( features ) elf_xen_parse_features(features, dom->f_requested, NULL); =20 - dom->parms.virt_base =3D UNSET_ADDR; - dom->parms.virt_entry =3D UNSET_ADDR; - dom->parms.virt_hypercall =3D UNSET_ADDR; - dom->parms.virt_hv_start_low =3D UNSET_ADDR; - dom->parms.elf_paddr_offset =3D UNSET_ADDR; - dom->parms.p2m_base =3D UNSET_ADDR; + dom->parms->virt_base =3D UNSET_ADDR; + dom->parms->virt_entry =3D UNSET_ADDR; + dom->parms->virt_hypercall =3D UNSET_ADDR; + dom->parms->virt_hv_start_low =3D UNSET_ADDR; + dom->parms->elf_paddr_offset =3D UNSET_ADDR; + dom->parms->p2m_base =3D UNSET_ADDR; =20 dom->flags =3D SIF_VIRT_P2M_4TOOLS; =20 @@ -920,8 +927,8 @@ int xc_dom_parse_image(struct xc_dom_image *dom) for ( i =3D 0; i < XENFEAT_NR_SUBMAPS; i++ ) { dom->f_active[i] |=3D dom->f_requested[i]; /* cmd line */ - dom->f_active[i] |=3D dom->parms.f_required[i]; /* kernel */ - if ( (dom->f_active[i] & dom->parms.f_supported[i]) !=3D + dom->f_active[i] |=3D dom->parms->f_required[i]; /* kernel */ + if ( (dom->f_active[i] & dom->parms->f_supported[i]) !=3D dom->f_active[i] ) { xc_dom_panic(dom->xch, XC_INVALID_PARAM, @@ -1142,8 +1149,8 @@ int xc_dom_build_image(struct xc_dom_image *dom) goto err; } page_size =3D XC_DOM_PAGE_SIZE(dom); - if ( dom->parms.virt_base !=3D UNSET_ADDR ) - dom->virt_alloc_end =3D dom->parms.virt_base; + if ( dom->parms->virt_base !=3D UNSET_ADDR ) + dom->virt_alloc_end =3D dom->parms->virt_base; =20 /* load kernel */ if ( xc_dom_alloc_segment(dom, &dom->kernel_seg, "kernel", @@ -1157,7 +1164,7 @@ int xc_dom_build_image(struct xc_dom_image *dom) /* Don't load ramdisk / other modules now if no initial mapping requir= ed. */ for ( mod =3D 0; mod < dom->num_modules; mod++ ) { - unmapped_initrd =3D (dom->parms.unmapped_initrd && + unmapped_initrd =3D (dom->parms->unmapped_initrd && !dom->modules[mod].seg.vstart); =20 if ( dom->modules[mod].blob && !unmapped_initrd ) @@ -1199,10 +1206,10 @@ int xc_dom_build_image(struct xc_dom_image *dom) =20 /* allocate other pages */ if ( !dom->arch_hooks->p2m_base_supported || - dom->parms.p2m_base >=3D dom->parms.virt_base || - (dom->parms.p2m_base & (XC_DOM_PAGE_SIZE(dom) - 1)) ) - dom->parms.p2m_base =3D UNSET_ADDR; - if ( dom->arch_hooks->alloc_p2m_list && dom->parms.p2m_base =3D=3D UNS= ET_ADDR && + dom->parms->p2m_base >=3D dom->parms->virt_base || + (dom->parms->p2m_base & (XC_DOM_PAGE_SIZE(dom) - 1)) ) + dom->parms->p2m_base =3D UNSET_ADDR; + if ( dom->arch_hooks->alloc_p2m_list && dom->parms->p2m_base =3D=3D UN= SET_ADDR && dom->arch_hooks->alloc_p2m_list(dom) !=3D 0 ) goto err; if ( dom->arch_hooks->alloc_magic_pages(dom) !=3D 0 ) @@ -1228,7 +1235,7 @@ int xc_dom_build_image(struct xc_dom_image *dom) =20 for ( mod =3D 0; mod < dom->num_modules; mod++ ) { - unmapped_initrd =3D (dom->parms.unmapped_initrd && + unmapped_initrd =3D (dom->parms->unmapped_initrd && !dom->modules[mod].seg.vstart); =20 /* Load ramdisk / other modules if no initial mapping required. */ @@ -1247,11 +1254,11 @@ int xc_dom_build_image(struct xc_dom_image *dom) } =20 /* Allocate p2m list if outside of initial kernel mapping. */ - if ( dom->arch_hooks->alloc_p2m_list && dom->parms.p2m_base !=3D UNSET= _ADDR ) + if ( dom->arch_hooks->alloc_p2m_list && dom->parms->p2m_base !=3D UNSE= T_ADDR ) { if ( dom->arch_hooks->alloc_p2m_list(dom) !=3D 0 ) goto err; - dom->p2m_seg.vstart =3D dom->parms.p2m_base; + dom->p2m_seg.vstart =3D dom->parms->p2m_base; } =20 return 0; @@ -1260,6 +1267,48 @@ int xc_dom_build_image(struct xc_dom_image *dom) return -1; } =20 +void *xc_dom_vaddr_to_ptr(struct xc_dom_image *dom, + xen_vaddr_t vaddr, size_t *safe_region_out) +{ + unsigned int page_size =3D XC_DOM_PAGE_SIZE(dom); + xen_pfn_t page =3D (vaddr - dom->parms->virt_base) / page_size; + unsigned int offset =3D (vaddr - dom->parms->virt_base) % page_size; + xen_pfn_t safe_region_count; + void *ptr; + + *safe_region_out =3D 0; + ptr =3D xc_dom_pfn_to_ptr_retcount(dom, page, 0, &safe_region_count); + if ( ptr =3D=3D NULL ) + return ptr; + *safe_region_out =3D (safe_region_count << XC_DOM_PAGE_SHIFT(dom)) - o= ffset; + return ptr + offset; +} + +uint64_t xc_dom_virt_base(struct xc_dom_image *dom) +{ + return dom->parms->virt_base; +} + +uint64_t xc_dom_virt_entry(struct xc_dom_image *dom) +{ + return dom->parms->virt_entry; +} + +uint64_t xc_dom_virt_hypercall(struct xc_dom_image *dom) +{ + return dom->parms->virt_hypercall; +} + +char *xc_dom_guest_os(struct xc_dom_image *dom) +{ + return dom->parms->guest_os; +} + +bool xc_dom_feature_get(struct xc_dom_image *dom, unsigned int nr) +{ + return elf_xen_feature_get(nr, dom->parms->f_supported); +} + /* * Local variables: * mode: C diff --git a/tools/libs/guest/xg_private.h b/tools/libs/guest/xg_private.h index 9940d554ef..fee3191cd4 100644 --- a/tools/libs/guest/xg_private.h +++ b/tools/libs/guest/xg_private.h @@ -31,6 +31,7 @@ =20 #include #include +#include =20 #ifndef ELFSIZE #include diff --git a/tools/libxl/libxl_x86_acpi.c b/tools/libxl/libxl_x86_acpi.c index 1a4e9e98de..3eca1c7a9f 100644 --- a/tools/libxl/libxl_x86_acpi.c +++ b/tools/libxl/libxl_x86_acpi.c @@ -220,9 +220,8 @@ int libxl__dom_load_acpi(libxl__gc *gc, * and so we need to put RSDP in location that can be discovered by AC= PI's * standard search method, in R-O BIOS memory (we chose last 64 bytes) */ - if (strcmp(dom->parms.guest_os, "linux") || - elf_xen_feature_get(XENFEAT_linux_rsdp_unrestricted, - dom->parms.f_supported)) + if (strcmp(xc_dom_guest_os(dom), "linux") || + xc_dom_feature_get(dom, XENFEAT_linux_rsdp_unrestricted)) dom->acpi_modules[0].guest_addr_out =3D ACPI_INFO_PHYSICAL_ADDRESS= + (1 + acpi_pages_num) * libxl_ctxt.page_size; else --=20 2.26.2