* [PATCH 4/18 V2]: PVH xen: add params to read_segment_register
@ 2013-03-16 0:28 Mukesh Rathor
2013-03-18 11:44 ` Jan Beulich
2013-03-18 14:29 ` Konrad Rzeszutek Wilk
0 siblings, 2 replies; 4+ messages in thread
From: Mukesh Rathor @ 2013-03-16 0:28 UTC (permalink / raw)
To: Xen-devel
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@oracle.com>
---
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
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 4/18 V2]: PVH xen: add params to read_segment_register
2013-03-16 0:28 [PATCH 4/18 V2]: PVH xen: add params to read_segment_register Mukesh Rathor
@ 2013-03-18 11:44 ` Jan Beulich
2013-03-19 0:23 ` Mukesh Rathor
2013-03-18 14:29 ` Konrad Rzeszutek Wilk
1 sibling, 1 reply; 4+ messages in thread
From: Jan Beulich @ 2013-03-18 11:44 UTC (permalink / raw)
To: Mukesh Rathor; +Cc: xen-devel
>>> On 16.03.13 at 01:28, Mukesh Rathor <mukesh.rathor@oracle.com> wrote:
> --- 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)
I don't see why you would need to retain this macro now that all
arguments get simply passed through.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 4/18 V2]: PVH xen: add params to read_segment_register
2013-03-16 0:28 [PATCH 4/18 V2]: PVH xen: add params to read_segment_register Mukesh Rathor
2013-03-18 11:44 ` Jan Beulich
@ 2013-03-18 14:29 ` Konrad Rzeszutek Wilk
1 sibling, 0 replies; 4+ messages in thread
From: Konrad Rzeszutek Wilk @ 2013-03-18 14:29 UTC (permalink / raw)
To: Mukesh Rathor; +Cc: Xen-devel
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@oracle.com>
Pretty simple.
Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> ---
> 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@lists.xen.org
> http://lists.xen.org/xen-devel
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 4/18 V2]: PVH xen: add params to read_segment_register
2013-03-18 11:44 ` Jan Beulich
@ 2013-03-19 0:23 ` Mukesh Rathor
0 siblings, 0 replies; 4+ messages in thread
From: Mukesh Rathor @ 2013-03-19 0:23 UTC (permalink / raw)
To: Jan Beulich; +Cc: xen-devel
On Mon, 18 Mar 2013 11:44:29 +0000
"Jan Beulich" <JBeulich@suse.com> wrote:
> >>> On 16.03.13 at 01:28, Mukesh Rathor <mukesh.rathor@oracle.com>
> >>> wrote:
> > --- 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)
>
> I don't see why you would need to retain this macro now that all
> arguments get simply passed through.
I figured they didn't use read_segment_register() in the first place,
so may be will need to be changed again in future. I'll just get rid of
it then and use read_segment_register().
thanks
m
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2013-03-19 0:23 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-03-16 0:28 [PATCH 4/18 V2]: PVH xen: add params to read_segment_register Mukesh Rathor
2013-03-18 11:44 ` Jan Beulich
2013-03-19 0:23 ` Mukesh Rathor
2013-03-18 14:29 ` Konrad Rzeszutek Wilk
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.