From b1de69090eecc617139a46b1f8bd7ce8bf73d2e5 Mon Sep 17 00:00:00 2001 From: Andrew Cooper Date: Fri, 20 Mar 2015 22:28:24 +0100 Subject: [PATCH] Basic memory management for PV guests, sufficient to obtain the console ring virtual address Signed-off-by: Andrew Cooper --- include/arch/x86/mm.h | 44 +++++++++++++++++++++++++++++++ include/xen/arch-x86/xen-x86_32.h | 16 +++++++++++ include/xen/arch-x86/xen-x86_64.h | 16 +++++++++++ include/xen/arch-x86/xen.h | 8 ++++++ 4 files changed, 84 insertions(+) create mode 100644 include/arch/x86/mm.h create mode 100644 include/xen/arch-x86/xen-x86_32.h create mode 100644 include/xen/arch-x86/xen-x86_64.h diff --git a/include/arch/x86/mm.h b/include/arch/x86/mm.h new file mode 100644 index 0000000..f5a61d9 --- /dev/null +++ b/include/arch/x86/mm.h @@ -0,0 +1,44 @@ +#ifndef XTF_X86_MM_H +#define XTF_X86_MM_H + +#include + +#include +#include + +#include + +/* + * XTF memory layout. + * + * Wherever possible, identity layout for simplicity. + * + * PV guests: VIRT_OFFSET is 0 which causes all linked virtual addresses to be + * contiguous in the pagetables created by the domain builder. Therefore, + * virt == pfn << PAGE_SHIFT for any pfn constructed by the domain builder. + */ + +#if defined(CONFIG_ENV_pv) + +#define m2p ((unsigned long *)MACH2PHYS_VIRT_START) + +static inline void *mfn_to_virt(unsigned long mfn) +{ + return (void *)(m2p[mfn] << PAGE_SHIFT); +} + +#undef m2p + +#endif /* CONFIG_ENV_pv */ + +#endif /* XTF_X86_MM_H */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/xen/arch-x86/xen-x86_32.h b/include/xen/arch-x86/xen-x86_32.h new file mode 100644 index 0000000..175b0a8 --- /dev/null +++ b/include/xen/arch-x86/xen-x86_32.h @@ -0,0 +1,16 @@ +#ifndef XEN_PUBLIC_ARCH_X86_XEN_X86_32_H +#define XEN_PUBLIC_ARCH_X86_XEN_X86_32_H + +#define MACH2PHYS_VIRT_START 0xF5800000UL + +#endif /* XEN_PUBLIC_ARCH_X86_XEN_X86_32_H */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/xen/arch-x86/xen-x86_64.h b/include/xen/arch-x86/xen-x86_64.h new file mode 100644 index 0000000..c8838b2 --- /dev/null +++ b/include/xen/arch-x86/xen-x86_64.h @@ -0,0 +1,16 @@ +#ifndef XEN_PUBLIC_ARCH_X86_XEN_X86_64_H +#define XEN_PUBLIC_ARCH_X86_XEN_X86_64_H + +#define MACH2PHYS_VIRT_START 0xFFFF800000000000UL + +#endif /* XEN_PUBLIC_ARCH_X86_XEN_X86_64_H */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/xen/arch-x86/xen.h b/include/xen/arch-x86/xen.h index da19b16..b9e97f8 100644 --- a/include/xen/arch-x86/xen.h +++ b/include/xen/arch-x86/xen.h @@ -5,6 +5,14 @@ #ifndef XEN_PUBLIC_ARCH_X86_XEN_H #define XEN_PUBLIC_ARCH_X86_XEN_H +#if defined (__i386__) +# include "xen-x86_32.h" +#elif defined (__x86_64__) +# include "xen-x86_64.h" +#else +# error Bad architecture +#endif + #ifndef __ASSEMBLY__ typedef unsigned long xen_pfn_t; #endif -- 2.39.5