|
@@ -5,6 +5,7 @@
|
|
|
#include <linux/percpu.h>
|
|
|
#include <linux/notifier.h>
|
|
|
#include <linux/efi.h>
|
|
|
+#include <xen/features.h>
|
|
|
#include <asm/xen/interface.h>
|
|
|
#include <xen/interface/vcpu.h>
|
|
|
|
|
@@ -47,6 +48,10 @@ int xen_create_contiguous_region(phys_addr_t pstart, unsigned int order,
|
|
|
dma_addr_t *dma_handle);
|
|
|
|
|
|
void xen_destroy_contiguous_region(phys_addr_t pstart, unsigned int order);
|
|
|
+
|
|
|
+int xen_remap_pfn(struct vm_area_struct *vma, unsigned long addr,
|
|
|
+ xen_pfn_t *pfn, int nr, int *err_ptr, pgprot_t prot,
|
|
|
+ unsigned int domid, bool no_translate, struct page **pages);
|
|
|
#else
|
|
|
static inline int xen_create_contiguous_region(phys_addr_t pstart,
|
|
|
unsigned int order,
|
|
@@ -58,10 +63,50 @@ static inline int xen_create_contiguous_region(phys_addr_t pstart,
|
|
|
|
|
|
static inline void xen_destroy_contiguous_region(phys_addr_t pstart,
|
|
|
unsigned int order) { }
|
|
|
+
|
|
|
+static inline int xen_remap_pfn(struct vm_area_struct *vma, unsigned long addr,
|
|
|
+ xen_pfn_t *pfn, int nr, int *err_ptr,
|
|
|
+ pgprot_t prot, unsigned int domid,
|
|
|
+ bool no_translate, struct page **pages)
|
|
|
+{
|
|
|
+ BUG();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
#endif
|
|
|
|
|
|
struct vm_area_struct;
|
|
|
|
|
|
+#ifdef CONFIG_XEN_AUTO_XLATE
|
|
|
+int xen_xlate_remap_gfn_array(struct vm_area_struct *vma,
|
|
|
+ unsigned long addr,
|
|
|
+ xen_pfn_t *gfn, int nr,
|
|
|
+ int *err_ptr, pgprot_t prot,
|
|
|
+ unsigned int domid,
|
|
|
+ struct page **pages);
|
|
|
+int xen_xlate_unmap_gfn_range(struct vm_area_struct *vma,
|
|
|
+ int nr, struct page **pages);
|
|
|
+#else
|
|
|
+/*
|
|
|
+ * These two functions are called from arch/x86/xen/mmu.c and so stubs
|
|
|
+ * are needed for a configuration not specifying CONFIG_XEN_AUTO_XLATE.
|
|
|
+ */
|
|
|
+static inline int xen_xlate_remap_gfn_array(struct vm_area_struct *vma,
|
|
|
+ unsigned long addr,
|
|
|
+ xen_pfn_t *gfn, int nr,
|
|
|
+ int *err_ptr, pgprot_t prot,
|
|
|
+ unsigned int domid,
|
|
|
+ struct page **pages)
|
|
|
+{
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+}
|
|
|
+
|
|
|
+static inline int xen_xlate_unmap_gfn_range(struct vm_area_struct *vma,
|
|
|
+ int nr, struct page **pages)
|
|
|
+{
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
/*
|
|
|
* xen_remap_domain_gfn_array() - map an array of foreign frames by gfn
|
|
|
* @vma: VMA to map the pages into
|
|
@@ -79,12 +124,25 @@ struct vm_area_struct;
|
|
|
* Returns the number of successfully mapped frames, or a -ve error
|
|
|
* code.
|
|
|
*/
|
|
|
-int xen_remap_domain_gfn_array(struct vm_area_struct *vma,
|
|
|
- unsigned long addr,
|
|
|
- xen_pfn_t *gfn, int nr,
|
|
|
- int *err_ptr, pgprot_t prot,
|
|
|
- unsigned domid,
|
|
|
- struct page **pages);
|
|
|
+static inline int xen_remap_domain_gfn_array(struct vm_area_struct *vma,
|
|
|
+ unsigned long addr,
|
|
|
+ xen_pfn_t *gfn, int nr,
|
|
|
+ int *err_ptr, pgprot_t prot,
|
|
|
+ unsigned int domid,
|
|
|
+ struct page **pages)
|
|
|
+{
|
|
|
+ if (xen_feature(XENFEAT_auto_translated_physmap))
|
|
|
+ return xen_xlate_remap_gfn_array(vma, addr, gfn, nr, err_ptr,
|
|
|
+ prot, domid, pages);
|
|
|
+
|
|
|
+ /* We BUG_ON because it's a programmer error to pass a NULL err_ptr,
|
|
|
+ * and the consequences later is quite hard to detect what the actual
|
|
|
+ * cause of "wrong memory was mapped in".
|
|
|
+ */
|
|
|
+ BUG_ON(err_ptr == NULL);
|
|
|
+ return xen_remap_pfn(vma, addr, gfn, nr, err_ptr, prot, domid,
|
|
|
+ false, pages);
|
|
|
+}
|
|
|
|
|
|
/*
|
|
|
* xen_remap_domain_mfn_array() - map an array of foreign frames by mfn
|
|
@@ -103,10 +161,18 @@ int xen_remap_domain_gfn_array(struct vm_area_struct *vma,
|
|
|
* Returns the number of successfully mapped frames, or a -ve error
|
|
|
* code.
|
|
|
*/
|
|
|
-int xen_remap_domain_mfn_array(struct vm_area_struct *vma,
|
|
|
- unsigned long addr, xen_pfn_t *mfn, int nr,
|
|
|
- int *err_ptr, pgprot_t prot,
|
|
|
- unsigned int domid, struct page **pages);
|
|
|
+static inline int xen_remap_domain_mfn_array(struct vm_area_struct *vma,
|
|
|
+ unsigned long addr, xen_pfn_t *mfn,
|
|
|
+ int nr, int *err_ptr,
|
|
|
+ pgprot_t prot, unsigned int domid,
|
|
|
+ struct page **pages)
|
|
|
+{
|
|
|
+ if (xen_feature(XENFEAT_auto_translated_physmap))
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
+ return xen_remap_pfn(vma, addr, mfn, nr, err_ptr, prot, domid,
|
|
|
+ true, pages);
|
|
|
+}
|
|
|
|
|
|
/* xen_remap_domain_gfn_range() - map a range of foreign frames
|
|
|
* @vma: VMA to map the pages into
|
|
@@ -120,44 +186,21 @@ int xen_remap_domain_mfn_array(struct vm_area_struct *vma,
|
|
|
* Returns the number of successfully mapped frames, or a -ve error
|
|
|
* code.
|
|
|
*/
|
|
|
-int xen_remap_domain_gfn_range(struct vm_area_struct *vma,
|
|
|
- unsigned long addr,
|
|
|
- xen_pfn_t gfn, int nr,
|
|
|
- pgprot_t prot, unsigned domid,
|
|
|
- struct page **pages);
|
|
|
-int xen_unmap_domain_gfn_range(struct vm_area_struct *vma,
|
|
|
- int numpgs, struct page **pages);
|
|
|
-
|
|
|
-#ifdef CONFIG_XEN_AUTO_XLATE
|
|
|
-int xen_xlate_remap_gfn_array(struct vm_area_struct *vma,
|
|
|
- unsigned long addr,
|
|
|
- xen_pfn_t *gfn, int nr,
|
|
|
- int *err_ptr, pgprot_t prot,
|
|
|
- unsigned domid,
|
|
|
- struct page **pages);
|
|
|
-int xen_xlate_unmap_gfn_range(struct vm_area_struct *vma,
|
|
|
- int nr, struct page **pages);
|
|
|
-#else
|
|
|
-/*
|
|
|
- * These two functions are called from arch/x86/xen/mmu.c and so stubs
|
|
|
- * are needed for a configuration not specifying CONFIG_XEN_AUTO_XLATE.
|
|
|
- */
|
|
|
-static inline int xen_xlate_remap_gfn_array(struct vm_area_struct *vma,
|
|
|
- unsigned long addr,
|
|
|
- xen_pfn_t *gfn, int nr,
|
|
|
- int *err_ptr, pgprot_t prot,
|
|
|
- unsigned int domid,
|
|
|
- struct page **pages)
|
|
|
+static inline int xen_remap_domain_gfn_range(struct vm_area_struct *vma,
|
|
|
+ unsigned long addr,
|
|
|
+ xen_pfn_t gfn, int nr,
|
|
|
+ pgprot_t prot, unsigned int domid,
|
|
|
+ struct page **pages)
|
|
|
{
|
|
|
- return -EOPNOTSUPP;
|
|
|
-}
|
|
|
+ if (xen_feature(XENFEAT_auto_translated_physmap))
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
|
|
-static inline int xen_xlate_unmap_gfn_range(struct vm_area_struct *vma,
|
|
|
- int nr, struct page **pages)
|
|
|
-{
|
|
|
- return -EOPNOTSUPP;
|
|
|
+ return xen_remap_pfn(vma, addr, &gfn, nr, NULL, prot, domid, false,
|
|
|
+ pages);
|
|
|
}
|
|
|
-#endif
|
|
|
+
|
|
|
+int xen_unmap_domain_gfn_range(struct vm_area_struct *vma,
|
|
|
+ int numpgs, struct page **pages);
|
|
|
|
|
|
int xen_xlate_map_ballooned_pages(xen_pfn_t **pfns, void **vaddr,
|
|
|
unsigned long nr_grant_frames);
|