thread safer, started multiarch support, ditch mongo?

This commit is contained in:
George Hotz 2014-07-05 10:44:08 -07:00
parent 17d1d3b529
commit d362411208
9 changed files with 72 additions and 53 deletions

View File

@ -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

View File

@ -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(

1
qemu/qira-arm Symbolic link
View File

@ -0,0 +1 @@
qemu-latest/arm-linux-user/qemu-arm

1
qemu/qira-x86_64 Symbolic link
View File

@ -0,0 +1 @@
qemu-latest/x86_64-linux-user/qemu-x86_64

View File

@ -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

View File

@ -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
View File

@ -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 $@

View File

@ -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) {

View File

@ -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;