static void mmio_gphys_access (phys_t gphysaddr, bool wr, void *buf, uint len, u32 flags) { void *p; if (!len) return; p = mapmem_gphys (gphysaddr, len, (wr ? MAPMEM_WRITE : 0) | flags); ASSERT (p); if (wr) memcpy (p, buf, len); else memcpy (buf, p, len); unmapmem (p, len); }
static void handle_identify_command (struct nvme_host *host, struct nvme_comp *h_admin_comp, struct nvme_request *req) { struct nvme_cmd *cmd = &req->cmd.std; u8 tx_type = NVME_CMD_GET_TX_TYPE (cmd); if (tx_type != NVME_CMD_TX_TYPE_PRP || !NVME_CMD_PRP_PTR1 (cmd)) return; u16 controller_id = cmd->cmd_flags[0] >> 16; u8 cns = cmd->cmd_flags[0] & 0xFF; identify_default_filter (cmd->nsid, controller_id, cns, req->h_buf); if (host->io_interceptor && host->io_interceptor->filter_identify_data) { struct nvme_io_interceptor *io_interceptor; void *interceptor; io_interceptor = host->io_interceptor; interceptor = io_interceptor->interceptor; io_interceptor->filter_identify_data (interceptor, cmd->nsid, controller_id, cns, req->h_buf); } void *g_buf = mapmem_gphys (req->g_data_ptr.prp_entry.ptr1, host->page_nbytes, MAPMEM_WRITE); memcpy (g_buf, req->h_buf, host->page_nbytes); unmapmem (g_buf, host->page_nbytes); }
static int usb_match_buffers(const struct usb_hook_pattern *data, struct usb_buffer_list *buffers) { struct usb_buffer_list *be; size_t len; virt_t vadr; u64 target; int i; while (data) { /* look for a buffer chunk */ for (be = buffers; be; be = be->next) if ((data->pid == be->pid) && (data->offset <= be->offset)) break; if (!be) return -1; /* extract the target data */ len = be->offset + be->len - data->offset; if (len < sizeof(u64)) { u8 c[sizeof(u64)]; /* the target may be placed accoss buffer boundary */ /* former */ len = be->offset + be->len - data->offset; vadr = (virt_t)mapmem_gphys(be->padr, be->len, 0); ASSERT(vadr); for (i=len; i > 0; i--) c[i-1] = *(u8 *)(vadr + data->offset - be->offset + i); unmapmem((void *)vadr, be->len); /* latter */ be = be->next; if (!be || (be->pid != data->pid)) return -1; vadr = (virt_t)mapmem_gphys(be->padr, be->len, 0); ASSERT(vadr); for (i = len; i < sizeof(u64); i++) c[i] = *(u8 *)(vadr + data->offset - be->offset + i); unmapmem((void *)vadr, be->len); target = *(u64 *)c; } else { /* */ vadr = (virt_t)mapmem_gphys(be->padr, be->len, 0); ASSERT(vadr); target = *(u64 *)(vadr + data->offset); unmapmem((void *)vadr, be->len); } /* match the pattern */ target &= data->mask; if (target != data->pattern) return -1; data = data->next; } /* exactly matched */ return 0; }