mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-19 17:14:40 +08:00
KVM: x86: Replace memset() "optimization" with normal per-field writes
Explicitly zero select fields in the emulator's decode cache instead of zeroing the fields via a gross memset() that spans six fields. gcc and clang are both clever enough to batch the first five fields into a single quadword MOV, i.e. memset() and individually zeroing generate identical code. Removing the wart also prepares KVM for FORTIFY_SOURCE performing compile-time and run-time field bounds checking for memset(). No functional change intended. Reported-by: Kees Cook <keescook@chromium.org> Signed-off-by: Sean Christopherson <seanjc@google.com> Link: https://lore.kernel.org/lkml/YR0jIEzEcUom/7rd@google.com Signed-off-by: Kees Cook <keescook@chromium.org>
This commit is contained in:
parent
dfd42facf1
commit
73ab4a3509
@ -5380,8 +5380,13 @@ static int fastop(struct x86_emulate_ctxt *ctxt, fastop_t fop)
|
||||
|
||||
void init_decode_cache(struct x86_emulate_ctxt *ctxt)
|
||||
{
|
||||
memset(&ctxt->rip_relative, 0,
|
||||
(void *)&ctxt->modrm - (void *)&ctxt->rip_relative);
|
||||
/* Clear fields that are set conditionally but read without a guard. */
|
||||
ctxt->rip_relative = false;
|
||||
ctxt->rex_prefix = 0;
|
||||
ctxt->lock_prefix = 0;
|
||||
ctxt->rep_prefix = 0;
|
||||
ctxt->regs_valid = 0;
|
||||
ctxt->regs_dirty = 0;
|
||||
|
||||
ctxt->io_read.pos = 0;
|
||||
ctxt->io_read.end = 0;
|
||||
|
@ -336,11 +336,7 @@ struct x86_emulate_ctxt {
|
||||
fastop_t fop;
|
||||
};
|
||||
int (*check_perm)(struct x86_emulate_ctxt *ctxt);
|
||||
/*
|
||||
* The following six fields are cleared together,
|
||||
* the rest are initialized unconditionally in x86_decode_insn
|
||||
* or elsewhere
|
||||
*/
|
||||
|
||||
bool rip_relative;
|
||||
u8 rex_prefix;
|
||||
u8 lock_prefix;
|
||||
|
Loading…
Reference in New Issue
Block a user