1 | #! /usr/bin/env perl
|
---|
2 | # Copyright 2022 The OpenSSL Project Authors. All Rights Reserved.
|
---|
3 | #
|
---|
4 | # Licensed under the Apache License 2.0 (the "License"). You may not use
|
---|
5 | # this file except in compliance with the License. You can obtain a copy
|
---|
6 | # in the file LICENSE in the source distribution or at
|
---|
7 | # https://www.openssl.org/source/license.html
|
---|
8 |
|
---|
9 |
|
---|
10 | # $output is the last argument if it looks like a file (it has an extension)
|
---|
11 | # $flavour is the first argument if it doesn't look like a file
|
---|
12 | ($zero,$ra,$tp,$sp)=map("\$r$_",(0..3));
|
---|
13 | ($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("\$r$_",(4..11));
|
---|
14 | ($t0,$t1,$t2,$t3,$t4,$t5,$t6,$t7,$t8,$t9)=map("\$r$_",(12..21));
|
---|
15 | ($s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7)=map("\$r$_",(23..30));
|
---|
16 | ($vr0,$vr1,$vr2,$vr3,$vr4,$vr5,$vr6,$vr7,$vr8,$vr9,$vr10,$vr11,$vr12,$vr13,$vr14,$vr15,$vr16,$vr17,$vr18,$vr19)=map("\$vr$_",(0..19));
|
---|
17 | ($fp)=map("\$r$_",(22));
|
---|
18 |
|
---|
19 |
|
---|
20 | for (@ARGV) { $output=$_ if (/\w[\w\-]*\.\w+$/); }
|
---|
21 | open STDOUT,">$output";
|
---|
22 | while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
|
---|
23 | open STDOUT,">$output";
|
---|
24 |
|
---|
25 | {
|
---|
26 | my ($in_a,$in_b,$len,$m,$temp1,$temp2) = ($a0,$a1,$a2,$t0,$t1,$t2);
|
---|
27 | $code.=<<___;
|
---|
28 | ################################################################################
|
---|
29 | # int CRYPTO_memcmp(const void * in_a, const void * in_b, size_t len)
|
---|
30 | ################################################################################
|
---|
31 | .text
|
---|
32 | .balign 16
|
---|
33 | .globl CRYPTO_memcmp
|
---|
34 | .type CRYPTO_memcmp,\@function
|
---|
35 | CRYPTO_memcmp:
|
---|
36 | li.d $m,0
|
---|
37 | beqz $len,2f # len == 0
|
---|
38 | 1:
|
---|
39 | ld.bu $temp1,$in_a,0
|
---|
40 | ld.bu $temp2,$in_b,0
|
---|
41 | addi.d $in_a,$in_a,1
|
---|
42 | addi.d $in_b,$in_b,1
|
---|
43 | addi.d $len,$len,-1
|
---|
44 | xor $temp1,$temp1,$temp2
|
---|
45 | or $m,$m,$temp1
|
---|
46 | blt $zero,$len,1b
|
---|
47 | 2:
|
---|
48 | move $a0,$m
|
---|
49 | jr $ra
|
---|
50 | ___
|
---|
51 | }
|
---|
52 | {
|
---|
53 | my ($ptr,$len,$temp1,$temp2) = ($a0,$a1,$t0,$t1);
|
---|
54 | $code.=<<___;
|
---|
55 | ################################################################################
|
---|
56 | # void OPENSSL_cleanse(void *ptr, size_t len)
|
---|
57 | ################################################################################
|
---|
58 | .text
|
---|
59 | .balign 16
|
---|
60 | .globl OPENSSL_cleanse
|
---|
61 | .type OPENSSL_cleanse,\@function
|
---|
62 | OPENSSL_cleanse:
|
---|
63 | beqz $len,2f # len == 0, return
|
---|
64 | srli.d $temp1,$len,4
|
---|
65 | bnez $temp1,3f # len > 15
|
---|
66 |
|
---|
67 | 1: # Store <= 15 individual bytes
|
---|
68 | st.b $zero,$ptr,0
|
---|
69 | addi.d $ptr,$ptr,1
|
---|
70 | addi.d $len,$len,-1
|
---|
71 | bnez $len,1b
|
---|
72 | 2:
|
---|
73 | jr $ra
|
---|
74 |
|
---|
75 | 3: # Store individual bytes until we are aligned
|
---|
76 | andi $temp1,$ptr,0x7
|
---|
77 | beqz $temp1,4f
|
---|
78 | st.b $zero,$ptr,0
|
---|
79 | addi.d $ptr,$ptr,1
|
---|
80 | addi.d $len,$len,-1
|
---|
81 | b 3b
|
---|
82 |
|
---|
83 | 4: # Store aligned dwords
|
---|
84 | li.d $temp2,8
|
---|
85 | 4:
|
---|
86 | st.d $zero,$ptr,0
|
---|
87 | addi.d $ptr,$ptr,8
|
---|
88 | addi.d $len,$len,-8
|
---|
89 | bge $len,$temp2,4b # if len>=8 loop
|
---|
90 | bnez $len,1b # if len<8 and len != 0, store remaining bytes
|
---|
91 | jr $ra
|
---|
92 | ___
|
---|
93 | }
|
---|
94 | {
|
---|
95 | $code.=<<___;
|
---|
96 | ################################################################################
|
---|
97 | # uint32_t OPENSSL_rdtsc(void)
|
---|
98 | ################################################################################
|
---|
99 | .text
|
---|
100 | .balign 16
|
---|
101 | .globl OPENSSL_rdtsc
|
---|
102 | .type OPENSSL_rdtsc,\@function
|
---|
103 | OPENSSL_rdtsc:
|
---|
104 | rdtimel.w $a0,$zero
|
---|
105 | jr $ra
|
---|
106 | ___
|
---|
107 | }
|
---|
108 |
|
---|
109 | $code =~ s/\`([^\`]*)\`/eval($1)/gem;
|
---|
110 |
|
---|
111 | print $code;
|
---|
112 |
|
---|
113 | close STDOUT or die "error closing STDOUT: $!";
|
---|