Changeset 2599 in CLRX


Ignore:
Timestamp:
Dec 1, 2016, 8:00:11 AM (3 years ago)
Author:
matszpk
Message:

CLRadeonExtender: ROCm: Recognize other kernel object (function) in binaries and disassemble them.

Location:
CLRadeonExtender/trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/CLRX/amdasm/Disassembler.h

    r2526 r2599  
    290290    size_t size;    ///< region size
    291291    size_t offset;  ///< region offset in code
    292     bool isKernel;  ///< true if kernel
     292    ROCmRegionType type ;  ///< type
    293293};
    294294
  • CLRadeonExtender/trunk/CLRX/amdbin/ROCmBinaries.h

    r2582 r2599  
    4747};
    4848
     49enum ROCmRegionType: uint8_t
     50{
     51    DATA,
     52    CODE,
     53    KERNEL
     54};
     55
    4956/// ROCm data region
    5057struct ROCmRegion
     
    5360    size_t size;    ///< data size
    5461    size_t offset;     ///< data
    55     bool isKernel;
     62    ROCmRegionType type;
    5663};
    5764
     
    159166    size_t offset;  ///< offset in code
    160167    size_t size;    ///< size of symbol
    161     bool isKernel;  ///< true if kernel
     168    ROCmRegionType type;  ///< type
    162169};
    163170
  • CLRadeonExtender/trunk/amdasm/DisasmROCm.cpp

    r2598 r2599  
    118118        const ROCmRegion& region = binary.getRegion(i);
    119119        input->regions[i] = { region.regionName, size_t(region.size),
    120             size_t(region.offset - codeOffset), region.isKernel };
     120            size_t(region.offset - codeOffset), region.type };
    121121    }
    122122   
     
    421421   
    422422    for (const ROCmDisasmRegionInput& rinput: rocmInput->regions)
    423         if (rinput.isKernel)
     423        if (rinput.type != ROCmRegionType::DATA)
    424424        {
    425425            output.write(".kernel ", 8);
     
    450450        {
    451451            const ROCmDisasmRegionInput& region = rocmInput->regions[sorted[i].second];
    452             if (region.isKernel && doDumpCode)
    453             {
     452            if (region.type==ROCmRegionType::KERNEL && doDumpCode)
     453            {   // kernel code
    454454                isaDisassembler->setInput(region.size-256, code + region.offset+256,
    455455                                    region.offset+256);
     456                isaDisassembler->analyzeBeforeDisassemble();
     457            }
     458            else if (region.type==ROCmRegionType::CODE && doDumpCode)
     459            {   // function code
     460                isaDisassembler->setInput(region.size, code + region.offset,
     461                                    region.offset);
    456462                isaDisassembler->analyzeBeforeDisassemble();
    457463            }
     
    488494                dataSize = newRegion.offset - region.offset;
    489495            }
    490             if (region.isKernel)
     496            if (region.type!=ROCmRegionType::DATA)
    491497            {
    492498                if (doMetadata)
     
    517523        }
    518524       
    519         if (regionsNum!=0 && !rocmInput->regions[sorted[regionsNum-1].second].isKernel)
     525        if (regionsNum!=0 &&
     526            !rocmInput->regions[sorted[regionsNum-1].second].type!=ROCmRegionType::DATA)
    520527        {   // if last region is kernel, then print labels after last region
    521528            const ROCmDisasmRegionInput& region =
  • CLRadeonExtender/trunk/amdbin/ROCmBinaries.cpp

    r2582 r2599  
    3333
    3434/* TODO: add support for various kernel code offset (now only 256 is supported) */
     35/* TODO: handle non-kernel functions (for Gallium also?) */
    3536
    3637ROCmBinary::ROCmBinary(size_t binaryCodeSize, cxbyte* binaryCode, Flags creationFlags)
     
    6061        const cxbyte bind = ELF64_ST_BIND(sym.st_info);
    6162        if (ULEV(sym.st_shndx)==textIndex &&
    62             (symType==STT_GNU_IFUNC || (bind==STB_GLOBAL && symType==STT_OBJECT)))
     63            (symType==STT_GNU_IFUNC || symType==STT_FUNC ||
     64                (bind==STB_GLOBAL && symType==STT_OBJECT)))
    6365            regionsNum++;
    6466    }
     
    8284        const cxbyte symType = ELF64_ST_TYPE(sym.st_info);
    8385        const cxbyte bind = ELF64_ST_BIND(sym.st_info);
    84         if (symType==STT_GNU_IFUNC || (bind==STB_GLOBAL && symType==STT_OBJECT))
     86        if (symType==STT_GNU_IFUNC || symType==STT_FUNC ||
     87                (bind==STB_GLOBAL && symType==STT_OBJECT))
    8588        {
    86             const bool isKernel = (symType==STT_GNU_IFUNC);
     89            ROCmRegionType type = ROCmRegionType::DATA;
     90            if (symType==STT_GNU_IFUNC)
     91                type = ROCmRegionType::KERNEL;
     92            else if (symType==STT_FUNC)
     93                type = ROCmRegionType::CODE;
    8794            symOffsets[j] = std::make_pair(value, j);
    88             if (isKernel && value+0x100 > codeOffset+codeSize)
    89                 throw Exception("Kernel offset is too big!");
    90             regions[j++] = { getSymbolName(i), size, value, isKernel };
     95            if (type!=ROCmRegionType::DATA && value+0x100 > codeOffset+codeSize)
     96                throw Exception("Kernel or code offset is too big!");
     97            regions[j++] = { getSymbolName(i), size, value, type };
    9198        }
    9299    }
     
    99106        size_t end = (i<regionsNum) ? symOffsets[i].first : codeOffset+codeSize;
    100107        ROCmRegion& region = regions[symOffsets[i-1].second];
    101         if (region.isKernel && symOffsets[i-1].first+0x100 > end)
     108        if (region.type==ROCmRegionType::KERNEL && symOffsets[i-1].first+0x100 > end)
    102109            throw Exception("Kernel size is too small!");
    103110       
     
    142149void ROCmInput::addEmptyKernel(const char* kernelName)
    143150{
    144     symbols.push_back({ kernelName, 0, 0, true });
     151    symbols.push_back({ kernelName, 0, 0, ROCmRegionType::KERNEL });
    145152}
    146153/*
     
    269276    {
    270277        ElfSymbol64 elfsym;
    271         if (symbol.isKernel)
    272             elfsym = ElfSymbol64(symbol.symbolName.c_str(), 4,
    273                   ELF64_ST_INFO(STB_GLOBAL, STT_GNU_IFUNC), 0, true,
    274                   symbol.offset, symbol.size);
    275         else
    276             elfsym = ElfSymbol64(symbol.symbolName.c_str(), 4,
    277                   ELF64_ST_INFO(STB_GLOBAL, STT_OBJECT), 0, true,
    278                   symbol.offset, symbol.size);
     278        switch (symbol.type)
     279        {
     280            case ROCmRegionType::KERNEL:
     281                elfsym = ElfSymbol64(symbol.symbolName.c_str(), 4,
     282                      ELF64_ST_INFO(STB_GLOBAL, STT_GNU_IFUNC), 0, true,
     283                      symbol.offset, symbol.size);
     284                break;
     285            case ROCmRegionType::CODE:
     286                elfsym = ElfSymbol64(symbol.symbolName.c_str(), 4,
     287                      ELF64_ST_INFO(STB_GLOBAL, STT_FUNC), 0, true,
     288                      symbol.offset, symbol.size);
     289                break;
     290            case ROCmRegionType::DATA:
     291                elfsym = ElfSymbol64(symbol.symbolName.c_str(), 4,
     292                      ELF64_ST_INFO(STB_GLOBAL, STT_OBJECT), 0, true,
     293                      symbol.offset, symbol.size);
     294                break;
     295            default:
     296                break;
     297        }
    279298        elfBinGen64.addSymbol(elfsym);
    280299        elfBinGen64.addDynSymbol(elfsym);
  • CLRadeonExtender/trunk/tests/amdbin/ROCmBinGen.cpp

    r2577 r2599  
    9494        const ROCmRegion& region = binary.getRegion(i);
    9595        rocmInput.symbols.push_back({region.regionName, region.offset-codeOffset,
    96                     region.size, region.isKernel});
     96                    region.size, region.type});
    9797    }
    9898    return rocmInput;
Note: See TracChangeset for help on using the changeset viewer.