|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH] plat/xen/x86: Create and initialize p2m table
Thanks, Radu!
Reviewed-by: Costin Lupu <costin.lupu@xxxxxxxxx>
On 10/30/19 5:06 PM, radunicolau102@xxxxxxxxx wrote:
> From: Radu Nicolau <radunicolau102@xxxxxxxxx>
>
> Build p2m table needed for direct paging on paravirtualized Xen
>
> Code adapted from Mini-OS.
>
> Signed-off-by: Radu Nicolau <radunicolau102@xxxxxxxxx>
> ---
> plat/xen/Config.uk | 8 +++++
> plat/xen/include/xen-arm/mm.h | 2 ++
> plat/xen/include/xen-x86/mm_pv.h | 11 +++++--
> plat/xen/memory.c | 8 +++++
> plat/xen/x86/mm.c | 71
> ++++++++++++++++++++++++++++++++++++++++
> 5 files changed, 97 insertions(+), 3 deletions(-)
>
> diff --git a/plat/xen/Config.uk b/plat/xen/Config.uk
> index 6f6c214..18896b9 100644
> --- a/plat/xen/Config.uk
> +++ b/plat/xen/Config.uk
> @@ -2,6 +2,7 @@ menuconfig PLAT_XEN
> bool "Xen guest image"
> default n
> depends on (ARCH_X86_32 || ARCH_X86_64 || ARCH_ARM_32)
> + imply XEN_PV_BUILD_P2M
> select LIBUKDEBUG
> select LIBNOLIBC if !HAVE_LIBC
> select LIBUKTIME if !HAVE_LIBC && ARCH_X86_64
> @@ -48,6 +49,13 @@ config XEN_DEBUG_EMG_CONSOLE
> Send debug messages to the emergency console.
> endmenu
>
> +config XEN_PV_BUILD_P2M
> + bool "Create p2m table"
> + default n
> + help
> + Create and initialize physical to machine (p2m) table on a PV
> + xen host
> +
> config XEN_GNTTAB
> bool "Grant table support"
> default y
> diff --git a/plat/xen/include/xen-arm/mm.h b/plat/xen/include/xen-arm/mm.h
> index 0f5c8f5..4de76f4 100644
> --- a/plat/xen/include/xen-arm/mm.h
> +++ b/plat/xen/include/xen-arm/mm.h
> @@ -56,4 +56,6 @@ extern uint32_t _libxenplat_paddr_offset;
>
> #define virtual_to_mfn(_virt) virt_to_mfn(_virt)
>
> +#define arch_mm_init(a)
> +
> #endif
> diff --git a/plat/xen/include/xen-x86/mm_pv.h
> b/plat/xen/include/xen-x86/mm_pv.h
> index f78e62f..dc2a02e 100644
> --- a/plat/xen/include/xen-x86/mm_pv.h
> +++ b/plat/xen/include/xen-x86/mm_pv.h
> @@ -34,6 +34,7 @@
> #define pfn_to_mfn(_pfn) (phys_to_machine_mapping[(_pfn)])
>
> /* for P2M */
> +#ifdef CONFIG_XEN_PV_BUILD_P2M
> #ifdef __x86_64__
> #define P2M_SHIFT 9
> #else
> @@ -49,13 +50,17 @@
> #define L3_P2M_IDX(pfn) (((pfn) >> L2_P2M_SHIFT) & P2M_MASK)
> #define INVALID_P2M_ENTRY (~0UL)
>
> -void p2m_chk_pfn(unsigned long pfn);
> -
> static inline unsigned long p2m_pages(unsigned long pages)
> {
> return (pages + P2M_ENTRIES - 1) >> L1_P2M_SHIFT;
> }
>
> -void arch_init_p2m(unsigned long max_pfn_p);
> +void arch_mm_init(struct uk_alloc *a);
> +
> +#ifdef CONFIG_MIGRATION
> +void arch_mm_pre_suspend(void);
> +void arch_mm_post_suspend(int canceled);
> +#endif /* CONFIG_MIGRATION */
> +#endif /* CONFIG_XEN_PV_BUILD_P2M */
>
> #endif /* _MM_PV_H */
> diff --git a/plat/xen/memory.c b/plat/xen/memory.c
> index 8f170dd..709c04c 100644
> --- a/plat/xen/memory.c
> +++ b/plat/xen/memory.c
> @@ -39,8 +39,10 @@
> #include <common/gnttab.h>
> #if (defined __X86_32__) || (defined __X86_64__)
> #include <xen-x86/setup.h>
> +#include <xen-x86/mm_pv.h>
> #elif (defined __ARM_32__) || (defined __ARM_64__)
> #include <xen-arm/setup.h>
> +#include <xen-arm/mm.h>
> #endif
>
> #include <uk/assert.h>
> @@ -141,8 +143,14 @@ int ukplat_memregion_get(int i, struct
> ukplat_memregion_desc *m)
> return 0;
> }
>
> +void mm_init(void)
> +{
> + arch_mm_init(ukplat_memallocator_get());
> +}
> +
> int _ukplat_mem_mappings_init(void)
> {
> + mm_init();
> #ifdef CONFIG_XEN_GNTTAB
> gnttab_init();
> #endif
> diff --git a/plat/xen/x86/mm.c b/plat/xen/x86/mm.c
> index 2f23855..dc9cc75 100644
> --- a/plat/xen/x86/mm.c
> +++ b/plat/xen/x86/mm.c
> @@ -47,6 +47,7 @@
> #include <uk/assert.h>
>
> #ifdef CONFIG_PARAVIRT
> +#include <xen-x86/mm_pv.h>
> unsigned long *phys_to_machine_mapping;
> #endif
> unsigned long mfn_zero;
> @@ -684,6 +685,76 @@ void _init_mem_clear_bootstrap(void)
> #endif
> }
>
> +#ifdef CONFIG_XEN_PV_BUILD_P2M
> +static unsigned long max_pfn;
> +static unsigned long *l3_list;
> +static unsigned long *l2_list_pages[P2M_ENTRIES];
> +
> +void _arch_init_p2m(struct uk_alloc *a)
> +{
> + unsigned long pfn;
> + unsigned long *l2_list = NULL;
> +
> + max_pfn = HYPERVISOR_start_info->nr_pages;
> +
> + if (((max_pfn - 1) >> L3_P2M_SHIFT) > 0)
> + UK_CRASH("Error: Too many pfns.\n");
> +
> + l3_list = uk_malloc_page(a);
> + for (pfn = 0; pfn < max_pfn; pfn += P2M_ENTRIES) {
> + if (!(pfn % (P2M_ENTRIES * P2M_ENTRIES))) {
> + l2_list = uk_malloc_page(a);
> + l3_list[L3_P2M_IDX(pfn)] = virt_to_mfn(l2_list);
> + l2_list_pages[L3_P2M_IDX(pfn)] = l2_list;
> + }
> +
> + l2_list[L2_P2M_IDX(pfn)] =
> + virt_to_mfn(phys_to_machine_mapping + pfn);
> + }
> + HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
> + virt_to_mfn(l3_list);
> + HYPERVISOR_shared_info->arch.max_pfn = max_pfn;
> +}
> +
> +void _arch_rebuild_p2m(void)
> +{
> + unsigned long pfn;
> + unsigned long *l2_list = NULL;
> +
> + for (pfn = 0; pfn < max_pfn; pfn += P2M_ENTRIES) {
> + if (!(pfn % (P2M_ENTRIES * P2M_ENTRIES))) {
> + l2_list = l2_list_pages[L3_P2M_IDX(pfn)];
> + l3_list[L3_P2M_IDX(pfn)] = virt_to_mfn(l2_list);
> + }
> +
> + l2_list[L2_P2M_IDX(pfn)] =
> + virt_to_mfn(phys_to_machine_mapping + pfn);
> + }
> + HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
> + virt_to_mfn(l3_list);
> + HYPERVISOR_shared_info->arch.max_pfn = max_pfn;
> +}
> +
> +#ifdef CONFIG_MIGRATION
> +void arch_mm_pre_suspend(void)
> +{
> +
> +}
> +void arch_mm_post_suspend(int canceled)
> +{
> + if (!canceled)
> + arch_rebuild_p2m();
> +}
> +#endif
> +#endif /* CONFIG_XEN_PV_BUILD_P2M */
> +
> +void arch_mm_init(struct uk_alloc *a)
> +{
> +#ifdef CONFIG_XEN_PV_BUILD_P2M
> + _arch_init_p2m(a);
> +#endif
> +}
> +
> void _init_mem_prepare(unsigned long *start_pfn, unsigned long *max_pfn)
> {
> #ifdef CONFIG_PARAVIRT
>
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |