summaryrefslogtreecommitdiff
path: root/arch/s390/kernel/vdso64/vgetrandom-chacha.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390/kernel/vdso64/vgetrandom-chacha.S')
-rw-r--r--arch/s390/kernel/vdso64/vgetrandom-chacha.S181
1 files changed, 0 insertions, 181 deletions
diff --git a/arch/s390/kernel/vdso64/vgetrandom-chacha.S b/arch/s390/kernel/vdso64/vgetrandom-chacha.S
deleted file mode 100644
index 09c034c2f853..000000000000
--- a/arch/s390/kernel/vdso64/vgetrandom-chacha.S
+++ /dev/null
@@ -1,181 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-
-#include <linux/stringify.h>
-#include <linux/linkage.h>
-#include <asm/alternative.h>
-#include <asm/dwarf.h>
-#include <asm/fpu-insn.h>
-
-#define STATE0 %v0
-#define STATE1 %v1
-#define STATE2 %v2
-#define STATE3 %v3
-#define COPY0 %v4
-#define COPY1 %v5
-#define COPY2 %v6
-#define COPY3 %v7
-#define BEPERM %v19
-#define TMP0 %v20
-#define TMP1 %v21
-#define TMP2 %v22
-#define TMP3 %v23
-
- .section .rodata
-
- .balign 32
-SYM_DATA_START_LOCAL(chacha20_constants)
- .long 0x61707865,0x3320646e,0x79622d32,0x6b206574 # endian-neutral
- .long 0x03020100,0x07060504,0x0b0a0908,0x0f0e0d0c # byte swap
-SYM_DATA_END(chacha20_constants)
-
- .text
-/*
- * s390 ChaCha20 implementation meant for vDSO. Produces a given positive
- * number of blocks of output with nonce 0, taking an input key and 8-bytes
- * counter. Does not spill to the stack.
- *
- * void __arch_chacha20_blocks_nostack(uint8_t *dst_bytes,
- * const uint8_t *key,
- * uint32_t *counter,
- * size_t nblocks)
- */
-SYM_FUNC_START(__arch_chacha20_blocks_nostack)
- CFI_STARTPROC
- larl %r1,chacha20_constants
-
- /* COPY0 = "expand 32-byte k" */
- VL COPY0,0,,%r1
-
- /* BEPERM = byte selectors for VPERM */
- ALTERNATIVE __stringify(VL BEPERM,16,,%r1), "brcl 0,0", ALT_FACILITY(148)
-
- /* COPY1,COPY2 = key */
- VLM COPY1,COPY2,0,%r3
-
- /* COPY3 = counter || zero nonce */
- lg %r3,0(%r4)
- VZERO COPY3
- VLVGG COPY3,%r3,0
-
- lghi %r1,0
-.Lblock:
- VLR STATE0,COPY0
- VLR STATE1,COPY1
- VLR STATE2,COPY2
- VLR STATE3,COPY3
-
- lghi %r0,10
-.Ldoubleround:
- /* STATE0 += STATE1, STATE3 = rotl32(STATE3 ^ STATE0, 16) */
- VAF STATE0,STATE0,STATE1
- VX STATE3,STATE3,STATE0
- VERLLF STATE3,STATE3,16
-
- /* STATE2 += STATE3, STATE1 = rotl32(STATE1 ^ STATE2, 12) */
- VAF STATE2,STATE2,STATE3
- VX STATE1,STATE1,STATE2
- VERLLF STATE1,STATE1,12
-
- /* STATE0 += STATE1, STATE3 = rotl32(STATE3 ^ STATE0, 8) */
- VAF STATE0,STATE0,STATE1
- VX STATE3,STATE3,STATE0
- VERLLF STATE3,STATE3,8
-
- /* STATE2 += STATE3, STATE1 = rotl32(STATE1 ^ STATE2, 7) */
- VAF STATE2,STATE2,STATE3
- VX STATE1,STATE1,STATE2
- VERLLF STATE1,STATE1,7
-
- /* STATE1[0,1,2,3] = STATE1[1,2,3,0] */
- VSLDB STATE1,STATE1,STATE1,4
- /* STATE2[0,1,2,3] = STATE2[2,3,0,1] */
- VSLDB STATE2,STATE2,STATE2,8
- /* STATE3[0,1,2,3] = STATE3[3,0,1,2] */
- VSLDB STATE3,STATE3,STATE3,12
-
- /* STATE0 += STATE1, STATE3 = rotl32(STATE3 ^ STATE0, 16) */
- VAF STATE0,STATE0,STATE1
- VX STATE3,STATE3,STATE0
- VERLLF STATE3,STATE3,16
-
- /* STATE2 += STATE3, STATE1 = rotl32(STATE1 ^ STATE2, 12) */
- VAF STATE2,STATE2,STATE3
- VX STATE1,STATE1,STATE2
- VERLLF STATE1,STATE1,12
-
- /* STATE0 += STATE1, STATE3 = rotl32(STATE3 ^ STATE0, 8) */
- VAF STATE0,STATE0,STATE1
- VX STATE3,STATE3,STATE0
- VERLLF STATE3,STATE3,8
-
- /* STATE2 += STATE3, STATE1 = rotl32(STATE1 ^ STATE2, 7) */
- VAF STATE2,STATE2,STATE3
- VX STATE1,STATE1,STATE2
- VERLLF STATE1,STATE1,7
-
- /* STATE1[0,1,2,3] = STATE1[3,0,1,2] */
- VSLDB STATE1,STATE1,STATE1,12
- /* STATE2[0,1,2,3] = STATE2[2,3,0,1] */
- VSLDB STATE2,STATE2,STATE2,8
- /* STATE3[0,1,2,3] = STATE3[1,2,3,0] */
- VSLDB STATE3,STATE3,STATE3,4
- brctg %r0,.Ldoubleround
-
- /* OUTPUT0 = STATE0 + COPY0 */
- VAF STATE0,STATE0,COPY0
- /* OUTPUT1 = STATE1 + COPY1 */
- VAF STATE1,STATE1,COPY1
- /* OUTPUT2 = STATE2 + COPY2 */
- VAF STATE2,STATE2,COPY2
- /* OUTPUT3 = STATE3 + COPY3 */
- VAF STATE3,STATE3,COPY3
-
- ALTERNATIVE \
- __stringify( \
- /* Convert STATE to little endian and store to OUTPUT */\
- VPERM TMP0,STATE0,STATE0,BEPERM; \
- VPERM TMP1,STATE1,STATE1,BEPERM; \
- VPERM TMP2,STATE2,STATE2,BEPERM; \
- VPERM TMP3,STATE3,STATE3,BEPERM; \
- VSTM TMP0,TMP3,0,%r2), \
- __stringify( \
- /* 32 bit wise little endian store to OUTPUT */ \
- VSTBRF STATE0,0,,%r2; \
- VSTBRF STATE1,16,,%r2; \
- VSTBRF STATE2,32,,%r2; \
- VSTBRF STATE3,48,,%r2; \
- brcl 0,0), \
- ALT_FACILITY(148)
-
- /* ++COPY3.COUNTER */
- /* alsih %r3,1 */
- .insn rilu,0xcc0a00000000,%r3,1
- alcr %r3,%r1
- VLVGG COPY3,%r3,0
-
- /* OUTPUT += 64, --NBLOCKS */
- aghi %r2,64
- brctg %r5,.Lblock
-
- /* COUNTER = COPY3.COUNTER */
- stg %r3,0(%r4)
-
- /* Zero out potentially sensitive regs */
- VZERO STATE0
- VZERO STATE1
- VZERO STATE2
- VZERO STATE3
- VZERO COPY1
- VZERO COPY2
-
- /* Early exit if TMP0-TMP3 have not been used */
- ALTERNATIVE "nopr", "br %r14", ALT_FACILITY(148)
-
- VZERO TMP0
- VZERO TMP1
- VZERO TMP2
- VZERO TMP3
-
- br %r14
- CFI_ENDPROC
-SYM_FUNC_END(__arch_chacha20_blocks_nostack)