1 | #! /usr/bin/env perl
|
---|
2 | # Copyright 2022-2024 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 | $output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef;
|
---|
13 | $flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef;
|
---|
14 |
|
---|
15 | $output and open STDOUT,">$output";
|
---|
16 |
|
---|
17 | {
|
---|
18 | my ($in_a,$in_b,$len,$x,$temp1,$temp2) = ('a0','a1','a2','t0','t1','t2');
|
---|
19 | $code.=<<___;
|
---|
20 | ################################################################################
|
---|
21 | # int CRYPTO_memcmp(const void * in_a, const void * in_b, size_t len)
|
---|
22 | ################################################################################
|
---|
23 | .text
|
---|
24 | .balign 16
|
---|
25 | .globl CRYPTO_memcmp
|
---|
26 | .type CRYPTO_memcmp,\@function
|
---|
27 | CRYPTO_memcmp:
|
---|
28 | li $x,0
|
---|
29 | beqz $len,2f # len == 0
|
---|
30 | 1:
|
---|
31 | lbu $temp1,0($in_a)
|
---|
32 | lbu $temp2,0($in_b)
|
---|
33 | addi $in_a,$in_a,1
|
---|
34 | addi $in_b,$in_b,1
|
---|
35 | addi $len,$len,-1
|
---|
36 | xor $temp1,$temp1,$temp2
|
---|
37 | or $x,$x,$temp1
|
---|
38 | bgtz $len,1b
|
---|
39 | 2:
|
---|
40 | mv a0,$x
|
---|
41 | ret
|
---|
42 | ___
|
---|
43 | }
|
---|
44 | {
|
---|
45 | my ($ptr,$len,$temp1,$temp2) = ('a0','a1','t0','t1');
|
---|
46 | $code.=<<___;
|
---|
47 | ################################################################################
|
---|
48 | # void OPENSSL_cleanse(void *ptr, size_t len)
|
---|
49 | ################################################################################
|
---|
50 | .text
|
---|
51 | .balign 16
|
---|
52 | .globl OPENSSL_cleanse
|
---|
53 | .type OPENSSL_cleanse,\@function
|
---|
54 | OPENSSL_cleanse:
|
---|
55 | beqz $len,2f # len == 0, return
|
---|
56 | srli $temp1,$len,4
|
---|
57 | bnez $temp1,3f # len > 15
|
---|
58 |
|
---|
59 | 1: # Store <= 15 individual bytes
|
---|
60 | sb x0,0($ptr)
|
---|
61 | addi $ptr,$ptr,1
|
---|
62 | addi $len,$len,-1
|
---|
63 | bnez $len,1b
|
---|
64 | 2:
|
---|
65 | ret
|
---|
66 |
|
---|
67 | 3: # Store individual bytes until we are aligned
|
---|
68 | andi $temp1,$ptr,0x3
|
---|
69 | beqz $temp1,4f
|
---|
70 | sb x0,0($ptr)
|
---|
71 | addi $ptr,$ptr,1
|
---|
72 | addi $len,$len,-1
|
---|
73 | j 3b
|
---|
74 |
|
---|
75 | 4: # Store aligned words
|
---|
76 | li $temp2,4
|
---|
77 | 4:
|
---|
78 | sw x0,0($ptr)
|
---|
79 | addi $ptr,$ptr,4
|
---|
80 | addi $len,$len,-4
|
---|
81 | bge $len,$temp2,4b # if len>=4 loop
|
---|
82 | bnez $len,1b # if len<4 and len != 0, store remaining bytes
|
---|
83 | ret
|
---|
84 | ___
|
---|
85 | }
|
---|
86 |
|
---|
87 | {
|
---|
88 | my ($ret) = ('a0');
|
---|
89 | $code .= <<___;
|
---|
90 | ################################################################################
|
---|
91 | # size_t riscv_vlen_asm(void)
|
---|
92 | # Return VLEN (i.e. the length of a vector register in bits).
|
---|
93 | .p2align 3
|
---|
94 | .globl riscv_vlen_asm
|
---|
95 | .type riscv_vlen_asm,\@function
|
---|
96 | riscv_vlen_asm:
|
---|
97 | csrr $ret, vlenb
|
---|
98 | slli $ret, $ret, 3
|
---|
99 | ret
|
---|
100 | .size riscv_vlen_asm,.-riscv_vlen_asm
|
---|
101 | ___
|
---|
102 | }
|
---|
103 |
|
---|
104 | print $code;
|
---|
105 | close STDOUT or die "error closing STDOUT: $!";
|
---|