[Mesa-dev] [PATCH] amd/rtld: update the ELF representation of LDS symbols
Marek Olšák
maraeo at gmail.com
Mon Jun 17 19:13:03 UTC 2019
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Mon, Jun 17, 2019 at 2:47 PM Haehnle, Nicolai <Nicolai.Haehnle at amd.com>
wrote:
> The following hunk needs to be added:
>
> > @@ -503,7 +521,9 @@ static bool resolve_symbol(const struct
> ac_rtld_upload_info *u,
> > unsigned part_idx, const Elf64_Sym *sym,
> > const char *name, uint64_t *value)
> > {
> > - if (sym->st_shndx == SHN_UNDEF) {
> > + /* TODO: properly disentangle the undef and the LDS cases once
> > + * STT_AMDGPU_LDS is retired. */
> > + if (sym->st_shndx == SHN_UNDEF || sym->st_shndx ==
> SHN_AMDGPU_LDS) {
> > const struct ac_rtld_symbol *lds_sym =
> > find_symbol(&u->binary->lds_symbols, name,
> part_idx);
> >
>
> Cheers,
> Nicolai
>
> On 17.06.19 01:34, Nicolai Hähnle wrote:
> > From: Nicolai Hähnle <nicolai.haehnle at amd.com>
> >
> > The initial prototype used a processor-specific symbol type, but
> > feedback suggests that an approach using processor-specific section
> > name that encodes the alignment analogous to SHN_COMMON symbols is
> > preferred.
> >
> > This patch keeps both variants around for now to reduce problems
> > with LLVM compatibility as we switch branches around.
> >
> > This also cleans up the error reporting in this function.
> > ---
> > src/amd/common/ac_rtld.c | 30 ++++++++++++++++++++++++------
> > 1 file changed, 24 insertions(+), 6 deletions(-)
> >
> > diff --git a/src/amd/common/ac_rtld.c b/src/amd/common/ac_rtld.c
> > index dc9cc04705b..6379e55120d 100644
> > --- a/src/amd/common/ac_rtld.c
> > +++ b/src/amd/common/ac_rtld.c
> > @@ -32,21 +32,25 @@
> >
> > #include "ac_binary.h"
> > #include "ac_gpu_info.h"
> > #include "util/u_dynarray.h"
> > #include "util/u_math.h"
> >
> > // Old distributions may not have this enum constant
> > #define MY_EM_AMDGPU 224
> >
> > #ifndef STT_AMDGPU_LDS
> > -#define STT_AMDGPU_LDS 13
> > +#define STT_AMDGPU_LDS 13 // this is deprecated -- remove
> > +#endif
> > +
> > +#ifndef SHN_AMDGPU_LDS
> > +#define SHN_AMDGPU_LDS 0xff00
> > #endif
> >
> > #ifndef R_AMDGPU_NONE
> > #define R_AMDGPU_NONE 0
> > #define R_AMDGPU_ABS32_LO 1
> > #define R_AMDGPU_ABS32_HI 2
> > #define R_AMDGPU_ABS64 3
> > #define R_AMDGPU_REL32 4
> > #define R_AMDGPU_REL64 5
> > #define R_AMDGPU_ABS32 6
> > @@ -169,47 +173,60 @@ static bool layout_symbols(struct ac_rtld_symbol
> *symbols, unsigned num_symbols,
> > * Read LDS symbols from the given \p section of the ELF of \p part
> and append
> > * them to the LDS symbols list.
> > *
> > * Shared LDS symbols are filtered out.
> > */
> > static bool read_private_lds_symbols(struct ac_rtld_binary *binary,
> > unsigned part_idx,
> > Elf_Scn *section,
> > uint32_t *lds_end_align)
> > {
> > -#define report_elf_if(cond) \
> > +#define report_if(cond) \
> > do { \
> > if ((cond)) { \
> > report_errorf(#cond); \
> > return false; \
> > } \
> > } while (false)
> > +#define report_elf_if(cond) \
> > + do { \
> > + if ((cond)) { \
> > + report_elf_errorf(#cond); \
> > + return false; \
> > + } \
> > + } while (false)
> >
> > struct ac_rtld_part *part = &binary->parts[part_idx];
> > Elf64_Shdr *shdr = elf64_getshdr(section);
> > uint32_t strtabidx = shdr->sh_link;
> > Elf_Data *symbols_data = elf_getdata(section, NULL);
> > report_elf_if(!symbols_data);
> >
> > const Elf64_Sym *symbol = symbols_data->d_buf;
> > size_t num_symbols = symbols_data->d_size / sizeof(Elf64_Sym);
> >
> > for (size_t j = 0; j < num_symbols; ++j, ++symbol) {
> > - if (ELF64_ST_TYPE(symbol->st_info) != STT_AMDGPU_LDS)
> > + struct ac_rtld_symbol s = {};
> > +
> > + if (ELF64_ST_TYPE(symbol->st_info) == STT_AMDGPU_LDS) {
> > + /* old-style LDS symbols from initial prototype --
> remove eventually */
> > + s.align = MIN2(1u << (symbol->st_other >> 3), 1u
> << 16);
> > + } else if (symbol->st_shndx == SHN_AMDGPU_LDS) {
> > + s.align = MIN2(symbol->st_value, 1u << 16);
> > + report_if(!util_is_power_of_two_nonzero(s.align));
> > + } else
> > continue;
> >
> > - report_elf_if(symbol->st_size > 1u << 29);
> > + report_if(symbol->st_size > 1u << 29);
> >
> > - struct ac_rtld_symbol s = {};
> > s.name = elf_strptr(part->elf, strtabidx,
> symbol->st_name);
> > s.size = symbol->st_size;
> > - s.align = MIN2(1u << (symbol->st_other >> 3), 1u << 16);
> > s.part_idx = part_idx;
> >
> > if (!strcmp(s.name, "__lds_end")) {
> > report_elf_if(s.size != 0);
> > *lds_end_align = MAX2(*lds_end_align, s.align);
> > continue;
> > }
> >
> > const struct ac_rtld_symbol *shared =
> > find_symbol(&binary->lds_symbols, s.name,
> part_idx);
> > @@ -217,20 +234,21 @@ static bool read_private_lds_symbols(struct
> ac_rtld_binary *binary,
> > report_elf_if(s.align > shared->align);
> > report_elf_if(s.size > shared->size);
> > continue;
> > }
> >
> > util_dynarray_append(&binary->lds_symbols, struct
> ac_rtld_symbol, s);
> > }
> >
> > return true;
> >
> > +#undef report_if
> > #undef report_elf_if
> > }
> >
> > /**
> > * Open a binary consisting of one or more shader parts.
> > *
> > * \param binary the uninitialized struct
> > * \param i binary opening parameters
> > */
> > bool ac_rtld_open(struct ac_rtld_binary *binary,
> >
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20190617/28d8e29a/attachment.html>
More information about the mesa-dev
mailing list