Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
s390
include
asm
pgalloc.h
Go to the documentation of this file.
1
/*
2
* S390 version
3
* Copyright IBM Corp. 1999, 2000
4
* Author(s): Hartmut Penner (
[email protected]
)
5
* Martin Schwidefsky (
[email protected]
)
6
*
7
* Derived from "include/asm-i386/pgalloc.h"
8
* Copyright (C) 1994 Linus Torvalds
9
*/
10
11
#ifndef _S390_PGALLOC_H
12
#define _S390_PGALLOC_H
13
14
#include <
linux/threads.h
>
15
#include <
linux/gfp.h
>
16
#include <
linux/mm.h
>
17
18
unsigned
long
*
crst_table_alloc
(
struct
mm_struct
*);
19
void
crst_table_free
(
struct
mm_struct
*,
unsigned
long
*);
20
21
unsigned
long
*
page_table_alloc
(
struct
mm_struct
*,
unsigned
long
);
22
void
page_table_free
(
struct
mm_struct
*,
unsigned
long
*);
23
void
page_table_free_rcu
(
struct
mmu_gather
*,
unsigned
long
*);
24
25
static
inline
void
clear_table(
unsigned
long
*
s
,
unsigned
long
val
,
size_t
n
)
26
{
27
typedef
struct
{
char
_
[
n
]; } addrtype;
28
29
*s =
val
;
30
n = (n / 256) - 1;
31
asm
volatile
(
32
#ifdef CONFIG_64BIT
33
" mvc 8(248,%0),0(%0)\n"
34
#else
35
" mvc 4(252,%0),0(%0)\n"
36
#endif
37
"0: mvc 256(256,%0),0(%0)\n"
38
" la %0,256(%0)\n"
39
" brct %1,0b\n"
40
:
"+a"
(
s
),
"+d"
(n),
"=m"
(*(addrtype *) s)
41
:
"m"
(*(addrtype *) s));
42
}
43
44
static
inline
void
crst_table_init(
unsigned
long
*crst,
unsigned
long
entry
)
45
{
46
clear_table(crst, entry,
sizeof
(
unsigned
long
)*2048);
47
}
48
49
#ifndef CONFIG_64BIT
50
51
static
inline
unsigned
long
pgd_entry_type(
struct
mm_struct
*mm)
52
{
53
return
_SEGMENT_ENTRY_EMPTY
;
54
}
55
56
#define pud_alloc_one(mm,address) ({ BUG(); ((pud_t *)2); })
57
#define pud_free(mm, x) do { } while (0)
58
59
#define pmd_alloc_one(mm,address) ({ BUG(); ((pmd_t *)2); })
60
#define pmd_free(mm, x) do { } while (0)
61
62
#define pgd_populate(mm, pgd, pud) BUG()
63
#define pud_populate(mm, pud, pmd) BUG()
64
65
#else
/* CONFIG_64BIT */
66
67
static
inline
unsigned
long
pgd_entry_type(
struct
mm_struct
*mm)
68
{
69
if
(mm->
context
.
asce_limit
<= (1
UL
<< 31))
70
return
_SEGMENT_ENTRY_EMPTY
;
71
if
(mm->
context
.
asce_limit
<= (1
UL
<< 42))
72
return
_REGION3_ENTRY_EMPTY;
73
return
_REGION2_ENTRY_EMPTY;
74
}
75
76
int
crst_table_upgrade(
struct
mm_struct
*,
unsigned
long
limit
);
77
void
crst_table_downgrade(
struct
mm_struct
*,
unsigned
long
limit
);
78
79
static
inline
pud_t
*
pud_alloc_one
(
struct
mm_struct
*mm,
unsigned
long
address
)
80
{
81
unsigned
long
*
table
=
crst_table_alloc
(mm);
82
if
(table)
83
crst_table_init(table, _REGION3_ENTRY_EMPTY);
84
return
(
pud_t
*)
table
;
85
}
86
#define pud_free(mm, pud) crst_table_free(mm, (unsigned long *) pud)
87
88
static
inline
pmd_t
*
pmd_alloc_one
(
struct
mm_struct
*mm,
unsigned
long
vmaddr)
89
{
90
unsigned
long
*table =
crst_table_alloc
(mm);
91
if
(table)
92
crst_table_init(table,
_SEGMENT_ENTRY_EMPTY
);
93
return
(
pmd_t
*)
table
;
94
}
95
#define pmd_free(mm, pmd) crst_table_free(mm, (unsigned long *) pmd)
96
97
static
inline
void
pgd_populate
(
struct
mm_struct
*mm,
pgd_t
*pgd,
pud_t
*pud)
98
{
99
pgd_val
(*pgd) = _REGION2_ENTRY |
__pa
(pud);
100
}
101
102
static
inline
void
pud_populate
(
struct
mm_struct
*mm,
pud_t
*pud,
pmd_t
*
pmd
)
103
{
104
pud_val
(*pud) = _REGION3_ENTRY |
__pa
(pmd);
105
}
106
107
#endif
/* CONFIG_64BIT */
108
109
static
inline
pgd_t
*
pgd_alloc
(
struct
mm_struct
*mm)
110
{
111
spin_lock_init
(&mm->
context
.
list_lock
);
112
INIT_LIST_HEAD(&mm->
context
.
pgtable_list
);
113
INIT_LIST_HEAD(&mm->
context
.
gmap_list
);
114
return
(
pgd_t
*)
crst_table_alloc
(mm);
115
}
116
#define pgd_free(mm, pgd) crst_table_free(mm, (unsigned long *) pgd)
117
118
static
inline
void
pmd_populate
(
struct
mm_struct
*mm,
119
pmd_t
*
pmd
,
pgtable_t
pte
)
120
{
121
pmd_val
(*pmd) =
_SEGMENT_ENTRY
+
__pa
(pte);
122
}
123
124
#define pmd_populate_kernel(mm, pmd, pte) pmd_populate(mm, pmd, pte)
125
126
#define pmd_pgtable(pmd) \
127
(pgtable_t)(pmd_val(pmd) & -sizeof(pte_t)*PTRS_PER_PTE)
128
129
/*
130
* page table entry allocation/free routines.
131
*/
132
#define pte_alloc_one_kernel(mm, vmaddr) ((pte_t *) page_table_alloc(mm, vmaddr))
133
#define pte_alloc_one(mm, vmaddr) ((pte_t *) page_table_alloc(mm, vmaddr))
134
135
#define pte_free_kernel(mm, pte) page_table_free(mm, (unsigned long *) pte)
136
#define pte_free(mm, pte) page_table_free(mm, (unsigned long *) pte)
137
138
extern
void
rcu_table_freelist_finish
(
void
);
139
140
#endif
/* _S390_PGALLOC_H */
Generated on Thu Jan 10 2013 12:50:12 for Linux Kernel by
1.8.2