From: Binbin Wu <binbin.wu@linux.intel.com>
To: kvm@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: seanjc@google.com, pbonzini@redhat.com, chao.gao@intel.com,
kai.huang@intel.com, David.Laight@ACULAB.COM,
robert.hu@linux.intel.com, guang.zeng@intel.com,
binbin.wu@linux.intel.com
Subject: [PATCH v11 01/16] KVM: x86: Consolidate flags for __linearize()
Date: Wed, 13 Sep 2023 20:42:12 +0800 [thread overview]
Message-ID: <20230913124227.12574-2-binbin.wu@linux.intel.com> (raw)
In-Reply-To: <20230913124227.12574-1-binbin.wu@linux.intel.com>
Consolidate @write and @fetch of __linearize() into a set of flags so that
additional flags can be added without needing more/new boolean parameters,
to precisely identify the access type.
No functional change intended.
Signed-off-by: Binbin Wu <binbin.wu@linux.intel.com>
Reviewed-by: Chao Gao <chao.gao@intel.com>
Acked-by: Kai Huang <kai.huang@intel.com>
Tested-by: Xuelian Guo <xuelian.guo@intel.com>
---
arch/x86/kvm/emulate.c | 21 +++++++++++----------
arch/x86/kvm/kvm_emulate.h | 4 ++++
2 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 2673cd5c46cb..87ee1802166a 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -687,8 +687,8 @@ static unsigned insn_alignment(struct x86_emulate_ctxt *ctxt, unsigned size)
static __always_inline int __linearize(struct x86_emulate_ctxt *ctxt,
struct segmented_address addr,
unsigned *max_size, unsigned size,
- bool write, bool fetch,
- enum x86emul_mode mode, ulong *linear)
+ enum x86emul_mode mode, ulong *linear,
+ unsigned int flags)
{
struct desc_struct desc;
bool usable;
@@ -717,11 +717,11 @@ static __always_inline int __linearize(struct x86_emulate_ctxt *ctxt,
if (!usable)
goto bad;
/* code segment in protected mode or read-only data segment */
- if ((((ctxt->mode != X86EMUL_MODE_REAL) && (desc.type & 8))
- || !(desc.type & 2)) && write)
+ if ((((ctxt->mode != X86EMUL_MODE_REAL) && (desc.type & 8)) || !(desc.type & 2)) &&
+ (flags & X86EMUL_F_WRITE))
goto bad;
/* unreadable code segment */
- if (!fetch && (desc.type & 8) && !(desc.type & 2))
+ if (!(flags & X86EMUL_F_FETCH) && (desc.type & 8) && !(desc.type & 2))
goto bad;
lim = desc_limit_scaled(&desc);
if (!(desc.type & 8) && (desc.type & 4)) {
@@ -757,8 +757,8 @@ static int linearize(struct x86_emulate_ctxt *ctxt,
ulong *linear)
{
unsigned max_size;
- return __linearize(ctxt, addr, &max_size, size, write, false,
- ctxt->mode, linear);
+ return __linearize(ctxt, addr, &max_size, size, ctxt->mode, linear,
+ write ? X86EMUL_F_WRITE : 0);
}
static inline int assign_eip(struct x86_emulate_ctxt *ctxt, ulong dst)
@@ -771,7 +771,8 @@ static inline int assign_eip(struct x86_emulate_ctxt *ctxt, ulong dst)
if (ctxt->op_bytes != sizeof(unsigned long))
addr.ea = dst & ((1UL << (ctxt->op_bytes << 3)) - 1);
- rc = __linearize(ctxt, addr, &max_size, 1, false, true, ctxt->mode, &linear);
+ rc = __linearize(ctxt, addr, &max_size, 1, ctxt->mode, &linear,
+ X86EMUL_F_FETCH);
if (rc == X86EMUL_CONTINUE)
ctxt->_eip = addr.ea;
return rc;
@@ -907,8 +908,8 @@ static int __do_insn_fetch_bytes(struct x86_emulate_ctxt *ctxt, int op_size)
* boundary check itself. Instead, we use max_size to check
* against op_size.
*/
- rc = __linearize(ctxt, addr, &max_size, 0, false, true, ctxt->mode,
- &linear);
+ rc = __linearize(ctxt, addr, &max_size, 0, ctxt->mode, &linear,
+ X86EMUL_F_FETCH);
if (unlikely(rc != X86EMUL_CONTINUE))
return rc;
diff --git a/arch/x86/kvm/kvm_emulate.h b/arch/x86/kvm/kvm_emulate.h
index be7aeb9b8ea3..e24c8ac7b930 100644
--- a/arch/x86/kvm/kvm_emulate.h
+++ b/arch/x86/kvm/kvm_emulate.h
@@ -88,6 +88,10 @@ struct x86_instruction_info {
#define X86EMUL_IO_NEEDED 5 /* IO is needed to complete emulation */
#define X86EMUL_INTERCEPTED 6 /* Intercepted by nested VMCB/VMCS */
+/* x86-specific emulation flags */
+#define X86EMUL_F_WRITE BIT(0)
+#define X86EMUL_F_FETCH BIT(1)
+
struct x86_emulate_ops {
void (*vm_bugged)(struct x86_emulate_ctxt *ctxt);
/*
--
2.25.1
next prev parent reply other threads:[~2023-09-13 15:39 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-13 12:42 [PATCH v11 00/16] LAM and LASS KVM Enabling Binbin Wu
2023-09-13 12:42 ` Binbin Wu [this message]
2023-09-13 12:42 ` [PATCH v11 02/16] KVM: x86: Use a new flag for branch targets Binbin Wu
2023-10-23 16:20 ` Sean Christopherson
2023-09-13 12:42 ` [PATCH v11 03/16] KVM: x86: Add an emulation flag for implicit system access Binbin Wu
2023-09-13 12:42 ` [PATCH v11 04/16] KVM: x86: Add X86EMUL_F_INVLPG and pass it in em_invlpg() Binbin Wu
2023-09-13 12:42 ` [PATCH v11 05/16] KVM: x86/mmu: Drop non-PA bits when getting GFN for guest's PGD Binbin Wu
2023-09-13 12:42 ` [PATCH v11 06/16] KVM: x86: Add & use kvm_vcpu_is_legal_cr3() to check CR3's legality Binbin Wu
2023-09-13 12:42 ` [PATCH v11 07/16] KVM: x86: Remove kvm_vcpu_is_illegal_gpa() Binbin Wu
2023-09-13 12:42 ` [PATCH v11 08/16] KVM: x86: Introduce get_untagged_addr() in kvm_x86_ops and call it in emulator Binbin Wu
2023-10-23 23:14 ` Sean Christopherson
2023-10-23 23:30 ` Sean Christopherson
2023-09-13 12:42 ` [PATCH v11 09/16] KVM: x86: Untag address for vmexit handlers when LAM applicable Binbin Wu
2023-09-13 12:42 ` [PATCH v11 10/16] KVM: x86: Virtualize LAM for supervisor pointer Binbin Wu
2023-09-13 12:42 ` [PATCH v11 11/16] KVM: x86: Virtualize LAM for user pointer Binbin Wu
2023-09-13 12:42 ` [PATCH v11 12/16] KVM: x86: Advertise and enable LAM (user and supervisor) Binbin Wu
2023-09-13 12:42 ` [PATCH v11 13/16] KVM: x86: Use KVM-governed feature framework to track "LAM enabled" Binbin Wu
2023-09-13 12:42 ` [PATCH v11 14/16] KVM: emulator: Add emulation of LASS violation checks on linear address Binbin Wu
2023-09-13 12:42 ` [PATCH v11 15/16] KVM: VMX: Virtualize LASS Binbin Wu
2023-09-13 12:42 ` [PATCH v11 16/16] KVM: x86: Advertise LASS CPUID to user space Binbin Wu
2023-10-08 9:37 ` [PATCH v11 00/16] LAM and LASS KVM Enabling Binbin Wu
2023-10-10 23:48 ` Sean Christopherson
2023-10-21 0:26 ` Sean Christopherson
2023-10-21 0:34 ` Sean Christopherson
2023-10-22 12:35 ` Binbin Wu
2023-10-23 23:43 ` Sean Christopherson
2023-10-24 8:31 ` Binbin Wu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230913124227.12574-2-binbin.wu@linux.intel.com \
--to=binbin.wu@linux.intel.com \
--cc=David.Laight@ACULAB.COM \
--cc=chao.gao@intel.com \
--cc=guang.zeng@intel.com \
--cc=kai.huang@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=robert.hu@linux.intel.com \
--cc=seanjc@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.