break;
}
+ case HVMOP_xentrace: {
+ xen_hvm_xentrace_t tr;
+
+ if ( copy_from_guest(&tr, arg, 1 ) )
+ return -EFAULT;
+
+ if ( tr.extra_bytes > sizeof(tr.extra)
+ || (tr.event & ~((1u<<TRC_SUBCLS_SHIFT)-1)) )
+ return -EINVAL;
+
+ /* Cycles will be taken at the vmexit and vmenter */
+ trace_var(tr.event | TRC_GUEST, 0 /*!cycles*/,
+ tr.extra_bytes,
+ (unsigned char *)tr.extra);
+ break;
+ }
+
default:
{
gdprintk(XENLOG_WARNING, "Bad HVM op %ld.\n", op);
#define __XEN_PUBLIC_HVM_HVM_OP_H__
#include "../xen.h"
+#include "../trace.h"
/* Get/set subcommands: extra argument == pointer to xen_hvm_param struct. */
#define HVMOP_set_param 0
typedef struct xen_hvm_get_time xen_hvm_get_time_t;
DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_time_t);
+#define HVMOP_xentrace 11
+struct xen_hvm_xentrace {
+ uint16_t event, extra_bytes;
+ uint8_t extra[TRACE_EXTRA_MAX * sizeof(uint32_t)];
+};
+typedef struct xen_hvm_xentrace xen_hvm_xentrace_t;
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_xentrace_t);
+
#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */
#endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */
#define TRC_PV 0x0020f000 /* Xen PV traces */
#define TRC_SHADOW 0x0040f000 /* Xen shadow tracing */
#define TRC_PM 0x0080f000 /* Xen power management trace */
+#define TRC_GUEST 0x0800f000 /* Guest-generated traces */
#define TRC_ALL 0x0ffff000
#define TRC_HD_TO_EVENT(x) ((x)&0x0fffffff)
#define TRC_HD_CYCLE_FLAG (1UL<<31)