From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: Re: [PATCH 2/5] VMX: dump full host state Date: Tue, 20 Jan 2015 17:19:11 +0000 Message-ID: <54BE8E0F.4010905@citrix.com> References: <54BE42EA0200007800056EDC@mail.emea.novell.com> <54BE44B70200007800056F0A@mail.emea.novell.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0337678991885069879==" Return-path: Received: from mail6.bemta4.messagelabs.com ([85.158.143.247]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1YDcwD-0007Nw-3z for xen-devel@lists.xenproject.org; Tue, 20 Jan 2015 17:50:01 +0000 In-Reply-To: <54BE44B70200007800056F0A@mail.emea.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Jan Beulich , xen-devel Cc: Kevin Tian , Eddie Dong , Jun Nakajima List-Id: xen-devel@lists.xenproject.org --===============0337678991885069879== Content-Type: multipart/alternative; boundary="------------000502070902010407040209" --------------000502070902010407040209 Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: quoted-printable On 20/01/15 11:06, Jan Beulich wrote: > A few host state fields did not get dumped so far. Where suitable (to > reduce the amount of output) make some of the dumping conditional upon > guest settings (this isn't required for correctness as vmr() already > uses __vmread_safe(), i.e. it is fine to access non-existing fields). > > Also drop casts - many of them haven't been needed anymore since the > dropping of 32-bit support. > > Signed-off-by: Jan Beulich > > --- a/xen/arch/x86/hvm/vmx/vmcs.c > +++ b/xen/arch/x86/hvm/vmx/vmcs.c > @@ -1496,34 +1496,27 @@ void vmcs_dump_vcpu(struct vcpu *v) > printk("InterruptStatus =3D %04x\n", vmr16(GUEST_INTR_STATUS))= ; > =20 > printk("*** Host State ***\n"); > - printk("RSP =3D 0x%016llx RIP =3D 0x%016llx\n",=20 > - (unsigned long long)vmr(HOST_RSP), > - (unsigned long long)vmr(HOST_RIP)); > - printk("CS=3D%04x DS=3D%04x ES=3D%04x FS=3D%04x GS=3D%04x SS=3D%04= x TR=3D%04x\n", > - (uint16_t)vmr(HOST_CS_SELECTOR), > - (uint16_t)vmr(HOST_DS_SELECTOR), > - (uint16_t)vmr(HOST_ES_SELECTOR), > - (uint16_t)vmr(HOST_FS_SELECTOR), > - (uint16_t)vmr(HOST_GS_SELECTOR), > - (uint16_t)vmr(HOST_SS_SELECTOR), > - (uint16_t)vmr(HOST_TR_SELECTOR)); > - printk("FSBase=3D%016llx GSBase=3D%016llx TRBase=3D%016llx\n", > - (unsigned long long)vmr(HOST_FS_BASE), > - (unsigned long long)vmr(HOST_GS_BASE), > - (unsigned long long)vmr(HOST_TR_BASE)); > - printk("GDTBase=3D%016llx IDTBase=3D%016llx\n", > - (unsigned long long)vmr(HOST_GDTR_BASE), > - (unsigned long long)vmr(HOST_IDTR_BASE)); > - printk("CR0=3D%016llx CR3=3D%016llx CR4=3D%016llx\n", > - (unsigned long long)vmr(HOST_CR0), > - (unsigned long long)vmr(HOST_CR3), > - (unsigned long long)vmr(HOST_CR4)); > - printk("Sysenter RSP=3D%016llx CS:RIP=3D%04x:%016llx\n", > - (unsigned long long)vmr(HOST_SYSENTER_ESP), > - (int)vmr(HOST_SYSENTER_CS), > - (unsigned long long)vmr(HOST_SYSENTER_EIP)); > - printk("Host PAT =3D 0x%08x%08x\n", > - (uint32_t)vmr(HOST_PAT_HIGH), (uint32_t)vmr(HOST_PAT)); > + printk("RIP =3D 0x%016lx (%ps) RSP =3D 0x%016lx\n", > + vmr(HOST_RIP), (void *)vmr(HOST_RIP), vmr(HOST_RSP)); Given the asm volatile, the compiler is unlikely to elide the second read of HOST_RIP. I suppose that this is debug code and it really doesn't matter too much, but if it is used anywhere else it might be worth pulling out into a local variable. > + printk("CS=3D%04x SS=3D%04x DS=3D%04x ES=3D%04x FS=3D%04x GS=3D%04= x TR=3D%04x\n", > + vmr16(HOST_CS_SELECTOR), vmr16(HOST_SS_SELECTOR), > + vmr16(HOST_DS_SELECTOR), vmr16(HOST_ES_SELECTOR), > + vmr16(HOST_FS_SELECTOR), vmr16(HOST_GS_SELECTOR), > + vmr16(HOST_TR_SELECTOR)); > + printk("FSBase=3D%016lx GSBase=3D%016lx TRBase=3D%016lx\n", > + vmr(HOST_FS_BASE), vmr(HOST_GS_BASE), vmr(HOST_TR_BASE)); > + printk("GDTBase=3D%016lx IDTBase=3D%016lx\n", > + vmr(HOST_GDTR_BASE), vmr(HOST_IDTR_BASE)); > + printk("CR0=3D%016lx CR3=3D%016lx CR4=3D%016lx\n", > + vmr(HOST_CR0), vmr(HOST_CR3), vmr(HOST_CR4)); > + printk("Sysenter RSP=3D%016lx CS:RIP=3D%04x:%016lx\n", > + vmr(HOST_SYSENTER_ESP), > + vmr32(HOST_SYSENTER_CS), vmr(HOST_SYSENTER_EIP)); vmr16() ? ~Andrew > + if ( vmexit_ctl & (VM_EXIT_LOAD_HOST_PAT | VM_EXIT_LOAD_HOST_EFER)= ) > + printk("EFER =3D 0x%016lx PAT =3D 0x%016lx\n", vmr(HOST_EFER)= , vmr(HOST_PAT)); > + if ( vmexit_ctl & VM_EXIT_LOAD_PERF_GLOBAL_CTRL ) > + printk("PerfGlobCtl =3D 0x%016lx\n", > + vmr(HOST_PERF_GLOBAL_CTRL)); > =20 > printk("*** Control State ***\n"); > printk("PinBased=3D%08x CPUBased=3D%08x SecondaryExec=3D%08x\n", > > > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel --------------000502070902010407040209 Content-Type: text/html; charset="windows-1252" Content-Length: 5150 Content-Transfer-Encoding: quoted-printable
On 20/01/15 11:06, Jan Beulich wrote:
A few host state fields did not get dumped so far. Where suitable (to
reduce the amount of output) make some of the dumping conditional upon
guest settings (this isn't required for correctness as vmr() already
uses __vmread_safe(), i.e. it is fine to access non-existing fields).

