Home | History | Annotate | Line # | Download | only in x86_64
      1 #include <machine/asm.h>
      2 .text
      3 .globl	padlock_capability
      4 .type	padlock_capability,@function
      5 .align	16
      6 padlock_capability:
      7 	movq	%rbx,%r8
      8 	xorl	%eax,%eax
      9 	cpuid
     10 	xorl	%eax,%eax
     11 	cmpl	$0x746e6543,%ebx
     12 	jne	.Lzhaoxin
     13 	cmpl	$0x48727561,%edx
     14 	jne	.Lnoluck
     15 	cmpl	$0x736c7561,%ecx
     16 	jne	.Lnoluck
     17 	jmp	.LzhaoxinEnd
     18 .Lzhaoxin:
     19 	cmpl	$0x68532020,%ebx
     20 	jne	.Lnoluck
     21 	cmpl	$0x68676e61,%edx
     22 	jne	.Lnoluck
     23 	cmpl	$0x20206961,%ecx
     24 	jne	.Lnoluck
     25 .LzhaoxinEnd:
     26 	movl	$0xC0000000,%eax
     27 	cpuid
     28 	movl	%eax,%edx
     29 	xorl	%eax,%eax
     30 	cmpl	$0xC0000001,%edx
     31 	jb	.Lnoluck
     32 	movl	$0xC0000001,%eax
     33 	cpuid
     34 	movl	%edx,%eax
     35 	andl	$0xffffffef,%eax
     36 	orl	$0x10,%eax
     37 .Lnoluck:
     38 	movq	%r8,%rbx
     39 	.byte	0xf3,0xc3
     40 .size	padlock_capability,.-padlock_capability
     41 
     42 .globl	padlock_key_bswap
     43 .type	padlock_key_bswap,@function
     44 .align	16
     45 padlock_key_bswap:
     46 	movl	240(%rdi),%edx
     47 	incl	%edx
     48 	shll	$2,%edx
     49 .Lbswap_loop:
     50 	movl	(%rdi),%eax
     51 	bswapl	%eax
     52 	movl	%eax,(%rdi)
     53 	leaq	4(%rdi),%rdi
     54 	subl	$1,%edx
     55 	jnz	.Lbswap_loop
     56 	.byte	0xf3,0xc3
     57 .size	padlock_key_bswap,.-padlock_key_bswap
     58 
     59 .globl	padlock_verify_context
     60 .type	padlock_verify_context,@function
     61 .align	16
     62 padlock_verify_context:
     63 	movq	%rdi,%rdx
     64 	pushf
     65 	leaq	.Lpadlock_saved_context(%rip),%rax
     66 	call	_padlock_verify_ctx
     67 	leaq	8(%rsp),%rsp
     68 	.byte	0xf3,0xc3
     69 .size	padlock_verify_context,.-padlock_verify_context
     70 
     71 .type	_padlock_verify_ctx,@function
     72 .align	16
     73 _padlock_verify_ctx:
     74 	movq	8(%rsp),%r8
     75 	btq	$30,%r8
     76 	jnc	.Lverified
     77 	cmpq	(%rax),%rdx
     78 	je	.Lverified
     79 	pushf
     80 	popf
     81 .Lverified:
     82 	movq	%rdx,(%rax)
     83 	.byte	0xf3,0xc3
     84 .size	_padlock_verify_ctx,.-_padlock_verify_ctx
     85 
     86 .globl	padlock_reload_key
     87 .type	padlock_reload_key,@function
     88 .align	16
     89 padlock_reload_key:
     90 	pushf
     91 	popf
     92 	.byte	0xf3,0xc3
     93 .size	padlock_reload_key,.-padlock_reload_key
     94 
     95 .globl	padlock_aes_block
     96 .type	padlock_aes_block,@function
     97 .align	16
     98 padlock_aes_block:
     99 	movq	%rbx,%r8
    100 	movq	$1,%rcx
    101 	leaq	32(%rdx),%rbx
    102 	leaq	16(%rdx),%rdx
    103 .byte	0xf3,0x0f,0xa7,0xc8
    104 	movq	%r8,%rbx
    105 	.byte	0xf3,0xc3
    106 .size	padlock_aes_block,.-padlock_aes_block
    107 
    108 .globl	padlock_xstore
    109 .type	padlock_xstore,@function
    110 .align	16
    111 padlock_xstore:
    112 	movl	%esi,%edx
    113 .byte	0x0f,0xa7,0xc0
    114 	.byte	0xf3,0xc3
    115 .size	padlock_xstore,.-padlock_xstore
    116 
    117 .globl	padlock_sha1_oneshot
    118 .type	padlock_sha1_oneshot,@function
    119 .align	16
    120 padlock_sha1_oneshot:
    121 	movq	%rdx,%rcx
    122 	movq	%rdi,%rdx
    123 	movups	(%rdi),%xmm0
    124 	subq	$128+8,%rsp
    125 	movl	16(%rdi),%eax
    126 	movaps	%xmm0,(%rsp)
    127 	movq	%rsp,%rdi
    128 	movl	%eax,16(%rsp)
    129 	xorq	%rax,%rax
    130 .byte	0xf3,0x0f,0xa6,0xc8
    131 	movaps	(%rsp),%xmm0
    132 	movl	16(%rsp),%eax
    133 	addq	$128+8,%rsp
    134 	movups	%xmm0,(%rdx)
    135 	movl	%eax,16(%rdx)
    136 	.byte	0xf3,0xc3
    137 .size	padlock_sha1_oneshot,.-padlock_sha1_oneshot
    138 
    139 .globl	padlock_sha1_blocks
    140 .type	padlock_sha1_blocks,@function
    141 .align	16
    142 padlock_sha1_blocks:
    143 	movq	%rdx,%rcx
    144 	movq	%rdi,%rdx
    145 	movups	(%rdi),%xmm0
    146 	subq	$128+8,%rsp
    147 	movl	16(%rdi),%eax
    148 	movaps	%xmm0,(%rsp)
    149 	movq	%rsp,%rdi
    150 	movl	%eax,16(%rsp)
    151 	movq	$-1,%rax
    152 .byte	0xf3,0x0f,0xa6,0xc8
    153 	movaps	(%rsp),%xmm0
    154 	movl	16(%rsp),%eax
    155 	addq	$128+8,%rsp
    156 	movups	%xmm0,(%rdx)
    157 	movl	%eax,16(%rdx)
    158 	.byte	0xf3,0xc3
    159 .size	padlock_sha1_blocks,.-padlock_sha1_blocks
    160 
    161 .globl	padlock_sha256_oneshot
    162 .type	padlock_sha256_oneshot,@function
    163 .align	16
    164 padlock_sha256_oneshot:
    165 	movq	%rdx,%rcx
    166 	movq	%rdi,%rdx
    167 	movups	(%rdi),%xmm0
    168 	subq	$128+8,%rsp
    169 	movups	16(%rdi),%xmm1
    170 	movaps	%xmm0,(%rsp)
    171 	movq	%rsp,%rdi
    172 	movaps	%xmm1,16(%rsp)
    173 	xorq	%rax,%rax
    174 .byte	0xf3,0x0f,0xa6,0xd0
    175 	movaps	(%rsp),%xmm0
    176 	movaps	16(%rsp),%xmm1
    177 	addq	$128+8,%rsp
    178 	movups	%xmm0,(%rdx)
    179 	movups	%xmm1,16(%rdx)
    180 	.byte	0xf3,0xc3
    181 .size	padlock_sha256_oneshot,.-padlock_sha256_oneshot
    182 
    183 .globl	padlock_sha256_blocks
    184 .type	padlock_sha256_blocks,@function
    185 .align	16
    186 padlock_sha256_blocks:
    187 	movq	%rdx,%rcx
    188 	movq	%rdi,%rdx
    189 	movups	(%rdi),%xmm0
    190 	subq	$128+8,%rsp
    191 	movups	16(%rdi),%xmm1
    192 	movaps	%xmm0,(%rsp)
    193 	movq	%rsp,%rdi
    194 	movaps	%xmm1,16(%rsp)
    195 	movq	$-1,%rax
    196 .byte	0xf3,0x0f,0xa6,0xd0
    197 	movaps	(%rsp),%xmm0
    198 	movaps	16(%rsp),%xmm1
    199 	addq	$128+8,%rsp
    200 	movups	%xmm0,(%rdx)
    201 	movups	%xmm1,16(%rdx)
    202 	.byte	0xf3,0xc3
    203 .size	padlock_sha256_blocks,.-padlock_sha256_blocks
    204 
    205 .globl	padlock_sha512_blocks
    206 .type	padlock_sha512_blocks,@function
    207 .align	16
    208 padlock_sha512_blocks:
    209 	movq	%rdx,%rcx
    210 	movq	%rdi,%rdx
    211 	movups	(%rdi),%xmm0
    212 	subq	$128+8,%rsp
    213 	movups	16(%rdi),%xmm1
    214 	movups	32(%rdi),%xmm2
    215 	movups	48(%rdi),%xmm3
    216 	movaps	%xmm0,(%rsp)
    217 	movq	%rsp,%rdi
    218 	movaps	%xmm1,16(%rsp)
    219 	movaps	%xmm2,32(%rsp)
    220 	movaps	%xmm3,48(%rsp)
    221 .byte	0xf3,0x0f,0xa6,0xe0
    222 	movaps	(%rsp),%xmm0
    223 	movaps	16(%rsp),%xmm1
    224 	movaps	32(%rsp),%xmm2
    225 	movaps	48(%rsp),%xmm3
    226 	addq	$128+8,%rsp
    227 	movups	%xmm0,(%rdx)
    228 	movups	%xmm1,16(%rdx)
    229 	movups	%xmm2,32(%rdx)
    230 	movups	%xmm3,48(%rdx)
    231 	.byte	0xf3,0xc3
    232 .size	padlock_sha512_blocks,.-padlock_sha512_blocks
    233 .globl	padlock_ecb_encrypt
    234 .type	padlock_ecb_encrypt,@function
    235 .align	16
    236 padlock_ecb_encrypt:
    237 	pushq	%rbp
    238 	pushq	%rbx
    239 
    240 	xorl	%eax,%eax
    241 	testq	$15,%rdx
    242 	jnz	.Lecb_abort
    243 	testq	$15,%rcx
    244 	jnz	.Lecb_abort
    245 	leaq	.Lpadlock_saved_context(%rip),%rax
    246 	pushf
    247 	cld
    248 	call	_padlock_verify_ctx
    249 	leaq	16(%rdx),%rdx
    250 	xorl	%eax,%eax
    251 	xorl	%ebx,%ebx
    252 	testl	$32,(%rdx)
    253 	jnz	.Lecb_aligned
    254 	testq	$0x0f,%rdi
    255 	setz	%al
    256 	testq	$0x0f,%rsi
    257 	setz	%bl
    258 	testl	%ebx,%eax
    259 	jnz	.Lecb_aligned
    260 	negq	%rax
    261 	movq	$512,%rbx
    262 	notq	%rax
    263 	leaq	(%rsp),%rbp
    264 	cmpq	%rbx,%rcx
    265 	cmovcq	%rcx,%rbx
    266 	andq	%rbx,%rax
    267 	movq	%rcx,%rbx
    268 	negq	%rax
    269 	andq	$512-1,%rbx
    270 	leaq	(%rax,%rbp,1),%rsp
    271 	movq	$512,%rax
    272 	cmovzq	%rax,%rbx
    273 	cmpq	%rbx,%rcx
    274 	ja	.Lecb_loop
    275 	movq	%rsi,%rax
    276 	cmpq	%rsp,%rbp
    277 	cmoveq	%rdi,%rax
    278 	addq	%rcx,%rax
    279 	negq	%rax
    280 	andq	$0xfff,%rax
    281 	cmpq	$128,%rax
    282 	movq	$-128,%rax
    283 	cmovaeq	%rbx,%rax
    284 	andq	%rax,%rbx
    285 	jz	.Lecb_unaligned_tail
    286 	jmp	.Lecb_loop
    287 .align	16
    288 .Lecb_loop:
    289 	cmpq	%rcx,%rbx
    290 	cmovaq	%rcx,%rbx
    291 	movq	%rdi,%r8
    292 	movq	%rsi,%r9
    293 	movq	%rcx,%r10
    294 	movq	%rbx,%rcx
    295 	movq	%rbx,%r11
    296 	testq	$0x0f,%rdi
    297 	cmovnzq	%rsp,%rdi
    298 	testq	$0x0f,%rsi
    299 	jz	.Lecb_inp_aligned
    300 	shrq	$3,%rcx
    301 .byte	0xf3,0x48,0xa5
    302 	subq	%rbx,%rdi
    303 	movq	%rbx,%rcx
    304 	movq	%rdi,%rsi
    305 .Lecb_inp_aligned:
    306 	leaq	-16(%rdx),%rax
    307 	leaq	16(%rdx),%rbx
    308 	shrq	$4,%rcx
    309 .byte	0xf3,0x0f,0xa7,200
    310 	movq	%r8,%rdi
    311 	movq	%r11,%rbx
    312 	testq	$0x0f,%rdi
    313 	jz	.Lecb_out_aligned
    314 	movq	%rbx,%rcx
    315 	leaq	(%rsp),%rsi
    316 	shrq	$3,%rcx
    317 .byte	0xf3,0x48,0xa5
    318 	subq	%rbx,%rdi
    319 .Lecb_out_aligned:
    320 	movq	%r9,%rsi
    321 	movq	%r10,%rcx
    322 	addq	%rbx,%rdi
    323 	addq	%rbx,%rsi
    324 	subq	%rbx,%rcx
    325 	movq	$512,%rbx
    326 	jz	.Lecb_break
    327 	cmpq	%rbx,%rcx
    328 	jae	.Lecb_loop
    329 .Lecb_unaligned_tail:
    330 	xorl	%eax,%eax
    331 	cmpq	%rsp,%rbp
    332 	cmoveq	%rcx,%rax
    333 	movq	%rdi,%r8
    334 	movq	%rcx,%rbx
    335 	subq	%rax,%rsp
    336 	shrq	$3,%rcx
    337 	leaq	(%rsp),%rdi
    338 .byte	0xf3,0x48,0xa5
    339 	movq	%rsp,%rsi
    340 	movq	%r8,%rdi
    341 	movq	%rbx,%rcx
    342 	jmp	.Lecb_loop
    343 .align	16
    344 .Lecb_break:
    345 	cmpq	%rbp,%rsp
    346 	je	.Lecb_done
    347 
    348 	pxor	%xmm0,%xmm0
    349 	leaq	(%rsp),%rax
    350 .Lecb_bzero:
    351 	movaps	%xmm0,(%rax)
    352 	leaq	16(%rax),%rax
    353 	cmpq	%rax,%rbp
    354 	ja	.Lecb_bzero
    355 
    356 .Lecb_done:
    357 	leaq	(%rbp),%rsp
    358 	jmp	.Lecb_exit
    359 
    360 .align	16
    361 .Lecb_aligned:
    362 	leaq	(%rsi,%rcx,1),%rbp
    363 	negq	%rbp
    364 	andq	$0xfff,%rbp
    365 	xorl	%eax,%eax
    366 	cmpq	$128,%rbp
    367 	movq	$128-1,%rbp
    368 	cmovaeq	%rax,%rbp
    369 	andq	%rcx,%rbp
    370 	subq	%rbp,%rcx
    371 	jz	.Lecb_aligned_tail
    372 	leaq	-16(%rdx),%rax
    373 	leaq	16(%rdx),%rbx
    374 	shrq	$4,%rcx
    375 .byte	0xf3,0x0f,0xa7,200
    376 	testq	%rbp,%rbp
    377 	jz	.Lecb_exit
    378 
    379 .Lecb_aligned_tail:
    380 	movq	%rdi,%r8
    381 	movq	%rbp,%rbx
    382 	movq	%rbp,%rcx
    383 	leaq	(%rsp),%rbp
    384 	subq	%rcx,%rsp
    385 	shrq	$3,%rcx
    386 	leaq	(%rsp),%rdi
    387 .byte	0xf3,0x48,0xa5
    388 	leaq	(%r8),%rdi
    389 	leaq	(%rsp),%rsi
    390 	movq	%rbx,%rcx
    391 	jmp	.Lecb_loop
    392 .Lecb_exit:
    393 	movl	$1,%eax
    394 	leaq	8(%rsp),%rsp
    395 .Lecb_abort:
    396 	popq	%rbx
    397 	popq	%rbp
    398 	.byte	0xf3,0xc3
    399 .size	padlock_ecb_encrypt,.-padlock_ecb_encrypt
    400 .globl	padlock_cbc_encrypt
    401 .type	padlock_cbc_encrypt,@function
    402 .align	16
    403 padlock_cbc_encrypt:
    404 	pushq	%rbp
    405 	pushq	%rbx
    406 
    407 	xorl	%eax,%eax
    408 	testq	$15,%rdx
    409 	jnz	.Lcbc_abort
    410 	testq	$15,%rcx
    411 	jnz	.Lcbc_abort
    412 	leaq	.Lpadlock_saved_context(%rip),%rax
    413 	pushf
    414 	cld
    415 	call	_padlock_verify_ctx
    416 	leaq	16(%rdx),%rdx
    417 	xorl	%eax,%eax
    418 	xorl	%ebx,%ebx
    419 	testl	$32,(%rdx)
    420 	jnz	.Lcbc_aligned
    421 	testq	$0x0f,%rdi
    422 	setz	%al
    423 	testq	$0x0f,%rsi
    424 	setz	%bl
    425 	testl	%ebx,%eax
    426 	jnz	.Lcbc_aligned
    427 	negq	%rax
    428 	movq	$512,%rbx
    429 	notq	%rax
    430 	leaq	(%rsp),%rbp
    431 	cmpq	%rbx,%rcx
    432 	cmovcq	%rcx,%rbx
    433 	andq	%rbx,%rax
    434 	movq	%rcx,%rbx
    435 	negq	%rax
    436 	andq	$512-1,%rbx
    437 	leaq	(%rax,%rbp,1),%rsp
    438 	movq	$512,%rax
    439 	cmovzq	%rax,%rbx
    440 	cmpq	%rbx,%rcx
    441 	ja	.Lcbc_loop
    442 	movq	%rsi,%rax
    443 	cmpq	%rsp,%rbp
    444 	cmoveq	%rdi,%rax
    445 	addq	%rcx,%rax
    446 	negq	%rax
    447 	andq	$0xfff,%rax
    448 	cmpq	$64,%rax
    449 	movq	$-64,%rax
    450 	cmovaeq	%rbx,%rax
    451 	andq	%rax,%rbx
    452 	jz	.Lcbc_unaligned_tail
    453 	jmp	.Lcbc_loop
    454 .align	16
    455 .Lcbc_loop:
    456 	cmpq	%rcx,%rbx
    457 	cmovaq	%rcx,%rbx
    458 	movq	%rdi,%r8
    459 	movq	%rsi,%r9
    460 	movq	%rcx,%r10
    461 	movq	%rbx,%rcx
    462 	movq	%rbx,%r11
    463 	testq	$0x0f,%rdi
    464 	cmovnzq	%rsp,%rdi
    465 	testq	$0x0f,%rsi
    466 	jz	.Lcbc_inp_aligned
    467 	shrq	$3,%rcx
    468 .byte	0xf3,0x48,0xa5
    469 	subq	%rbx,%rdi
    470 	movq	%rbx,%rcx
    471 	movq	%rdi,%rsi
    472 .Lcbc_inp_aligned:
    473 	leaq	-16(%rdx),%rax
    474 	leaq	16(%rdx),%rbx
    475 	shrq	$4,%rcx
    476 .byte	0xf3,0x0f,0xa7,208
    477 	movdqa	(%rax),%xmm0
    478 	movdqa	%xmm0,-16(%rdx)
    479 	movq	%r8,%rdi
    480 	movq	%r11,%rbx
    481 	testq	$0x0f,%rdi
    482 	jz	.Lcbc_out_aligned
    483 	movq	%rbx,%rcx
    484 	leaq	(%rsp),%rsi
    485 	shrq	$3,%rcx
    486 .byte	0xf3,0x48,0xa5
    487 	subq	%rbx,%rdi
    488 .Lcbc_out_aligned:
    489 	movq	%r9,%rsi
    490 	movq	%r10,%rcx
    491 	addq	%rbx,%rdi
    492 	addq	%rbx,%rsi
    493 	subq	%rbx,%rcx
    494 	movq	$512,%rbx
    495 	jz	.Lcbc_break
    496 	cmpq	%rbx,%rcx
    497 	jae	.Lcbc_loop
    498 .Lcbc_unaligned_tail:
    499 	xorl	%eax,%eax
    500 	cmpq	%rsp,%rbp
    501 	cmoveq	%rcx,%rax
    502 	movq	%rdi,%r8
    503 	movq	%rcx,%rbx
    504 	subq	%rax,%rsp
    505 	shrq	$3,%rcx
    506 	leaq	(%rsp),%rdi
    507 .byte	0xf3,0x48,0xa5
    508 	movq	%rsp,%rsi
    509 	movq	%r8,%rdi
    510 	movq	%rbx,%rcx
    511 	jmp	.Lcbc_loop
    512 .align	16
    513 .Lcbc_break:
    514 	cmpq	%rbp,%rsp
    515 	je	.Lcbc_done
    516 
    517 	pxor	%xmm0,%xmm0
    518 	leaq	(%rsp),%rax
    519 .Lcbc_bzero:
    520 	movaps	%xmm0,(%rax)
    521 	leaq	16(%rax),%rax
    522 	cmpq	%rax,%rbp
    523 	ja	.Lcbc_bzero
    524 
    525 .Lcbc_done:
    526 	leaq	(%rbp),%rsp
    527 	jmp	.Lcbc_exit
    528 
    529 .align	16
    530 .Lcbc_aligned:
    531 	leaq	(%rsi,%rcx,1),%rbp
    532 	negq	%rbp
    533 	andq	$0xfff,%rbp
    534 	xorl	%eax,%eax
    535 	cmpq	$64,%rbp
    536 	movq	$64-1,%rbp
    537 	cmovaeq	%rax,%rbp
    538 	andq	%rcx,%rbp
    539 	subq	%rbp,%rcx
    540 	jz	.Lcbc_aligned_tail
    541 	leaq	-16(%rdx),%rax
    542 	leaq	16(%rdx),%rbx
    543 	shrq	$4,%rcx
    544 .byte	0xf3,0x0f,0xa7,208
    545 	movdqa	(%rax),%xmm0
    546 	movdqa	%xmm0,-16(%rdx)
    547 	testq	%rbp,%rbp
    548 	jz	.Lcbc_exit
    549 
    550 .Lcbc_aligned_tail:
    551 	movq	%rdi,%r8
    552 	movq	%rbp,%rbx
    553 	movq	%rbp,%rcx
    554 	leaq	(%rsp),%rbp
    555 	subq	%rcx,%rsp
    556 	shrq	$3,%rcx
    557 	leaq	(%rsp),%rdi
    558 .byte	0xf3,0x48,0xa5
    559 	leaq	(%r8),%rdi
    560 	leaq	(%rsp),%rsi
    561 	movq	%rbx,%rcx
    562 	jmp	.Lcbc_loop
    563 .Lcbc_exit:
    564 	movl	$1,%eax
    565 	leaq	8(%rsp),%rsp
    566 .Lcbc_abort:
    567 	popq	%rbx
    568 	popq	%rbp
    569 	.byte	0xf3,0xc3
    570 .size	padlock_cbc_encrypt,.-padlock_cbc_encrypt
    571 .globl	padlock_cfb_encrypt
    572 .type	padlock_cfb_encrypt,@function
    573 .align	16
    574 padlock_cfb_encrypt:
    575 	pushq	%rbp
    576 	pushq	%rbx
    577 
    578 	xorl	%eax,%eax
    579 	testq	$15,%rdx
    580 	jnz	.Lcfb_abort
    581 	testq	$15,%rcx
    582 	jnz	.Lcfb_abort
    583 	leaq	.Lpadlock_saved_context(%rip),%rax
    584 	pushf
    585 	cld
    586 	call	_padlock_verify_ctx
    587 	leaq	16(%rdx),%rdx
    588 	xorl	%eax,%eax
    589 	xorl	%ebx,%ebx
    590 	testl	$32,(%rdx)
    591 	jnz	.Lcfb_aligned
    592 	testq	$0x0f,%rdi
    593 	setz	%al
    594 	testq	$0x0f,%rsi
    595 	setz	%bl
    596 	testl	%ebx,%eax
    597 	jnz	.Lcfb_aligned
    598 	negq	%rax
    599 	movq	$512,%rbx
    600 	notq	%rax
    601 	leaq	(%rsp),%rbp
    602 	cmpq	%rbx,%rcx
    603 	cmovcq	%rcx,%rbx
    604 	andq	%rbx,%rax
    605 	movq	%rcx,%rbx
    606 	negq	%rax
    607 	andq	$512-1,%rbx
    608 	leaq	(%rax,%rbp,1),%rsp
    609 	movq	$512,%rax
    610 	cmovzq	%rax,%rbx
    611 	jmp	.Lcfb_loop
    612 .align	16
    613 .Lcfb_loop:
    614 	cmpq	%rcx,%rbx
    615 	cmovaq	%rcx,%rbx
    616 	movq	%rdi,%r8
    617 	movq	%rsi,%r9
    618 	movq	%rcx,%r10
    619 	movq	%rbx,%rcx
    620 	movq	%rbx,%r11
    621 	testq	$0x0f,%rdi
    622 	cmovnzq	%rsp,%rdi
    623 	testq	$0x0f,%rsi
    624 	jz	.Lcfb_inp_aligned
    625 	shrq	$3,%rcx
    626 .byte	0xf3,0x48,0xa5
    627 	subq	%rbx,%rdi
    628 	movq	%rbx,%rcx
    629 	movq	%rdi,%rsi
    630 .Lcfb_inp_aligned:
    631 	leaq	-16(%rdx),%rax
    632 	leaq	16(%rdx),%rbx
    633 	shrq	$4,%rcx
    634 .byte	0xf3,0x0f,0xa7,224
    635 	movdqa	(%rax),%xmm0
    636 	movdqa	%xmm0,-16(%rdx)
    637 	movq	%r8,%rdi
    638 	movq	%r11,%rbx
    639 	testq	$0x0f,%rdi
    640 	jz	.Lcfb_out_aligned
    641 	movq	%rbx,%rcx
    642 	leaq	(%rsp),%rsi
    643 	shrq	$3,%rcx
    644 .byte	0xf3,0x48,0xa5
    645 	subq	%rbx,%rdi
    646 .Lcfb_out_aligned:
    647 	movq	%r9,%rsi
    648 	movq	%r10,%rcx
    649 	addq	%rbx,%rdi
    650 	addq	%rbx,%rsi
    651 	subq	%rbx,%rcx
    652 	movq	$512,%rbx
    653 	jnz	.Lcfb_loop
    654 	cmpq	%rbp,%rsp
    655 	je	.Lcfb_done
    656 
    657 	pxor	%xmm0,%xmm0
    658 	leaq	(%rsp),%rax
    659 .Lcfb_bzero:
    660 	movaps	%xmm0,(%rax)
    661 	leaq	16(%rax),%rax
    662 	cmpq	%rax,%rbp
    663 	ja	.Lcfb_bzero
    664 
    665 .Lcfb_done:
    666 	leaq	(%rbp),%rsp
    667 	jmp	.Lcfb_exit
    668 
    669 .align	16
    670 .Lcfb_aligned:
    671 	leaq	-16(%rdx),%rax
    672 	leaq	16(%rdx),%rbx
    673 	shrq	$4,%rcx
    674 .byte	0xf3,0x0f,0xa7,224
    675 	movdqa	(%rax),%xmm0
    676 	movdqa	%xmm0,-16(%rdx)
    677 .Lcfb_exit:
    678 	movl	$1,%eax
    679 	leaq	8(%rsp),%rsp
    680 .Lcfb_abort:
    681 	popq	%rbx
    682 	popq	%rbp
    683 	.byte	0xf3,0xc3
    684 .size	padlock_cfb_encrypt,.-padlock_cfb_encrypt
    685 .globl	padlock_ofb_encrypt
    686 .type	padlock_ofb_encrypt,@function
    687 .align	16
    688 padlock_ofb_encrypt:
    689 	pushq	%rbp
    690 	pushq	%rbx
    691 
    692 	xorl	%eax,%eax
    693 	testq	$15,%rdx
    694 	jnz	.Lofb_abort
    695 	testq	$15,%rcx
    696 	jnz	.Lofb_abort
    697 	leaq	.Lpadlock_saved_context(%rip),%rax
    698 	pushf
    699 	cld
    700 	call	_padlock_verify_ctx
    701 	leaq	16(%rdx),%rdx
    702 	xorl	%eax,%eax
    703 	xorl	%ebx,%ebx
    704 	testl	$32,(%rdx)
    705 	jnz	.Lofb_aligned
    706 	testq	$0x0f,%rdi
    707 	setz	%al
    708 	testq	$0x0f,%rsi
    709 	setz	%bl
    710 	testl	%ebx,%eax
    711 	jnz	.Lofb_aligned
    712 	negq	%rax
    713 	movq	$512,%rbx
    714 	notq	%rax
    715 	leaq	(%rsp),%rbp
    716 	cmpq	%rbx,%rcx
    717 	cmovcq	%rcx,%rbx
    718 	andq	%rbx,%rax
    719 	movq	%rcx,%rbx
    720 	negq	%rax
    721 	andq	$512-1,%rbx
    722 	leaq	(%rax,%rbp,1),%rsp
    723 	movq	$512,%rax
    724 	cmovzq	%rax,%rbx
    725 	jmp	.Lofb_loop
    726 .align	16
    727 .Lofb_loop:
    728 	cmpq	%rcx,%rbx
    729 	cmovaq	%rcx,%rbx
    730 	movq	%rdi,%r8
    731 	movq	%rsi,%r9
    732 	movq	%rcx,%r10
    733 	movq	%rbx,%rcx
    734 	movq	%rbx,%r11
    735 	testq	$0x0f,%rdi
    736 	cmovnzq	%rsp,%rdi
    737 	testq	$0x0f,%rsi
    738 	jz	.Lofb_inp_aligned
    739 	shrq	$3,%rcx
    740 .byte	0xf3,0x48,0xa5
    741 	subq	%rbx,%rdi
    742 	movq	%rbx,%rcx
    743 	movq	%rdi,%rsi
    744 .Lofb_inp_aligned:
    745 	leaq	-16(%rdx),%rax
    746 	leaq	16(%rdx),%rbx
    747 	shrq	$4,%rcx
    748 .byte	0xf3,0x0f,0xa7,232
    749 	movdqa	(%rax),%xmm0
    750 	movdqa	%xmm0,-16(%rdx)
    751 	movq	%r8,%rdi
    752 	movq	%r11,%rbx
    753 	testq	$0x0f,%rdi
    754 	jz	.Lofb_out_aligned
    755 	movq	%rbx,%rcx
    756 	leaq	(%rsp),%rsi
    757 	shrq	$3,%rcx
    758 .byte	0xf3,0x48,0xa5
    759 	subq	%rbx,%rdi
    760 .Lofb_out_aligned:
    761 	movq	%r9,%rsi
    762 	movq	%r10,%rcx
    763 	addq	%rbx,%rdi
    764 	addq	%rbx,%rsi
    765 	subq	%rbx,%rcx
    766 	movq	$512,%rbx
    767 	jnz	.Lofb_loop
    768 	cmpq	%rbp,%rsp
    769 	je	.Lofb_done
    770 
    771 	pxor	%xmm0,%xmm0
    772 	leaq	(%rsp),%rax
    773 .Lofb_bzero:
    774 	movaps	%xmm0,(%rax)
    775 	leaq	16(%rax),%rax
    776 	cmpq	%rax,%rbp
    777 	ja	.Lofb_bzero
    778 
    779 .Lofb_done:
    780 	leaq	(%rbp),%rsp
    781 	jmp	.Lofb_exit
    782 
    783 .align	16
    784 .Lofb_aligned:
    785 	leaq	-16(%rdx),%rax
    786 	leaq	16(%rdx),%rbx
    787 	shrq	$4,%rcx
    788 .byte	0xf3,0x0f,0xa7,232
    789 	movdqa	(%rax),%xmm0
    790 	movdqa	%xmm0,-16(%rdx)
    791 .Lofb_exit:
    792 	movl	$1,%eax
    793 	leaq	8(%rsp),%rsp
    794 .Lofb_abort:
    795 	popq	%rbx
    796 	popq	%rbp
    797 	.byte	0xf3,0xc3
    798 .size	padlock_ofb_encrypt,.-padlock_ofb_encrypt
    799 .globl	padlock_ctr32_encrypt
    800 .type	padlock_ctr32_encrypt,@function
    801 .align	16
    802 padlock_ctr32_encrypt:
    803 	pushq	%rbp
    804 	pushq	%rbx
    805 
    806 	xorl	%eax,%eax
    807 	testq	$15,%rdx
    808 	jnz	.Lctr32_abort
    809 	testq	$15,%rcx
    810 	jnz	.Lctr32_abort
    811 	leaq	.Lpadlock_saved_context(%rip),%rax
    812 	pushf
    813 	cld
    814 	call	_padlock_verify_ctx
    815 	leaq	16(%rdx),%rdx
    816 	xorl	%eax,%eax
    817 	xorl	%ebx,%ebx
    818 	testl	$32,(%rdx)
    819 	jnz	.Lctr32_aligned
    820 	testq	$0x0f,%rdi
    821 	setz	%al
    822 	testq	$0x0f,%rsi
    823 	setz	%bl
    824 	testl	%ebx,%eax
    825 	jnz	.Lctr32_aligned
    826 	negq	%rax
    827 	movq	$512,%rbx
    828 	notq	%rax
    829 	leaq	(%rsp),%rbp
    830 	cmpq	%rbx,%rcx
    831 	cmovcq	%rcx,%rbx
    832 	andq	%rbx,%rax
    833 	movq	%rcx,%rbx
    834 	negq	%rax
    835 	andq	$512-1,%rbx
    836 	leaq	(%rax,%rbp,1),%rsp
    837 	movq	$512,%rax
    838 	cmovzq	%rax,%rbx
    839 .Lctr32_reenter:
    840 	movl	-4(%rdx),%eax
    841 	bswapl	%eax
    842 	negl	%eax
    843 	andl	$31,%eax
    844 	movq	$512,%rbx
    845 	shll	$4,%eax
    846 	cmovzq	%rbx,%rax
    847 	cmpq	%rax,%rcx
    848 	cmovaq	%rax,%rbx
    849 	cmovbeq	%rcx,%rbx
    850 	cmpq	%rbx,%rcx
    851 	ja	.Lctr32_loop
    852 	movq	%rsi,%rax
    853 	cmpq	%rsp,%rbp
    854 	cmoveq	%rdi,%rax
    855 	addq	%rcx,%rax
    856 	negq	%rax
    857 	andq	$0xfff,%rax
    858 	cmpq	$32,%rax
    859 	movq	$-32,%rax
    860 	cmovaeq	%rbx,%rax
    861 	andq	%rax,%rbx
    862 	jz	.Lctr32_unaligned_tail
    863 	jmp	.Lctr32_loop
    864 .align	16
    865 .Lctr32_loop:
    866 	cmpq	%rcx,%rbx
    867 	cmovaq	%rcx,%rbx
    868 	movq	%rdi,%r8
    869 	movq	%rsi,%r9
    870 	movq	%rcx,%r10
    871 	movq	%rbx,%rcx
    872 	movq	%rbx,%r11
    873 	testq	$0x0f,%rdi
    874 	cmovnzq	%rsp,%rdi
    875 	testq	$0x0f,%rsi
    876 	jz	.Lctr32_inp_aligned
    877 	shrq	$3,%rcx
    878 .byte	0xf3,0x48,0xa5
    879 	subq	%rbx,%rdi
    880 	movq	%rbx,%rcx
    881 	movq	%rdi,%rsi
    882 .Lctr32_inp_aligned:
    883 	leaq	-16(%rdx),%rax
    884 	leaq	16(%rdx),%rbx
    885 	shrq	$4,%rcx
    886 .byte	0xf3,0x0f,0xa7,216
    887 	movl	-4(%rdx),%eax
    888 	testl	$0xffff0000,%eax
    889 	jnz	.Lctr32_no_carry
    890 	bswapl	%eax
    891 	addl	$0x10000,%eax
    892 	bswapl	%eax
    893 	movl	%eax,-4(%rdx)
    894 .Lctr32_no_carry:
    895 	movq	%r8,%rdi
    896 	movq	%r11,%rbx
    897 	testq	$0x0f,%rdi
    898 	jz	.Lctr32_out_aligned
    899 	movq	%rbx,%rcx
    900 	leaq	(%rsp),%rsi
    901 	shrq	$3,%rcx
    902 .byte	0xf3,0x48,0xa5
    903 	subq	%rbx,%rdi
    904 .Lctr32_out_aligned:
    905 	movq	%r9,%rsi
    906 	movq	%r10,%rcx
    907 	addq	%rbx,%rdi
    908 	addq	%rbx,%rsi
    909 	subq	%rbx,%rcx
    910 	movq	$512,%rbx
    911 	jz	.Lctr32_break
    912 	cmpq	%rbx,%rcx
    913 	jae	.Lctr32_loop
    914 	movq	%rcx,%rbx
    915 	movq	%rsi,%rax
    916 	cmpq	%rsp,%rbp
    917 	cmoveq	%rdi,%rax
    918 	addq	%rcx,%rax
    919 	negq	%rax
    920 	andq	$0xfff,%rax
    921 	cmpq	$32,%rax
    922 	movq	$-32,%rax
    923 	cmovaeq	%rbx,%rax
    924 	andq	%rax,%rbx
    925 	jnz	.Lctr32_loop
    926 .Lctr32_unaligned_tail:
    927 	xorl	%eax,%eax
    928 	cmpq	%rsp,%rbp
    929 	cmoveq	%rcx,%rax
    930 	movq	%rdi,%r8
    931 	movq	%rcx,%rbx
    932 	subq	%rax,%rsp
    933 	shrq	$3,%rcx
    934 	leaq	(%rsp),%rdi
    935 .byte	0xf3,0x48,0xa5
    936 	movq	%rsp,%rsi
    937 	movq	%r8,%rdi
    938 	movq	%rbx,%rcx
    939 	jmp	.Lctr32_loop
    940 .align	16
    941 .Lctr32_break:
    942 	cmpq	%rbp,%rsp
    943 	je	.Lctr32_done
    944 
    945 	pxor	%xmm0,%xmm0
    946 	leaq	(%rsp),%rax
    947 .Lctr32_bzero:
    948 	movaps	%xmm0,(%rax)
    949 	leaq	16(%rax),%rax
    950 	cmpq	%rax,%rbp
    951 	ja	.Lctr32_bzero
    952 
    953 .Lctr32_done:
    954 	leaq	(%rbp),%rsp
    955 	jmp	.Lctr32_exit
    956 
    957 .align	16
    958 .Lctr32_aligned:
    959 	movl	-4(%rdx),%eax
    960 	bswapl	%eax
    961 	negl	%eax
    962 	andl	$0xffff,%eax
    963 	movq	$1048576,%rbx
    964 	shll	$4,%eax
    965 	cmovzq	%rbx,%rax
    966 	cmpq	%rax,%rcx
    967 	cmovaq	%rax,%rbx
    968 	cmovbeq	%rcx,%rbx
    969 	jbe	.Lctr32_aligned_skip
    970 
    971 .Lctr32_aligned_loop:
    972 	movq	%rcx,%r10
    973 	movq	%rbx,%rcx
    974 	movq	%rbx,%r11
    975 
    976 	leaq	-16(%rdx),%rax
    977 	leaq	16(%rdx),%rbx
    978 	shrq	$4,%rcx
    979 .byte	0xf3,0x0f,0xa7,216
    980 
    981 	movl	-4(%rdx),%eax
    982 	bswapl	%eax
    983 	addl	$0x10000,%eax
    984 	bswapl	%eax
    985 	movl	%eax,-4(%rdx)
    986 
    987 	movq	%r10,%rcx
    988 	subq	%r11,%rcx
    989 	movq	$1048576,%rbx
    990 	jz	.Lctr32_exit
    991 	cmpq	%rbx,%rcx
    992 	jae	.Lctr32_aligned_loop
    993 
    994 .Lctr32_aligned_skip:
    995 	leaq	(%rsi,%rcx,1),%rbp
    996 	negq	%rbp
    997 	andq	$0xfff,%rbp
    998 	xorl	%eax,%eax
    999 	cmpq	$32,%rbp
   1000 	movq	$32-1,%rbp
   1001 	cmovaeq	%rax,%rbp
   1002 	andq	%rcx,%rbp
   1003 	subq	%rbp,%rcx
   1004 	jz	.Lctr32_aligned_tail
   1005 	leaq	-16(%rdx),%rax
   1006 	leaq	16(%rdx),%rbx
   1007 	shrq	$4,%rcx
   1008 .byte	0xf3,0x0f,0xa7,216
   1009 	testq	%rbp,%rbp
   1010 	jz	.Lctr32_exit
   1011 
   1012 .Lctr32_aligned_tail:
   1013 	movq	%rdi,%r8
   1014 	movq	%rbp,%rbx
   1015 	movq	%rbp,%rcx
   1016 	leaq	(%rsp),%rbp
   1017 	subq	%rcx,%rsp
   1018 	shrq	$3,%rcx
   1019 	leaq	(%rsp),%rdi
   1020 .byte	0xf3,0x48,0xa5
   1021 	leaq	(%r8),%rdi
   1022 	leaq	(%rsp),%rsi
   1023 	movq	%rbx,%rcx
   1024 	jmp	.Lctr32_loop
   1025 .Lctr32_exit:
   1026 	movl	$1,%eax
   1027 	leaq	8(%rsp),%rsp
   1028 .Lctr32_abort:
   1029 	popq	%rbx
   1030 	popq	%rbp
   1031 	.byte	0xf3,0xc3
   1032 .size	padlock_ctr32_encrypt,.-padlock_ctr32_encrypt
   1033 .byte	86,73,65,32,80,97,100,108,111,99,107,32,120,56,54,95,54,52,32,109,111,100,117,108,101,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
   1034 .align	16
   1035 .data
   1036 .align	8
   1037 .Lpadlock_saved_context:
   1038 .quad	0
   1039 	.section ".note.gnu.property", "a"
   1040 	.p2align 3
   1041 	.long 1f - 0f
   1042 	.long 4f - 1f
   1043 	.long 5
   1044 0:
   1045 	# "GNU" encoded with .byte, since .asciz isn't supported
   1046 	# on Solaris.
   1047 	.byte 0x47
   1048 	.byte 0x4e
   1049 	.byte 0x55
   1050 	.byte 0
   1051 1:
   1052 	.p2align 3
   1053 	.long 0xc0000002
   1054 	.long 3f - 2f
   1055 2:
   1056 	.long 3
   1057 3:
   1058 	.p2align 3
   1059 4:
   1060