support big endian, still not on the webserver yet

This commit is contained in:
George Hotz 2014-07-23 13:23:08 -07:00
parent d5dca49bed
commit 3740395052
5 changed files with 25 additions and 15 deletions

View File

@ -4,13 +4,13 @@ import struct
import qiradb
PPCREGS = ([], 4)
PPCREGS = ([], 4, True)
for i in range(32):
PPCREGS[0].append("r"+str(i))
ARMREGS = (['R0','R1','R2','R3','R4','R5','R6','R7','R8','R9','R10','R11','R12','SP','LR','PC'], 4)
X86REGS = (['EAX', 'ECX', 'EDX', 'EBX', 'ESP', 'EBP', 'ESI', 'EDI', 'EIP'], 4)
X64REGS = (['RAX', 'RCX', 'RDX', 'RBX', 'RSP', 'RBP', 'RSI', 'RDI', 'RIP'], 8)
ARMREGS = (['R0','R1','R2','R3','R4','R5','R6','R7','R8','R9','R10','R11','R12','SP','LR','PC'], 4, False)
X86REGS = (['EAX', 'ECX', 'EDX', 'EBX', 'ESP', 'EBP', 'ESI', 'EDI', 'EIP'], 4, False)
X64REGS = (['RAX', 'RCX', 'RDX', 'RBX', 'RSP', 'RBP', 'RSI', 'RDI', 'RIP'], 8, False)
# things that don't cross the fork
class Program:
@ -123,12 +123,12 @@ class Program:
return ret
def add_trace(self, fn, i):
self.traces[i] = Trace(fn, i, self.tregs[1], len(self.tregs[0]))
self.traces[i] = Trace(fn, i, self.tregs[1], len(self.tregs[0]), self.tregs[2])
class Trace:
def __init__(self, fn, forknum, r1, r2):
def __init__(self, fn, forknum, r1, r2, r3):
self.forknum = forknum
self.db = qiradb.Trace(fn, forknum, r1, r2)
self.db = qiradb.Trace(fn, forknum, r1, r2, r3)
self.fetch_base_memory()
def fetch_base_memory(self):

View File

@ -85,7 +85,8 @@ bool Trace::remap_backing(uint64_t new_size) {
return (backing_ != NULL);
}
bool Trace::ConnectToFileAndStart(char *filename, int register_size, int register_count) {
bool Trace::ConnectToFileAndStart(char *filename, int register_size, int register_count, bool is_big_endian) {
is_big_endian_ = is_big_endian;
register_size_ = register_size;
register_count_ = register_count;
pthread_rwlock_init(&db_lock_, NULL);
@ -154,10 +155,17 @@ void Trace::process() {
if (type == 'S') {
int byte_count = (c->flags&SIZE_MASK)/8;
uint64_t data = c->data;
for (int i = 0; i < byte_count; i++) {
if (is_big_endian_) {
for (int i = byte_count-1; i >= 0; --i) {
commit_memory(c->clnum, c->address+i, data&0xFF);
data >>= 8;
}
} else {
// little endian
commit_memory(c->clnum, c->address+i, data&0xFF);
data >>= 8;
for (int i = 0; i < byte_count; i++) {
commit_memory(c->clnum, c->address+i, data&0xFF);
data >>= 8;
}
}
}
}

View File

@ -46,7 +46,7 @@ class Trace {
public:
Trace(unsigned int trace_index);
~Trace();
bool ConnectToFileAndStart(char *filename, int register_size, int register_count);
bool ConnectToFileAndStart(char *filename, int register_size, int register_count, bool is_big_endian);
// these must be threadsafe
vector<Clnum> FetchClnumsByAddressAndType(Address address, char type, Clnum start_clnum, unsigned int limit);
@ -73,6 +73,7 @@ private:
inline void commit_memory(Clnum clnum, Address a, uint8_t d);
inline MemoryWithValid get_byte(Clnum clnum, Address a);
bool is_big_endian_;
// the backing of the database
pthread_rwlock_t db_lock_;
unordered_map<pair<Address, char>, set<Clnum> > addresstype_to_clnums_;

View File

@ -19,9 +19,10 @@ static int Trace_init(PyTrace *self, PyObject *args, PyObject *kwds) {
char *filename;
int register_size, register_count;
unsigned int ti;
if (!PyArg_ParseTuple(args, "sIii", &filename, &ti, &register_size, &register_count)) { return -1; }
int is_big_endian;
if (!PyArg_ParseTuple(args, "sIiii", &filename, &ti, &register_size, &register_count, &is_big_endian)) { return -1; }
Trace *t = new Trace(ti);
if (!t->ConnectToFileAndStart(filename, register_size, register_count)) { delete t; return -1; }
if (!t->ConnectToFileAndStart(filename, register_size, register_count, is_big_endian!=0)) { delete t; return -1; }
self->t = t;
return 0;
}

View File

@ -8,7 +8,7 @@ LIMIT = 10000
#time.sleep(100000.0)
# register size = 4, register count = 9
t = qiradb.Trace("hello_trace", 0, 4, 9)
t = qiradb.Trace("hello_trace", 0, 4, 9, False)
print "trace created"
while not t.did_update():