- if(mm == NULL) return;
- fd = mm->context.skas.mm_fd;
- for(addr = start_addr; addr < end_addr;){
- npgd = pgd_offset(mm, addr);
- npmd = pmd_offset(npgd, addr);
- if(pmd_present(*npmd)){
- npte = pte_offset_kernel(npmd, addr);
- r = pte_read(*npte);
- w = pte_write(*npte);
- x = pte_exec(*npte);
- if(!pte_dirty(*npte)) w = 0;
- if(!pte_young(*npte)){
- r = 0;
- w = 0;
- }
- if(force || pte_newpage(*npte)){
- err = unmap(fd, (void *) addr, PAGE_SIZE);
- if(err < 0)
- panic("munmap failed, errno = %d\n",
- -err);
- if(pte_present(*npte))
- map(fd, addr,
- pte_val(*npte) & PAGE_MASK,
- PAGE_SIZE, r, w, x);
- }
- else if(pte_newprot(*npte)){
- protect(fd, addr, PAGE_SIZE, r, w, x, 1);
- }
- *npte = pte_mkuptodate(*npte);
- addr += PAGE_SIZE;
- }
- else {
- if(force || pmd_newpage(*npmd)){
- err = unmap(fd, (void *) addr, PMD_SIZE);
- if(err < 0)
- panic("munmap failed, errno = %d\n",
- -err);
- pmd_mkuptodate(*npmd);
- }
- addr += PMD_SIZE;
+ for(i = 0; i <= last && !ret; i++){
+ op = &ops[i];
+ switch(op->type){
+ case MMAP:
+ ret = map(&mmu->skas.id, op->u.mmap.addr,
+ op->u.mmap.len, op->u.mmap.r, op->u.mmap.w,
+ op->u.mmap.x, op->u.mmap.fd,
+ op->u.mmap.offset, finished, flush);
+ break;
+ case MUNMAP:
+ ret = unmap(&mmu->skas.id,
+ (void *) op->u.munmap.addr,
+ op->u.munmap.len, finished, flush);
+ break;
+ case MPROTECT:
+ ret = protect(&mmu->skas.id, op->u.mprotect.addr,
+ op->u.mprotect.len, op->u.mprotect.r,
+ op->u.mprotect.w, op->u.mprotect.x,
+ finished, flush);
+ break;
+ default:
+ printk("Unknown op type %d in do_ops\n", op->type);
+ break;