mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
Replace direct_remap_area_pages with direct_remap_pfn_range to help fix PAE domain building.
Signed-off-by: ian@xensource.com
This commit is contained in:
1 parent
93b3da0d9e
commit
f2f33db0f4
6 files changed
+29
-28
No files matched your search
@@ -22,13 +22,14 @@
|
||||
#define ISA_START_ADDRESS 0x0
|
||||
#define ISA_END_ADDRESS 0x100000
|
||||
|
||||
#if 0 /* not PAE safe */
|
||||
/* These hacky macros avoid phys->machine translations. */
|
||||
#define __direct_pte(x) ((pte_t) { (x) } )
|
||||
#define __direct_mk_pte(page_nr,pgprot) \
|
||||
__direct_pte(((page_nr) << PAGE_SHIFT) | pgprot_val(pgprot))
|
||||
#define direct_mk_pte_phys(physpage, pgprot) \
|
||||
__direct_mk_pte((physpage) >> PAGE_SHIFT, pgprot)
|
||||
|
||||
#endif
|
||||
|
||||
static int direct_remap_area_pte_fn(pte_t *pte,
|
||||
struct page *pte_page,
|
||||
@@ -37,16 +38,16 @@ static int direct_remap_area_pte_fn(pte_t *pte,
|
||||
{
|
||||
mmu_update_t **v = (mmu_update_t **)data;
|
||||
|
||||
(*v)->ptr = ((maddr_t)pfn_to_mfn(page_to_pfn(pte_page)) <<
|
||||
(*v)->ptr = ((u64)pfn_to_mfn(page_to_pfn(pte_page)) <<
|
||||
PAGE_SHIFT) | ((unsigned long)pte & ~PAGE_MASK);
|
||||
(*v)++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int direct_remap_area_pages(struct mm_struct *mm,
|
||||
int direct_remap_pfn_range(struct mm_struct *mm,
|
||||
unsigned long address,
|
||||
unsigned long machine_addr,
|
||||
unsigned long mfn,
|
||||
unsigned long size,
|
||||
pgprot_t prot,
|
||||
domid_t domid)
|
||||
@@ -77,9 +78,9 @@ int direct_remap_area_pages(struct mm_struct *mm,
|
||||
* Fill in the machine address: PTE ptr is done later by
|
||||
* __direct_remap_area_pages().
|
||||
*/
|
||||
v->val = pte_val_ma(pfn_pte_ma(machine_addr >> PAGE_SHIFT, prot));
|
||||
v->val = pte_val_ma(pfn_pte_ma(mfn, prot));
|
||||
|
||||
machine_addr += PAGE_SIZE;
|
||||
mfn++;
|
||||
address += PAGE_SIZE;
|
||||
v++;
|
||||
}
|
||||
@@ -97,8 +98,10 @@ int direct_remap_area_pages(struct mm_struct *mm,
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(direct_remap_area_pages);
|
||||
EXPORT_SYMBOL(direct_remap_pfn_range);
|
||||
|
||||
|
||||
/* FIXME: This is horribly broken on PAE */
|
||||
static int lookup_pte_fn(
|
||||
pte_t *pte, struct page *pte_page, unsigned long addr, void *data)
|
||||
{
|
||||
@@ -218,7 +221,7 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l
|
||||
#ifdef __x86_64__
|
||||
flags |= _PAGE_USER;
|
||||
#endif
|
||||
if (direct_remap_area_pages(&init_mm, (unsigned long) addr, phys_addr,
|
||||
if (direct_remap_pfn_range(&init_mm, (unsigned long) addr, phys_addr>>PAGE_SHIFT,
|
||||
size, __pgprot(flags), domid)) {
|
||||
vunmap((void __force *) addr);
|
||||
return NULL;
|
||||
|
||||
@@ -154,12 +154,12 @@ static int map_frontend_pages(netif_t *netif, unsigned long localaddr,
|
||||
pgprot_t prot = __pgprot(_KERNPG_TABLE);
|
||||
int err;
|
||||
|
||||
err = direct_remap_area_pages(&init_mm, localaddr,
|
||||
tx_ring_ref<<PAGE_SHIFT, PAGE_SIZE,
|
||||
err = direct_remap_pfn_range(&init_mm, localaddr,
|
||||
tx_ring_ref, PAGE_SIZE,
|
||||
prot, netif->domid);
|
||||
|
||||
err |= direct_remap_area_pages(&init_mm, localaddr + PAGE_SIZE,
|
||||
rx_ring_ref<<PAGE_SHIFT, PAGE_SIZE,
|
||||
err |= direct_remap_pfn_range(&init_mm, localaddr + PAGE_SIZE,
|
||||
rx_ring_ref, PAGE_SIZE,
|
||||
prot, netif->domid);
|
||||
|
||||
if (err)
|
||||
|
||||
@@ -116,9 +116,9 @@ static int privcmd_ioctl(struct inode *inode, struct file *file,
|
||||
if ( (msg[j].va + (msg[j].npages<<PAGE_SHIFT)) > vma->vm_end )
|
||||
return -EINVAL;
|
||||
|
||||
if ( (rc = direct_remap_area_pages(vma->vm_mm,
|
||||
if ( (rc = direct_remap_pfn_range(vma->vm_mm,
|
||||
msg[j].va&PAGE_MASK,
|
||||
msg[j].mfn<<PAGE_SHIFT,
|
||||
msg[j].mfn,
|
||||
msg[j].npages<<PAGE_SHIFT,
|
||||
vma->vm_page_prot,
|
||||
mmapcmd.dom)) < 0 )
|
||||
|
||||
@@ -161,8 +161,8 @@ void usbif_connect(usbif_be_connect_t *connect)
|
||||
}
|
||||
|
||||
prot = __pgprot(_KERNPG_TABLE);
|
||||
error = direct_remap_area_pages(&init_mm, VMALLOC_VMADDR(vma->addr),
|
||||
shmem_frame<<PAGE_SHIFT, PAGE_SIZE,
|
||||
error = direct_remap_pfn_range(&init_mm, VMALLOC_VMADDR(vma->addr),
|
||||
shmem_frame, PAGE_SIZE,
|
||||
prot, domid);
|
||||
if ( error != 0 )
|
||||
{
|
||||
|
||||
@@ -460,9 +460,9 @@ void make_pages_writable(void *va, unsigned int nr);
|
||||
#define kern_addr_valid(addr) (1)
|
||||
#endif /* !CONFIG_DISCONTIGMEM */
|
||||
|
||||
int direct_remap_area_pages(struct mm_struct *mm,
|
||||
int direct_remap_pfn_range(struct mm_struct *mm,
|
||||
unsigned long address,
|
||||
unsigned long machine_addr,
|
||||
unsigned long mfn,
|
||||
unsigned long size,
|
||||
pgprot_t prot,
|
||||
domid_t domid);
|
||||
@@ -474,10 +474,10 @@ int touch_pte_range(struct mm_struct *mm,
|
||||
unsigned long size);
|
||||
|
||||
#define io_remap_page_range(vma,from,phys,size,prot) \
|
||||
direct_remap_area_pages(vma->vm_mm,from,phys,size,prot,DOMID_IO)
|
||||
direct_remap_pfn_range(vma->vm_mm,from,phys>>PAGE_SHIFT,size,prot,DOMID_IO)
|
||||
|
||||
#define io_remap_pfn_range(vma,from,pfn,size,prot) \
|
||||
direct_remap_area_pages(vma->vm_mm,from,pfn<<PAGE_SHIFT,size,prot,DOMID_IO)
|
||||
direct_remap_pfn_range(vma->vm_mm,from,pfn,size,prot,DOMID_IO)
|
||||
|
||||
#define MK_IOSPACE_PFN(space, pfn) (pfn)
|
||||
#define GET_IOSPACE(pfn) 0
|
||||
|
||||
@@ -526,28 +526,26 @@ extern int kern_addr_valid(unsigned long addr);
|
||||
|
||||
#define DOMID_LOCAL (0xFFFFU)
|
||||
|
||||
int direct_remap_area_pages(struct mm_struct *mm,
|
||||
int direct_remap_pfn_range(struct mm_struct *mm,
|
||||
unsigned long address,
|
||||
unsigned long machine_addr,
|
||||
unsigned long mfn,
|
||||
unsigned long size,
|
||||
pgprot_t prot,
|
||||
domid_t domid);
|
||||
int __direct_remap_area_pages(struct mm_struct *mm,
|
||||
unsigned long address,
|
||||
unsigned long size,
|
||||
mmu_update_t *v);
|
||||
|
||||
int create_lookup_pte_addr(struct mm_struct *mm,
|
||||
unsigned long address,
|
||||
unsigned long *ptep);
|
||||
|
||||
int touch_pte_range(struct mm_struct *mm,
|
||||
unsigned long address,
|
||||
unsigned long size);
|
||||
|
||||
#define io_remap_page_range(vma, vaddr, paddr, size, prot) \
|
||||
direct_remap_area_pages((vma)->vm_mm,vaddr,paddr,size,prot,DOMID_IO)
|
||||
direct_remap_pfn_range((vma)->vm_mm,vaddr,paddr>>PAGE_SHIFT,size,prot,DOMID_IO)
|
||||
|
||||
#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
|
||||
direct_remap_area_pages((vma)->vm_mm,vaddr,(pfn)<<PAGE_SHIFT,size,prot,DOMID_IO)
|
||||
direct_remap_pfn_range((vma)->vm_mm,vaddr,pfn,size,prot,DOMID_IO)
|
||||
|
||||
#define MK_IOSPACE_PFN(space, pfn) (pfn)
|
||||
#define GET_IOSPACE(pfn) 0
|
||||
|
||||