All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Jan Beulich" <JBeulich@suse.com>
To: Mukesh Rathor <mukesh.rathor@oracle.com>
Cc: xen-devel <xen-devel@lists.xenproject.org>
Subject: Re: [PATCH 07/24] PVH xen: vmx related preparatory changes for PVH
Date: Thu, 18 Jul 2013 13:29:58 +0100	[thread overview]
Message-ID: <51E7FBE602000078000E5F78@nat28.tlf.novell.com> (raw)
In-Reply-To: <1374114788-27652-8-git-send-email-mukesh.rathor@oracle.com>

>>> On 18.07.13 at 04:32, Mukesh Rathor <mukesh.rathor@oracle.com> wrote:
> This is another preparatory patch for PVH. In this patch, following
> functions are made available for general/public use:
>     vmx_fpu_enter(), get_instruction_length(), update_guest_eip(),
>     and vmx_dr_access().
> 
> There is no functionality change.
> 
> Changes in V2:
>   - prepend vmx_ to get_instruction_length and update_guest_eip.
>   - Do not export/use vmr().
> 
> Changes in V3:
>   - Do not change emulate_forced_invalid_op() in this patch.
> 
> Changes in V7:
>   - Drop pv_cpuid going public here.
> 
> Changes in V8:
>   - Move vmx_fpu_enter prototype from vmcs.h to vmx.h
> 
> Signed-off-by: Mukesh Rathor <mukesh.rathor@oracle.com>
> Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

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

