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

Re: [Xen-devel] [PATCH 4/18 V2]: PVH xen: add params to read_segment_register



On Fri, Mar 15, 2013 at 05:28:25PM -0700, Mukesh Rathor wrote:
> In this patch, read_segment_register macro is changed to take vcpu and
> regs parameters so it can check if it's PVH guest (change in upcoming
> patches). No functionality change. Also, make emulate_privileged_op()
> public for later while changing this file.
> 
> Changes in V2:  None
> 
> Signed-off-by: Mukesh Rathor <mukesh.rathor@xxxxxxxxxx>

Pretty simple.

Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>


> ---
>  xen/arch/x86/domain.c        |    8 ++++----
>  xen/arch/x86/traps.c         |   28 ++++++++++++++--------------
>  xen/arch/x86/x86_64/traps.c  |   16 ++++++++--------
>  xen/include/asm-x86/system.h |    2 +-
>  xen/include/asm-x86/traps.h  |    1 +
>  5 files changed, 28 insertions(+), 27 deletions(-)
> 
> diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
> index ea1381c..e9549e0 100644
> --- a/xen/arch/x86/domain.c
> +++ b/xen/arch/x86/domain.c
> @@ -1340,10 +1340,10 @@ static void save_segments(struct vcpu *v)
>      struct cpu_user_regs *regs = &v->arch.user_regs;
>      unsigned int dirty_segment_mask = 0;
>  
> -    regs->ds = read_segment_register(ds);
> -    regs->es = read_segment_register(es);
> -    regs->fs = read_segment_register(fs);
> -    regs->gs = read_segment_register(gs);
> +    regs->ds = read_segment_register(v, regs, ds);
> +    regs->es = read_segment_register(v, regs, es);
> +    regs->fs = read_segment_register(v, regs, fs);
> +    regs->gs = read_segment_register(v, regs, gs);
>  
>      if ( regs->ds )
>          dirty_segment_mask |= DIRTY_DS;
> diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
> index d36eddd..ab3e814 100644
> --- a/xen/arch/x86/traps.c
> +++ b/xen/arch/x86/traps.c
> @@ -1823,7 +1823,7 @@ static inline uint64_t guest_misc_enable(uint64_t val)
>      }                                                                       \
>      (eip) += sizeof(_x); _x; })
>  
> -#define read_sreg(regs, sr) read_segment_register(sr)
> +#define read_sreg(vcpu, regs, sr) read_segment_register(vcpu, regs, sr)
>  
>  static int is_cpufreq_controller(struct domain *d)
>  {
> @@ -1833,7 +1833,7 @@ static int is_cpufreq_controller(struct domain *d)
>  
>  #include "x86_64/mmconfig.h"
>  
> -static int emulate_privileged_op(struct cpu_user_regs *regs)
> +int emulate_privileged_op(struct cpu_user_regs *regs)
>  {
>      struct vcpu *v = current;
>      unsigned long *reg, eip = regs->eip;
> @@ -1869,7 +1869,7 @@ static int emulate_privileged_op(struct cpu_user_regs 
> *regs)
>          goto fail;
>  
>      /* emulating only opcodes not allowing SS to be default */
> -    data_sel = read_sreg(regs, ds);
> +    data_sel = read_sreg(v, regs, ds);
>  
>      /* Legacy prefixes. */
>      for ( i = 0; i < 8; i++, rex == opcode || (rex = 0) )
> @@ -1887,17 +1887,17 @@ static int emulate_privileged_op(struct cpu_user_regs 
> *regs)
>              data_sel = regs->cs;
>              continue;
>          case 0x3e: /* DS override */
> -            data_sel = read_sreg(regs, ds);
> +            data_sel = read_sreg(v, regs, ds);
>              continue;
>          case 0x26: /* ES override */
> -            data_sel = read_sreg(regs, es);
> +            data_sel = read_sreg(v, regs, es);
>              continue;
>          case 0x64: /* FS override */
> -            data_sel = read_sreg(regs, fs);
> +            data_sel = read_sreg(v, regs, fs);
>              lm_ovr = lm_seg_fs;
>              continue;
>          case 0x65: /* GS override */
> -            data_sel = read_sreg(regs, gs);
> +            data_sel = read_sreg(v, regs, gs);
>              lm_ovr = lm_seg_gs;
>              continue;
>          case 0x36: /* SS override */
> @@ -1944,7 +1944,7 @@ static int emulate_privileged_op(struct cpu_user_regs 
> *regs)
>  
>          if ( !(opcode & 2) )
>          {
> -            data_sel = read_sreg(regs, es);
> +            data_sel = read_sreg(v, regs, es);
>              lm_ovr = lm_seg_none;
>          }
>  
> @@ -2677,22 +2677,22 @@ static void emulate_gate_op(struct cpu_user_regs 
> *regs)
>              ASSERT(opnd_sel);
>              continue;
>          case 0x3e: /* DS override */
> -            opnd_sel = read_sreg(regs, ds);
> +            opnd_sel = read_sreg(v, regs, ds);
>              if ( !opnd_sel )
>                  opnd_sel = dpl;
>              continue;
>          case 0x26: /* ES override */
> -            opnd_sel = read_sreg(regs, es);
> +            opnd_sel = read_sreg(v, regs, es);
>              if ( !opnd_sel )
>                  opnd_sel = dpl;
>              continue;
>          case 0x64: /* FS override */
> -            opnd_sel = read_sreg(regs, fs);
> +            opnd_sel = read_sreg(v, regs, fs);
>              if ( !opnd_sel )
>                  opnd_sel = dpl;
>              continue;
>          case 0x65: /* GS override */
> -            opnd_sel = read_sreg(regs, gs);
> +            opnd_sel = read_sreg(v, regs, gs);
>              if ( !opnd_sel )
>                  opnd_sel = dpl;
>              continue;
> @@ -2745,7 +2745,7 @@ static void emulate_gate_op(struct cpu_user_regs *regs)
>                              switch ( modrm & 7 )
>                              {
>                              default:
> -                                opnd_sel = read_sreg(regs, ds);
> +                                opnd_sel = read_sreg(v, regs, ds);
>                                  break;
>                              case 4: case 5:
>                                  opnd_sel = regs->ss;
> @@ -2773,7 +2773,7 @@ static void emulate_gate_op(struct cpu_user_regs *regs)
>                              break;
>                          }
>                          if ( !opnd_sel )
> -                            opnd_sel = read_sreg(regs, ds);
> +                            opnd_sel = read_sreg(v, regs, ds);
>                          switch ( modrm & 7 )
>                          {
>                          case 0: case 2: case 4:
> diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c
> index eec919a..d2f7209 100644
> --- a/xen/arch/x86/x86_64/traps.c
> +++ b/xen/arch/x86/x86_64/traps.c
> @@ -122,10 +122,10 @@ void show_registers(struct cpu_user_regs *regs)
>          fault_crs[0] = read_cr0();
>          fault_crs[3] = read_cr3();
>          fault_crs[4] = read_cr4();
> -        fault_regs.ds = read_segment_register(ds);
> -        fault_regs.es = read_segment_register(es);
> -        fault_regs.fs = read_segment_register(fs);
> -        fault_regs.gs = read_segment_register(gs);
> +        fault_regs.ds = read_segment_register(v, regs, ds);
> +        fault_regs.es = read_segment_register(v, regs, es);
> +        fault_regs.fs = read_segment_register(v, regs, fs);
> +        fault_regs.gs = read_segment_register(v, regs, gs);
>      }
>  
>      print_xen_info();
> @@ -240,10 +240,10 @@ void do_double_fault(struct cpu_user_regs *regs)
>      crs[2] = read_cr2();
>      crs[3] = read_cr3();
>      crs[4] = read_cr4();
> -    regs->ds = read_segment_register(ds);
> -    regs->es = read_segment_register(es);
> -    regs->fs = read_segment_register(fs);
> -    regs->gs = read_segment_register(gs);
> +    regs->ds = read_segment_register(current, regs, ds);
> +    regs->es = read_segment_register(current, regs, es);
> +    regs->fs = read_segment_register(current, regs, fs);
> +    regs->gs = read_segment_register(current, regs, gs);
>  
>      printk("CPU:    %d\n", cpu);
>      _show_registers(regs, crs, CTXT_hypervisor, NULL);
> diff --git a/xen/include/asm-x86/system.h b/xen/include/asm-x86/system.h
> index b0876d6..d8dc6f2 100644
> --- a/xen/include/asm-x86/system.h
> +++ b/xen/include/asm-x86/system.h
> @@ -4,7 +4,7 @@
>  #include <xen/lib.h>
>  #include <asm/bitops.h>
>  
> -#define read_segment_register(name)                             \
> +#define read_segment_register(vcpu, regs, name)                 \
>  ({  u16 __sel;                                                  \
>      asm volatile ( "movw %%" STR(name) ",%0" : "=r" (__sel) );  \
>      __sel;                                                      \
> diff --git a/xen/include/asm-x86/traps.h b/xen/include/asm-x86/traps.h
> index 82cbcee..202e3be 100644
> --- a/xen/include/asm-x86/traps.h
> +++ b/xen/include/asm-x86/traps.h
> @@ -49,4 +49,5 @@ extern int guest_has_trap_callback(struct domain *d, 
> uint16_t vcpuid,
>  extern int send_guest_trap(struct domain *d, uint16_t vcpuid,
>                               unsigned int trap_nr);
>  
> +int emulate_privileged_op(struct cpu_user_regs *regs);
>  #endif /* ASM_TRAP_H */
> -- 
> 1.7.2.3
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel
> 

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


 


Rackspace

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