diff options
Diffstat (limited to 'arch/um/kernel/tlb.c')
| -rw-r--r-- | arch/um/kernel/tlb.c | 132 | 
1 files changed, 68 insertions, 64 deletions
| diff --git a/arch/um/kernel/tlb.c b/arch/um/kernel/tlb.c index eda477edfdf5..83ec8d4747fd 100644 --- a/arch/um/kernel/tlb.c +++ b/arch/um/kernel/tlb.c @@ -18,13 +18,15 @@  #define ADD_ROUND(n, inc) (((n) + (inc)) & ~((inc) - 1))  void fix_range_common(struct mm_struct *mm, unsigned long start_addr, -                      unsigned long end_addr, int force, int data, -                      void (*do_ops)(int, struct host_vm_op *, int)) +                      unsigned long end_addr, int force, +                      void (*do_ops)(union mm_context *, struct host_vm_op *, +                                     int))  {          pgd_t *npgd;          pud_t *npud;          pmd_t *npmd;          pte_t *npte; +        union mm_context *mmu = &mm->context;          unsigned long addr, end;          int r, w, x;          struct host_vm_op ops[16]; @@ -40,7 +42,7 @@ void fix_range_common(struct mm_struct *mm, unsigned long start_addr,                                  end = end_addr;                          if(force || pgd_newpage(*npgd)){                                  op_index = add_munmap(addr, end - addr, ops, -                                                      op_index, last_op, data, +                                                      op_index, last_op, mmu,                                                        do_ops);                                  pgd_mkuptodate(*npgd);                          } @@ -55,7 +57,7 @@ void fix_range_common(struct mm_struct *mm, unsigned long start_addr,                                  end = end_addr;                          if(force || pud_newpage(*npud)){                                  op_index = add_munmap(addr, end - addr, ops, -                                                      op_index, last_op, data, +                                                      op_index, last_op, mmu,                                                        do_ops);                                  pud_mkuptodate(*npud);                          } @@ -70,7 +72,7 @@ void fix_range_common(struct mm_struct *mm, unsigned long start_addr,                                  end = end_addr;                          if(force || pmd_newpage(*npmd)){                                  op_index = add_munmap(addr, end - addr, ops, -                                                      op_index, last_op, data, +                                                      op_index, last_op, mmu,                                                        do_ops);                                  pmd_mkuptodate(*npmd);                          } @@ -93,21 +95,21 @@ void fix_range_common(struct mm_struct *mm, unsigned long start_addr,                                  op_index = add_mmap(addr,                                                      pte_val(*npte) & PAGE_MASK,                                                      PAGE_SIZE, r, w, x, ops, -                                                    op_index, last_op, data, +                                                    op_index, last_op, mmu,                                                      do_ops);                          else op_index = add_munmap(addr, PAGE_SIZE, ops, -                                                   op_index, last_op, data, +                                                   op_index, last_op, mmu,                                                     do_ops);                  }                  else if(pte_newprot(*npte))                          op_index = add_mprotect(addr, PAGE_SIZE, r, w, x, ops, -                                                op_index, last_op, data, +                                                op_index, last_op, mmu,                                                  do_ops);                  *npte = pte_mkuptodate(*npte);                  addr += PAGE_SIZE;          } -        (*do_ops)(data, ops, op_index); +        (*do_ops)(mmu, ops, op_index);  }  int flush_tlb_kernel_range_common(unsigned long start, unsigned long end) @@ -195,51 +197,6 @@ int flush_tlb_kernel_range_common(unsigned long start, unsigned long end)          return(updated);  } -void flush_tlb_page(struct vm_area_struct *vma, unsigned long address) -{ -        address &= PAGE_MASK; -        flush_tlb_range(vma, address, address + PAGE_SIZE); -} - -void flush_tlb_all(void) -{ -        flush_tlb_mm(current->mm); -} -   -void flush_tlb_kernel_range(unsigned long start, unsigned long end) -{ -        CHOOSE_MODE_PROC(flush_tlb_kernel_range_tt, -                         flush_tlb_kernel_range_common, start, end); -} - -void flush_tlb_kernel_vm(void) -{ -        CHOOSE_MODE(flush_tlb_kernel_vm_tt(), -                    flush_tlb_kernel_range_common(start_vm, end_vm)); -} - -void __flush_tlb_one(unsigned long addr) -{ -        CHOOSE_MODE_PROC(__flush_tlb_one_tt, __flush_tlb_one_skas, addr); -} - -void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,  -     unsigned long end) -{ -        CHOOSE_MODE_PROC(flush_tlb_range_tt, flush_tlb_range_skas, vma, start, -                         end); -} - -void flush_tlb_mm(struct mm_struct *mm) -{ -        CHOOSE_MODE_PROC(flush_tlb_mm_tt, flush_tlb_mm_skas, mm); -} - -void force_flush_all(void) -{ -        CHOOSE_MODE(force_flush_all_tt(), force_flush_all_skas()); -} -  pgd_t *pgd_offset_proc(struct mm_struct *mm, unsigned long address)  {          return(pgd_offset(mm, address)); @@ -270,9 +227,9 @@ pte_t *addr_pte(struct task_struct *task, unsigned long addr)  }  int add_mmap(unsigned long virt, unsigned long phys, unsigned long len, -     int r, int w, int x, struct host_vm_op *ops, int index, -     int last_filled, int data, -     void (*do_ops)(int, struct host_vm_op *, int)) +             int r, int w, int x, struct host_vm_op *ops, int index, +             int last_filled, union mm_context *mmu, +             void (*do_ops)(union mm_context *, struct host_vm_op *, int))  {          __u64 offset;  	struct host_vm_op *last; @@ -292,7 +249,7 @@ int add_mmap(unsigned long virt, unsigned long phys, unsigned long len,  	}  	if(index == last_filled){ -		(*do_ops)(data, ops, last_filled); +		(*do_ops)(mmu, ops, last_filled);  		index = -1;  	} @@ -310,8 +267,8 @@ int add_mmap(unsigned long virt, unsigned long phys, unsigned long len,  }  int add_munmap(unsigned long addr, unsigned long len, struct host_vm_op *ops, -	       int index, int last_filled, int data, -	       void (*do_ops)(int, struct host_vm_op *, int)) +	       int index, int last_filled, union mm_context *mmu, +	       void (*do_ops)(union mm_context *, struct host_vm_op *, int))  {  	struct host_vm_op *last; @@ -325,7 +282,7 @@ int add_munmap(unsigned long addr, unsigned long len, struct host_vm_op *ops,  	}  	if(index == last_filled){ -		(*do_ops)(data, ops, last_filled); +		(*do_ops)(mmu, ops, last_filled);  		index = -1;  	} @@ -337,8 +294,9 @@ int add_munmap(unsigned long addr, unsigned long len, struct host_vm_op *ops,  }  int add_mprotect(unsigned long addr, unsigned long len, int r, int w, int x, -		 struct host_vm_op *ops, int index, int last_filled, int data, -		 void (*do_ops)(int, struct host_vm_op *, int)) +                 struct host_vm_op *ops, int index, int last_filled, +                 union mm_context *mmu, +                 void (*do_ops)(union mm_context *, struct host_vm_op *, int))  {  	struct host_vm_op *last; @@ -354,7 +312,7 @@ int add_mprotect(unsigned long addr, unsigned long len, int r, int w, int x,  	}  	if(index == last_filled){ -		(*do_ops)(data, ops, last_filled); +		(*do_ops)(mmu, ops, last_filled);  		index = -1;  	} @@ -367,3 +325,49 @@ int add_mprotect(unsigned long addr, unsigned long len, int r, int w, int x,  						      .x	= x } } });  	return(index);  } + +void flush_tlb_page(struct vm_area_struct *vma, unsigned long address) +{ +        address &= PAGE_MASK; +        flush_tlb_range(vma, address, address + PAGE_SIZE); +} + +void flush_tlb_all(void) +{ +        flush_tlb_mm(current->mm); +} + +void flush_tlb_kernel_range(unsigned long start, unsigned long end) +{ +        CHOOSE_MODE_PROC(flush_tlb_kernel_range_tt, +                         flush_tlb_kernel_range_common, start, end); +} + +void flush_tlb_kernel_vm(void) +{ +        CHOOSE_MODE(flush_tlb_kernel_vm_tt(), +                    flush_tlb_kernel_range_common(start_vm, end_vm)); +} + +void __flush_tlb_one(unsigned long addr) +{ +        CHOOSE_MODE_PROC(__flush_tlb_one_tt, __flush_tlb_one_skas, addr); +} + +void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, +		     unsigned long end) +{ +        CHOOSE_MODE_PROC(flush_tlb_range_tt, flush_tlb_range_skas, vma, start, +                         end); +} + +void flush_tlb_mm(struct mm_struct *mm) +{ +        CHOOSE_MODE_PROC(flush_tlb_mm_tt, flush_tlb_mm_skas, mm); +} + +void force_flush_all(void) +{ +        CHOOSE_MODE(force_flush_all_tt(), force_flush_all_skas()); +} + | 
