From a3d2a9ec92ad4406ccf51ff45a4a1d2aa16eaa69 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Tue, 1 Oct 2019 01:25:53 -0700 Subject: arch, base: Stop assuming object files have three segments. The ObjectFile class has hardcoded assumptions that there are three segments, text, bss and data. There are some files which have one "segment" like raw files, where the entire file's contents are considered a single segment. There are also ELF files which can have an arbitrary number of segments, and those segments can hold any number of sections, including the text, data and/or bss sections. Removing this assumption frees up some object file formats from having to twist themselves to fit in that structure, possibly introducing ambiguities when some segments may fulfill multiple roles. Change-Id: I976e06a3a90ef852b17a6485e2595b006b2090d5 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/21463 Tested-by: kokoro Reviewed-by: Andreas Sandberg Maintainer: Gabe Black --- src/arch/arm/freebsd/system.cc | 2 +- src/arch/arm/linux/system.cc | 2 +- src/arch/arm/process.cc | 6 ++---- 3 files changed, 4 insertions(+), 6 deletions(-) (limited to 'src/arch/arm') diff --git a/src/arch/arm/freebsd/system.cc b/src/arch/arm/freebsd/system.cc index 6e544a70e..764f036b4 100644 --- a/src/arch/arm/freebsd/system.cc +++ b/src/arch/arm/freebsd/system.cc @@ -132,7 +132,7 @@ FreebsdArmSystem::initState() if (ra) bootReleaseAddr = ra & ~ULL(0x7F); - dtb_file->setTextBase(params()->atags_addr + loadAddrOffset); + dtb_file->setLoadOffset(params()->atags_addr + loadAddrOffset); dtb_file->loadSegments(physProxy); delete dtb_file; diff --git a/src/arch/arm/linux/system.cc b/src/arch/arm/linux/system.cc index f03a5c6cb..a0869b46a 100644 --- a/src/arch/arm/linux/system.cc +++ b/src/arch/arm/linux/system.cc @@ -151,7 +151,7 @@ LinuxArmSystem::initState() "to DTB file: %s\n", params()->dtb_filename); } - dtb_file->setTextBase(params()->atags_addr + loadAddrOffset); + dtb_file->setLoadOffset(params()->atags_addr + loadAddrOffset); dtb_file->loadSegments(physProxy); delete dtb_file; } else { diff --git a/src/arch/arm/process.cc b/src/arch/arm/process.cc index 1a1d4a2a0..f98572690 100644 --- a/src/arch/arm/process.cc +++ b/src/arch/arm/process.cc @@ -75,8 +75,7 @@ ArmProcess32::ArmProcess32(ProcessParams *params, ObjectFile *objFile, ObjectFile::Arch _arch) : ArmProcess(params, objFile, _arch) { - Addr brk_point = roundUp(objFile->dataBase() + objFile->dataSize() + - objFile->bssSize(), PageBytes); + Addr brk_point = roundUp(objFile->maxSegmentAddr(), PageBytes); Addr stack_base = 0xbf000000L; Addr max_stack_size = 8 * 1024 * 1024; Addr next_thread_stack_base = stack_base - max_stack_size; @@ -90,8 +89,7 @@ ArmProcess64::ArmProcess64(ProcessParams *params, ObjectFile *objFile, ObjectFile::Arch _arch) : ArmProcess(params, objFile, _arch) { - Addr brk_point = roundUp(objFile->dataBase() + objFile->dataSize() + - objFile->bssSize(), PageBytes); + Addr brk_point = roundUp(objFile->maxSegmentAddr(), PageBytes); Addr stack_base = 0x7fffff0000L; Addr max_stack_size = 8 * 1024 * 1024; Addr next_thread_stack_base = stack_base - max_stack_size; -- cgit v1.2.3