xref: /onnv-gate/usr/src/common/openssl/crypto/x86_64cpuid.pl (revision 2139:6243c3338933)
1*2139Sjp161948#!/usr/bin/env perl
2*2139Sjp161948
3*2139Sjp161948$output=shift;
4*2139Sjp161948$win64a=1 if ($output =~ /win64a\.[s|asm]/);
5*2139Sjp161948open STDOUT,">$output" || die "can't open $output: $!";
6*2139Sjp161948
7*2139Sjp161948print<<___ if(defined($win64a));
8*2139Sjp161948_TEXT	SEGMENT
9*2139Sjp161948PUBLIC	OPENSSL_rdtsc
10*2139Sjp161948ALIGN	16
11*2139Sjp161948OPENSSL_rdtsc	PROC
12*2139Sjp161948	rdtsc
13*2139Sjp161948	shl	rdx,32
14*2139Sjp161948	or	rax,rdx
15*2139Sjp161948	ret
16*2139Sjp161948OPENSSL_rdtsc	ENDP
17*2139Sjp161948
18*2139Sjp161948PUBLIC	OPENSSL_atomic_add
19*2139Sjp161948ALIGN	16
20*2139Sjp161948OPENSSL_atomic_add	PROC
21*2139Sjp161948	mov	eax,DWORD PTR[rcx]
22*2139Sjp161948\$Lspin:	lea	r8,DWORD PTR[rdx+rax]
23*2139Sjp161948lock	cmpxchg	DWORD PTR[rcx],r8d
24*2139Sjp161948	jne	\$Lspin
25*2139Sjp161948	mov	eax,r8d
26*2139Sjp161948	cdqe
27*2139Sjp161948	ret
28*2139Sjp161948OPENSSL_atomic_add	ENDP
29*2139Sjp161948
30*2139Sjp161948PUBLIC	OPENSSL_wipe_cpu
31*2139Sjp161948ALIGN	16
32*2139Sjp161948OPENSSL_wipe_cpu	PROC
33*2139Sjp161948	pxor	xmm0,xmm0
34*2139Sjp161948	pxor	xmm1,xmm1
35*2139Sjp161948	pxor	xmm2,xmm2
36*2139Sjp161948	pxor	xmm3,xmm3
37*2139Sjp161948	pxor	xmm4,xmm4
38*2139Sjp161948	pxor	xmm5,xmm5
39*2139Sjp161948	xor	rcx,rcx
40*2139Sjp161948	xor	rdx,rdx
41*2139Sjp161948	xor	r8,r8
42*2139Sjp161948	xor	r9,r9
43*2139Sjp161948	xor	r10,r10
44*2139Sjp161948	xor	r11,r11
45*2139Sjp161948	lea	rax,QWORD PTR[rsp+8]
46*2139Sjp161948	ret
47*2139Sjp161948OPENSSL_wipe_cpu	ENDP
48*2139Sjp161948
49*2139Sjp161948OPENSSL_ia32_cpuid	PROC
50*2139Sjp161948	mov	r8,rbx
51*2139Sjp161948	mov	eax,1
52*2139Sjp161948	cpuid
53*2139Sjp161948	shl	rcx,32
54*2139Sjp161948	mov	eax,edx
55*2139Sjp161948	mov	rbx,r8
56*2139Sjp161948	or	rax,rcx
57*2139Sjp161948	ret
58*2139Sjp161948OPENSSL_ia32_cpuid	ENDP
59*2139Sjp161948_TEXT	ENDS
60*2139Sjp161948
61*2139Sjp161948CRT\$XIU	SEGMENT
62*2139Sjp161948EXTRN	OPENSSL_cpuid_setup:PROC
63*2139Sjp161948DQ	OPENSSL_cpuid_setup
64*2139Sjp161948CRT\$XIU	ENDS
65*2139Sjp161948END
66*2139Sjp161948___
67*2139Sjp161948print<<___ if(!defined($win64a));
68*2139Sjp161948.text
69*2139Sjp161948.globl	OPENSSL_rdtsc
70*2139Sjp161948.align	16
71*2139Sjp161948OPENSSL_rdtsc:
72*2139Sjp161948	rdtsc
73*2139Sjp161948	shlq	\$32,%rdx
74*2139Sjp161948	orq	%rdx,%rax
75*2139Sjp161948	ret
76*2139Sjp161948.size	OPENSSL_rdtsc,.-OPENSSL_rdtsc
77*2139Sjp161948
78*2139Sjp161948.globl	OPENSSL_atomic_add
79*2139Sjp161948.type	OPENSSL_atomic_add,\@function
80*2139Sjp161948.align	16
81*2139Sjp161948OPENSSL_atomic_add:
82*2139Sjp161948	movl	(%rdi),%eax
83*2139Sjp161948.Lspin:	leaq	(%rsi,%rax),%r8
84*2139Sjp161948lock;	cmpxchgl	%r8d,(%rdi)
85*2139Sjp161948	jne	.Lspin
86*2139Sjp161948	movl	%r8d,%eax
87*2139Sjp161948	.byte	0x48,0x98
88*2139Sjp161948	ret
89*2139Sjp161948.size	OPENSSL_atomic_add,.-OPENSSL_atomic_add
90*2139Sjp161948
91*2139Sjp161948.globl	OPENSSL_wipe_cpu
92*2139Sjp161948.type	OPENSSL_wipe_cpu,\@function
93*2139Sjp161948.align	16
94*2139Sjp161948OPENSSL_wipe_cpu:
95*2139Sjp161948	pxor	%xmm0,%xmm0
96*2139Sjp161948	pxor	%xmm1,%xmm1
97*2139Sjp161948	pxor	%xmm2,%xmm2
98*2139Sjp161948	pxor	%xmm3,%xmm3
99*2139Sjp161948	pxor	%xmm4,%xmm4
100*2139Sjp161948	pxor	%xmm5,%xmm5
101*2139Sjp161948	pxor	%xmm6,%xmm6
102*2139Sjp161948	pxor	%xmm7,%xmm7
103*2139Sjp161948	pxor	%xmm8,%xmm8
104*2139Sjp161948	pxor	%xmm9,%xmm9
105*2139Sjp161948	pxor	%xmm10,%xmm10
106*2139Sjp161948	pxor	%xmm11,%xmm11
107*2139Sjp161948	pxor	%xmm12,%xmm12
108*2139Sjp161948	pxor	%xmm13,%xmm13
109*2139Sjp161948	pxor	%xmm14,%xmm14
110*2139Sjp161948	pxor	%xmm15,%xmm15
111*2139Sjp161948	xorq	%rcx,%rcx
112*2139Sjp161948	xorq	%rdx,%rdx
113*2139Sjp161948	xorq	%rsi,%rsi
114*2139Sjp161948	xorq	%rdi,%rdi
115*2139Sjp161948	xorq	%r8,%r8
116*2139Sjp161948	xorq	%r9,%r9
117*2139Sjp161948	xorq	%r10,%r10
118*2139Sjp161948	xorq	%r11,%r11
119*2139Sjp161948	leaq	8(%rsp),%rax
120*2139Sjp161948	ret
121*2139Sjp161948.size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
122*2139Sjp161948
123*2139Sjp161948.globl	OPENSSL_ia32_cpuid
124*2139Sjp161948.align	16
125*2139Sjp161948OPENSSL_ia32_cpuid:
126*2139Sjp161948	movq	%rbx,%r8
127*2139Sjp161948	movl	\$1,%eax
128*2139Sjp161948	cpuid
129*2139Sjp161948	shlq	\$32,%rcx
130*2139Sjp161948	movl	%edx,%eax
131*2139Sjp161948	movq	%r8,%rbx
132*2139Sjp161948	orq	%rcx,%rax
133*2139Sjp161948	ret
134*2139Sjp161948.size	OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid
135*2139Sjp161948
136*2139Sjp161948.section	.init
137*2139Sjp161948	call	OPENSSL_cpuid_setup
138*2139Sjp161948___
139