Also drop casts - many of them haven't been needed anymore since the
dropping of 32-bit support.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/hvm/vmx/vmcs.c
+++ b/xen/arch/x86/hvm/vmx/vmcs.c
@@ -1496,34 +1496,27 @@ void vmcs_dump_vcpu(struct vcpu *v)
         printk("InterruptStatus =3D %04x\n", vmr16(GUEST_INTR_STATUS));
 
     printk("*** Host State ***\n");
-    printk("RSP =3D 0x%016llx  RIP =3D 0x%016llx\n", 
-           (unsigned long long)vmr(HOST_RSP),
-           (unsigned long long)vmr(HOST_RIP));
-    printk("CS=3D%04x DS=3D%04x ES=3D%04x FS=3D%04x GS=3D%04x SS=3D%04x TR=3D%04x\n",
-           (uint16_t)vmr(HOST_CS_SELECTOR),
-           (uint16_t)vmr(HOST_DS_SELECTOR),
-           (uint16_t)vmr(HOST_ES_SELECTOR),
-           (uint16_t)vmr(HOST_FS_SELECTOR),
-           (uint16_t)vmr(HOST_GS_SELECTOR),
-           (uint16_t)vmr(HOST_SS_SELECTOR),
-           (uint16_t)vmr(HOST_TR_SELECTOR));
-    printk("FSBase=3D%016llx GSBase=3D%016llx TRBase=3D%016llx\n",
-           (unsigned long long)vmr(HOST_FS_BASE),
-           (unsigned long long)vmr(HOST_GS_BASE),
-           (unsigned long long)vmr(HOST_TR_BASE));
-    printk("GDTBase=3D%016llx IDTBase=3D%016llx\n",
-           (unsigned long long)vmr(HOST_GDTR_BASE),
-           (unsigned long long)vmr(HOST_IDTR_BASE));
-    printk("CR0=3D%016llx CR3=3D%016llx CR4=3D%016llx\n",
-           (unsigned long long)vmr(HOST_CR0),
-           (unsigned long long)vmr(HOST_CR3),
-           (unsigned long long)vmr(HOST_CR4));
-    printk("Sysenter RSP=3D%016llx CS:RIP=3D%04x:%016llx\n",
-           (unsigned long long)vmr(HOST_SYSENTER_ESP),
-           (int)vmr(HOST_SYSENTER_CS),
-           (unsigned long long)vmr(HOST_SYSENTER_EIP));
-    printk("Host PAT =3D 0x%08x%08x\n",
-           (uint32_t)vmr(HOST_PAT_HIGH), (uint32_t)vmr(HOST_PAT));
+    printk("RIP =3D 0x%016lx (%ps)  RSP =3D 0x%016lx\n",
+           vmr(HOST_RIP), (void *)vmr(HOST_RIP), vmr(HOST_RSP));

