vserver 1.9.5.x5
[linux-2.6.git] / arch / um / kernel / tlb.c
1 /* 
2  * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
3  * Licensed under the GPL
4  */
5
6 #include "linux/mm.h"
7 #include "asm/page.h"
8 #include "asm/pgalloc.h"
9 #include "asm/tlbflush.h"
10 #include "choose-mode.h"
11 #include "mode_kern.h"
12
13 void flush_tlb_page(struct vm_area_struct *vma, unsigned long address)
14 {
15         address &= PAGE_MASK;
16         flush_tlb_range(vma, address, address + PAGE_SIZE);
17 }
18
19 void flush_tlb_all(void)
20 {
21         flush_tlb_mm(current->mm);
22 }
23   
24 void flush_tlb_kernel_range(unsigned long start, unsigned long end)
25 {
26         CHOOSE_MODE_PROC(flush_tlb_kernel_range_tt, 
27                          flush_tlb_kernel_range_skas, start, end);
28 }
29
30 void flush_tlb_kernel_vm(void)
31 {
32         CHOOSE_MODE(flush_tlb_kernel_vm_tt(), flush_tlb_kernel_vm_skas());
33 }
34
35 void __flush_tlb_one(unsigned long addr)
36 {
37         CHOOSE_MODE_PROC(__flush_tlb_one_tt, __flush_tlb_one_skas, addr);
38 }
39
40 void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, 
41                      unsigned long end)
42 {
43         CHOOSE_MODE_PROC(flush_tlb_range_tt, flush_tlb_range_skas, vma, start, 
44                          end);
45 }
46
47 void flush_tlb_mm(struct mm_struct *mm)
48 {
49         CHOOSE_MODE_PROC(flush_tlb_mm_tt, flush_tlb_mm_skas, mm);
50 }
51
52 void force_flush_all(void)
53 {
54         CHOOSE_MODE(force_flush_all_tt(), force_flush_all_skas());
55 }
56
57 pgd_t *pgd_offset_proc(struct mm_struct *mm, unsigned long address)
58 {
59         return(pgd_offset(mm, address));
60 }
61
62 pud_t *pud_offset_proc(pgd_t *pgd, unsigned long address)
63 {
64         return(pud_offset(pgd, address));
65 }
66
67 pmd_t *pmd_offset_proc(pud_t *pud, unsigned long address)
68 {
69         return(pmd_offset(pud, address));
70 }
71
72 pte_t *pte_offset_proc(pmd_t *pmd, unsigned long address)
73 {
74         return(pte_offset_kernel(pmd, address));
75 }
76
77 pte_t *addr_pte(struct task_struct *task, unsigned long addr)
78 {
79         pgd_t *pgd = pgd_offset(task->mm, addr);
80         pud_t *pud = pud_offset(pgd, addr);
81         pmd_t *pmd = pmd_offset(pud, addr);
82
83         return(pte_offset_map(pmd, addr));
84 }
85
86 /*
87  * Overrides for Emacs so that we follow Linus's tabbing style.
88  * Emacs will notice this stuff at the end of the file and automatically
89  * adjust the settings for this buffer only.  This must remain at the end
90  * of the file.
91  * ---------------------------------------------------------------------------
92  * Local variables:
93  * c-file-style: "linux"
94  * End:
95  */