From: Dmitry Safonov <dsafonov@virtuozzo.com>
To: linux-kernel@vger.kernel.org
Cc: 0x7f454c46@gmail.com, linux-mm@kvack.org, mingo@redhat.com,
luto@amacapital.net, gorcunov@openvz.org, xemul@virtuozzo.com,
oleg@redhat.com, Dmitry Safonov <dsafonov@virtuozzo.com>,
Andy Lutomirski <luto@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
"H. Peter Anvin" <hpa@zytor.com>,
x86@kernel.org
Subject: [PATCHv2 2/6] x86/vdso: introduce do_map_vdso() and vdso_type enum
Date: Wed, 29 Jun 2016 13:57:32 +0300 [thread overview]
Message-ID: <20160629105736.15017-3-dsafonov@virtuozzo.com> (raw)
In-Reply-To: <20160629105736.15017-1-dsafonov@virtuozzo.com>
Make in-kernel API to map vDSO blobs on x86.
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Pavel Emelyanov <xemul@virtuozzo.com>
Cc: x86@kernel.org
Signed-off-by: Dmitry Safonov <dsafonov@virtuozzo.com>
---
arch/x86/entry/vdso/vma.c | 70 +++++++++++++++++++++++++--------------------
arch/x86/include/asm/vdso.h | 4 +++
2 files changed, 43 insertions(+), 31 deletions(-)
diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c
index 387028e6755d..4017b60eed33 100644
--- a/arch/x86/entry/vdso/vma.c
+++ b/arch/x86/entry/vdso/vma.c
@@ -176,11 +176,18 @@ static int vvar_fault(const struct vm_special_mapping *sm,
return VM_FAULT_SIGBUS;
}
-static int map_vdso(const struct vdso_image *image, bool calculate_addr)
+/*
+ * Add vdso and vvar mappings to current process.
+ * @image - blob to map
+ * @addr - request a specific address (zero to map at free addr)
+ * @calculate_addr - turn on aslr (@addr will be ignored)
+ */
+static int map_vdso(const struct vdso_image *image,
+ unsigned long addr, bool calculate_addr)
{
struct mm_struct *mm = current->mm;
struct vm_area_struct *vma;
- unsigned long addr, text_start;
+ unsigned long text_start;
int ret = 0;
static const struct vm_special_mapping vdso_mapping = {
@@ -193,12 +200,9 @@ static int map_vdso(const struct vdso_image *image, bool calculate_addr)
.fault = vvar_fault,
};
- if (calculate_addr) {
+ if (calculate_addr)
addr = vdso_addr(current->mm->start_stack,
image->size - image->sym_vvar_start);
- } else {
- addr = 0;
- }
if (down_write_killable(&mm->mmap_sem))
return -EINTR;
@@ -249,48 +253,52 @@ up_fail:
return ret;
}
-#if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION)
-static int load_vdso32(void)
+int do_map_vdso(vdso_type type, unsigned long addr, bool randomize_addr)
{
- if (vdso32_enabled != 1) /* Other values all mean "disabled" */
- return 0;
-
- return map_vdso(&vdso_image_32, false);
-}
+ switch (type) {
+#if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION)
+ case VDSO_32:
+ if (vdso32_enabled != 1) /* Other values all mean "disabled" */
+ return 0;
+ /* vDSO aslr turned off for i386 vDSO */
+ return map_vdso(&vdso_image_32, addr, false);
+#endif
+#ifdef CONFIG_X86_64
+ case VDSO_64:
+ if (!vdso64_enabled)
+ return 0;
+ return map_vdso(&vdso_image_64, addr, randomize_addr);
+#endif
+#ifdef CONFIG_X86_X32_ABI
+ case VDSO_X32:
+ if (!vdso64_enabled)
+ return 0;
+ return map_vdso(&vdso_image_x32, addr, randomize_addr);
#endif
+ default:
+ return -EINVAL;
+ }
+}
#ifdef CONFIG_X86_64
int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
{
- if (!vdso64_enabled)
- return 0;
-
- return map_vdso(&vdso_image_64, true);
+ return do_map_vdso(VDSO_64, 0, true);
}
#ifdef CONFIG_COMPAT
int compat_arch_setup_additional_pages(struct linux_binprm *bprm,
int uses_interp)
{
-#ifdef CONFIG_X86_X32_ABI
- if (test_thread_flag(TIF_X32)) {
- if (!vdso64_enabled)
- return 0;
-
- return map_vdso(&vdso_image_x32, true);
- }
-#endif
-#ifdef CONFIG_IA32_EMULATION
- return load_vdso32();
-#else
- return 0;
-#endif
+ if (test_thread_flag(TIF_X32))
+ return do_map_vdso(VDSO_X32, 0, true);
+ return do_map_vdso(VDSO_32, 0, false);
}
#endif
#else
int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
{
- return load_vdso32();
+ return do_map_vdso(VDSO_32, 0, false);
}
#endif
diff --git a/arch/x86/include/asm/vdso.h b/arch/x86/include/asm/vdso.h
index 43dc55be524e..2be137897842 100644
--- a/arch/x86/include/asm/vdso.h
+++ b/arch/x86/include/asm/vdso.h
@@ -41,6 +41,10 @@ extern const struct vdso_image vdso_image_32;
extern void __init init_vdso_image(const struct vdso_image *image);
+typedef enum { VDSO_32, VDSO_64, VDSO_X32 } vdso_type;
+
+extern int do_map_vdso(vdso_type type, unsigned long addr, bool randomize_addr);
+
#endif /* __ASSEMBLER__ */
#endif /* _ASM_X86_VDSO_H */
--
2.9.0
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
WARNING: multiple messages have this Message-ID (diff)
From: Dmitry Safonov <dsafonov@virtuozzo.com>
To: <linux-kernel@vger.kernel.org>
Cc: <0x7f454c46@gmail.com>, <linux-mm@kvack.org>, <mingo@redhat.com>,
<luto@amacapital.net>, <gorcunov@openvz.org>,
<xemul@virtuozzo.com>, <oleg@redhat.com>,
Dmitry Safonov <dsafonov@virtuozzo.com>,
Andy Lutomirski <luto@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
"H. Peter Anvin" <hpa@zytor.com>, <x86@kernel.org>
Subject: [PATCHv2 2/6] x86/vdso: introduce do_map_vdso() and vdso_type enum
Date: Wed, 29 Jun 2016 13:57:32 +0300 [thread overview]
Message-ID: <20160629105736.15017-3-dsafonov@virtuozzo.com> (raw)
In-Reply-To: <20160629105736.15017-1-dsafonov@virtuozzo.com>
Make in-kernel API to map vDSO blobs on x86.
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Pavel Emelyanov <xemul@virtuozzo.com>
Cc: x86@kernel.org
Signed-off-by: Dmitry Safonov <dsafonov@virtuozzo.com>
---
arch/x86/entry/vdso/vma.c | 70 +++++++++++++++++++++++++--------------------
arch/x86/include/asm/vdso.h | 4 +++
2 files changed, 43 insertions(+), 31 deletions(-)
diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c
index 387028e6755d..4017b60eed33 100644
--- a/arch/x86/entry/vdso/vma.c
+++ b/arch/x86/entry/vdso/vma.c
@@ -176,11 +176,18 @@ static int vvar_fault(const struct vm_special_mapping *sm,
return VM_FAULT_SIGBUS;
}
-static int map_vdso(const struct vdso_image *image, bool calculate_addr)
+/*
+ * Add vdso and vvar mappings to current process.
+ * @image - blob to map
+ * @addr - request a specific address (zero to map at free addr)
+ * @calculate_addr - turn on aslr (@addr will be ignored)
+ */
+static int map_vdso(const struct vdso_image *image,
+ unsigned long addr, bool calculate_addr)
{
struct mm_struct *mm = current->mm;
struct vm_area_struct *vma;
- unsigned long addr, text_start;
+ unsigned long text_start;
int ret = 0;
static const struct vm_special_mapping vdso_mapping = {
@@ -193,12 +200,9 @@ static int map_vdso(const struct vdso_image *image, bool calculate_addr)
.fault = vvar_fault,
};
- if (calculate_addr) {
+ if (calculate_addr)
addr = vdso_addr(current->mm->start_stack,
image->size - image->sym_vvar_start);
- } else {
- addr = 0;
- }
if (down_write_killable(&mm->mmap_sem))
return -EINTR;
@@ -249,48 +253,52 @@ up_fail:
return ret;
}
-#if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION)
-static int load_vdso32(void)
+int do_map_vdso(vdso_type type, unsigned long addr, bool randomize_addr)
{
- if (vdso32_enabled != 1) /* Other values all mean "disabled" */
- return 0;
-
- return map_vdso(&vdso_image_32, false);
-}
+ switch (type) {
+#if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION)
+ case VDSO_32:
+ if (vdso32_enabled != 1) /* Other values all mean "disabled" */
+ return 0;
+ /* vDSO aslr turned off for i386 vDSO */
+ return map_vdso(&vdso_image_32, addr, false);
+#endif
+#ifdef CONFIG_X86_64
+ case VDSO_64:
+ if (!vdso64_enabled)
+ return 0;
+ return map_vdso(&vdso_image_64, addr, randomize_addr);
+#endif
+#ifdef CONFIG_X86_X32_ABI
+ case VDSO_X32:
+ if (!vdso64_enabled)
+ return 0;
+ return map_vdso(&vdso_image_x32, addr, randomize_addr);
#endif
+ default:
+ return -EINVAL;
+ }
+}
#ifdef CONFIG_X86_64
int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
{
- if (!vdso64_enabled)
- return 0;
-
- return map_vdso(&vdso_image_64, true);
+ return do_map_vdso(VDSO_64, 0, true);
}
#ifdef CONFIG_COMPAT
int compat_arch_setup_additional_pages(struct linux_binprm *bprm,
int uses_interp)
{
-#ifdef CONFIG_X86_X32_ABI
- if (test_thread_flag(TIF_X32)) {
- if (!vdso64_enabled)
- return 0;
-
- return map_vdso(&vdso_image_x32, true);
- }
-#endif
-#ifdef CONFIG_IA32_EMULATION
- return load_vdso32();
-#else
- return 0;
-#endif
+ if (test_thread_flag(TIF_X32))
+ return do_map_vdso(VDSO_X32, 0, true);
+ return do_map_vdso(VDSO_32, 0, false);
}
#endif
#else
int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
{
- return load_vdso32();
+ return do_map_vdso(VDSO_32, 0, false);
}
#endif
diff --git a/arch/x86/include/asm/vdso.h b/arch/x86/include/asm/vdso.h
index 43dc55be524e..2be137897842 100644
--- a/arch/x86/include/asm/vdso.h
+++ b/arch/x86/include/asm/vdso.h
@@ -41,6 +41,10 @@ extern const struct vdso_image vdso_image_32;
extern void __init init_vdso_image(const struct vdso_image *image);
+typedef enum { VDSO_32, VDSO_64, VDSO_X32 } vdso_type;
+
+extern int do_map_vdso(vdso_type type, unsigned long addr, bool randomize_addr);
+
#endif /* __ASSEMBLER__ */
#endif /* _ASM_X86_VDSO_H */
--
2.9.0
next prev parent reply other threads:[~2016-06-29 10:59 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-29 10:57 [PATCHv2 0/6] x86: 32-bit compatible C/R on x86_64 Dmitry Safonov
2016-06-29 10:57 ` Dmitry Safonov
2016-06-29 10:57 ` [PATCHv2 1/6] x86/vdso: unmap vdso blob on vvar mapping failure Dmitry Safonov
2016-06-29 10:57 ` Dmitry Safonov
2016-07-06 14:16 ` Andy Lutomirski
2016-07-06 14:16 ` Andy Lutomirski
2016-06-29 10:57 ` Dmitry Safonov [this message]
2016-06-29 10:57 ` [PATCHv2 2/6] x86/vdso: introduce do_map_vdso() and vdso_type enum Dmitry Safonov
2016-07-06 14:21 ` Andy Lutomirski
2016-07-06 14:21 ` Andy Lutomirski
2016-07-07 11:04 ` Dmitry Safonov
2016-07-07 11:04 ` Dmitry Safonov
2016-06-29 10:57 ` [PATCHv2 3/6] x86/arch_prctl/vdso: add ARCH_MAP_VDSO_* Dmitry Safonov
2016-06-29 10:57 ` Dmitry Safonov
2016-07-06 14:30 ` Andy Lutomirski
2016-07-06 14:30 ` Andy Lutomirski
2016-07-07 11:11 ` Dmitry Safonov
2016-07-07 11:11 ` Dmitry Safonov
2016-07-10 12:44 ` Andy Lutomirski
2016-07-10 12:44 ` Andy Lutomirski
2016-07-11 18:26 ` Oleg Nesterov
2016-07-11 18:26 ` Oleg Nesterov
2016-07-11 18:28 ` Andy Lutomirski
2016-07-11 18:28 ` Andy Lutomirski
2016-07-12 14:14 ` Oleg Nesterov
2016-07-12 14:14 ` Oleg Nesterov
2016-08-02 10:59 ` Dmitry Safonov
2016-08-02 10:59 ` Dmitry Safonov
2016-08-10 8:35 ` Andy Lutomirski
2016-08-10 8:35 ` Andy Lutomirski
2016-08-10 10:49 ` Dmitry Safonov
2016-08-10 10:49 ` Dmitry Safonov
2016-06-29 10:57 ` [PATCHv2 4/6] x86/coredump: use pr_reg size, rather that TIF_IA32 flag Dmitry Safonov
2016-06-29 10:57 ` Dmitry Safonov
2016-06-29 10:57 ` Dmitry Safonov
2016-06-29 10:57 ` [PATCHv2 5/6] x86/ptrace: down with test_thread_flag(TIF_IA32) Dmitry Safonov
2016-06-29 10:57 ` Dmitry Safonov
2016-07-06 14:32 ` Andy Lutomirski
2016-07-06 14:32 ` Andy Lutomirski
2016-06-29 10:57 ` [PATCHv2 6/6] x86/signal: add SA_{X32,IA32}_ABI sa_flags Dmitry Safonov
2016-06-29 10:57 ` Dmitry Safonov
2016-07-06 14:36 ` Andy Lutomirski
2016-07-06 14:36 ` Andy Lutomirski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160629105736.15017-3-dsafonov@virtuozzo.com \
--to=dsafonov@virtuozzo.com \
--cc=0x7f454c46@gmail.com \
--cc=gorcunov@openvz.org \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=luto@amacapital.net \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=oleg@redhat.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
--cc=xemul@virtuozzo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.