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
|
#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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user