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
mmu_context.h
Go to the documentation of this file.
1
/*
2
* S390 version
3
*
4
* Derived from "include/asm-i386/mmu_context.h"
5
*/
6
7
#ifndef __S390_MMU_CONTEXT_H
8
#define __S390_MMU_CONTEXT_H
9
10
#include <asm/pgalloc.h>
11
#include <asm/uaccess.h>
12
#include <asm/tlbflush.h>
13
#include <
asm/ctl_reg.h
>
14
15
static
inline
int
init_new_context
(
struct
task_struct
*tsk,
16
struct
mm_struct
*mm)
17
{
18
atomic_set
(&mm->
context
.
attach_count
, 0);
19
mm->
context
.
flush_mm
= 0;
20
mm->
context
.
asce_bits
=
_ASCE_TABLE_LENGTH
|
_ASCE_USER_BITS
;
21
#ifdef CONFIG_64BIT
22
mm->
context
.
asce_bits
|= _ASCE_TYPE_REGION3;
23
#endif
24
if
(
current
->mm &&
current
->mm->context.alloc_pgste) {
25
/*
26
* alloc_pgste indicates, that any NEW context will be created
27
* with extended page tables. The old context is unchanged. The
28
* page table allocation and the page table operations will
29
* look at has_pgste to distinguish normal and extended page
30
* tables. The only way to create extended page tables is to
31
* set alloc_pgste and then create a new context (e.g. dup_mm).
32
* The page table allocation is called after init_new_context
33
* and if has_pgste is set, it will create extended page
34
* tables.
35
*/
36
mm->
context
.
has_pgste
= 1;
37
mm->
context
.
alloc_pgste
= 1;
38
}
else
{
39
mm->
context
.
has_pgste
= 0;
40
mm->
context
.
alloc_pgste
= 0;
41
}
42
mm->
context
.
asce_limit
=
STACK_TOP_MAX
;
43
crst_table_init((
unsigned
long
*) mm->
pgd
, pgd_entry_type(mm));
44
return
0;
45
}
46
47
#define destroy_context(mm) do { } while (0)
48
49
#ifndef CONFIG_64BIT
50
#define LCTL_OPCODE "lctl"
51
#else
52
#define LCTL_OPCODE "lctlg"
53
#endif
54
55
static
inline
void
update_mm(
struct
mm_struct
*mm,
struct
task_struct
*tsk)
56
{
57
pgd_t
*
pgd
= mm->
pgd
;
58
59
S390_lowcore
.user_asce = mm->
context
.
asce_bits
|
__pa
(pgd);
60
if
(
s390_user_mode
!=
HOME_SPACE_MODE
) {
61
/* Load primary space page table origin. */
62
asm
volatile
(
LCTL_OPCODE
" 1,1,%0\n"
63
: :
"m"
(
S390_lowcore
.user_asce) );
64
}
else
65
/* Load home space page table origin. */
66
asm
volatile
(
LCTL_OPCODE
" 13,13,%0"
67
: :
"m"
(
S390_lowcore
.user_asce) );
68
set_fs
(
current
->thread.mm_segment);
69
}
70
71
static
inline
void
switch_mm
(
struct
mm_struct
*
prev
,
struct
mm_struct
*
next
,
72
struct
task_struct
*tsk)
73
{
74
cpumask_set_cpu(
smp_processor_id
(), mm_cpumask(next));
75
update_mm(next, tsk);
76
atomic_dec
(&prev->
context
.
attach_count
);
77
WARN_ON
(
atomic_read
(&prev->
context
.
attach_count
) < 0);
78
atomic_inc
(&next->
context
.
attach_count
);
79
/* Check for TLBs not flushed yet */
80
if
(next->
context
.
flush_mm
)
81
__tlb_flush_mm(next);
82
}
83
84
#define enter_lazy_tlb(mm,tsk) do { } while (0)
85
#define deactivate_mm(tsk,mm) do { } while (0)
86
87
static
inline
void
activate_mm
(
struct
mm_struct
*prev,
88
struct
mm_struct
*next)
89
{
90
switch_mm
(prev, next,
current
);
91
}
92
93
static
inline
void
arch_dup_mmap(
struct
mm_struct
*oldmm,
94
struct
mm_struct
*mm)
95
{
96
#ifdef CONFIG_64BIT
97
if
(oldmm->
context
.
asce_limit
< mm->
context
.
asce_limit
)
98
crst_table_downgrade(mm, oldmm->
context
.
asce_limit
);
99
#endif
100
}
101
102
static
inline
void
arch_exit_mmap
(
struct
mm_struct
*mm)
103
{
104
}
105
106
#endif
/* __S390_MMU_CONTEXT_H */
Generated on Thu Jan 10 2013 12:49:59 for Linux Kernel by
1.8.2