diff -ur /home/vince/qemu/qemu-snapshot-2007-08-14_05/target-mips/helper.c qemu-snapshot-2007-08-14_05-dinero/target-mips/helper.c --- /home/vince/qemu/qemu-snapshot-2007-08-14_05/target-mips/helper.c 2007-06-25 13:34:33.000000000 -0400 +++ qemu-snapshot-2007-08-14_05-dinero/target-mips/helper.c 2007-08-16 12:50:08.000000000 -0400 @@ -36,6 +36,47 @@ TLBRET_MATCH = 0 }; + +FILE *memfile=NULL; +unsigned char memfile_buf[4096]; + +void helper_dump_pc(unsigned long address) { + + if (memfile==NULL) { + memfile=fopen("trace.mem","w"); + /* 1 = _IOLBF */ + setvbuf(memfile, memfile_buf, 1 , sizeof(memfile_buf)); + } + + fprintf(memfile,"i %x 4\n",address); + fflush(memfile); + +} + + +/* generates trace file for dinero cache simulator */ +/* dinero output is */ +/* X YYYYYYY Z */ +/* where X is type, Y is address, Z is type */ +/* types are r=read w=write, some others */ + +void helper_dump_memtrace(unsigned long address, + int load,int size) { + + if (memfile==NULL) { + memfile=fopen("trace.mem","w"); + /* 1 = _IOLBF */ + setvbuf(memfile, memfile_buf, 1 , sizeof(memfile_buf)); + } + + fprintf(memfile,"%c %x %d\n", + load==1?'r':'w',address,size); + fflush(memfile); + +} + + + /* no MMU emulation */ int no_mmu_map_address (CPUState *env, target_ulong *physical, int *prot, target_ulong address, int rw, int access_type) diff -ur /home/vince/qemu/qemu-snapshot-2007-08-14_05/target-mips/op.c qemu-snapshot-2007-08-14_05-dinero/target-mips/op.c --- /home/vince/qemu/qemu-snapshot-2007-08-14_05/target-mips/op.c 2007-06-25 13:34:33.000000000 -0400 +++ qemu-snapshot-2007-08-14_05-dinero/target-mips/op.c 2007-08-16 13:24:59.000000000 -0400 @@ -246,6 +246,10 @@ #include "fop_template.c" #undef FTN +void op_dump_pc(void) { + helper_dump_pc(PARAM1); +} + void op_dup_T0 (void) { T2 = T0; diff -ur /home/vince/qemu/qemu-snapshot-2007-08-14_05/target-mips/op_mem.c qemu-snapshot-2007-08-14_05-dinero/target-mips/op_mem.c --- /home/vince/qemu/qemu-snapshot-2007-08-14_05/target-mips/op_mem.c 2007-05-28 13:09:41.000000000 -0400 +++ qemu-snapshot-2007-08-14_05-dinero/target-mips/op_mem.c 2007-08-14 15:44:38.000000000 -0400 @@ -21,55 +21,64 @@ /* Standard loads and stores */ void glue(op_lb, MEMSUFFIX) (void) { + helper_dump_memtrace(T0,1,1); T0 = glue(ldsb, MEMSUFFIX)(T0); RETURN(); } void glue(op_lbu, MEMSUFFIX) (void) { + helper_dump_memtrace(T0,1,1); T0 = glue(ldub, MEMSUFFIX)(T0); RETURN(); } void glue(op_sb, MEMSUFFIX) (void) { + helper_dump_memtrace(T0,0,1); glue(stb, MEMSUFFIX)(T0, T1); RETURN(); } void glue(op_lh, MEMSUFFIX) (void) { - T0 = glue(ldsw, MEMSUFFIX)(T0); + helper_dump_memtrace(T0,1,2); + T0 = glue(ldsw, MEMSUFFIX)(T0); RETURN(); } void glue(op_lhu, MEMSUFFIX) (void) { - T0 = glue(lduw, MEMSUFFIX)(T0); + helper_dump_memtrace(T0,1,2); + T0 = glue(lduw, MEMSUFFIX)(T0); RETURN(); } void glue(op_sh, MEMSUFFIX) (void) { - glue(stw, MEMSUFFIX)(T0, T1); + helper_dump_memtrace(T0,0,2); + glue(stw, MEMSUFFIX)(T0, T1); RETURN(); } void glue(op_lw, MEMSUFFIX) (void) { - T0 = glue(ldl, MEMSUFFIX)(T0); + helper_dump_memtrace(T0,1,4); + T0 = glue(ldl, MEMSUFFIX)(T0); RETURN(); } void glue(op_lwu, MEMSUFFIX) (void) { - T0 = (uint32_t)glue(ldl, MEMSUFFIX)(T0); + helper_dump_memtrace(T0,1,4); + T0 = (uint32_t)glue(ldl, MEMSUFFIX)(T0); RETURN(); } void glue(op_sw, MEMSUFFIX) (void) { - glue(stl, MEMSUFFIX)(T0, T1); + helper_dump_memtrace(T0,0,4); + glue(stl, MEMSUFFIX)(T0, T1); RETURN(); } @@ -78,20 +87,25 @@ /* XXX: This is broken, CP0_BADVADDR has the wrong (aligned) value. */ void glue(op_lwl, MEMSUFFIX) (void) { + helper_dump_memtrace(T0,1,4); uint32_t tmp = glue(ldl, MEMSUFFIX)(T0 & ~3); CALL_FROM_TB1(glue(do_lwl, MEMSUFFIX), tmp); + RETURN(); } void glue(op_lwr, MEMSUFFIX) (void) { + helper_dump_memtrace(T0,1,4); uint32_t tmp = glue(ldl, MEMSUFFIX)(T0 & ~3); CALL_FROM_TB1(glue(do_lwr, MEMSUFFIX), tmp); + RETURN(); } void glue(op_swl, MEMSUFFIX) (void) { + helper_dump_memtrace(T0,0,4); uint32_t tmp = glue(ldl, MEMSUFFIX)(T0 & ~3); tmp = CALL_FROM_TB1(glue(do_swl, MEMSUFFIX), tmp); glue(stl, MEMSUFFIX)(T0 & ~3, tmp); @@ -100,6 +114,7 @@ void glue(op_swr, MEMSUFFIX) (void) { + helper_dump_memtrace(T0,0,4); uint32_t tmp = glue(ldl, MEMSUFFIX)(T0 & ~3); tmp = CALL_FROM_TB1(glue(do_swr, MEMSUFFIX), tmp); glue(stl, MEMSUFFIX)(T0 & ~3, tmp); @@ -108,6 +123,7 @@ void glue(op_ll, MEMSUFFIX) (void) { + helper_dump_memtrace(T0,1,4); T1 = T0; T0 = glue(ldl, MEMSUFFIX)(T0); env->CP0_LLAddr = T1; @@ -133,12 +149,14 @@ #ifdef TARGET_MIPS64 void glue(op_ld, MEMSUFFIX) (void) { + helper_dump_memtrace(T0,1,8); T0 = glue(ldq, MEMSUFFIX)(T0); RETURN(); } void glue(op_sd, MEMSUFFIX) (void) { + helper_dump_memtrace(T0,0,8); glue(stq, MEMSUFFIX)(T0, T1); RETURN(); } diff -ur /home/vince/qemu/qemu-snapshot-2007-08-14_05/target-mips/translate.c qemu-snapshot-2007-08-14_05-dinero/target-mips/translate.c --- /home/vince/qemu/qemu-snapshot-2007-08-14_05/target-mips/translate.c 2007-06-26 16:26:03.000000000 -0400 +++ qemu-snapshot-2007-08-14_05-dinero/target-mips/translate.c 2007-08-15 17:24:47.000000000 -0400 @@ -5969,6 +5969,7 @@ gen_opc_hflags[lj] = ctx.hflags & MIPS_HFLAG_BMASK; gen_opc_instr_start[lj] = 1; } + gen_op_dump_pc(ctx.pc); ctx.opcode = ldl_code(ctx.pc); decode_opc(env, &ctx); ctx.pc += 4;