All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boris Ostrovsky <boris.ostrovsky@oracle.com>
To: Don Slutz <dslutz@verizon.com>, xen-devel@lists.xen.org
Cc: Kevin Tian <kevin.tian@intel.com>, Keir Fraser <keir@xen.org>,
	Ian Campbell <ian.campbell@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Jun Nakajima <jun.nakajima@intel.com>,
	Eddie Dong <eddie.dong@intel.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>, Tim Deegan <tim@xen.org>,
	George Dunlap <George.Dunlap@eu.citrix.com>,
	Aravind Gopalakrishnan <Aravind.Gopalakrishnan@amd.com>,
	Jan Beulich <jbeulich@suse.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Subject: Re: [PATCH v4 04/16] xen: Add is_vmware_port_enabled
Date: Fri, 12 Sep 2014 09:08:41 -0400	[thread overview]
Message-ID: <5412F059.10003@oracle.com> (raw)
In-Reply-To: <1410460610-14759-5-git-send-email-dslutz@verizon.com>

On 09/11/2014 02:36 PM, Don Slutz wrote:
>   int __get_instruction_length_from_list(struct vcpu *v,
> -        const enum instruction_index *list, unsigned int list_count)
> +                                       const enum instruction_index *list,
> +                                       unsigned int list_count,
> +                                       bool_t err_rpt)
>   {
>       struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
>       unsigned int i, j, inst_len = 0;
> @@ -211,10 +222,13 @@ int __get_instruction_length_from_list(struct vcpu *v,
>       mismatch: ;
>       }
>   
> -    gdprintk(XENLOG_WARNING,
> -             "%s: Mismatch between expected and actual instruction bytes: "
> -             "eip = %lx\n",  __func__, (unsigned long)vmcb->rip);
> -    hvm_inject_hw_exception(TRAP_gp_fault, 0);
> +    if ( err_rpt )
> +    {
> +        gdprintk(XENLOG_WARNING,
> +                 "%s: Mismatch between expected and actual instruction bytes: "
> +                 "eip = %lx\n",  __func__, (unsigned long)vmcb->rip);
> +        hvm_inject_hw_exception(TRAP_gp_fault, 0);
> +    }
>       return 0;
>   
>    done:
> diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
> index b5188e6..9e14d2a 100644
> --- a/xen/arch/x86/hvm/svm/svm.c
> +++ b/xen/arch/x86/hvm/svm/svm.c
> @@ -59,6 +59,7 @@
>   #include <public/sched.h>
>   #include <asm/hvm/vpt.h>
>   #include <asm/hvm/trace.h>
> +#include <asm/hvm/vmport.h>
>   #include <asm/hap.h>
>   #include <asm/apic.h>
>   #include <asm/debugger.h>
> @@ -2065,6 +2066,38 @@ svm_vmexit_do_vmsave(struct vmcb_struct *vmcb,
>       return;
>   }
>   
> +static void svm_vmexit_gp_intercept(struct cpu_user_regs *regs,
> +                                    struct vcpu *v)
> +{
> +    struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
> +    unsigned long inst_len;
> +    unsigned long inst_addr = svm_rip2pointer(v);
> +    int rc;
> +    static const enum instruction_index list[] = {
> +        INSTR_INL_DX, INSTR_INB_DX, INSTR_OUTL_DX, INSTR_OUTB_DX
> +    };
> +
> +    inst_len = __get_instruction_length_from_list(
> +        v, list, ARRAY_SIZE(list), 0);

I should have asked earlier but I don't think I understand why the last 
argument here is 0 (and therefore why you have this last argument at all).

Because whether or not you are warning in 
__get_instruction_length_from_list() it will still return 0. And that, 
in turn, will cause vmport_gp_check() to return an error. And then you 
will print another warning in VMPORT_LOG. So there is a warning anyway.

Second, since this handler appears to be handling #GP only for VMware 
guest we should make sure that it is not executed for any other guest. 
You do now condition intercept got #GP for such guests only but I still 
think having a check here is worth doing. Maybe a BUG() or ASSERT()?

The same comments are applicable to VMX code, I suspect.

> +
> +    rc = vmport_gp_check(regs, v, inst_len, inst_addr,
> +                         vmcb->exitinfo1, vmcb->exitinfo2);
> +    if ( !rc )
> +        __update_guest_eip(regs, inst_len);
> +    else
> +    {
> +        VMPORT_DBG_LOG(VMPORT_LOG_GP_UNKNOWN,
> +                       "gp: rc=%d ei1=0x%lx ei2=0x%lx ip=%"PRIx64
> +                       " (0x%lx,%ld) ax=%"PRIx64" bx=%"PRIx64" cx=%"PRIx64
> +                       " dx=%"PRIx64" si=%"PRIx64" di=%"PRIx64, rc,
> +                       (unsigned long)vmcb->exitinfo1,
> +                       (unsigned long)vmcb->exitinfo2, regs->rip, inst_addr,
> +                       inst_len, regs->rax, regs->rbx, regs->rcx, regs->rdx,
> +                       regs->rsi, regs->rdi);
> +        hvm_inject_hw_exception(TRAP_gp_fault, regs->error_code);
> +    }
> +}
> +

...

> +
> +int vmport_gp_check(struct cpu_user_regs *regs, struct vcpu *v,
> +                    unsigned long inst_len, unsigned long inst_addr,
> +                    unsigned long ei1, unsigned long ei2)
> +{
> +    if ( !v->domain->arch.hvm_domain.is_vmware_port_enabled )
> +        return 10;
> +
> +    if ( inst_len && inst_len <= 2 && get_low_bits(regs->rdx) == BDOOR_PORT &&
> +         ei1 == 0 && ei2 == 0 && regs->error_code == 0 &&
> +         (uint32_t)regs->rax == BDOOR_MAGIC )
> +    {
> +        int i = 0;
> +        uint32_t val;
> +        uint32_t byte_cnt = 4;
> +        unsigned char bytes[2];
> +        unsigned int fetch_len;
> +        int frc;
> +        int rc;
> +
> +        /*
> +         * Fetch up to the next page break; we'll fetch from the
> +         * next page later if we have to.
> +         */
> +        fetch_len = min_t(unsigned int, inst_len,
> +                          PAGE_SIZE - (inst_addr  & ~PAGE_MASK));
> +        frc = hvm_fetch_from_guest_virt_nofault(bytes, inst_addr, fetch_len,
> +                                                PFEC_page_present);
> +        if ( frc != HVMCOPY_okay )
> +        {
> +            gdprintk(XENLOG_WARNING,
> +                     "Bad instruction fetch at %#lx (frc=%d il=%lu fl=%u)\n",
> +                     (unsigned long) inst_addr, frc, inst_len, fetch_len);
> +            return 11;
> +        }
> +        if ( bytes[0] == 0x66 )     /* operand size prefix */
> +        {
> +            byte_cnt = 2;
> +            i = 1;
> +            if ( fetch_len != inst_len )
> +            {
> +                frc = hvm_fetch_from_guest_virt_nofault(&bytes[1],
> +                                                        inst_addr + 1, 1,
> +                                                        PFEC_page_present);
> +                if ( frc != HVMCOPY_okay )
> +                {
> +                    gdprintk(XENLOG_WARNING,
> +                             "Bad instruction fetch at %#lx + 1 (frc=%d)\n",
> +                             (unsigned long) inst_addr, frc);
> +                    return 12;
> +                }
> +            }
> +        }
> +        if ( bytes[i] == 0xed )     /* in (%dx),%eax or in (%dx),%ax */
> +        {
> +            rc = vmport_ioport(IOREQ_READ, BDOOR_PORT, byte_cnt, &val);
> +            VMPORT_DBG_LOG(VMPORT_LOG_GP_VMWARE_AFTER,
> +                           "gp: VMwareIn  rc=%d ip=%"PRIx64" byte_cnt=%d ax=%"
> +                           PRIx64" bx=%"PRIx64" cx=%"PRIx64" dx=%"PRIx64
> +                           " si=%"PRIx64" di=%"PRIx64, rc,
> +                           inst_addr, byte_cnt, regs->rax, regs->rbx,
> +                           regs->rcx, regs->rdx, regs->rsi, regs->rdi);
> +            return rc;
> +        }
> +        else if ( bytes[i] == 0xec )     /* in (%dx),%al */
> +        {
> +            rc = vmport_ioport(IOREQ_READ, BDOOR_PORT, 1, &val);
> +            VMPORT_DBG_LOG(VMPORT_LOG_GP_VMWARE_AFTER,
> +                           "gp: VMwareIn  rc=%d ip=%"PRIx64" byte_cnt=1 ax=%"
> +                           PRIx64" bx=%"PRIx64" cx=%"PRIx64" dx=%"PRIx64
> +                           " si=%"PRIx64" di=%"PRIx64, rc,
> +                           inst_addr, regs->rax, regs->rbx, regs->rcx,
> +                           regs->rdx, regs->rsi, regs->rdi);
> +            return rc;
> +        }
> +        else if ( bytes[i] == 0xef )     /* out %eax,(%dx) or out %ax,(%dx) */
> +        {
> +            rc = vmport_ioport(IOREQ_WRITE, BDOOR_PORT, byte_cnt, &val);
> +            VMPORT_DBG_LOG(VMPORT_LOG_GP_VMWARE_AFTER,
> +                           "gp: VMwareOut rc=%d ip=%"PRIx64" byte_cnt=%d ax=%"
> +                           PRIx64" bx=%"PRIx64" cx=%"PRIx64" dx=%"PRIx64
> +                           " si=%"PRIx64" di=%"PRIx64, rc,
> +                           inst_addr, byte_cnt, regs->rax, regs->rbx,
> +                           regs->rcx, regs->rdx, regs->rsi, regs->rdi);
> +            return rc;
> +        }
> +        else if ( bytes[i] == 0xee )     /* out %al,(%dx) */
> +        {
> +            rc = vmport_ioport(IOREQ_WRITE, BDOOR_PORT, 1, &val);
> +            VMPORT_DBG_LOG(VMPORT_LOG_GP_VMWARE_AFTER,
> +                           "gp: VMwareOut rc=%d ip=%"PRIx64" byte_cnt=1 ax=%"
> +                           PRIx64" bx=%"PRIx64" cx=%"PRIx64" dx=%"PRIx64
> +                           " si=%"PRIx64" di=%"PRIx64, rc,
> +                           inst_addr, regs->rax, regs->rbx, regs->rcx,
> +                           regs->rdx, regs->rsi, regs->rdi);
> +            return rc;
> +        }
> +        else
> +        {
> +            VMPORT_DBG_LOG(VMPORT_LOG_GP_FAIL_RD_INST,
> +                           "gp: VMware? lip=%"PRIx64"[%d]=>0x%x(%ld) ax=%"
> +                           PRIx64" bx=%"PRIx64" cx=%"PRIx64" dx=%"PRIx64
> +                           " si=%"PRIx64" di=%"PRIx64,
> +                           inst_addr, i, bytes[i], inst_len, regs->rax,
> +                           regs->rbx, regs->rcx, regs->rdx, regs->rsi,
> +                           regs->rdi);
> +            return 13;
> +        }
> +    }
> +    return 14;

The return values should be defined as macros --- otherwise they look 
like some magic integers.

-boris

  parent reply	other threads:[~2014-09-12 13:08 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-11 18:36 [PATCH v4 00/16] Xen VMware tools support Don Slutz
2014-09-11 18:36 ` [PATCH v4 01/16] xen: Add support for VMware cpuid leaves Don Slutz
2014-09-11 19:49   ` Andrew Cooper
2014-09-12  9:49     ` Jan Beulich
2014-09-12 17:46       ` Don Slutz
2014-09-15  7:42         ` Jan Beulich
2014-09-17 15:41           ` Don Slutz
2014-09-12 21:26     ` Don Slutz
2014-09-12 12:37   ` Boris Ostrovsky
2014-09-12 17:50     ` Don Slutz
2014-09-11 18:36 ` [PATCH v4 02/16] tools: Add vmware_hw support Don Slutz
2014-09-11 21:09   ` Andrew Cooper
2014-09-16 16:20     ` Don Slutz
2014-09-11 18:36 ` [PATCH v4 03/16] vmware: Add VMware provided include files Don Slutz
2014-09-11 18:36 ` [PATCH v4 04/16] xen: Add is_vmware_port_enabled Don Slutz
2014-09-11 21:22   ` Andrew Cooper
2014-09-16 16:20     ` Don Slutz
2014-09-12 13:08   ` Boris Ostrovsky [this message]
2014-09-16 12:08     ` Slutz, Donald Christopher
2014-09-17 15:56       ` Boris Ostrovsky
2014-09-17 18:23         ` Slutz, Donald Christopher
2014-09-18  9:14           ` Jan Beulich
2014-09-19 12:48             ` Slutz, Donald Christopher
2014-09-18 22:53           ` Boris Ostrovsky
2014-09-19 13:24             ` Slutz, Donald Christopher
2014-09-19 15:50               ` Boris Ostrovsky
2014-09-19 17:00                 ` Slutz, Donald Christopher
2014-09-11 18:36 ` [PATCH v4 05/16] tools: Add vmware_port support Don Slutz
2014-09-11 18:36 ` [PATCH v4 06/16] xen: Convert vmware_port to xentrace usage Don Slutz
2014-09-12 13:10   ` Boris Ostrovsky
2014-09-12 23:57     ` Don Slutz
2014-09-11 18:36 ` [PATCH v4 07/16] tools: " Don Slutz
2014-09-12 13:15   ` Boris Ostrovsky
2014-09-13  0:01     ` Don Slutz
2014-09-11 18:36 ` [PATCH v4 08/16] xen: Add limited support of VMware's hyper-call rpc Don Slutz
2014-09-12 13:37   ` Boris Ostrovsky
2014-09-12 14:27     ` Jan Beulich
2014-09-16 12:38       ` Slutz, Donald Christopher
2014-09-16 12:46         ` Jan Beulich
2014-09-16 13:47           ` Slutz, Donald Christopher
2014-09-16 13:17     ` Slutz, Donald Christopher
2014-09-11 18:36 ` [PATCH v4 09/16] tools: " Don Slutz
2014-09-11 18:36 ` [PATCH v4 10/16] Add VMware tool's triggers Don Slutz
2014-09-11 18:36 ` [PATCH v4 11/16] Add live migration of VMware's hyper-call RPC Don Slutz
2014-09-12 13:54   ` Boris Ostrovsky
2014-09-16 15:48     ` Don Slutz
2014-09-11 18:36 ` [PATCH v4 12/16] Add dump of HVM_SAVE_CODE(VMPORT) to xen-hvmctx Don Slutz
2014-09-11 18:36 ` [PATCH v4 13/16] Add xen-hvm-param Don Slutz
2014-09-11 18:36 ` [PATCH v4 14/16] Add xen-vmware-guestinfo Don Slutz
2014-09-11 18:36 ` [PATCH v4 15/16] Add xen-list-vmware-guestinfo Don Slutz
2014-09-11 18:36 ` [PATCH v4 16/16] Add xen-hvm-send-trigger Don Slutz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5412F059.10003@oracle.com \
    --to=boris.ostrovsky@oracle.com \
    --cc=Aravind.Gopalakrishnan@amd.com \
    --cc=George.Dunlap@eu.citrix.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=dslutz@verizon.com \
    --cc=eddie.dong@intel.com \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=jbeulich@suse.com \
    --cc=jun.nakajima@intel.com \
    --cc=keir@xen.org \
    --cc=kevin.tian@intel.com \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=suravee.suthikulpanit@amd.com \
    --cc=tim@xen.org \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.