x86: Improvements to ler debugging
authorAndrew Cooper <andrew.cooper3@citrix.com>
Thu, 24 May 2018 17:41:53 +0000 (17:41 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Wed, 4 Jul 2018 11:12:14 +0000 (12:12 +0100)
 * Command line documentation for what the option does.
 * Implement a canonicalise_addr() helper and replace the opencoded use in
   sign_extend_msr()
 * Canonicalise the ler pointers and print symbol information.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
docs/misc/xen-command-line.markdown
xen/arch/x86/hvm/vmx/vmx.c
xen/arch/x86/x86_64/traps.c
xen/include/asm-x86/x86_64/page.h

index 8a832c0f8ba946b81c455f1a266283aee210c9df..4f75f64a90763cf739473a3b01d61e13f6927622 100644 (file)
@@ -1247,6 +1247,12 @@ if left disabled by the BIOS.
 ### ler (x86)
 > `= <boolean>`
 
+> Default: false
+
+This option is intended for debugging purposes only.  Enable MSR_DEBUGCTL.LBR
+in hypervisor context to be able to dump the Last Interrupt/Exception To/From
+record with other registers.
+
 ### loglvl
 > `= <level>[/<rate-limited level>]` where level is `none | error | warning | info | debug | all`
 
index e319bf10ba02fb3b7343d8e3d3ef264aef5d933c..4b08439484213e68eb303451ab655b17d8495b00 100644 (file)
@@ -4182,12 +4182,7 @@ static void sign_extend_msr(u32 msr, int type)
     struct vmx_msr_entry *entry;
 
     if ( (entry = vmx_find_msr(msr, type)) != NULL )
-    {
-        if ( entry->data & VADDR_TOP_BIT )
-            entry->data |= CANONICAL_MASK;
-        else
-            entry->data &= ~CANONICAL_MASK;
-    }
+        entry->data = canonicalise_addr(entry->data);
 }
 
 static void bdw_erratum_bdf14_fixup(void)
index b0401850ef1796c270a6417cbc7897be6b842c8b..ed02b788d3850885070f29f92eab94d65308359d 100644 (file)
@@ -150,7 +150,12 @@ void show_registers(const struct cpu_user_regs *regs)
 
         rdmsrl(ler_msr, from);
         rdmsrl(ler_msr + 1, to);
-        printk("ler: %016lx -> %016lx\n", from, to);
+
+        /* Upper bits may store metadata.  Re-canonicalise for printing. */
+        printk("ler: from %016"PRIx64" [%ps]\n",
+               from, _p(canonicalise_addr(from)));
+        printk("       to %016"PRIx64" [%ps]\n",
+               to, _p(canonicalise_addr(to)));
     }
 }
 
index 05a03348933129f60dfaa54a8d7e4a38ae817331..4fe0205553dc7a0588ae0baf001d9fd44fdad5ae 100644 (file)
 
 #ifndef __ASSEMBLY__
 
+static inline unsigned long canonicalise_addr(unsigned long addr)
+{
+    if ( addr & VADDR_TOP_BIT )
+        return addr | CANONICAL_MASK;
+    else
+        return addr & ~CANONICAL_MASK;
+}
+
 #include <asm/types.h>
 
 #include <xen/pdx.h>