mirror of https://github.com/geohot/qira
support big endian, still not on the webserver yet
This commit is contained in:
parent
d5dca49bed
commit
3740395052
|
@ -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):
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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_;
|
||||
|
|
|
@ -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, ®ister_size, ®ister_count)) { return -1; }
|
||||
int is_big_endian;
|
||||
if (!PyArg_ParseTuple(args, "sIiii", &filename, &ti, ®ister_size, ®ister_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;
|
||||
}
|
||||
|
|
|
@ -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():
|
||||
|
|
Loading…
Reference in New Issue