From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751538AbdAPMjR (ORCPT ); Mon, 16 Jan 2017 07:39:17 -0500 Received: from mail-he1eur01on0092.outbound.protection.outlook.com ([104.47.0.92]:45234 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751331AbdAPMgt (ORCPT ); Mon, 16 Jan 2017 07:36:49 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=dsafonov@virtuozzo.com; From: Dmitry Safonov To: CC: <0x7f454c46@gmail.com>, Dmitry Safonov , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Andy Lutomirski , Borislav Petkov , , Subject: [PATCHv2 2/5] x86/mm: introduce mmap_{,legacy}_base Date: Mon, 16 Jan 2017 15:33:07 +0300 Message-ID: <20170116123310.22697-3-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170116123310.22697-1-dsafonov@virtuozzo.com> References: <20170116123310.22697-1-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: VI1PR09CA0071.eurprd09.prod.outlook.com (10.174.49.143) To AM5PR0801MB1731.eurprd08.prod.outlook.com (10.169.247.9) X-MS-Office365-Filtering-Correlation-Id: 837bcfee-a02d-4c00-57bc-08d43e0c513e X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:AM5PR0801MB1731; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1731;3:rxk7Wy+ygK6r/YbQu7K95vFbfAdjUEs8sHRhFCXqJtepYSrbuYXDLoAgpO+b74eyW/VC80rJvLmMoskO/cCFiEKUV9AUsl6jErQR9aZhHuZzC8V8+wJvYOHxmALkDv+oZLE2YWjv1Z1M+z8GFzcxTo+sPByb5vu+FSMzA3wcVPnN/MzsFNARSXrvvzLFMVqPLH6tMyTu87oGtl4qlPunazvUoZRlA7dBGwSDV/JqeayHPMTOZDFkTNsisC6H/3IyvqIYCUQy3RF/polO5brJ3A==;25:L9dnJoLooG5X8d1cDz3SPW3lx54ZCGHoRGCcr7rAp5u5X5dIHNoPbKd642Lf6sSUH6G2hgnvMO164ZNNrsVLwR4Ve+AtEfaWk+5RM2aEwoRqfKUQ0h36wyo+Dzc0ujEtL7q6WP0tn4g8Pgg7uX9c+uXI/ghel6nF+vg9Qfn8rm5o68VXQE06sGiUXfjuXBB2YAJjXRJH+GQR7HKwcHtczeW0/weYgcaIQSwiWLvMo37sOJqQCh6smnDF+qYRNy4LEQt3t7IovMgL1FiL6qnO1R9AxdHv3nyK+xjvh3gm9vwDmdd5AvOf5RNcamYpbnzfccFpHFujrfmw8noz2OaIM1R6UmKoMH/M5M/R+oqpr08HsTOS2a1J5ednEChHoNYytTMKlHA2//r6nzLWdrA/WRTcwbCxwE9W6rfJfJQjB4SMGdbMiF5dYpLnehSyqBvTcvQ8ZSYbfP0c72VA9c5gbw== X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1731;31:9S7KGM+s3qgUmr9ymvlG/D6dx4jCHnh0HUeKcPM3SxRfqitJ5FF3eoBK7ttYxspYcmyRKSj+zxDMo40OJ2V0EdA8Wr+uffNIEGZYT1psN93jIMRHx39LB6wtiEpNj4OJxgvIJ8Epg0l2XEnAWKA5qe+L1k9Uz42rQ1aNs0ASdiI8MNgMGFHzfl9kG4kLAEPMPq8moUz2ZyNtPrUHULld0h0vnxKIuJ9ZWZP4g3TfvY/ojM8RcvMQCMCxp8baxaNa;20:Cm88sF9PNwjmKtGsBLQGn/j1IpptpEW+jDCEa4vLfFke8GMG2LarhzRLvPtW6FvsULr4w/JkRXHSYxep8gtXgwllDL9/jtf0HkgIvYsufwZSNYZdYqgov/1JTmYsEh5dXCZyRY9xDyDwjzRi5qKcPqfV9Ji5KK/hmtvjeDyJ43HStxCtA77GFBVJKnUEZqDTC6cy1CZ/brtd16Lh9v3mqd6c3x/vyIMphCp5xc/CmPXmVAoDA/h+zquPl9HVQxik X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6041248)(20161123560025)(20161123558021)(20161123555025)(20161123562025)(20161123564025)(6072148);SRVR:AM5PR0801MB1731;BCL:0;PCL:0;RULEID:;SRVR:AM5PR0801MB1731; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1731;4:ETrX2MaAvLlOneRqq5t9YQ+lrE4Wtd+vY/lqYddYYOV6MhKYuzdgFvattX7L91Zgy0+1UGhcYSt3xYIXkOTykleB1YA+fZcLHe06HJ42AFy/7K9IC4kyyqCZlx6esff4gfY0HsyAbnqD0bkUnDmyQTkq58Odl3YNHeRX3gIbgxhT4Rxzhw2D9yKdoqkSUFVDuOM70GELG75V9LP8mxWbP8sbeUm9G82iWQkSwU3DZSte79ihh3UzL9A71bZ/jfpjublhS48KsOdg+OXLuh0RZLlDqZLDgsHD/z6sg3EWHWl1sJlDX+cA9g9hTDh1gW3TlCTWMhgoBJcfPTisCvZsUPFc9Q1oViYf/2htqaTn6iq9y7Ajp781ZkdD4nuDV21EHMzdzNMV8rD7/F027jN5w5Mz27v1kTdvyRklcYsYmkMsPd3NYwblv4LleLU0kQObR6HZqKa6auW3rdoUNQkLX4QnPttGWtlP6HK9Ih17h4dzq8I/uiNwlrhb6vn8zll5STkyJCmeFXyhu5EQaAL52DWmlsA2BNK9RpQoOSO29JpEtNNjDfbNjzyW6WaXQxuI/l4J3hOnkaO+oYsE5JoeVT1Ti5Ng/R1MaJYY9ZhObLQ= X-Forefront-PRVS: 01894AD3B8 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(39830400002)(39450400003)(39410400002)(189002)(199003)(50986999)(76176999)(47776003)(50226002)(66066001)(48376002)(5660300001)(50466002)(92566002)(5003940100001)(189998001)(101416001)(68736007)(97736004)(6506006)(105586002)(6666003)(27001)(2906002)(106356001)(6486002)(8676002)(6916009)(53416004)(2950100002)(4326007)(6512007)(54906002)(7736002)(42186005)(33646002)(69596002)(25786008)(36756003)(86362001)(6116002)(3846002)(2351001)(305945005)(38730400001)(81156014)(110136003)(1076002)(39060400001)(81166006);DIR:OUT;SFP:1102;SCL:1;SRVR:AM5PR0801MB1731;H:dsafonov.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AM5PR0801MB1731;23:yyO93cMdH/MjhMBOBpAZQo0oTLvx4XKSG/lJKZy?= =?us-ascii?Q?h6hmjmqxXAOWWYSFQGXu4kfsXK/BmJHiBoSeyVtlvwZajh3fwXAmNTsPXxLh?= =?us-ascii?Q?n1ceUH7GRmP7JNcM9vatSTvuRj0GCVSuh92ik9D3GayA+AKdkhFkqlc59ZW/?= =?us-ascii?Q?HRbXcxX+1a1RCP8gyVBNoCf5TKRd+Jbtp9Rfcazoj9LW1SvJVKuuksSDKpj0?= =?us-ascii?Q?FHXluWPe3ISMhmhPPydxgogtsqk4r/FeT2V7GuQCemz6ehGsi8WMJ53S1kR8?= =?us-ascii?Q?S+FDatEUNjJVzdPzFdzNsJzKum7DpDF8Yk6UWxJkJDXgCGbtYvRJFxqrmqSs?= =?us-ascii?Q?auBg9thGzFd7h87P67Wwm0Tb39uPagxsZpaLEboruNvhMZDPipyao2zGTQKZ?= =?us-ascii?Q?5zfQ63Mr53vEVNbrd1mskm5Bwqgb481gg+Of5hhiKvML1wyCNvytQG8mRMkJ?= =?us-ascii?Q?GrmZ+xyZRr7sQH3N3SAx5VFv8QdoJlke6/m/yqA1xA6O0UUzZLA5uvoYH9jU?= =?us-ascii?Q?Qc/NiOIgexbYjMbjKeRsTIMNEZkN6/6CBNPuOl8gBhamSBdhpIiXpMiWufDh?= =?us-ascii?Q?c9X45bZnrnq8RdhZVN/2BsyVndXPj/oucGzN49MG34XMIY9GmaeQptl0znC6?= =?us-ascii?Q?CYftSWRpgwjv1kBJEALAF8XzeSJ5ts1D6aMuHd+9cPNzlAgf4r2bnQquiLSL?= =?us-ascii?Q?7baYUMYrYyW1OXD36DOV3h0lZ8o6x4COwnj6f87PVHGBUHtgv0of2RItE2QQ?= =?us-ascii?Q?UDc1/Cpl3UmS7D2NUEDDWolDQ6OGlPmlXemE8/8IqGNlzDE/cVji2AZzum9n?= =?us-ascii?Q?oemPjPIFPZp+VZr/oC1CTcq5OuCL1phjaOdjuzaUXyxUgmO0RrS666PihNIr?= =?us-ascii?Q?6LctIpBBOjNj4Ct9HRvo/t1mF1o0+wKnBU0oNn35gpjv6C/1NGNYPBrAJ7tS?= =?us-ascii?Q?D36oqjvHR1RaNV1DYpgtNwYlLUHdTuUaXA3XJzH0LFydU2iczX6Y+s45GPwz?= =?us-ascii?Q?eDtVdfcqBGjiYjEYpyEgEAAwXllrA2EArtwC19JFbZswXLuOkgtFD0G0OlfJ?= =?us-ascii?Q?KHAUbTw55V2SGtjsEXxz3SZjENmc3aLJSOFVIsGKOUYzFfJ9oMQLgD5u4+se?= =?us-ascii?Q?stXPDyRjcm7hiN/FhX22oqq1nkxVVZThSg/IdqCuZrSa8O/lNZlzwOV3073e?= =?us-ascii?Q?PNgu+GDTaIDAH/r8yTs/Qb+BdhK1uhlr3okF4bxz6ssWUpZQjXiS4LGtfCeK?= =?us-ascii?Q?+JELHFqOoS/Lsxhm2mT7j+SN9A1gy3NAQWzCf74Vt?= X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1731;6:e/FPY0fmLF4EKDX/i+zQebBDYUDOuaAksGvJt5nK8/zVLJgOoj/Za9VcVGi0mP562XDisvCiowadSuEDCEX2E7AZpIw5yzvZ05zgAMJESuCXxo9uzmVE7plrvMWc6fIM9g28UmxsFtDvq62C52JOE/Ko0GTXDNS7bXQEP7WhmM7EJseJAN27VrYlmnjSMoLg+i+Jh0K0C5TkWwheeOe/0DnjTt6mBLPdGyF4F99fmLeyTLgQbApikcSrF1D9JoXTiNG+3N49/X4wRd9z8ZGrf85Iy5CB3IIpt0R0d9Jw7pddhXBzOXVSTEdCtgO0WZwxy0X/BYtYJicpePcgSsseMSYI2igttCb/PvrzQWdNUlf79/vvkm+gemGwzUCzn4oC3GX2Dm7FbGQIN4WUspdaeL7MxB5LcGTlHQxQTUmSQCs=;5:tQs6H8508lwxnAo64bQrRho6TLdKmshadG9j8SkNrR4SCFcL++MuizVG2uvkv4VOduPLDC9Dnlb8bE3wD5X0bm4aPOgfanFqL68ElbYGDXnYZIxMn1r/Argn0VLZUmyF6m5efI2FffPKKOMoRvWQng==;24:z4ulNtnqlJ+BHWWZR5cxJfVB8dQFvKTY2Ur2d0btIFq1i1LcYFel4XfWSb0hlT//VK0ierR1ydKwp5aml17328Kgbw+bza60e7hNmTejuXA= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1731;7:hMIY3us+njdPJ6rgY6sGKpGJ9H6E06yIP9x5pLAMQM3Ce1qyhwcmfHhfdVocqETfbEOTK96LMiRHir1AwXMiTLtH+wn66N/8hs9XgBx8Y1GNfyYS55WcEAdKcOvolmMn6VP5GeB3xDGZnBXdmYaEko1yyrxBG4GI1GLexsovaYVG7oY6lL0fioupgolQupW4rCy/9F5hgkxqmj8IuuNvj6jmjHlYNokQKWTujvfX/UxxWrhmDV4qYv9/l4hxWEXZShgRLDIrvYhr8vbH81qX3jCF3HJ0ReOPlIoyzCtl2eFL8rF1wHavgZiXQYCVLnfSNdQ70cW6TfgA8nMKhwFyVczfVX+oKC9D6gVOHiXBM93VnsE8qs5M8PN8nXcWCnC+5Dg4g3baj5bGhq/ropLZHc32Btwd0T0dSxwmJbXWO89ektUCIcektT3qztkx8zEFfCW936WGEwbOUutNdlYLag==;20:+0B9eJd5JJYex1vtjKTrjgpDnlVskYHLx6waLvNBGfjXYuavp1OBYUeCJ+XtofxeSUE818tOJGHeahBEnLu0KEn7n0Ql2jgANqp5GwPTgHxhz3EO+wKqi2quLgKUfCVXNHM9KxSmqqfzSK+be01v31plRzwikk3IfN5iRLSXlzs= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jan 2017 12:36:38.0134 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR0801MB1731 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In the following patch they will be used to compute: - mmap_base in compat sys_mmap() in native 64-bit binary and vice-versa - mmap_base for native sys_mmap() in compat x32/ia32-bit binary. Signed-off-by: Dmitry Safonov --- arch/x86/include/asm/elf.h | 9 +++++++-- arch/x86/include/asm/processor.h | 2 +- arch/x86/mm/hugetlbpage.c | 2 +- arch/x86/mm/mmap.c | 31 +++++++++++++++++++------------ 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h index ee1a87782b2c..9655a8390da4 100644 --- a/arch/x86/include/asm/elf.h +++ b/arch/x86/include/asm/elf.h @@ -286,6 +286,7 @@ do { \ #ifdef CONFIG_X86_32 +#define STACK_RND_MASK_MODE(native) (0x7ff) #define STACK_RND_MASK (0x7ff) #define ARCH_DLINFO ARCH_DLINFO_IA32 @@ -295,7 +296,8 @@ do { \ #else /* CONFIG_X86_32 */ /* 1GB for 64bit, 8MB for 32bit */ -#define STACK_RND_MASK (test_thread_flag(TIF_ADDR32) ? 0x7ff : 0x3fffff) +#define STACK_RND_MASK_MODE(native) ((native) ? 0x3fffff : 0x7ff) +#define STACK_RND_MASK STACK_RND_MASK_MODE(!test_thread_flag(TIF_ADDR32)) #define ARCH_DLINFO \ do { \ @@ -320,7 +322,7 @@ if (test_thread_flag(TIF_X32)) \ else \ ARCH_DLINFO_IA32 -#define COMPAT_ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x1000000) +#define COMPAT_ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE(TASK_SIZE) + 0x1000000) #endif /* !CONFIG_X86_32 */ @@ -353,6 +355,9 @@ static inline int mmap_is_ia32(void) extern unsigned long arch_compat_rnd(void); #endif extern unsigned long arch_native_rnd(void); +extern unsigned long mmap_base(unsigned long rnd, unsigned long task_size); +extern unsigned long mmap_legacy_base(unsigned long rnd, + unsigned long task_size); /* Do not change the values. See get_align_mask() */ enum align_flags { diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index eaf100508c36..2bf5787fac37 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h @@ -844,7 +844,7 @@ extern void start_thread(struct pt_regs *regs, unsigned long new_ip, * This decides where the kernel will search for a free chunk of vm * space during mmap's. */ -#define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3)) +#define TASK_UNMAPPED_BASE(task_size) (PAGE_ALIGN(task_size / 3)) #define KSTK_EIP(task) (task_pt_regs(task)->ip) diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c index 2ae8584b44c7..62dfa3fa3ee0 100644 --- a/arch/x86/mm/hugetlbpage.c +++ b/arch/x86/mm/hugetlbpage.c @@ -113,7 +113,7 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, if (addr & ~PAGE_MASK) { VM_BUG_ON(addr != -ENOMEM); info.flags = 0; - info.low_limit = TASK_UNMAPPED_BASE; + info.low_limit = TASK_UNMAPPED_BASE(TASK_SIZE); info.high_limit = TASK_SIZE; addr = vm_unmapped_area(&info); } diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c index 0b2007b08194..b64362270165 100644 --- a/arch/x86/mm/mmap.c +++ b/arch/x86/mm/mmap.c @@ -35,12 +35,14 @@ struct va_alignment __read_mostly va_align = { .flags = -1, }; -static unsigned long stack_maxrandom_size(void) +static unsigned long stack_maxrandom_size(unsigned long task_size) { unsigned long max = 0; if ((current->flags & PF_RANDOMIZE) && !(current->personality & ADDR_NO_RANDOMIZE)) { - max = ((-1UL) & STACK_RND_MASK) << PAGE_SHIFT; + max = (-1UL); + max &= STACK_RND_MASK_MODE(task_size == TASK_SIZE_MAX); + max <<= PAGE_SHIFT; } return max; @@ -51,8 +53,8 @@ static unsigned long stack_maxrandom_size(void) * * Leave an at least ~128 MB hole with possible stack randomization. */ -#define MIN_GAP (128*1024*1024UL + stack_maxrandom_size()) -#define MAX_GAP (TASK_SIZE/6*5) +#define MIN_GAP(task_size) (128*1024*1024UL + stack_maxrandom_size(task_size)) +#define MAX_GAP(task_size) (task_size/6*5) static int mmap_is_legacy(void) { @@ -88,16 +90,21 @@ unsigned long arch_mmap_rnd(void) return arch_native_rnd(); } -static unsigned long mmap_base(unsigned long rnd) +unsigned long mmap_base(unsigned long rnd, unsigned long task_size) { unsigned long gap = rlimit(RLIMIT_STACK); - if (gap < MIN_GAP) - gap = MIN_GAP; - else if (gap > MAX_GAP) - gap = MAX_GAP; + if (gap < MIN_GAP(task_size)) + gap = MIN_GAP(task_size); + else if (gap > MAX_GAP(task_size)) + gap = MAX_GAP(task_size); - return PAGE_ALIGN(TASK_SIZE - gap - rnd); + return PAGE_ALIGN(task_size - gap - rnd); +} + +unsigned long mmap_legacy_base(unsigned long rnd, unsigned long task_size) +{ + return TASK_UNMAPPED_BASE(task_size) + rnd; } /* @@ -111,13 +118,13 @@ void arch_pick_mmap_layout(struct mm_struct *mm) if (current->flags & PF_RANDOMIZE) random_factor = arch_mmap_rnd(); - mm->mmap_legacy_base = TASK_UNMAPPED_BASE + random_factor; + mm->mmap_legacy_base = mmap_legacy_base(random_factor, TASK_SIZE); if (mmap_is_legacy()) { mm->mmap_base = mm->mmap_legacy_base; mm->get_unmapped_area = arch_get_unmapped_area; } else { - mm->mmap_base = mmap_base(random_factor); + mm->mmap_base = mmap_base(random_factor, TASK_SIZE); mm->get_unmapped_area = arch_get_unmapped_area_topdown; } } -- 2.11.0