From patchwork Fri Feb 25 09:49:27 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hou Wenlong X-Patchwork-Id: 12759998 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2ABC4C433F5 for ; Fri, 25 Feb 2022 09:49:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239253AbiBYJuZ (ORCPT ); Fri, 25 Feb 2022 04:50:25 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40760 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239250AbiBYJuX (ORCPT ); Fri, 25 Feb 2022 04:50:23 -0500 Received: from out0-136.mail.aliyun.com (out0-136.mail.aliyun.com [140.205.0.136]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CD52A24FA10 for ; Fri, 25 Feb 2022 01:49:51 -0800 (PST) X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R331e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=ay29a033018047203;MF=houwenlong.hwl@antgroup.com;NM=1;PH=DS;RN=4;SR=0;TI=SMTPD_---.Mvuq7w7_1645782589; Received: from localhost(mailfrom:houwenlong.hwl@antgroup.com fp:SMTPD_---.Mvuq7w7_1645782589) by smtp.aliyun-inc.com(127.0.0.1); Fri, 25 Feb 2022 17:49:49 +0800 From: "Hou Wenlong" To: kvm@vger.kernel.org Cc: "Paolo Bonzini" , "Sean Christopherson" , "Hou Wenlong" Subject: [kvm-unit-tests PATCH v4 3/3] x86/emulator: Add some tests for far jmp instruction emulation Date: Fri, 25 Feb 2022 17:49:27 +0800 Message-Id: <62121e1866da786aac864b76091b8bfba21e0dcd.1645672780.git.houwenlong.hwl@antgroup.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Per Intel's SDM on the "Instruction Set Reference", when loading segment descriptor for far jmp, not-present segment check should be after all type and privilege checks. However, __load_segment_descriptor() in x86's emulator does not-present segment check first, so it would trigger #NP instead of #GP if type or privilege checks fail and the segment is not present. So add some tests for far jmp instruction, and it will test those tests on hardware and emulator. Enable kvm.force_emulation_prefix when try to test them on emulator. Signed-off-by: Hou Wenlong Reviewed-and-tested-by: Sean Christopherson --- x86/emulator.c | 71 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 13 deletions(-) diff --git a/x86/emulator.c b/x86/emulator.c index 7925ad48c36d..76f3c3ce8eb4 100644 --- a/x86/emulator.c +++ b/x86/emulator.c @@ -36,6 +36,7 @@ struct far_xfer_test_case { enum far_xfer_insn { FAR_XFER_RET, + FAR_XFER_JMP, }; struct far_xfer_test { @@ -64,6 +65,25 @@ static struct far_xfer_test far_ret_test = { .nr_testcases = sizeof(far_ret_testcases) / sizeof(struct far_xfer_test_case), }; +static struct far_xfer_test_case far_jmp_testcases[] = { + {0, DS_TYPE, 0, 0, false, GP_VECTOR, "desc.type!=code && desc.p=0"}, + {0, NON_CONFORM_CS_TYPE, 3, 0, false, GP_VECTOR, "non-conforming && dpl!=cpl && desc.p=0"}, + {3, NON_CONFORM_CS_TYPE, 0, 0, false, GP_VECTOR, "conforming && rpl>cpl && desc.p=0"}, + {0, CONFORM_CS_TYPE, 3, 0, false, GP_VECTOR, "conforming && dpl>cpl && desc.p=0"}, + {0, NON_CONFORM_CS_TYPE, 0, 0, false, NP_VECTOR, "desc.p=0"}, + {3, CONFORM_CS_TYPE, 0, 1, true, -1, "dpl