diff options
Diffstat (limited to 'mmt/mmt_trace.c')
-rw-r--r-- | mmt/mmt_trace.c | 103 |
1 files changed, 91 insertions, 12 deletions
diff --git a/mmt/mmt_trace.c b/mmt/mmt_trace.c index e083064d..ec821b51 100644 --- a/mmt/mmt_trace.c +++ b/mmt/mmt_trace.c @@ -22,8 +22,7 @@ */ #include "mmt_trace.h" -#include "mmt_nv_ioctl.h" -#include "mmt_nouveau_ioctl.h" +#include "mmt_fgl_ioctl.h" #include "pub_tool_libcbase.h" #include "pub_tool_libcprint.h" @@ -31,6 +30,8 @@ #include "pub_tool_debuginfo.h" #include "pub_tool_libcassert.h" +#include <stdint.h> + #define MMT_PRINT_DATA static struct mmt_mmap_data mmt_mmaps[MMT_MAX_REGIONS]; @@ -400,6 +401,23 @@ struct mmt_mmap_data *mmt_find_region_by_fd_offset(int fd, Off64T offset) return fd0_region; } + +struct mmt_mmap_data *mmt_find_region_by_fd_addr(Addr addr) +{ + int i; + struct mmt_mmap_data *fd0_region = NULL; + + for (i = 0; i <= mmt_last_region; ++i) + { + struct mmt_mmap_data *region = &mmt_mmaps[i]; + if (addr >= region->start && addr < region->end) { + return region; + } + } + + return fd0_region; +} + struct mmt_mmap_data *mmt_find_region_by_fdset_offset(fd_set *fds, Off64T offset) { int i; @@ -672,6 +690,8 @@ static void mydescribe(Addr inst_addr, char *namestr, int len) region->id, (unsigned int)(addr - region->start), __VA_ARGS__) #endif +#if 0 /* STORE */ + VG_REGPARM(2) void mmt_trace_store_1(Addr addr, UWord value) { @@ -870,6 +890,12 @@ void mmt_trace_store_4_4_4_4_ia(Addr addr, UWord value1, UWord value2, } #endif +#endif /* STORE */ + + + + + VG_REGPARM(2) void mmt_trace_load_1(Addr addr, UWord value) { @@ -1072,8 +1098,7 @@ void mmt_pre_syscall(ThreadId tid, UInt syscallno, UWord *args, UInt nArgs) { if (syscallno == __NR_ioctl) { - mmt_nv_ioctl_pre(args); - mmt_nouveau_ioctl_pre(args); + mmt_fgl_ioctl_pre(args); } } @@ -1105,8 +1130,7 @@ static void post_open(ThreadId tid, UWord *args, UInt nArgs, SysRes res) } } - mmt_nv_ioctl_post_open(args, res); - mmt_nouveau_ioctl_post_open(args, res); + mmt_fgl_ioctl_post_open(args, res); } static void post_close(ThreadId tid, UWord *args, UInt nArgs, SysRes res) @@ -1124,8 +1148,7 @@ static void post_close(ThreadId tid, UWord *args, UInt nArgs, SysRes res) } } - mmt_nv_ioctl_post_close(args); - mmt_nouveau_ioctl_post_close(args); + mmt_fgl_ioctl_post_close(args); } static void post_mmap(ThreadId tid, UWord *args, UInt nArgs, SysRes res, int offset_unit) @@ -1139,11 +1162,13 @@ static void post_mmap(ThreadId tid, UWord *args, UInt nArgs, SysRes res, int off int i; struct mmt_mmap_data *region; + start = res._val; if (res._isError || (int)fd == -1) return; - start = res._val; +//VG_(message)(Vg_DebugMsg, "untracked mmap at %p fd:%ld len: 0x%08lx, offset: 0x%llx\n", (void *)start, fd, len, offset); +#if 1 if (!mmt_trace_all_files) { for(i = 0; i < MMT_MAX_TRACE_FILES; ++i) @@ -1158,7 +1183,7 @@ static void post_mmap(ThreadId tid, UWord *args, UInt nArgs, SysRes res, int off } } - if (mmt_nv_ioctl_post_mmap(args, res, offset_unit)) + if (mmt_fgl_ioctl_post_mmap(args, res, offset_unit)) return; region = mmt_add_region(fd, start, start + len, offset * offset_unit, 0, 0, 0); @@ -1166,6 +1191,7 @@ static void post_mmap(ThreadId tid, UWord *args, UInt nArgs, SysRes res, int off VG_(message) (Vg_DebugMsg, "got new mmap at %p, len: 0x%08lx, offset: 0x%llx, serial: %d\n", (void *)region->start, len, region->offset, region->id); +#endif } static void post_munmap(ThreadId tid, UWord *args, UInt nArgs, SysRes res) @@ -1182,10 +1208,12 @@ static void post_munmap(ThreadId tid, UWord *args, UInt nArgs, SysRes res) if (!region) return; +#if 0 VG_(message) (Vg_DebugMsg, "removed mmap 0x%lx:0x%lx for: %p, len: 0x%08lx, offset: 0x%llx, serial: %d\n", region->data1, region->data2, (void *)region->start, region->end - region->start, region->offset, region->id); +#endif mmt_free_region(region); } @@ -1223,8 +1251,7 @@ void mmt_post_syscall(ThreadId tid, UInt syscallno, UWord *args, { if (syscallno == __NR_ioctl) { - mmt_nv_ioctl_post(args); - mmt_nouveau_ioctl_post(args); + mmt_fgl_ioctl_post(args); } else if (syscallno == __NR_open) post_open(tid, args, nArgs, res); @@ -1241,3 +1268,55 @@ void mmt_post_syscall(ThreadId tid, UInt syscallno, UWord *args, else if (syscallno == __NR_mremap) post_mremap(tid, args, nArgs, res); } + +void mmt_fgl_clear_region(int fd) +{ + struct mmt_mmap_data *fd0_region = NULL; + int i; + + for (i = 0; i <= mmt_last_region; ++i) { + struct mmt_mmap_data *region = &mmt_mmaps[i]; + + if (region->fd == fd && region->data1) { + mmt_free_region(region); + } + } +} + +void mmt_fgl_scan_region(int fd) +{ + struct mmt_mmap_data *region = NULL; + unsigned i, j, k; + + for (i = 0; i <= mmt_last_region; ++i) { + struct mmt_mmap_data *region = &mmt_mmaps[i]; + if (region->fd == fd && region->data1) { + uint32_t *ptr = region->start; + unsigned size = (region->end - region->start) / 4; + for (j = 0; j < size; j++) { + if (ptr[j] == 0xc0004600) { + /* looks like cmd buffer */ +#if 1 + VG_(message)(Vg_DebugMsg, "ib: ---------------------------------------------------------\n"); + for (k = 0; k < 16; k++) { + VG_(message)(Vg_DebugMsg, "IB [0x%016llx 0x%08llx [0x%08x 0x%08x]] 0x%08x\n", + &ptr[j + k - 325], region->offset + (j + k - 325) * 4, + region->offset, region->offset + size * 4, + ptr[j + k - 325]); + } + VG_(message)(Vg_DebugMsg, "[...]\n"); +#endif + for (k = 0; k < 16; k++) { + VG_(message)(Vg_DebugMsg, "IB [0x%016llx 0x%08llx [0x%08x 0x%08x]] 0x%08x\n", + &ptr[j + k], region->offset + (j + k) * 4, + region->offset, region->offset + size * 4, + ptr[j + k]); + } + break; + } + } + } + } +} + + |