From patchwork Fri Oct 20 14:30:52 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Brijesh Singh X-Patchwork-Id: 10020375 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 155C160211 for ; Fri, 20 Oct 2017 14:34:52 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F31C928E13 for ; Fri, 20 Oct 2017 14:34:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E7BD528E16; Fri, 20 Oct 2017 14:34:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DA9A628E13 for ; Fri, 20 Oct 2017 14:34:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752871AbdJTObk (ORCPT ); Fri, 20 Oct 2017 10:31:40 -0400 Received: from mail-dm3nam03on0088.outbound.protection.outlook.com ([104.47.41.88]:47104 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752851AbdJTObh (ORCPT ); Fri, 20 Oct 2017 10:31:37 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=wrOHmWcPus+4ARWlS3e5/l3c387+s6OTCpT9gUiXJCM=; b=x/7Nu1s0MZHf0kFEOFjlOwjZ+QCNZoKog8c03SjWD/oHDNSNg1NeUpZO6QCOtaNMgEgqBb9zFP6z06de2ZgS02q3n3pFZJ2YzWT+pqtC1sn+jkafaPr2fgvp06+ynAjhrWEeeo0BLPbfdFpTzb94vZNpLyN+eGMuhDJshodUogc= Received: from ubuntu-010236106000.amd.com (165.204.78.1) by SN1PR12MB0160.namprd12.prod.outlook.com (10.162.3.147) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.156.4; Fri, 20 Oct 2017 14:31:25 +0000 From: Brijesh Singh To: x86@kernel.org, kvm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Borislav Petkov , Tom Lendacky , Brijesh Singh , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Borislav Petkov , "Kirill A. Shutemov" , Laura Abbott , Andy Lutomirski , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Andrew Morton , Dan Williams , Kees Cook Subject: [Part1 PATCH v7 10/17] x86/mm, resource: Use PAGE_KERNEL protection for ioremap of memory pages Date: Fri, 20 Oct 2017 09:30:52 -0500 Message-Id: <20171020143059.3291-11-brijesh.singh@amd.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20171020143059.3291-1-brijesh.singh@amd.com> References: <20171020143059.3291-1-brijesh.singh@amd.com> MIME-Version: 1.0 X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: BN6PR14CA0029.namprd14.prod.outlook.com (10.171.172.143) To SN1PR12MB0160.namprd12.prod.outlook.com (10.162.3.147) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 84bf165d-300d-4050-15c7-08d517c73f49 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(48565401081)(4534020)(4602075)(4627075)(201703031133081)(201702281549075)(2017052603229); SRVR:SN1PR12MB0160; X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0160; 3:EAjLqVzVeYVBkZ4Sztqr/iyxu8Mee/sHv/MeWkY+581lCIUByY/hTO2uyHH1VbHG1PDWGeAsDAvSTLKGcbFfdFs/grC9gvi+/Z3lYPDga3hEZbree254pnU5ry9bX2agOoGJIkcTzPjdu3yq0m2O+6Tnn8wq7PJmSPn9FlewR65lUanmpKdGs9nVaiBLN5qtSb1jEZqzJ+yS3TP/2hLd8Kzm9frJFyNSUBXnUKC0TJAdzuuouNLy39eggchezegB; 25:P1G0NXLQZoXkxRQCC+9M4b6h+TbJmFhQekXawNbMsndhAwelQLN/ccjmBVZkSxNchqJXzbleNw4tkabE+Kw55Nxrg4Y+6plPz29XIlbKJ3R3pTyGdK7e6TOgc9hKrR4y3LA2kSRORIwfQmh6+y1fOHf/nbEGcIH5jFMA4Owovrt1aUUxt196yhGeIeem6JzbD4DZcIks8BKjWbnMe/zN9iWzpFI/1i5jvrRc/NPla/en/6rIldZ8dZj3ziOvTgwVcxYVe5gBzl3j0xzcUi4YCZxD65MJGydQLfR6eroQxqfzzqn19NEOpyLjDBLqMJs6QzzWy7E1G2KSvrRX5YWZpQ==; 31:09urQpH8JlqDk/50du9HcfeoCUaXhinqjxYp1L98UBcXp9BV+Kz3nAKGuBMWte7nB6aQAgfTe1Sr2wVfjPODYdFOVjossFLSNLqV80Es0RkR1Z4m9WR3d2LrFe+5f/TUWUejD18XC/Lg93RWFtkSK3UT5xSc5+sSNyY0Buq1vwy+wg/Q9pBLZPhv8YlfZBEu88uHm+gOv4XwWh969TTOLsWlcoexwzJSyXWl978a5qk= X-MS-TrafficTypeDiagnostic: SN1PR12MB0160: X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0160; 20:rrSvsY0BvN1AUvaFVKLj0NJWnb9MMhmI2OYDBIG9yuV5lZdGtrLLwqd+CjVCtcWkSwT5xTVQcSbLqGFExVy/63eu7iP9VEdMTR9BQ9hr87dUgunPJM3UQr44J+7uxJtTAemFftxb+0eHv9KroFk4yj+u/tOX+6Z3CR4prW0Fk2W+Zgb+QokSzCfL+NG25tz598xsXiztLjys6h0rX+VSvy0Z9R+CRQ7uIrFjdwkso+Vyamuhb5sF5QgSvkTzqrhUSmWMC4giVkJnKHjRnrbtrMxOaO7rDGaNwbB8jT5wMnJ2NNJJlGA+Y6FVDG+ue58F95v9kjESIwqlqJa6tDEZdWfSIBLUNWSi8i2/b3IT7Gksunuwv/+fZX7lZEhSk/txTTMW2doLufKgdnC6naqSkfseqU/E05IuXbzsRAZi5FLlefhhIuKP+bK8L1mu54UzxdSLxaWF3lNACvOwn1X1X7+NjpBOOfLU9+8E6sykC94IMT4Mv7Z5KG5mL8yUjRxz; 4:iguH6SgsbU0WKZ4wbS8mQwXLl/G4J1ZmMSAZhnmsyz8u0GOrkrBCBAGk+JHK5FZ6he1/5ooJo1jYAIhKYkZPXaypM43gH2s98IMUHEC4jwVW+ltsGICTsYWuO4eFr+Lv6nD7IJOkzoe0+jByr/XTyw5/PhhH47IyXoowUxJe7ECVDKx8Mu4zezMaKQC5neitVwpblIfhu0L0lRaeuCFvw2twbv2s78qtw1WPyoIw2OZTH1G8xha2wL6hyenHVH4GhyOH5ttfB9TY/h1d9N2egn8e0hZCKiie/ue0DpVvkZFoajd6y00vcaOLKyPTNmruXQjAgiCRn06tmFA8ylZGbFXW7AHNop4eZU2pbX30fe0= X-Exchange-Antispam-Report-Test: UriScan:(9452136761055)(767451399110)(228905959029699); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(3002001)(3231020)(93006095)(93001095)(10201501046)(100000703101)(100105400095)(6055026)(6041248)(20161123562025)(20161123564025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123558100)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:SN1PR12MB0160; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:SN1PR12MB0160; X-Forefront-PRVS: 0466CA5A45 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(39860400002)(376002)(346002)(199003)(189002)(54906003)(1076002)(6666003)(189998001)(68736007)(8676002)(305945005)(2870700001)(50226002)(7736002)(101416001)(76176999)(8936002)(97736004)(25786009)(81166006)(81156014)(16526018)(6486002)(23676002)(478600001)(2906002)(50466002)(4326008)(7416002)(47776003)(66066001)(5660300001)(2950100002)(53936002)(106356001)(3846002)(50986999)(53416004)(6116002)(36756003)(33646002)(86362001)(575784001)(105586002)(316002); DIR:OUT; SFP:1101; SCL:1; SRVR:SN1PR12MB0160; H:ubuntu-010236106000.amd.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtTTjFQUjEyTUIwMTYwOzIzOkkzK0xXaTRGMDV5ZXVqaDdXQ1ZlRmltTTJY?= =?utf-8?B?alBKZGRubWR2aEYwQ09pUDJraStIaU9FV0tDWWxlajVCK2JVdzFFeGVVWndU?= =?utf-8?B?Z09ST2I4eVB3aTdJVTdDRzVRV01rS3VNNnpya3I5bEtzOXNGQ2RDZHRYQlgv?= =?utf-8?B?NGw3cENuall3U2VZNFpyRG1uM2h0b2RGUHhCWEphS0Ixd2ptU1RiQU1ZNWxM?= =?utf-8?B?MElBVGdTaUxGdXQ2YzNpajJHRytObFQ2Qk0rSnhNUFZxUnhoMjRTdjIvUVUx?= =?utf-8?B?eG16RnV4QVJOSXdEV0xtUUpxU3RqWm9rRnJHRmk3WFFtbjRobkdWMDNjd0Zp?= =?utf-8?B?OXBkRUpTN0hDbTlMeDZwUGwzYThYcHBFS1FmczlOcWhrNXFDRlFZSm1KTk5j?= =?utf-8?B?NlJqVmxjRlpoRWY2RVBaazZ0QnY5MDd6aWFDTWNoMTNmU2wyaVRCNHVIVDdp?= =?utf-8?B?b0czVEpwQkpCMURwbmpwc1kvc3pxQ3l4TGRCeHZMTSs4Z2NIN3JlbGNHNTlX?= =?utf-8?B?RG1mQUxUWDFjakM0WEM5OEkzd3gzVFdXbnlzTlRZeFlwSkQvdE1HcldmYllr?= =?utf-8?B?VThuY21EMEVrSmdvbDhnWkxJK1JtSUFMR0hhMzlNNkZMN0h6S0RKcmNkakU5?= =?utf-8?B?MlYyY2ZrazRubUJ3dTRFUFZkdmU5T0pGY3Ntd1VZeFB1Tk53M1B5MjY4bnhS?= =?utf-8?B?cmFLbm1zTXQrS0M4TFVteU1CQXhCWG1aa2JsOWpYSzAyUDlmZWVFTmM2Q0E5?= =?utf-8?B?OHZaTlZXQ0x6RXNzaHRZZmplUzBwSllHeXh5cVNYMzM1L1ZJdXVWMUZLQWlI?= =?utf-8?B?d0VUbXdCTWtuaVNxTENvRFdoOG9FTlJqeUJEbjVJUVk2eUcyU0JmV2FrWXJC?= =?utf-8?B?MDI3djB5OWZnclEyUnNMWisrOHArS1MwZklZQ3poMzBEMG40dnZqM1ltMHBm?= =?utf-8?B?WnU0TGhHK1NVRmg4Q29CcTVha3lhRHlJQysyWmVVRFVTUEtRbXdQNVJTNEZ4?= =?utf-8?B?bnlEeUY4QkZnUUg0TnA2ZFpRR3ZxZGdHM1c3SGd5Q2NyQU1NWGhDQ3pSaW16?= =?utf-8?B?UmptTlFGSlN0NVFxc2xnWU5ocnZsYnpPVFNrMUNLL3M0Nnc0MXNCc3dEQXB0?= =?utf-8?B?c0FmQUZwb1A0aSs1V3NPemdKZnRuVEQvN2VhUjE5SlJ5c3FHSXhkejgvbWxL?= =?utf-8?B?Y1dNRlBrZjg2cW14dW9UZFRmQnVjaWU2cnZBSE50aUxxVUZoeTllSDk0clJS?= =?utf-8?B?UDgySnJzYUVSM29YSjVEYkhSOVR0dGV2L25rZU9hRVlKSnNzVVdrNUtjRUNh?= =?utf-8?B?ZkFJamY1aXA4UWJWSVZKU1ZZRUdKR0hxWm9JV2MrOWEzS21zL3lpSkwyZXJF?= =?utf-8?B?NnBiTFBud3lnQlhNRHgyL244NUZscjFMc28ydERLWU9uNVlYMTVEd2Nzc0Ns?= =?utf-8?B?eUd4VGhVa3l5ODEvS2UwZFVILzdIc1NPWUs4ZEpaSHEvSU9NK2dsRGkvMEJx?= =?utf-8?Q?QUGgoprkotE5EdNxYOKANLuH4=3D?= X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0160; 6:25MvbyJEYxSURygvARsLXd36TC0b3A3zjeiSu3NFDlzpIuDHQmOo3NJy6DuyQmg8SgM7crxMqHDlZpShA6364UOO6bXXIJwFGmDpqpUAqrvRw82acDbcVkSeDlBmWNqVnL1W6UepYBY+aMWauEVo85oB6lFYJGWxOJugobgGbWAsPHzC/Xxa5eWvaq40J/CN4lMCAv5ZYTmPLPYvKWcOB3ZK094zHgOZGUQ5kq0cJJXFEMcqWKwz4e5HQYz0dCzxXeqbUoLiB6niCw7bw4oB2l4HLMJYI2UP7Ba+fuaOoyGUAQtXNlzq85CZcaL4ehMcV17vwbXfWwVmbf7zc1OoNg==; 5:4HI04+c7JWcmSRZGHOuMhTs9acljL9mj4J6Z0KBH60vWmOocU0lWqZHtEuOxVGOOJPM9y08rWzri0hSJ0IAg77w/XJythJtwphj8/MhzlgrCrT6CPxUKjjPqLtX+CdfBJcfKzEeY7XNp6eS5LiovuA==; 24:bTbq2LptH8c7SG/Qc05iBxbdhBQvkG0H13NKseWskXu45u/Lt6ItLfPCRj9KFs0OD9nNz5xOo0WNb+VpZXnqv3wODnaogGNF/8JOi6DD4Ok=; 7:NnKLRj9lzTPpEZCG6wn64Ye8d4M21zl6OOuD856oUjztdEkWP7CI2LamQOlmuYRsGiOlnQ1KKC249jYoiGlx8yme0gX8nktYN3gRAohkHyiE0StbxsugfnZDYThJVHuOqr5H0UvOoXAPtvavKa6nao8RbjGccz/ijPyed4ByCMP+kEUdWy54u4N46ndM6WelmyzBuB3WNXCsrI2FV4Jl3cC7ABHaxkuS8kKUorz/kV0= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; SN1PR12MB0160; 20:qfYBgO8xw5PvOGs8DpPwqY4m3P6rVqrNBC26PZZiCiJgkM9o8X/zp9WFYsCtEZw4ooX9yQAeDDIzxKVBfM/6zYvZKQF5Fcitw43X7NDUj76VFCNSEocdpuVko2XQU5KV2+VF0xyFLvZW53KHyPf1T5OzLKqSZacdsIYJQVmOzyMPcQQlkDcx8YFiboUD2iCIAIOKfgdLyNOIJxFYvlbzRvv0m5DdOM5AkMJEZJwYgKt01Dx8mo1tUjMEI4tnQa9F X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Oct 2017 14:31:25.7509 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 84bf165d-300d-4050-15c7-08d517c73f49 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB0160 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Tom Lendacky In order for memory pages to be properly mapped when SEV is active, we need to use the PAGE_KERNEL protection attribute as the base protection. This will insure that memory mapping of, e.g. ACPI tables, receives the proper mapping attributes. Signed-off-by: Tom Lendacky Signed-off-by: Brijesh Singh Reviewed-by: Borislav Petkov Tested-by: Borislav Petkov Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: Borislav Petkov Cc: "Kirill A. Shutemov" Cc: Laura Abbott Cc: Andy Lutomirski Cc: "Jérôme Glisse" Cc: Andrew Morton Cc: Dan Williams Cc: Kees Cook Cc: x86@kernel.org Cc: linux-kernel@vger.kernel.org --- arch/x86/mm/ioremap.c | 79 ++++++++++++++++++++++++++++++++++++++++++-------- include/linux/ioport.h | 3 ++ kernel/resource.c | 19 ++++++++++++ 3 files changed, 89 insertions(+), 12 deletions(-) diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 52cc0f4ed494..6e4573b1da34 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c @@ -27,6 +27,11 @@ #include "physaddr.h" +struct ioremap_mem_flags { + bool system_ram; + bool desc_other; +}; + /* * Fix up the linear direct mapping of the kernel to avoid cache attribute * conflicts. @@ -56,17 +61,59 @@ int ioremap_change_attr(unsigned long vaddr, unsigned long size, return err; } -static int __ioremap_check_ram(unsigned long start_pfn, unsigned long nr_pages, - void *arg) +static bool __ioremap_check_ram(struct resource *res) { + unsigned long start_pfn, stop_pfn; unsigned long i; - for (i = 0; i < nr_pages; ++i) - if (pfn_valid(start_pfn + i) && - !PageReserved(pfn_to_page(start_pfn + i))) - return 1; + if ((res->flags & IORESOURCE_SYSTEM_RAM) != IORESOURCE_SYSTEM_RAM) + return false; - return 0; + start_pfn = (res->start + PAGE_SIZE - 1) >> PAGE_SHIFT; + stop_pfn = (res->end + 1) >> PAGE_SHIFT; + if (stop_pfn > start_pfn) { + for (i = 0; i < (stop_pfn - start_pfn); ++i) + if (pfn_valid(start_pfn + i) && + !PageReserved(pfn_to_page(start_pfn + i))) + return true; + } + + return false; +} + +static int __ioremap_check_desc_other(struct resource *res) +{ + return (res->desc != IORES_DESC_NONE); +} + +static int __ioremap_res_check(struct resource *res, void *arg) +{ + struct ioremap_mem_flags *flags = arg; + + if (!flags->system_ram) + flags->system_ram = __ioremap_check_ram(res); + + if (!flags->desc_other) + flags->desc_other = __ioremap_check_desc_other(res); + + return flags->system_ram && flags->desc_other; +} + +/* + * To avoid multiple resource walks, this function walks resources marked as + * IORESOURCE_MEM and IORESOURCE_BUSY and looking for system RAM and/or a + * resource described not as IORES_DESC_NONE (e.g. IORES_DESC_ACPI_TABLES). + */ +static void __ioremap_check_mem(resource_size_t addr, unsigned long size, + struct ioremap_mem_flags *flags) +{ + u64 start, end; + + start = (u64)addr; + end = start + size - 1; + memset(flags, 0, sizeof(*flags)); + + walk_mem_res(start, end, flags, __ioremap_res_check); } /* @@ -87,9 +134,10 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr, unsigned long size, enum page_cache_mode pcm, void *caller) { unsigned long offset, vaddr; - resource_size_t pfn, last_pfn, last_addr; + resource_size_t last_addr; const resource_size_t unaligned_phys_addr = phys_addr; const unsigned long unaligned_size = size; + struct ioremap_mem_flags mem_flags; struct vm_struct *area; enum page_cache_mode new_pcm; pgprot_t prot; @@ -108,13 +156,12 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr, return NULL; } + __ioremap_check_mem(phys_addr, size, &mem_flags); + /* * Don't allow anybody to remap normal RAM that we're using.. */ - pfn = phys_addr >> PAGE_SHIFT; - last_pfn = last_addr >> PAGE_SHIFT; - if (walk_system_ram_range(pfn, last_pfn - pfn + 1, NULL, - __ioremap_check_ram) == 1) { + if (mem_flags.system_ram) { WARN_ONCE(1, "ioremap on RAM at %pa - %pa\n", &phys_addr, &last_addr); return NULL; @@ -146,7 +193,15 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr, pcm = new_pcm; } + /* + * If the page being mapped is in memory and SEV is active then + * make sure the memory encryption attribute is enabled in the + * resulting mapping. + */ prot = PAGE_KERNEL_IO; + if (sev_active() && mem_flags.desc_other) + prot = pgprot_encrypted(prot); + switch (pcm) { case _PAGE_CACHE_MODE_UC: default: diff --git a/include/linux/ioport.h b/include/linux/ioport.h index 617d8a2aac67..c04d584ab5a1 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -270,6 +270,9 @@ extern int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages, void *arg, int (*func)(unsigned long, unsigned long, void *)); extern int +walk_mem_res(u64 start, u64 end, void *arg, + int (*func)(struct resource *, void *)); +extern int walk_system_ram_res(u64 start, u64 end, void *arg, int (*func)(struct resource *, void *)); extern int diff --git a/kernel/resource.c b/kernel/resource.c index 8430042fa77b..54ba6de3757c 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -397,6 +397,8 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc, res->start = p->start; if (res->end > p->end) res->end = p->end; + res->flags = p->flags; + res->desc = p->desc; return 0; } @@ -467,6 +469,23 @@ int walk_system_ram_res(u64 start, u64 end, void *arg, arg, func); } +/* + * This function calls the @func callback against all memory ranges, which + * are ranges marked as IORESOURCE_MEM and IORESOUCE_BUSY. + */ +int walk_mem_res(u64 start, u64 end, void *arg, + int (*func)(struct resource *, void *)) +{ + struct resource res; + + res.start = start; + res.end = end; + res.flags = IORESOURCE_MEM | IORESOURCE_BUSY; + + return __walk_iomem_res_desc(&res, IORES_DESC_NONE, true, + arg, func); +} + #if !defined(CONFIG_ARCH_HAS_WALK_MEMORY) /*