int init_new_context(struct task_struct *task, struct mm_struct *mm) { struct mm_context *from_mm = NULL; struct mm_context *to_mm = &mm->context; unsigned long stack = 0; int ret = -ENOMEM; if (skas_needs_stub) { stack = get_zeroed_page(GFP_KERNEL); if (stack == 0) goto out; } to_mm->id.stack = stack; if (current->mm != NULL && current->mm != &init_mm) from_mm = ¤t->mm->context; if (proc_mm) { ret = new_mm(stack); if (ret < 0) { printk(KERN_ERR "init_new_context_skas - " "new_mm failed, errno = %d\n", ret); goto out_free; } to_mm->id.u.mm_fd = ret; } else { if (from_mm) to_mm->id.u.pid = copy_context_skas0(stack, from_mm->id.u.pid); else to_mm->id.u.pid = start_userspace(stack); if (to_mm->id.u.pid < 0) { ret = to_mm->id.u.pid; goto out_free; } } ret = init_new_ldt(to_mm, from_mm); if (ret < 0) { printk(KERN_ERR "init_new_context_skas - init_ldt" " failed, errno = %d\n", ret); goto out_free; } return 0; out_free: if (to_mm->id.stack != 0) free_page(to_mm->id.stack); out: return ret; }
int init_new_context_skas(struct task_struct *task, struct mm_struct *mm) { struct mmu_context_skas *from_mm = NULL; struct mmu_context_skas *to_mm = &mm->context.skas; unsigned long stack = 0; int ret = -ENOMEM; if(skas_needs_stub){ stack = get_zeroed_page(GFP_KERNEL); if(stack == 0) goto out; /* This zeros the entry that pgd_alloc didn't, needed since * we are about to reinitialize it, and want mm.nr_ptes to * be accurate. */ mm->pgd[USER_PTRS_PER_PGD] = __pgd(0); ret = init_stub_pte(mm, CONFIG_STUB_CODE, (unsigned long) &__syscall_stub_start); if(ret) goto out_free; ret = init_stub_pte(mm, CONFIG_STUB_DATA, stack); if(ret) goto out_free; mm->nr_ptes--; } to_mm->id.stack = stack; if(current->mm != NULL && current->mm != &init_mm) from_mm = ¤t->mm->context.skas; if(proc_mm){ ret = new_mm(stack); if(ret < 0){ printk("init_new_context_skas - new_mm failed, " "errno = %d\n", ret); goto out_free; } to_mm->id.u.mm_fd = ret; } else { if(from_mm) to_mm->id.u.pid = copy_context_skas0(stack, from_mm->id.u.pid); else to_mm->id.u.pid = start_userspace(stack); } ret = init_new_ldt(to_mm, from_mm); if(ret < 0){ printk("init_new_context_skas - init_ldt" " failed, errno = %d\n", ret); goto out_free; } return 0; out_free: if(to_mm->id.stack != 0) free_page(to_mm->id.stack); out: return ret; }