summaryrefslogtreecommitdiff
path: root/mmt/mmt_trace.c
diff options
context:
space:
mode:
Diffstat (limited to 'mmt/mmt_trace.c')
-rw-r--r--mmt/mmt_trace.c103
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;
+ }
+ }
+ }
+ }
+}
+
+