[Mesa-dev] [Mesa-stable] [PATCH 3/3] amd: Apply elf relocations and allow code with relocations
Jan Vesely
jan.vesely at rutgers.edu
Thu Jun 13 18:41:14 UTC 2019
On Thu, 2019-06-13 at 01:10 -0400, Marek Olšák wrote:
> FYI, I just pushed the new linker.
thanks. I've checked the handling and the current approach works for
sections as well (even if not handled explicitly).
Jan
>
> Marek
>
> On Mon, Jun 3, 2019 at 10:39 PM Jan Vesely <jan.vesely at rutgers.edu> wrote:
>
> > Fixes piglits:
> > call.cl
> > calls-larget-struct.cl
> > calls-struct.cl
> > calls-workitem-id.cl
> > realign-stack.cl
> > tail-calls.cl
> >
> > Cc: mesa-stable at lists.freedesktop.org
> > Signed-off-by: Jan Vesely <jan.vesely at rutgers.edu>
> > ---
> > The piglit test now pass using llvm-7,8,git.
> > ImageMagick works on my raven, but some test still fail on
> > carrizo/iceland.
> > Other workloads (like shoc) that used function calls also work ok.
> > ocltoys work after removing static keyword from .cl files.
> > src/amd/common/ac_binary.c | 30 +++++++++++++++++++++++
> > src/gallium/drivers/radeonsi/si_compute.c | 6 -----
> > 2 files changed, 30 insertions(+), 6 deletions(-)
> >
> > diff --git a/src/amd/common/ac_binary.c b/src/amd/common/ac_binary.c
> > index 18dc72c61f0..4d152fcf1be 100644
> > --- a/src/amd/common/ac_binary.c
> > +++ b/src/amd/common/ac_binary.c
> > @@ -178,6 +178,36 @@ bool ac_elf_read(const char *elf_data, unsigned
> > elf_size,
> >
> > parse_relocs(elf, relocs, symbols, symbol_sh_link, binary);
> >
> > + // Apply relocations
> > + for (int i = 0; i < binary->reloc_count; ++i) {
> > + struct ac_shader_reloc *r = &binary->relocs[i];
> > + uint32_t *loc = (uint32_t*)(binary->code + r->offset);
> > + /* Section target relocations store symbol offsets as
> > + * values in reloc location. We're expected to adjust it
> > for
> > + * start of the section. However, R_AMDGPU_REL32 are
> > + * PC relative relocations, so we need to recompute the
> > + * delta between reloc locatin and the target adress.
> > + */
> > + if (r->target_type == 0x3) { // section relocation
> > + uint32_t target_offset = *loc; // already adjusted
> > + int64_t diff = target_offset - r->offset;
> > + if (r->type == 0xa) { // R_AMDGPU_REL32_LO
> > + // address of the 'lo' instruction is 4B
> > below
> > + // the relocation point, but the target has
> > + // alredy been adjusted.
> > + *loc = (diff & 0xffffffff);
> > + } else if (r->type == 0xb) { // R_AMDGPU_REL32_HI
> > + // 'hi' relocation is 8B above 'lo'
> > relocation
> > + *loc = ((diff - 8) >> 32);
> > + } else {
> > + success = false;
> > + fprintf(stderr, "Unsupported section
> > relocation: type: %d, offset: %lx, value: %x\n",
> > + r->type, r->offset, *loc);
> > + }
> > + } else
> > + success = false;
> > + }
> > +
> > if (elf){
> > elf_end(elf);
> > }
> > diff --git a/src/gallium/drivers/radeonsi/si_compute.c
> > b/src/gallium/drivers/radeonsi/si_compute.c
> > index b9cea00eeeb..88631369a62 100644
> > --- a/src/gallium/drivers/radeonsi/si_compute.c
> > +++ b/src/gallium/drivers/radeonsi/si_compute.c
> > @@ -246,12 +246,6 @@ static void *si_create_compute_state(
> > const amd_kernel_code_t *code_object =
> > si_compute_get_code_object(program, 0);
> > code_object_to_config(code_object,
> > &program->shader.config);
> > - if (program->shader.binary.reloc_count != 0) {
> > - fprintf(stderr, "Error: %d unsupported
> > relocations\n",
> > -
> > program->shader.binary.reloc_count);
> > - FREE(program);
> > - return NULL;
> > - }
> > } else {
> >
> > si_shader_binary_read_config(&program->shader.binary,
> > &program->shader.config, 0);
> > --
> > 2.21.0
> >
> > _______________________________________________
> > mesa-stable mailing list
> > mesa-stable at lists.freedesktop.org
> > https://nam02.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Fmesa-stable&data=02%7C01%7Cjan.vesely%40cs.rutgers.edu%7C799b455386104f3a30dd08d6efbd81dc%7Cb92d2b234d35447093ff69aca6632ffe%7C1%7C0%7C636959994551504256&sdata=E5usx69EyFtABg3cn24Q5idNveyntDYJ7xR5a7K%2BboA%3D&reserved=0
--
Jan Vesely <jan.vesely at rutgers.edu>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20190613/ecfb0cff/attachment.sig>
More information about the mesa-dev
mailing list