Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 215647
b: refs/heads/master
c: ef65c88
h: refs/heads/master
i:
  215645: 482b326
  215643: 1ed6f10
  215639: 28244bd
  215631: 9a31039
  215615: 2d15f91
v: v3
  • Loading branch information
Avi Kivity committed Oct 24, 2010
1 parent 98cd6c1 commit 04718f4
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9aabc88fc8687ba3a520e2ec459821d05f72474e
refs/heads/master: ef65c88912cafe56de2737c440aefc764fd8f202
1 change: 1 addition & 0 deletions trunk/arch/x86/include/asm/kvm_emulate.h
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ struct decode_cache {
bool has_seg_override;
u8 seg_override;
unsigned int d;
int (*execute)(struct x86_emulate_ctxt *ctxt);
unsigned long regs[NR_VCPU_REGS];
unsigned long eip;
/* modrm */
Expand Down
12 changes: 12 additions & 0 deletions trunk/arch/x86/kvm/emulate.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@
struct opcode {
u32 flags;
union {
int (*execute)(struct x86_emulate_ctxt *ctxt);
struct opcode *group;
struct group_dual *gdual;
} u;
Expand All @@ -120,6 +121,7 @@ struct group_dual {
#define N D(0)
#define G(_f, _g) { .flags = ((_f) | Group), .u.group = (_g) }
#define GD(_f, _g) { .flags = ((_f) | Group | GroupDual), .u.gdual = (_g) }
#define I(_f, _e) { .flags = (_f), .u.execute = (_e) }

static struct opcode group1[] = {
X7(D(Lock)), N
Expand Down Expand Up @@ -349,6 +351,7 @@ static struct opcode twobyte_table[256] = {
#undef N
#undef G
#undef GD
#undef I

/* EFLAGS bit definitions. */
#define EFLG_ID (1<<21)
Expand Down Expand Up @@ -1070,6 +1073,8 @@ x86_decode_insn(struct x86_emulate_ctxt *ctxt)
c->d |= opcode.flags;
}

c->execute = opcode.u.execute;

/* Unrecognised? */
if (c->d == 0 || (c->d & Undefined)) {
DPRINTF("Cannot emulate %02x\n", c->b);
Expand Down Expand Up @@ -2705,6 +2710,13 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt)

special_insn:

if (c->execute) {
rc = c->execute(ctxt);
if (rc != X86EMUL_CONTINUE)
goto done;
goto writeback;
}

if (c->twobyte)
goto twobyte_insn;

Expand Down

0 comments on commit 04718f4

Please sign in to comment.