Given the asm volatile, the compiler is unlikely to elide the second read of HOST_RIP.=A0 I suppose that this is debug code and it really doesn't matter too much, but if it is used anywhere else it might be worth pulling out into a local variable.

+    printk("CS=3D%04x SS=3D%04x DS=3D%04x ES=3D%04x FS=3D%04x GS=3D%04x TR=3D%04x\n",
+           vmr16(HOST_CS_SELECTOR), vmr16(HOST_SS_SELECTOR),
+           vmr16(HOST_DS_SELECTOR), vmr16(HOST_ES_SELECTOR),
+           vmr16(HOST_FS_SELECTOR), vmr16(HOST_GS_SELECTOR),
+           vmr16(HOST_TR_SELECTOR));
+    printk("FSBase=3D%016lx GSBase=3D%016lx TRBase=3D%016lx\n",
+           vmr(HOST_FS_BASE), vmr(HOST_GS_BASE), vmr(HOST_TR_BASE));
+    printk("GDTBase=3D%016lx IDTBase=3D%016lx\n",
+           vmr(HOST_GDTR_BASE), vmr(HOST_IDTR_BASE));
+    printk("CR0=3D%016lx CR3=3D%016lx CR4=3D%016lx\n",
+           vmr(HOST_CR0), vmr(HOST_CR3), vmr(HOST_CR4));
+    printk("Sysenter RSP=3D%016lx CS:RIP=3D%04x:%016lx\n",
+           vmr(HOST_SYSENTER_ESP),
+           vmr32(HOST_SYSENTER_CS), vmr(HOST_SYSENTER_EIP));

vmr16() =3F

~Andrew

+    if ( vmexit_ctl & (VM_EXIT_LOAD_HOST_PAT | VM_EXIT_LOAD_HOST_EFER) )
+        printk("EFER =3D 0x%016lx  PAT =3D 0x%016lx\n", vmr(HOST_EFER), vmr(HOST_PAT));
+    if ( vmexit_ctl & VM_EXIT_LOAD_PERF_GLOBAL_CTRL )
+        printk("PerfGlobCtl =3D 0x%016lx\n",
+               vmr(HOST_PERF_GLOBAL_CTRL));
 
     printk("*** Control State ***\n");
     printk("PinBased=3D%08x CPUBased=3D%08x SecondaryExec=3D%08x\n",





_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

--------------000502070902010407040209-- --===============0337678991885069879== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel --===============0337678991885069879==--