X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/43ea7558955ca453d4687c62d12efcb585124e8a..57496a500309c335ff9c60d3462757c0c5f04801:/symm/rijndael-x86ish-aesni.S diff --git a/symm/rijndael-x86ish-aesni.S b/symm/rijndael-x86ish-aesni.S index 8090bca6..e556aa53 100644 --- a/symm/rijndael-x86ish-aesni.S +++ b/symm/rijndael-x86ish-aesni.S @@ -30,8 +30,8 @@ #include "config.h" #include "asm-common.h" - .globl F(abort) - .globl F(rijndael_rcon) + .extern F(abort) + .extern F(rijndael_rcon) ///-------------------------------------------------------------------------- /// Main code. @@ -85,10 +85,10 @@ FUNC(rijndael_setup_x86ish_aesni) # define BLKOFF edx // block size in bytes // Stack the caller's registers. - push ebp - push ebx - push esi - push edi + pushreg ebp + pushreg ebx + pushreg esi + pushreg edi // Set up our own variables. mov CTX, [esp + 20] // context base pointer @@ -138,17 +138,16 @@ FUNC(rijndael_setup_x86ish_aesni) // We'll need the index registers, which belong to the caller in this // ABI. - push rsi - .seh_pushreg rsi - push rdi - .seh_pushreg rdi - .seh_endprologue + pushreg rsi + pushreg rdi // Move arguments to more useful places. mov rsi, r8 // key material mov CTX, rcx // context base pointer #endif + endprologue + // The initial round key material is taken directly from the input // key, so copy it over. #if CPUFAM_AMD64 && ABI_SYSV @@ -321,21 +320,24 @@ FUNC(rijndael_setup_x86ish_aesni) 9: // All done. #if CPUFAM_X86 - pop edi - pop esi - pop ebx - pop ebp + popreg edi + popreg esi + popreg ebx + popreg ebp #endif #if CPUFAM_AMD64 && ABI_WIN - pop rdi - pop rsi + popreg rdi + popreg rsi #endif ret - .align 16 -endswap_block: +ENDFUNC + +INTFUNC(endswap_block) // End-swap NKW words starting at SI. The end-swapping table is // already loaded into XMM5; and it's OK to work in 16-byte chunks. + endprologue + mov ecx, NKW 0: movdqu xmm1, [SI] pshufb xmm1, xmm5 @@ -343,8 +345,11 @@ endswap_block: add SI, 16 sub ecx, 4 ja 0b + ret +ENDFUNC + #undef CTX #undef BLKSZ #undef SI @@ -356,8 +361,6 @@ endswap_block: #undef LRK #undef BLKOFF -ENDFUNC - ///-------------------------------------------------------------------------- /// Encrypting and decrypting blocks. @@ -393,9 +396,10 @@ ENDFUNC # define SRC rdx # define DST r8 # define NR eax - .seh_endprologue #endif + endprologue + // Find the magic endianness-swapping table. ldgot ecx movdqa xmm5, [INTADDR(endswap_tab, ecx)] @@ -509,17 +513,21 @@ ENDFUNC ///-------------------------------------------------------------------------- /// Random utilities. - .align 16 +INTFUNC(bogus) // Abort the process because of a programming error. Indirecting // through this point serves several purposes: (a) by CALLing, rather // than branching to, `abort', we can save the return address, which // might at least provide a hint as to what went wrong; (b) we don't // have conditional CALLs (and they'd be big anyway); and (c) we can // write a HLT here as a backstop against `abort' being mad. -bogus: callext F(abort) + endprologue + + callext F(abort) 0: hlt jmp 0b +ENDFUNC + ///-------------------------------------------------------------------------- /// Data tables.