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: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <alpine.LFD.2.01.0909301304310.6996@localhost.localdomain>
Date:	Wed, 30 Sep 2009 13:19:54 -0700 (PDT)
From:	Linus Torvalds <torvalds@...ux-foundation.org>
To:	Arjan van de Ven <arjan@...radead.org>
cc:	Eric Dumazet <eric.dumazet@...il.com>,
	Martin Schwidefsky <schwidefsky@...ibm.com>,
	Thomas Gleixner <tglx@...utronix.de>,
	John Stultz <johnstul@...ibm.com>,
	Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
	Peter Zijlstra <a.p.zijlstra@...llo.nl>,
	Ingo Molnar <mingo@...e.hu>
Subject: Re: Linux 2.6.32-rc1



On Wed, 30 Sep 2009, Arjan van de Ven wrote:
> +ENTRY(cmpxchg8b_emu)
> +	CFI_STARTPROC
> +
> +	push %edi
> +	push %ebx
> +	push %ecx
> +	/* disable interrupts */
> +	pushf
> +	pop %edi
> +	cli
> +
> +	cmpl %edx, 4(%esi)
> +	jne 1f
> +	cmpl %eax, (%esi)
> +	jne 1f
> +
> +	xchg (%esi), %ebx
> +	xchg 4(%esi), %ecx
> +	mov %ebx, %eax
> +	mov %ecx, %edx

Ok, so why do you do this? You've just checked that the 8 bytes at esi are 
the same as edx:eax, why do you do that odd xchg?

Why isn't this part just

	mov %ebx,(%esi)
	mov %ecx,4(%esi)

and leave ebx/ecx alone?

I also don't see why you play games with eflags and %edi. Just leave the 
flags on the stack. So it all would look like

	#
	# Emulate 'cmpxchg8b (%esi)' except we don't
	# set the whole ZF thing (caller will just
	# compare eax:edx with the expected value)
	#
	cmpxchg8b_emu:
		pushfl
		cli
		cmpl (%esi),%eax
		jne not_same
		cmpl 4(%esi),%edx
		jne not_same
		movl %ebx,(%esi)
		movl %ecx,4(%esi)
		popfl
		ret
	not_same:
		movl (%esi),%eax
		movl 4(%esi),%edx
		popfl
		ret

I dunno. You _could_ use edi/ebp as a temporary for 'dest' to only do the 
load once (and add push/pop to save the registers), but it's not like the 
above is really atomic anyway, and it very much depends on 'cli' just 
making sure that nothing else happens. So the above seems to be the 
simplest emulation, considering the interfaces..

UNTESTED! I wrote this in an email editor. I haven't assembled it or 
verified the semantics or workingness in any way, shape or form.

			Linus
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