Re: [PATCH v2 3/3] tools/lixenguest: hide struct elf_dom_parms layout from users

2020-10-01 Thread Bertrand Marquis
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

2020-09-24 Thread Juergen Gross
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