From patchwork Thu Feb 15 23:13:32 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Edgecombe, Rick P" X-Patchwork-Id: 13559264 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 654A1C4829E for ; Thu, 15 Feb 2024 23:15:05 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id DA99B6B0098; Thu, 15 Feb 2024 18:14:48 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id D34B08D0007; Thu, 15 Feb 2024 18:14:48 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B5F406B00A5; Thu, 15 Feb 2024 18:14:48 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 9C8236B0098 for ; Thu, 15 Feb 2024 18:14:48 -0500 (EST) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 71682C0988 for ; Thu, 15 Feb 2024 23:14:48 +0000 (UTC) X-FDA: 81795595056.09.2AE0202 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.21]) by imf09.hostedemail.com (Postfix) with ESMTP id 91768140010 for ; Thu, 15 Feb 2024 23:14:46 +0000 (UTC) Authentication-Results: imf09.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=gFlSpREV; spf=pass (imf09.hostedemail.com: domain of rick.p.edgecombe@intel.com designates 198.175.65.21 as permitted sender) smtp.mailfrom=rick.p.edgecombe@intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1708038886; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=NFCSdAhrunIzMrgwpPIPHm0AfcuiyWMeHA0mu0m/29Q=; b=Sas7LsOK5vfAM42uJH7ES/ogqjLnDoj9fqk7CbFBqKLtSr0PdFJHq1bPQv7mGGa1cWGO9M peh8coQSu/rRY4P9jVtMfwb2ATmtOr+TkGv1i3Bbu9JccIrOatkTCghbH6k/+l+hnTbPkP hj24BX+PWfXLqQJIlWcIkXFg4C7IMJ0= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1708038886; a=rsa-sha256; cv=none; b=HuPZJ3u4ixlAzdnxv2684SGuTRMMVKjcUKgF56qg/K/AUhfY9TLscPlIbHvze3lagl1YGw 6LCe7gJykNu3pwKNbWhVIqdLEns5qhjbXYc4Za5ehW1fS7v5YMBdAt0lEjKHOjbARgIXvw IhlOm8cIjz+ThIZ/vsT1tkvud/4P8JQ= ARC-Authentication-Results: i=1; imf09.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=gFlSpREV; spf=pass (imf09.hostedemail.com: domain of rick.p.edgecombe@intel.com designates 198.175.65.21 as permitted sender) smtp.mailfrom=rick.p.edgecombe@intel.com; dmarc=pass (policy=none) header.from=intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1708038887; x=1739574887; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=9Kz1B1g9YBWVQVBA7u5n8sBfRhBddgPHEWEy/INdrdY=; b=gFlSpREV4V4OV3GtTaTHHWJcwNPA9FKK7DuZDRFjZxpACQCrip7LB6fD sST/cAnckqbqE1vZerAO/fOXuQJ3L7mIWpJ62tSScdr878JH53TzwaAre byvcCoWn7OSojAtjQiwvIc/92l1VeUw0kZIIE6bnm1L+2DwfuAw9LRbQS 3+jYwx/938NpuVB1RFl6fUdU88McJTEvA6QZwJOrB0VIY3uenjSk6ZOzf EiPmrk8+QRy6iye2Wz8DXCJBjDG2bfX/recc2kH5PpDIEigpOzOVbS//k I2KHnEgTXTq4T9JnIcFQEvQHqtXyBJ1aUmNAiiheYrlWOlahD98783EKx w==; X-IronPort-AV: E=McAfee;i="6600,9927,10985"; a="2066403" X-IronPort-AV: E=Sophos;i="6.06,162,1705392000"; d="scan'208";a="2066403" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orvoesa113.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Feb 2024 15:14:43 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10985"; a="912250210" X-IronPort-AV: E=Sophos;i="6.06,162,1705392000"; d="scan'208";a="912250210" Received: from yshin-mobl1.amr.corp.intel.com (HELO rpedgeco-desk4.intel.com) ([10.209.95.133]) by fmsmga002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Feb 2024 15:14:42 -0800 From: Rick Edgecombe To: Liam.Howlett@oracle.com, akpm@linux-foundation.org, debug@rivosinc.com, broonie@kernel.org, kirill.shutemov@linux.intel.com, keescook@chromium.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, luto@kernel.org, peterz@infradead.org, hpa@zytor.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: rick.p.edgecombe@intel.com Subject: [RFC PATCH 8/8] selftests/x86: Add placement guard gap test for shstk Date: Thu, 15 Feb 2024 15:13:32 -0800 Message-Id: <20240215231332.1556787-9-rick.p.edgecombe@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240215231332.1556787-1-rick.p.edgecombe@intel.com> References: <20240215231332.1556787-1-rick.p.edgecombe@intel.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: 91768140010 X-Rspam-User: X-Rspamd-Server: rspam11 X-Stat-Signature: war7wr65a8qdm14zkc5cu3cf789b9jt4 X-HE-Tag: 1708038886-473267 X-HE-Meta: U2FsdGVkX19ZqzluOdQrsl2RQPgJBDBjL8Pgecj7MgR5eiuW7ayGh8oVoupDprVfXCXxRswc6CKB4VpiNLiGq1k1s2nfelGjlagEIjqRV1YNpcJ5rvssW8pN6CYLtbUorJrWSR5EpK3fJGx8e2lrzaIHquPeAkSaYSHZtrjcEElXs3j7C7AdI5rG4g1fDZVFGOEVUHgaAOJCJRFikrCawRv1dvU94xwQCF8gB9L2bvK3qCXJJpC8EQlK9qI3mIM0TLQRjMURP2/4vyWDrYFU7wBfhT0SxIs7daW+toeeI3YJx50NVah0Gk7Cx2y5GvkpGZMbWxAEMTBWPPs6kRJZgI0XjE9msHq3lup3D1Gyug5gXDXUiLrCj0OROFXC7Mb9n/pRSATkxLdpgSEV+T4muggO43tuhPdgVH7lBAgU0mxdmEo4TR4Hv77ufEl/3dMhCus8FNzeYgdYWBYmC1Ej/HTt6SlmOyNexi2dNeUPufO/p8U/JVi6Gtc8XCn6SaCo53M5bYH7eW1YUO+w5er9/MGJKe45GwjhqzbmqIdcm6viaAxTPeZjopqdXbOJ1k6ZGHREjcGM3ANZluZa98S/9/cQoIZE2YNyne5uk47F69LHf6a+Rfu5T4gHbIZIj5Zu4nd0i/e8y7GNUoxlHBVY9I7kW+PH7AwUVN50Pq1fcE3+AmhCQIXzaGrzhwu0aeLuikQwVKqRl91N74bl3aGlCNFqO+1AlpGkm3oUvJE18fjfqRRpk0+sgBQzmyCFfLWP9vckwTS/7EdG6m44EwEqARR23si+RxAR2iGmKAPtVOCOAdVcKct3zn7kLNUJEoMpySjpbXiGytkc4/NKhkvMN3I87gL+aw7oO8kaWKwuEQrjgIGrIGP17myRjdP3Kc9x X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: The existing shadow stack test for guard gaps just checks that new mappings are not placed in an existing mapping's guard gap. Add one that checks that new mappings are not placed such that preexisting mappings are in the new mappings guard gap. Signed-off-by: Rick Edgecombe --- .../testing/selftests/x86/test_shadow_stack.c | 67 +++++++++++++++++-- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/x86/test_shadow_stack.c b/tools/testing/selftests/x86/test_shadow_stack.c index 757e6527f67e..ee909a7927f9 100644 --- a/tools/testing/selftests/x86/test_shadow_stack.c +++ b/tools/testing/selftests/x86/test_shadow_stack.c @@ -556,7 +556,7 @@ struct node { * looked at the shadow stack gaps. * 5. See if it landed in the gap. */ -int test_guard_gap(void) +int test_guard_gap_other_gaps(void) { void *free_area, *shstk, *test_map = (void *)0xFFFFFFFFFFFFFFFF; struct node *head = NULL, *cur; @@ -593,11 +593,64 @@ int test_guard_gap(void) if (shstk - test_map - PAGE_SIZE != PAGE_SIZE) return 1; - printf("[OK]\tGuard gap test\n"); + printf("[OK]\tGuard gap test, other mapping's gaps\n"); return 0; } +/* Tests respecting the guard gap of the mapping getting placed */ +int test_guard_gap_new_mappings_gaps(void) +{ + void *free_area, *shstk_start, *test_map = (void *)0xFFFFFFFFFFFFFFFF; + struct node *head = NULL, *cur; + int ret = 0; + + free_area = mmap(0, PAGE_SIZE * 4, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + munmap(free_area, PAGE_SIZE * 4); + + /* Test letting map_shadow_stack find a free space */ + shstk_start = mmap(free_area, PAGE_SIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (shstk_start == MAP_FAILED || shstk_start != free_area) + return 1; + + while (test_map > shstk_start) { + test_map = (void *)syscall(__NR_map_shadow_stack, 0, PAGE_SIZE, 0); + if (test_map == MAP_FAILED) { + printf("[INFO]\tmap_shadow_stack MAP_FAILED\n"); + ret = 1; + break; + } + + cur = malloc(sizeof(*cur)); + cur->mapping = test_map; + + cur->next = head; + head = cur; + + if (test_map == free_area + PAGE_SIZE) { + printf("[INFO]\tNew mapping has other mapping in guard gap!\n"); + ret = 1; + break; + } + } + + while (head) { + cur = head; + head = cur->next; + munmap(cur->mapping, PAGE_SIZE); + free(cur); + } + + munmap(shstk_start, PAGE_SIZE); + + if (!ret) + printf("[OK]\tGuard gap test, placement mapping's gaps\n"); + + return ret; +} + /* * Too complicated to pull it out of the 32 bit header, but also get the * 64 bit one needed above. Just define a copy here. @@ -850,9 +903,15 @@ int main(int argc, char *argv[]) goto out; } - if (test_guard_gap()) { + if (test_guard_gap_other_gaps()) { ret = 1; - printf("[FAIL]\tGuard gap test\n"); + printf("[FAIL]\tGuard gap test, other mappings' gaps\n"); + goto out; + } + + if (test_guard_gap_new_mappings_gaps()) { + ret = 1; + printf("[FAIL]\tGuard gap test, placement mapping's gaps\n"); goto out; }