Received: by 10.213.65.68 with SMTP id h4csp1521859imn; Thu, 15 Mar 2018 01:56:28 -0700 (PDT) X-Google-Smtp-Source: AG47ELszLxOhdwbJRhwZNuSeDV3AqHa3Fwm/367IggWB2/qy66HoG2SqTOJdnyeZOjblFkjURW1U X-Received: by 2002:a17:902:a9c7:: with SMTP id b7-v6mr7091775plr.190.1521104188050; Thu, 15 Mar 2018 01:56:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521104188; cv=none; d=google.com; s=arc-20160816; b=EdLVz3jAy5gphU+lMZFcylrJ+9mgrqDH4HoGIC5YCGY/O0Ls92aGj1+yGkglS+zQ4+ 7tyLE+RLY2ubT/sXU6W+IZmK2tw9te4IQFTuj+/V8T3BV8XkuhMAXw3tytmQSRuTowdN A4t2R6VKsYaNB6/wxlWbxZ8xrT8TjCIYFPLERr/7o0EXwDYzCpB+bWTSC+vPurl/iB6o Ut2c6z0xQY5dJQAE26+VO9hSUSDXxcXAM68mE6La0svFmaU/9xQ2KGUylGdMwzj/j/Xv muVe68uMDioKRt9GiEVWqC/NmBGa5wugQPwwOWfo3O+uORFMfs0vdGYFNtQSqZ/ph9+P ALzw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=ZfthV1cxJbf5ViiTiUO4DueLyzPllyeakd79iZfMkco=; b=xgixNLiuQI82GVBO1QAe9g6OVOT7yX6277fZeBpm1DjBt/vougt2Kl7WygZ7yrOu2Z u73vJepASL4QUrxxBsJtj5gue3a9V7ArohfYKqKr+QPc1slzaY5VcKbuMu+NQiUN6GUG wrUFKGHfgAnTXHkjOYyOTPdX8fpmbp1D1TpQ1W9K+Qoigg2KEL2fEBam6MqvDq1B8g4d tS/+oVblWm4bAMovykOpk9a9yBl5jyMqv8ZLQFQ9Vp2y3LuXDMVjR751HMYD7cQYpTcz xXBA+0XMbfwD02indC0K+YbcUxpmnb+SNJzyoZP+LaVwMHlRXEm6kHp/0XiH3fWWUTiC tFSA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q84si3524463pfa.358.2018.03.15.01.56.13; Thu, 15 Mar 2018 01:56:28 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751765AbeCOIvp (ORCPT + 99 others); Thu, 15 Mar 2018 04:51:45 -0400 Received: from exmail.andestech.com ([59.124.169.137]:8001 "EHLO ATCSQR.andestech.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751729AbeCOIvn (ORCPT ); Thu, 15 Mar 2018 04:51:43 -0400 Received: from mail.andestech.com (atcpcs16.andestech.com [10.0.1.222]) by ATCSQR.andestech.com with ESMTP id w2F8lp8f080949; Thu, 15 Mar 2018 16:47:51 +0800 (GMT-8) (envelope-from zong@andestech.com) Received: from atcsqa06.andestech.com (10.0.1.85) by ATCPCS16.andestech.com (10.0.1.222) with Microsoft SMTP Server id 14.3.123.3; Thu, 15 Mar 2018 16:51:27 +0800 From: Zong Li To: , , , , , CC: Subject: [PATCH v2 05/11] RISC-V: Support HI20/LO12_I/LO12_S relocation type in kernel module Date: Thu, 15 Mar 2018 16:50:45 +0800 Message-ID: X-Mailer: git-send-email 2.7.4 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.0.1.85] X-DNSRBL: X-MAIL: ATCSQR.andestech.com w2F8lp8f080949 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org HI20 and LO12_I/LO12_S relocate the absolute address, the range of offset must in 32-bit. Signed-off-by: Zong Li --- arch/riscv/kernel/module.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/arch/riscv/kernel/module.c b/arch/riscv/kernel/module.c index 3f2730840c25..f1bd6b1a4520 100644 --- a/arch/riscv/kernel/module.c +++ b/arch/riscv/kernel/module.c @@ -92,6 +92,45 @@ static int apply_r_riscv_pcrel_lo12_s_rela(struct module *me, u32 *location, return 0; } +static int apply_r_riscv_hi20_rela(struct module *me, u32 *location, + Elf_Addr v) +{ + s32 hi20; + + if (IS_ENABLED(CMODEL_MEDLOW)) { + pr_err( + "%s: target %016llx can not be addressed by the 32-bit offset from PC = %p\n", + me->name, v, location); + return -EINVAL; + } + + hi20 = ((s32)v + 0x800) & 0xfffff000; + *location = (*location & 0xfff) | hi20; + return 0; +} + +static int apply_r_riscv_lo12_i_rela(struct module *me, u32 *location, + Elf_Addr v) +{ + /* Skip medlow checking because of filtering by HI20 already */ + s32 hi20 = ((s32)v + 0x800) & 0xfffff000; + s32 lo12 = ((s32)v - hi20); + *location = (*location & 0xfffff) | ((lo12 & 0xfff) << 20); + return 0; +} + +static int apply_r_riscv_lo12_s_rela(struct module *me, u32 *location, + Elf_Addr v) +{ + /* Skip medlow checking because of filtering by HI20 already */ + s32 hi20 = ((s32)v + 0x800) & 0xfffff000; + s32 lo12 = ((s32)v - hi20); + u32 imm11_5 = (lo12 & 0xfe0) << (31 - 11); + u32 imm4_0 = (lo12 & 0x1f) << (11 - 4); + *location = (*location & 0x1fff07f) | imm11_5 | imm4_0; + return 0; +} + static int apply_r_riscv_got_hi20_rela(struct module *me, u32 *location, Elf_Addr v) { @@ -176,6 +215,9 @@ static int (*reloc_handlers_rela[]) (struct module *me, u32 *location, [R_RISCV_PCREL_HI20] = apply_r_riscv_pcrel_hi20_rela, [R_RISCV_PCREL_LO12_I] = apply_r_riscv_pcrel_lo12_i_rela, [R_RISCV_PCREL_LO12_S] = apply_r_riscv_pcrel_lo12_s_rela, + [R_RISCV_HI20] = apply_r_riscv_hi20_rela, + [R_RISCV_LO12_I] = apply_r_riscv_lo12_i_rela, + [R_RISCV_LO12_S] = apply_r_riscv_lo12_s_rela, [R_RISCV_GOT_HI20] = apply_r_riscv_got_hi20_rela, [R_RISCV_CALL_PLT] = apply_r_riscv_call_plt_rela, [R_RISCV_CALL] = apply_r_riscv_call_rela, -- 2.16.1