summaryrefslogtreecommitdiff
path: root/arch/score/include/asm/pgalloc.h
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-09-18 09:45:08 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2009-09-18 09:45:08 -0700
commit81ce31b773226332475f89501b1072bec0c0e241 (patch)
treecd66f3c1caf731cc552ae90af2068aecabaed334 /arch/score/include/asm/pgalloc.h
parent515b696b282f856c3ad1679ccd658120faa387d0 (diff)
parent9973affe9bbcde64041890d8793eb2e74143c298 (diff)
Merge branch 'for-linus' of git://gitserver.sunplusct.com/linux-2.6-score
* 'for-linus' of git://gitserver.sunplusct.com/linux-2.6-score: (22 commits) score: add TIF_NOTIFY_RESUME define in asm/thread_info.h score: make init_thread_union align to THREAD_SIZE score: update files according to review comments. score: add old syscall support score: add MEMORY_START and MEMORY_SIZE define, to make the code clear score: update inconsistent declare after .c was changed score: remove unused code, add include files in .c score: clean up mm/init.c score: make irq.h definitions local score: cleanups: dead code, 0 as pointer, shadowed variables score: fix function prototypes score: add address space annotations score: add missing #includes score: move save arg5 and arg6 instruction in front of enable_irq score: add prototypes for wrapped syscalls score: remove init_mm score: add generic sys_call_table score: remove __{put,get}_user_unknown score: unset __ARCH_WANT_IPC_PARSE_VERSION score: update files according to review comments ...
Diffstat (limited to 'arch/score/include/asm/pgalloc.h')
-rw-r--r--arch/score/include/asm/pgalloc.h83
1 files changed, 83 insertions, 0 deletions
diff --git a/arch/score/include/asm/pgalloc.h b/arch/score/include/asm/pgalloc.h
new file mode 100644
index 000000000000..059a61b7071b
--- /dev/null
+++ b/arch/score/include/asm/pgalloc.h
@@ -0,0 +1,83 @@
+#ifndef _ASM_SCORE_PGALLOC_H
+#define _ASM_SCORE_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)
+
+static inline pgd_t *pgd_alloc(struct mm_struct *mm)
+{
+ pgd_t *ret, *init;
+
+ ret = (pgd_t *) __get_free_pages(GFP_KERNEL, PGD_ORDER);
+ if (ret) {
+ init = pgd_offset(&init_mm, 0UL);
+ pgd_init((unsigned long)ret);
+ memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD,
+ (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
+ }
+
+ return ret;
+}
+
+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 struct page *pte_alloc_one(struct mm_struct *mm,
+ unsigned long address)
+{
+ struct page *pte;
+
+ pte = alloc_pages(GFP_KERNEL | __GFP_REPEAT, PTE_ORDER);
+ if (pte) {
+ clear_highpage(pte);
+ pgtable_page_ctor(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, pgtable_t pte)
+{
+ pgtable_page_dtor(pte);
+ __free_pages(pte, PTE_ORDER);
+}
+
+#define __pte_free_tlb(tlb, pte, buf) \
+do { \
+ pgtable_page_dtor(pte); \
+ tlb_remove_page((tlb), pte); \
+} while (0)
+
+#define check_pgt_cache() do {} while (0)
+
+#endif /* _ASM_SCORE_PGALLOC_H */