2 * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
3 * Licensed under the GPL
6 #include "linux/stddef.h"
7 #include "linux/sched.h"
10 #include "asm/pgtable.h"
12 #include "user_util.h"
17 static void fix_range(struct mm_struct *mm, unsigned long start_addr,
18 unsigned long end_addr, int force)
26 if(mm == NULL) return;
27 fd = mm->context.skas.mm_fd;
28 for(addr = start_addr; addr < end_addr;){
29 npgd = pgd_offset(mm, addr);
30 npmd = pmd_offset(npgd, addr);
31 if(pmd_present(*npmd)){
32 npte = pte_offset_kernel(npmd, addr);
36 if(!pte_dirty(*npte)) w = 0;
37 if(!pte_young(*npte)){
41 if(force || pte_newpage(*npte)){
42 err = unmap(fd, (void *) addr, PAGE_SIZE);
44 panic("munmap failed, errno = %d\n",
46 if(pte_present(*npte))
48 pte_val(*npte) & PAGE_MASK,
51 else if(pte_newprot(*npte)){
52 protect(fd, addr, PAGE_SIZE, r, w, x, 1);
54 *npte = pte_mkuptodate(*npte);
58 if(force || pmd_newpage(*npmd)){
59 err = unmap(fd, (void *) addr, PMD_SIZE);
61 panic("munmap failed, errno = %d\n",
63 pmd_mkuptodate(*npmd);
70 void flush_tlb_kernel_range_skas(unsigned long start, unsigned long end)
80 for(addr = start_vm; addr < end_vm;){
81 pgd = pgd_offset(mm, addr);
82 pmd = pmd_offset(pgd, addr);
83 if(pmd_present(*pmd)){
84 pte = pte_offset_kernel(pmd, addr);
85 if(!pte_present(*pte) || pte_newpage(*pte)){
87 err = os_unmap_memory((void *) addr,
90 panic("munmap failed, errno = %d\n",
94 pte_val(*pte) & PAGE_MASK,
97 else if(pte_newprot(*pte)){
99 protect_memory(addr, PAGE_SIZE, 1, 1, 1, 1);
104 if(pmd_newpage(*pmd)){
106 err = os_unmap_memory((void *) addr, PMD_SIZE);
108 panic("munmap failed, errno = %d\n",
116 void flush_tlb_kernel_vm_skas(void)
118 flush_tlb_kernel_range_skas(start_vm, end_vm);
121 void __flush_tlb_one_skas(unsigned long addr)
123 flush_tlb_kernel_range_skas(addr, addr + PAGE_SIZE);
126 void flush_tlb_range_skas(struct vm_area_struct *vma, unsigned long start,
129 if(vma->vm_mm == NULL)
130 flush_tlb_kernel_range_skas(start, end);
131 else fix_range(vma->vm_mm, start, end, 0);
134 void flush_tlb_mm_skas(struct mm_struct *mm)
136 flush_tlb_kernel_vm_skas();
137 fix_range(mm, 0, host_task_size, 0);
140 void force_flush_all_skas(void)
142 fix_range(current->mm, 0, host_task_size, 1);
146 * Overrides for Emacs so that we follow Linus's tabbing style.
147 * Emacs will notice this stuff at the end of the file and automatically
148 * adjust the settings for this buffer only. This must remain at the end
150 * ---------------------------------------------------------------------------
152 * c-file-style: "linux"