hc
2024-03-22 a0752693d998599af469473b8dc239ef973a012f
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
#! /usr/bin/env perl
# Copyright 2010-2020 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the OpenSSL license (the "License").  You may not use
# this file except in compliance with the License.  You can obtain a copy
# in the file LICENSE in the source distribution or at
# https://www.openssl.org/source/license.html
 
 
$output = pop;
open STDOUT,">$output";
 
print <<'___';
.text
 
.set    noat
 
.globl    OPENSSL_cpuid_setup
.ent    OPENSSL_cpuid_setup
OPENSSL_cpuid_setup:
   .frame    $30,0,$26
   .prologue 0
   ret    ($26)
.end    OPENSSL_cpuid_setup
 
.globl    OPENSSL_wipe_cpu
.ent    OPENSSL_wipe_cpu
OPENSSL_wipe_cpu:
   .frame    $30,0,$26
   .prologue 0
   clr    $1
   clr    $2
   clr    $3
   clr    $4
   clr    $5
   clr    $6
   clr    $7
   clr    $8
   clr    $16
   clr    $17
   clr    $18
   clr    $19
   clr    $20
   clr    $21
   clr    $22
   clr    $23
   clr    $24
   clr    $25
   clr    $27
   clr    $at
   clr    $29
   fclr    $f0
   fclr    $f1
   fclr    $f10
   fclr    $f11
   fclr    $f12
   fclr    $f13
   fclr    $f14
   fclr    $f15
   fclr    $f16
   fclr    $f17
   fclr    $f18
   fclr    $f19
   fclr    $f20
   fclr    $f21
   fclr    $f22
   fclr    $f23
   fclr    $f24
   fclr    $f25
   fclr    $f26
   fclr    $f27
   fclr    $f28
   fclr    $f29
   fclr    $f30
   mov    $sp,$0
   ret    ($26)
.end    OPENSSL_wipe_cpu
 
.globl    OPENSSL_atomic_add
.ent    OPENSSL_atomic_add
OPENSSL_atomic_add:
   .frame    $30,0,$26
   .prologue 0
1:    ldl_l    $0,0($16)
   addl    $0,$17,$1
   stl_c    $1,0($16)
   beq    $1,1b
   addl    $0,$17,$0
   ret    ($26)
.end    OPENSSL_atomic_add
 
.globl    OPENSSL_rdtsc
.ent    OPENSSL_rdtsc
OPENSSL_rdtsc:
   .frame    $30,0,$26
   .prologue 0
   rpcc    $0
   ret    ($26)
.end    OPENSSL_rdtsc
 
.globl    OPENSSL_cleanse
.ent    OPENSSL_cleanse
OPENSSL_cleanse:
   .frame    $30,0,$26
   .prologue 0
   beq    $17,.Ldone
   and    $16,7,$0
   bic    $17,7,$at
   beq    $at,.Little
   beq    $0,.Laligned
 
.Little:
   subq    $0,8,$0
   ldq_u    $1,0($16)
   mov    $16,$2
.Lalign:
   mskbl    $1,$16,$1
   lda    $16,1($16)
   subq    $17,1,$17
   addq    $0,1,$0
   beq    $17,.Lout
   bne    $0,.Lalign
.Lout:    stq_u    $1,0($2)
   beq    $17,.Ldone
   bic    $17,7,$at
   beq    $at,.Little
 
.Laligned:
   stq    $31,0($16)
   subq    $17,8,$17
   lda    $16,8($16)
   bic    $17,7,$at
   bne    $at,.Laligned
   bne    $17,.Little
.Ldone: ret    ($26)
.end    OPENSSL_cleanse
 
.globl    CRYPTO_memcmp
.ent    CRYPTO_memcmp
CRYPTO_memcmp:
   .frame    $30,0,$26
   .prologue 0
   xor    $0,$0,$0
   beq    $18,.Lno_data
 
   xor    $1,$1,$1
   nop
.Loop_cmp:
   ldq_u    $2,0($16)
   subq    $18,1,$18
   ldq_u    $3,0($17)
   extbl    $2,$16,$2
   lda    $16,1($16)
   extbl    $3,$17,$3
   lda    $17,1($17)
   xor    $3,$2,$2
   or    $2,$0,$0
   bne    $18,.Loop_cmp
 
   subq    $31,$0,$0
   srl    $0,63,$0
.Lno_data:
   ret    ($26)
.end    CRYPTO_memcmp
___
{
my ($out,$cnt,$max)=("\$16","\$17","\$18");
my ($tick,$lasttick)=("\$19","\$20");
my ($diff,$lastdiff)=("\$21","\$22");
my ($v0,$ra,$sp,$zero)=("\$0","\$26","\$30","\$31");
 
print <<___;
.globl    OPENSSL_instrument_bus
.ent    OPENSSL_instrument_bus
OPENSSL_instrument_bus:
   .frame    $sp,0,$ra
   .prologue 0
   mov    $cnt,$v0
 
   rpcc    $lasttick
   mov    0,$diff
 
   ecb    ($out)
   ldl_l    $tick,0($out)
   addl    $diff,$tick,$tick
   mov    $tick,$diff
   stl_c    $tick,0($out)
   stl    $diff,0($out)
 
.Loop:    rpcc    $tick
   subq    $tick,$lasttick,$diff
   mov    $tick,$lasttick
 
   ecb    ($out)
   ldl_l    $tick,0($out)
   addl    $diff,$tick,$tick
   mov    $tick,$diff
   stl_c    $tick,0($out)
   stl    $diff,0($out)
 
   subl    $cnt,1,$cnt
   lda    $out,4($out)
   bne    $cnt,.Loop
 
   ret    ($ra)
.end    OPENSSL_instrument_bus
 
.globl    OPENSSL_instrument_bus2
.ent    OPENSSL_instrument_bus2
OPENSSL_instrument_bus2:
   .frame    $sp,0,$ra
   .prologue 0
   mov    $cnt,$v0
 
   rpcc    $lasttick
   mov    0,$diff
 
   ecb    ($out)
   ldl_l    $tick,0($out)
   addl    $diff,$tick,$tick
   mov    $tick,$diff
   stl_c    $tick,0($out)
   stl    $diff,0($out)
 
   rpcc    $tick
   subq    $tick,$lasttick,$diff
   mov    $tick,$lasttick
   mov    $diff,$lastdiff
.Loop2:
   ecb    ($out)
   ldl_l    $tick,0($out)
   addl    $diff,$tick,$tick
   mov    $tick,$diff
   stl_c    $tick,0($out)
   stl    $diff,0($out)
 
   subl    $max,1,$max
   beq    $max,.Ldone2
 
   rpcc    $tick
   subq    $tick,$lasttick,$diff
   mov    $tick,$lasttick
   subq    $lastdiff,$diff,$tick
   mov    $diff,$lastdiff
   cmovne    $tick,1,$tick
   subl    $cnt,$tick,$cnt
   s4addq    $tick,$out,$out
   bne    $cnt,.Loop2
 
.Ldone2:
   subl    $v0,$cnt,$v0
   ret    ($ra)
.end    OPENSSL_instrument_bus2
___
}
 
close STDOUT or die "error closing STDOUT: $!";