Update MIPS to use the 4-level pagetable code thereby getting rid of
the compacrapability headers. Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
@ -221,12 +221,14 @@ static inline unsigned long get_phys_page (unsigned long addr,
|
||||
struct mm_struct *mm)
|
||||
{
|
||||
pgd_t *pgd;
|
||||
pud_t *pud;
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
unsigned long physpage;
|
||||
|
||||
pgd = pgd_offset(mm, addr);
|
||||
pmd = pmd_offset(pgd, addr);
|
||||
pud = pud_offset(pgd, addr);
|
||||
pmd = pmd_offset(pud, addr);
|
||||
pte = pte_offset(pmd, addr);
|
||||
|
||||
if ((physpage = pte_val(*pte)) & _PAGE_VALID)
|
||||
|
@ -372,12 +372,14 @@ static inline void local_r4k_flush_cache_page(void *args)
|
||||
int exec = vma->vm_flags & VM_EXEC;
|
||||
struct mm_struct *mm = vma->vm_mm;
|
||||
pgd_t *pgdp;
|
||||
pud_t *pudp;
|
||||
pmd_t *pmdp;
|
||||
pte_t *ptep;
|
||||
|
||||
page &= PAGE_MASK;
|
||||
pgdp = pgd_offset(mm, page);
|
||||
pmdp = pmd_offset(pgdp, page);
|
||||
pudp = pud_offset(pgdp, page);
|
||||
pmdp = pmd_offset(pudp, page);
|
||||
ptep = pte_offset(pmdp, page);
|
||||
|
||||
/*
|
||||
|
@ -183,6 +183,7 @@ static void tx39_flush_cache_page(struct vm_area_struct *vma, unsigned long page
|
||||
int exec = vma->vm_flags & VM_EXEC;
|
||||
struct mm_struct *mm = vma->vm_mm;
|
||||
pgd_t *pgdp;
|
||||
pud_t *pudp;
|
||||
pmd_t *pmdp;
|
||||
pte_t *ptep;
|
||||
|
||||
@ -195,7 +196,8 @@ static void tx39_flush_cache_page(struct vm_area_struct *vma, unsigned long page
|
||||
|
||||
page &= PAGE_MASK;
|
||||
pgdp = pgd_offset(mm, page);
|
||||
pmdp = pmd_offset(pgdp, page);
|
||||
pudp = pud_offset(pgdp, page);
|
||||
pmdp = pmd_offset(pudp, page);
|
||||
ptep = pte_offset(pmdp, page);
|
||||
|
||||
/*
|
||||
|
@ -212,6 +212,7 @@ vmalloc_fault:
|
||||
*/
|
||||
int offset = __pgd_offset(address);
|
||||
pgd_t *pgd, *pgd_k;
|
||||
pud_t *pud, *pud_k;
|
||||
pmd_t *pmd, *pmd_k;
|
||||
pte_t *pte_k;
|
||||
|
||||
@ -222,8 +223,13 @@ vmalloc_fault:
|
||||
goto no_context;
|
||||
set_pgd(pgd, *pgd_k);
|
||||
|
||||
pmd = pmd_offset(pgd, address);
|
||||
pmd_k = pmd_offset(pgd_k, address);
|
||||
pud = pud_offset(pgd, address);
|
||||
pud_k = pud_offset(pgd_k, address);
|
||||
if (!pud_present(*pud_k))
|
||||
goto no_context;
|
||||
|
||||
pmd = pmd_offset(pud, address);
|
||||
pmd_k = pmd_offset(pud_k, address);
|
||||
if (!pmd_present(*pmd_k))
|
||||
goto no_context;
|
||||
set_pmd(pmd, *pmd_k);
|
||||
|
@ -83,7 +83,7 @@ pte_t *kmap_pte;
|
||||
pgprot_t kmap_prot;
|
||||
|
||||
#define kmap_get_fixmap_pte(vaddr) \
|
||||
pte_offset_kernel(pmd_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr))
|
||||
pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)), (vaddr))
|
||||
|
||||
static void __init kmap_init(void)
|
||||
{
|
||||
@ -101,26 +101,32 @@ void __init fixrange_init(unsigned long start, unsigned long end,
|
||||
pgd_t *pgd_base)
|
||||
{
|
||||
pgd_t *pgd;
|
||||
pud_t *pud;
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
int i, j;
|
||||
int i, j, k;
|
||||
unsigned long vaddr;
|
||||
|
||||
vaddr = start;
|
||||
i = __pgd_offset(vaddr);
|
||||
j = __pmd_offset(vaddr);
|
||||
j = __pud_offset(vaddr);
|
||||
k = __pmd_offset(vaddr);
|
||||
pgd = pgd_base + i;
|
||||
|
||||
for ( ; (i < PTRS_PER_PGD) && (vaddr != end); pgd++, i++) {
|
||||
pmd = (pmd_t *)pgd;
|
||||
for (; (j < PTRS_PER_PMD) && (vaddr != end); pmd++, j++) {
|
||||
if (pmd_none(*pmd)) {
|
||||
pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
|
||||
set_pmd(pmd, __pmd(pte));
|
||||
if (pte != pte_offset_kernel(pmd, 0))
|
||||
BUG();
|
||||
pud = (pud_t *)pgd;
|
||||
for ( ; (j < PTRS_PER_PUD) && (vaddr != end); pud++, j++) {
|
||||
pmd = (pmd_t *)pud;
|
||||
for (; (k < PTRS_PER_PMD) && (vaddr != end); pmd++, k++) {
|
||||
if (pmd_none(*pmd)) {
|
||||
pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
|
||||
set_pmd(pmd, __pmd(pte));
|
||||
if (pte != pte_offset_kernel(pmd, 0))
|
||||
BUG();
|
||||
}
|
||||
vaddr += PMD_SIZE;
|
||||
}
|
||||
vaddr += PMD_SIZE;
|
||||
k = 0;
|
||||
}
|
||||
j = 0;
|
||||
}
|
||||
|
@ -79,9 +79,14 @@ static int remap_area_pages(unsigned long address, phys_t phys_addr,
|
||||
BUG();
|
||||
spin_lock(&init_mm.page_table_lock);
|
||||
do {
|
||||
pud_t *pud;
|
||||
pmd_t *pmd;
|
||||
pmd = pmd_alloc(&init_mm, dir, address);
|
||||
|
||||
error = -ENOMEM;
|
||||
pud = pud_alloc(&init_mm, dir, address);
|
||||
if (!pud)
|
||||
break;
|
||||
pmd = pmd_alloc(&init_mm, pud, address);
|
||||
if (!pmd)
|
||||
break;
|
||||
if (remap_area_pmd(pmd, address, end - address,
|
||||
@ -141,7 +146,7 @@ void * __ioremap(phys_t phys_addr, phys_t size, unsigned long flags)
|
||||
*/
|
||||
if (IS_LOW512(phys_addr) && IS_LOW512(last_addr) &&
|
||||
flags == _CACHE_UNCACHED)
|
||||
return (void *) KSEG1ADDR(phys_addr);
|
||||
return (void *) CKSEG1ADDR(phys_addr);
|
||||
|
||||
/*
|
||||
* Don't allow anybody to remap normal RAM that we're using..
|
||||
@ -180,7 +185,7 @@ void * __ioremap(phys_t phys_addr, phys_t size, unsigned long flags)
|
||||
return (void *) (offset + (char *)addr);
|
||||
}
|
||||
|
||||
#define IS_KSEG1(addr) (((unsigned long)(addr) & ~0x1fffffffUL) == KSEG1)
|
||||
#define IS_KSEG1(addr) (((unsigned long)(addr) & ~0x1fffffffUL) == CKSEG1)
|
||||
|
||||
void __iounmap(volatile void __iomem *addr)
|
||||
{
|
||||
@ -190,10 +195,8 @@ void __iounmap(volatile void __iomem *addr)
|
||||
return;
|
||||
|
||||
p = remove_vm_area((void *) (PAGE_MASK & (unsigned long __force) addr));
|
||||
if (!p) {
|
||||
if (!p)
|
||||
printk(KERN_ERR "iounmap: bad address %p\n", addr);
|
||||
return;
|
||||
}
|
||||
|
||||
kfree(p);
|
||||
}
|
||||
|
@ -35,6 +35,7 @@ void __init pagetable_init(void)
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
unsigned long vaddr;
|
||||
pgd_t *pgd, *pgd_base;
|
||||
pud_t *pud;
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
#endif
|
||||
@ -60,7 +61,8 @@ void __init pagetable_init(void)
|
||||
fixrange_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base);
|
||||
|
||||
pgd = swapper_pg_dir + __pgd_offset(vaddr);
|
||||
pmd = pmd_offset(pgd, vaddr);
|
||||
pud = pud_offset(pgd, vaddr);
|
||||
pmd = pmd_offset(pud, vaddr);
|
||||
pte = pte_offset_kernel(pmd, vaddr);
|
||||
pkmap_page_table = pte;
|
||||
#endif
|
||||
|
@ -195,6 +195,7 @@ void __update_tlb(struct vm_area_struct * vma, unsigned long address, pte_t pte)
|
||||
{
|
||||
unsigned long flags;
|
||||
pgd_t *pgdp;
|
||||
pud_t *pudp;
|
||||
pmd_t *pmdp;
|
||||
pte_t *ptep;
|
||||
int idx, pid;
|
||||
@ -220,7 +221,8 @@ void __update_tlb(struct vm_area_struct * vma, unsigned long address, pte_t pte)
|
||||
write_c0_entryhi(address | (pid));
|
||||
pgdp = pgd_offset(vma->vm_mm, address);
|
||||
tlb_probe();
|
||||
pmdp = pmd_offset(pgdp, address);
|
||||
pudp = pud_offset(pgdp, address);
|
||||
pmdp = pmd_offset(pudp, address);
|
||||
idx = read_c0_index();
|
||||
ptep = pte_offset_map(pmdp, address);
|
||||
write_c0_entrylo0(pte_val(*ptep++) >> 6);
|
||||
|
@ -227,6 +227,7 @@ void __update_tlb(struct vm_area_struct * vma, unsigned long address, pte_t pte)
|
||||
{
|
||||
unsigned long flags;
|
||||
pgd_t *pgdp;
|
||||
pud_t *pudp;
|
||||
pmd_t *pmdp;
|
||||
pte_t *ptep;
|
||||
int idx, pid;
|
||||
@ -246,7 +247,8 @@ void __update_tlb(struct vm_area_struct * vma, unsigned long address, pte_t pte)
|
||||
mtc0_tlbw_hazard();
|
||||
tlb_probe();
|
||||
BARRIER;
|
||||
pmdp = pmd_offset(pgdp, address);
|
||||
pudp = pud_offset(pgdp, address);
|
||||
pmdp = pmd_offset(pudp, address);
|
||||
idx = read_c0_index();
|
||||
ptep = pte_offset_map(pmdp, address);
|
||||
|
||||
|
Reference in New Issue
Block a user