From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966608AbbBCTgk (ORCPT ); Tue, 3 Feb 2015 14:36:40 -0500 Received: from mail-pa0-f44.google.com ([209.85.220.44]:33660 "EHLO mail-pa0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S966015AbbBCTgh (ORCPT ); Tue, 3 Feb 2015 14:36:37 -0500 Message-ID: <54D12342.6050909@amacapital.net> Date: Tue, 03 Feb 2015 11:36:34 -0800 From: Andy Lutomirski User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Borislav Petkov , X86 ML CC: LKML Subject: Re: [PATCH v1 05/12] x86, alternatives: Use optimized NOPs for padding References: <1422987390-17878-1-git-send-email-bp@alien8.de> <1422987390-17878-6-git-send-email-bp@alien8.de> In-Reply-To: <1422987390-17878-6-git-send-email-bp@alien8.de> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 02/03/2015 10:16 AM, Borislav Petkov wrote: > From: Borislav Petkov > > Alternatives allow now for empty old instruction. In this case we go > and pad the space with NOPs at assembly time. However, there are the > optimal, longer NOPs which should be used. Do that at patching time. > > Signed-off-by: Borislav Petkov > --- > arch/x86/kernel/alternative.c | 20 +++++++++++++++++++- > 1 file changed, 19 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c > index 715af37bf008..dd0cdb6b179c 100644 > --- a/arch/x86/kernel/alternative.c > +++ b/arch/x86/kernel/alternative.c > @@ -323,6 +323,21 @@ done: > n_dspl, (unsigned long)orig_insn + n_dspl + repl_len); > } > > +static void __init_or_module optimize_nops(u8 *instr, u8 max_len) > +{ > + int i = 0; > + > + while (instr[i] == 0x90 && i < max_len) > + i++; > + > + if (!i) > + return; > + > + add_nops(instr, i); > + > + DUMP_BYTES(instr, i, "%p: optimized NOPs: ", instr); > +} > + > /* > * Replace instructions with better alternatives for this CPU type. This runs > * before SMP is initialized to avoid SMP problems with self modifying code. > @@ -354,8 +369,11 @@ void __init_or_module apply_alternatives(struct alt_instr *start, > replacement = (u8 *)&a->repl_offset + a->repl_offset; > BUG_ON(a->instrlen > sizeof(insnbuf)); > BUG_ON(a->cpuid >= (NCAPINTS + NBUGINTS) * 32); > - if (!boot_cpu_has(a->cpuid)) > + if (!boot_cpu_has(a->cpuid)) { > + if (instr[0] == 0x90) > + optimize_nops(instr, a->instrlen); > continue; > + } I'm a bit confused here. Shouldn't NOPs after a non-NOP in the old instruction also be optimized? --Andy