1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#!/usr/bin/env perl
#
# ====================================================================
# Written by Nikos Mavrogiannopoulos
# Based on e_padlock-x86_64
# ====================================================================
#
$flavour = shift;
$output = shift;
if ($flavour =~ /\./) { $output = $flavour; undef $flavour; }
$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/);
$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
( $xlate="${dir}../../crypto/perlasm/x86_64-xlate.pl" and -f $xlate) or
die "can't locate x86_64-xlate.pl";
open STDOUT,"| $^X $xlate $flavour $output";
$code=".text\n";
($arg1,$arg2,$arg3,$arg4)=$win64?("%rcx","%rdx","%r8", "%r9") : # Win64 order
("%rdi","%rsi","%rdx","%rcx"); # Unix order
$code.=<<___;
.globl gnutls_cpuid
.type gnutls_cpuid,\@function
.align 16
gnutls_cpuid:
pushq %rbp
movq %rsp, %rbp
pushq %rbx
movl %edi, -12(%rbp)
movq %rsi, -24(%rbp)
movq %rdx, -32(%rbp)
movq %rcx, -40(%rbp)
movq %r8, -48(%rbp)
movl -12(%rbp), %eax
movl %eax, -60(%rbp)
movl -60(%rbp), %eax
cpuid
movl %edx, -56(%rbp)
movl %ecx, %esi
movl %eax, -52(%rbp)
movq -24(%rbp), %rax
movl -52(%rbp), %edx
movl %edx, (%rax)
movq -32(%rbp), %rax
movl %ebx, (%rax)
movq -40(%rbp), %rax
movl %esi, (%rax)
movq -48(%rbp), %rax
movl -56(%rbp), %ecx
movl %ecx, (%rax)
popq %rbx
leave
ret
.size gnutls_cpuid,.-gnutls_cpuid
___
$code =~ s/\`([^\`]*)\`/eval($1)/gem;
print $code;
close STDOUT;
|