From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-it0-f72.google.com (mail-it0-f72.google.com [209.85.214.72]) by kanga.kvack.org (Postfix) with ESMTP id BA27D6B0260 for ; Wed, 29 Jun 2016 06:59:02 -0400 (EDT) Received: by mail-it0-f72.google.com with SMTP id f6so89307381ith.1 for ; Wed, 29 Jun 2016 03:59:02 -0700 (PDT) Received: from EUR01-HE1-obe.outbound.protection.outlook.com (mail-he1eur01on0132.outbound.protection.outlook.com. [104.47.0.132]) by mx.google.com with ESMTPS id l39si2526277ote.168.2016.06.29.03.59.01 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 29 Jun 2016 03:59:02 -0700 (PDT) From: Dmitry Safonov Subject: [PATCHv2 2/6] x86/vdso: introduce do_map_vdso() and vdso_type enum Date: Wed, 29 Jun 2016 13:57:32 +0300 Message-ID: <20160629105736.15017-3-dsafonov@virtuozzo.com> In-Reply-To: <20160629105736.15017-1-dsafonov@virtuozzo.com> References: <20160629105736.15017-1-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain Sender: owner-linux-mm@kvack.org List-ID: 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 , Andy Lutomirski , Thomas Gleixner , "H. Peter Anvin" , x86@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" Cc: Cyrill Gorcunov Cc: Pavel Emelyanov Cc: x86@kernel.org 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.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: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752429AbcF2LOX (ORCPT ); Wed, 29 Jun 2016 07:14:23 -0400 Received: from mail-am1on0127.outbound.protection.outlook.com ([157.56.112.127]:5435 "EHLO emea01-am1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752335AbcF2LOT (ORCPT ); Wed, 29 Jun 2016 07:14:19 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=dsafonov@virtuozzo.com; From: Dmitry Safonov To: CC: <0x7f454c46@gmail.com>, , , , , , , Dmitry Safonov , Andy Lutomirski , Thomas Gleixner , "H. Peter Anvin" , Subject: [PATCHv2 2/6] x86/vdso: introduce do_map_vdso() and vdso_type enum Date: Wed, 29 Jun 2016 13:57:32 +0300 Message-ID: <20160629105736.15017-3-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20160629105736.15017-1-dsafonov@virtuozzo.com> References: <20160629105736.15017-1-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: HE1PR0801CA0018.eurprd08.prod.outlook.com (10.167.184.28) To HE1PR0801MB1738.eurprd08.prod.outlook.com (10.168.149.150) X-MS-Office365-Filtering-Correlation-Id: cc842b0e-856f-4f4a-6b60-08d3a00c5ff6 X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1738;2:L5fXVXtNhBqo4+RI8KOkiuOeGqa/l1n2Tcb9G3EsNq0PIupUJVGJ6rrrvN+QnnOgfIjNy8lE4aMx0g8MIp6c33fvmku52t1VzUEmbWZ4Mx5wmderTO5eh21vgzBdz59X5vx4dX26BHcOdA3FhB8KHIPsk9nmStQDFn+oBoNCmof4LQGMT5401n3DCznk50Ka;3:j48shSlVIaL3iAstgBoDI9R5Bkf+PKY5gRv9UkPBP7YyL06DU17yuigdoC+58B7ZO03iNXdjqn1QU7V3UqlTps+zKL/6BgF/85qVrWeaEK9BW1WAb04nbBDtqEVIO4hg X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:HE1PR0801MB1738; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1738;25:mtgfEA45MRVHeSkkr21ovdtQjrsXVjMlfMK9SIbG2U6tzIlM+wLtHfyj83PDI3/RWyFYlrLoRPKgds2g3g3YbR8ptS7EGjfmSnOwDUMyCJ5TR16W6GIjpcW7jGEfOCgjKuP2qn15f3hdm2MnZc5Sivc0wW5ZdrLwKjrbsZx4d+xZArJT9ddXaqBz7WqZbcxdwAw9di+SDmaeeOg7MZaRAucJGAMt8rpaZJX8x4mYC7IQDoVNg/pv1HDa1YBoInTLlOP+PQJIPYj0LmcHhnErqhTw/Y+PkU+SC7hBkjcnEh24EVPJ/3xtq14tiqexGRb3n2v0vu2tEA7cpIxTGGwdnKwi38yKHo7tpsB1Fy2Mulzf22RsnKbfjkRHaPKfFUmWuodJ0AaK19knGvvtZFl6YQYZsRhjFtSebHYRoqYAk3HhwXFY5nolwVhBn3H5L1FUulVYp+OMx1EwE5TKx2EECv7Xswg477+uCJAOCYQ+V99jhnatOK/HFGOiVwk5zGM33/x6/MhUnxAbzbvDWLuySbhjC0XnNaCHrf8wd7OKwltV7XxuVVaE6jQD/Ki3LJghp4l/wm1+GWoWbfB1VYHu2s4tthCi31H4/dk6Cbj4vIRQNORHu71gWLoM4hBiV2m/uOIQvjThJeKvhoEqUCGXfIF7oftE3J+bjQj3Nf2JLUMOFtURkTmZ86rmdMqsdY8t X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040130)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(6041072)(6043046);SRVR:HE1PR0801MB1738;BCL:0;PCL:0;RULEID:;SRVR:HE1PR0801MB1738; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1738;4:GjPtRfTZib802/6QSaCgJOMBCsWocyL2gGOBq4JIMzHsXNHWAj4hrXl+rDW6NDYyxf/YrMeexiTlb3V4gS9BHs7cjYzLCPg0gCUHfYAvpi3yJNoEg8A3WfYSuGb/t4sn3lRGUdWbeB/uMfgcNMOYDYe3/3q+wtFoN1xYn3p+7B2EeMitkr/Q0m1PyhHHhiYfDLtKda/70Fr8FxBiC2ESO/w6vfP0Vrwy88gzzoUhUQ5IngiTJUTw7JJz48g1feLAz6kxAkcH5p8bRDwPHtn9AxZjFMMFdB3MoPT5c2kOz3POKuXc2i0WzftWyVP1P9itcl0PrkHPVJRBfrySLBqgQN6SDAzXntSOe+8Y3WMsul/YQAmtgI4EAaL6U7besOZAxNaamd+Q2KI36WdC0yzCg1lJirURV95Ajokp/q10Nb4= X-Forefront-PRVS: 09888BC01D X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(199003)(189002)(2950100001)(5003940100001)(110136002)(19580395003)(19580405001)(77096005)(76176999)(189998001)(69596002)(50986999)(47776003)(66066001)(42186005)(101416001)(53416004)(50466002)(97736004)(33646002)(106356001)(68736007)(7846002)(86362001)(7736002)(105586002)(229853001)(2351001)(1076002)(4326007)(2906002)(3846002)(6116002)(50226002)(305945005)(36756003)(586003)(92566002)(48376002)(81166006)(8676002)(81156014);DIR:OUT;SFP:1102;SCL:1;SRVR:HE1PR0801MB1738;H:dsafonov.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;HE1PR0801MB1738;23:j4aCP4ZydPQ/TntHUTavDTKDsnKiNgLB6qMEslG?= =?us-ascii?Q?rpaF89PhiKht5QS3EY+QeonxpHhmwXAT8BJfTnB5Te981xRmwE0S8vacUErx?= =?us-ascii?Q?HvkhaYwFBaEoB8zhQuBaW7iLuRDMReLhVM2xVamLUXMQsaPY4pT3dGfGZpZa?= =?us-ascii?Q?YGuRct03uJuMyb+1VGGGq9VF9n2eiAtakxS4gzcVxXbx6rsOLi+W0nyKhKJ2?= =?us-ascii?Q?DDBwh1YyUn/lLDQCqedd2FeLprhRknpe/KSCycL+7hwrTsn7QY4YKWuyuvlP?= =?us-ascii?Q?ZWMl9DpGbvKVy76s+lMHlXSWRo7CqsSFpKr1RmLq5AF8pI/VfYIOMqYVoN9M?= =?us-ascii?Q?g2RJ/6Yl4pSyKO2KQh/VL5fJ53CmFBBSDqGoOAWa1654a3mVcLPRz1iNEHKG?= =?us-ascii?Q?+I/J8HQKwxQXwrgQQM4ia/xn/9RrdvCn+dbnLp/dMtv7Gm4MnX6YxuN73vaU?= =?us-ascii?Q?7AQSyJNJqWE9PalGjlqTnf7d1mLetj4gO98nIanSNelpYMT59sVgf7VRbuIv?= =?us-ascii?Q?FGPqC6qjwwJRBI+qZjyrmQ82jqt6b4RKGQa2k76fZ9MzLQiAjogJkjdXOZVR?= =?us-ascii?Q?6f37mRrfKsV57oCbNLLf5YB5Ipc3REqs84PweqAuxOWQouPul8x5W52Rrac4?= =?us-ascii?Q?SBAeNDTbRNjZ0+/xV68GW8XBXrCq57f67QtDC99tv2IyFv+htM6OHNokWi/J?= =?us-ascii?Q?9lXsSHJt8v9UJaZ8v/08CUyQrPSUEYulaJuAz18is3qdXRe9UdkWZCaxmGV2?= =?us-ascii?Q?PWEFxQytBea1YRA2e+d58VuwPBkWWzJ/Gs7bAY4gjhD7sAE+rVe0sx9RTdu4?= =?us-ascii?Q?GSJOiN5lzrHCsmREpfQevRPwqYlwgmPJ2jEUVQ3WE+G1YIK1puQ6Y83TniLc?= =?us-ascii?Q?uZtZxFTEEFx8WZPS1IlLv0nOt2vIEXh4SSv4Ou0s8I2j1q+wdpqhVjB0a7pQ?= =?us-ascii?Q?+mxtxmZdcWSPokwBFqJhvsBChgBYVF2YX43ZViSilN6vCiE5+vWGfpQOiq8r?= =?us-ascii?Q?D4Sb6IEheQ3ayPR8DiuLGvOSK5ypuCB83WukIfB4u2Ehq01udtLSreyq3Ynv?= =?us-ascii?Q?eKsyn2SvMpO09pe81K+4WAeS1aGTkhhFe0QiKKOhlSYaWYXBRkcqY6j45gvK?= =?us-ascii?Q?82BEKX1U1WKM=3D?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1738;6:djXwmKhqICNF8jIOyScf6TA6/s7DsoUnwTxHrIiFscRzt6Anwyhqh5mTFdOCvcxWLu8SBO04d/lyeFRatUQt8+uVFbtDxaQJKxp7knKZeTIKlMU2Gcz04i2fWuWJbYkECHbp5YsTyBXovY/a9Aed+2gKmYOu3JfKkxAar0N52CphR/UNhkrzbOL4NMJcPWDy40LQ+CxUiF+IQMxKhGn039dcWQAVAyAB8K8nNK/DOC6FTs7OS7OjENyvMJAjQUwmW1reNWAJ4wo1I4xcn4X9saoqoTm+FWOMC37Zd5kjKm05BlmoXXt20ZzNFvgFdyzryXkGVVs4jhAIevheFJKTqw==;5:sNW2nin03MVNTs3jFfWbfQjqIim8twGBh2IRywAC+CODgAxr+QeJKBV4o/7yyOpfpxqTmvnO65lP3mqAcOMIkbB3qXXwMMitCM3WXNo7yJAE2ZLvnbh5lqQAF+7AzkePn4M/a2zg2LPizlqFHoNXvw==;24:Sg2ga4qfXVIh5Nrys+of1UcTRs3b5JWQxM089w0s4TFP1V3mmd5zkKmK08Rqtcfk+m0zdn3q78t5kCOuwULAK1hT3gZ1EtLkgo3STp1wiKs=;7:9HnvJkbWxRVGl9X5wuQp8lRocqZOH71Zf9AvG+nYoXpgsiaTqCWPET8iPaC/wB5yMkdtoDxh187IMgyChlTs07WW+gqxIAZ+PEkvlhWNugCmZiZOyt+gsztI+sgqw0Gi94hAWW443vau2SZ1ZsSlKt6/Ge4f9vNDuZCeqs8rubOXb6JBM28N40BtMoOafQXp6Ng2j3ZArGZtv1LiYBF7ow/nH/VpXNeVB+f19U0/uxGwMmeRD5oEKYqbdVEJgm4IRw+eiVEHfVdKa/XrZGGujg== SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1738;20:Lp//FynMKeGJPwLlm3/pzv2Ugp0akNv8wXMH16iZiBmCxOr5rCMKOuNfg7teFeXY8tvPox1ngHpi6VN3T8nQnJDoj2+/EsNUiPzvB5xGNPDXecFCJ9zkC/vsUnRZQn/m3d3wjtytZdCLqm57UcGFt+k277dolwSGyfl6eWcYYZo= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jun 2016 10:58:58.4305 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1738 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" Cc: Cyrill Gorcunov Cc: Pavel Emelyanov Cc: x86@kernel.org 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.9.0