[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 30/32] libxc/xen: introduce HVM_PARAM_MODLIST_PFN
This HVM parameter is used to pass a list of loaded modules to the guest. Right now the number of loaded modules is limited to 1 by the current implementation, but this interface allows passing more than one module. Signed-off-by: Roger Pau Monnà <roger.pau@xxxxxxxxxx> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> Cc: Ian Campbell <ian.campbell@xxxxxxxxxx> Cc: Wei Liu <wei.liu2@xxxxxxxxxx> Cc: Keir Fraser <keir@xxxxxxx> Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- tools/libxc/xc_dom_x86.c | 24 +++++++++++++++++++++++- xen/arch/x86/hvm/hvm.c | 1 + xen/include/public/hvm/params.h | 23 ++++++++++++++++++++++- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c index 74c3819..71b353e 100644 --- a/tools/libxc/xc_dom_x86.c +++ b/tools/libxc/xc_dom_x86.c @@ -58,7 +58,8 @@ #define SPECIALPAGE_IDENT_PT 6 #define SPECIALPAGE_CONSOLE 7 #define SPECIALPAGE_CMDLINE 8 -#define NR_SPECIAL_PAGES 9 +#define SPECIALPAGE_MODLIST 9 +#define NR_SPECIAL_PAGES 10 #define LAST_SPECIAL_PFN 0xff000u #define NR_IOREQ_SERVER_PAGES 8 @@ -533,6 +534,7 @@ static int alloc_magic_pages_hvm(struct xc_dom_image *dom) xen_pfn_t ioreq_server_array[NR_IOREQ_SERVER_PAGES]; xc_interface *xch = dom->xch; char *cmdline; + uint64_t *modlist; if ( dom->emulation ) { @@ -621,6 +623,26 @@ static int alloc_magic_pages_hvm(struct xc_dom_image *dom) NR_IOREQ_SERVER_PAGES); } + if ( dom->ramdisk_blob ) + { + modlist = xc_map_foreign_range( + xch, domid, PAGE_SIZE, PROT_READ | PROT_WRITE, + special_pfn(SPECIALPAGE_MODLIST, dom)); + if ( modlist == NULL ) { + DOMPRINTF("Unable to map module list page"); + goto error_out; + } + + /* This is currently limited to only one module. */ + modlist[0] = dom->ramdisk_seg.vstart - dom->parms.virt_base; + modlist[1] = dom->ramdisk_seg.vend - dom->ramdisk_seg.vstart; + modlist[2] = 0; + modlist[3] = 0; + munmap(modlist, PAGE_SIZE); + xc_hvm_param_set(xch, domid, HVM_PARAM_MODLIST_PFN, + special_pfn(SPECIALPAGE_MODLIST, dom)); + } + /* * Identity-map page table is required for running with CR0.PG=0 when * using Intel EPT. Create a 32-bit non-PAE page directory of superpages. diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 2b190e9..95f12c0 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -5919,6 +5919,7 @@ static int hvm_allow_get_param(struct domain *d, case HVM_PARAM_CONSOLE_EVTCHN: case HVM_PARAM_CMDLINE_PFN: case HVM_PARAM_FIRST_FREE_PFN: + case HVM_PARAM_MODLIST_PFN: break; /* * The following parameters must not be read by the guest diff --git a/xen/include/public/hvm/params.h b/xen/include/public/hvm/params.h index 47e38a8..86cc15b 100644 --- a/xen/include/public/hvm/params.h +++ b/xen/include/public/hvm/params.h @@ -193,6 +193,27 @@ /* First free PFN after the special pages. */ #define HVM_PARAM_FIRST_FREE_PFN 36 -#define HVM_NR_PARAMS 37 +/* + * List of modules passed to the kernel. + * + * The PFN returned by this HVM_PARAM points to a page that contains an + * array of unsigned 64bit integers encoded in little endian. + * + * The first integer contains the address where the module has been loaded, + * while the second contains the size of the module in bytes. The last element + * in the array is a module with address 0 and length 0: + * + * module[0] = <address of 1st module> + * module[1] = <size of 1st module> + * [...] + * module[N/2] = <address of module N> + * module[N/2+1] = <size of module N> + * [...] + * module[M] = 0 + * module[M+1] = 0 + */ +#define HVM_PARAM_MODLIST_PFN 37 + +#define HVM_NR_PARAMS 38 #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */ -- 1.9.5 (Apple Git-50.3) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |