KVM: x86: Consolidate flags for __linearize()
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> Link: https://lore.kernel.org/r/20230913124227.12574-2-binbin.wu@linux.intel.com Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
parent
e9e60c82fe
commit
7b0dd9430c
@ -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,
|
static __always_inline int __linearize(struct x86_emulate_ctxt *ctxt,
|
||||||
struct segmented_address addr,
|
struct segmented_address addr,
|
||||||
unsigned *max_size, unsigned size,
|
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;
|
struct desc_struct desc;
|
||||||
bool usable;
|
bool usable;
|
||||||
@ -717,11 +717,11 @@ static __always_inline int __linearize(struct x86_emulate_ctxt *ctxt,
|
|||||||
if (!usable)
|
if (!usable)
|
||||||
goto bad;
|
goto bad;
|
||||||
/* code segment in protected mode or read-only data segment */
|
/* code segment in protected mode or read-only data segment */
|
||||||
if ((((ctxt->mode != X86EMUL_MODE_REAL) && (desc.type & 8))
|
if ((((ctxt->mode != X86EMUL_MODE_REAL) && (desc.type & 8)) || !(desc.type & 2)) &&
|
||||||
|| !(desc.type & 2)) && write)
|
(flags & X86EMUL_F_WRITE))
|
||||||
goto bad;
|
goto bad;
|
||||||
/* unreadable code segment */
|
/* unreadable code segment */
|
||||||
if (!fetch && (desc.type & 8) && !(desc.type & 2))
|
if (!(flags & X86EMUL_F_FETCH) && (desc.type & 8) && !(desc.type & 2))
|
||||||
goto bad;
|
goto bad;
|
||||||
lim = desc_limit_scaled(&desc);
|
lim = desc_limit_scaled(&desc);
|
||||||
if (!(desc.type & 8) && (desc.type & 4)) {
|
if (!(desc.type & 8) && (desc.type & 4)) {
|
||||||
@ -757,8 +757,8 @@ static int linearize(struct x86_emulate_ctxt *ctxt,
|
|||||||
ulong *linear)
|
ulong *linear)
|
||||||
{
|
{
|
||||||
unsigned max_size;
|
unsigned max_size;
|
||||||
return __linearize(ctxt, addr, &max_size, size, write, false,
|
return __linearize(ctxt, addr, &max_size, size, ctxt->mode, linear,
|
||||||
ctxt->mode, linear);
|
write ? X86EMUL_F_WRITE : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int assign_eip(struct x86_emulate_ctxt *ctxt, ulong dst)
|
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))
|
if (ctxt->op_bytes != sizeof(unsigned long))
|
||||||
addr.ea = dst & ((1UL << (ctxt->op_bytes << 3)) - 1);
|
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)
|
if (rc == X86EMUL_CONTINUE)
|
||||||
ctxt->_eip = addr.ea;
|
ctxt->_eip = addr.ea;
|
||||||
return rc;
|
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
|
* boundary check itself. Instead, we use max_size to check
|
||||||
* against op_size.
|
* against op_size.
|
||||||
*/
|
*/
|
||||||
rc = __linearize(ctxt, addr, &max_size, 0, false, true, ctxt->mode,
|
rc = __linearize(ctxt, addr, &max_size, 0, ctxt->mode, &linear,
|
||||||
&linear);
|
X86EMUL_F_FETCH);
|
||||||
if (unlikely(rc != X86EMUL_CONTINUE))
|
if (unlikely(rc != X86EMUL_CONTINUE))
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
@ -88,6 +88,10 @@ struct x86_instruction_info {
|
|||||||
#define X86EMUL_IO_NEEDED 5 /* IO is needed to complete emulation */
|
#define X86EMUL_IO_NEEDED 5 /* IO is needed to complete emulation */
|
||||||
#define X86EMUL_INTERCEPTED 6 /* Intercepted by nested VMCB/VMCS */
|
#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 {
|
struct x86_emulate_ops {
|
||||||
void (*vm_bugged)(struct x86_emulate_ctxt *ctxt);
|
void (*vm_bugged)(struct x86_emulate_ctxt *ctxt);
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user