-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This patch adds support for page table management. Signed-off-by: Ley Foon Tan <lftan@altera.com>
- Loading branch information
Ley Foon Tan
committed
Dec 8, 2014
1 parent
862674d
commit cbd15b3
Showing
4 changed files
with
505 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
/* | ||
* This file is subject to the terms and conditions of the GNU General Public | ||
* License. See the file "COPYING" in the main directory of this archive | ||
* for more details. | ||
* | ||
* Copyright (C) 1994 - 2001, 2003 by Ralf Baechle | ||
* Copyright (C) 1999, 2000, 2001 Silicon Graphics, Inc. | ||
*/ | ||
|
||
#ifndef _ASM_NIOS2_PGALLOC_H | ||
#define _ASM_NIOS2_PGALLOC_H | ||
|
||
#include <linux/mm.h> | ||
|
||
static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, | ||
pte_t *pte) | ||
{ | ||
set_pmd(pmd, __pmd((unsigned long)pte)); | ||
} | ||
|
||
static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, | ||
pgtable_t pte) | ||
{ | ||
set_pmd(pmd, __pmd((unsigned long)page_address(pte))); | ||
} | ||
#define pmd_pgtable(pmd) pmd_page(pmd) | ||
|
||
/* | ||
* Initialize a new pmd table with invalid pointers. | ||
*/ | ||
extern void pmd_init(unsigned long page, unsigned long pagetable); | ||
|
||
extern pgd_t *pgd_alloc(struct mm_struct *mm); | ||
|
||
static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) | ||
{ | ||
free_pages((unsigned long)pgd, PGD_ORDER); | ||
} | ||
|
||
static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, | ||
unsigned long address) | ||
{ | ||
pte_t *pte; | ||
|
||
pte = (pte_t *) __get_free_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, | ||
PTE_ORDER); | ||
|
||
return pte; | ||
} | ||
|
||
static inline pgtable_t pte_alloc_one(struct mm_struct *mm, | ||
unsigned long address) | ||
{ | ||
struct page *pte; | ||
|
||
pte = alloc_pages(GFP_KERNEL | __GFP_REPEAT, PTE_ORDER); | ||
if (pte) { | ||
if (!pgtable_page_ctor(pte)) { | ||
__free_page(pte); | ||
return NULL; | ||
} | ||
clear_highpage(pte); | ||
} | ||
return pte; | ||
} | ||
|
||
static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) | ||
{ | ||
free_pages((unsigned long)pte, PTE_ORDER); | ||
} | ||
|
||
static inline void pte_free(struct mm_struct *mm, struct page *pte) | ||
{ | ||
pgtable_page_dtor(pte); | ||
__free_pages(pte, PTE_ORDER); | ||
} | ||
|
||
#define __pte_free_tlb(tlb, pte, addr) \ | ||
do { \ | ||
pgtable_page_dtor(pte); \ | ||
tlb_remove_page((tlb), (pte)); \ | ||
} while (0) | ||
|
||
#define check_pgt_cache() do { } while (0) | ||
|
||
#endif /* _ASM_NIOS2_PGALLOC_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
/* | ||
* Copyright (C) 2011 Tobias Klauser <tklauser@distanz.ch> | ||
* Copyright (C) 2009 Wind River Systems Inc | ||
* | ||
* This file is subject to the terms and conditions of the GNU General Public | ||
* License. See the file "COPYING" in the main directory of this archive | ||
* for more details. | ||
*/ | ||
|
||
#ifndef _ASM_NIOS2_PGTABLE_BITS_H | ||
#define _ASM_NIOS2_PGTABLE_BITS_H | ||
|
||
/* | ||
* These are actual hardware defined protection bits in the tlbacc register | ||
* which looks like this: | ||
* | ||
* 31 30 ... 26 25 24 23 22 21 20 19 18 ... 1 0 | ||
* ignored........ C R W X G PFN............ | ||
*/ | ||
#define _PAGE_GLOBAL (1<<20) | ||
#define _PAGE_EXEC (1<<21) | ||
#define _PAGE_WRITE (1<<22) | ||
#define _PAGE_READ (1<<23) | ||
#define _PAGE_CACHED (1<<24) /* C: data access cacheable */ | ||
|
||
/* | ||
* Software defined bits. They are ignored by the hardware and always read back | ||
* as zero, but can be written as non-zero. | ||
*/ | ||
#define _PAGE_PRESENT (1<<25) /* PTE contains a translation */ | ||
#define _PAGE_ACCESSED (1<<26) /* page referenced */ | ||
#define _PAGE_DIRTY (1<<27) /* dirty page */ | ||
#define _PAGE_FILE (1<<28) /* PTE used for file mapping or swap */ | ||
|
||
#endif /* _ASM_NIOS2_PGTABLE_BITS_H */ |
Oops, something went wrong.