From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752469AbcF1LiV (ORCPT ); Tue, 28 Jun 2016 07:38:21 -0400 Received: from mail-db3on0122.outbound.protection.outlook.com ([157.55.234.122]:21403 "EHLO emea01-db3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752466AbcF1LhG (ORCPT ); Tue, 28 Jun 2016 07:37:06 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=dsafonov@virtuozzo.com; From: Dmitry Safonov To: CC: <0x7f454c46@gmail.com>, , , , Dmitry Safonov , Thomas Gleixner , "H. Peter Anvin" , Shuah Khan , , Subject: [PATCHv10 2/2] selftest/x86: add mremap vdso test Date: Tue, 28 Jun 2016 14:35:39 +0300 Message-ID: <20160628113539.13606-3-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20160628113539.13606-1-dsafonov@virtuozzo.com> References: <20160628113539.13606-1-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: AMSPR02CA0032.eurprd02.prod.outlook.com (10.242.225.160) To HE1PR0801MB1737.eurprd08.prod.outlook.com (10.168.149.149) X-MS-Office365-Filtering-Correlation-Id: df298bc1-5836-4c2a-3373-08d39f488510 X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1737;2:GYtSTwFjAeI3juqofgnatb+LLl1aiDCzVi+R/QSe8Dgos2cvQmah+856n9tQ15EXAkOTZlmyLnoLU8RpSjv3SuxmcO05OL/kEUUNb+fi19+UEJ4mwpPiKJZnOBgiJkhqBOpEQzdJHaPnZ15QVS2exUssgFyZ/qcSke0HMZNgstLQI+WoeGdQNMEd3kBl2Sp6;3:QuoPwJ2B8jiSkfhcAGlaXPtseb2n8/Vs9HMJ15aES33muGx3rgJCs1EEJ0LvGmFvVigtNOFM5zasOFHmdespDUxWcubWBTmFG13Vn30EkoZcWyC6YRxYLpEQyDiEmZmy X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:HE1PR0801MB1737; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1737;25:GA9UXjF6vUQg05E8gTcEPPTWg9xA1a9011HO4hVQFv2hzlMVHKphYcCpqeCW5BF02oDgtzCnyX288cEqpt/Ce/j9A3g2dUMoGCMyYKScE7GTJ8tQt54s5wPA6+yYMCvK7AAdQG5ffxCVBfZw7sjMpqPdeFuxtzzwcaI6Plj57QRd2+5wBLh8fvwsKlcc8lvj7R2z1aQBeW9Jli6c8NJ6RFnfyFSm7mY1JWD63D3GDGgjw5CQKjrf4u3bdnFHMQ2ydJ6oUpMkUg5mz1MwoBi7Dt4ELpYwWOBsHDv7yNDiZMzKNmfQs9bpNj20xAmT8wBZyR22bx5/FtujdfCS54lMLxG/Gou/RiDqKbxl7Nz3DuCSstwl4I8zR0MmqWoWoqPPRSWulTopghfsp4qkDDVUesecAuKGFcgb0V376O51s9rcMz5Dz48TuWSznxCKQMAdkARGLRnt+dXiBbYMwe0X2tTNdBj+vlx7fcWCzmdQBwKaIWt8dCCGwnj9xj8Q5A3ZnvspJWn3+dUnqb32TrRF65SlMKuDEfJT6j6Ejv9cRqAJhdwqYcRJt37acDw8VkK9qmiCeH2QVnfa4otg+BLdBLvJt/wGemBbHh3vV7trGaUX3EbhWKrvqyen5Z6OtquxAcAlcPkRqP9YK5tibEu/Q+R/O+8ypDutw2pJrZNf58JLxq97YjwuLMoYlt5S/0eem1IFhA1INNkdpP2jwvZFPQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(9452136761055)(265634631926514)(7411616537696); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040130)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6041072)(6043046);SRVR:HE1PR0801MB1737;BCL:0;PCL:0;RULEID:;SRVR:HE1PR0801MB1737; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1737;4:KnBg0T/tGVCOc4bRCX9LmiZP6/NQtPHrJcyijSPpmuzzUkQAbQEQjysF404ioio16fUCLBflmrhsqqezQaqy1D1HT0XSeWsrUtTpsb5oIT+xvstKMh9CmAp/IVA1YZkPYxFsILIuiUC2Dmw+TCEdJJKn80zzo9XaJrbv+2pGMkvQ6VCImrxd37JIYzxwJ8hTWslveaT9AA4Juc7L22VRiJ5fs9LLgYYExABYEPPELizi86AC/viLx0ZIH6Bp0GT2tGLD3EKwyiTqc87fr7BXwJ7OSuXHLXXQeQule8DsfEXZwoAEbhFMz4eKLs+Y0Q1lXA3DNtBCUGrz2AJgx8szJdPnLLGC352qP3t3TGiuUsSciAObKggmcTxbFOeOTS3AjdkJ+SRNWajFjZU2xt49DnOuauGrIkbuAc/2ncLllGH6skHzbFr6qhKUCu01kDI/8A1Mizp8koDrh+UTylXCaDUOKegZGOPYoVndYYJwuu8oXo9k8MSZX5QiWsc9VKkhN+l6P0n/O6U1fA9Uq4+Tio4RuMs6yT2Nt//I12g2WBg= X-Forefront-PRVS: 0987ACA2E2 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(199003)(189002)(3846002)(105586002)(586003)(92566002)(53416004)(6116002)(5003940100001)(69596002)(19580405001)(19580395003)(7736002)(305945005)(81156014)(77096005)(81166006)(106356001)(8676002)(66066001)(47776003)(42186005)(1076002)(68736007)(33646002)(76176999)(7846002)(50466002)(97736004)(50226002)(229853001)(2906002)(101416001)(2351001)(2950100001)(110136002)(48376002)(4326007)(36756003)(189998001)(86362001)(50986999)(2004002);DIR:OUT;SFP:1102;SCL:1;SRVR:HE1PR0801MB1737;H:dsafonov.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;HE1PR0801MB1737;23:8krIt5/8kFhCUNmd940wpkz9Xa2mHjJbPrquwPU?= =?us-ascii?Q?JShVg/qHCtjITuNgaRwO4JUypcgHCxMR0XPi8s9mSWcmPIkZFXzr4QdqoHv+?= =?us-ascii?Q?9nurQRVVq8JuwBuGF27k2Ql1Aodt9OpOT1HjlxSuxu+0y+wBZH0RAg85EUwY?= =?us-ascii?Q?PsblaqJJCfpnGtaUeeouI/gLcizR4K6GXU/hHuUpZgmUpirmE6vqZZ/3+OJM?= =?us-ascii?Q?+OzeC+A3UEK5g+sew3jiQ/kUund1n181AomfYscGJCNT8pruTEwCib3L4w8J?= =?us-ascii?Q?GUR/ev7XbkeRFk8kqrtP082FiZXg9YnY+5vvjMWB2dSHFy4Vr3WjJXRXR25v?= =?us-ascii?Q?gmowflmgtkQZvRsEvZFrZom7kbb4rtqSzpCisQa9T4onOolQoCUVGOHPZFUo?= =?us-ascii?Q?Nx9Mb0b/1CGd03LHTojJvK5PSQ9zdT67oj1hzVyQIdTbm4o3OtdmadQxakaf?= =?us-ascii?Q?DQHoJRuY76OAwbANv+hWmEFfCqPJ2fO1TU9PqmWd/ecZaKSeSdgUTZEvPkCN?= =?us-ascii?Q?CauEvQbugB1LqgxJJB7qx+wG9x3obnYVCQZ0o0VjURZoxRheQvJVHoIEsR96?= =?us-ascii?Q?hCzWF3V3bkBwQ+jyth0qor/YU9CArmHJGa7+9fnvcVEUk2wS7Bjhb12wJzTR?= =?us-ascii?Q?8pQLn1yEAQghHeYvmr3kZ7ncCJh9b8Gonr3lvMZZsn+vQEFfo04YOzNGyNW9?= =?us-ascii?Q?0z+d1mLQGhjJWdIy+DZ9CKwOicIJ4nZL1ZqHEEPJYiwv5N1Jy5OB6895sXsf?= =?us-ascii?Q?dl1kbzrFHEylrlL6iUnUB7YnDr71w9WDVaM5wbN6hZOKClttWXu29/E8TZPn?= =?us-ascii?Q?dgEd3Z4IgRd4689POjPqS+xyjkrW8blQn2+1ztnOsjrzmPpyocQIgDe0pi0D?= =?us-ascii?Q?HcVzbsboOA8smztDf0tREjmZ4unS7Y7qBuNxrC0a/b7tKDQ3IRnY6ZlAiIwo?= =?us-ascii?Q?Tc3YG79Lvg3hzJNi/TN31RXPE7n/eUPcMy8GichkizZSy/c7TpjlsyCu0Tq8?= =?us-ascii?Q?fMwkYdWk5cX5WT/P7DdKYDO74J4n3r5Y0bEqcz0wFZM8tt/I6TG8m8rIYJFw?= =?us-ascii?Q?VLXdygasMyqI4UFqh+3kSa8nj14gCKlqcuWvCLpIEVNVq+Wlw0fc23c8m/AT?= =?us-ascii?Q?1KxaJ6tbyw+Qy/yCHM/x0thoIXLdeD8xt?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1737;6:OJdjvGsq7V7Ao8OiFJJ9TkKaOp8nwNv2KiQiZUbRq6kl+UsiDXwqd1P+BMLf1fSjnHhrfC6m0Qefi0KNYfpXytVS91CL20agCq0ayg05rtrHYjQxXpusI3mzQ6IV2r0GOXce/roJEbqyj4d4NFRdwrhJIjNbuOzOC0uIQK9edOjJ0WgTiImFPNVzlW7XK+2euOzpX+bJcwgTk0JI8wADFRWmfgUI9XhHP1J0xFtRGZxbV4pOF1+33mpbY4teelx0h8d8vvueq3NhR4rzOnPBTwEqg/2f8Nik39LS26yMyxCvHD4IotH+mqq8ETCEruaiWXGDXPLYO6JuSs2+LZRIbw==;5:lHmP/GIHTNMGVmJr/92Qhtl6fqaS98LdxAOrNCshub+6JasPSEgsKw+FrLRZ+0CY8TixxLTqDJ6BgsqSBZH5uXg+Y5/zAj+9E0tJ6VIeeeJywJDwLPFhYMiWetI0M6kvvDvJYywCpr+sCNFPwvAETw==;24:kR746eHmS3fs50yfm0UFyz2ywWzGd4QcICeUdbmKCJGbaX+WGzJbwOTDk9sy6LZoP3XMKv6RGl5fRFZOExy6BOOxjdJHLFa6v3v0zU5/QMQ=;7:aJvHBrwwC6LCgDpLtiFkQ9SMq0668Lne1Es/BYpM3RqgsGCXUAr0Kx2T1TXTKuXFA2SOwutfb6eZE8Gf1pP3rvqdQ12DBQdB7NCPUZb9uF130CD4NdhkgPGNrQ+rRWrj3/uT0kaJ1DOHVBN5WfJm9T2qaG89C9xDgUnKmAU+3YwbL0ZkJmxGnClYIv3QqpIR/9UkbEEw+vdQHvR0yFhl41FB37v5j1XOi3jD8hrSo5C/pKI5MGFEoGJfoDmMcBozxPR75pALL840nMmwHgvfbw== SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1737;20:JQTprKOBxkjKvTYN7KSB2iYwqGgauqSlA9N0gzbXXL/KID3dxD6Xhh4/HDOeT0wGByVYLIIy5CJKKpUbMsExpkriknnYmq6U3eJZwrLS8vQnRZqZ16ve5BPDZsL9EYW3B/3VP/E659U1m780b89HiQ9M3E/zY4rKICupXb/8FaU= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Jun 2016 11:36:59.3442 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1737 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Should print on success: [root@localhost ~]# ./test_mremap_vdso_32 AT_SYSINFO_EHDR is 0xf773f000 [NOTE] Moving vDSO: [f773f000, f7740000] -> [a000000, a001000] [OK] Or print that mremap for vDSO is unsupported: [root@localhost ~]# ./test_mremap_vdso_32 AT_SYSINFO_EHDR is 0xf773c000 [NOTE] Moving vDSO: [0xf773c000, 0xf773d000] -> [0xf7737000, 0xf7738000] [FAIL] mremap() of the vDSO does not work on this kernel! Cc: Andy Lutomirski Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: Shuah Khan Cc: x86@kernel.org Cc: linux-kselftest@vger.kernel.org Suggested-by: Andy Lutomirski Signed-off-by: Dmitry Safonov --- tools/testing/selftests/x86/Makefile | 3 +- tools/testing/selftests/x86/test_mremap_vdso.c | 111 +++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/x86/test_mremap_vdso.c diff --git a/tools/testing/selftests/x86/Makefile b/tools/testing/selftests/x86/Makefile index abe9c35c1cb6..c701349d4920 100644 --- a/tools/testing/selftests/x86/Makefile +++ b/tools/testing/selftests/x86/Makefile @@ -5,7 +5,8 @@ include ../lib.mk .PHONY: all all_32 all_64 warn_32bit_failure clean TARGETS_C_BOTHBITS := single_step_syscall sysret_ss_attrs syscall_nt ptrace_syscall \ - check_initial_reg_state sigreturn ldt_gdt iopl mpx-mini-test + check_initial_reg_state sigreturn ldt_gdt iopl mpx-mini-test \ + test_mremap_vdso TARGETS_C_32BIT_ONLY := entry_from_vm86 syscall_arg_fault test_syscall_vdso unwind_vdso \ test_FCMOV test_FCOMI test_FISTTP \ vdso_restorer diff --git a/tools/testing/selftests/x86/test_mremap_vdso.c b/tools/testing/selftests/x86/test_mremap_vdso.c new file mode 100644 index 000000000000..a489a2410664 --- /dev/null +++ b/tools/testing/selftests/x86/test_mremap_vdso.c @@ -0,0 +1,111 @@ +/* + * 32-bit test to check vdso mremap. + * + * Copyright (c) 2016 Dmitry Safonov + * Suggested-by: Andrew Lutomirski + * + * This program is free software; you can redistribute it and/or modify + * it under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ +/* + * Can be built statically: + * gcc -Os -Wall -static -m32 test_mremap_vdso.c + */ +#define _GNU_SOURCE +#include +#include +#include +#include + +#include +#include +#include +#include + +#define PAGE_SIZE 4096 + +static int try_to_remap(void *vdso_addr, unsigned long size) +{ + void *dest_addr, *new_addr; + + /* Searching for memory location where to remap */ + dest_addr = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + if (dest_addr == MAP_FAILED) { + printf("[WARN]\tmmap failed (%d): %m\n", errno); + return 0; + } + + printf("[NOTE]\tMoving vDSO: [%p, %#lx] -> [%p, %#lx]\n", + vdso_addr, (unsigned long)vdso_addr + size, + dest_addr, (unsigned long)dest_addr + size); + fflush(stdout); + + new_addr = mremap(vdso_addr, size, size, + MREMAP_FIXED|MREMAP_MAYMOVE, dest_addr); + if ((unsigned long)new_addr == (unsigned long)-1) { + munmap(dest_addr, size); + if (errno == EINVAL) { + printf("[NOTE]\tvDSO partial move failed, will try with bigger size\n"); + return -1; /* Retry with larger */ + } + printf("[FAIL]\tmremap failed (%d): %m\n", errno); + return 1; + } + + return 0; + +} + +int main(int argc, char **argv, char **envp) +{ + pid_t child; + + child = fork(); + if (child == -1) { + printf("[WARN]\tfailed to fork (%d): %m\n", errno); + return 1; + } + + if (child == 0) { + unsigned long vdso_size = PAGE_SIZE; + unsigned long auxval; + int ret = -1; + + auxval = getauxval(AT_SYSINFO_EHDR); + printf("\tAT_SYSINFO_EHDR is %#lx\n", auxval); + if (!auxval || auxval == -ENOENT) { + printf("[WARN]\tgetauxval failed\n"); + return 0; + } + + /* Simpler than parsing ELF header */ + while (ret < 0) { + ret = try_to_remap((void *)auxval, vdso_size); + vdso_size += PAGE_SIZE; + } + + /* Glibc is likely to explode now - exit with raw syscall */ + asm volatile ("int $0x80" : : "a" (__NR_exit), "b" (!!ret)); + } else { + int status; + + if (waitpid(child, &status, 0) != child || + !WIFEXITED(status)) { + printf("[FAIL]\tmremap() of the vDSO does not work on this kernel!\n"); + return 1; + } else if (WEXITSTATUS(status) != 0) { + printf("[FAIL]\tChild failed with %d\n", + WEXITSTATUS(status)); + return 1; + } + printf("[OK]\n"); + } + + return 0; +} -- 2.9.0