Skip to content

Commit c5ee989

Browse files
author
unknown
committed
Added relative addressing. Added more XML commands.
1 parent 852e176 commit c5ee989

20 files changed

+276
-23
lines changed

Address.cc

+28
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,26 @@
77

88
namespace eda {
99

10+
void Address::SerializeToXML(ostringstream& out) {
11+
out << "<Address>" << std::hex;
12+
out << "<name>" << name_ << "</name>";
13+
if(location_ != 0xFFFFFFFF) {
14+
out << "<location>" << location_ << "</location>";
15+
}
16+
out << "<values>";
17+
for(map<int, uint8_t>::iterator it = datamap_.begin(); it != datamap_.end(); ++it) {
18+
if(it->first != 0) {
19+
uint32_t data;
20+
get32(it->first, &data);
21+
out << std::dec << "<C_" << it->first << ">" << std::hex << data << "</C_" << std::dec << it->first << ">";
22+
}
23+
}
24+
out << "</values>";
25+
if(instruction_ != NULL)
26+
instruction_->SerializeToXML(out);
27+
out << "</Address>";
28+
}
29+
1030
Address* Address::get8(int changelist_number, uint8_t* data) {
1131
if(changelist_number == 0) // 0 is a link to the latest changelist
1232
(*data) = datamap_.rbegin()->second;
@@ -66,4 +86,12 @@ const string& Address::get_name() {
6686
return name_;
6787
}
6888

89+
void Address::set_location(uint32_t location) {
90+
location_ = location;
91+
}
92+
93+
uint32_t Address::get_location() {
94+
return location_;
95+
}
96+
6997
}

CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ SET(EDA_SRCS
1818
./Servlet.cc
1919
./FactoryOwner.cc
2020
./File.cc
21+
./Instruction.cc
2122
)
2223
#INCLUDE_DIRECTORIES(./include/)
2324
ADD_LIBRARY(eda_lib ${EDA_SRCS})

Changelist.cc

+9-2
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,17 @@ void Changelist::SerializeToXML(ostringstream& out) {
5353
out << "<number>" << changelist_number_ << "</number>";
5454
out << "<owner>" << owner_->get_name() << "</owner>";
5555
out << "<changes>";
56-
for (ChangelistIterator it = changes_.begin(); it != changes_.end(); ++it) {
56+
for (ChangelistIterator it = changes_.begin(); it != changes_.end();) {
5757
out << "<change>";
5858
out << "<address>" << it->first->get_name() << "</address>";
59-
out << "<value>" << std::hex << (int)it->second << "</value>";
59+
out << "<value>" << std::hex;
60+
uint32_t value = it->second;
61+
int count = 0;
62+
while((++it) != changes_.end() && it->first->get_name() == "") {
63+
count++;
64+
value |= it->second << (count*8);
65+
}
66+
out << value << "</value>";
6067
out << "</change>";
6168
}
6269
out << "</changes>";

Data/backend.js

+10-2
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,28 @@ function send_request() {
1515
}
1616

1717
function send_reg_request() {
18-
var registers = ["R0","R1","R2","R3","R4","R5","R6","R7","R8","R9","R10","R11","R12","SP","LR","PC"];
18+
/*var registers = ["R0","R1","R2","R3","R4","R5","R6","R7","R8","R9","R10","R11","R12","SP","LR","PC","CPSR"];
1919
var out = "";
2020
for(r in registers) {
2121
var ret = xx("EVAL", "[`"+registers[r]+"`]", "");
2222
out += registers[r]+": "+ret.html+"<br/>";
2323
}
24+
document.getElementById("registers").innerHTML=out;*/
25+
var out = "";
26+
var registers = xx("READ","State","").xml.documentElement.getElementsByTagName("registers")[0];
27+
for(r in registers.childNodes) {
28+
if(registers.childNodes[r].childNodes != null)
29+
out += registers.childNodes[r].nodeName+": "+registers.childNodes[r].childNodes[0].nodeValue+"<br/>";
30+
}
2431
document.getElementById("registers").innerHTML=out;
2532
}
2633

2734
function send_step_request() {
35+
var ret2 = xx("READ", "Address/[`PC`]-8/Instruction/Parsed", "");
36+
2837
var ret = xx("STEP", "Address/[`PC`]-8", "");
2938
document.getElementById("response").value = view_xml(ret.xml.documentElement, 0);
3039

31-
var ret2 = xx("READ", "Address/[`PC`]-8/Instruction/Parsed", "");
3240
document.getElementById("rendered").innerHTML += '<span class="address">'+ret.xml.getElementsByTagName("owner")[0].childNodes[0].nodeValue+": "+'</span>';
3341
document.getElementById("rendered").innerHTML += ParsedInstructionToHTML(ret2.xml.documentElement);
3442

Data/simulator.html

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<html>
2+
<head>
3+
<title>EDA Backend</title>
4+
<script src="backend.js"></script>
5+
<script src="simulator.js"></script>
6+
<link rel="stylesheet" type="text/css" href="backend.css" />
7+
</head>
8+
<body>
9+
<input type="button" value="Step" onclick="simulator_step_request()"/><br/><br/>
10+
<div class="codebox" id="instructions"></div>
11+
</body>
12+
</html>

Data/simulator.js

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
function simulator_step_request() {
2+
var ret2 = xx("READ", "/Address/[`PC`]-8/Instruction/Parsed", "");
3+
var ret = xx("STEP", "/Address/[`PC`]-8", "");
4+
5+
document.getElementById("instructions").innerHTML += '<span class="address">'+ret.xml.getElementsByTagName("owner")[0].childNodes[0].nodeValue+": "+'</span>';
6+
document.getElementById("instructions").innerHTML += ParsedInstructionToHTML(ret2.xml.documentElement);
7+
}

FactoryOwner.cc

+41-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
// provided for debugging only, or not
1919
// /Eval/
2020

21+
#include <iomanip>
22+
2123
#include "debug.h"
2224

2325
#include "util.h"
@@ -54,9 +56,9 @@ bool FactoryOwner::HandlePostRequest(const std::vector<string>& argv, std::strin
5456

5557
// Read because a browser can't see these
5658
bool FactoryOwner::HandleReadRequest(const std::vector<string>& argv, std::string* out) {
57-
if(argv[0] == "Address" && argv.size() >= 3) {
59+
if(argv[0] == "Address" && argv.size() >= 2) {
5860
Address* a = memory_.ResolveToAddress(0, argv[1]);
59-
if (a != 0) {
61+
if (a != 0 && argv.size() >= 3) {
6062
if(argv[2] == "Name") {
6163
(*out) += a->get_name();
6264
} else if(argv[2] == "Owned") {
@@ -81,13 +83,20 @@ bool FactoryOwner::HandleReadRequest(const std::vector<string>& argv, std::strin
8183
a->get_instruction()->parsed_->SerializeToXML(ss);
8284
else if(argv[3] == "StatelessChangelist")
8385
a->get_instruction()->change_->SerializeToXML(ss);
86+
} else if(a->get_instruction() != NULL) {
87+
a->get_instruction()->SerializeToXML(ss);
8488
} else {
8589
ss << "<failure></failure>";
8690
}
8791
(*out) += ss.str();
8892
} else {
8993
return false;
9094
}
95+
} else if(a != 0) {
96+
ostringstream ss;
97+
ss << kXMLHeader;
98+
a->SerializeToXML(ss);
99+
(*out) += ss.str();
91100
} else {
92101
LOG(INFO) << "Address not found";
93102
return false;
@@ -102,6 +111,27 @@ bool FactoryOwner::HandleReadRequest(const std::vector<string>& argv, std::strin
102111
else
103112
ss << "<failure></failure>";
104113
(*out) = ss.str();
114+
} else if(argv[0] == "State") {
115+
ostringstream ss;
116+
ss << kXMLHeader;
117+
ss << "<State>";
118+
instruction_factory_->StateToXML(ss);
119+
ss << "<currentchangelistnumber>" << changelist_factory_.get_current_changelist_number() << "</currentchangelistnumber>";
120+
ss << "</State>";
121+
(*out) = ss.str();
122+
} else if(argv[0] == "Memory" && argv.size() >= 4) {
123+
// Dump memory raw
124+
Address* a = memory_.get_address_by_location(stoi(argv[1]));
125+
int len = stoi(argv[2]);
126+
int clnum = stoi(argv[3]);
127+
ostringstream ss;
128+
129+
for(int i = 0; i < len; i++) {
130+
uint8_t data;
131+
a = a->get8(clnum, &data);
132+
ss << setfill('0') << setw(2) << hex << (int)data;
133+
}
134+
(*out) = ss.str();
105135
}
106136
return true;
107137
}
@@ -117,6 +147,15 @@ bool FactoryOwner::HandleEvalRequest(const std::vector<string>& argv, std::strin
117147
return true;
118148
}
119149

150+
bool FactoryOwner::HandleRenameRequest(const std::vector<string>& argv, std::string* out) {
151+
if(argv[0] == "Address" && argv.size() >= 3) {
152+
Address* a = memory_.ResolveToAddress(0, argv[1]);
153+
LOG(INFO) << "Renaming " << a->get_name() << " to " << argv[2];
154+
memory_.Rename(a, argv[2]);
155+
}
156+
return true;
157+
}
158+
120159
bool FactoryOwner::HandleStepRequest(const std::vector<string>& argv, std::string* out) {
121160
if(argv[0] == "Address" && argv.size() >= 2) {
122161
Address* a = memory_.ResolveToAddress(0, argv[1]);

FactoryOwner.h

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class FactoryOwner {
2222
bool HandleEvalRequest(const std::vector<std::string>& argv, std::string* out);
2323
bool HandleReadRequest(const std::vector<std::string>& argv, std::string* out);
2424
bool HandleStepRequest(const std::vector<std::string>& argv, std::string* out);
25+
bool HandleRenameRequest(const std::vector<std::string>& argv, std::string* out);
2526
bool HandleDisassembleRequest(const std::vector<string>& argv, std::string* out);
2627

2728
Memory memory_; // I also own the memory

Instruction.cc

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Instruction.cc -- May 29, 2009
2+
// by geohot
3+
// part of "The Embedded Disassembler"
4+
// released under GPLv3, see http://gplv3.fsf.org/
5+
6+
#include "data.h"
7+
8+
using namespace eda;
9+
using namespace std;
10+
11+
void Instruction::SerializeToXML(ostringstream& out) {
12+
out << "<Instruction>";
13+
parsed_->SerializeToXML(out);
14+
change_->SerializeToXML(out);
15+
/* out << "<metadata>";
16+
for(std::vector<Instruction>)
17+
out << "</metadata>";*/
18+
out << "</Instruction>";
19+
}

InstructionFactoryARM.cc

+47-6
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,29 @@ using namespace ARM;
1818

1919
void InstructionFactoryARM::InitRegisters(Memory* m) {
2020
for (int i = 0; i < 18; i++)
21-
m->AllocateSegment(registers[i], 4);
21+
registers_.push_back(make_pair(registers[i], m->AllocateSegment(registers[i], 4)));
22+
program_counter_ = m->get_address_by_name("PC");
23+
link_register_ = m->get_address_by_name("LR");
24+
stack_pointer_ = m->get_address_by_name("SP");
25+
}
26+
27+
// Could go in InstructionFactory
28+
void InstructionFactoryARM::StateToXML(std::ostringstream& out) {
29+
out << std::hex;
30+
out << "<Core>";
31+
out << "<ProgramCounter>" << GetProgramCounter() << "</ProgramCounter>";
32+
//out << "<LinkRegister>" << GetLinkRegister() << "</LinkRegister>";
33+
out << "<StackPointer>" << GetStackPointer() << "</StackPointer>";
34+
out << "<registers>";
35+
36+
for(vector<pair<string, Address*> >::iterator it = registers_.begin(); it!=registers_.end(); ++it) {
37+
uint32_t data;
38+
it->second->get32(0, &data);
39+
out << "<" << it->first << ">" << data << "</" << it->first << ">";
40+
}
41+
42+
out << "</registers>";
43+
out << "</Core>";
2244
}
2345

2446
// I think this is my fifth one of these...haha
@@ -43,9 +65,11 @@ Address* InstructionFactoryARM::Process(Address* start) {
4365
string Rm = registers[ (opcode >> 0) & 0xF ];
4466

4567
// Extract immediate data
46-
string immed24 =
47-
immed_signed( ((opcode & 0x7FFFFF) << 2) - ((opcode & 0x800000)?0x2000000:0) );
48-
string immed12 = immed(opcode & 0xFFF);
68+
int immed24_numeric = ((opcode & 0x7FFFFF) << 2) - ((opcode & 0x800000)?0x2000000:0);
69+
string immed24 = immed_signed( immed24_numeric );
70+
71+
int immed12_numeric = opcode & 0xFFF;
72+
string immed12 = immed( immed12_numeric );
4973

5074
string immed8 = immed( ror( (opcode & 0xFF), ((opcode >> 8) & 0xF) * 2) );
5175

@@ -105,6 +129,7 @@ Address* InstructionFactoryARM::Process(Address* start) {
105129
int reglist = opcode & 0xFFFF;
106130
int rnum = 0;
107131
int offset = 0;
132+
uint32_t data;
108133

109134
switch (cmdint) {
110135
case 0: // DPIS + DPRS
@@ -175,12 +200,14 @@ Address* InstructionFactoryARM::Process(Address* start) {
175200
break;
176201
case 2: //LSIO
177202
case 3: //LSRO
178-
formatstring += "FOFC R, [R, ";
203+
formatstring += "FOFC R, ";
179204
args.push_back(load?"LD":"ST");
180205
args.push_back("R");
181206
args.push_back(byte?"B":"");
182207
args.push_back(condXX);
183208
args.push_back(Rd);
209+
210+
formatstring += "[R, ";
184211
args.push_back(Rn);
185212

186213
changesource = "[`"+Rn+"`]";
@@ -200,6 +227,16 @@ Address* InstructionFactoryARM::Process(Address* start) {
200227
changesource += "[`"+Rm+"`]" + shift + immedshift;
201228
}
202229
formatstring += "]";
230+
231+
// Second PC Hack
232+
// immed12 may not be the only choice
233+
if(Rn == "PC" && start->memory_->get_address_by_location((start->get_location() + immed12_numeric + 8)) != NULL) { // Shouldn't be a string compare
234+
formatstring = "FOFC R, =I";
235+
LOG(INFO) << "location is " << std::hex << (start->get_location() + immed12_numeric + 8);
236+
start->memory_->get_address_by_location((start->get_location() + immed12_numeric + 8))->get32(0, &data);
237+
args[5] = immed(data);
238+
}
239+
203240
if(load) {
204241
if(byte) {
205242
change->add_change("`"+Rd+"`", cond, 1, "["+changesource+"]");
@@ -236,6 +273,8 @@ Address* InstructionFactoryARM::Process(Address* start) {
236273
args.push_back(registers[rnum]);
237274
if(load)
238275
change->add_change("`"+registers[rnum]+"`", cond,4, "[[`"+Rn+"`]+"+immed(offset)+"]");
276+
else
277+
change->add_change("[`"+Rn+"`]+"+immed(offset), cond, 4, "[`"+registers[rnum]+"`]");
239278
if (increment) offset += 4;
240279
else offset -= 4;
241280
}
@@ -256,7 +295,9 @@ Address* InstructionFactoryARM::Process(Address* start) {
256295
args.push_back("B");
257296
args.push_back(link?"L":"");
258297
args.push_back(condXX);
259-
args.push_back(immed24);
298+
//args.push_back(immed24);
299+
// One PC Hack
300+
args.push_back(immed(start->get_location() + immed24_numeric + 8));
260301

261302
change->add_change("`PC`", cond, 4, "[`PC`]+8+"+immed24);
262303
changedPC = true;

InstructionFactoryARM.h

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ class InstructionFactoryARM : public InstructionFactory {
1919
public:
2020
Address* Process(Address* start);
2121
void InitRegisters(Memory* m);
22+
void StateToXML(std::ostringstream& out);
23+
// Convert raw register to real instruction pointer
24+
uint32_t TranslateProgramCounter(uint32_t in) {
25+
// ARM PC is 8 ahead of the real program counter
26+
return in-8;
27+
}
2228
};
2329

2430
namespace ARM {

Memory.cc

+10-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@
1111

1212
namespace eda {
1313

14+
void Memory::Rename(Address* address, const string& name) {
15+
if(address->get_name().length() != 0) {
16+
named_.erase(named_.find(address->get_name()));
17+
}
18+
address->set_name(name);
19+
named_.insert(make_pair(name, address));
20+
}
21+
1422
Address* Memory::AllocateSegment(uint32_t address_32, int length) {
1523
vector<Address*>* ts = AllocateSegment(length);
1624

@@ -20,6 +28,7 @@ Address* Memory::AllocateSegment(uint32_t address_32, int length) {
2028
ostringstream name;
2129
name << "unk_" << hex << (address_32+l);
2230
(*ts)[l]->set_name(name.str());
31+
(*ts)[l]->set_location(address_32+l);
2332
named_.insert(make_pair(name.str(), (*ts)[l]));
2433
}
2534

@@ -38,7 +47,7 @@ vector<Address*>* Memory::AllocateSegment(int length) {
3847
vector<Address*>* ts = new vector<Address*>(length);
3948

4049
for (int l = 0; l < length; l++) {
41-
(*ts)[l] = new Address();
50+
(*ts)[l] = new Address(this);
4251
}
4352

4453
// Setup the next pointers

0 commit comments

Comments
 (0)