ETISS 0.8.0
Extendable Translating Instruction Set Simulator (version 0.8.0)
RV64IMACFD_tum_semihostingInstr.cpp
Go to the documentation of this file.
1 
8 #include "RV64IMACFDArch.h"
9 #include "RV64IMACFDFuncs.h"
10 
11 using namespace etiss;
12 using namespace etiss::instr;
13 
14 
15 // EBREAK ----------------------------------------------------------------------
18  "ebreak",
19  (uint32_t) 0x100073,
20  (uint32_t) 0xffffffff,
21  [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
22  {
23 
24 // -----------------------------------------------------------------------------
25 
26 // -----------------------------------------------------------------------------
27 
28 // -----------------------------------------------------------------------------
29 
30 // -----------------------------------------------------------------------------
31 
32  {
34 
35  cp.code() = std::string("//EBREAK\n");
36 
37 // -----------------------------------------------------------------------------
38 { // block
39 cp.code() += "{ // block\n";
40 cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
41 cp.code() += "} // block\n";
42 } // block
43 { // block
44 cp.code() += "{ // block\n";
45 cp.code() += "if (etiss_semihost_enabled()) { // conditional\n";
46 { // block
47 cp.code() += "{ // block\n";
48 cp.code() += "etiss_uint32 mem_val_0;\n";
49 cp.code() += "cpu->exception |= (*(system->dread))(system->handle, cpu, " + std::to_string(ic.current_address_ - 4ULL) + "ULL, (etiss_uint8*)&mem_val_0, 4);\n";
50 cp.code() += "if (cpu->exception) { // conditional\n";
51 { // procedure
52 cp.code() += "{ // procedure\n";
53 cp.code() += "RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";
54 cp.code() += "goto instr_exit_" + std::to_string(ic.current_address_) + ";\n";
55 cp.code() += "} // procedure\n";
56 } // procedure
57 cp.code() += "} // conditional\n";
58 cp.code() += "etiss_uint32 pre = (etiss_uint32)(mem_val_0);\n";
59 cp.code() += "etiss_uint32 mem_val_1;\n";
60 cp.code() += "cpu->exception |= (*(system->dread))(system->handle, cpu, " + std::to_string(ic.current_address_ + 0LL) + "LL, (etiss_uint8*)&mem_val_1, 4);\n";
61 cp.code() += "if (cpu->exception) { // conditional\n";
62 { // procedure
63 cp.code() += "{ // procedure\n";
64 cp.code() += "RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";
65 cp.code() += "goto instr_exit_" + std::to_string(ic.current_address_) + ";\n";
66 cp.code() += "} // procedure\n";
67 } // procedure
68 cp.code() += "} // conditional\n";
69 cp.code() += "etiss_uint32 ebreak = (etiss_uint32)(mem_val_1);\n";
70 cp.code() += "etiss_uint32 mem_val_2;\n";
71 cp.code() += "cpu->exception |= (*(system->dread))(system->handle, cpu, " + std::to_string(ic.current_address_ + 4ULL) + "ULL, (etiss_uint8*)&mem_val_2, 4);\n";
72 cp.code() += "if (cpu->exception) { // conditional\n";
73 { // procedure
74 cp.code() += "{ // procedure\n";
75 cp.code() += "RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";
76 cp.code() += "goto instr_exit_" + std::to_string(ic.current_address_) + ";\n";
77 cp.code() += "} // procedure\n";
78 } // procedure
79 cp.code() += "} // conditional\n";
80 cp.code() += "etiss_uint32 post = (etiss_uint32)(mem_val_2);\n";
81 cp.code() += "if (pre == 32509971ULL && ebreak == 1048691ULL && post == 1081102355ULL) { // conditional\n";
82 { // block
83 cp.code() += "{ // block\n";
84 cp.code() += "etiss_uint64 operation = *((RV64IMACFD*)cpu)->X[10ULL];\n";
85 cp.code() += "etiss_uint64 parameter = *((RV64IMACFD*)cpu)->X[11ULL];\n";
86 cp.code() += "*((RV64IMACFD*)cpu)->X[10ULL] = (etiss_int64)(etiss_semihost(cpu, system, plugin_pointers, 64ULL, operation, parameter));\n";
87 cp.code() += "} // block\n";
88 } // block
89 cp.code() += "} // conditional\n";
90 cp.code() += "else { // conditional\n";
91 { // block
92 cp.code() += "{ // block\n";
93 { // procedure
94 cp.code() += "{ // procedure\n";
95 cp.code() += "RV64IMACFD_raise(cpu, system, plugin_pointers, 0LL, 3LL);\n";
96 cp.code() += "goto instr_exit_" + std::to_string(ic.current_address_) + ";\n";
97 cp.code() += "} // procedure\n";
98 } // procedure
99 cp.code() += "} // block\n";
100 } // block
101 cp.code() += "} // conditional\n";
102 cp.code() += "} // block\n";
103 } // block
104 cp.code() += "} // conditional\n";
105 cp.code() += "else { // conditional\n";
106 { // block
107 cp.code() += "{ // block\n";
108 { // procedure
109 cp.code() += "{ // procedure\n";
110 cp.code() += "RV64IMACFD_raise(cpu, system, plugin_pointers, 0LL, 3LL);\n";
111 cp.code() += "goto instr_exit_" + std::to_string(ic.current_address_) + ";\n";
112 cp.code() += "} // procedure\n";
113 } // procedure
114 cp.code() += "} // block\n";
115 } // block
116 cp.code() += "} // conditional\n";
117 cp.code() += "} // block\n";
118 } // block
119 cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
120 cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
121 // -----------------------------------------------------------------------------
122  cp.getAffectedRegisters().add("instructionPointer", 32);
123  }
124  {
126 
127  cp.code() = std::string("//EBREAK\n");
128 
129 // -----------------------------------------------------------------------------
130 cp.code() += "if (cpu->return_pending || cpu->exception || cpu->nextPc != " + std::to_string(ic.current_address_ + 4) + "ULL) return cpu->exception;\n";
131 // -----------------------------------------------------------------------------
132  }
133 
134  return true;
135  },
136  0,
137  [] (BitArray & ba, Instruction & instr)
138  {
139 // -----------------------------------------------------------------------------
140 
141 // -----------------------------------------------------------------------------
142 
143  std::stringstream ss;
144 // -----------------------------------------------------------------------------
145 ss << "ebreak" << " # " << ba << (" []");
146 // -----------------------------------------------------------------------------
147  return ss.str();
148  }
149 );
etiss::instr::InstructionGroup ISA32_RV64IMACFD("ISA32_RV64IMACFD", 32)
static InstructionDefinition ebreak_(ISA32_RV64IMACFD, "ebreak",(uint32_t) 0x100073,(uint32_t) 0xffffffff, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { { CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//EBREAK\n");{ cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="} // block\n";} { cp.code()+="{ // block\n";cp.code()+="if (etiss_semihost_enabled()) { // conditional\n";{ cp.code()+="{ // block\n";cp.code()+="etiss_uint32 mem_val_0;\n";cp.code()+="cpu->exception |= (*(system->dread))(system->handle, cpu, "+std::to_string(ic.current_address_ - 4ULL)+"ULL, (etiss_uint8*)&mem_val_0, 4);\n";cp.code()+="if (cpu->exception) { // conditional\n";{ cp.code()+="{ // procedure\n";cp.code()+="RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";cp.code()+="goto instr_exit_"+std::to_string(ic.current_address_)+";\n";cp.code()+="} // procedure\n";} cp.code()+="} // conditional\n";cp.code()+="etiss_uint32 pre = (etiss_uint32)(mem_val_0);\n";cp.code()+="etiss_uint32 mem_val_1;\n";cp.code()+="cpu->exception |= (*(system->dread))(system->handle, cpu, "+std::to_string(ic.current_address_+0LL)+"LL, (etiss_uint8*)&mem_val_1, 4);\n";cp.code()+="if (cpu->exception) { // conditional\n";{ cp.code()+="{ // procedure\n";cp.code()+="RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";cp.code()+="goto instr_exit_"+std::to_string(ic.current_address_)+";\n";cp.code()+="} // procedure\n";} cp.code()+="} // conditional\n";cp.code()+="etiss_uint32 ebreak = (etiss_uint32)(mem_val_1);\n";cp.code()+="etiss_uint32 mem_val_2;\n";cp.code()+="cpu->exception |= (*(system->dread))(system->handle, cpu, "+std::to_string(ic.current_address_+4ULL)+"ULL, (etiss_uint8*)&mem_val_2, 4);\n";cp.code()+="if (cpu->exception) { // conditional\n";{ cp.code()+="{ // procedure\n";cp.code()+="RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";cp.code()+="goto instr_exit_"+std::to_string(ic.current_address_)+";\n";cp.code()+="} // procedure\n";} cp.code()+="} // conditional\n";cp.code()+="etiss_uint32 post = (etiss_uint32)(mem_val_2);\n";cp.code()+="if (pre == 32509971ULL && ebreak == 1048691ULL && post == 1081102355ULL) { // conditional\n";{ cp.code()+="{ // block\n";cp.code()+="etiss_uint64 operation = *((RV64IMACFD*)cpu)->X[10ULL];\n";cp.code()+="etiss_uint64 parameter = *((RV64IMACFD*)cpu)->X[11ULL];\n";cp.code()+="*((RV64IMACFD*)cpu)->X[10ULL] = (etiss_int64)(etiss_semihost(cpu, system, plugin_pointers, 64ULL, operation, parameter));\n";cp.code()+="} // block\n";} cp.code()+="} // conditional\n";cp.code()+="else { // conditional\n";{ cp.code()+="{ // block\n";{ cp.code()+="{ // procedure\n";cp.code()+="RV64IMACFD_raise(cpu, system, plugin_pointers, 0LL, 3LL);\n";cp.code()+="goto instr_exit_"+std::to_string(ic.current_address_)+";\n";cp.code()+="} // procedure\n";} cp.code()+="} // block\n";} cp.code()+="} // conditional\n";cp.code()+="} // block\n";} cp.code()+="} // conditional\n";cp.code()+="else { // conditional\n";{ cp.code()+="{ // block\n";{ cp.code()+="{ // procedure\n";cp.code()+="RV64IMACFD_raise(cpu, system, plugin_pointers, 0LL, 3LL);\n";cp.code()+="goto instr_exit_"+std::to_string(ic.current_address_)+";\n";cp.code()+="} // procedure\n";} cp.code()+="} // block\n";} cp.code()+="} // conditional\n";cp.code()+="} // block\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} { CodePart &cp=cs.append(CodePart::APPENDEDRETURNINGREQUIRED);cp.code()=std::string("//EBREAK\n");cp.code()+="if (cpu->return_pending || cpu->exception || cpu->nextPc != "+std::to_string(ic.current_address_+4)+"ULL) return cpu->exception;\n";} return true;}, 0, [](BitArray &ba, Instruction &instr) { std::stringstream ss;ss<< "ebreak"<< " # "<< ba<<(" []");return ss.str();})
static __inline__ uint32_t
Definition: arm_cde.h:25
Contains a small code snipped.
Definition: CodePart.h:386
@ APPENDEDRETURNINGREQUIRED
Definition: CodePart.h:402
std::string & code()
Definition: CodePart.h:416
A set of CodeParts.
Definition: CodePart.h:437
void append(const CodePart &part, CodePart::TYPE type)
Definition: CodePart.h:450
stores a bit vector
Definition: Instruction.h:161
this class contains parameters that persist in between instruction lookpus/translation within a trans...
Definition: Instruction.h:337
uint64_t current_address_
start address of current instruction
Definition: Instruction.h:366
holds information and translation callbacks for an instruction.
Definition: Instruction.h:393
Page Table Entry (PTE) defines the composition of Page Frame Number (PFN) and relavant flags.
Definition: Benchmark.h:53