void demmt_nv_mmap2(struct mmt_nvidia_mmap2 *mm, void *state) { if (dump_sys_mmap) mmt_log("mmap: address: %p, length: 0x%08lx, id: %d, offset: 0x%08lx, data1: 0x%08lx, data2: 0x%08lx, fd: %d\n", (void *)mm->start, mm->len, mm->id, mm->offset, mm->data1, mm->data2, mm->fd); buffer_mmap(mm->id, mm->start, mm->len, mm->offset, &mm->data1, &mm->data2); }
void nvrm_mmap(uint32_t id, uint32_t fd, uint64_t mmap_addr, uint64_t len, uint64_t mmap_offset) { struct gpu_object *obj; struct cpu_mapping *cpu_mapping; for (obj = gpu_objects; obj != NULL; obj = obj->next) for (cpu_mapping = obj->cpu_mappings; cpu_mapping != NULL; cpu_mapping = cpu_mapping->next) //can't validate fd if (cpu_mapping->mmap_offset == mmap_offset) { cpu_mapping->cpu_addr = mmap_addr; cpu_mapping->id = id; set_cpu_mapping(id, cpu_mapping); if (dump_sys_mmap) { if (cpu_mapping->fdtype == FDNVIDIA) { mmt_log_cont(", cid: 0x%08x, handle: 0x%08x", obj->cid, obj->handle); describe_nvrm_object(obj->cid, obj->handle, ""); } mmt_log_cont_nl(); } return; } if (dump_sys_mmap) mmt_log_cont_nl(); if (demmt_get_fdtype(fd) == FDNVIDIA) mmt_error("nvrm_mmap: couldn't find object/space offset: 0x%016" PRIx64 "\n", mmap_offset); buffer_mmap(id, fd, mmap_addr, len, mmap_offset); }
void nvrm_mmap(uint32_t id, uint32_t fd, uint64_t mmap_addr, uint64_t len, uint64_t mmap_offset) { struct gpu_object *obj; struct cpu_mapping *cpu_mapping; for (obj = gpu_objects; obj != NULL; obj = obj->next) for (cpu_mapping = obj->cpu_mappings; cpu_mapping != NULL; cpu_mapping = cpu_mapping->next) //can't validate fd if (cpu_mapping->mmap_offset == mmap_offset) { cpu_mapping->cpu_addr = mmap_addr; uint32_t old_id = cpu_mapping->id; cpu_mapping->id = id; set_cpu_mapping(id, cpu_mapping); if (dump_sys_mmap) { if (cpu_mapping->fdtype == FDNVIDIA) { mmt_log_cont(", cid: 0x%08x, handle: 0x%08x", obj->cid, obj->handle); describe_nvrm_object(obj->cid, obj->handle, ""); } mmt_log_cont_nl(); } if (old_id) mmt_error("%d -> %d, mapping reuse, expect crash soon\n", old_id, id); /* * On newer blob, where mmap_offset is 0 for * all mappings (WTF?), clobber the value to * prevent the next nvrm_mmap from finding this * mapping. */ if (cpu_mapping->mmap_offset == 0) cpu_mapping->mmap_offset = -1; return; } if (dump_sys_mmap) mmt_log_cont_nl(); if (demmt_get_fdtype(fd) == FDNVIDIA) mmt_error("nvrm_mmap: couldn't find object/space offset: 0x%016" PRIx64 "\n", mmap_offset); buffer_mmap(id, fd, mmap_addr, len, mmap_offset); }
int cmd_check(int argc, char *argv[]) { struct buffer *comp_buf, *uncomp_buf; z_stream stream; struct stat st; int fd; setlocale(LC_ALL, ""); if (argc < 2) usage(); parse_args(argc, argv); init_stream(&stream); fd = open(filename, O_RDONLY); if (fd < 0) die("%s: %s: %s\n", program, filename, strerror(errno)); if (fstat(fd, &st) < 0) die("%s: %s: %s\n", program, filename, strerror(errno)); comp_buf = buffer_mmap(fd, st.st_size); if (!comp_buf) die("%s: %s\n", program, strerror(errno)); stream.next_in = (void *) buffer_start(comp_buf); uncomp_buf = buffer_new(BUFFER_SIZE); if (!uncomp_buf) die("%s: %s\n", program, strerror(errno)); for (;;) { struct itch41_message *msg; retry_size: if (buffer_size(uncomp_buf) < sizeof(u16)) { ssize_t nr; buffer_compact(uncomp_buf); nr = buffer_inflate(comp_buf, uncomp_buf, &stream); if (nr < 0) die("%s: zlib error\n", program); if (!nr) break; if (show_progress) print_progress(comp_buf, st.st_size); goto retry_size; } buffer_advance(uncomp_buf, sizeof(u16)); retry_message: msg = itch41_message_decode(uncomp_buf); if (!msg) { ssize_t nr; buffer_compact(uncomp_buf); nr = buffer_inflate(comp_buf, uncomp_buf, &stream); if (nr < 0) die("%s: zlib error\n", program); if (!nr) break; if (show_progress) print_progress(comp_buf, st.st_size); goto retry_message; } if (verbose) printf("%c", msg->MessageType); stats[msg->MessageType - 'A']++; } printf("\n"); buffer_munmap(comp_buf); buffer_delete(uncomp_buf); if (close(fd) < 0) die("%s: %s: %s\n", program, filename, strerror(errno)); release_stream(&stream); print_stats(); return 0; }