h->init = 1;
- if(opt.svm_mode) {
- h->exit_reason_max = HVM_SVM_EXIT_REASON_MAX;
- h->exit_reason_name = hvm_svm_exit_reason_name;
- } else {
- h->exit_reason_max = HVM_VMX_EXIT_REASON_MAX;
- h->exit_reason_name = hvm_vmx_exit_reason_name;
- }
-
if(opt.histogram_interrupt_eip) {
int count = ((1ULL<<ADDR_SPACE_BITS)/opt.histogram_interrupt_increment);
size_t size = count * sizeof(int);
h->summary.guest_interrupt[i].count=0;
}
+void set_hvm_exit_reason_data(struct hvm_data *h, unsigned event) {
+ if (((event & ~TRC_64_FLAG) == TRC_HVM_SVM_EXIT) ||
+ opt.svm_mode) {
+ opt.svm_mode = 1;
+ h->exit_reason_max = HVM_SVM_EXIT_REASON_MAX;
+ h->exit_reason_name = hvm_svm_exit_reason_name;
+ } else {
+ h->exit_reason_max = HVM_VMX_EXIT_REASON_MAX;
+ h->exit_reason_name = hvm_vmx_exit_reason_name;
+ }
+}
+
/* PV data */
enum {
PV_HYPERCALL=1,
r = (typeof(r))ri->d;
- if(!h->init)
- init_hvm_data(h, v);
+ if(!h->exit_reason_name)
+ set_hvm_exit_reason_data(h, ri->event);
h->vmexit_valid=1;
bzero(&h->inflight, sizeof(h->inflight));
- if(ri->event == TRC_HVM_VMEXIT64) {
+ if(ri->event & TRC_64_FLAG) {
if(v->guest_paging_levels != 4)
{
if ( verbosity >= 6 )
break;
default:
switch(ri->event) {
- case TRC_HVM_VMEXIT:
- case TRC_HVM_VMEXIT64:
+ case TRC_HVM_VMX_EXIT:
+ case TRC_HVM_VMX_EXIT64:
+ case TRC_HVM_SVM_EXIT:
+ case TRC_HVM_SVM_EXIT64:
UPDATE_VOLUME(p, hvm[HVM_VOL_VMEXIT], ri->size);
hvm_vmexit_process(ri, h, v);
break;
.arg = "HZ",
.doc = "Cpu speed of the tracing host, used to convert tsc into seconds.", },
- { .name = "svm-mode",
- .key = OPT_SVM_MODE,
- .group = OPT_GROUP_HARDWARE,
- .doc = "Assume AMD SVM-style vmexit error codes. (Default is Intel VMX.)", },
-
{ .name = "progress",
.key = OPT_PROGRESS,
.doc = "Progress dialog. Requires the zenity (GTK+) executable.", },
exit_reason = vmcb->exitcode;
if ( hvm_long_mode_active(v) )
- TRACE_TIME(TRC_HVM_VMEXIT64 | (vcpu_guestmode ? TRC_HVM_NESTEDFLAG : 0),
+ TRACE_TIME(TRC_HVM_SVM_EXIT64 | (vcpu_guestmode ? TRC_HVM_NESTEDFLAG : 0),
exit_reason, regs->rip, regs->rip >> 32);
else
- TRACE_TIME(TRC_HVM_VMEXIT | (vcpu_guestmode ? TRC_HVM_NESTEDFLAG : 0),
+ TRACE_TIME(TRC_HVM_SVM_EXIT | (vcpu_guestmode ? TRC_HVM_NESTEDFLAG : 0),
exit_reason, regs->eip);
if ( vcpu_guestmode )
__vmread(VM_EXIT_REASON, &exit_reason);
if ( hvm_long_mode_active(v) )
- TRACE_TIME(TRC_HVM_VMEXIT64, exit_reason, regs->rip, regs->rip >> 32);
+ TRACE_TIME(TRC_HVM_VMX_EXIT64, exit_reason, regs->rip, regs->rip >> 32);
else
- TRACE_TIME(TRC_HVM_VMEXIT, exit_reason, regs->eip);
+ TRACE_TIME(TRC_HVM_VMX_EXIT, exit_reason, regs->eip);
perfc_incra(vmexits, (uint16_t)exit_reason);
/* trace events per subclass */
#define TRC_HVM_NESTEDFLAG (0x400)
#define TRC_HVM_VMENTRY (TRC_HVM_ENTRYEXIT + 0x01)
-#define TRC_HVM_VMEXIT (TRC_HVM_ENTRYEXIT + 0x02)
-#define TRC_HVM_VMEXIT64 (TRC_HVM_ENTRYEXIT + TRC_64_FLAG + 0x02)
+#define TRC_HVM_VMX_EXIT (TRC_HVM_ENTRYEXIT + 0x02)
+#define TRC_HVM_VMX_EXIT64 (TRC_HVM_ENTRYEXIT + TRC_64_FLAG + 0x02)
+#define TRC_HVM_SVM_EXIT (TRC_HVM_ENTRYEXIT + 0x03)
+#define TRC_HVM_SVM_EXIT64 (TRC_HVM_ENTRYEXIT + TRC_64_FLAG + 0x03)
#define TRC_HVM_PF_XEN (TRC_HVM_HANDLER + 0x01)
#define TRC_HVM_PF_XEN64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x01)
#define TRC_HVM_PF_INJECT (TRC_HVM_HANDLER + 0x02)