lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <YFhStWee0OrxBn5F@hirez.programming.kicks-ass.net>
Date:   Mon, 22 Mar 2021 09:17:57 +0100
From:   Peter Zijlstra <peterz@...radead.org>
To:     Borislav Petkov <bp@...en8.de>
Cc:     x86@...nel.org, jpoimboe@...hat.com, jgross@...e.com,
        mbenes@...e.com, linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2 02/14] x86/alternatives: Optimize optimize_nops()

On Sun, Mar 21, 2021 at 01:06:47PM +0100, Borislav Petkov wrote:

> I think I've made this simpler; pasting the whole function and not the
> diff because former is easier to read:

You've make it only replace a single stream of NOPs. Which is probably
fine, but... :-)

So mine, while a little more complicated, will replace any number of NOP
streams in any location. Saves having to worry about if we missed some
stupid corner case somewhere.

Anyway, I think I got it slightly wrong.. How's this one?

---

static void __init_or_module noinline optimize_nops(struct alt_instr *a, u8 *instr)
{
	int nops = 0, i = 0;
	bool done = false;
	struct insn insn;
	u8 *nop = NULL;

	do {
		if (insn_decode_kernel(&insn, &instr[i]))
			return;

		if (insn.length == 1 && insn.opcode.bytes[0] == 0x90)
			nops++;
		else if (nops)
			nop = &instr[i - nops];

		if (i + insn.length >= a->instrlen) {
			nop = &instr[i - nops];
			done = true;
		}

		if (nop) {
			unsigned long flags;

			local_irq_save(flags);
			add_nops(nop, nops);
			local_irq_restore(flags);

			DUMP_BYTES(instr, a->instrlen, "%px: [%d:%d) optimized NOPs: ",
				   instr, (int)(unsigned long)(nop-instr), nops);

			nops = 0;
			nop = NULL;
		}

		i += insn.length;

	} while (!done);

	WARN_ON_ONCE(nop);
}

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