Skip to content

Commit

Permalink
xen: avoid link error on ARM
Browse files Browse the repository at this point in the history
Building the privcmd code as a loadable module on ARM, we get
a link error due to the private cache management functions:

ERROR: "__sync_icache_dcache" [drivers/xen/xen-privcmd.ko] undefined!

Move the code into a new that is always built in when Xen is enabled,
as suggested by Juergen Gross and Boris Ostrovsky.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
Signed-off-by: Juergen Gross <jgross@suse.com>
  • Loading branch information
Arnd Bergmann authored and Juergen Gross committed Jul 31, 2019
1 parent 8d1502f commit a78d14a
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 30 deletions.
35 changes: 5 additions & 30 deletions drivers/xen/privcmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -724,25 +724,6 @@ static long privcmd_ioctl_restrict(struct file *file, void __user *udata)
return 0;
}

struct remap_pfn {
struct mm_struct *mm;
struct page **pages;
pgprot_t prot;
unsigned long i;
};

static int remap_pfn_fn(pte_t *ptep, unsigned long addr, void *data)
{
struct remap_pfn *r = data;
struct page *page = r->pages[r->i];
pte_t pte = pte_mkspecial(pfn_pte(page_to_pfn(page), r->prot));

set_pte_at(r->mm, addr, ptep, pte);
r->i++;

return 0;
}

static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata)
{
struct privcmd_data *data = file->private_data;
Expand Down Expand Up @@ -774,7 +755,8 @@ static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata)
goto out;
}

if (xen_feature(XENFEAT_auto_translated_physmap)) {
if (IS_ENABLED(CONFIG_XEN_AUTO_XLATE) &&
xen_feature(XENFEAT_auto_translated_physmap)) {
unsigned int nr = DIV_ROUND_UP(kdata.num, XEN_PFN_PER_PAGE);
struct page **pages;
unsigned int i;
Expand Down Expand Up @@ -808,16 +790,9 @@ static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata)
if (rc)
goto out;

if (xen_feature(XENFEAT_auto_translated_physmap)) {
struct remap_pfn r = {
.mm = vma->vm_mm,
.pages = vma->vm_private_data,
.prot = vma->vm_page_prot,
};

rc = apply_to_page_range(r.mm, kdata.addr,
kdata.num << PAGE_SHIFT,
remap_pfn_fn, &r);
if (IS_ENABLED(CONFIG_XEN_AUTO_XLATE) &&
xen_feature(XENFEAT_auto_translated_physmap)) {
rc = xen_remap_vma_range(vma, kdata.addr, kdata.num << PAGE_SHIFT);
} else {
unsigned int domid =
(xdata.flags & XENMEM_rsrc_acq_caller_owned) ?
Expand Down
32 changes: 32 additions & 0 deletions drivers/xen/xlate_mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -262,3 +262,35 @@ int __init xen_xlate_map_ballooned_pages(xen_pfn_t **gfns, void **virt,
return 0;
}
EXPORT_SYMBOL_GPL(xen_xlate_map_ballooned_pages);

struct remap_pfn {
struct mm_struct *mm;
struct page **pages;
pgprot_t prot;
unsigned long i;
};

static int remap_pfn_fn(pte_t *ptep, unsigned long addr, void *data)
{
struct remap_pfn *r = data;
struct page *page = r->pages[r->i];
pte_t pte = pte_mkspecial(pfn_pte(page_to_pfn(page), r->prot));

set_pte_at(r->mm, addr, ptep, pte);
r->i++;

return 0;
}

/* Used by the privcmd module, but has to be built-in on ARM */
int xen_remap_vma_range(struct vm_area_struct *vma, unsigned long addr, unsigned long len)
{
struct remap_pfn r = {
.mm = vma->vm_mm,
.pages = vma->vm_private_data,
.prot = vma->vm_page_prot,
};

return apply_to_page_range(vma->vm_mm, addr, len, remap_pfn_fn, &r);
}
EXPORT_SYMBOL_GPL(xen_remap_vma_range);
3 changes: 3 additions & 0 deletions include/xen/xen-ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,9 @@ static inline int xen_xlate_unmap_gfn_range(struct vm_area_struct *vma,
}
#endif

int xen_remap_vma_range(struct vm_area_struct *vma, unsigned long addr,
unsigned long len);

/*
* xen_remap_domain_gfn_array() - map an array of foreign frames by gfn
* @vma: VMA to map the pages into
Expand Down

0 comments on commit a78d14a

Please sign in to comment.