]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
crypto: x86/aes-xts - improve some comments
authorEric Biggers <ebiggers@google.com>
Thu, 12 Dec 2024 21:28:42 +0000 (13:28 -0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 21 Dec 2024 14:46:24 +0000 (22:46 +0800)
Improve some of the comments in aes-xts-avx-x86_64.S.

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
arch/x86/crypto/aes-xts-avx-x86_64.S

index ca69e6480cb68746d43a91738d049ac968bf2a35..903b894e5f48f6d387c389b451621fd37f23c6f3 100644 (file)
 
 // Do one step in computing the next set of tweaks using the VPCLMULQDQ method
 // (the same method _next_tweakvec uses for VL > 16).  This means multiplying
-// each tweak by x^(4*VL/16) independently.  Since 4*VL/16 is a multiple of 8
-// when VL > 16 (which it is here), the needed shift amounts are byte-aligned,
-// which allows the use of vpsrldq and vpslldq to do 128-bit wide shifts.
+// each tweak by x^(4*VL/16) independently.
+//
+// Since 4*VL/16 is a multiple of 8 when VL > 16 (which it is here), the needed
+// shift amounts are byte-aligned, which allows the use of vpsrldq and vpslldq
+// to do 128-bit wide shifts.  The 128-bit left shift (vpslldq) saves
+// instructions directly.  The 128-bit right shift (vpsrldq) performs better
+// than a 64-bit right shift on Intel CPUs in the context where it is used here,
+// because it runs on a different execution port from the AES instructions.
 .macro _tweak_step_pclmul      i
 .if \i == 0
        vpsrldq         $(128 - 4*VL/16) / 8, TWEAK0, NEXT_TWEAK0
 // \i that include at least 0 through 19, then 1000 which signals the last step.
 //
 // This is used to interleave the computation of the next set of tweaks with the
-// AES en/decryptions, which increases performance in some cases.
+// AES en/decryptions, which increases performance in some cases.  Clobbers V5.
 .macro _tweak_step     i
 .if VL == 16
        _tweak_step_mulx        \i
        // the last round needs different instructions.
        //
        // An alternative approach would be to roll up all the round loops.  We
-       // don't do that because it isn't compatible with caching the round keys
-       // in registers which we do when possible (see below), and also because
-       // it seems unwise to rely *too* heavily on the CPU's branch predictor.
+       // don't do that because (a) it isn't compatible with caching the round
+       // keys in registers which we do when possible (see below), (b) we
+       // interleave the AES rounds with the XTS tweak computation, and (c) it
+       // seems unwise to rely *too* heavily on the CPU's branch predictor.
        lea             OFFS-16(KEY, KEYLEN64, 4), KEY
 
        // If all 32 SIMD registers are available, cache all the round keys.
 // Do a single round of AES en/decryption on the blocks in registers V0-V3,
 // using the same key for all blocks.  The round key is loaded from the
 // appropriate register or memory location for round \i.  In addition, does two
-// steps of the computation of the next set of tweaks.  May clobber V4.
+// steps of the computation of the next set of tweaks.  May clobber V4 and V5.
 .macro _vaes_4x        enc, last, i
 .if USE_AVX10
        _tweak_step     (2*(\i-5))
 
 // void aes_xts_encrypt_iv(const struct crypto_aes_ctx *tweak_key,
 //                        u8 iv[AES_BLOCK_SIZE]);
+//
+// Encrypt |iv| using the AES key |tweak_key| to get the first tweak.  Assumes
+// that the CPU supports AES-NI and AVX, but not necessarily VAES or AVX10.
 SYM_TYPED_FUNC_START(aes_xts_encrypt_iv)
        .set    TWEAK_KEY,      %rdi
        .set    IV,             %rsi
@@ -757,9 +766,9 @@ SYM_FUNC_END(aes_xts_encrypt_iv)
 // Below are the actual AES-XTS encryption and decryption functions,
 // instantiated from the above macro.  They all have the following prototype:
 //
-// void (*xts_asm_func)(const struct crypto_aes_ctx *key,
-//                     const u8 *src, u8 *dst, unsigned int len,
-//                     u8 tweak[AES_BLOCK_SIZE]);
+// void (*xts_crypt_func)(const struct crypto_aes_ctx *key,
+//                       const u8 *src, u8 *dst, unsigned int len,
+//                       u8 tweak[AES_BLOCK_SIZE]);
 //
 // |key| is the data key.  |tweak| contains the next tweak; the encryption of
 // the original IV with the tweak key was already done.  This function supports