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
/* 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;
+5 -4
View File
@@ -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);
}