[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1 5/7] tools/libxc: add xc_ptbuf_* functions
Add functions in libxc that use the new HVMOP_vmtrace interface. Signed-off-by: Michal Leszczynski <michal.leszczynski@xxxxxxx> --- tools/libxc/include/xenctrl.h | 59 +++++++++++++++++++ tools/libxc/xc_tbuf.c | 108 ++++++++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 113ddd935d..0a972deb7d 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -1585,6 +1585,65 @@ int xc_tbuf_set_cpu_mask(xc_interface *xch, xc_cpumap_t mask); int xc_tbuf_set_evt_mask(xc_interface *xch, uint32_t mask); +/** + * Enable Intel Processor Trace for given vCPU in given DomU. + * Allocate the trace ringbuffer with given size. + * + * @parm xch a handle to an open hypervisor interface + * @parm domid domain identifier + * @parm vcpu vcpu identifier + * @parm size trace buffer size in bytes, must be power of 2, between 4 kB and 4 GB + * @return 0 on success, -1 on failure + */ +int xc_ptbuf_enable(xc_interface *xch, uint32_t domid, uint32_t vcpu, uint64_t size); + +/** + * Disable Intel Processor Trace for given vCPU in given DomU. + * Deallocate the trace ringbuffer. + * + * @parm xch a handle to an open hypervisor interface + * @parm domid domain identifier + * @parm vcpu vcpu identifier + * @return 0 on success, -1 on failure + */ +int xc_ptbuf_disable(xc_interface *xch, uint32_t domid, uint32_t vcpu); + +/** + * Map the trace buffer into Dom0. + * + * @parm xch a handle to an open hypervisor interface + * @parm domid domain identifier + * @parm vcpu vcpu identifier + * @parm buf pointer to the mapped buffer will be written there + * @parm trace buffer size (in bytes) will be written there + * @return 0 on success, -1 on failure + */ +int xc_ptbuf_map(xc_interface *xch, uint32_t domid, uint32_t vcpu, uint8_t **buf, uint64_t *size); + +/** + * Unmap the trace buffer from Dom0. + * + * @parm xch a handle to an open hypervisor interface + * @parm buf pointer to the mapped buffer + * @parm size of the trace buffer (in bytes) + * @return 0 on success, -1 on failure + */ +int xc_ptbuf_unmap(xc_interface *xch, uint8_t *buf, uint64_t size); + +/** + * Get current offset inside the trace ringbuffer. + * This allows to determine how much data was written into the buffer. + * Once buffer overflows, the offset will reset to 0 and the previous + * data will be overriden. + * + * @parm xch a handle to an open hypervisor interface + * @parm domid domain identifier + * @parm vcpu vcpu identifier + * @parm offset current offset inside trace buffer will be written there + * @return 0 on success, -1 on failure + */ +int xc_ptbuf_get_offset(xc_interface *xch, uint32_t domid, uint32_t vcpu, uint64_t *offset); + int xc_domctl(xc_interface *xch, struct xen_domctl *domctl); int xc_sysctl(xc_interface *xch, struct xen_sysctl *sysctl); diff --git a/tools/libxc/xc_tbuf.c b/tools/libxc/xc_tbuf.c index 283fbd1c8f..8fab7f7d79 100644 --- a/tools/libxc/xc_tbuf.c +++ b/tools/libxc/xc_tbuf.c @@ -79,6 +79,114 @@ int xc_tbuf_get_size(xc_interface *xch, unsigned long *size) return rc; } +int xc_ptbuf_enable(xc_interface *xch, uint32_t domid, uint32_t vcpu, uint64_t size) +{ + DECLARE_HYPERCALL_BUFFER(xen_hvm_vmtrace_op_t, arg); + int rc = -1; + + arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg)); + if ( arg == NULL ) + return -1; + + arg->version = HVMOP_VMTRACE_INTERFACE_VERSION; + arg->cmd = HVMOP_vmtrace_ipt_enable; + arg->domain = domid; + arg->vcpu = vcpu; + arg->size = size; + + rc = xencall2(xch->xcall, __HYPERVISOR_hvm_op, HVMOP_vmtrace, + HYPERCALL_BUFFER_AS_ARG(arg)); + + xc_hypercall_buffer_free(xch, arg); + return rc; +} + +int xc_ptbuf_get_offset(xc_interface *xch, uint32_t domid, uint32_t vcpu, uint64_t *offset) +{ + DECLARE_HYPERCALL_BUFFER(xen_hvm_vmtrace_op_t, arg); + int rc = -1; + + arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg)); + if ( arg == NULL ) + return -1; + + arg->version = HVMOP_VMTRACE_INTERFACE_VERSION; + arg->cmd = HVMOP_vmtrace_ipt_get_offset; + arg->domain = domid; + arg->vcpu = vcpu; + + rc = xencall2(xch->xcall, __HYPERVISOR_hvm_op, HVMOP_vmtrace, + HYPERCALL_BUFFER_AS_ARG(arg)); + + if ( rc == 0 ) + { + *offset = arg->offset; + } + + xc_hypercall_buffer_free(xch, arg); + return rc; +} + +int xc_ptbuf_map(xc_interface *xch, uint32_t domid, uint32_t vcpu, uint8_t **buf, uint64_t *size) +{ + DECLARE_HYPERCALL_BUFFER(xen_hvm_vmtrace_op_t, arg); + int rc = -1; + uint8_t *mapped_buf; + + arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg)); + if ( arg == NULL ) + return -1; + + arg->version = HVMOP_VMTRACE_INTERFACE_VERSION; + arg->cmd = HVMOP_vmtrace_ipt_get_buf; + arg->domain = domid; + arg->vcpu = vcpu; + + rc = xencall2(xch->xcall, __HYPERVISOR_hvm_op, HVMOP_vmtrace, + HYPERCALL_BUFFER_AS_ARG(arg)); + + if ( rc == 0 ) + { + mapped_buf = (uint8_t *)xc_map_foreign_range(xch, DOMID_XEN, arg->size, PROT_READ, arg->mfn); + + if ( mapped_buf == NULL ) + return -1; + + *buf = mapped_buf; + *size = arg->size; + } + + xc_hypercall_buffer_free(xch, arg); + return rc; +} + +int xc_ptbuf_unmap(xc_interface *xch, uint8_t *buf, uint64_t size) +{ + xenforeignmemory_unmap(xch->fmem, buf, size >> PAGE_SHIFT); + return 0; +} + +int xc_ptbuf_disable(xc_interface *xch, uint32_t domid, uint32_t vcpu) +{ + DECLARE_HYPERCALL_BUFFER(xen_hvm_vmtrace_op_t, arg); + int rc = -1; + + arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg)); + if ( arg == NULL ) + return -1; + + arg->version = HVMOP_VMTRACE_INTERFACE_VERSION; + arg->cmd = HVMOP_vmtrace_ipt_disable; + arg->domain = domid; + arg->vcpu = vcpu; + + rc = xencall2(xch->xcall, __HYPERVISOR_hvm_op, HVMOP_vmtrace, + HYPERCALL_BUFFER_AS_ARG(arg)); + + xc_hypercall_buffer_free(xch, arg); + return rc; +} + int xc_tbuf_enable(xc_interface *xch, unsigned long pages, unsigned long *mfn, unsigned long *size) { -- 2.20.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |