@@ -18,7 +18,29 @@ using namespace ARM;
18
18
19
19
void InstructionFactoryARM::InitRegisters (Memory* m) {
20
20
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>" ;
22
44
}
23
45
24
46
// I think this is my fifth one of these...haha
@@ -43,9 +65,11 @@ Address* InstructionFactoryARM::Process(Address* start) {
43
65
string Rm = registers[ (opcode >> 0 ) & 0xF ];
44
66
45
67
// 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 );
49
73
50
74
string immed8 = immed ( ror ( (opcode & 0xFF ), ((opcode >> 8 ) & 0xF ) * 2 ) );
51
75
@@ -105,6 +129,7 @@ Address* InstructionFactoryARM::Process(Address* start) {
105
129
int reglist = opcode & 0xFFFF ;
106
130
int rnum = 0 ;
107
131
int offset = 0 ;
132
+ uint32_t data;
108
133
109
134
switch (cmdint) {
110
135
case 0 : // DPIS + DPRS
@@ -175,12 +200,14 @@ Address* InstructionFactoryARM::Process(Address* start) {
175
200
break ;
176
201
case 2 : // LSIO
177
202
case 3 : // LSRO
178
- formatstring += " FOFC R, [R, " ;
203
+ formatstring += " FOFC R, " ;
179
204
args.push_back (load?" LD" :" ST" );
180
205
args.push_back (" R" );
181
206
args.push_back (byte?" B" :" " );
182
207
args.push_back (condXX);
183
208
args.push_back (Rd);
209
+
210
+ formatstring += " [R, " ;
184
211
args.push_back (Rn);
185
212
186
213
changesource = " [`" +Rn+" `]" ;
@@ -200,6 +227,16 @@ Address* InstructionFactoryARM::Process(Address* start) {
200
227
changesource += " [`" +Rm+" `]" + shift + immedshift;
201
228
}
202
229
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
+
203
240
if (load) {
204
241
if (byte) {
205
242
change->add_change (" `" +Rd+" `" , cond, 1 , " [" +changesource+" ]" );
@@ -236,6 +273,8 @@ Address* InstructionFactoryARM::Process(Address* start) {
236
273
args.push_back (registers[rnum]);
237
274
if (load)
238
275
change->add_change (" `" +registers[rnum]+" `" , cond,4 , " [[`" +Rn+" `]+" +immed (offset)+" ]" );
276
+ else
277
+ change->add_change (" [`" +Rn+" `]+" +immed (offset), cond, 4 , " [`" +registers[rnum]+" `]" );
239
278
if (increment) offset += 4 ;
240
279
else offset -= 4 ;
241
280
}
@@ -256,7 +295,9 @@ Address* InstructionFactoryARM::Process(Address* start) {
256
295
args.push_back (" B" );
257
296
args.push_back (link ?" L" :" " );
258
297
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 ));
260
301
261
302
change->add_change (" `PC`" , cond, 4 , " [`PC`]+8+" +immed24);
262
303
changedPC = true ;
0 commit comments