[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] xenalyze: Handle all MMIO events



Use a generic mmio-assist post processor if no other post-process functions are
present.

This will make sure we catch not only APIC_ACCESS vmexits, but also NPF vmexits
(and any future hardware innovations).

Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx>

diff -r 2a404c7a4fa2 -r 4e88187c91ba xenalyze.c
--- a/xenalyze.c        Mon Nov 22 12:38:56 2010 +0000
+++ b/xenalyze.c        Mon Nov 22 12:39:38 2010 +0000
@@ -1829,11 +1829,14 @@
     } interval;
 } P = { 0 };
 
+/* Function prototypes */
 char * pcpu_string(int pcpu);
 void process_generic(struct record_info *ri);
 void dump_generic(FILE *f, struct record_info *ri);
 ssize_t __read_record(int fd, struct trace_record *rec, loff_t offset);
 void error(enum error_level l, struct record_info *ri);
+void update_io_address(struct io_address ** list, unsigned int pa, int dir,
+                       tsc_t arc_cycles, unsigned int va);
 
 void cpumask_init(cpu_mask_t *c) {
     *c = 0UL;
@@ -3542,6 +3545,20 @@
 
 }
 
+/* Also called by shadow_mmio_postprocess */
+void enumerate_mmio(struct hvm_data *h)
+{
+    struct pf_xen_extra *e = &h->inflight.pf_xen;
+
+    if ( e->mmio_data_valid )
+        update_io_address(&h->summary.mmio, e->gpa, e->mmio_is_write, 
h->arc_cycles, e->va);
+}
+
+void hvm_mmio_assist_postprocess(struct hvm_data *h)
+{
+    if ( opt.with_mmio_enumeration )
+        enumerate_mmio(h);
+}
 
 #define HVM_IO_ASSIST_WRITE 0x200
 void hvm_mmio_assist_process(struct record_info *ri, struct hvm_data *h)
@@ -3594,6 +3611,11 @@
 
     if((e->gpa & 0xfffff000) == 0xfee00000)
         hvm_vlapic_handler(h);
+
+    /* Catch MMIOs that don't go through the shadow code */
+    if ( h->post_process == NULL )
+        h->post_process = hvm_mmio_assist_postprocess;
+        
 }
 
 void hvm_inj_virq_process(struct record_info *ri, struct hvm_data *h) {
@@ -4520,21 +4542,6 @@
     }
 }
 
-/* Also called by shadow_mmio_postprocess */
-void enumerate_mmio(struct hvm_data *h)
-{
-    struct pf_xen_extra *e = &h->inflight.pf_xen;
-
-    if ( e->mmio_data_valid )
-        update_io_address(&h->summary.mmio, e->gpa, e->mmio_is_write, 
h->arc_cycles, e->va);
-}
-
-void hvm_apic_access_postprocess(struct hvm_data *h)
-{
-    if ( opt.with_mmio_enumeration )
-        enumerate_mmio(h);
-}
-
 void hvm_npf_process(struct record_info *ri, struct hvm_data *h)
 {
     struct {
@@ -5040,8 +5047,6 @@
         case EXIT_REASON_EXCEPTION_NMI:
             h->post_process = hvm_exception_nmi_generic_postprocess;
             break;
-        case EXIT_REASON_APIC_ACCESS:
-            h->post_process = hvm_apic_access_postprocess;
         default:
             ;
         }

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.