From mboxrd@z Thu Jan 1 00:00:00 1970 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 2CAFDC4332F for ; Tue, 31 Oct 2023 13:11:56 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 65B286B02EC; Tue, 31 Oct 2023 09:11:55 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 60A426B02F3; Tue, 31 Oct 2023 09:11:55 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4D2296B02F4; Tue, 31 Oct 2023 09:11:55 -0400 (EDT) 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 3B30E6B02EC for ; Tue, 31 Oct 2023 09:11:55 -0400 (EDT) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 08AC51A0697 for ; Tue, 31 Oct 2023 13:11:55 +0000 (UTC) X-FDA: 81405794190.11.DB2B3CF Received: from smtp-relay-internal-0.canonical.com (smtp-relay-internal-0.canonical.com [185.125.188.122]) by imf21.hostedemail.com (Postfix) with ESMTP id CDE421C000D for ; Tue, 31 Oct 2023 13:11:52 +0000 (UTC) Authentication-Results: imf21.hostedemail.com; dkim=pass header.d=canonical.com header.s=20210705 header.b="R/j0hF+y"; dmarc=pass (policy=none) header.from=canonical.com; spf=pass (imf21.hostedemail.com: domain of emil.renner.berthing@canonical.com designates 185.125.188.122 as permitted sender) smtp.mailfrom=emil.renner.berthing@canonical.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1698757913; a=rsa-sha256; cv=none; b=qOEkeBRnkFSUKVZF2lHbBHQt5/NpYahSpq93HOlqqaIV5s8DDXLDs8Rfrfe8/1d5LZvO3P Q5LBqy5RJejndkIhqk1NceV+rcGZEvRZZ9IAj1vFlzmJh36r0jzCcLxpZKnCwOsObNSmUE TVyJ+F8hiXcPjlYeiH/hPYd55wg3qG4= ARC-Authentication-Results: i=1; imf21.hostedemail.com; dkim=pass header.d=canonical.com header.s=20210705 header.b="R/j0hF+y"; dmarc=pass (policy=none) header.from=canonical.com; spf=pass (imf21.hostedemail.com: domain of emil.renner.berthing@canonical.com designates 185.125.188.122 as permitted sender) smtp.mailfrom=emil.renner.berthing@canonical.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1698757913; 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-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=b2T7hXExx+WhS9Dv9tSkQ0JEJTevpbCwf8KukhTzG9g=; b=3PlEKbkq3EssZ1ZPa3GX80S8LbuWMzxuxG1E4zSb8/jH0+XsTdBSQIzwMNYMlQnvRRPnVM FdCTK2CcGJXisO28XDvsIc3il73OIu6lxb+OSbPWWSCAFRbqO95oFBl6zJBCZEXEzcp4Hx n4/wqu77qf3cFkoYrDrHFOScpfwym+U= Received: from mail-qt1-f198.google.com (mail-qt1-f198.google.com [209.85.160.198]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id DA6543FADE for ; Tue, 31 Oct 2023 13:11:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1698757909; bh=b2T7hXExx+WhS9Dv9tSkQ0JEJTevpbCwf8KukhTzG9g=; h=From:In-Reply-To:References:Mime-Version:Date:Message-ID:Subject: To:Cc:Content-Type; b=R/j0hF+yzHC4mSPpdt5KQbhhTTlhtghcZ5ijNHTKXOSaFXWFjLzCMmsiIW/IeGQjE 2si+app0Ee7OvW4k5LpELpJQCT/5/+MAFvpAFKs1y9B57HlVquq2A+2JXsPRAElNRM smABtyAMnUmkU/MkZFdahAvbWWPxYG5LFkMwwusdzwjJO3BpK/EhMpvQ69SGL0Vj7V ubxco5g3Tb0sqE8ngZ8+zutJm06c6wFCLkGaVzDT/TNg9puvOlzskhAG6hF9Zi97Gv GAxl/D8+UFlFec5Twb1hc3JZQQM2KbLol5I/qTzcyvzpPbAcgxZZxvQdX8hV5P/xZk pSeL2ca2Y/nLw== Received: by mail-qt1-f198.google.com with SMTP id d75a77b69052e-41cdffe4d1cso70001911cf.0 for ; Tue, 31 Oct 2023 06:11:49 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698757908; x=1699362708; h=cc:to:subject:message-id:date:mime-version:references:in-reply-to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=b2T7hXExx+WhS9Dv9tSkQ0JEJTevpbCwf8KukhTzG9g=; b=tmk5woY27gJSS9Gl9MfwVn8lXzl6RUYisuxjdV6Qdwe7XwQ+MKbrw600YtZij5AYqS 3t4tF6uGNVZGjAb8S+0CSendTQb5i3IXionBP/Zb49ehAg3AMj8CemrnpEPat0KBegTl ynAxY1R6f/qcAhv9h8RfHWgSn99v4qUf0NVT+8LhQQrEtnCwIxlfK5Pjpv7w6YWmRma2 AUpBQXqnz231aPRsG42K2gbqFuvnKO3noxTsW5tITGM3BRxg1uW2JgIAhIANcr0Vc0xJ HzXxS1MPpTDsUk7WBRz7mMBwWr7hvekjQT2uVRoOVOGKWAXKlbe1TrafjjySHvoJCHY8 cwSw== X-Gm-Message-State: AOJu0YwDPGHHuXiR3TfpUenlcIG/mKEuIghGRkkCWY3/xrmkjo8KPGVX mVkwVnr36lt6mK4Kqj77LoUmwgX7lpJA6dDOkTNIjYBtUlvyI51TW8TgudEgpmQqvGBg3H7CHXn R5X23pOK5bwu/917DUt+btwzsBswvBrJAEfa8ugy1G3FE X-Received: by 2002:a05:622a:351:b0:418:d3d:30e1 with SMTP id r17-20020a05622a035100b004180d3d30e1mr15984872qtw.4.1698757908400; Tue, 31 Oct 2023 06:11:48 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGLydeufNQ40CIQK34i2W51RxoHoaC5kevrpJPqzBNZkr96WHN3wruIvi91h0D+mmmgNmgd+N5Yhsyd5FWYItM= X-Received: by 2002:a05:622a:351:b0:418:d3d:30e1 with SMTP id r17-20020a05622a035100b004180d3d30e1mr15984845qtw.4.1698757908147; Tue, 31 Oct 2023 06:11:48 -0700 (PDT) Received: from 348282803490 named unknown by gmailapi.google.com with HTTPREST; Tue, 31 Oct 2023 06:11:47 -0700 From: Emil Renner Berthing In-Reply-To: <20231031-module_relocations-v7-1-6f4719b64bf7@rivosinc.com> References: <20231031-module_relocations-v7-0-6f4719b64bf7@rivosinc.com> <20231031-module_relocations-v7-1-6f4719b64bf7@rivosinc.com> Mime-Version: 1.0 Date: Tue, 31 Oct 2023 06:11:47 -0700 Message-ID: Subject: Re: [PATCH v7 1/3] riscv: Avoid unaligned access when relocating modules To: Charlie Jenkins , linux-riscv@lists.infradead.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: Eric Biederman , Kees Cook , Paul Walmsley , Palmer Dabbelt , Albert Ou , Andreas Schwab , Emil Renner Berthing , Samuel Holland , Nelson Chu , Emil Renner Berthing Content-Type: text/plain; charset="UTF-8" X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: CDE421C000D X-Stat-Signature: oapzmdb38oubfju1cmst1qf8grshuksd X-HE-Tag: 1698757912-966957 X-HE-Meta: U2FsdGVkX1+JvdCgUENYaCEOjrxd2ya2J835vqYcHlqAIpVqYBujftV9H41ohU4UfYpgS/g4m36FcZ5tPfXykqGeNbfR5yjQ77Q8KPMj6O8tYBaYwPvaVQTLVVA2TgLZqD+q+3F0J++XKSvCV2T8zEZAYQsDyHZWftIGc0XHMm3QjHkGapt2ZsuxvBcCdDC//Gr5z4R8lEEQCmO8FdVyiCjmcYvuU+vBXS5YpOZKZiXcYvV5g6TvMUxFZfnSgrokJdZwZUj2j7U3Cezke4H1uRLZ7g3h+Ow5/Yp04htX7zU7egjhtsJ5GRz4WdpJNdAHKzdM0Wzc9QW63+zu2Qe9VRL/K1ZHaABQSyQum7a3eE8iHyLnqE3s/IJBpKQjRIgWZyrCvbJIJ11xBlBxG6OUD+C4O1IahdPdmB6hfKTXJQFUz3qulnbW6CqBQqUy+875IwG22hFwz+qL9VUqlI6AQP3vAJO8lcMC1+Np5Ha9323Q01o+c2cwwu6r7MmLT8uZCEix0X7vW/6iJETf7JcF1nhl4CV1IOltAD7yO4sg0mY+MgAf4c352MsUug/iUxko3jSagTpdaWHL2FQeyxvkuHm60p6EP0Au1HgqKXSFBPtIbdSPdAOU/sFXIVg6ZESRINBKh5A+OJEvaKcO9rarx0gFH3s0Ct0eu94NY7IdDtldwuEUPk0Qmk8qo+qR0LST0B+6sxQtjXvq7YrXK9Iq218BqBNYtkM2Y20navR34PcrGaJbEZVxiU08JG/sWBSGuozQwMImm7l0a6CedmiNxcLkU3OKGIFp8jp+EQJU/kv6iqJui0i2Nr6xfXCGo2QHrhu5DX8XCB9p1nBjQLDv/zlPH8LXQJ1v7dfOaElIP1Biw4OMcjtdX1c2N+XERyC4SxScQWQ6CsajFlJHq4s6zreyRo67709+6ENRwA9TMvOx0rsdpGhCyQG6ZnNwRHme4efRAZbThJXDLMHYu2g 7ah8ToC6 L5eaSVpCsGj1HunMQuxz/2jXzKL1eSjsEqyE9YaZjZgCTBUTf8kW2dzeoqPegcpxEMNQxUIGm0eIsqpD8sDpCwnOqXNxLHvpuCui0G9s1ttPrzp0lLDqPSl3cc6PAEbSI4qaCmspHZ5SewdBQ1S9OD/5dllP7Z0Kjclt2WP7F4Nencsay7tZXWD8m3Yj6DMtDCbBdQxocg2EpkJNXHOfi7QRtcOPbk+NPLQzUPvHYrp5SwmhcnePx2tmTJB90PpfRulQ8nme9AS8SxpFGGMieq7rkN4xBrwrihf1IwJKoI2psSUlU9FYFd1mHy2RdHH7YnGhYKrqnzzie5Nm7oGjWvJ2eGvgKw5nGNUyBaETL0hrkfoxyzUWxvdgk/YMPX0fBWbkoR1aqDju9Lmw= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000003, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Charlie Jenkins wrote: > From: Emil Renner Berthing > > With the C-extension regular 32bit instructions are not > necessarily aligned on 4-byte boundaries. RISC-V instructions > are in fact an ordered list of 16bit little-endian > "parcels", so access the instruction as such. > > This should also make the code work in case someone builds > a big-endian RISC-V machine. > > Signed-off-by: Emil Renner Berthing > Signed-off-by: Charlie Jenkins > --- > arch/riscv/kernel/module.c | 153 +++++++++++++++++++++++---------------------- > 1 file changed, 77 insertions(+), 76 deletions(-) > > diff --git a/arch/riscv/kernel/module.c b/arch/riscv/kernel/module.c > index 7c651d55fcbd..a9e94e939cb5 100644 > --- a/arch/riscv/kernel/module.c > +++ b/arch/riscv/kernel/module.c > @@ -27,68 +27,86 @@ static bool riscv_insn_valid_32bit_offset(ptrdiff_t val) > #endif > } > > -static int apply_r_riscv_32_rela(struct module *me, u32 *location, Elf_Addr v) > +static int riscv_insn_rmw(void *location, u32 keep, u32 set) > +{ > + u16 *parcel = location; > + u32 insn = (u32)le16_to_cpu(parcel[0]) | (u32)le16_to_cpu(parcel[1]) << 16; > + > + insn &= keep; > + insn |= set; > + > + parcel[0] = cpu_to_le32(insn); Why cpu_to_le32(insn)? Unless I've misunderstood something downcasting unsigned to unsigned values in C (eg. from u32 to u16) is defined to always discard the most signifcant bits, so cpu_to_le16(insn) should be fine. > + parcel[1] = cpu_to_le16(insn >> 16); > + return 0; > +} > + > +static int riscv_insn_rvc_rmw(void *location, u16 keep, u16 set) > +{ > + u16 *parcel = location; > + > + *parcel = cpu_to_le16((le16_to_cpu(*parcel) & keep) | set); In this case, maybe consider writing it out like above just so it's easy to see that the two functions does the same just for differently sized instructions. The compiler should generate the same code. > + return 0; > +} > + > ...