2 * Copyright (c) 2011, Intel Corporation
3 * Authors: Fenghua Yu <fenghua.yu@intel.com>,
4 * H. Peter Anvin <hpa@linux.intel.com>
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2, as published by the Free Software Foundation.
10 * This program is distributed in the hope it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
30 #define RDRAND_RETRY_LIMIT 10
32 #if defined(__x86_64__)
34 ENTRY(x86_rdrand_nlong)
36 mov $RDRAND_RETRY_LIMIT, %eax
38 .byte 0x48,0x0f,0xc7,0xf2 /* rdrand %rdx */
50 ENDPROC(x86_rdrand_nlong)
52 #define SETPTR(var,ptr) leaq var(%rip),ptr
56 #define NPTR2 1 /* %rcx = %r1, only 0-7 valid here */
58 #elif defined(__i386__)
60 ENTRY(x86_rdrand_nlong)
67 mov $RDRAND_RETRY_LIMIT, %eax
69 .byte 0x0f,0xc7,0xf7 /* rdrand %edi */
85 ENDPROC(x86_rdrand_nlong)
87 #define SETPTR(var,ptr) movl $(var),ptr
91 #define NPTR2 1 /* %rcx = %r1 */
95 #if defined(__i386__) || defined(__x86_64__)
105 SETPTR(aes_round_keys, PTR2)
107 movdqa (0*16)(PTR0), %xmm0
108 movdqa (1*16)(PTR0), %xmm1
109 movdqa (2*16)(PTR0), %xmm2
110 movdqa (3*16)(PTR0), %xmm3
111 movdqa (4*16)(PTR0), %xmm4
112 movdqa (5*16)(PTR0), %xmm5
113 movdqa (6*16)(PTR0), %xmm6
114 movdqa (7*16)(PTR0), %xmm7
116 pxor (0*16)(PTR1), %xmm0
117 pxor (1*16)(PTR1), %xmm1
118 pxor (2*16)(PTR1), %xmm2
119 pxor (3*16)(PTR1), %xmm3
120 pxor (4*16)(PTR1), %xmm4
121 pxor (5*16)(PTR1), %xmm5
122 pxor (6*16)(PTR1), %xmm6
123 pxor (7*16)(PTR1), %xmm7
126 .byte 0x66,0x0f,0x38,0xdc,0x00+NPTR2 /* aesenc (PTR2), %xmm0 */
127 .byte 0x66,0x0f,0x38,0xdc,0x08+NPTR2 /* aesenc (PTR2), %xmm1 */
128 .byte 0x66,0x0f,0x38,0xdc,0x10+NPTR2 /* aesenc (PTR2), %xmm2 */
129 .byte 0x66,0x0f,0x38,0xdc,0x18+NPTR2 /* aesenc (PTR2), %xmm3 */
130 .byte 0x66,0x0f,0x38,0xdc,0x20+NPTR2 /* aesenc (PTR2), %xmm4 */
131 .byte 0x66,0x0f,0x38,0xdc,0x28+NPTR2 /* aesenc (PTR2), %xmm5 */
132 .byte 0x66,0x0f,0x38,0xdc,0x30+NPTR2 /* aesenc (PTR2), %xmm6 */
133 .byte 0x66,0x0f,0x38,0xdc,0x38+NPTR2 /* aesenc (PTR2), %xmm7 */
137 .byte 0x66,0x0f,0x38,0xdd,0x00+NPTR2 /* aesenclast (PTR2), %xmm0 */
138 .byte 0x66,0x0f,0x38,0xdd,0x08+NPTR2 /* aesenclast (PTR2), %xmm1 */
139 .byte 0x66,0x0f,0x38,0xdd,0x10+NPTR2 /* aesenclast (PTR2), %xmm2 */
140 .byte 0x66,0x0f,0x38,0xdd,0x18+NPTR2 /* aesenclast (PTR2), %xmm3 */
141 .byte 0x66,0x0f,0x38,0xdd,0x20+NPTR2 /* aesenclast (PTR2), %xmm4 */
142 .byte 0x66,0x0f,0x38,0xdd,0x28+NPTR2 /* aesenclast (PTR2), %xmm5 */
143 .byte 0x66,0x0f,0x38,0xdd,0x30+NPTR2 /* aesenclast (PTR2), %xmm6 */
144 .byte 0x66,0x0f,0x38,0xdd,0x38+NPTR2 /* aesenclast (PTR2), %xmm7 */
146 movdqa %xmm0, (0*16)(PTR0)
147 movdqa %xmm1, (1*16)(PTR0)
148 movdqa %xmm2, (2*16)(PTR0)
149 movdqa %xmm3, (3*16)(PTR0)
150 movdqa %xmm4, (4*16)(PTR0)
151 movdqa %xmm5, (5*16)(PTR0)
152 movdqa %xmm6, (6*16)(PTR0)
153 movdqa %xmm7, (7*16)(PTR0)
155 movdqa %xmm0, (0*16)(PTR1)
156 movdqa %xmm1, (1*16)(PTR1)
157 movdqa %xmm2, (2*16)(PTR1)
158 movdqa %xmm3, (3*16)(PTR1)
159 movdqa %xmm4, (4*16)(PTR1)
160 movdqa %xmm5, (5*16)(PTR1)
161 movdqa %xmm6, (6*16)(PTR1)
162 movdqa %xmm7, (7*16)(PTR1)
164 #if defined(__i386__)
168 ENDPROC(x86_aes_mangle)
170 * AES round keys for an arbitrary key:
171 * 00102030405060708090A0B0C0D0E0F0
173 .section ".rodata","a"
176 .long 0x00102030, 0x40506070, 0x8090A0B0, 0xC0D0E0F0
177 .long 0x89D810E8, 0x855ACE68, 0x2D1843D8, 0xCB128FE4
178 .long 0x4915598F, 0x55E5D7A0, 0xDACA94FA, 0x1F0A63F7
179 .long 0xFA636A28, 0x25B339C9, 0x40668A31, 0x57244D17
180 .long 0x24724023, 0x6966B3FA, 0x6ED27532, 0x88425B6C
181 .long 0xC81677BC, 0x9B7AC93B, 0x25027992, 0xB0261996
182 .long 0xC62FE109, 0xF75EEDC3, 0xCC79395D, 0x84F9CF5D
183 .long 0xD1876C0F, 0x79C4300A, 0xB45594AD, 0xD66FF41F
184 .long 0xFDE3BAD2, 0x05E5D0D7, 0x3547964E, 0xF1FE37F1
185 .long 0xBD6E7C3D, 0xF2B5779E, 0x0B61216E, 0x8B10B689
186 .long 0x69C4E0D8, 0x6A7B0430, 0xD8CDB780, 0x70B4C55A
187 .size aes_round_keys, .-aes_round_keys
193 .size aes_fwd_state, .-aes_fwd_state
195 #endif /* i386 or x86_64 */
198 * This is necessary to keep the whole executable
199 * from needing a writable stack.
201 .section .note.GNU-stack,"",%progbits