mirror of https://github.com/geohot/qira
thread safer, started multiarch support, ditch mongo?
This commit is contained in:
parent
17d1d3b529
commit
d362411208
|
@ -32,4 +32,6 @@ echo "making symlinks"
|
|||
sudo ln -sf $(pwd)/qira /usr/local/bin/qira
|
||||
sudo ln -sf $(pwd)/qira-server /usr/local/bin/qira-server
|
||||
sudo ln -sf $(pwd)/qemu/qira-i386 /usr/local/bin/qira-i386
|
||||
sudo ln -sf $(pwd)/qemu/qira-arm /usr/local/bin/qira-arm
|
||||
sudo ln -sf $(pwd)/qemu/qira-x86_64 /usr/local/bin/qira-x86_64
|
||||
|
||||
|
|
|
@ -99,6 +99,10 @@ def init():
|
|||
mem = Memory()
|
||||
print "reset program state"
|
||||
|
||||
# get the memory base
|
||||
# TODO: read the elf file sections
|
||||
|
||||
# get the instructions
|
||||
objdump_out = subprocess.Popen(
|
||||
["objdump", "-d", "/tmp/qira_binary"],
|
||||
stdout = subprocess.PIPE).communicate()[0]
|
||||
|
@ -111,7 +115,6 @@ def init():
|
|||
else:
|
||||
# could get names here too, but maybe useless for now
|
||||
pass
|
||||
|
||||
print "objdump parse got",len(instructions),"instructions"
|
||||
|
||||
open("/tmp/qira_memdb", "wb").write(
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
qemu-latest/arm-linux-user/qemu-arm
|
|
@ -0,0 +1 @@
|
|||
qemu-latest/x86_64-linux-user/qemu-x86_64
|
|
@ -15,10 +15,9 @@ if [ ! -d qemu/qemu-latest ]; then
|
|||
fi
|
||||
|
||||
cd qemu/qemu-latest
|
||||
rm -f tci.c
|
||||
ln -s ../../qemu_mods/tci.c tci.c
|
||||
ln -s ../../../qemu_mods/qemu.h linux-user/qemu.h
|
||||
./configure --target-list=i386-linux-user --enable-tcg-interpreter --enable-debug-tcg --cpu=unknown
|
||||
ln -sf ../../qemu_mods/tci.c tci.c
|
||||
ln -sf ../../../qemu_mods/qemu.h linux-user/qemu.h
|
||||
./configure --target-list=i386-linux-user,arm-linux-user,x86_64-linux-user --enable-tcg-interpreter --enable-debug-tcg --cpu=unknown
|
||||
make -j32
|
||||
|
||||
|
||||
|
|
|
@ -440,6 +440,7 @@ void add_pending_change(target_ulong addr, uint64_t data, uint32_t flags);
|
|||
void commit_pending_changes(void);
|
||||
void track_kernel_read(void *host_addr, target_ulong guest_addr, long len);
|
||||
void track_kernel_write(void *host_addr, target_ulong guest_addr, long len);
|
||||
void resize_change_buffer(size_t size);
|
||||
|
||||
// struct storing change data
|
||||
struct change {
|
||||
|
@ -458,17 +459,34 @@ struct change {
|
|||
int GLOBAL_QIRA_did_init = 0;
|
||||
CPUArchState *GLOBAL_CPUArchState;
|
||||
struct change *GLOBAL_change_buffer;
|
||||
uint32_t GLOBAL_changelist_number = 0;
|
||||
|
||||
uint32_t GLOBAL_qira_log_fd;
|
||||
uint32_t *GLOBAL_change_count;
|
||||
uint32_t GLOBAL_change_size;
|
||||
uint32_t GLOBAL_is_filtered = 0;
|
||||
|
||||
// current state that must survive forks
|
||||
struct logstate {
|
||||
uint32_t change_count;
|
||||
uint32_t changelist_number;
|
||||
uint32_t is_filtered;
|
||||
// does this work in shared memory?
|
||||
pthread_mutex_t lock;
|
||||
};
|
||||
struct logstate *GLOBAL_logstate;
|
||||
|
||||
// should be 0ed on startup
|
||||
#define PENDING_CHANGES_MAX_ADDR 0x100
|
||||
struct change GLOBAL_pending_changes[PENDING_CHANGES_MAX_ADDR/4];
|
||||
|
||||
void resize_change_buffer(size_t size) {
|
||||
if(ftruncate(GLOBAL_qira_log_fd, size)) {
|
||||
perror("ftruncate");
|
||||
}
|
||||
GLOBAL_change_buffer = mmap(NULL, size,
|
||||
PROT_READ | PROT_WRITE, MAP_SHARED, GLOBAL_qira_log_fd, 0);
|
||||
GLOBAL_logstate = (struct logstate *)GLOBAL_change_buffer;
|
||||
if (GLOBAL_change_buffer == NULL) QIRA_DEBUG("MMAP FAILED!\n");
|
||||
}
|
||||
|
||||
void init_QIRA(CPUArchState *env) {
|
||||
QIRA_DEBUG("init QIRA called\n");
|
||||
GLOBAL_CPUArchState = env;
|
||||
|
@ -478,43 +496,30 @@ void init_QIRA(CPUArchState *env) {
|
|||
GLOBAL_QIRA_did_init = 1;
|
||||
memset(GLOBAL_pending_changes, 0, (PENDING_CHANGES_MAX_ADDR/4) * sizeof(struct change));
|
||||
|
||||
if(ftruncate(GLOBAL_qira_log_fd, GLOBAL_change_size * sizeof(struct change))) {
|
||||
perror("ftruncate");
|
||||
}
|
||||
GLOBAL_change_buffer =
|
||||
mmap(NULL, GLOBAL_change_size * sizeof(struct change),
|
||||
PROT_READ | PROT_WRITE, MAP_SHARED, GLOBAL_qira_log_fd, 0);
|
||||
GLOBAL_change_count = (uint32_t*)GLOBAL_change_buffer;
|
||||
if (GLOBAL_change_buffer == NULL) QIRA_DEBUG("MMAP FAILED!\n");
|
||||
resize_change_buffer(GLOBAL_change_size * sizeof(struct change));
|
||||
memset(GLOBAL_change_buffer, 0, sizeof(struct change));
|
||||
GLOBAL_change_count[1] = 0xAAAAAAAA; // canary
|
||||
// first change is invalid
|
||||
++GLOBAL_change_buffer;
|
||||
*GLOBAL_change_count = 1;
|
||||
|
||||
// skip the first change
|
||||
GLOBAL_logstate->change_count = 1;
|
||||
pthread_mutex_init(&GLOBAL_logstate->lock, NULL);
|
||||
}
|
||||
|
||||
void add_change(target_ulong addr, uint64_t data, uint32_t flags) {
|
||||
if (*GLOBAL_change_count == GLOBAL_change_size) {
|
||||
pthread_mutex_lock(&GLOBAL_logstate->lock);
|
||||
if (GLOBAL_logstate->change_count == GLOBAL_change_size) {
|
||||
// double the buffer size
|
||||
QIRA_DEBUG("doubling buffer with size %d\n", GLOBAL_change_size);
|
||||
if(ftruncate(GLOBAL_qira_log_fd, GLOBAL_change_size * sizeof(struct change) * 2)) {
|
||||
perror("ftruncate");
|
||||
}
|
||||
GLOBAL_change_buffer =
|
||||
mmap(NULL, GLOBAL_change_size * sizeof(struct change) * 2,
|
||||
PROT_READ | PROT_WRITE, MAP_SHARED, GLOBAL_qira_log_fd, 0);
|
||||
GLOBAL_change_count = (uint32_t*)GLOBAL_change_buffer;
|
||||
if (GLOBAL_change_buffer == NULL) QIRA_DEBUG("MMAP FAILED!\n");
|
||||
GLOBAL_change_buffer += GLOBAL_change_size;
|
||||
resize_change_buffer(GLOBAL_change_size * sizeof(struct change) * 2);
|
||||
GLOBAL_change_size *= 2;
|
||||
}
|
||||
GLOBAL_change_buffer->address = (uint64_t)addr;
|
||||
GLOBAL_change_buffer->data = data;
|
||||
GLOBAL_change_buffer->changelist_number = GLOBAL_changelist_number;
|
||||
GLOBAL_change_buffer->flags = IS_VALID | flags;
|
||||
++GLOBAL_change_buffer;
|
||||
struct change *this_change = GLOBAL_change_buffer + GLOBAL_logstate->change_count;
|
||||
this_change->address = (uint64_t)addr;
|
||||
this_change->data = data;
|
||||
this_change->changelist_number = GLOBAL_logstate->changelist_number;
|
||||
this_change->flags = IS_VALID | flags;
|
||||
// must inc this afterward
|
||||
++(*GLOBAL_change_count);
|
||||
++GLOBAL_logstate->change_count;
|
||||
pthread_mutex_unlock(&GLOBAL_logstate->lock);
|
||||
}
|
||||
|
||||
void add_pending_change(target_ulong addr, uint64_t data, uint32_t flags) {
|
||||
|
@ -547,13 +552,13 @@ void track_store(target_ulong addr, uint64_t data, int size) {
|
|||
void track_read(target_ulong base, target_ulong offset, target_ulong data, int size) {
|
||||
if ((int)offset < 0) return;
|
||||
QIRA_DEBUG("read: %x+%x:%d = %x\n", base, offset, size, data);
|
||||
if (GLOBAL_is_filtered == 0) add_change(offset, data, size);
|
||||
if (GLOBAL_logstate->is_filtered == 0) add_change(offset, data, size);
|
||||
}
|
||||
|
||||
void track_write(target_ulong base, target_ulong offset, target_ulong data, int size) {
|
||||
if ((int)offset < 0) return;
|
||||
QIRA_DEBUG("write: %x+%x:%d = %x\n", base, offset, size, data);
|
||||
if (GLOBAL_is_filtered == 0) add_change(offset, data, IS_WRITE | size);
|
||||
if (GLOBAL_logstate->is_filtered == 0) add_change(offset, data, IS_WRITE | size);
|
||||
else add_pending_change(offset, data, IS_WRITE | size);
|
||||
}
|
||||
|
||||
|
@ -647,17 +652,17 @@ uintptr_t tcg_qemu_tb_exec(CPUArchState *env, uint8_t *tb_ptr)
|
|||
|
||||
// hacky check
|
||||
if (tb->pc > 0x40000000) {
|
||||
GLOBAL_is_filtered = 1;
|
||||
GLOBAL_logstate->is_filtered = 1;
|
||||
} else {
|
||||
if (GLOBAL_is_filtered == 1) {
|
||||
if (GLOBAL_logstate->is_filtered == 1) {
|
||||
commit_pending_changes();
|
||||
GLOBAL_is_filtered = 0;
|
||||
GLOBAL_logstate->is_filtered = 0;
|
||||
}
|
||||
GLOBAL_changelist_number++;
|
||||
GLOBAL_logstate->changelist_number++;
|
||||
add_change(tb->pc, tb->size, IS_START);
|
||||
}
|
||||
|
||||
QIRA_DEBUG("set changelist %d at %x(%d)\n", GLOBAL_changelist_number, tb->pc, tb->size);
|
||||
QIRA_DEBUG("set changelist %d at %x(%d)\n", *GLOBAL_changelist_number, tb->pc, tb->size);
|
||||
#endif
|
||||
|
||||
long tcg_temps[CPU_TEMP_BUF_NLONGS];
|
||||
|
|
10
qira
10
qira
|
@ -1,13 +1,14 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
BIN=$(realpath $1)
|
||||
|
||||
if [ -z $BIN ]; then
|
||||
if [ -z $1 ]; then
|
||||
echo "usage: $0 <target binary>"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
BIN=$(realpath $1)
|
||||
FILE=$(file $BIN)
|
||||
|
||||
ln -sf $BIN /tmp/qira_binary
|
||||
|
||||
# build qemu if we have the source
|
||||
|
@ -20,5 +21,8 @@ fi
|
|||
|
||||
# detect which qemu to run based on the file
|
||||
shift
|
||||
# TODO: use $FILE to detect which qira to call
|
||||
qira-i386 -singlestep /tmp/qira_binary $@
|
||||
#qira-arm -singlestep /tmp/qira_binary $@
|
||||
#qira-x86_64 -singlestep /tmp/qira_binary $@
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ Template.controls.events = {
|
|||
|
||||
// keyboard shortcuts
|
||||
window.onkeydown = function(e) {
|
||||
p(e.keyCode);
|
||||
//p(e.keyCode);
|
||||
if (e.keyCode == 38) {
|
||||
Session.set("clnum", Session.get("clnum")-1);
|
||||
} else if (e.keyCode == 40) {
|
||||
|
|
|
@ -26,17 +26,20 @@ Meteor.startup(function() {
|
|||
|
||||
function register_drag_zoom() {
|
||||
function get_clnum(e) {
|
||||
if (e.target !== $("#vtimeline")[0]) return undefined;
|
||||
var cview = Session.get("cview");
|
||||
if (cview === undefined) return undefined;
|
||||
if (e.target !== $("#vtimeline")[0] &&
|
||||
e.target !== $("#vtimelinebox")[0]) return undefined;
|
||||
var max = Session.get("max_clnum"); if (max === undefined) return;
|
||||
var cview = Session.get("cview"); if (cview === undefined) return;
|
||||
var cscale = get_cscale();
|
||||
if (cscale === undefined) return undefined;
|
||||
// fix for non full zoom
|
||||
var clnum = (e.offsetY * cscale) + cview[0];
|
||||
return Math.round(clnum);
|
||||
var clret = Math.round(clnum);
|
||||
if (clret > max) clret = max;
|
||||
return clret;
|
||||
}
|
||||
var down = -1;
|
||||
$("#vtimeline").mousedown(function(e) {
|
||||
$("#vtimelinebox").mousedown(function(e) {
|
||||
if (e.button == 1) { zoom_out_max(); }
|
||||
if (e.button != 0) return;
|
||||
var clnum = get_clnum(e);
|
||||
|
@ -44,7 +47,8 @@ function register_drag_zoom() {
|
|||
down = clnum;
|
||||
return false;
|
||||
});
|
||||
$("#vtimeline").mouseup(function(e) {
|
||||
$("#vtimelinebox").mouseup(function(e) {
|
||||
p("mouseup");
|
||||
if (e.button != 0) return;
|
||||
var up = get_clnum(e);
|
||||
if (up === undefined) return;
|
||||
|
|
Loading…
Reference in New Issue