static void handle_nvrm_ioctl_host_unmap(uint32_t fd, struct nvrm_ioctl_host_unmap *s) { if (s->status != NVRM_STATUS_SUCCESS) return; check_cid(s->cid); struct gpu_object *obj = gpu_object_find(s->cid, s->handle); if (!obj) { mmt_error("nvrm_ioctl_host_unmap: cannot find object 0x%08x 0x%08x\n", s->cid, s->handle); return; } struct cpu_mapping *cpu_mapping; for (cpu_mapping = obj->cpu_mappings; cpu_mapping != NULL; cpu_mapping = cpu_mapping->next) if (cpu_mapping->mmap_offset == (s->foffset & ~0xfffUL)) { cpu_mapping->mmap_offset = 0; disconnect_cpu_mapping_from_gpu_object(cpu_mapping); return; } // weird, host_unmap accepts cpu addresses in foffset field for (cpu_mapping = obj->cpu_mappings; cpu_mapping != NULL; cpu_mapping = cpu_mapping->next) if (cpu_mapping->cpu_addr == (s->foffset & ~0xfffUL)) { //mmt_error("host_unmap with cpu address as offset, wtf?%s\n", ""); cpu_mapping->mmap_offset = 0; disconnect_cpu_mapping_from_gpu_object(cpu_mapping); return; } mmt_error("can't find matching mapping%s\n", ""); demmt_abort(); }
void nvrm_munmap(uint32_t id, 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) if (cpu_mapping->cpu_addr == mmap_addr) { if (dump_sys_munmap) { 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, ""); } } disconnect_cpu_mapping_from_gpu_object(cpu_mapping); break; } if (dump_sys_munmap) mmt_log_cont_nl(); buffer_munmap(id); }
static void handle_nvrm_ioctl_host_unmap(uint32_t fd, struct nvrm_ioctl_host_unmap *s) { if (s->status != NVRM_STATUS_SUCCESS) return; check_cid(s->cid); struct gpu_object *obj = gpu_object_find(s->cid, s->handle); if (!obj) { mmt_error("nvrm_ioctl_host_unmap: cannot find object 0x%08x 0x%08x\n", s->cid, s->handle); return; } struct cpu_mapping *cpu_mapping; /* it seems, depending on blob version, foffset have different meaning :/ */ for (cpu_mapping = obj->cpu_mappings; cpu_mapping != NULL; cpu_mapping = cpu_mapping->next) if (cpu_mapping->map_id == s->foffset) { cpu_mapping->mmap_offset = -1; cpu_mapping->map_id = -1; disconnect_cpu_mapping_from_gpu_object(cpu_mapping); return; } for (cpu_mapping = obj->cpu_mappings; cpu_mapping != NULL; cpu_mapping = cpu_mapping->next) if (cpu_mapping->mmap_offset == (s->foffset & ~0xfffUL)) { cpu_mapping->mmap_offset = -1; cpu_mapping->map_id = -1; disconnect_cpu_mapping_from_gpu_object(cpu_mapping); return; } for (cpu_mapping = obj->cpu_mappings; cpu_mapping != NULL; cpu_mapping = cpu_mapping->next) if (cpu_mapping->cpu_addr == (s->foffset & ~0xfffUL)) { //mmt_error("host_unmap with cpu address as offset, wtf?%s\n", ""); cpu_mapping->mmap_offset = -1; cpu_mapping->map_id = -1; disconnect_cpu_mapping_from_gpu_object(cpu_mapping); return; } mmt_error("can't find matching mapping%s\n", ""); demmt_abort(); }