Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e49edb8d authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ARM: fix a cockup in 48be69a02 (ARM: move signal handlers into a vdso-like page)"

parents 0ffeb918 0374f5ed
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -616,17 +616,18 @@ const char *arch_vma_name(struct vm_area_struct *vma)
		return NULL;
}

static struct page *signal_page;
extern struct page *get_signal_page(void);

int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
{
	struct mm_struct *mm = current->mm;
	struct page *page;
	unsigned long addr;
	int ret;

	page = get_signal_page();
	if (!page)
	if (!signal_page)
		signal_page = get_signal_page();
	if (!signal_page)
		return -ENOMEM;

	down_write(&mm->mmap_sem);
@@ -638,7 +639,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)

	ret = install_special_mapping(mm, addr, PAGE_SIZE,
		VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC,
		&page);
		&signal_page);

	if (ret == 0)
		mm->context.sigpage = addr;
+19 −22
Original line number Diff line number Diff line
@@ -610,21 +610,19 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
	return 0;
}

static struct page *signal_page;

struct page *get_signal_page(void)
{
	if (!signal_page) {
	unsigned long ptr;
	unsigned offset;
	struct page *page;
	void *addr;

		signal_page = alloc_pages(GFP_KERNEL, 0);
	page = alloc_pages(GFP_KERNEL, 0);

		if (!signal_page)
	if (!page)
		return NULL;

		addr = page_address(signal_page);
	addr = page_address(page);

	/* Give the signal return code some randomness */
	offset = 0x200 + (get_random_int() & 0x7fc);
@@ -638,7 +636,6 @@ struct page *get_signal_page(void)

	ptr = (unsigned long)addr + offset;
	flush_icache_range(ptr, ptr + sizeof(sigreturn_codes));
	}

	return signal_page;
	return page;
}