lkml.org 
[lkml]   [2017]   [Nov]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [PATCH 3/5] KVM: x86: emulate sldt and str
    2017-11-13 22:40 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
    > These are needed to handle the descriptor table vmexits when emulating
    > UMIP.
    >
    > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

    Reviewed-by: Wanpeng Li <wanpeng.li@hotmail.com>

    > ---
    > arch/x86/kvm/emulate.c | 32 ++++++++++++++++++++++++++------
    > 1 file changed, 26 insertions(+), 6 deletions(-)
    >
    > diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
    > index d27339332ac8..da2c5590240a 100644
    > --- a/arch/x86/kvm/emulate.c
    > +++ b/arch/x86/kvm/emulate.c
    > @@ -3638,17 +3638,27 @@ static int em_rdmsr(struct x86_emulate_ctxt *ctxt)
    > return X86EMUL_CONTINUE;
    > }
    >
    > -static int em_mov_rm_sreg(struct x86_emulate_ctxt *ctxt)
    > +static int em_store_sreg(struct x86_emulate_ctxt *ctxt, int segment)
    > {
    > - if (ctxt->modrm_reg > VCPU_SREG_GS)
    > - return emulate_ud(ctxt);
    > + if (segment > VCPU_SREG_GS &&
    > + (ctxt->ops->get_cr(ctxt, 4) & X86_CR4_UMIP) &&
    > + ctxt->ops->cpl(ctxt) > 0)
    > + return emulate_gp(ctxt, 0);
    >
    > - ctxt->dst.val = get_segment_selector(ctxt, ctxt->modrm_reg);
    > + ctxt->dst.val = get_segment_selector(ctxt, segment);
    > if (ctxt->dst.bytes == 4 && ctxt->dst.type == OP_MEM)
    > ctxt->dst.bytes = 2;
    > return X86EMUL_CONTINUE;
    > }
    >
    > +static int em_mov_rm_sreg(struct x86_emulate_ctxt *ctxt)
    > +{
    > + if (ctxt->modrm_reg > VCPU_SREG_GS)
    > + return emulate_ud(ctxt);
    > +
    > + return em_store_sreg(ctxt, ctxt->modrm_reg);
    > +}
    > +
    > static int em_mov_sreg_rm(struct x86_emulate_ctxt *ctxt)
    > {
    > u16 sel = ctxt->src.val;
    > @@ -3664,6 +3674,11 @@ static int em_mov_sreg_rm(struct x86_emulate_ctxt *ctxt)
    > return load_segment_descriptor(ctxt, sel, ctxt->modrm_reg);
    > }
    >
    > +static int em_sldt(struct x86_emulate_ctxt *ctxt)
    > +{
    > + return em_store_sreg(ctxt, VCPU_SREG_LDTR);
    > +}
    > +
    > static int em_lldt(struct x86_emulate_ctxt *ctxt)
    > {
    > u16 sel = ctxt->src.val;
    > @@ -3673,6 +3688,11 @@ static int em_lldt(struct x86_emulate_ctxt *ctxt)
    > return load_segment_descriptor(ctxt, sel, VCPU_SREG_LDTR);
    > }
    >
    > +static int em_str(struct x86_emulate_ctxt *ctxt)
    > +{
    > + return em_store_sreg(ctxt, VCPU_SREG_TR);
    > +}
    > +
    > static int em_ltr(struct x86_emulate_ctxt *ctxt)
    > {
    > u16 sel = ctxt->src.val;
    > @@ -4365,8 +4385,8 @@ static int check_perm_out(struct x86_emulate_ctxt *ctxt)
    > };
    >
    > static const struct opcode group6[] = {
    > - DI(Prot | DstMem, sldt),
    > - DI(Prot | DstMem, str),
    > + II(Prot | DstMem, em_sldt, sldt),
    > + II(Prot | DstMem, em_str, str),
    > II(Prot | Priv | SrcMem16, em_lldt, lldt),
    > II(Prot | Priv | SrcMem16, em_ltr, ltr),
    > N, N, N, N,
    > --
    > 1.8.3.1
    >
    >

    \
     
     \ /
      Last update: 2017-11-15 01:42    [W:2.729 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site