[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86/pv: Factor out the calculation of LDT/GDT descriptor pointers
commit 6dab6c583ead41646428aa693dad85b916751083 Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> AuthorDate: Fri Oct 13 10:55:00 2017 +0000 Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CommitDate: Fri Dec 1 19:03:27 2017 +0000 x86/pv: Factor out the calculation of LDT/GDT descriptor pointers Rather than opencoding it in two places. While only used in the PV emulation code, this helper is in principle usable anywhere in the hypervisor. No functional change. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Reviewed-by: Wei Liu <wei.liu2@xxxxxxxxxx> Acked-by: Jan Beulich <jbeulich@xxxxxxxx> --- xen/arch/x86/pv/emul-gate-op.c | 5 +---- xen/arch/x86/pv/emulate.c | 6 +----- xen/arch/x86/pv/emulate.h | 11 +++++++++++ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/xen/arch/x86/pv/emul-gate-op.c b/xen/arch/x86/pv/emul-gate-op.c index 0f89c91..14ce95e 100644 --- a/xen/arch/x86/pv/emul-gate-op.c +++ b/xen/arch/x86/pv/emul-gate-op.c @@ -54,11 +54,8 @@ static int read_gate_descriptor(unsigned int gate_sel, unsigned int *ar) { struct desc_struct desc; - const struct desc_struct *pdesc; + const struct desc_struct *pdesc = gdt_ldt_desc_ptr(gate_sel); - pdesc = (const struct desc_struct *) - (!(gate_sel & 4) ? GDT_VIRT_START(v) : LDT_VIRT_START(v)) - + (gate_sel >> 3); if ( (gate_sel < 4) || ((gate_sel >= FIRST_RESERVED_GDT_BYTE) && !(gate_sel & 4)) || __get_user(desc, pdesc) ) diff --git a/xen/arch/x86/pv/emulate.c b/xen/arch/x86/pv/emulate.c index 5750c76..1b60911 100644 --- a/xen/arch/x86/pv/emulate.c +++ b/xen/arch/x86/pv/emulate.c @@ -33,11 +33,7 @@ int pv_emul_read_descriptor(unsigned int sel, const struct vcpu *v, if ( sel < 4) desc.b = desc.a = 0; - else if ( __get_user(desc, - (const struct desc_struct *)(!(sel & 4) - ? GDT_VIRT_START(v) - : LDT_VIRT_START(v)) - + (sel >> 3)) ) + else if ( __get_user(desc, gdt_ldt_desc_ptr(sel)) ) return 0; if ( !insn_fetch ) desc.b &= ~_SEGMENT_L; diff --git a/xen/arch/x86/pv/emulate.h b/xen/arch/x86/pv/emulate.h index 656c12f..9d58794 100644 --- a/xen/arch/x86/pv/emulate.h +++ b/xen/arch/x86/pv/emulate.h @@ -1,6 +1,7 @@ #ifndef __PV_EMULATE_H__ #define __PV_EMULATE_H__ +#include <asm/processor.h> #include <asm/x86_emulate.h> int pv_emul_read_descriptor(unsigned int sel, const struct vcpu *v, @@ -16,4 +17,14 @@ static inline int pv_emul_is_mem_write(const struct x86_emulate_state *state, : X86EMUL_UNHANDLEABLE; } +/* Return a pointer to the GDT/LDT descriptor referenced by sel. */ +static inline const struct desc_struct *gdt_ldt_desc_ptr(unsigned int sel) +{ + const struct vcpu *curr = current; + const struct desc_struct *tbl = (void *) + ((sel & X86_XEC_TI) ? LDT_VIRT_START(curr) : GDT_VIRT_START(curr)); + + return &tbl[sel >> 3]; +} + #endif /* __PV_EMULATE_H__ */ -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |