File xen.xenalyze-hvm_emul.patch of Package xen

From: Olaf Hering <olaf@aepfle.de>
Date: Sun, 28 May 2023 20:33:21 +0000
Subject: xenalyze hvm_emul

Signed-off-by: Olaf Hering <olaf@aepfle.de>
---
 tools/xentrace/xenalyze.c | 152 +++++++++
 1 file changed, 152 insertions(+)

--- a/tools/xentrace/xenalyze.c
+++ b/tools/xentrace/xenalyze.c
@@ -5309,24 +5309,156 @@ void hvm_vmentry_process(struct record_info *ri, struct hvm_data *h) {
     }
 
     if(opt.dump_all) {
         unsigned long long arc_cycles = ri->tsc - h->exit_tsc;
         printf("]%s vmentry cycles %lld %s\n",
                ri->dump_header, arc_cycles, (arc_cycles>10000)?"!":"");
     }
 
     hvm_close_vmexit(h, ri->tsc);
     h->entry_tsc = ri->tsc;
 }
 
+static void hvm_emul_process(struct record_info *ri)
+{
+    switch(ri->event) {
+    case TRC_HVM_EMUL_HPET_START_TIMER:
+        {
+        struct {
+            unsigned int tn, irq;
+            unsigned long long delta, period;
+        } *r = (typeof(r))ri->d;
+        printf(" %s hpet create [ tn = %u, irq = %u, delta = 0x%016llx, period = 0x%016llx ]\n",
+               ri->dump_header, r->tn, r->irq, r->delta, r->period);
+        break;
+        }
+    case TRC_HVM_EMUL_PIT_START_TIMER:
+        {
+        struct {
+            int delta, period;
+        } *r = (typeof(r))ri->d;
+        printf(" %s pit create [ delta = 0x%08x, period = 0x%08x ]\n",
+               ri->dump_header, r->delta, r->period);
+        break;
+        }
+    case TRC_HVM_EMUL_RTC_START_TIMER:
+        {
+        struct {
+            int delta, period;
+        } *r = (typeof(r))ri->d;
+        printf(" %s rtc create [ delta = 0x%08x, period = 0x%08x ]\n",
+               ri->dump_header, r->delta, r->period);
+        break;
+        }
+    case TRC_HVM_EMUL_LAPIC_START_TIMER:
+        {
+        struct {
+            unsigned long long delta, period;
+            unsigned int irq;
+        } *r = (typeof(r))ri->d;
+        printf(" %s vlapic create [ delta = 0x%016llx , period = 0x%016llx, irq = %u ]\n",
+               ri->dump_header, r->delta, r->period, r->irq);
+        break;
+        }
+    case TRC_HVM_EMUL_HPET_STOP_TIMER:
+        {
+        struct {
+            unsigned int tn;
+        } *r = (typeof(r))ri->d;
+        printf(" %s hpet destroy [ tn = %u ]\n", ri->dump_header, r->tn);
+        break;
+        }
+    case TRC_HVM_EMUL_PIT_STOP_TIMER:
+        printf(" %s pit destroy\n", ri->dump_header);
+        break;
+    case TRC_HVM_EMUL_RTC_STOP_TIMER:
+        printf(" %s rtc destroy\n", ri->dump_header);
+        break;
+    case TRC_HVM_EMUL_LAPIC_STOP_TIMER:
+        printf(" %s vlapic destroy\n", ri->dump_header);
+        break;
+    case TRC_HVM_EMUL_PIT_TIMER_CB:
+        printf(" %s pit callback\n", ri->dump_header);
+        break;
+    case TRC_HVM_EMUL_LAPIC_TIMER_CB:
+        printf(" %s vlapic callback\n", ri->dump_header);
+        break;
+    case TRC_HVM_EMUL_PIC_INT_OUTPUT:
+        {
+        struct {
+            unsigned int int_output, is_master, irq;
+        } *r = (typeof(r))ri->d;
+        printf(" %s vpic_update_int_output [ int_output = %u, is_master = %u, irq = %u ]\n",
+               ri->dump_header, r->int_output, r->is_master, r->irq);
+        break;
+        }
+    case TRC_HVM_EMUL_PIC_KICK:
+        {
+        struct {
+            unsigned int irq;
+        } *r = (typeof(r))ri->d;
+        printf(" %s vpic vcpu_kick [ irq = %u ]\n",
+               ri->dump_header, r->irq);
+        break;
+        }
+    case TRC_HVM_EMUL_PIC_INTACK:
+        {
+        struct {
+            unsigned int is_master, irq;
+        } *r = (typeof(r))ri->d;
+        printf(" %s __vpic_intack [ is_master = %u, irq = %u ]\n",
+               ri->dump_header, r->is_master, r->irq);
+        break;
+        }
+    case TRC_HVM_EMUL_PIC_POSEDGE:
+        {
+        struct {
+            unsigned int irq;
+        } *r = (typeof(r))ri->d;
+        printf(" %s vpic_irq_positive_edge [ irq = %u ]\n",
+               ri->dump_header, r->irq);
+        break;
+        }
+    case TRC_HVM_EMUL_PIC_NEGEDGE:
+        {
+        struct {
+            unsigned int irq;
+        } *r = (typeof(r))ri->d;
+        printf(" %s vpic_irq_negative_edge [ irq = %u ]\n",
+               ri->dump_header, r->irq);
+        break;
+        }
+    case TRC_HVM_EMUL_PIC_PEND_IRQ_CALL:
+        {
+        struct {
+            unsigned int accept_pic_intr, int_output;
+        } *r = (typeof(r))ri->d;
+        printf(" %s vpic_ack_pending_irq [ accept_pic_intr = %u, int_output = %u ]\n",
+               ri->dump_header, r->accept_pic_intr, r->int_output);
+        break;
+        }
+    case TRC_HVM_EMUL_LAPIC_PIC_INTR:
+        {
+        struct {
+            unsigned int i8259_target, accept_pic_int;
+        } *r = (typeof(r))ri->d;
+        printf(" %s vlapic_accept_pic_intr [ i8259_target = %u, accept_pic_int = %u ]\n",
+               ri->dump_header, r->i8259_target, r->accept_pic_int);
+        break;
+        }
+    default:
+        break;
+    }
+}
+
 void hvm_process(struct pcpu_info *p)
 {
     struct record_info *ri = &p->ri;
     struct vcpu_data *v = p->current;
     struct hvm_data *h = &v->hvm;
 
     assert(p->current);
 
     /* HVM_EMUL types show up in all contexts */
     if(ri->evt.sub != 0x4) {
         if(vcpu_set_data_type(p->current, VCPU_DATA_HVM))
             return;
@@ -5346,24 +5478,44 @@ void hvm_process(struct pcpu_info *p)
         switch(ri->event) {
         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;
         case TRC_HVM_VMENTRY:
             UPDATE_VOLUME(p, hvm[HVM_VOL_VMENTRY], ri->size);
             hvm_vmentry_process(ri, &p->current->hvm);
             break;
+        case TRC_HVM_EMUL_HPET_START_TIMER:
+        case TRC_HVM_EMUL_PIT_START_TIMER:
+        case TRC_HVM_EMUL_RTC_START_TIMER:
+        case TRC_HVM_EMUL_LAPIC_START_TIMER:
+        case TRC_HVM_EMUL_HPET_STOP_TIMER:
+        case TRC_HVM_EMUL_PIT_STOP_TIMER:
+        case TRC_HVM_EMUL_RTC_STOP_TIMER:
+        case TRC_HVM_EMUL_LAPIC_STOP_TIMER:
+        case TRC_HVM_EMUL_PIT_TIMER_CB:
+        case TRC_HVM_EMUL_LAPIC_TIMER_CB:
+        case TRC_HVM_EMUL_PIC_INT_OUTPUT:
+        case TRC_HVM_EMUL_PIC_KICK:
+        case TRC_HVM_EMUL_PIC_INTACK:
+        case TRC_HVM_EMUL_PIC_POSEDGE:
+        case TRC_HVM_EMUL_PIC_NEGEDGE:
+        case TRC_HVM_EMUL_PIC_PEND_IRQ_CALL:
+        case TRC_HVM_EMUL_LAPIC_PIC_INTR:
+            if(opt.dump_all)
+                hvm_emul_process(ri);
+            break;
         default:
             fprintf(warn, "Unknown hvm event: %x\n", ri->event);
         }
     }
 }
 
 void hvm_summary(struct hvm_data *h) {
    int i;
 
    if(!h->summary_info)
        return;
 
openSUSE Build Service is sponsored by