blob: ca07a64efb9ce2464f7f6a6d18502c70c9a2ed5d [file] [log] [blame]
/*
* 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