From: Avi Kivity <avi@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: kvm@vger.kernel.org,
Guillaume Thouvenin <guillaume.thouvenin@ext.bull.net>
Subject: [PATCH 16/25] KVM: x86 emulator: Add DstAcc operand type
Date: Sun, 28 Sep 2008 18:44:52 +0300 [thread overview]
Message-ID: <1222616701-1206-17-git-send-email-avi@redhat.com> (raw)
In-Reply-To: <1222616701-1206-1-git-send-email-avi@redhat.com>
From: Guillaume Thouvenin <guillaume.thouvenin@ext.bull.net>
Add DstAcc operand type. That means that there are 4 bits now for
DstMask.
"In the good old days cpus would have only one register that was able to
fully participate in arithmetic operations, typically called A for
Accumulator. The x86 retains this tradition by having special, shorter
encodings for the A register (like the cmp opcode), and even some
instructions that only operate on A (like mul).
SrcAcc and DstAcc would accommodate these instructions by decoding A
into the corresponding 'struct operand'."
-- Avi Kivity
Signed-off-by: Guillaume Thouvenin <guillaume.thouvenin@ext.bull.net>
Signed-off-by: Avi Kivity <avi@qumranet.com>
---
arch/x86/kvm/x86_emulate.c | 50 +++++++++++++++++++++++++++++--------------
1 files changed, 34 insertions(+), 16 deletions(-)
diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
index 0c120c4..4390ec8 100644
--- a/arch/x86/kvm/x86_emulate.c
+++ b/arch/x86/kvm/x86_emulate.c
@@ -47,25 +47,26 @@
#define ImplicitOps (1<<1) /* Implicit in opcode. No generic decode. */
#define DstReg (2<<1) /* Register operand. */
#define DstMem (3<<1) /* Memory operand. */
-#define DstMask (3<<1)
+#define DstAcc (4<<1) /* Destination Accumulator */
+#define DstMask (7<<1)
/* Source operand type. */
-#define SrcNone (0<<3) /* No source operand. */
-#define SrcImplicit (0<<3) /* Source operand is implicit in the opcode. */
-#define SrcReg (1<<3) /* Register operand. */
-#define SrcMem (2<<3) /* Memory operand. */
-#define SrcMem16 (3<<3) /* Memory operand (16-bit). */
-#define SrcMem32 (4<<3) /* Memory operand (32-bit). */
-#define SrcImm (5<<3) /* Immediate operand. */
-#define SrcImmByte (6<<3) /* 8-bit sign-extended immediate operand. */
-#define SrcMask (7<<3)
+#define SrcNone (0<<4) /* No source operand. */
+#define SrcImplicit (0<<4) /* Source operand is implicit in the opcode. */
+#define SrcReg (1<<4) /* Register operand. */
+#define SrcMem (2<<4) /* Memory operand. */
+#define SrcMem16 (3<<4) /* Memory operand (16-bit). */
+#define SrcMem32 (4<<4) /* Memory operand (32-bit). */
+#define SrcImm (5<<4) /* Immediate operand. */
+#define SrcImmByte (6<<4) /* 8-bit sign-extended immediate operand. */
+#define SrcMask (7<<4)
/* Generic ModRM decode. */
-#define ModRM (1<<6)
+#define ModRM (1<<7)
/* Destination is only written; never read. */
-#define Mov (1<<7)
-#define BitOp (1<<8)
-#define MemAbs (1<<9) /* Memory operand is absolute displacement */
-#define String (1<<10) /* String instruction (rep capable) */
-#define Stack (1<<11) /* Stack instruction (push/pop) */
+#define Mov (1<<8)
+#define BitOp (1<<9)
+#define MemAbs (1<<10) /* Memory operand is absolute displacement */
+#define String (1<<12) /* String instruction (rep capable) */
+#define Stack (1<<13) /* Stack instruction (push/pop) */
#define Group (1<<14) /* Bits 3:5 of modrm byte extend opcode */
#define GroupDual (1<<15) /* Alternate decoding of mod == 3 */
#define GroupMask 0xff /* Group number stored in bits 0:7 */
@@ -1060,6 +1061,23 @@ done_prefixes:
}
c->dst.type = OP_MEM;
break;
+ case DstAcc:
+ c->dst.type = OP_REG;
+ c->dst.bytes = c->op_bytes;
+ c->dst.ptr = &c->regs[VCPU_REGS_RAX];
+ switch (c->op_bytes) {
+ case 1:
+ c->dst.val = *(u8 *)c->dst.ptr;
+ break;
+ case 2:
+ c->dst.val = *(u16 *)c->dst.ptr;
+ break;
+ case 4:
+ c->dst.val = *(u32 *)c->dst.ptr;
+ break;
+ }
+ c->dst.orig_val = c->dst.val;
+ break;
}
if (c->rip_relative)
--
1.6.0.1
next prev parent reply other threads:[~2008-09-28 15:52 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-28 15:44 [PATCH 00/25] KVM Updates for 2.6.28 merge window (part 3 of 3) Avi Kivity
2008-09-28 15:44 ` [PATCH 01/25] KVM: x86 emulator: Add std and cld instructions (opcodes 0xfc-0xfd) Avi Kivity
2008-09-28 15:44 ` [PATCH 02/25] KVM: ia64: Implement kvm_arch_vcpu_ioctl_{set,get}_mpstate Avi Kivity
2008-09-28 15:44 ` [PATCH 03/25] KVM: MMU: Modify kvm_shadow_walk.entry to accept u64 addr Avi Kivity
2008-09-28 15:44 ` [PATCH 04/25] KVM: Add statistics for guest irq injections Avi Kivity
2008-09-28 15:44 ` [PATCH 05/25] KVM: x86 emulator: Add in/out instructions (opcodes 0xe4-0xe7, 0xec-0xef) Avi Kivity
2008-09-28 15:44 ` [PATCH 06/25] KVM: x86: do not execute halted vcpus Avi Kivity
2008-09-28 15:44 ` [PATCH 07/25] KVM: x86 emulator: Add call near absolute instruction (opcode 0xff/2) Avi Kivity
2008-09-28 15:44 ` [PATCH 08/25] KVM: x86: unhalt vcpu0 on reset Avi Kivity
2008-09-28 15:44 ` [PATCH 09/25] KVM: ppc: kvmppc_44x_shadow_release() does not require mmap_sem to be locked Avi Kivity
2008-09-28 15:44 ` [PATCH 10/25] KVM: VMX: Cleanup stalled INTR_INFO read Avi Kivity
2008-09-28 15:44 ` [PATCH 11/25] KVM: x86 emulator: fix jmp r/m64 instruction Avi Kivity
2008-09-28 15:44 ` [PATCH 12/25] add MAINTAINERS entry for the KVM AMD module Avi Kivity
2008-09-28 15:44 ` [PATCH 13/25] x86: Move VMX MSRs to msr-index.h Avi Kivity
2008-09-28 15:44 ` [PATCH 14/25] KVM: VMX: Rename IA32_FEATURE_CONTROL bits Avi Kivity
2008-09-28 15:44 ` [PATCH 15/25] x86: Move FEATURE_CONTROL bits to msr-index.h Avi Kivity
2008-09-28 15:44 ` Avi Kivity [this message]
2008-09-28 15:44 ` [PATCH 17/25] KVM: x86 emulator: Add cmp al, imm and cmp ax, imm instructions (ocodes 3c, 3d) Avi Kivity
2008-09-28 15:44 ` [PATCH 18/25] KVM: x86 emulator: Use DstAcc for 'and' Avi Kivity
2008-09-28 15:44 ` [PATCH 19/25] VT-d: Changes to support KVM Avi Kivity
2008-09-28 15:44 ` [PATCH 20/25] KVM: Device Assignment with VT-d Avi Kivity
2008-09-28 15:44 ` [PATCH 21/25] KVM: Device Assignment: Free device structures if IRQ allocation fails Avi Kivity
2008-09-28 15:44 ` [PATCH 22/25] KVM: opencode gfn_to_page in kvm_vm_fault Avi Kivity
2008-09-28 15:44 ` [PATCH 23/25] KVM: switch to get_user_pages_fast Avi Kivity
2008-09-28 15:45 ` [PATCH 24/25] KVM: x86.c make kvm_load_realmode_segment static Avi Kivity
2008-09-28 15:45 ` [PATCH 25/25] MAINTAINERS: Update Avi Kivity's email address Avi Kivity
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=1222616701-1206-17-git-send-email-avi@redhat.com \
--to=avi@redhat.com \
--cc=guillaume.thouvenin@ext.bull.net \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome