예제 #1
0
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);
}
예제 #2
0
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);
}
예제 #3
0
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;
}