ETISS 0.11.2
ExtendableTranslatingInstructionSetSimulator(version0.11.2)
Loading...
Searching...
No Matches
CPUArch.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-3-Clause
2//
3// This file is part of ETISS. It is licensed under the BSD 3-Clause License; you may not use this file except in
4// compliance with the License. You should have received a copy of the license along with this project. If not, see the
5// LICENSE file.
14#include "etiss/CPUArch.h"
15
16#include <iostream>
17
18#include "etiss/CPUCore.h"
20#include "etiss/Instruction.h"
22#include "etiss/jit/ReturnCode.h"
23
24using namespace etiss;
25
27
29
31{ // disfunctional implementation
32 return 0;
33}
34
36{ // disfunctional implementation
37 delete timer;
38}
39
40CPUArch::CPUArch(std::string archname) : archname_(archname)
41{
42 setCorrespondingCPUCoreName(std::string("core") + std::to_string(CPUCore::getNextID()));
43}
44
46
47std::string CPUArch::getArchName() const
48{
49 return archname_;
50}
51
52bool CPUArch::unlikelyInstruction(etiss::uint8 *instr, unsigned length, bool &ismetainstruction)
53{ // simple implementation that return 0 if the
54 // data is 0
55 ismetainstruction = false;
56 while (length >= 4)
57 {
58 if (*(etiss::uint32 *)instr != 0)
59 return false;
60 instr += 4;
61 length -= 4;
62 }
63 while (length > 0)
64 {
65 if (*instr != 0)
66 return false;
67 instr += 1;
68 length -= 1;
69 }
70 return true;
71}
72
74{
75 return "";
76}
77
83
85{
86 return 1;
87}
88
89etiss::int32 CPUArch::handleException(etiss::int32 code, ETISS_CPU *cpu)
90{ // disfunctional implementation
91 return code;
92}
93
95{ // disfunctional implementation
96 return (etiss::InterruptVector *)0;
97}
99{ // disfunctional
100 // implementation allow
101 // memory leak
102}
103
109{
110 delete en;
111}
112
114{ // disfunctional implementation
115 return gdbcore_;
116}
117
119{
120 return etiss::cfg().get<std::string>("etiss_wd", "") + "Arch/" + getName() + "/";
121}
122
123std::string CPUArch::_getPluginName() const
124{
125 return getName();
126}
127
129{
130 if (set == nullptr)
131 return;
132 set->foreach (
134 {
135 if (((uint32_t)instr.presentBuiltinGroups() &
136 (uint32_t)etiss::instr::Instruction::BUILTINGROUP::CPUTIMEUPDATE) == 0)
137 { // update time
138 instr.addCallback(
139 [](etiss::instr::BitArray &, etiss::CodeSet &cs, etiss::instr::InstructionContext &)
140 {
141 CodePart &cp = cs.prepend(CodePart::INITIALREQUIRED);
142 cp.getAffectedRegisters().add("cpuTime_ps", 64);
143 cp.code() = "cpu->cpuTime_ps += (1 * cpu->cpuCycleTime_ps);";
144 return true;
145 },
146 (uint32_t)etiss::instr::Instruction::BUILTINGROUP::CPUTIMEUPDATE);
147 }
149 });
150}
151
157
159{
160 etiss::instr::Buffer buffer(ba.intCount(), ba.to_ulong());
162 ba.set_value(buffer.data());
163}
164
165extern "C"
166{
167
168 void ETISS_signalChangedRegisterValue(ETISS_CPU *cpu, const char *registerName)
169 {
170 CPUArch::signalChangedRegisterValue(cpu, registerName);
171 }
172
173 void etiss_icache_flush(ETISS_CPU *cpu, ETISS_System *const system, void *const *const plugin_pointers)
174 {
175 cpu->exception = etiss::RETURNCODE::RELOADBLOCKS;
176 }
177}
static void CPUArch_finalizeInstrSet(etiss::instr::InstructionSet *set)
Definition CPUArch.cpp:128
void etiss_icache_flush(ETISS_CPU *cpu, ETISS_System *const system, void *const *const plugin_pointers)
Definition CPUArch.cpp:173
contains neccesary interfaces for instruction translation.
defines main cpu core interface
contains container classes to store instruction definitions + translation functions and build a trans...
static __inline__ uint32_t
Definition arm_cde.h:25
void ETISS_signalChangedRegisterValue(ETISS_CPU *cpu, const char *registerName)
Definition CPUArch.cpp:168
virtual etiss::Plugin * newTimer(ETISS_CPU *cpu)
create a simple default timer implementaion instance for this architecture.
Definition CPUArch.cpp:30
virtual void deleteTimer(etiss::Plugin *timer)
delete timer instance
Definition CPUArch.cpp:35
static void signalChangedRegisterValue(ETISS_CPU *cpu, const char *registerName)
call this function to inform RegisterDevicePlugins about changed special register values.
Definition CPUCore.cpp:26
std::string archname_
Definition CPUArch.h:230
virtual etiss::InterruptEnable * createInterruptEnable(ETISS_CPU *cpu)
Definition CPUArch.cpp:104
virtual std::string getIncludePath()
returns a path that will be used to look up header files
Definition CPUArch.cpp:118
CPUArch(std::string archname)
Definition CPUArch.cpp:40
virtual unsigned getMaximumInstructionsPerMetaInstruction()
maximum number of instructions in a meta instruction
Definition CPUArch.cpp:78
virtual std::string getBlockGlobalCode()
get c++ code snippet that is placed at the top of a translated block
Definition CPUArch.cpp:73
virtual etiss::plugin::gdb::GDBCore & getGDBCore()
returns arch dependent gdb functions.
Definition CPUArch.cpp:113
virtual unsigned getInstructionSizeInBytes()=0
size of one instruction/ smalest data unit for instructions of variable length
virtual std::string _getPluginName() const
do not override. maps to getName().
Definition CPUArch.cpp:123
virtual void deleteInterruptVector(etiss::InterruptVector *vec, ETISS_CPU *cpu)
delete an allocated interrupt vector object
Definition CPUArch.cpp:98
virtual etiss::InterruptVector * createInterruptVector(ETISS_CPU *cpu)
allocate a new interrupt vector object for the given cpu
Definition CPUArch.cpp:94
virtual void deleteInterruptEnable(etiss::InterruptEnable *en, ETISS_CPU *cpu)
Definition CPUArch.cpp:108
std::string getArchName() const
returns the name of this architecture.
Definition CPUArch.cpp:47
etiss::plugin::gdb::GDBCore gdbcore_
Definition CPUArch.h:229
virtual bool unlikelyInstruction(etiss::uint8 *instr, unsigned length, bool &ismetainstruction)
return true if the given data is unlikely to be an instruction.
Definition CPUArch.cpp:52
virtual unsigned getMaximumInstructionSizeInBytes()=0
used for variable instruction size and delay slots
virtual void compensateEndianess(ETISS_CPU *cpu, etiss::instr::BitArray &ba) const
this function should compensate for any endianess on a BitArray so that bit 0 is always the LSB.
Definition CPUArch.cpp:158
virtual unsigned getSuperInstructionCount()
fixed number of sub instructions per instruction (e.g.
Definition CPUArch.cpp:84
virtual ~CPUArch()
Definition CPUArch.cpp:45
virtual void finalizeInstrSet(etiss::instr::ModedInstructionSet &) const
the default behavior of this function of a cpu arch is to add "cpu->cpuTime_ps += cpu->cpuCycleTime_p...
Definition CPUArch.cpp:152
virtual etiss::int32 handleException(etiss::int32 code, ETISS_CPU *cpu)
translate/process exceptions that occur at runtime
Definition CPUArch.cpp:89
std::string getName() const
returns the name of this architecture.
Definition CPUArch.h:138
static int getNextID()
Definition CPUCore.cpp:118
T get(const std::string &key, T default_, bool *default_used=0)
template function to read the value of a configuration key.
Definition Misc.h:312
interface to set interrupt bits
base plugin class that provides access to different plugin functions if present
Definition Plugin.h:38
void setCorrespondingCPUCoreName(std::string name)
Definition Plugin.h:164
stores a bit vector
void set_value(size_type width, unsigned long value)
change the value the object is holding
unsigned intCount() const
Buffer for reading data from memory while instructions are being fetched.
Definition Instruction.h:46
void recoverFromEndianness(unsigned alignment, endian_t endianness)
changes byte positions as needed to resove endiannes incompabilities after using the internal buffer ...
holds etiss::instr::Instruction instances and handles automatic instruction tree creation.
void foreach(std::function< void(Instruction &)> func)
holds information and translation callbacks for an instruction.
uint32_t & presentBuiltinGroups()
holds etiss::instr::VariableInstructionSet instances for different modes.
void foreach(std::function< void(VariableInstructionSet &)> call)
holds etiss::instr::InstructionSet instances with different bit widths.
void foreach(std::function< void(InstructionSet &)> func)
provides to architecture dependent registers as defined by gdb
Definition GDBCore.h:39
forwards: include/jit/*
Definition Benchmark.h:17
@ _BIG_ENDIAN_
Definition Misc.h:490
Configuration & cfg()
Definition Misc.cpp:548
float __ovld __cnfn length(float p)
Return the length of vector p, i.e., sqrt(p.x2 + p.y 2 + ...)
basic cpu state structure needed for execution of any cpu architecture.
Definition CPU.h:51
etiss_uint32 exception
Definition CPU.h:73
memory access and time synchronization functions.
Definition System.h:40