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:
X512
2022-03-27 16:15:41 +00:00
committed by Alex von Gluck IV
parent fa288877c5
commit ebeab0cf70
11 changed files with 25 additions and 10 deletions
+1 -4
View File
@@ -6,7 +6,6 @@
#define _KERNEL_ARCH_ARM_ELF_H #define _KERNEL_ARCH_ARM_ELF_H
/* ARM relocs. */ /* ARM relocs. */
#define R_ARM_NONE 0 /* No reloc */ #define R_ARM_NONE 0 /* No reloc */
#define R_ARM_PC24 1 /* PC relative 26 bit branch */ #define R_ARM_PC24 1 /* PC relative 26 bit branch */
@@ -50,9 +49,7 @@
#define R_ARM_RPC24 254 #define R_ARM_RPC24 254
#define R_ARM_RBASE 255 #define R_ARM_RBASE 255
#define TLS_DTV_OFFSET 0
#endif /* _KERNEL_ARCH_M68K_ELF_H */ #endif /* _KERNEL_ARCH_M68K_ELF_H */
@@ -26,4 +26,6 @@
#define R_AARCH64_TLSDESC 1031 /* Identify the TLS descriptor */ #define R_AARCH64_TLSDESC 1031 /* Identify the TLS descriptor */
#define R_AARCH64_IRELATIVE 1032 /* STT_GNU_IFUNC relocation. */ #define R_AARCH64_IRELATIVE 1032 /* STT_GNU_IFUNC relocation. */
#define TLS_DTV_OFFSET 0
#endif /* _KERNEL_ARCH_ARM64_ELF_H */ #endif /* _KERNEL_ARCH_ARM64_ELF_H */
@@ -34,4 +34,6 @@
#define R_68K_GNU_VTINHERIT 23 #define R_68K_GNU_VTINHERIT 23
#define R_68K_GNU_VTENTRY 24 #define R_68K_GNU_VTENTRY 24
#define TLS_DTV_OFFSET 0
#endif /* _KERNEL_ARCH_M68K_ELF_H */ #endif /* _KERNEL_ARCH_M68K_ELF_H */
@@ -49,5 +49,7 @@
#define R_MIPSEL_SECTOFF_HA 36 #define R_MIPSEL_SECTOFF_HA 36
#define R_MIPSEL_ADDR30 37 #define R_MIPSEL_ADDR30 37
#define TLS_DTV_OFFSET 0
#endif /* _SYSTEM_ARCH_MIPSEL_ELF_H */ #endif /* _SYSTEM_ARCH_MIPSEL_ELF_H */
@@ -46,4 +46,6 @@
#define R_PPC_SECTOFF_HA 36 #define R_PPC_SECTOFF_HA 36
#define R_PPC_ADDR30 37 #define R_PPC_ADDR30 37
#define TLS_DTV_OFFSET 0
#endif /* _KERNEL_ARCH_PPC_ELF_H */ #endif /* _KERNEL_ARCH_PPC_ELF_H */
@@ -62,4 +62,7 @@
#define R_RISCV_32_PCREL 57 #define R_RISCV_32_PCREL 57
#define R_RISCV_IRELATIVE 58 #define R_RISCV_IRELATIVE 58
#define TLS_DTV_OFFSET 0x800
#endif /* _SYSTEM_ARCH_RISCV64_ELF_H */ #endif /* _SYSTEM_ARCH_RISCV64_ELF_H */
@@ -69,4 +69,6 @@
#define R_SPARC_SIZE32 86 #define R_SPARC_SIZE32 86
#define R_SPARC_SIZE64 87 #define R_SPARC_SIZE64 87
#define TLS_DTV_OFFSET 0
#endif /* _KERNEL_ARCH_SPARC_ELF_H */ #endif /* _KERNEL_ARCH_SPARC_ELF_H */
@@ -50,6 +50,8 @@
#define R_386_IRELATIVE 42 /* PLT entry resolved indirectly at runtime */ #define R_386_IRELATIVE 42 /* PLT entry resolved indirectly at runtime */
#define R_386_GOT32X 43 #define R_386_GOT32X 43
#define TLS_DTV_OFFSET 0
#ifdef _BOOT_MODE #ifdef _BOOT_MODE
# include "../x86_64/arch_elf.h" # include "../x86_64/arch_elf.h"
#endif #endif
@@ -52,6 +52,8 @@
#define R_X86_64_REX_GOTPCRELX 41 /* Load from 32 bit signed pc relative offset to GOT entry #define R_X86_64_REX_GOTPCRELX 41 /* Load from 32 bit signed pc relative offset to GOT entry
with REX prefix, relaxable. */ with REX prefix, relaxable. */
#define TLS_DTV_OFFSET 0
#if defined(_BOOT_MODE) || defined(ELF32_COMPAT) #if defined(_BOOT_MODE) || defined(ELF32_COMPAT)
# include "../x86/arch_elf.h" # 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: case R_RISCV_TLS_DTPMOD64:
relocValue = symbolImage == NULL relocValue = symbolImage == NULL
? image->dso_tls_id : symbolImage->dso_tls_id; ? image->dso_tls_id : symbolImage->dso_tls_id;
continue; break;
case R_RISCV_TLS_DTPREL64: case R_RISCV_TLS_DTPREL64:
relocValue = symAddr; relocValue = symAddr;
continue; break;
default: default:
TRACE(("unhandled relocation type %d\n", type)); TRACE(("unhandled relocation type %d\n", type));
return B_BAD_DATA; return B_BAD_DATA;
+5 -4
View File
@@ -27,7 +27,7 @@ public:
bool IsInvalid() const { return fPointer == NULL; } bool IsInvalid() const { return fPointer == NULL; }
void* operator+(addr_t offset) const void* operator+(addr_t offset) const
{ return (void*)((addr_t)fPointer + offset); } { return (void*)((addr_t)fPointer + TLS_DTV_OFFSET + offset); }
private: private:
void* fPointer; void* fPointer;
@@ -85,12 +85,13 @@ TLSBlockTemplate::SetBaseAddress(addr_t baseAddress)
TLSBlock TLSBlock
TLSBlockTemplate::CreateBlock() TLSBlockTemplate::CreateBlock()
{ {
void* pointer = malloc(fMemorySize); void* pointer = (uint8*)malloc(fMemorySize + TLS_DTV_OFFSET);
memset((uint8*)pointer, 0, TLS_DTV_OFFSET);
if (pointer == NULL) if (pointer == NULL)
return TLSBlock(); return TLSBlock();
memcpy(pointer, fAddress, fFileSize); memcpy((char*)pointer + TLS_DTV_OFFSET, fAddress, fFileSize);
if (fMemorySize > fFileSize) if (fMemorySize > fFileSize)
memset((char*)pointer + fFileSize, 0, fMemorySize - fFileSize); memset((char*)pointer + TLS_DTV_OFFSET + fFileSize, 0, fMemorySize - fFileSize);
return TLSBlock(pointer); return TLSBlock(pointer);
} }