lkml.org 
[lkml]   [2022]   [Apr]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0564/1017] KVM: x86/emulator: Defer not-present segment check in __load_segment_descriptor()
    Date
    From: Hou Wenlong <houwenlong.hwl@antgroup.com>

    [ Upstream commit ca85f002258fdac3762c57d12d5e6e401b6a41af ]

    Per Intel's SDM on the "Instruction Set Reference", when
    loading segment descriptor, not-present segment check should
    be after all type and privilege checks. But the emulator checks
    it first, then #NP is triggered instead of #GP if privilege fails
    and segment is not present. Put not-present segment check after
    type and privilege checks in __load_segment_descriptor().

    Fixes: 38ba30ba51a00 (KVM: x86 emulator: Emulate task switch in emulator.c)
    Reviewed-by: Sean Christopherson <seanjc@google.com>
    Signed-off-by: Hou Wenlong <houwenlong.hwl@antgroup.com>
    Message-Id: <52573c01d369f506cadcf7233812427cf7db81a7.1644292363.git.houwenlong.hwl@antgroup.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/x86/kvm/emulate.c | 14 +++++++++-----
    1 file changed, 9 insertions(+), 5 deletions(-)

    diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
    index 28b1a4e57827..5705446c1213 100644
    --- a/arch/x86/kvm/emulate.c
    +++ b/arch/x86/kvm/emulate.c
    @@ -1614,11 +1614,6 @@ static int __load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
    goto exception;
    }

    - if (!seg_desc.p) {
    - err_vec = (seg == VCPU_SREG_SS) ? SS_VECTOR : NP_VECTOR;
    - goto exception;
    - }
    -
    dpl = seg_desc.dpl;

    switch (seg) {
    @@ -1658,6 +1653,10 @@ static int __load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
    case VCPU_SREG_TR:
    if (seg_desc.s || (seg_desc.type != 1 && seg_desc.type != 9))
    goto exception;
    + if (!seg_desc.p) {
    + err_vec = NP_VECTOR;
    + goto exception;
    + }
    old_desc = seg_desc;
    seg_desc.type |= 2; /* busy */
    ret = ctxt->ops->cmpxchg_emulated(ctxt, desc_addr, &old_desc, &seg_desc,
    @@ -1682,6 +1681,11 @@ static int __load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
    break;
    }

    + if (!seg_desc.p) {
    + err_vec = (seg == VCPU_SREG_SS) ? SS_VECTOR : NP_VECTOR;
    + goto exception;
    + }
    +
    if (seg_desc.s) {
    /* mark segment as accessed */
    if (!(seg_desc.type & 1)) {
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-04-05 15:25    [W:4.018 / U:0.328 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site