]>
Commit | Line | Data |
---|---|---|
360f6dcc HB |
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 | $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,0x7 | |
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 dwords | |
76 | li $temp2,8 | |
77 | 4: | |
78 | sd x0,0($ptr) | |
79 | addi $ptr,$ptr,8 | |
80 | addi $len,$len,-8 | |
81 | bge $len,$temp2,4b # if len>=8 loop | |
82 | bnez $len,1b # if len<8 and len != 0, store remaining bytes | |
83 | ret | |
84 | ___ | |
85 | } | |
86 | ||
87 | ||
88 | print $code; | |
89 | close STDOUT or die "error closing STDOUT: $!"; |