[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <c11aae17-838f-3741-0c13-1c830ac30a56@loongson.cn>
Date: Thu, 9 Feb 2023 14:34:53 +0800
From: Youling Tang <tangyouling@...ngson.cn>
To: Xi Ruoyao <xry111@...111.site>
Cc: Jinyang He <hejinyang@...ngson.cn>,
Huacai Chen <chenhuacai@...nel.org>,
Xuerui Wang <kernel@...0n.name>, loongarch@...ts.linux.dev,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2 0/5] LoongArch: Add kernel relocation and KASLR support
On 02/08/2023 04:27 PM, Xi Ruoyao wrote:
> On Wed, 2023-02-08 at 12:37 +0800, Youling Tang wrote:
>> In the case of "[Patch v2 2/5] LoongArch: use la.pcrel instenad of
>> la.abs for exception handlerS", the above failure will occur.
>>
>> Patch2 may have certain problems when using the old toolchains.
>>
>> Youling.
>
> Thanks for the test...
>
> The problem is: old toolchain uses pcaddu12i/ori/lu32i.d/lu52i.d/add.d
> for a 3-operand la.pcrel, while the new toolchain uses
> pcalau12i/addi.d/lu32i/lu52i/add.d. (I've somehow forgotten all the
> difference!)
>
> We can fix it with something like...
>
>> +void reloc_handler(unsigned long handler, struct handler_reloc *rel)
>> +{
>> + if (!rel)
>> + return;
>> +
>> + for (unsigned long i = 0; i < rel->cnt; i++) {
>> + unsigned long pc = handler + rel->entries[i].offset;
>> + unsigned long v = rel->entries[i].sym;
>
> /* anchor etc. moved into do_reloc_pcalau12i */
>
>> + union loongarch_instruction *insn =
>> + (union loongarch_instruction *)pc;
>
> switch insn[0]->reg1i20_format->reg1i20_format {
> case pcaddu12i_op:
> do_reloc_pcaddu12i(insn, pc, v);
> break;
> case pcalau12i_op: /* TODO: add it for asm/inst.h */
> do_reloc_pcalau12i(insn, pc, v);
> break;
> default:
> panic("what the f**k");
> }
>
> Alternatively, we can also emit the pcalau12i/addi.d/lu32i/lu52i
> sequence and overwrite the pcaddu12i/ori sequence generated by the old
> toolchain.
>
> Which way do you like?
v3 tested successfully in both new and old toolchains.
Youling.
>
Powered by blists - more mailing lists