]>
git.proxmox.com Git - mirror_ubuntu-kernels.git/blob - arch/um/kernel/skas/tlb.c
27eb29ce666b624a59115df89e173eb32d9a4e39
2 * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
3 * Copyright 2003 PathScale, Inc.
4 * Licensed under the GPL
7 #include "linux/stddef.h"
8 #include "linux/sched.h"
11 #include "asm/pgtable.h"
13 #include "user_util.h"
20 static int do_ops(union mm_context
*mmu
, struct host_vm_op
*ops
, int last
,
21 int finished
, void **flush
)
23 struct host_vm_op
*op
;
26 for(i
= 0; i
<= last
&& !ret
; i
++){
30 ret
= map(&mmu
->skas
.id
, op
->u
.mmap
.addr
,
31 op
->u
.mmap
.len
, op
->u
.mmap
.r
, op
->u
.mmap
.w
,
32 op
->u
.mmap
.x
, op
->u
.mmap
.fd
,
33 op
->u
.mmap
.offset
, finished
, flush
);
36 ret
= unmap(&mmu
->skas
.id
,
37 (void *) op
->u
.munmap
.addr
,
38 op
->u
.munmap
.len
, finished
, flush
);
41 ret
= protect(&mmu
->skas
.id
, op
->u
.mprotect
.addr
,
42 op
->u
.mprotect
.len
, op
->u
.mprotect
.r
,
43 op
->u
.mprotect
.w
, op
->u
.mprotect
.x
,
47 printk("Unknown op type %d in do_ops\n", op
->type
);
57 static void fix_range(struct mm_struct
*mm
, unsigned long start_addr
,
58 unsigned long end_addr
, int force
)
60 if(!proc_mm
&& (end_addr
> CONFIG_STUB_START
))
61 end_addr
= CONFIG_STUB_START
;
63 fix_range_common(mm
, start_addr
, end_addr
, force
, do_ops
);
66 void __flush_tlb_one_skas(unsigned long addr
)
68 flush_tlb_kernel_range_common(addr
, addr
+ PAGE_SIZE
);
71 void flush_tlb_range_skas(struct vm_area_struct
*vma
, unsigned long start
,
74 if(vma
->vm_mm
== NULL
)
75 flush_tlb_kernel_range_common(start
, end
);
76 else fix_range(vma
->vm_mm
, start
, end
, 0);
79 void flush_tlb_mm_skas(struct mm_struct
*mm
)
83 /* Don't bother flushing if this address space is about to be
86 if(atomic_read(&mm
->mm_users
) == 0)
89 end
= proc_mm
? task_size
: CONFIG_STUB_START
;
90 fix_range(mm
, 0, end
, 0);
93 void force_flush_all_skas(void)
95 unsigned long end
= proc_mm
? task_size
: CONFIG_STUB_START
;
96 fix_range(current
->mm
, 0, end
, 1);