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

[RFC PATCH v1 04/10] vpmu.c: factor out register conversion



A followup commit will use this to store the guest's regs when domid ==
DOMID_XEN.
To avoid code duplication move the code into a function.

No functional change.

Signed-off-by: Edwin Török <edwin.torok@xxxxxxxxx>
---
 xen/arch/x86/cpu/vpmu.c | 49 ++++++++++++++++++++++-------------------
 1 file changed, 26 insertions(+), 23 deletions(-)

diff --git a/xen/arch/x86/cpu/vpmu.c b/xen/arch/x86/cpu/vpmu.c
index 7be79c2d00..713311a1ac 100644
--- a/xen/arch/x86/cpu/vpmu.c
+++ b/xen/arch/x86/cpu/vpmu.c
@@ -160,6 +160,31 @@ static inline struct vcpu *choose_hwdom_vcpu(void)
     return hardware_domain->vcpu[idx];
 }
 
+static inline void vpmu_convert_regs(struct xen_pmu_regs *r, uint64_t *flags,
+                                     struct vcpu *sampled,
+                                     const struct cpu_user_regs *cur_regs) {
+  r->ip = cur_regs->rip;
+  r->sp = cur_regs->rsp;
+  r->flags = cur_regs->rflags;
+
+  if (!is_hvm_vcpu(sampled)) {
+    r->ss = cur_regs->ss;
+    r->cs = cur_regs->cs;
+    if (!(sampled->arch.flags & TF_kernel_mode))
+      *flags |= PMU_SAMPLE_USER;
+  } else {
+    struct segment_register seg;
+
+    hvm_get_segment_register(sampled, x86_seg_cs, &seg);
+    r->cs = seg.sel;
+    hvm_get_segment_register(sampled, x86_seg_ss, &seg);
+    r->ss = seg.sel;
+    r->cpl = seg.dpl;
+    if (!(sampled->arch.hvm.guest_cr[0] & X86_CR0_PE))
+      *flags |= PMU_SAMPLE_REAL;
+  }
+}
+
 void vpmu_do_interrupt(void)
 {
     struct vcpu *sampled = current, *sampling;
@@ -255,29 +280,7 @@ void vpmu_do_interrupt(void)
             else
                 cur_regs = guest_cpu_user_regs();
 
-            r->ip = cur_regs->rip;
-            r->sp = cur_regs->rsp;
-            r->flags = cur_regs->rflags;
-
-            if ( !is_hvm_vcpu(sampled) )
-            {
-                r->ss = cur_regs->ss;
-                r->cs = cur_regs->cs;
-                if ( !(sampled->arch.flags & TF_kernel_mode) )
-                    *flags |= PMU_SAMPLE_USER;
-            }
-            else
-            {
-                struct segment_register seg;
-
-                hvm_get_segment_register(sampled, x86_seg_cs, &seg);
-                r->cs = seg.sel;
-                hvm_get_segment_register(sampled, x86_seg_ss, &seg);
-                r->ss = seg.sel;
-                r->cpl = seg.dpl;
-                if ( !(sampled->arch.hvm.guest_cr[0] & X86_CR0_PE) )
-                    *flags |= PMU_SAMPLE_REAL;
-            }
+            vpmu_convert_regs(r, flags, sampled, cur_regs);
         }
 
         vpmu->xenpmu_data->domain_id = domid;
-- 
2.47.1




 


Rackspace

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