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
powerpc
include
asm
mmu_context.h
Go to the documentation of this file.
1
#ifndef __ASM_POWERPC_MMU_CONTEXT_H
2
#define __ASM_POWERPC_MMU_CONTEXT_H
3
#ifdef __KERNEL__
4
5
#include <linux/kernel.h>
6
#include <
linux/mm.h
>
7
#include <linux/sched.h>
8
#include <
linux/spinlock.h
>
9
#include <asm/mmu.h>
10
#include <asm/cputable.h>
11
#include <
asm-generic/mm_hooks.h
>
12
#include <
asm/cputhreads.h
>
13
14
/*
15
* Most if the context management is out of line
16
*/
17
extern
int
init_new_context
(
struct
task_struct
*tsk,
struct
mm_struct
*mm);
18
extern
void
destroy_context
(
struct
mm_struct
*mm);
19
20
extern
void
switch_mmu_context
(
struct
mm_struct
*
prev
,
struct
mm_struct
*
next
);
21
extern
void
switch_stab
(
struct
task_struct
*tsk,
struct
mm_struct
*mm);
22
extern
void
switch_slb
(
struct
task_struct
*tsk,
struct
mm_struct
*mm);
23
extern
void
set_context(
unsigned
long
id
,
pgd_t
*
pgd
);
24
25
#ifdef CONFIG_PPC_BOOK3S_64
26
extern
int
__init_new_context
(
void
);
27
extern
void
__destroy_context
(
int
context_id);
28
static
inline
void
mmu_context_init
(
void
) { }
29
#else
30
extern
unsigned
long
__init_new_context
(
void
);
31
extern
void
__destroy_context
(
unsigned
long
context_id);
32
extern
void
mmu_context_init
(
void
);
33
#endif
34
35
extern
void
switch_cop
(
struct
mm_struct
*
next
);
36
extern
int
use_cop
(
unsigned
long
acop,
struct
mm_struct
*mm);
37
extern
void
drop_cop
(
unsigned
long
acop,
struct
mm_struct
*mm);
38
39
/*
40
* switch_mm is the entry point called from the architecture independent
41
* code in kernel/sched.c
42
*/
43
static
inline
void
switch_mm
(
struct
mm_struct
*
prev
,
struct
mm_struct
*
next
,
44
struct
task_struct
*tsk)
45
{
46
/* Mark this context has been used on the new CPU */
47
cpumask_set_cpu(
smp_processor_id
(), mm_cpumask(next));
48
49
/* 32-bit keeps track of the current PGDIR in the thread struct */
50
#ifdef CONFIG_PPC32
51
tsk->
thread
.pgdir = next->
pgd
;
52
#endif
/* CONFIG_PPC32 */
53
54
/* 64-bit Book3E keeps track of current PGD in the PACA */
55
#ifdef CONFIG_PPC_BOOK3E_64
56
get_paca()->
pgd
= next->
pgd
;
57
#endif
58
/* Nothing else to do if we aren't actually switching */
59
if
(prev == next)
60
return
;
61
62
#ifdef CONFIG_PPC_ICSWX
63
/* Switch coprocessor context only if prev or next uses a coprocessor */
64
if
(prev->
context
.acop || next->
context
.acop)
65
switch_cop
(next);
66
#endif
/* CONFIG_PPC_ICSWX */
67
68
/* We must stop all altivec streams before changing the HW
69
* context
70
*/
71
#ifdef CONFIG_ALTIVEC
72
if
(
cpu_has_feature
(
CPU_FTR_ALTIVEC
))
73
asm
volatile
(
"dssall"
);
74
#endif
/* CONFIG_ALTIVEC */
75
76
/* The actual HW switching method differs between the various
77
* sub architectures.
78
*/
79
#ifdef CONFIG_PPC_STD_MMU_64
80
if
(mmu_has_feature(MMU_FTR_SLB))
81
switch_slb
(tsk, next);
82
else
83
switch_stab
(tsk, next);
84
#else
85
/* Out of line for now */
86
switch_mmu_context
(prev, next);
87
#endif
88
89
}
90
91
#define deactivate_mm(tsk,mm) do { } while (0)
92
93
/*
94
* After we have set current->mm to a new value, this activates
95
* the context for the new mm so we see the new mappings.
96
*/
97
static
inline
void
activate_mm
(
struct
mm_struct
*prev,
struct
mm_struct
*next)
98
{
99
unsigned
long
flags
;
100
101
local_irq_save
(flags);
102
switch_mm
(prev, next,
current
);
103
local_irq_restore
(flags);
104
}
105
106
/* We don't currently use enter_lazy_tlb() for anything */
107
static
inline
void
enter_lazy_tlb
(
struct
mm_struct
*mm,
108
struct
task_struct
*tsk)
109
{
110
/* 64-bit Book3E keeps track of current PGD in the PACA */
111
#ifdef CONFIG_PPC_BOOK3E_64
112
get_paca()->pgd =
NULL
;
113
#endif
114
}
115
116
#endif
/* __KERNEL__ */
117
#endif
/* __ASM_POWERPC_MMU_CONTEXT_H */
Generated on Thu Jan 10 2013 12:49:59 for Linux Kernel by
1.8.2