2 * include/asm-s390/pgalloc.h
5 * Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
6 * Author(s): Hartmut Penner (hp@de.ibm.com)
7 * Martin Schwidefsky (schwidefsky@de.ibm.com)
9 * Derived from "include/asm-i386/pgalloc.h"
10 * Copyright (C) 1994 Linus Torvalds
13 #ifndef _S390_PGALLOC_H
14 #define _S390_PGALLOC_H
16 #include <linux/threads.h>
17 #include <linux/gfp.h>
20 #define check_pgt_cache() do {} while (0)
22 unsigned long *crst_table_alloc(struct mm_struct
*, int);
23 void crst_table_free(unsigned long *);
25 unsigned long *page_table_alloc(int);
26 void page_table_free(unsigned long *);
28 static inline void clear_table(unsigned long *s
, unsigned long val
, size_t n
)
34 " mvc 8(248,%0),0(%0)\n"
36 " mvc 4(252,%0),0(%0)\n"
38 "0: mvc 256(256,%0),0(%0)\n"
41 : "+a" (s
), "+d" (n
));
44 static inline void crst_table_init(unsigned long *crst
, unsigned long entry
)
46 clear_table(crst
, entry
, sizeof(unsigned long)*2048);
47 crst
= get_shadow_table(crst
);
49 clear_table(crst
, entry
, sizeof(unsigned long)*2048);
54 static inline unsigned long pgd_entry_type(struct mm_struct
*mm
)
56 return _SEGMENT_ENTRY_EMPTY
;
59 #define pud_alloc_one(mm,address) ({ BUG(); ((pud_t *)2); })
60 #define pud_free(x) do { } while (0)
62 #define pmd_alloc_one(mm,address) ({ BUG(); ((pmd_t *)2); })
63 #define pmd_free(x) do { } while (0)
65 #define pgd_populate(mm, pgd, pud) BUG()
66 #define pgd_populate_kernel(mm, pgd, pud) BUG()
68 #define pud_populate(mm, pud, pmd) BUG()
69 #define pud_populate_kernel(mm, pud, pmd) BUG()
73 static inline unsigned long pgd_entry_type(struct mm_struct
*mm
)
75 return _REGION3_ENTRY_EMPTY
;
78 #define pud_alloc_one(mm,address) ({ BUG(); ((pud_t *)2); })
79 #define pud_free(x) do { } while (0)
81 static inline pmd_t
*pmd_alloc_one(struct mm_struct
*mm
, unsigned long vmaddr
)
83 unsigned long *crst
= crst_table_alloc(mm
, s390_noexec
);
85 crst_table_init(crst
, _SEGMENT_ENTRY_EMPTY
);
86 return (pmd_t
*) crst
;
88 #define pmd_free(pmd) crst_table_free((unsigned long *) pmd)
90 #define pgd_populate(mm, pgd, pud) BUG()
91 #define pgd_populate_kernel(mm, pgd, pud) BUG()
93 static inline void pud_populate_kernel(struct mm_struct
*mm
,
94 pud_t
*pud
, pmd_t
*pmd
)
96 pud_val(*pud
) = _REGION3_ENTRY
| __pa(pmd
);
99 static inline void pud_populate(struct mm_struct
*mm
, pud_t
*pud
, pmd_t
*pmd
)
101 pud_t
*shadow_pud
= get_shadow_table(pud
);
102 pmd_t
*shadow_pmd
= get_shadow_table(pmd
);
104 if (shadow_pud
&& shadow_pmd
)
105 pud_populate_kernel(mm
, shadow_pud
, shadow_pmd
);
106 pud_populate_kernel(mm
, pud
, pmd
);
109 #endif /* __s390x__ */
111 static inline pgd_t
*pgd_alloc(struct mm_struct
*mm
)
113 unsigned long *crst
= crst_table_alloc(mm
, s390_noexec
);
115 crst_table_init(crst
, pgd_entry_type(mm
));
116 return (pgd_t
*) crst
;
118 #define pgd_free(pgd) crst_table_free((unsigned long *) pgd)
121 pmd_populate_kernel(struct mm_struct
*mm
, pmd_t
*pmd
, pte_t
*pte
)
124 pmd_val(pmd
[0]) = _SEGMENT_ENTRY
+ __pa(pte
);
125 pmd_val(pmd
[1]) = _SEGMENT_ENTRY
+ __pa(pte
+256);
126 pmd_val(pmd
[2]) = _SEGMENT_ENTRY
+ __pa(pte
+512);
127 pmd_val(pmd
[3]) = _SEGMENT_ENTRY
+ __pa(pte
+768);
128 #else /* __s390x__ */
129 pmd_val(*pmd
) = _SEGMENT_ENTRY
+ __pa(pte
);
130 pmd_val1(*pmd
) = _SEGMENT_ENTRY
+ __pa(pte
+256);
131 #endif /* __s390x__ */
135 pmd_populate(struct mm_struct
*mm
, pmd_t
*pmd
, struct page
*page
)
137 pte_t
*pte
= (pte_t
*)page_to_phys(page
);
138 pmd_t
*shadow_pmd
= get_shadow_table(pmd
);
139 pte_t
*shadow_pte
= get_shadow_pte(pte
);
141 pmd_populate_kernel(mm
, pmd
, pte
);
142 if (shadow_pmd
&& shadow_pte
)
143 pmd_populate_kernel(mm
, shadow_pmd
, shadow_pte
);
147 * page table entry allocation/free routines.
149 #define pte_alloc_one_kernel(mm, vmaddr) \
150 ((pte_t *) page_table_alloc(s390_noexec))
151 #define pte_alloc_one(mm, vmaddr) \
152 virt_to_page(page_table_alloc(s390_noexec))
154 #define pte_free_kernel(pte) \
155 page_table_free((unsigned long *) pte)
156 #define pte_free(pte) \
157 page_table_free((unsigned long *) page_to_phys((struct page *) pte))
159 #endif /* _S390_PGALLOC_H */