|
@@ -91,6 +91,8 @@ int init_new_context(struct task_struct *task, struct mm_struct *mm)
|
|
goto out_free;
|
|
goto out_free;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ to_mm->stub_pages = NULL;
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
out_free:
|
|
out_free:
|
|
@@ -126,6 +128,7 @@ void arch_dup_mmap(struct mm_struct *oldmm, struct mm_struct *mm)
|
|
|
|
|
|
pages[0] = virt_to_page(&__syscall_stub_start);
|
|
pages[0] = virt_to_page(&__syscall_stub_start);
|
|
pages[1] = virt_to_page(mm->context.id.stack);
|
|
pages[1] = virt_to_page(mm->context.id.stack);
|
|
|
|
+ mm->context.stub_pages = pages;
|
|
|
|
|
|
/* dup_mmap already holds mmap_sem */
|
|
/* dup_mmap already holds mmap_sem */
|
|
err = install_special_mapping(mm, STUB_START, STUB_END - STUB_START,
|
|
err = install_special_mapping(mm, STUB_START, STUB_END - STUB_START,
|
|
@@ -147,6 +150,8 @@ void arch_exit_mmap(struct mm_struct *mm)
|
|
{
|
|
{
|
|
pte_t *pte;
|
|
pte_t *pte;
|
|
|
|
|
|
|
|
+ if (mm->context.stub_pages != NULL)
|
|
|
|
+ kfree(mm->context.stub_pages);
|
|
pte = virt_to_pte(mm, STUB_CODE);
|
|
pte = virt_to_pte(mm, STUB_CODE);
|
|
if (pte != NULL)
|
|
if (pte != NULL)
|
|
pte_clear(mm, STUB_CODE, pte);
|
|
pte_clear(mm, STUB_CODE, pte);
|