Re: [PATCH v2 3/3] tools/lixenguest: hide struct elf_dom_parms layout from users
Hi Juergen, > On 25 Sep 2020, at 07:20, Juergen Gross wrote: > > 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. There are several places in xg_dom_elfloader.c, xg_dom_arm.c and xg_dom_armzimageloader.c which would need to be fixed as they are using dom->parms. Cheers Bertrand > > 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[] = ""; > struct mmu_update *m2p_updates; > unsigned long nr_m2p_updates; > +uint64_t virt_base; > > DEBUG("booting with cmdline %s\n", cmdline); > xc_handle = xc_interface_open(0,0,0); > @@ -294,10 +295,11 @@ void kexec(void *kernel, long kernel_size, void > *module, long module_size, char > goto out; > } > > +virt_base = xc_dom_virt_base(dom); > /* copy hypercall page */ > /* TODO: domctl instead, but requires privileges */ > -if (dom->parms.virt_hypercall != -1) { > -pfn = PHYS_PFN(dom->parms.virt_hypercall - dom->parms.virt_base); > +if (xc_dom_virt_hypercall(dom) != -1) { > +pfn = PHYS_PFN(xc_dom_virt_hypercall(dom) - virt_base); > memcpy((void *) pages[pfn], hypercall_page, PAGE_SIZE); > } > > @@ -313,11 +315,11 @@ void kexec(void *kernel, long kernel_size, void > *module, 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 = dom->parms.virt_base + PFN_PHYS(dom->bootstack_pfn); > +_boot_target = 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)); > > if ( dom->arch_hooks->setup_pgtables ) > @@ -373,13 +375,13 @@ void kexec(void *kernel, long kernel_size, void > *module, long module_size, char > _boot_oldpdmfn = 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 = dom->pv_p2m[PHYS_PFN(dom->pgtables_seg.vstart - > dom->parms.virt_base)]; > +_boot_pdmfn = dom->pv_p2m[PHYS_PFN(dom->pgtables_seg.vstart - > virt_base)]; > DEBUG("boot pd mfn %lx\n", _boot_pdmfn); > _boot_stack = _boot_target + PAGE_SIZE; > DEBUG("boot stack %lx\n", _boot_stack); > -_boot_start_info = dom->parms.virt_base + PFN_PHYS(dom->start_info_pfn); > +_boot_start_info = virt_base + PFN_PHYS(dom->start_info_pfn); > DEBUG("boot start info %lx\n", _boot_start_info); > -_boot_start = dom->parms.virt_entry; > +_boot_start = xc_dom_virt_entry(dom); > DEBUG("boot start %lx\n", _boot_start); > > /* 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 > > -#include > - > #define XC_NUMA_NO_NODE (~0U) > > #define XCFLAGS_LIVE (1 << 0) > @@ -109,7 +107,7 @@ struct xc_dom_image { > uint32_t f_requested[XENFEAT_NR_SUBMAPS]; > > /* info from (elf) kernel image */ > -struct elf_dom_parms parms; > +struct elf_dom_parms *parms; > char *guest_type; > > /* 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
[PATCH v2 3/3] tools/lixenguest: hide struct elf_dom_parms layout from users
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[] = ""; struct mmu_update *m2p_updates; unsigned long nr_m2p_updates; +uint64_t virt_base; DEBUG("booting with cmdline %s\n", cmdline); xc_handle = xc_interface_open(0,0,0); @@ -294,10 +295,11 @@ void kexec(void *kernel, long kernel_size, void *module, long module_size, char goto out; } +virt_base = xc_dom_virt_base(dom); /* copy hypercall page */ /* TODO: domctl instead, but requires privileges */ -if (dom->parms.virt_hypercall != -1) { -pfn = PHYS_PFN(dom->parms.virt_hypercall - dom->parms.virt_base); +if (xc_dom_virt_hypercall(dom) != -1) { +pfn = PHYS_PFN(xc_dom_virt_hypercall(dom) - virt_base); memcpy((void *) pages[pfn], hypercall_page, PAGE_SIZE); } @@ -313,11 +315,11 @@ void kexec(void *kernel, long kernel_size, void *module, 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 = dom->parms.virt_base + PFN_PHYS(dom->bootstack_pfn); +_boot_target = 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)); if ( dom->arch_hooks->setup_pgtables ) @@ -373,13 +375,13 @@ void kexec(void *kernel, long kernel_size, void *module, long module_size, char _boot_oldpdmfn = 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 = dom->pv_p2m[PHYS_PFN(dom->pgtables_seg.vstart - dom->parms.virt_base)]; +_boot_pdmfn = dom->pv_p2m[PHYS_PFN(dom->pgtables_seg.vstart - virt_base)]; DEBUG("boot pd mfn %lx\n", _boot_pdmfn); _boot_stack = _boot_target + PAGE_SIZE; DEBUG("boot stack %lx\n", _boot_stack); -_boot_start_info = dom->parms.virt_base + PFN_PHYS(dom->start_info_pfn); +_boot_start_info = virt_base + PFN_PHYS(dom->start_info_pfn); DEBUG("boot start info %lx\n", _boot_start_info); -_boot_start = dom->parms.virt_entry; +_boot_start = xc_dom_virt_entry(dom); DEBUG("boot start %lx\n", _boot_start); /* 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 -#include - #define XC_NUMA_NO_NODE (~0U) #define XCFLAGS_LIVE (1 << 0) @@ -109,7 +107,7 @@ struct xc_dom_image { uint32_t f_requested[XENFEAT_NR_SUBMAPS]; /* info from (elf) kernel image */ -struct elf_dom_parms parms; +struct elf_dom_parms *parms; char *guest_type; /* 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); static inline void *xc_dom_seg_to_ptr_pages(struct xc_dom_image *dom, struct xc_dom_seg *seg, @@ -411,24 +416,6 @@ stati