> ---
>  xen/arch/x86/hvm/vmx/vmx.c        |   72 +++++++++++++++---------------------
>  xen/arch/x86/hvm/vmx/vvmx.c       |    2 +-
>  xen/include/asm-x86/hvm/vmx/vmx.h |   17 ++++++++-
>  3 files changed, 47 insertions(+), 44 deletions(-)
> 
> diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
> index d6540e3..195f9ed 100644
> --- a/xen/arch/x86/hvm/vmx/vmx.c
> +++ b/xen/arch/x86/hvm/vmx/vmx.c
> @@ -577,7 +577,7 @@ static int vmx_load_vmcs_ctxt(struct vcpu *v, struct 
> hvm_hw_cpu *ctxt)
>      return 0;
>  }
>  
> -static void vmx_fpu_enter(struct vcpu *v)
> +void vmx_fpu_enter(struct vcpu *v)
>  {
>      vcpu_restore_fpu_lazy(v);
>      v->arch.hvm_vmx.exception_bitmap &= ~(1u << TRAP_no_device);
> @@ -1597,24 +1597,12 @@ const struct hvm_function_table * __init 
> start_vmx(void)
>      return &vmx_function_table;
>  }
>  
> -/*
> - * Not all cases receive valid value in the VM-exit instruction length field.
> - * Callers must know what they're doing!
> - */
> -static int get_instruction_length(void)
> -{
> -    int len;
> -    len = __vmread(VM_EXIT_INSTRUCTION_LEN); /* Safe: callers audited */
> -    BUG_ON((len < 1) || (len > 15));
> -    return len;
> -}
> -
> -void update_guest_eip(void)
> +void vmx_update_guest_eip(void)
>  {
>      struct cpu_user_regs *regs = guest_cpu_user_regs();
>      unsigned long x;
>  
> -    regs->eip += get_instruction_length(); /* Safe: callers audited */
> +    regs->eip += vmx_get_instruction_length(); /* Safe: callers audited */
>      regs->eflags &= ~X86_EFLAGS_RF;
>  
>      x = __vmread(GUEST_INTERRUPTIBILITY_INFO);
> @@ -1687,8 +1675,8 @@ static void vmx_do_cpuid(struct cpu_user_regs *regs)
>      regs->edx = edx;
>  }
>  
> -static void vmx_dr_access(unsigned long exit_qualification,
> -                          struct cpu_user_regs *regs)
> +void vmx_dr_access(unsigned long exit_qualification,
> +                   struct cpu_user_regs *regs)
>  {
>      struct vcpu *v = current;
>  
> @@ -2301,7 +2289,7 @@ static int vmx_handle_eoi_write(void)
>      if ( (((exit_qualification >> 12) & 0xf) == 1) &&
>           ((exit_qualification & 0xfff) == APIC_EOI) )
>      {
> -        update_guest_eip(); /* Safe: APIC data write */
> +        vmx_update_guest_eip(); /* Safe: APIC data write */
>          vlapic_EOI_set(vcpu_vlapic(current));
>          HVMTRACE_0D(VLAPIC);
>          return 1;
> @@ -2514,7 +2502,7 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
>              HVMTRACE_1D(TRAP, vector);
>              if ( v->domain->debugger_attached )
>              {
> -                update_guest_eip(); /* Safe: INT3 */            
> +                vmx_update_guest_eip(); /* Safe: INT3 */
>                  current->arch.gdbsx_vcpu_event = TRAP_int3;
>                  domain_pause_for_debugger();
>                  break;
> @@ -2622,7 +2610,7 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
>           */
>          inst_len = ((source != 3) ||        /* CALL, IRET, or JMP? */
>                      (idtv_info & (1u<<10))) /* IntrType > 3? */
> -            ? get_instruction_length() /* Safe: SDM 3B 23.2.4 */ : 0;
> +            ? vmx_get_instruction_length() /* Safe: SDM 3B 23.2.4 */ : 0;
>          if ( (source == 3) && (idtv_info & INTR_INFO_DELIVER_CODE_MASK) )
>              ecode = __vmread(IDT_VECTORING_ERROR_CODE);
>          regs->eip += inst_len;
> @@ -2630,15 +2618,15 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
>          break;
>      }
>      case EXIT_REASON_CPUID:
> -        update_guest_eip(); /* Safe: CPUID */
> +        vmx_update_guest_eip(); /* Safe: CPUID */
>          vmx_do_cpuid(regs);
>          break;
>      case EXIT_REASON_HLT:
> -        update_guest_eip(); /* Safe: HLT */
> +        vmx_update_guest_eip(); /* Safe: HLT */
>          hvm_hlt(regs->eflags);
>          break;
>      case EXIT_REASON_INVLPG:
> -        update_guest_eip(); /* Safe: INVLPG */
> +        vmx_update_guest_eip(); /* Safe: INVLPG */
>          exit_qualification = __vmread(EXIT_QUALIFICATION);
>          vmx_invlpg_intercept(exit_qualification);
>          break;
> @@ -2646,7 +2634,7 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
>          regs->ecx = hvm_msr_tsc_aux(v);
>          /* fall through */
>      case EXIT_REASON_RDTSC:
> -        update_guest_eip(); /* Safe: RDTSC, RDTSCP */
> +        vmx_update_guest_eip(); /* Safe: RDTSC, RDTSCP */
>          hvm_rdtsc_intercept(regs);
>          break;
>      case EXIT_REASON_VMCALL:
> @@ -2656,7 +2644,7 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
>          rc = hvm_do_hypercall(regs);
>          if ( rc != HVM_HCALL_preempted )
>          {
> -            update_guest_eip(); /* Safe: VMCALL */
> +            vmx_update_guest_eip(); /* Safe: VMCALL */
>              if ( rc == HVM_HCALL_invalidate )
>                  send_invalidate_req();
>          }
> @@ -2666,7 +2654,7 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
>      {
>          exit_qualification = __vmread(EXIT_QUALIFICATION);
>          if ( vmx_cr_access(exit_qualification) == X86EMUL_OKAY )
> -            update_guest_eip(); /* Safe: MOV Cn, LMSW, CLTS */
> +            vmx_update_guest_eip(); /* Safe: MOV Cn, LMSW, CLTS */
>          break;
>      }
>      case EXIT_REASON_DR_ACCESS:
> @@ -2680,7 +2668,7 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
>          {
>              regs->eax = (uint32_t)msr_content;
>              regs->edx = (uint32_t)(msr_content >> 32);
> -            update_guest_eip(); /* Safe: RDMSR */
> +            vmx_update_guest_eip(); /* Safe: RDMSR */
>          }
>          break;
>      }
> @@ -2689,63 +2677,63 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
>          uint64_t msr_content;
>          msr_content = ((uint64_t)regs->edx << 32) | (uint32_t)regs->eax;
>          if ( hvm_msr_write_intercept(regs->ecx, msr_content) == X86EMUL_OKAY 
> )
> -            update_guest_eip(); /* Safe: WRMSR */
> +            vmx_update_guest_eip(); /* Safe: WRMSR */
>          break;
>      }
>  
>      case EXIT_REASON_VMXOFF:
>          if ( nvmx_handle_vmxoff(regs) == X86EMUL_OKAY )
> -            update_guest_eip();
> +            vmx_update_guest_eip();
>          break;
>  
>      case EXIT_REASON_VMXON:
>          if ( nvmx_handle_vmxon(regs) == X86EMUL_OKAY )
> -            update_guest_eip();
> +            vmx_update_guest_eip();
>          break;
>  
>      case EXIT_REASON_VMCLEAR:
>          if ( nvmx_handle_vmclear(regs) == X86EMUL_OKAY )
> -            update_guest_eip();
> +            vmx_update_guest_eip();
>          break;
>   
>      case EXIT_REASON_VMPTRLD:
>          if ( nvmx_handle_vmptrld(regs) == X86EMUL_OKAY )
> -            update_guest_eip();
> +            vmx_update_guest_eip();
>          break;
>  
>      case EXIT_REASON_VMPTRST:
>          if ( nvmx_handle_vmptrst(regs) == X86EMUL_OKAY )
> -            update_guest_eip();
> +            vmx_update_guest_eip();
>          break;
>  
>      case EXIT_REASON_VMREAD:
>          if ( nvmx_handle_vmread(regs) == X86EMUL_OKAY )
> -            update_guest_eip();
> +            vmx_update_guest_eip();
>          break;
>   
>      case EXIT_REASON_VMWRITE:
>          if ( nvmx_handle_vmwrite(regs) == X86EMUL_OKAY )
> -            update_guest_eip();
> +            vmx_update_guest_eip();
>          break;
>  
>      case EXIT_REASON_VMLAUNCH:
>          if ( nvmx_handle_vmlaunch(regs) == X86EMUL_OKAY )
> -            update_guest_eip();
> +            vmx_update_guest_eip();
>          break;
>  
>      case EXIT_REASON_VMRESUME:
>          if ( nvmx_handle_vmresume(regs) == X86EMUL_OKAY )
> -            update_guest_eip();
> +            vmx_update_guest_eip();
>          break;
>  
>      case EXIT_REASON_INVEPT:
>          if ( nvmx_handle_invept(regs) == X86EMUL_OKAY )
> -            update_guest_eip();
> +            vmx_update_guest_eip();
>          break;
>  
>      case EXIT_REASON_INVVPID:
>          if ( nvmx_handle_invvpid(regs) == X86EMUL_OKAY )
> -            update_guest_eip();
> +            vmx_update_guest_eip();
>          break;
>  
>      case EXIT_REASON_MWAIT_INSTRUCTION:
> @@ -2793,14 +2781,14 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
>              int bytes = (exit_qualification & 0x07) + 1;
>              int dir = (exit_qualification & 0x08) ? IOREQ_READ : 
> IOREQ_WRITE;
>              if ( handle_pio(port, bytes, dir) )
> -                update_guest_eip(); /* Safe: IN, OUT */
> +                vmx_update_guest_eip(); /* Safe: IN, OUT */
>          }
>          break;
>  
>      case EXIT_REASON_INVD:
>      case EXIT_REASON_WBINVD:
>      {
> -        update_guest_eip(); /* Safe: INVD, WBINVD */
> +        vmx_update_guest_eip(); /* Safe: INVD, WBINVD */
>          vmx_wbinvd_intercept();
>          break;
>      }
> @@ -2832,7 +2820,7 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs)
>      case EXIT_REASON_XSETBV:
>          if ( hvm_handle_xsetbv(regs->ecx,
>                                 (regs->rdx << 32) | regs->_eax) == 0 )
> -            update_guest_eip(); /* Safe: XSETBV */
> +            vmx_update_guest_eip(); /* Safe: XSETBV */
>          break;
>  
>      case EXIT_REASON_APIC_WRITE:
> diff --git a/xen/arch/x86/hvm/vmx/vvmx.c b/xen/arch/x86/hvm/vmx/vvmx.c
> index 5dfbc54..82be4cc 100644
> --- a/xen/arch/x86/hvm/vmx/vvmx.c
> +++ b/xen/arch/x86/hvm/vmx/vvmx.c
> @@ -2139,7 +2139,7 @@ int nvmx_n2_vmexit_handler(struct cpu_user_regs *regs,
>              tsc += __get_vvmcs(nvcpu->nv_vvmcx, TSC_OFFSET);
>              regs->eax = (uint32_t)tsc;
>              regs->edx = (uint32_t)(tsc >> 32);
> -            update_guest_eip();
> +            vmx_update_guest_eip();
>  
>              return 1;
>          }
> diff --git a/xen/include/asm-x86/hvm/vmx/vmx.h 
> b/xen/include/asm-x86/hvm/vmx/vmx.h
> index c33b9f9..c21a303 100644
> --- a/xen/include/asm-x86/hvm/vmx/vmx.h
> +++ b/xen/include/asm-x86/hvm/vmx/vmx.h
> @@ -446,6 +446,18 @@ static inline int __vmxon(u64 addr)
>      return rc;
>  }
>  
> +/*
> + * Not all cases receive valid value in the VM-exit instruction length 
> field.
> + * Callers must know what they're doing!
> + */
> +static inline int vmx_get_instruction_length(void)
> +{
> +    int len;
> +    len = __vmread(VM_EXIT_INSTRUCTION_LEN); /* Safe: callers audited */
> +    BUG_ON((len < 1) || (len > 15));
> +    return len;
> +}
> +
>  void vmx_get_segment_register(struct vcpu *, enum x86_segment,
>                                struct segment_register *);
>  void vmx_inject_extint(int trap);
> @@ -457,7 +469,10 @@ void ept_p2m_uninit(struct p2m_domain *p2m);
>  void ept_walk_table(struct domain *d, unsigned long gfn);
>  void setup_ept_dump(void);
>  
> -void update_guest_eip(void);
> +void vmx_update_guest_eip(void);
> +void vmx_dr_access(unsigned long exit_qualification,
> +                   struct cpu_user_regs *regs);
> +void vmx_fpu_enter(struct vcpu *v);
>  
>  int alloc_p2m_hap_data(struct p2m_domain *p2m);
>  void free_p2m_hap_data(struct p2m_domain *p2m);
> -- 
> 1.7.2.3
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org 
> http://lists.xen.org/xen-devel 

  reply	other threads:[~2013-07-18 12:30 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-18  2:32 [PATCH 00/24][V8]PVH xen: Phase I, Version 8 patches Mukesh Rathor
2013-07-18  2:32 ` [PATCH 01/24] PVH xen: Add readme docs/misc/pvh-readme.txt Mukesh Rathor
2013-07-18 10:09   ` Ian Campbell
2013-07-18 18:21     ` Mukesh Rathor
2013-07-19  9:16       ` Ian Campbell
2013-07-19 21:33         ` Mukesh Rathor
2013-07-22 18:21           ` Ian Campbell
2013-07-18 10:32   ` Jan Beulich
2013-07-18 10:40     ` Ian Campbell
2013-07-22 19:29     ` Konrad Rzeszutek Wilk
2013-07-18  2:32 ` [PATCH 02/24] PVH xen: update __XEN_LATEST_INTERFACE_VERSION__ Mukesh Rathor
2013-07-18 10:33   ` Jan Beulich
2013-07-18  2:32 ` [PATCH 03/24] PVH xen: turn gdb_frames/gdt_ents into union Mukesh Rathor
2013-07-22 19:22   ` Konrad Rzeszutek Wilk
2013-07-18  2:32 ` [PATCH 04/24] PVH xen: add params to read_segment_register Mukesh Rathor
2013-07-18  2:32 ` [PATCH 05/24] PVH xen: Move e820 fields out of pv_domain struct Mukesh Rathor
2013-07-18  2:32 ` [PATCH 06/24] PVH xen: hvm related preparatory changes for PVH Mukesh Rathor
2013-07-18 10:37   ` Jan Beulich
2013-07-18  2:32 ` [PATCH 07/24] PVH xen: vmx " Mukesh Rathor
2013-07-18 12:29   ` Jan Beulich [this message]
2013-07-18  2:32 ` [PATCH 08/24] PVH xen: vmcs " Mukesh Rathor
2013-07-18 12:32   ` Jan Beulich
2013-07-18  2:32 ` [PATCH 09/24] PVH xen: Introduce PVH guest type and some basic changes Mukesh Rathor
2013-07-18 12:43   ` Jan Beulich
2013-07-18 18:28     ` Mukesh Rathor
2013-07-18  2:32 ` [PATCH 10/24] PVH xen: introduce pvh_set_vcpu_info() and vmx_pvh_set_vcpu_info() Mukesh Rathor
2013-07-18 13:14   ` Jan Beulich
2013-07-18 18:37     ` Mukesh Rathor
2013-07-18  2:32 ` [PATCH 11/24] PVH xen: domain create, schedular related code changes Mukesh Rathor
2013-07-18 13:16   ` Jan Beulich
2013-07-18  2:32 ` [PATCH 12/24] PVH xen: support invalid op emulation for PVH Mukesh Rathor
2013-07-18 13:17   ` Jan Beulich
2013-07-18  2:32 ` [PATCH 13/24] PVH xen: Support privileged " Mukesh Rathor
2013-07-18 13:29   ` Jan Beulich
2013-07-18  2:32 ` [PATCH 14/24] PVH xen: interrupt/event-channel delivery to PVH Mukesh Rathor
2013-07-22 19:21   ` Konrad Rzeszutek Wilk
2013-07-18  2:32 ` [PATCH 15/24] PVH xen: additional changes to support PVH guest creation and execution Mukesh Rathor
2013-07-22 19:25   ` Konrad Rzeszutek Wilk
2013-07-18  2:33 ` [PATCH 16/24] PVH xen: mapcache and show registers Mukesh Rathor
2013-07-18  2:33 ` [PATCH 17/24] PVH xen: mtrr, tsc, grant changes Mukesh Rathor
2013-07-18  2:33 ` [PATCH 18/24] PVH xen: Checks, asserts, and limitations for PVH Mukesh Rathor
2013-07-18 13:49   ` Jan Beulich
2013-07-18  2:33 ` [PATCH 19/24] PVH xen: add hypercall support " Mukesh Rathor
2013-07-18 13:56   ` Jan Beulich
2013-07-18  2:33 ` [PATCH 20/24] PVH xen: vmcs related changes Mukesh Rathor
2013-07-18  2:33 ` [PATCH 21/24] PVH xen: HVM support of PVH guest creation/destruction Mukesh Rathor
2013-07-22 19:22   ` Konrad Rzeszutek Wilk
2013-07-18  2:33 ` [PATCH 22/24] PVH xen: VMX " Mukesh Rathor
2013-07-22 19:15   ` Konrad Rzeszutek Wilk
2013-07-18  2:33 ` [PATCH 23/24] PVH xen: preparatory patch for the pvh vmexit handler patch Mukesh Rathor
2013-07-22 19:24   ` Konrad Rzeszutek Wilk
2013-07-18  2:33 ` [PATCH 24/24] PVH xen: introduce vmexit handler for PVH Mukesh Rathor
2013-07-18 10:47 ` [PATCH 00/24][V8]PVH xen: Phase I, Version 8 patches Roger Pau Monné
2013-07-19  1:23   ` Mukesh Rathor

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=51E7FBE602000078000E5F78@nat28.tlf.novell.com \
    --to=jbeulich@suse.com \
    --cc=mukesh.rathor@oracle.com \
    --cc=xen-devel@lists.xenproject.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.