From patchwork Mon Dec 20 16:38:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Leroy X-Patchwork-Id: 1571118 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org (client-ip=2404:9400:2:0:216:3eff:fee1:b9f1; helo=lists.ozlabs.org; envelope-from=linuxppc-dev-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org; receiver=) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2404:9400:2:0:216:3eff:fee1:b9f1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4JHlgH3sXXz9sCD for ; Tue, 21 Dec 2021 03:39:55 +1100 (AEDT) Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4JHlgH2gyhz3cnD for ; Tue, 21 Dec 2021 03:39:55 +1100 (AEDT) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=csgroup.eu (client-ip=2a01:111:f400:7e18::615; helo=fra01-pr2-obe.outbound.protection.outlook.com; envelope-from=christophe.leroy@csgroup.eu; receiver=) Received: from FRA01-PR2-obe.outbound.protection.outlook.com (mail-pr2fra01on0615.outbound.protection.outlook.com [IPv6:2a01:111:f400:7e18::615]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4JHldc2j8zz2xtF for ; Tue, 21 Dec 2021 03:38:28 +1100 (AEDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=HuqtrAq6Wtlc2rD/0LhRbz5/9myZJPOto4euONQeVO1JLbxVKqsOoy4qfJAi88YjNEmSfEFWmO59cx+YyE5nkXvueosAOX9WNLr9YetOn4Yb1ebXDwOzsNkEiKwtdQvNhoE5qFBRUf7nYB+fc2tapOqltjzo+hjHZ9vSVT9AFxqWnRWnjVd/yZhkLnVP1femWg5e9W63pnUS2AtszaSwJrNNSwGhrtRf5/n4OTEZ8GKqQRj5XGwFZSKkHd0/Bqxp/OpBwkoE9m+yZP1KvJJq0rkWBl8WBesqLYlnAarIOeGqPHzd4EYrog4IesOtaHkscF7CX/jn0nFFxOnRIvuT6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=YjkLzccxBgRUBZrcs677amlRn+CXlywVi4YSlZ0Z6Bk=; b=RQSugFjHwPSP434xZTVF5Wn2JgkZ+cozfxrxear8imbq4kx7VxaGKVaBUYv93TvCF/6K23Q2l9DdRs8+Nm+27JEE0Of1lVoAEn0agCwJ1EK6YX+G8CqBlc1J9vyo96WIkwB+qj1QM+c26slfz5AZJQdqPHVOT9qo9FA+hWyxUVU/gTCp0/ADe16WTC+MYNjhortVB58BaPD8RzaDJXv5qlMCjVklFkEdGBMEkCUz8870fZjBV5pP5CmLy3E8Nf7IX+RRqKQZCNaTfz1wAhfgIm82yh3y9q+l+IoOAYHEbCwm/lhsdJmE5+xAnGNu7cK58YMpZuFw4k3CZ/+oPD1RpA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=csgroup.eu; dmarc=pass action=none header.from=csgroup.eu; dkim=pass header.d=csgroup.eu; arc=none Received: from MRZP264MB2988.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:31::15) by MR1P264MB2161.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:14::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4801.15; Mon, 20 Dec 2021 16:38:09 +0000 Received: from MRZP264MB2988.FRAP264.PROD.OUTLOOK.COM ([fe80::f0ef:856d:b0de:e85d]) by MRZP264MB2988.FRAP264.PROD.OUTLOOK.COM ([fe80::f0ef:856d:b0de:e85d%5]) with mapi id 15.20.4801.020; Mon, 20 Dec 2021 16:38:09 +0000 From: Christophe Leroy To: Josh Poimboeuf , Jiri Kosina , Miroslav Benes , Petr Mladek , Joe Lawrence , Steven Rostedt , Ingo Molnar , "Naveen N . Rao" Subject: [PATCH v2 03/13] powerpc/module_32: Fix livepatching for RO modules Thread-Topic: [PATCH v2 03/13] powerpc/module_32: Fix livepatching for RO modules Thread-Index: AQHX9b/55CfsfkREwkW5lW2tFTV26g== Date: Mon, 20 Dec 2021 16:38:09 +0000 Message-ID: References: In-Reply-To: Accept-Language: fr-FR, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=csgroup.eu; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 6484999f-1959-4747-8320-08d9c3d71b9b x-ms-traffictypediagnostic: MR1P264MB2161:EE_ x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:2887; x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 440SdqYZHu3Y98exsSrbVVTqc7r1xusAGUTHX5cl3UfQV3A7bJHh6dbvNqeWTIIJeI+l5ViGT0nr8gzKq2ZW3C0SEJa86kBXiyIXSAE3QMoPThY51hl44Myd4ixvbbCE9bmt1C1NCSPsLck3G0vXXKMtQwIkbB+zlF0OXD5WFzoS2wXQ4rN2UW89f17WFwJKrDTZyS8d1TmUvbg3i7feuA0ACwUN5xKLhypOsvS9eenDuQN8TuO6cUO8ddGu6BBM7696DEsHC+MSfhWC9q6DB7KaAsEXuEVLg5ilZtc9sQrBc+25Z6KmeMVehNSeetoYFapM9OJOI2GrOet8ncuGk19C1n0If4+Z0z205Rt9D4fYUE+k4uWGijw9WjjPOuy+8ZwELO1JO0xwme2qKINrm+cRhgM1FFjw9FAh3EPBUQiXUTEeZCNa7yYyxOwq32HHQuh8O7Ef1qNV3QKBuZcxwLM6eQDpbMp2qyKgd6W8AqBAzhgj9FDFEHHCphhSGcqIM/F+x6aZGlHnvFyH9WsgSOBadhxe8a3rnMUEL9aoI7L4xYIKA8gpZSxAgGIpzo8guYTEUsSRDylODAkR9dyWMjr/UxwHj4A3p51ocDhGdAiTqhDWXxLWGRUQdyS0rxGcuO9t+Ydc8vce32CGQmbAhmLlYwFlPuZ99muPFaClm6qX2H54mIBJvbN9+M0EW2WfzfT4BN6G1GUV3Cyf7IO5zw== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MRZP264MB2988.FRAP264.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(4636009)(366004)(44832011)(26005)(316002)(110136005)(6486002)(186003)(54906003)(122000001)(8936002)(36756003)(64756008)(76116006)(7416002)(66556008)(66476007)(91956017)(38100700002)(2906002)(66946007)(66446008)(38070700005)(83380400001)(5660300002)(508600001)(6506007)(4326008)(6512007)(86362001)(2616005)(8676002)(71200400001); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?q?sG3rK+HFlesylhsqjaYVrVB?= =?iso-8859-1?q?ujlPgBXZSrkp8JsfKNhEMprIMLMdxQho1JeofzHS4PmcnkMDLIKEFUgF8TNO?= =?iso-8859-1?q?1eYHeFwxXqE9rlWvKn4FCBKQZdbP2hP6IsTCMDGCGIYVWn0B4kd02oGkd7fy?= =?iso-8859-1?q?4miho61ZZdMqQAG1HOkN6iecHPT9f8Uf8igSBL6Nba1usoZSIcUap8GWqsJn?= =?iso-8859-1?q?pnYAYYCFrnileK52oNrqqXKEvBMhmEDFjEbHyOd9hwICWZUfnQCz2cL4HLkx?= =?iso-8859-1?q?DfsIiWYhKzeYpO9cjd5RSyogz5Q9BKbmAVchV1c8nKRuNh1xipn19F0Scdl4?= =?iso-8859-1?q?O9NDGLB52LUwIWFMrh5mIC9bEzS3JX/9UqZQyx0NrmsMwuxAgn57H5pEpnl0?= =?iso-8859-1?q?JMsJNZ7Jz/ow72zstoH+xkwcIvq3Cj7Le86kNzvxwkRN5jI5zEdEKdfg1Kaz?= =?iso-8859-1?q?9oYhsZ8tfOvAqZMl96Pw0YKbf6HhzOA/YgOwdA0KkNZ/BN05Tb9eCtir5s1s?= =?iso-8859-1?q?XuP8VJDpvL0yK5xr5TZBKpxMmv0jsAKMphDLQJX+ek5COa4UtmWQMGuHxbMN?= =?iso-8859-1?q?3XOV9bALbUV/H5i2rQclyMQgnC7osJNz1//+cpSWhOGKFLqNs/OlymyqDgQF?= =?iso-8859-1?q?hWPSnrSiLvnwjcjOmns4rQ696xpqx485AL64fLsGwOBeEmDeowLIwCohmaKn?= =?iso-8859-1?q?S55n+ag6AYrHvQpd64BU+Y+6NXle3Y9/wEBbhg/BVSZuZEWnCC5BI2425MUu?= =?iso-8859-1?q?+KayyvBCqPQt6GCYZcxp+gz9YHATgrlqIPavkmIixvs5vu7HFaNFoNnqUxzF?= =?iso-8859-1?q?IXq75PxXSr2VXf/RzpJlGIhfXX5nWNzDtt7wCB3ZBRwXjuBYBnzP0KnJfQH3?= =?iso-8859-1?q?Mboa2aZ8NVK+zK6YHfZ35h7nhUMdh/zzjxNeLniSs/LkoamLXR2D8I3Ad9Ey?= =?iso-8859-1?q?PLciK2Dl5bfhVuoOFx7uyzzhPzG9hg4naflI0Cbq8KdCPAvoMDHPU3scF1WS?= =?iso-8859-1?q?uZdvxbfFnAf2Ypj5X/TC83xTgrOKFUBF/yYhuODebbxqjsTio0DFOvUJEz0U?= =?iso-8859-1?q?MoOLuxKuduD0JxZsFn02PfTVoJ0pjK2rtgRCH5TdzKIY107Kj/qQ2ks9JsW6?= =?iso-8859-1?q?GcpbFW6uTTAODVtQWe8caw575ArJZfsu/LaCpU6f/pt/d1SehEUuZqobjhFb?= =?iso-8859-1?q?XbEnPmiLAgCv00jpyLAlvTHAqtATxZXXmOf9cgh8oZglyk/Gy9W/Ze05ujJQ?= =?iso-8859-1?q?6mnvBx+fcQyAODqNaGxfIYnp0Qt7cYYc74r5uWE7wKVLWDvcg9ScjA/v59W8?= =?iso-8859-1?q?Y0cWP6XWxETc8Edkcj02dvUEWET1XyPKw/p4c1wHJbb6Nfbp2eF0XB7DJmXb?= =?iso-8859-1?q?Cw9Fho/g3RfFe6jnv9lDM7UPXuR/SIGUWmLZ3EiLlt8sKqvXZ4AvE+TeS7V4?= =?iso-8859-1?q?/TMY+jiuf6VkS/+wMSChtG+pTzdJn1bNGX09ukEgqSFXgAfSt9AmhbJUDzMa?= =?iso-8859-1?q?+HRKYNAh/+ltuKqKq+zgD8ofBMW+NCmdCM+8T3dnyxYHU5e46BaAFOn323Jj?= =?iso-8859-1?q?U1vl4AKBFbpTr7lghbjrq+OlyhS1OEMTsCsURfB3r9Il6D5sRY1HGdMr8oej?= =?iso-8859-1?q?Xv4OBbwbpvGcrdnXhyELlQ2HYm93uuueGpWiEY4NGJUb7BeT317zj8TpcwDC?= =?iso-8859-1?q?vEbYTW8qaDgl9vYoGDFMdiRicm2w8YN15QxGo8SOg5zRtc2j/qySduheX+D/?= =?iso-8859-1?q?AV1w=3D?= MIME-Version: 1.0 X-OriginatorOrg: csgroup.eu X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MRZP264MB2988.FRAP264.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: 6484999f-1959-4747-8320-08d9c3d71b9b X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Dec 2021 16:38:09.7416 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 9914def7-b676-4fda-8815-5d49fb3b45c8 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: GZHRbB1aDTXT1HxJdy/bGrJCSDMuaIcXXMixkTFZh2jx5D95+dnW4BhRrNxQqMot8ZDOYglbc0jXjxmyKRcbyxa7XncZHBAsA+KpN6oDxBA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MR1P264MB2161 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "live-patching@vger.kernel.org" , "linuxppc-dev@lists.ozlabs.org" , "linux-kernel@vger.kernel.org" Errors-To: linuxppc-dev-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Livepatching a loaded module involves applying relocations through apply_relocate_add(), which attempts to write to read-only memory when CONFIG_STRICT_MODULE_RWX=y. R_PPC_ADDR16_LO, R_PPC_ADDR16_HI, R_PPC_ADDR16_HA and R_PPC_REL24 are the types generated by the kpatch-build userspace tool or klp-convert kernel tree observed applying a relocation to a post-init module. Use patch_instruction() to patch those relocations. Commit 8734b41b3efe ("powerpc/module_64: Fix livepatching for RO modules") did similar change in module_64. Signed-off-by: Christophe Leroy Cc: Russell Currey Acked-by: Joe Lawrence --- arch/powerpc/kernel/module_32.c | 44 ++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/arch/powerpc/kernel/module_32.c b/arch/powerpc/kernel/module_32.c index a491ad481d85..a0432ef46967 100644 --- a/arch/powerpc/kernel/module_32.c +++ b/arch/powerpc/kernel/module_32.c @@ -18,6 +18,7 @@ #include #include #include +#include /* Count how many different relocations (different symbol, different addend) */ @@ -174,15 +175,25 @@ static uint32_t do_plt_call(void *location, entry++; } - entry->jump[0] = PPC_RAW_LIS(_R12, PPC_HA(val)); - entry->jump[1] = PPC_RAW_ADDI(_R12, _R12, PPC_LO(val)); - entry->jump[2] = PPC_RAW_MTCTR(_R12); - entry->jump[3] = PPC_RAW_BCTR(); + if (patch_instruction(&entry->jump[0], ppc_inst(PPC_RAW_LIS(_R12, PPC_HA(val))))) + return 0; + if (patch_instruction(&entry->jump[1], ppc_inst(PPC_RAW_ADDI(_R12, _R12, PPC_LO(val))))) + return 0; + if (patch_instruction(&entry->jump[2], ppc_inst(PPC_RAW_MTCTR(_R12)))) + return 0; + if (patch_instruction(&entry->jump[3], ppc_inst(PPC_RAW_BCTR()))) + return 0; pr_debug("Initialized plt for 0x%x at %p\n", val, entry); return (uint32_t)entry; } +static int patch_location_16(uint32_t *loc, u16 value) +{ + loc = PTR_ALIGN_DOWN(loc, sizeof(u32)); + return patch_instruction(loc, ppc_inst((*loc & 0xffff0000) | value)); +} + int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, @@ -216,37 +227,42 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, case R_PPC_ADDR16_LO: /* Low half of the symbol */ - *(uint16_t *)location = value; + if (patch_location_16(location, PPC_LO(value))) + return -EFAULT; break; case R_PPC_ADDR16_HI: /* Higher half of the symbol */ - *(uint16_t *)location = (value >> 16); + if (patch_location_16(location, PPC_HI(value))) + return -EFAULT; break; case R_PPC_ADDR16_HA: - /* Sign-adjusted lower 16 bits: PPC ELF ABI says: - (((x >> 16) + ((x & 0x8000) ? 1 : 0))) & 0xFFFF. - This is the same, only sane. - */ - *(uint16_t *)location = (value + 0x8000) >> 16; + if (patch_location_16(location, PPC_HA(value))) + return -EFAULT; break; case R_PPC_REL24: if ((int)(value - (uint32_t)location) < -0x02000000 - || (int)(value - (uint32_t)location) >= 0x02000000) + || (int)(value - (uint32_t)location) >= 0x02000000) { value = do_plt_call(location, value, sechdrs, module); + if (!value) + return -EFAULT; + } /* Only replace bits 2 through 26 */ pr_debug("REL24 value = %08X. location = %08X\n", value, (uint32_t)location); pr_debug("Location before: %08X.\n", *(uint32_t *)location); - *(uint32_t *)location - = (*(uint32_t *)location & ~0x03fffffc) + value = (*(uint32_t *)location & ~0x03fffffc) | ((value - (uint32_t)location) & 0x03fffffc); + + if (patch_instruction(location, ppc_inst(value))) + return -EFAULT; + pr_debug("Location after: %08X.\n", *(uint32_t *)location); pr_debug("ie. jump to %08X+%08X = %08X\n",