From: Jisheng Zhang <jszhang3@mail.ustc.edu.cn>
To: Kefeng Wang <wangkefeng.wang@huawei.com>
Cc: Paul Walmsley <paul.walmsley@sifive.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Masahiro Yamada <masahiroy@kernel.org>,
Michal Marek <michal.lkml@markovi.net>,
Nick Desaulniers <ndesaulniers@google.com>,
<linux-riscv@lists.infradead.org>, <linux-kernel@vger.kernel.org>,
<linux-kbuild@vger.kernel.org>
Subject: Re: [PATCH v2 2/2] riscv: switch to relative exception tables
Date: Thu, 21 Oct 2021 23:47:24 +0800 [thread overview]
Message-ID: <20211021234724.5a2ccc6f@xhacker> (raw)
In-Reply-To: <352c54e1-b164-38d9-43fb-dbc28ab38ac7@huawei.com>
On Thu, 21 Oct 2021 19:42:48 +0800
Kefeng Wang <wangkefeng.wang@huawei.com> wrote:
> On 2021/10/20 22:07, Jisheng Zhang wrote:
> > From: Jisheng Zhang <jszhang@kernel.org>
> >
> > Similar as other architectures such as arm64, x86 and so on, use
> > offsets relative to the exception table entry values rather than
> > absolute addresses for both the exception locationand the fixup.
> >
> > However, RISCV label difference will actually produce two relocations,
> > a pair of R_RISCV_ADD32 and R_RISCV_SUB32. Take below simple code for
> > example:
> >
> > $ cat test.S
> > .section .text
> > 1:
> > nop
> > .section __ex_table,"a"
> > .balign 4
> > .long (1b - .)
> > .previous
> >
> > $ riscv64-linux-gnu-gcc -c test.S
> > $ riscv64-linux-gnu-readelf -r test.o
> > Relocation section '.rela__ex_table' at offset 0x100 contains 2 entries:
> > Offset Info Type Sym. Value Sym. Name + Addend
> > 000000000000 000600000023 R_RISCV_ADD32 0000000000000000 .L1^B1 + 0
> > 000000000000 000500000027 R_RISCV_SUB32 0000000000000000 .L0 + 0
> >
> > The modpost will complain the R_RISCV_SUB32 relocation, so we need to
> > patch modpost.c to skip this relocation for .rela__ex_table section.
> >
> > After this patch, the __ex_table section size of defconfig vmlinux is
> > reduced from 7072 Bytes to 3536 Bytes.
> >
> > Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
> > ---
>
>
>
> ...
> > diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
> > index cb8ab7d91d30..0aa14b5bd124 100644
> > --- a/scripts/mod/modpost.c
> > +++ b/scripts/mod/modpost.c
> > @@ -1830,6 +1830,27 @@ static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
> > return 0;
> > }
> >
> > +#ifndef EM_RISCV
> > +#define EM_RISCV 243
> > +#endif
> > +
> > +#ifndef R_RISCV_SUB32
> > +#define R_RISCV_SUB32 39
> > +#endif
> > +
> > +static int addend_riscv_rela(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
> > +{
> > + unsigned int r_typ = ELF_R_TYPE(r->r_info);
> > + const char *fromsec;
> > +
> > + fromsec = sech_name(elf, sechdr);
> > + fromsec += strlen(".rela");
> > +
> > + if (!strcmp("__ex_table", fromsec) && r_typ == R_RISCV_SUB32)
> > + return 1; /* skip this */
> > + return 0;
> > +}
> > +
> > static void section_rela(const char *modname, struct elf_info *elf,
> > Elf_Shdr *sechdr)
> > {
> > @@ -1866,6 +1887,12 @@ static void section_rela(const char *modname, struct elf_info *elf,
> > r_sym = ELF_R_SYM(r.r_info);
> > #endif
> > r.r_addend = TO_NATIVE(rela->r_addend);
> > + switch (elf->hdr->e_machine) {
> > + case EM_RISCV:
> > + if (addend_riscv_rela(elf, sechdr, &r))
> directly use
> if (!strcmp("__ex_table", fromsec) && ELF_R_TYPE(r.r_info) == R_RISCV_SUB32)
My local initial patch is as direct as this LoC;) then later I thought we may
need do something more in future. But now I think we can do code
refactoring then. Will send patch v3 soon.
Thanks
>
> > + continue;
> > + break;
> > + }
> > sym = elf->symtab_start + r_sym;
> > /* Skip special sections */
> > if (is_shndx_special(sym->st_shndx))
> > diff --git a/scripts/sorttable.c b/scripts/sorttable.c
> > index 6ee4fa882919..39e86e4acea3 100644
> > --- a/scripts/sorttable.c
> > +++ b/scripts/sorttable.c
> > @@ -346,6 +346,7 @@ static int do_file(char const *const fname, void *addr)
> > case EM_PARISC:
> > case EM_PPC:
> > case EM_PPC64:
> > + case EM_RISCV:
> > custom_sort = sort_relative_table;
> > break;
> > case EM_ARCOMPACT:
> > @@ -353,7 +354,6 @@ static int do_file(char const *const fname, void *addr)
> > case EM_ARM:
> > case EM_MICROBLAZE:
> > case EM_MIPS:
> > - case EM_RISCV:
> > case EM_XTENSA:
> > break;
> > default:
> >
WARNING: multiple messages have this Message-ID (diff)
From: Jisheng Zhang <jszhang3@mail.ustc.edu.cn>
To: Kefeng Wang <wangkefeng.wang@huawei.com>
Cc: Paul Walmsley <paul.walmsley@sifive.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Masahiro Yamada <masahiroy@kernel.org>,
Michal Marek <michal.lkml@markovi.net>,
Nick Desaulniers <ndesaulniers@google.com>,
<linux-riscv@lists.infradead.org>, <linux-kernel@vger.kernel.org>,
<linux-kbuild@vger.kernel.org>
Subject: Re: [PATCH v2 2/2] riscv: switch to relative exception tables
Date: Thu, 21 Oct 2021 23:47:24 +0800 [thread overview]
Message-ID: <20211021234724.5a2ccc6f@xhacker> (raw)
In-Reply-To: <352c54e1-b164-38d9-43fb-dbc28ab38ac7@huawei.com>
On Thu, 21 Oct 2021 19:42:48 +0800
Kefeng Wang <wangkefeng.wang@huawei.com> wrote:
> On 2021/10/20 22:07, Jisheng Zhang wrote:
> > From: Jisheng Zhang <jszhang@kernel.org>
> >
> > Similar as other architectures such as arm64, x86 and so on, use
> > offsets relative to the exception table entry values rather than
> > absolute addresses for both the exception locationand the fixup.
> >
> > However, RISCV label difference will actually produce two relocations,
> > a pair of R_RISCV_ADD32 and R_RISCV_SUB32. Take below simple code for
> > example:
> >
> > $ cat test.S
> > .section .text
> > 1:
> > nop
> > .section __ex_table,"a"
> > .balign 4
> > .long (1b - .)
> > .previous
> >
> > $ riscv64-linux-gnu-gcc -c test.S
> > $ riscv64-linux-gnu-readelf -r test.o
> > Relocation section '.rela__ex_table' at offset 0x100 contains 2 entries:
> > Offset Info Type Sym. Value Sym. Name + Addend
> > 000000000000 000600000023 R_RISCV_ADD32 0000000000000000 .L1^B1 + 0
> > 000000000000 000500000027 R_RISCV_SUB32 0000000000000000 .L0 + 0
> >
> > The modpost will complain the R_RISCV_SUB32 relocation, so we need to
> > patch modpost.c to skip this relocation for .rela__ex_table section.
> >
> > After this patch, the __ex_table section size of defconfig vmlinux is
> > reduced from 7072 Bytes to 3536 Bytes.
> >
> > Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
> > ---
>
>
>
> ...
> > diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
> > index cb8ab7d91d30..0aa14b5bd124 100644
> > --- a/scripts/mod/modpost.c
> > +++ b/scripts/mod/modpost.c
> > @@ -1830,6 +1830,27 @@ static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
> > return 0;
> > }
> >
> > +#ifndef EM_RISCV
> > +#define EM_RISCV 243
> > +#endif
> > +
> > +#ifndef R_RISCV_SUB32
> > +#define R_RISCV_SUB32 39
> > +#endif
> > +
> > +static int addend_riscv_rela(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
> > +{
> > + unsigned int r_typ = ELF_R_TYPE(r->r_info);
> > + const char *fromsec;
> > +
> > + fromsec = sech_name(elf, sechdr);
> > + fromsec += strlen(".rela");
> > +
> > + if (!strcmp("__ex_table", fromsec) && r_typ == R_RISCV_SUB32)
> > + return 1; /* skip this */
> > + return 0;
> > +}
> > +
> > static void section_rela(const char *modname, struct elf_info *elf,
> > Elf_Shdr *sechdr)
> > {
> > @@ -1866,6 +1887,12 @@ static void section_rela(const char *modname, struct elf_info *elf,
> > r_sym = ELF_R_SYM(r.r_info);
> > #endif
> > r.r_addend = TO_NATIVE(rela->r_addend);
> > + switch (elf->hdr->e_machine) {
> > + case EM_RISCV:
> > + if (addend_riscv_rela(elf, sechdr, &r))
> directly use
> if (!strcmp("__ex_table", fromsec) && ELF_R_TYPE(r.r_info) == R_RISCV_SUB32)
My local initial patch is as direct as this LoC;) then later I thought we may
need do something more in future. But now I think we can do code
refactoring then. Will send patch v3 soon.
Thanks
>
> > + continue;
> > + break;
> > + }
> > sym = elf->symtab_start + r_sym;
> > /* Skip special sections */
> > if (is_shndx_special(sym->st_shndx))
> > diff --git a/scripts/sorttable.c b/scripts/sorttable.c
> > index 6ee4fa882919..39e86e4acea3 100644
> > --- a/scripts/sorttable.c
> > +++ b/scripts/sorttable.c
> > @@ -346,6 +346,7 @@ static int do_file(char const *const fname, void *addr)
> > case EM_PARISC:
> > case EM_PPC:
> > case EM_PPC64:
> > + case EM_RISCV:
> > custom_sort = sort_relative_table;
> > break;
> > case EM_ARCOMPACT:
> > @@ -353,7 +354,6 @@ static int do_file(char const *const fname, void *addr)
> > case EM_ARM:
> > case EM_MICROBLAZE:
> > case EM_MIPS:
> > - case EM_RISCV:
> > case EM_XTENSA:
> > break;
> > default:
> >
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
next prev parent reply other threads:[~2021-10-21 15:55 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-20 14:05 [PATCH v2 0/2] riscv: switch to relative extable Jisheng Zhang
2021-10-20 14:05 ` Jisheng Zhang
2021-10-20 14:06 ` [PATCH v2 1/2] riscv: consolidate __ex_table construction Jisheng Zhang
2021-10-20 14:06 ` Jisheng Zhang
2021-10-21 11:38 ` Kefeng Wang
2021-10-21 11:38 ` Kefeng Wang
2021-10-21 15:43 ` Jisheng Zhang
2021-10-21 15:43 ` Jisheng Zhang
2021-10-22 0:43 ` Kefeng Wang
2021-10-22 0:43 ` Kefeng Wang
2021-10-20 14:07 ` [PATCH v2 2/2] riscv: switch to relative exception tables Jisheng Zhang
2021-10-20 14:07 ` Jisheng Zhang
2021-10-21 11:42 ` Kefeng Wang
2021-10-21 11:42 ` Kefeng Wang
2021-10-21 15:47 ` Jisheng Zhang [this message]
2021-10-21 15:47 ` Jisheng Zhang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211021234724.5a2ccc6f@xhacker \
--to=jszhang3@mail.ustc.edu.cn \
--cc=aou@eecs.berkeley.edu \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=masahiroy@kernel.org \
--cc=michal.lkml@markovi.net \
--cc=ndesaulniers@google.com \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=wangkefeng.wang@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.