KVM: x86 emulator: Place insn_fetch helpers together
The two macros need special care to use: Assume rc, ctxt, ops and done exist outside of them. Can goto outside. Considering the fact that these are used only in decode functions, moving these right after do_insn_fetch() seems to be a right thing to improve the readability. We also rename do_fetch_insn_byte() to do_insn_fetch_byte() to be consistent. Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
parent
e76779339b
commit
67cbc90db5
|
@ -407,23 +407,6 @@ struct gprefix {
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/* Fetch next part of the instruction being emulated. */
|
|
||||||
#define insn_fetch(_type, _size, _eip) \
|
|
||||||
({ unsigned long _x; \
|
|
||||||
rc = do_insn_fetch(ctxt, ops, (_eip), &_x, (_size)); \
|
|
||||||
if (rc != X86EMUL_CONTINUE) \
|
|
||||||
goto done; \
|
|
||||||
(_eip) += (_size); \
|
|
||||||
(_type)_x; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#define insn_fetch_arr(_arr, _size, _eip) \
|
|
||||||
({ rc = do_insn_fetch(ctxt, ops, (_eip), _arr, (_size)); \
|
|
||||||
if (rc != X86EMUL_CONTINUE) \
|
|
||||||
goto done; \
|
|
||||||
(_eip) += (_size); \
|
|
||||||
})
|
|
||||||
|
|
||||||
static int emulator_check_intercept(struct x86_emulate_ctxt *ctxt,
|
static int emulator_check_intercept(struct x86_emulate_ctxt *ctxt,
|
||||||
enum x86_intercept intercept,
|
enum x86_intercept intercept,
|
||||||
enum x86_intercept_stage stage)
|
enum x86_intercept_stage stage)
|
||||||
|
@ -671,7 +654,7 @@ static int segmented_read_std(struct x86_emulate_ctxt *ctxt,
|
||||||
return ctxt->ops->read_std(ctxt, linear, data, size, &ctxt->exception);
|
return ctxt->ops->read_std(ctxt, linear, data, size, &ctxt->exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int do_fetch_insn_byte(struct x86_emulate_ctxt *ctxt,
|
static int do_insn_fetch_byte(struct x86_emulate_ctxt *ctxt,
|
||||||
struct x86_emulate_ops *ops,
|
struct x86_emulate_ops *ops,
|
||||||
unsigned long eip, u8 *dest)
|
unsigned long eip, u8 *dest)
|
||||||
{
|
{
|
||||||
|
@ -707,13 +690,30 @@ static int do_insn_fetch(struct x86_emulate_ctxt *ctxt,
|
||||||
if (eip + size - ctxt->eip > 15)
|
if (eip + size - ctxt->eip > 15)
|
||||||
return X86EMUL_UNHANDLEABLE;
|
return X86EMUL_UNHANDLEABLE;
|
||||||
while (size--) {
|
while (size--) {
|
||||||
rc = do_fetch_insn_byte(ctxt, ops, eip++, dest++);
|
rc = do_insn_fetch_byte(ctxt, ops, eip++, dest++);
|
||||||
if (rc != X86EMUL_CONTINUE)
|
if (rc != X86EMUL_CONTINUE)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
return X86EMUL_CONTINUE;
|
return X86EMUL_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Fetch next part of the instruction being emulated. */
|
||||||
|
#define insn_fetch(_type, _size, _eip) \
|
||||||
|
({ unsigned long _x; \
|
||||||
|
rc = do_insn_fetch(ctxt, ops, (_eip), &_x, (_size)); \
|
||||||
|
if (rc != X86EMUL_CONTINUE) \
|
||||||
|
goto done; \
|
||||||
|
(_eip) += (_size); \
|
||||||
|
(_type)_x; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define insn_fetch_arr(_arr, _size, _eip) \
|
||||||
|
({ rc = do_insn_fetch(ctxt, ops, (_eip), _arr, (_size)); \
|
||||||
|
if (rc != X86EMUL_CONTINUE) \
|
||||||
|
goto done; \
|
||||||
|
(_eip) += (_size); \
|
||||||
|
})
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Given the 'reg' portion of a ModRM byte, and a register block, return a
|
* Given the 'reg' portion of a ModRM byte, and a register block, return a
|
||||||
* pointer into the block that addresses the relevant register.
|
* pointer into the block that addresses the relevant register.
|
||||||
|
|
Loading…
Reference in New Issue