Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / sam / cpus / vonk / ss / lib / cpu / src / SS_AsiCtrReg.h
/*
* ========== Copyright Header Begin ==========================================
*
* OpenSPARC T2 Processor File: SS_AsiCtrReg.h
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
*
* The above named program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License version 2 as published by the Free Software Foundation.
*
* The above named program is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
*
* ========== Copyright Header End ============================================
*/
#ifndef __SS_AsiCtrReg_h__
#define __SS_AsiCtrReg_h__
#include "BL_Mutex.h"
#include "SS_AsiSpace.h"
#include "SS_SnapShot.h"
class SS_Node;
class SS_AsiCtrReg
{
public:
SS_AsiCtrReg( const char* __name, uint64_t __mask_ro, uint64_t __mask_r1c, uint64_t __mask_rw, uint64_t __mask_w1c, uint64_t __init )
:
_data(__init),
_mask_ro(__mask_ro),
_mask_rw(__mask_rw),
_mask_r1c(__mask_r1c),
_mask_w1c(__mask_w1c),
_init(__init),
_name(__name)
{}
const char* name() const { return _name; }
uint64_t get() { uint64_t tmp = _data; _data &= ~_mask_r1c; return tmp; }
void set( uint64_t v ) { _data = (v & _mask_rw) | (_data & ~(_mask_rw | (v & _mask_w1c))); }
void set_unmasked( uint64_t v ) { _data = v; }
uint64_t get_ro_mask() const { return _mask_ro; }
uint64_t get_rw_mask() const { return _mask_rw; }
uint64_t get_r1c_mask() const { return _mask_r1c; }
uint64_t get_w1c_mask() const { return _mask_w1c; }
uint64_t get_init_mask() const { return _init; }
void snapshot( SS_SnapShot& ss, const char* prefix="", const char* suffix="" );
template<class Type>
static void snapshot( SS_SnapShot& ss, Type* array, uint_t size, const char* prefix="", const char* suffix="" )
{
for (int i=0; i<size; i++)
{
char num[32];
if (*suffix != 0)
sprintf(num,"%s.%d",suffix,i);
else
sprintf(num,"%d",i);
array[i].snapshot(ss,prefix,num);
}
}
static SS_AsiSpace::Error ld64( SS_Node*, void*, SS_Strand*, SS_Vaddr, uint64_t* data );
static SS_AsiSpace::Error st64( SS_Node*, void*, SS_Strand*, SS_Vaddr, uint64_t data );
static SS_AsiSpace::Error rd64( SS_Node*, void*, SS_Strand*, SS_Vaddr, uint64_t* data );
static SS_AsiSpace::Error wr64( SS_Node*, void*, SS_Strand*, SS_Vaddr, uint64_t data );
protected:
uint64_t _data;
uint64_t _mask_ro; // read only
uint64_t _mask_rw; // read write
uint64_t _mask_r1c; // read one clear
uint64_t _mask_w1c; // write one clear
uint64_t _init;
const char* _name;
};
class SS_SharedAsiCtrReg : public SS_AsiCtrReg
{
public:
SS_SharedAsiCtrReg( const char* __name, uint64_t __mask_ro, uint64_t __mask_r1c, uint64_t __mask_rw, uint64_t __mask_w1c, uint64_t __init )
:
SS_AsiCtrReg(__name,__mask_ro,__mask_r1c,__mask_rw,__mask_w1c,__init)
{}
int lock() { return _mutex.lock(); }
int unlock() { return _mutex.unlock(); }
int trylock() { return _mutex.trylock(); }
void snapshot( SS_SnapShot& ss, const char* prefix="", const char* suffix="" )
{
SS_AsiCtrReg::snapshot(ss,prefix,suffix);
}
template<class Type>
static void snapshot( SS_SnapShot& ss, Type* array, uint_t size, const char* prefix="", const char* suffix="" )
{
SS_AsiCtrReg::snapshot<Type>(ss,array,size,prefix,suffix);
}
static SS_AsiSpace::Error ld64( SS_Node*, void*, SS_Strand*, SS_Vaddr, uint64_t* data );
static SS_AsiSpace::Error st64( SS_Node*, void*, SS_Strand*, SS_Vaddr, uint64_t data );
static SS_AsiSpace::Error rd64( SS_Node*, void*, SS_Strand*, SS_Vaddr, uint64_t* data );
static SS_AsiSpace::Error wr64( SS_Node*, void*, SS_Strand*, SS_Vaddr, uint64_t data );
protected:
BL_Mutex _mutex;
};
#endif