rumtime_loader: fix TLS for riscv64
Change-Id: I55593dea936af31135b8e9159f8b6a64270369c0 Reviewed-on: https://review.haiku-os.org/c/haiku/+/5157 Reviewed-by: X512 <[email protected]> Reviewed-by: Alex von Gluck IV <[email protected]> Tested-by: Commit checker robot <[email protected]>
This commit is contained in:
@@ -6,7 +6,6 @@
|
||||
#define _KERNEL_ARCH_ARM_ELF_H
|
||||
|
||||
|
||||
|
||||
/* ARM relocs. */
|
||||
#define R_ARM_NONE 0 /* No reloc */
|
||||
#define R_ARM_PC24 1 /* PC relative 26 bit branch */
|
||||
@@ -50,9 +49,7 @@
|
||||
#define R_ARM_RPC24 254
|
||||
#define R_ARM_RBASE 255
|
||||
|
||||
|
||||
|
||||
|
||||
#define TLS_DTV_OFFSET 0
|
||||
|
||||
|
||||
#endif /* _KERNEL_ARCH_M68K_ELF_H */
|
||||
|
||||
@@ -26,4 +26,6 @@
|
||||
#define R_AARCH64_TLSDESC 1031 /* Identify the TLS descriptor */
|
||||
#define R_AARCH64_IRELATIVE 1032 /* STT_GNU_IFUNC relocation. */
|
||||
|
||||
#define TLS_DTV_OFFSET 0
|
||||
|
||||
#endif /* _KERNEL_ARCH_ARM64_ELF_H */
|
||||
|
||||
@@ -34,4 +34,6 @@
|
||||
#define R_68K_GNU_VTINHERIT 23
|
||||
#define R_68K_GNU_VTENTRY 24
|
||||
|
||||
#define TLS_DTV_OFFSET 0
|
||||
|
||||
#endif /* _KERNEL_ARCH_M68K_ELF_H */
|
||||
|
||||
@@ -49,5 +49,7 @@
|
||||
#define R_MIPSEL_SECTOFF_HA 36
|
||||
#define R_MIPSEL_ADDR30 37
|
||||
|
||||
#define TLS_DTV_OFFSET 0
|
||||
|
||||
#endif /* _SYSTEM_ARCH_MIPSEL_ELF_H */
|
||||
|
||||
|
||||
@@ -46,4 +46,6 @@
|
||||
#define R_PPC_SECTOFF_HA 36
|
||||
#define R_PPC_ADDR30 37
|
||||
|
||||
#define TLS_DTV_OFFSET 0
|
||||
|
||||
#endif /* _KERNEL_ARCH_PPC_ELF_H */
|
||||
|
||||
@@ -62,4 +62,7 @@
|
||||
#define R_RISCV_32_PCREL 57
|
||||
#define R_RISCV_IRELATIVE 58
|
||||
|
||||
#define TLS_DTV_OFFSET 0x800
|
||||
|
||||
|
||||
#endif /* _SYSTEM_ARCH_RISCV64_ELF_H */
|
||||
|
||||
@@ -69,4 +69,6 @@
|
||||
#define R_SPARC_SIZE32 86
|
||||
#define R_SPARC_SIZE64 87
|
||||
|
||||
#define TLS_DTV_OFFSET 0
|
||||
|
||||
#endif /* _KERNEL_ARCH_SPARC_ELF_H */
|
||||
|
||||
@@ -50,6 +50,8 @@
|
||||
#define R_386_IRELATIVE 42 /* PLT entry resolved indirectly at runtime */
|
||||
#define R_386_GOT32X 43
|
||||
|
||||
#define TLS_DTV_OFFSET 0
|
||||
|
||||
#ifdef _BOOT_MODE
|
||||
# include "../x86_64/arch_elf.h"
|
||||
#endif
|
||||
|
||||
@@ -52,6 +52,8 @@
|
||||
#define R_X86_64_REX_GOTPCRELX 41 /* Load from 32 bit signed pc relative offset to GOT entry
|
||||
with REX prefix, relaxable. */
|
||||
|
||||
#define TLS_DTV_OFFSET 0
|
||||
|
||||
|
||||
#if defined(_BOOT_MODE) || defined(ELF32_COMPAT)
|
||||
# include "../x86/arch_elf.h"
|
||||
|
||||
@@ -58,10 +58,10 @@ relocate_rela(image_t* rootImage, image_t* image, Elf64_Rela* rel,
|
||||
case R_RISCV_TLS_DTPMOD64:
|
||||
relocValue = symbolImage == NULL
|
||||
? image->dso_tls_id : symbolImage->dso_tls_id;
|
||||
continue;
|
||||
break;
|
||||
case R_RISCV_TLS_DTPREL64:
|
||||
relocValue = symAddr;
|
||||
continue;
|
||||
break;
|
||||
default:
|
||||
TRACE(("unhandled relocation type %d\n", type));
|
||||
return B_BAD_DATA;
|
||||
|
||||
@@ -27,7 +27,7 @@ public:
|
||||
bool IsInvalid() const { return fPointer == NULL; }
|
||||
|
||||
void* operator+(addr_t offset) const
|
||||
{ return (void*)((addr_t)fPointer + offset); }
|
||||
{ return (void*)((addr_t)fPointer + TLS_DTV_OFFSET + offset); }
|
||||
|
||||
private:
|
||||
void* fPointer;
|
||||
@@ -85,12 +85,13 @@ TLSBlockTemplate::SetBaseAddress(addr_t baseAddress)
|
||||
TLSBlock
|
||||
TLSBlockTemplate::CreateBlock()
|
||||
{
|
||||
void* pointer = malloc(fMemorySize);
|
||||
void* pointer = (uint8*)malloc(fMemorySize + TLS_DTV_OFFSET);
|
||||
memset((uint8*)pointer, 0, TLS_DTV_OFFSET);
|
||||
if (pointer == NULL)
|
||||
return TLSBlock();
|
||||
memcpy(pointer, fAddress, fFileSize);
|
||||
memcpy((char*)pointer + TLS_DTV_OFFSET, fAddress, fFileSize);
|
||||
if (fMemorySize > fFileSize)
|
||||
memset((char*)pointer + fFileSize, 0, fMemorySize - fFileSize);
|
||||
memset((char*)pointer + TLS_DTV_OFFSET + fFileSize, 0, fMemorySize - fFileSize);
|
||||
return TLSBlock(pointer);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user