Home | History | Annotate | Line # | Download | only in crypto
      1 #! /usr/bin/env perl
      2 # Copyright 2022-2025 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     # 0xc22 is CSR vlenb
     98     csrr $ret, 0xc22
     99     slli $ret, $ret, 3
    100     ret
    101 .size riscv_vlen_asm,.-riscv_vlen_asm
    102 ___
    103 }
    104 
    105 print $code;
    106 close STDOUT or die "error closing STDOUT: $!";
    107