diff options
Diffstat (limited to 'src/lib/libcrypto/rc4/asm/rc4-x86_64.pl')
-rwxr-xr-x | src/lib/libcrypto/rc4/asm/rc4-x86_64.pl | 177 |
1 files changed, 158 insertions, 19 deletions
diff --git a/src/lib/libcrypto/rc4/asm/rc4-x86_64.pl b/src/lib/libcrypto/rc4/asm/rc4-x86_64.pl index 3a54623495..544386bf53 100755 --- a/src/lib/libcrypto/rc4/asm/rc4-x86_64.pl +++ b/src/lib/libcrypto/rc4/asm/rc4-x86_64.pl | |||
@@ -58,14 +58,18 @@ | |||
58 | # fit for Core2 and therefore the code was modified to skip cloop8 on | 58 | # fit for Core2 and therefore the code was modified to skip cloop8 on |
59 | # this CPU. | 59 | # this CPU. |
60 | 60 | ||
61 | $output=shift; | 61 | $flavour = shift; |
62 | $output = shift; | ||
63 | if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } | ||
64 | |||
65 | $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); | ||
62 | 66 | ||
63 | $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; | 67 | $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; |
64 | ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or | 68 | ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or |
65 | ( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or | 69 | ( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or |
66 | die "can't locate x86_64-xlate.pl"; | 70 | die "can't locate x86_64-xlate.pl"; |
67 | 71 | ||
68 | open STDOUT,"| $^X $xlate $output"; | 72 | open STDOUT,"| $^X $xlate $flavour $output"; |
69 | 73 | ||
70 | $dat="%rdi"; # arg1 | 74 | $dat="%rdi"; # arg1 |
71 | $len="%rsi"; # arg2 | 75 | $len="%rsi"; # arg2 |
@@ -87,8 +91,10 @@ RC4: or $len,$len | |||
87 | jne .Lentry | 91 | jne .Lentry |
88 | ret | 92 | ret |
89 | .Lentry: | 93 | .Lentry: |
94 | push %rbx | ||
90 | push %r12 | 95 | push %r12 |
91 | push %r13 | 96 | push %r13 |
97 | .Lprologue: | ||
92 | 98 | ||
93 | add \$8,$dat | 99 | add \$8,$dat |
94 | movl -8($dat),$XX[0]#d | 100 | movl -8($dat),$XX[0]#d |
@@ -133,16 +139,8 @@ $code.=<<___; | |||
133 | jnz .Lloop8 | 139 | jnz .Lloop8 |
134 | cmp \$0,$len | 140 | cmp \$0,$len |
135 | jne .Lloop1 | 141 | jne .Lloop1 |
136 | ___ | 142 | jmp .Lexit |
137 | $code.=<<___; | ||
138 | .Lexit: | ||
139 | sub \$1,$XX[0]#b | ||
140 | movl $XX[0]#d,-8($dat) | ||
141 | movl $YY#d,-4($dat) | ||
142 | 143 | ||
143 | pop %r13 | ||
144 | pop %r12 | ||
145 | ret | ||
146 | .align 16 | 144 | .align 16 |
147 | .Lloop1: | 145 | .Lloop1: |
148 | add $TX[0]#b,$YY#b | 146 | add $TX[0]#b,$YY#b |
@@ -167,9 +165,8 @@ $code.=<<___; | |||
167 | movzb ($dat,$XX[0]),$TX[0]#d | 165 | movzb ($dat,$XX[0]),$TX[0]#d |
168 | test \$-8,$len | 166 | test \$-8,$len |
169 | jz .Lcloop1 | 167 | jz .Lcloop1 |
170 | cmp \$0,260($dat) | 168 | cmpl \$0,260($dat) |
171 | jnz .Lcloop1 | 169 | jnz .Lcloop1 |
172 | push %rbx | ||
173 | jmp .Lcloop8 | 170 | jmp .Lcloop8 |
174 | .align 16 | 171 | .align 16 |
175 | .Lcloop8: | 172 | .Lcloop8: |
@@ -224,7 +221,6 @@ $code.=<<___; | |||
224 | 221 | ||
225 | test \$-8,$len | 222 | test \$-8,$len |
226 | jnz .Lcloop8 | 223 | jnz .Lcloop8 |
227 | pop %rbx | ||
228 | cmp \$0,$len | 224 | cmp \$0,$len |
229 | jne .Lcloop1 | 225 | jne .Lcloop1 |
230 | jmp .Lexit | 226 | jmp .Lexit |
@@ -249,6 +245,19 @@ $code.=<<___; | |||
249 | sub \$1,$len | 245 | sub \$1,$len |
250 | jnz .Lcloop1 | 246 | jnz .Lcloop1 |
251 | jmp .Lexit | 247 | jmp .Lexit |
248 | |||
249 | .align 16 | ||
250 | .Lexit: | ||
251 | sub \$1,$XX[0]#b | ||
252 | movl $XX[0]#d,-8($dat) | ||
253 | movl $YY#d,-4($dat) | ||
254 | |||
255 | mov (%rsp),%r13 | ||
256 | mov 8(%rsp),%r12 | ||
257 | mov 16(%rsp),%rbx | ||
258 | add \$24,%rsp | ||
259 | .Lepilogue: | ||
260 | ret | ||
252 | .size RC4,.-RC4 | 261 | .size RC4,.-RC4 |
253 | ___ | 262 | ___ |
254 | 263 | ||
@@ -269,6 +278,7 @@ RC4_set_key: | |||
269 | xor $ido,$ido | 278 | xor $ido,$ido |
270 | xor %r10,%r10 | 279 | xor %r10,%r10 |
271 | xor %r11,%r11 | 280 | xor %r11,%r11 |
281 | |||
272 | mov PIC_GOT(OPENSSL_ia32cap_P),$idx#d | 282 | mov PIC_GOT(OPENSSL_ia32cap_P),$idx#d |
273 | bt \$20,$idx#d | 283 | bt \$20,$idx#d |
274 | jnc .Lw1stloop | 284 | jnc .Lw1stloop |
@@ -332,11 +342,10 @@ RC4_set_key: | |||
332 | .size RC4_set_key,.-RC4_set_key | 342 | .size RC4_set_key,.-RC4_set_key |
333 | 343 | ||
334 | .globl RC4_options | 344 | .globl RC4_options |
335 | .type RC4_options,\@function,0 | 345 | .type RC4_options,\@abi-omnipotent |
336 | .align 16 | 346 | .align 16 |
337 | RC4_options: | 347 | RC4_options: |
338 | .picmeup %rax | 348 | lea .Lopts(%rip),%rax |
339 | lea .Lopts-.(%rax),%rax | ||
340 | mov PIC_GOT(OPENSSL_ia32cap_P),%edx | 349 | mov PIC_GOT(OPENSSL_ia32cap_P),%edx |
341 | bt \$20,%edx | 350 | bt \$20,%edx |
342 | jnc .Ldone | 351 | jnc .Ldone |
@@ -356,9 +365,139 @@ RC4_options: | |||
356 | .size RC4_options,.-RC4_options | 365 | .size RC4_options,.-RC4_options |
357 | ___ | 366 | ___ |
358 | 367 | ||
359 | $code =~ s/#([bwd])/$1/gm; | 368 | # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, |
369 | # CONTEXT *context,DISPATCHER_CONTEXT *disp) | ||
370 | if ($win64) { | ||
371 | $rec="%rcx"; | ||
372 | $frame="%rdx"; | ||
373 | $context="%r8"; | ||
374 | $disp="%r9"; | ||
375 | |||
376 | $code.=<<___; | ||
377 | .extern __imp_RtlVirtualUnwind | ||
378 | .type stream_se_handler,\@abi-omnipotent | ||
379 | .align 16 | ||
380 | stream_se_handler: | ||
381 | push %rsi | ||
382 | push %rdi | ||
383 | push %rbx | ||
384 | push %rbp | ||
385 | push %r12 | ||
386 | push %r13 | ||
387 | push %r14 | ||
388 | push %r15 | ||
389 | pushfq | ||
390 | sub \$64,%rsp | ||
391 | |||
392 | mov 120($context),%rax # pull context->Rax | ||
393 | mov 248($context),%rbx # pull context->Rip | ||
394 | |||
395 | lea .Lprologue(%rip),%r10 | ||
396 | cmp %r10,%rbx # context->Rip<prologue label | ||
397 | jb .Lin_prologue | ||
398 | |||
399 | mov 152($context),%rax # pull context->Rsp | ||
400 | |||
401 | lea .Lepilogue(%rip),%r10 | ||
402 | cmp %r10,%rbx # context->Rip>=epilogue label | ||
403 | jae .Lin_prologue | ||
404 | |||
405 | lea 24(%rax),%rax | ||
406 | |||
407 | mov -8(%rax),%rbx | ||
408 | mov -16(%rax),%r12 | ||
409 | mov -24(%rax),%r13 | ||
410 | mov %rbx,144($context) # restore context->Rbx | ||
411 | mov %r12,216($context) # restore context->R12 | ||
412 | mov %r13,224($context) # restore context->R13 | ||
413 | |||
414 | .Lin_prologue: | ||
415 | mov 8(%rax),%rdi | ||
416 | mov 16(%rax),%rsi | ||
417 | mov %rax,152($context) # restore context->Rsp | ||
418 | mov %rsi,168($context) # restore context->Rsi | ||
419 | mov %rdi,176($context) # restore context->Rdi | ||
420 | |||
421 | jmp .Lcommon_seh_exit | ||
422 | .size stream_se_handler,.-stream_se_handler | ||
423 | |||
424 | .type key_se_handler,\@abi-omnipotent | ||
425 | .align 16 | ||
426 | key_se_handler: | ||
427 | push %rsi | ||
428 | push %rdi | ||
429 | push %rbx | ||
430 | push %rbp | ||
431 | push %r12 | ||
432 | push %r13 | ||
433 | push %r14 | ||
434 | push %r15 | ||
435 | pushfq | ||
436 | sub \$64,%rsp | ||
437 | |||
438 | mov 152($context),%rax # pull context->Rsp | ||
439 | mov 8(%rax),%rdi | ||
440 | mov 16(%rax),%rsi | ||
441 | mov %rsi,168($context) # restore context->Rsi | ||
442 | mov %rdi,176($context) # restore context->Rdi | ||
360 | 443 | ||
361 | $code =~ s/RC4_set_key/private_RC4_set_key/g if ($ENV{FIPSCANLIB} ne ""); | 444 | .Lcommon_seh_exit: |
445 | |||
446 | mov 40($disp),%rdi # disp->ContextRecord | ||
447 | mov $context,%rsi # context | ||
448 | mov \$154,%ecx # sizeof(CONTEXT) | ||
449 | .long 0xa548f3fc # cld; rep movsq | ||
450 | |||
451 | mov $disp,%rsi | ||
452 | xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER | ||
453 | mov 8(%rsi),%rdx # arg2, disp->ImageBase | ||
454 | mov 0(%rsi),%r8 # arg3, disp->ControlPc | ||
455 | mov 16(%rsi),%r9 # arg4, disp->FunctionEntry | ||
456 | mov 40(%rsi),%r10 # disp->ContextRecord | ||
457 | lea 56(%rsi),%r11 # &disp->HandlerData | ||
458 | lea 24(%rsi),%r12 # &disp->EstablisherFrame | ||
459 | mov %r10,32(%rsp) # arg5 | ||
460 | mov %r11,40(%rsp) # arg6 | ||
461 | mov %r12,48(%rsp) # arg7 | ||
462 | mov %rcx,56(%rsp) # arg8, (NULL) | ||
463 | call *__imp_RtlVirtualUnwind(%rip) | ||
464 | |||
465 | mov \$1,%eax # ExceptionContinueSearch | ||
466 | add \$64,%rsp | ||
467 | popfq | ||
468 | pop %r15 | ||
469 | pop %r14 | ||
470 | pop %r13 | ||
471 | pop %r12 | ||
472 | pop %rbp | ||
473 | pop %rbx | ||
474 | pop %rdi | ||
475 | pop %rsi | ||
476 | ret | ||
477 | .size key_se_handler,.-key_se_handler | ||
478 | |||
479 | .section .pdata | ||
480 | .align 4 | ||
481 | .rva .LSEH_begin_RC4 | ||
482 | .rva .LSEH_end_RC4 | ||
483 | .rva .LSEH_info_RC4 | ||
484 | |||
485 | .rva .LSEH_begin_RC4_set_key | ||
486 | .rva .LSEH_end_RC4_set_key | ||
487 | .rva .LSEH_info_RC4_set_key | ||
488 | |||
489 | .section .xdata | ||
490 | .align 8 | ||
491 | .LSEH_info_RC4: | ||
492 | .byte 9,0,0,0 | ||
493 | .rva stream_se_handler | ||
494 | .LSEH_info_RC4_set_key: | ||
495 | .byte 9,0,0,0 | ||
496 | .rva key_se_handler | ||
497 | ___ | ||
498 | } | ||
499 | |||
500 | $code =~ s/#([bwd])/$1/gm; | ||
362 | 501 | ||
363 | print $code; | 502 | print $code; |
364 | 503 | ||