sim-se: Extend MemState API to use VMAs
Extend the MemState API to handle tracking dynamically sized memory regions of a Process class which may be added, moved, removed, or change in size during the course of simulation. This utilizes the virtual memory areas (VMA) class to track individual regions and provides a fixup method to handle physical page allocation in case of a page fault. This allows for lazy allocation of the stack, heap, and mmap regions of memory. Change-Id: I3ef10657e5f8e8f0e328bdf0aa15a27b1dde39bf Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/25483 Tested-by: Gem5 Cloud Project GCB service account <345032938727@cloudbuild.gserviceaccount.com> Reviewed-by: Jason Lowe-Power <power.jg@gmail.com> Maintainer: Jason Lowe-Power <power.jg@gmail.com>
This commit is contained in:
@@ -78,8 +78,9 @@ ArmProcess32::ArmProcess32(ProcessParams *params, ObjectFile *objFile,
|
||||
Addr next_thread_stack_base = stack_base - max_stack_size;
|
||||
Addr mmap_end = 0x40000000L;
|
||||
|
||||
memState = make_shared<MemState>(brk_point, stack_base, max_stack_size,
|
||||
next_thread_stack_base, mmap_end);
|
||||
memState = make_shared<MemState>(this, brk_point, stack_base,
|
||||
max_stack_size, next_thread_stack_base,
|
||||
mmap_end);
|
||||
}
|
||||
|
||||
ArmProcess64::ArmProcess64(ProcessParams *params, ObjectFile *objFile,
|
||||
@@ -92,8 +93,9 @@ ArmProcess64::ArmProcess64(ProcessParams *params, ObjectFile *objFile,
|
||||
Addr next_thread_stack_base = stack_base - max_stack_size;
|
||||
Addr mmap_end = 0x4000000000L;
|
||||
|
||||
memState = make_shared<MemState>(brk_point, stack_base, max_stack_size,
|
||||
next_thread_stack_base, mmap_end);
|
||||
memState = make_shared<MemState>(this, brk_point, stack_base,
|
||||
max_stack_size, next_thread_stack_base,
|
||||
mmap_end);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -67,8 +67,9 @@ MipsProcess::MipsProcess(ProcessParams *params, ObjectFile *objFile)
|
||||
// Set up region for mmaps. Start it 1GB above the top of the heap.
|
||||
Addr mmap_end = brk_point + 0x40000000L;
|
||||
|
||||
memState = make_shared<MemState>(brk_point, stack_base, max_stack_size,
|
||||
next_thread_stack_base, mmap_end);
|
||||
memState = make_shared<MemState>(this, brk_point, stack_base,
|
||||
max_stack_size, next_thread_stack_base,
|
||||
mmap_end);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -66,8 +66,9 @@ PowerProcess::PowerProcess(ProcessParams *params, ObjectFile *objFile)
|
||||
// Set up region for mmaps. For now, start at bottom of kuseg space.
|
||||
Addr mmap_end = 0x70000000L;
|
||||
|
||||
memState = make_shared<MemState>(brk_point, stack_base, max_stack_size,
|
||||
next_thread_stack_base, mmap_end);
|
||||
memState = make_shared<MemState>(this, brk_point, stack_base,
|
||||
max_stack_size, next_thread_stack_base,
|
||||
mmap_end);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -73,8 +73,8 @@ RiscvProcess64::RiscvProcess64(ProcessParams *params, ObjectFile *objFile) :
|
||||
const Addr next_thread_stack_base = stack_base - max_stack_size;
|
||||
const Addr brk_point = roundUp(image.maxAddr(), PageBytes);
|
||||
const Addr mmap_end = 0x4000000000000000L;
|
||||
memState = make_shared<MemState>(brk_point, stack_base, max_stack_size,
|
||||
next_thread_stack_base, mmap_end);
|
||||
memState = make_shared<MemState>(this, brk_point, stack_base,
|
||||
max_stack_size, next_thread_stack_base, mmap_end);
|
||||
}
|
||||
|
||||
RiscvProcess32::RiscvProcess32(ProcessParams *params, ObjectFile *objFile) :
|
||||
@@ -85,8 +85,8 @@ RiscvProcess32::RiscvProcess32(ProcessParams *params, ObjectFile *objFile) :
|
||||
const Addr next_thread_stack_base = stack_base - max_stack_size;
|
||||
const Addr brk_point = roundUp(image.maxAddr(), PageBytes);
|
||||
const Addr mmap_end = 0x40000000L;
|
||||
memState = make_shared<MemState>(brk_point, stack_base, max_stack_size,
|
||||
next_thread_stack_base, mmap_end);
|
||||
memState = make_shared<MemState>(this, brk_point, stack_base,
|
||||
max_stack_size, next_thread_stack_base, mmap_end);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -136,7 +136,7 @@ class Sparc32Process : public SparcProcess
|
||||
// Set up region for mmaps.
|
||||
Addr mmap_end = 0x70000000;
|
||||
|
||||
memState = std::make_shared<MemState>(brk_point, stack_base,
|
||||
memState = std::make_shared<MemState>(this, brk_point, stack_base,
|
||||
max_stack_size,
|
||||
next_thread_stack_base,
|
||||
mmap_end);
|
||||
@@ -200,7 +200,7 @@ class Sparc64Process : public SparcProcess
|
||||
// Set up region for mmaps.
|
||||
Addr mmap_end = 0xfffff80000000000ULL;
|
||||
|
||||
memState = std::make_shared<MemState>(brk_point, stack_base,
|
||||
memState = std::make_shared<MemState>(this, brk_point, stack_base,
|
||||
max_stack_size,
|
||||
next_thread_stack_base,
|
||||
mmap_end);
|
||||
|
||||
@@ -136,8 +136,9 @@ X86_64Process::X86_64Process(ProcessParams *params, ObjectFile *objFile) :
|
||||
Addr next_thread_stack_base = stack_base - max_stack_size;
|
||||
Addr mmap_end = 0x7FFFF7FFF000ULL;
|
||||
|
||||
memState = make_shared<MemState>(brk_point, stack_base, max_stack_size,
|
||||
next_thread_stack_base, mmap_end);
|
||||
memState = make_shared<MemState>(this, brk_point, stack_base,
|
||||
max_stack_size, next_thread_stack_base,
|
||||
mmap_end);
|
||||
}
|
||||
|
||||
|
||||
@@ -161,8 +162,9 @@ I386Process::I386Process(ProcessParams *params, ObjectFile *objFile) :
|
||||
Addr next_thread_stack_base = stack_base - max_stack_size;
|
||||
Addr mmap_end = 0xB7FFF000ULL;
|
||||
|
||||
memState = make_shared<MemState>(brk_point, stack_base, max_stack_size,
|
||||
next_thread_stack_base, mmap_end);
|
||||
memState = make_shared<MemState>(this, brk_point, stack_base,
|
||||
max_stack_size, next_thread_stack_base,
|
||||
mmap_end);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
Reference in New Issue
Block a user