Changeset 4895 in CLRX


Ignore:
Timestamp:
Aug 14, 2019, 3:02:12 PM (5 days ago)
Author:
matszpk
Message:

CLRadeonExtender: ROCm: Add handling MetadataV3 to ROCm binary format (only reading).

Location:
CLRadeonExtender/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/CLRX/amdbin/ROCmBinaries.h

    r4892 r4895  
    494494                ROCmMetadata& metadataInfo);
    495495
     496void parseROCmMetadataMsgPack(size_t metadataSize, const cxbyte* metadata,
     497                ROCmMetadata& metadataInfo);
     498
    496499};
    497500
  • CLRadeonExtender/trunk/amdbin/ROCmBinaries.cpp

    r4892 r4895  
    209209    const size_t notesSize = getNotesSize();
    210210    const cxbyte* noteContent = (const cxbyte*)getNotes();
     211    bool isMetadataV3 = false;
    211212   
    212213    for (size_t offset = 0; offset < notesSize; )
     
    218219            throw BinException("Note offset+size out of range");
    219220       
    220         if (namesz==4 &&
    221             ::strcmp((const char*)noteContent+offset+ sizeof(Elf64_Nhdr), "AMD")==0)
     221        const size_t alignedNamesz = ((namesz+3)&~size_t(3));
     222        if ((namesz==4 &&
     223            ::strcmp((const char*)noteContent+offset+ sizeof(Elf64_Nhdr), "AMD")==0) ||
     224            (namesz==7 &&
     225            ::strcmp((const char*)noteContent+offset+ sizeof(Elf64_Nhdr), "AMDGPU")==0))
    222226        {
    223227            const uint32_t noteType = ULEV(nhdr->n_type);
    224             if (noteType == 0xa)
     228            if ((noteType == 0xa && namesz==4) || (noteType == 0x20 && namesz==7))
    225229            {
    226                 metadata = (char*)(noteContent+offset+sizeof(Elf64_Nhdr) + 4);
     230                if (namesz==7)
     231                    isMetadataV3 = true;
     232                if (namesz==4 && isMetadataV3)
     233                    throw Exception("MetadataV2 in MetadataV3 compliant binary!");
     234                metadata = (char*)(noteContent+offset+sizeof(Elf64_Nhdr) + alignedNamesz);
    227235                metadataSize = descsz;
    228236            }
    229             else if (noteType == 0xb)
    230                 target.assign((char*)(noteContent+offset+sizeof(Elf64_Nhdr) + 4), descsz);
     237            else if (noteType == 0xb && namesz==4)
     238                target.assign((char*)(noteContent+offset+sizeof(Elf64_Nhdr) +
     239                                        alignedNamesz), descsz);
    231240        }
    232         size_t align = (((namesz+descsz)&3)!=0) ? 4-((namesz+descsz)&3) : 0;
    233         offset += sizeof(Elf64_Nhdr) + namesz + descsz + align;
     241        size_t align = (((alignedNamesz+descsz)&3)!=0) ? 4-((alignedNamesz+descsz)&3) : 0;
     242        offset += sizeof(Elf64_Nhdr) + alignedNamesz + descsz + align;
    234243    }
    235244   
     
    248257    {
    249258        metadataInfo.reset(new ROCmMetadata());
    250         parseROCmMetadata(metadataSize, metadata, *metadataInfo);
     259        if (!isMetadataV3)
     260            parseROCmMetadata(metadataSize, metadata, *metadataInfo);
     261        else
     262            parseROCmMetadataMsgPack(metadataSize,
     263                    reinterpret_cast<const cxbyte*>(metadata), *metadataInfo);
    251264       
    252265        if (hasKernelInfoMap())
  • CLRadeonExtender/trunk/amdbin/ROCmMetadata.cpp

    r4894 r4895  
    22382238}
    22392239
    2240 static void parseROCmMetadataMsgPack(size_t metadataSize, const cxbyte* metadata,
     2240void CLRX::parseROCmMetadataMsgPack(size_t metadataSize, const cxbyte* metadata,
    22412241                ROCmMetadata& metadataInfo)
    22422242{
Note: See TracChangeset for help on using the changeset viewer.