Commit 36955360 authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Herbert Xu
Browse files

crypto: x86/des3 - Use RIP-relative addressing



Prefer RIP-relative addressing where possible, which removes the need
for boot time relocation fixups.

Co-developed-by: default avatarThomas Garnier <thgarnie@chromium.org>
Signed-off-by: default avatarThomas Garnier <thgarnie@chromium.org>
Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 3b519dc8
Loading
Loading
Loading
Loading
+64 −32
Original line number Diff line number Diff line
@@ -129,21 +129,29 @@
	movzbl RW0bl, RT2d; \
	movzbl RW0bh, RT3d; \
	shrq $16, RW0; \
	movq s8(, RT0, 8), RT0; \
	xorq s6(, RT1, 8), to; \
	leaq s8(%rip), RW1; \
	movq (RW1, RT0, 8), RT0; \
	leaq s6(%rip), RW1; \
	xorq (RW1, RT1, 8), to; \
	movzbl RW0bl, RL1d; \
	movzbl RW0bh, RT1d; \
	shrl $16, RW0d; \
	xorq s4(, RT2, 8), RT0; \
	xorq s2(, RT3, 8), to; \
	leaq s4(%rip), RW1; \
	xorq (RW1, RT2, 8), RT0; \
	leaq s2(%rip), RW1; \
	xorq (RW1, RT3, 8), to; \
	movzbl RW0bl, RT2d; \
	movzbl RW0bh, RT3d; \
	xorq s7(, RL1, 8), RT0; \
	xorq s5(, RT1, 8), to; \
	xorq s3(, RT2, 8), RT0; \
	leaq s7(%rip), RW1; \
	xorq (RW1, RL1, 8), RT0; \
	leaq s5(%rip), RW1; \
	xorq (RW1, RT1, 8), to; \
	leaq s3(%rip), RW1; \
	xorq (RW1, RT2, 8), RT0; \
	load_next_key(n, RW0); \
	xorq RT0, to; \
	xorq s1(, RT3, 8), to; \
	leaq s1(%rip), RW1; \
	xorq (RW1, RT3, 8), to; \

#define load_next_key(n, RWx) \
	movq (((n) + 1) * 8)(CTX), RWx;
@@ -355,65 +363,89 @@ SYM_FUNC_END(des3_ede_x86_64_crypt_blk)
	movzbl RW0bl, RT3d; \
	movzbl RW0bh, RT1d; \
	shrq $16, RW0; \
	xorq s8(, RT3, 8), to##0; \
	xorq s6(, RT1, 8), to##0; \
	leaq s8(%rip), RT2; \
	xorq (RT2, RT3, 8), to##0; \
	leaq s6(%rip), RT2; \
	xorq (RT2, RT1, 8), to##0; \
	movzbl RW0bl, RT3d; \
	movzbl RW0bh, RT1d; \
	shrq $16, RW0; \
	xorq s4(, RT3, 8), to##0; \
	xorq s2(, RT1, 8), to##0; \
	leaq s4(%rip), RT2; \
	xorq (RT2, RT3, 8), to##0; \
	leaq s2(%rip), RT2; \
	xorq (RT2, RT1, 8), to##0; \
	movzbl RW0bl, RT3d; \
	movzbl RW0bh, RT1d; \
	shrl $16, RW0d; \
	xorq s7(, RT3, 8), to##0; \
	xorq s5(, RT1, 8), to##0; \
	leaq s7(%rip), RT2; \
	xorq (RT2, RT3, 8), to##0; \
	leaq s5(%rip), RT2; \
	xorq (RT2, RT1, 8), to##0; \
	movzbl RW0bl, RT3d; \
	movzbl RW0bh, RT1d; \
	load_next_key(n, RW0); \
	xorq s3(, RT3, 8), to##0; \
	xorq s1(, RT1, 8), to##0; \
	leaq s3(%rip), RT2; \
	xorq (RT2, RT3, 8), to##0; \
	leaq s1(%rip), RT2; \
	xorq (RT2, RT1, 8), to##0; \
		xorq from##1, RW1; \
		movzbl RW1bl, RT3d; \
		movzbl RW1bh, RT1d; \
		shrq $16, RW1; \
		xorq s8(, RT3, 8), to##1; \
		xorq s6(, RT1, 8), to##1; \
		leaq s8(%rip), RT2; \
		xorq (RT2, RT3, 8), to##1; \
		leaq s6(%rip), RT2; \
		xorq (RT2, RT1, 8), to##1; \
		movzbl RW1bl, RT3d; \
		movzbl RW1bh, RT1d; \
		shrq $16, RW1; \
		xorq s4(, RT3, 8), to##1; \
		xorq s2(, RT1, 8), to##1; \
		leaq s4(%rip), RT2; \
		xorq (RT2, RT3, 8), to##1; \
		leaq s2(%rip), RT2; \
		xorq (RT2, RT1, 8), to##1; \
		movzbl RW1bl, RT3d; \
		movzbl RW1bh, RT1d; \
		shrl $16, RW1d; \
		xorq s7(, RT3, 8), to##1; \
		xorq s5(, RT1, 8), to##1; \
		leaq s7(%rip), RT2; \
		xorq (RT2, RT3, 8), to##1; \
		leaq s5(%rip), RT2; \
		xorq (RT2, RT1, 8), to##1; \
		movzbl RW1bl, RT3d; \
		movzbl RW1bh, RT1d; \
		do_movq(RW0, RW1); \
		xorq s3(, RT3, 8), to##1; \
		xorq s1(, RT1, 8), to##1; \
		leaq s3(%rip), RT2; \
		xorq (RT2, RT3, 8), to##1; \
		leaq s1(%rip), RT2; \
		xorq (RT2, RT1, 8), to##1; \
			xorq from##2, RW2; \
			movzbl RW2bl, RT3d; \
			movzbl RW2bh, RT1d; \
			shrq $16, RW2; \
			xorq s8(, RT3, 8), to##2; \
			xorq s6(, RT1, 8), to##2; \
			leaq s8(%rip), RT2; \
			xorq (RT2, RT3, 8), to##2; \
			leaq s6(%rip), RT2; \
			xorq (RT2, RT1, 8), to##2; \
			movzbl RW2bl, RT3d; \
			movzbl RW2bh, RT1d; \
			shrq $16, RW2; \
			xorq s4(, RT3, 8), to##2; \
			xorq s2(, RT1, 8), to##2; \
			leaq s4(%rip), RT2; \
			xorq (RT2, RT3, 8), to##2; \
			leaq s2(%rip), RT2; \
			xorq (RT2, RT1, 8), to##2; \
			movzbl RW2bl, RT3d; \
			movzbl RW2bh, RT1d; \
			shrl $16, RW2d; \
			xorq s7(, RT3, 8), to##2; \
			xorq s5(, RT1, 8), to##2; \
			leaq s7(%rip), RT2; \
			xorq (RT2, RT3, 8), to##2; \
			leaq s5(%rip), RT2; \
			xorq (RT2, RT1, 8), to##2; \
			movzbl RW2bl, RT3d; \
			movzbl RW2bh, RT1d; \
			do_movq(RW0, RW2); \
			xorq s3(, RT3, 8), to##2; \
			xorq s1(, RT1, 8), to##2;
			leaq s3(%rip), RT2; \
			xorq (RT2, RT3, 8), to##2; \
			leaq s1(%rip), RT2; \
			xorq (RT2, RT1, 8), to##2;

#define __movq(src, dst) \
	movq src, dst;