[PATCH 8/9] RISC-V: Support RISCV_ALIGN relocations in modules.

Palmer Dabbelt palmer at sifive.com
Thu Mar 1 13:54:26 PST 2018


On Thu, 01 Mar 2018 03:22:27 PST (-0800), shea at shealevy.com wrote:
> Hi Palmer,
>
> Palmer Dabbelt <palmer at sifive.com> writes:
>
>> On Thu, 22 Feb 2018 19:12:17 PST (-0800), shea at shealevy.com wrote:
>>> While legal, this noop implementation may be inefficient.
>>>
>>> Signed-off-by: Shea Levy <shea at shealevy.com>
>>> ---
>>>  arch/riscv/kernel/module.c | 7 ++++---
>>>  1 file changed, 4 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/arch/riscv/kernel/module.c b/arch/riscv/kernel/module.c
>>> index 4f3e15e7995b..827cf1211360 100644
>>> --- a/arch/riscv/kernel/module.c
>>> +++ b/arch/riscv/kernel/module.c
>>> @@ -150,8 +150,8 @@ static int apply_r_riscv_call_rela(struct module *me, u32 *location,
>>>  	return 0;
>>>  }
>>>
>>> -static int apply_r_riscv_relax_rela(struct module *me, u32 *location,
>>> -				    Elf_Addr v)
>>> +static int apply_r_riscv_noop_rela(struct module *me, u32 *location,
>>> +				   Elf_Addr v)
>>>  {
>>>  	return 0;
>>>  }
>>> @@ -181,7 +181,8 @@ static int (*reloc_handlers_rela[]) (struct module *me, u32 *location,
>>>  	[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_CALL]			= apply_r_riscv_call_rela,
>>> -	[R_RISCV_RELAX]			= apply_r_riscv_relax_rela,
>>> +	[R_RISCV_RELAX]			= apply_r_riscv_noop_rela,
>>> +	[R_RISCV_ALIGN]			= apply_r_riscv_noop_rela,
>>>  	[R_RISCV_ADD32]			= apply_r_riscv_add32_rela,
>>>  	[R_RISCV_SUB32]			= apply_r_riscv_sub32_rela,
>>>  };
>>
>> The output of most RISC-V toolchains requires a relaxation pass for alignment 
>> for correctness.  Even if you're enforcing this somewhere in your module build 
>> flow you should at least check for alignment when loading modules so there 
>> aren't silent breakages, if R_RISCV_ALIGN is escaping to the kernel's loader 
>> then it probably needs to be handled.
>>
>
> Well, I guess the question is: Do we want to do relaxations at all at
> load time? If so, I'll work on that and include RISCV_ALIGN. If not, is
> there any way to configure gcc and/or ld not to emit any relaxations? In
> the latter case we can just explicitly not list RISCV_ALIGN here and the
> module loader will fail with an unsupported relocation.

Well, this is awkward: I remembered doing this (and telling people about 
"-mno-relax"), but apparently that was all just in my head.  Here's a patch to 
add "-mno-relax" to GCC in the real world :) 
https://gcc.gnu.org/ml/gcc-patches/2018-03/msg00062.html

I think the best thing to do is:

* Check if the complier supports "-mno-relax" and add it to the module build 
  command-line.
* Change R_RISCV_ALIGN support in the kernel to check if the address happens to 
  already be aligned (which happens sometimes), and if it's not then provide a 
  helpful error message along the lines of "upgrade to GCC 8".

I guess we eventually want to support relaxation in the kernel, but only if 
there's a real performance problem that someone can point out.



More information about the linux-riscv mailing list