From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161229AbcFANN3 (ORCPT ); Wed, 1 Jun 2016 09:13:29 -0400 Received: from mail-am1on0116.outbound.protection.outlook.com ([157.56.112.116]:59568 "EHLO emea01-am1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1758256AbcFANN0 (ORCPT ); Wed, 1 Jun 2016 09:13:26 -0400 Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=virtuozzo.com; From: Dmitry Safonov To: , CC: , , , , <0x7f454c46@gmail.com>, , , , , Dmitry Safonov , Andy Lutomirski Subject: [PATCH 2/6] x86/vdso: introduce do_map_vdso() and vdso_type enum Date: Wed, 1 Jun 2016 16:11:33 +0300 Message-ID: <1464786697-20639-3-git-send-email-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.8.2 In-Reply-To: <1464786697-20639-1-git-send-email-dsafonov@virtuozzo.com> References: <1464786697-20639-1-git-send-email-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: AM5PR0901CA0029.eurprd09.prod.outlook.com (10.164.186.167) To DB6PR0801MB1286.eurprd08.prod.outlook.com (10.168.11.16) X-MS-Office365-Filtering-Correlation-Id: 01a7cd13-202f-485c-1de0-08d38a1e7a4c X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1286;2:8HYpca8rCI+jZbJM760Feix0oGkIR5kB47bMnu/iiHR+rQw8PNBNn8mX3kAgkmxlKYI8OQ6TxX1ALU/h+M0WAORnsF/PpNZ5yOU8Och253Ch61Z+47IrgWTUtypCbez6pYNuwjRfjdyVQaAL0QQIN0NhqMFwh+YNmBTSv9KGCN8nHtVe19mdCYgQLnHbRpbT;3:JJYk0zSQFU/Y9/4RSEA2DjnII8kTjXC+nwtN/w26ThWZfqOAjCbqukHZwoDz4qn87mMHnspf8pygY7E2xMSfgno7GqWaiINQFwBZ/F5sJSPkYN2ekI+hHO/462OqnPBW;25:aJMXRateNzQnno6Ic60aS/XXo4NYlFtMbWA9CR24TK/mkdhlbyOObPHvz6F3PAzowQnX+hAwoZ57pu0NuCzRXQBGor9YzwM6QAJGDzgO3E346zQSVjB3yl081119YOO1B+rBFaSOzIt10K+MjeSa/5xaKKoJH2zs8Fys9YCAaC4CeTEih6rDA9MJO6AO8DrmHHRF4i9+rOOvIIG87B9aZsFCQzZEGr63RNNMLKa6kHkRVp8zmvAMRPVitlZgJmc6swXLvdT4FO7SIb9IYSyFAqAOGnJOlO5sSAye8eUrgaaoM0mzfpBnGHc4y8LK49oOV+hiKsdzuNrI4h5W3XRRwyGB7ODKcuY860LP2lejxLgvGFLK8l/Dsx3YI30LSIOOfbBCtBDCJeeZg7xrc0GUoA== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0801MB1286; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040130)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6041072)(6043046);SRVR:DB6PR0801MB1286;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0801MB1286; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1286;4:IGX6XKj7KSfnGMLK2BKeNAAn9CjmijdbgyUL24gPmjqgUF2KrloGpRU0NFhS06BGyx3bjTmfIctl841TtBOML6sNxQgtXQDHn+dqfZl4sFX833uksbIIYVN4eST+nXK07HtwRtZaE7wv8eAsUHy/hxlbL9xPjmMQCse61TIEz7ReEdwT61QIt8Ho51LDUfG15lzwfgqw9W9PJTWv1TZRhf/GqPbUim6ukkV+mLF6Vk00KXSZ4C1raiO12SvpL2OO+8dURMxMcIKkBowiF2KEdEwlQkan8mXGE1Zcw3a+nYDbIPlDmpjovbEqGRkCj41/LwpBcoWEDvUDX4g7I90ucob7J0fz+pZSTv2AzleftIr9rMCXtcr6UnCAhqSTaLgfS9JfvcrGe1slbiAncV/cR5iSby8wvNk8ysFTfVFLEFQ= X-Forefront-PRVS: 096029FF66 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(189998001)(5008740100001)(19580405001)(229853001)(19580395003)(8676002)(77096005)(33646002)(53416004)(5001770100001)(42186005)(5003940100001)(81166006)(586003)(50466002)(48376002)(6116002)(86362001)(66066001)(36756003)(47776003)(2950100001)(50986999)(50226002)(92566002)(3846002)(4326007)(76176999)(5004730100002)(2906002);DIR:OUT;SFP:1102;SCL:1;SRVR:DB6PR0801MB1286;H:dsafonov.sw.ru;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1286;23:g6q+MdlpLEzwGHWEpFIhHMP+cl5okfICrl3hmmfvWZDb0Mrne4txBV9aCPRRf4CcygfOnj0LXbuHt49BEby8UuhtZTSco/1zmT5lztFSrVPFhFvlEJGE0SVUzBMZFTRtE6ev1rcbQ+RC0kGrx7cY0l1oLzzprUfY4feJlcj12V/OaKp4NycD2voDj67N/kXkOeF+Axwsenip5x+5cwkEPal7GpJbq3/A5wQhW5EhYFN9UdfvVuTv0+uP1JdLIEblpRdHtkE7nEx5qhJEcYrJJMg629JvIrRq8uQuwlm2F5R8VzFIYSuhePtrNOqxKTKD9Ut/ZMUPP7HaAHWweh30w7V2QYmSMgevcuxrVJrBNQCMVwUdgQDH92fHshviuME9JSgJYe38v4FhA/lkj2MOIWuiYb+1TkkHg3KIC9htLnMrYf9S88LauyTmCAGzQQZe5ON9FZGGcScZ5MXOj6qisUh9C4sjLgWLq/1kV88zgiObNc/mE7C35SEjv5xHQU4tJmUX/GuzzQaG8yG8AV6ri3cDEkr0uoYjLXwz0dQOGRXVkIsUwLRbfIg7rPYH04xCgZml9pN/OFK13CZZLuqT840OA5F2YirhTC5ihWc2JL8Fdtf8ir5fgTqQQi8/60K79xpusKpCjLpR4FI9T5jAm/JHktay6dC8gbpCHJbGkh7Jdqikpz5If6H/q71O9BHkLYp+dDlk5wxur5Nn5WYQ+LNhyE7Dglo+EkR2+Jg2E3TR/MeM4xAVmmcMi9B1GuQK0ctvNe/Hnfter17mtm5tVQ49cBz+OLJk9PkTEsgc5knVgp+rB+mSdJA6MwXgQ4E0wivukm3TBPenHd12eWSruS8QfvnxjCVpB+gIjbMvXXooMiOwhFUTLAYRNhaPF7KsTnSSKxTWaFw2pdmlgxuvcg== X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1286;5:UpqKumT2P+Yy4te5aeyhCkWxIcvmOjvDskNVgZ2VMt+kJmbZlTQBJbIiedJHcUC0hL+WDsTfg16Gj8QBxp2k42ugQ6E1ZgUpkxLBd7pKtlDw/UlC7N02MwRC1FlehtDqzYEalnblObcq2+/u+hjENw==;24:qJANa3CC9/UZ/rbCtUehhzDkV8FaAHKZOrU7+hmspXlSDiJH8JEo0jGzL0k0OPy4z80jy2w7TlBvZ7SeFrJYUJFG3P1gll6dBt/5Eimjooc=;7:ND/Q+rZy31squPqsLm3Zn1eFilE8OBE4HYGBAxA2OGI4MaRu9/3mev8uI+iljL0XjEnQvWhgV95P3335LBK3auFOSE1MBRR9yYUrPalgp2UtfDmb4ttm/icqhVvNTDnlffqd0F4L7wg2xs/1jevSjZ1KbAIUUDb9+mI/MPkK7HnS3Pbp1UDZ23URZoozkecy;20:SHaS0O1MbueVlLU9nLqOQMERUAdcnegL8HIsD88eZK5ax0pe6DZnYUk1LOHZfMs98HzTPXxjyiFN66Z1xNOQOyFwySUlbSvPKr0+JWVNWCV6Q75BhtWfSKt4zCC7xlBPgSRTZPBOy3lJJLNW3wfar1EGnt3B6xXaWQ11rHMLTV8= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jun 2016 13:13:08.1238 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0801MB1286 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Make in-kernel API to map vDSO blobs on x86. Cc: Andy Lutomirski Cc: Ingo Molnar Cc: Thomas Gleixner Cc: "H. Peter Anvin" Signed-off-by: Dmitry Safonov --- 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.8.2