| /* | |
| * Copyright (c) 2017 Advanced Micro Devices, Inc. | |
| * All rights reserved. | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions are | |
| * met: redistributions of source code must retain the above copyright | |
| * notice, this list of conditions and the following disclaimer; | |
| * redistributions in binary form must reproduce the above copyright | |
| * notice, this list of conditions and the following disclaimer in the | |
| * documentation and/or other materials provided with the distribution; | |
| * neither the name of the copyright holders nor the names of its | |
| * contributors may be used to endorse or promote products derived from | |
| * this software without specific prior written permission. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| * | |
| * Author: Brandon Potter | |
| */ | |
| #ifndef SRC_SIM_MEM_STATE_HH | |
| #define SRC_SIM_MEM_STATE_HH | |
| #include "sim/serialize.hh" | |
| /** | |
| * This class holds the memory state for the Process class and all of its | |
| * derived, architecture-specific children. | |
| * | |
| * The fields held in this class dynamically change as the process object | |
| * is run in the simulator. They are updated by system calls and faults; | |
| * each change represents a modification to the process address space. | |
| * The stack, heap, and mmap boundaries are held with this class along with | |
| * the base of the next thread stack. | |
| * | |
| * The class is meant to be allocated dynamically and shared through a | |
| * pointer interface because two process can potentially share their virtual | |
| * address space if certain options are passed into the clone(2). | |
| */ | |
| class MemState : public Serializable | |
| { | |
| public: | |
| MemState(Addr brk_point, Addr stack_base, Addr max_stack_size, | |
| Addr next_thread_stack_base, Addr mmap_end) | |
| : _brkPoint(brk_point), _stackBase(stack_base), _stackSize(0), | |
| _maxStackSize(max_stack_size), _stackMin(0), | |
| _nextThreadStackBase(next_thread_stack_base), _mmapEnd(mmap_end) | |
| { } | |
| MemState& | |
| operator=(const MemState &in) | |
| { | |
| if (this == &in) | |
| return *this; | |
| _brkPoint = in._brkPoint; | |
| _stackBase = in._stackBase; | |
| _stackSize = in._stackSize; | |
| _maxStackSize = in._maxStackSize; | |
| _stackMin = in._stackMin; | |
| _nextThreadStackBase = in._nextThreadStackBase; | |
| _mmapEnd = in._mmapEnd; | |
| return *this; | |
| } | |
| Addr getBrkPoint() const { return _brkPoint; } | |
| Addr getStackBase() const { return _stackBase; } | |
| Addr getStackSize() const { return _stackSize; } | |
| Addr getMaxStackSize() const { return _maxStackSize; } | |
| Addr getStackMin() const { return _stackMin; } | |
| Addr getNextThreadStackBase() const { return _nextThreadStackBase; } | |
| Addr getMmapEnd() const { return _mmapEnd; } | |
| void setBrkPoint(Addr brk_point) { _brkPoint = brk_point; } | |
| void setStackBase(Addr stack_base) { _stackBase = stack_base; } | |
| void setStackSize(Addr stack_size) { _stackSize = stack_size; } | |
| void setMaxStackSize(Addr max_stack) { _maxStackSize = max_stack; } | |
| void setStackMin(Addr stack_min) { _stackMin = stack_min; } | |
| void setNextThreadStackBase(Addr ntsb) { _nextThreadStackBase = ntsb; } | |
| void setMmapEnd(Addr mmap_end) { _mmapEnd = mmap_end; } | |
| void | |
| serialize(CheckpointOut &cp) const override | |
| { | |
| paramOut(cp, "brkPoint", _brkPoint); | |
| paramOut(cp, "stackBase", _stackBase); | |
| paramOut(cp, "stackSize", _stackSize); | |
| paramOut(cp, "maxStackSize", _maxStackSize); | |
| paramOut(cp, "stackMin", _stackMin); | |
| paramOut(cp, "nextThreadStackBase", _nextThreadStackBase); | |
| paramOut(cp, "mmapEnd", _mmapEnd); | |
| } | |
| void | |
| unserialize(CheckpointIn &cp) override | |
| { | |
| paramIn(cp, "brkPoint", _brkPoint); | |
| paramIn(cp, "stackBase", _stackBase); | |
| paramIn(cp, "stackSize", _stackSize); | |
| paramIn(cp, "maxStackSize", _maxStackSize); | |
| paramIn(cp, "stackMin", _stackMin); | |
| paramIn(cp, "nextThreadStackBase", _nextThreadStackBase); | |
| paramIn(cp, "mmapEnd", _mmapEnd); | |
| } | |
| private: | |
| Addr _brkPoint; | |
| Addr _stackBase; | |
| Addr _stackSize; | |
| Addr _maxStackSize; | |
| Addr _stackMin; | |
| Addr _nextThreadStackBase; | |
| Addr _mmapEnd; | |
| }; | |
| #endif |