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
hexagon
mm
vm_tlb.c
Go to the documentation of this file.
1
/*
2
* Hexagon Virtual Machine TLB functions
3
*
4
* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License version 2 and
8
* only version 2 as published by the Free Software Foundation.
9
*
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
14
*
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18
* 02110-1301, USA.
19
*/
20
21
/*
22
* The Hexagon Virtual Machine conceals the real workings of
23
* the TLB, but there are one or two functions that need to
24
* be instantiated for it, differently from a native build.
25
*/
26
#include <
linux/mm.h
>
27
#include <asm/page.h>
28
#include <
asm/hexagon_vm.h
>
29
30
/*
31
* Initial VM implementation has only one map active at a time, with
32
* TLB purgings on changes. So either we're nuking the current map,
33
* or it's a no-op. This operation is messy on true SMPs where other
34
* processors must be induced to flush the copies in their local TLBs,
35
* but Hexagon thread-based virtual processors share the same MMU.
36
*/
37
void
flush_tlb_range
(
struct
vm_area_struct
*vma,
unsigned
long
start
,
38
unsigned
long
end
)
39
{
40
struct
mm_struct
*mm = vma->
vm_mm
;
41
42
if
(mm->
context
.ptbase ==
current
->active_mm->context.ptbase)
43
__vmclrmap
((
void
*)start, end - start);
44
}
45
46
/*
47
* Flush a page from the kernel virtual map - used by highmem
48
*/
49
void
flush_tlb_one
(
unsigned
long
vaddr
)
50
{
51
__vmclrmap
((
void
*)vaddr,
PAGE_SIZE
);
52
}
53
54
/*
55
* Flush all TLBs across all CPUs, virtual or real.
56
* A single Hexagon core has 6 thread contexts but
57
* only one TLB.
58
*/
59
void
tlb_flush_all
(
void
)
60
{
61
/* should probably use that fixaddr end or whateve label */
62
__vmclrmap
(0, 0xffff0000);
63
}
64
65
/*
66
* Flush TLB entries associated with a given mm_struct mapping.
67
*/
68
void
flush_tlb_mm
(
struct
mm_struct
*mm)
69
{
70
/* Current Virtual Machine has only one map active at a time */
71
if
(
current
->active_mm->context.ptbase == mm->
context
.ptbase)
72
tlb_flush_all
();
73
}
74
75
/*
76
* Flush TLB state associated with a page of a vma.
77
*/
78
void
flush_tlb_page
(
struct
vm_area_struct
*vma,
unsigned
long
vaddr
)
79
{
80
struct
mm_struct
*mm = vma->
vm_mm
;
81
82
if
(mm->
context
.ptbase ==
current
->active_mm->context.ptbase)
83
__vmclrmap
((
void
*)vaddr,
PAGE_SIZE
);
84
}
85
86
/*
87
* Flush TLB entries associated with a kernel address range.
88
* Like flush range, but without the check on the vma->vm_mm.
89
*/
90
void
flush_tlb_kernel_range
(
unsigned
long
start
,
unsigned
long
end
)
91
{
92
__vmclrmap
((
void
*)start, end - start);
93
}
Generated on Thu Jan 10 2013 13:05:58 for Linux Kernel by
1.8.2