Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 54327
b: refs/heads/master
c: 64f6084
h: refs/heads/master
i:
  54325: 80a91bd
  54323: 23b5aef
  54319: eab44f0
v: v3
  • Loading branch information
Jeff Dike authored and Linus Torvalds committed May 7, 2007
1 parent 66e0d38 commit 6d70089
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8603ec81487a5fefbc29611ff0d635b33b6da990
refs/heads/master: 64f60841c096594b8073e408cd9b40d7d08dcfdd
2 changes: 1 addition & 1 deletion trunk/arch/um/include/os.h
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,7 @@ extern long syscall_stub_data(struct mm_id * mm_idp,
extern int map(struct mm_id * mm_idp, unsigned long virt,
unsigned long len, int r, int w, int x, int phys_fd,
unsigned long long offset, int done, void **data);
extern int unmap(struct mm_id * mm_idp, void *addr, unsigned long len,
extern int unmap(struct mm_id * mm_idp, unsigned long addr, unsigned long len,
int done, void **data);
extern int protect(struct mm_id * mm_idp, unsigned long addr,
unsigned long len, int r, int w, int x, int done,
Expand Down
2 changes: 2 additions & 0 deletions trunk/arch/um/include/skas/mode_kern_skas.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ extern unsigned long set_task_sizes_skas(unsigned long *task_size_out);
extern int start_uml_skas(void);
extern int external_pid_skas(struct task_struct *task);
extern int thread_pid_skas(struct task_struct *task);
extern void flush_tlb_page_skas(struct vm_area_struct *vma,
unsigned long address);

#define kmem_end_skas (host_task_size - 1024 * 1024)

Expand Down
66 changes: 64 additions & 2 deletions trunk/arch/um/kernel/skas/tlb.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@ static int do_ops(union mm_context *mmu, struct host_vm_op *ops, int last,
op->u.mmap.offset, finished, flush);
break;
case MUNMAP:
ret = unmap(&mmu->skas.id,
(void *) op->u.munmap.addr,
ret = unmap(&mmu->skas.id, op->u.munmap.addr,
op->u.munmap.len, finished, flush);
break;
case MPROTECT:
Expand Down Expand Up @@ -94,3 +93,66 @@ void force_flush_all_skas(void)
unsigned long end = proc_mm ? task_size : CONFIG_STUB_START;
fix_range(current->mm, 0, end, 1);
}

void flush_tlb_page_skas(struct vm_area_struct *vma, unsigned long address)
{
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
pte_t *pte;
struct mm_struct *mm = vma->vm_mm;
void *flush = NULL;
int r, w, x, err = 0;
struct mm_id *mm_id;

pgd = pgd_offset(vma->vm_mm, address);
if(!pgd_present(*pgd))
goto kill;

pud = pud_offset(pgd, address);
if(!pud_present(*pud))
goto kill;

pmd = pmd_offset(pud, address);
if(!pmd_present(*pmd))
goto kill;

pte = pte_offset_kernel(pmd, address);

r = pte_read(*pte);
w = pte_write(*pte);
x = pte_exec(*pte);
if (!pte_young(*pte)) {
r = 0;
w = 0;
} else if (!pte_dirty(*pte)) {
w = 0;
}

mm_id = &mm->context.skas.id;
if(pte_newpage(*pte)){
if(pte_present(*pte)){
unsigned long long offset;
int fd;

fd = phys_mapping(pte_val(*pte) & PAGE_MASK, &offset);
err = map(mm_id, address, PAGE_SIZE, r, w, x, fd,
offset, 1, &flush);
}
else err = unmap(mm_id, address, PAGE_SIZE, 1, &flush);
}
else if(pte_newprot(*pte))
err = protect(mm_id, address, PAGE_SIZE, r, w, x, 1, &flush);

if(err)
goto kill;

*pte = pte_mkuptodate(*pte);

return;

kill:
printk("Failed to flush page for address 0x%lx\n", address);
force_sig(SIGKILL, current);
}

4 changes: 3 additions & 1 deletion trunk/arch/um/kernel/tlb.c
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,9 @@ pte_t *addr_pte(struct task_struct *task, unsigned long addr)
void flush_tlb_page(struct vm_area_struct *vma, unsigned long address)
{
address &= PAGE_MASK;
flush_tlb_range(vma, address, address + PAGE_SIZE);

CHOOSE_MODE(flush_tlb_range(vma, address, address + PAGE_SIZE),
flush_tlb_page_skas(vma, address));
}

void flush_tlb_all(void)
Expand Down
4 changes: 2 additions & 2 deletions trunk/arch/um/os-Linux/skas/mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -219,8 +219,8 @@ int map(struct mm_id * mm_idp, unsigned long virt, unsigned long len,
return ret;
}

int unmap(struct mm_id * mm_idp, void *addr, unsigned long len, int done,
void **data)
int unmap(struct mm_id * mm_idp, unsigned long addr, unsigned long len,
int done, void **data)
{
int ret;

Expand Down

0 comments on commit 6d70089

Please sign in to comment.