From: Bandan Das <bsd@redhat.com>
To: kvm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, Paolo Bonzini <pbonzini@redhat.com>
Subject: [RFC PATCH 2/2] KVM: emulate: clean up initializations in init_decode_cache
Date: Thu, 3 Apr 2014 18:27:50 -0400 [thread overview]
Message-ID: <1396564070-5586-3-git-send-email-bsd@redhat.com> (raw)
In-Reply-To: <1396564070-5586-1-git-send-email-bsd@redhat.com>
A lot of initializations are unnecessary as they get set to
appropriate values before actually being used. Remove some
of them and rework some others if the conditions that set
them are not true
Signed-off-by: Bandan Das <bsd@redhat.com>
---
arch/x86/include/asm/kvm_emulate.h | 16 +++++++------
arch/x86/kvm/emulate.c | 46 +++++++++++++++++++++++++++++++++-----
2 files changed, 50 insertions(+), 12 deletions(-)
diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h
index ad4cca8..ccb7911 100644
--- a/arch/x86/include/asm/kvm_emulate.h
+++ b/arch/x86/include/asm/kvm_emulate.h
@@ -315,30 +315,32 @@ struct x86_emulate_ctxt {
u8 opcode_len;
u8 b;
u8 intercept;
- u8 lock_prefix;
- u8 rep_prefix;
u8 op_bytes;
u8 ad_bytes;
u8 rex_prefix;
struct operand src;
struct operand src2;
struct operand dst;
+ int (*execute)(struct x86_emulate_ctxt *ctxt);
+ int (*check_perm)(struct x86_emulate_ctxt *ctxt);
+ u8 lock_prefix;
+ u8 rep_prefix;
bool has_seg_override;
u8 seg_override;
u64 d;
- int (*execute)(struct x86_emulate_ctxt *ctxt);
- int (*check_perm)(struct x86_emulate_ctxt *ctxt);
+ bool rip_relative;
+ /* bitmaps of registers in _regs[] that can be read */
+ u32 regs_valid;
+ /* bitmaps of registers in _regs[] that have been written */
+ u32 regs_dirty;
/* modrm */
u8 modrm;
u8 modrm_mod;
u8 modrm_reg;
u8 modrm_rm;
u8 modrm_seg;
- bool rip_relative;
unsigned long _eip;
struct operand memop;
- u32 regs_valid; /* bitmaps of registers in _regs[] that can be read */
- u32 regs_dirty; /* bitmaps of registers in _regs[] that have been written */
/* Fields above regs are cleared together. */
unsigned long _regs[NR_VCPU_REGS];
struct operand *memopp;
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 8e2b866..eac488b 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -1072,6 +1072,9 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt,
ctxt->modrm_reg = (ctxt->rex_prefix & 4) << 1; /* REX.R */
index_reg = (ctxt->rex_prefix & 2) << 2; /* REX.X */
ctxt->modrm_rm = base_reg = (ctxt->rex_prefix & 1) << 3; /* REG.B */
+ } else {
+ ctxt->modrm_reg = 0;
+ ctxt->modrm_rm = 0;
}
ctxt->modrm_mod |= (ctxt->modrm & 0xc0) >> 6;
@@ -4357,6 +4360,8 @@ done_prefixes:
if (ctxt->d & ModRM)
ctxt->modrm = insn_fetch(u8, ctxt);
+ else
+ ctxt->modrm = 0;
while (ctxt->d & GroupMask) {
switch (ctxt->d & GroupMask) {
@@ -4435,10 +4440,14 @@ done_prefixes:
ctxt->op_bytes = 16;
else if (ctxt->d & Mmx)
ctxt->op_bytes = 8;
+ } else {
+ ctxt->intercept = 0;
+ ctxt->check_perm = NULL;
}
/* ModRM and SIB bytes. */
if (ctxt->d & ModRM) {
+ ctxt->modrm_mod = 0;
rc = decode_modrm(ctxt, &ctxt->memop);
if (!ctxt->has_seg_override)
set_seg_override(ctxt, ctxt->modrm_seg);
@@ -4552,14 +4561,41 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *))
void init_decode_cache(struct x86_emulate_ctxt *ctxt)
{
- memset(&ctxt->opcode_len, 0,
- (void *)&ctxt->_regs - (void *)&ctxt->opcode_len);
- ctxt->fetch.start = 0;
- ctxt->fetch.end = 0;
+ /*
+ * Variables that don't require initializing to 0
+ * opcode_len - set in x86_decode_insn
+ * b - set in x86_decode_insn
+ * intercept - conditionally set in x86_decode_insn, added
+ * else set to 0
+ * op_bytes - initialized in x86_decode_insn
+ * ad_bytes - initialized in x86_decode_insn
+ * rex_prefix - conditionally set in x86_decode_isn
+ * struct operands src,src2,dst - set by calling decode_operand
+ * in x86_decode_insn,
+ * default.type = OP_NONE
+ * (*execute) - set in x86_decode_insn
+ * (*check_perm) - conditionally set in x86_decode_insn, added
+ * else set to 0
+ * d - set in x86_decode_insn
+ * modrm - conditionally set in x86_decode_insn, added else set to 0
+ * modrm_mod - or'ed in decode_modrm which is conditionally called in
+ * in x86_decode_insn, added initialization to 0 before call
+ * modrm_reg - set in decode_modrm or else decode_register_operand
+ * modrm_rm - set in decode_modrm, added else set to 0
+ * modrm_seg - set in decode_modrm
+ * _eip - set in x86_decode_insn
+ * memop - .type set to OP_NONE in x86_decode_insn
+ * ctxt->fetch.start - set in x86_decode_insn
+ * ctxt->fetch.end
+ * ctxt->mem_read.pos - set in x86_emulate_insn
+ */
+
+ memset(&ctxt->lock_prefix, 0,
+ (void *)&ctxt->modrm - (void *)&ctxt->lock_prefix);
+
ctxt->io_read.pos = 0;
ctxt->io_read.end = 0;
- ctxt->mem_read.pos = 0;
ctxt->mem_read.end = 0;
}
--
1.8.3.1
next prev parent reply other threads:[~2014-04-03 22:27 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-03 22:27 [RFC PATCH 0/2] Emulator speedups - avoid initializations where possible Bandan Das
2014-04-03 22:27 ` [RFC PATCH 1/2] KVM: emulate: move init_decode_cache to emulate.c Bandan Das
2014-04-03 22:27 ` Bandan Das [this message]
2014-04-04 9:47 ` [RFC PATCH 2/2] KVM: emulate: clean up initializations in init_decode_cache Paolo Bonzini
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=1396564070-5586-3-git-send-email-bsd@redhat.com \
--to=bsd@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.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.