xref: /isa-l_crypto/fips/asm_self_tests.asm (revision 5e4dc74cb917ec2f2265801e68f83fe069451f1d)
1*5e4dc74cSPablo de Lara;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2*5e4dc74cSPablo de Lara;  Copyright(c) 2024 Intel Corporation All rights reserved.
3*5e4dc74cSPablo de Lara;
4*5e4dc74cSPablo de Lara;  Redistribution and use in source and binary forms, with or without
5*5e4dc74cSPablo de Lara;  modification, are permitted provided that the following conditions
6*5e4dc74cSPablo de Lara;  are met:
7*5e4dc74cSPablo de Lara;    * Redistributions of source code must retain the above copyright
8*5e4dc74cSPablo de Lara;      notice, this list of conditions and the following disclaimer.
9*5e4dc74cSPablo de Lara;    * Redistributions in binary form must reproduce the above copyright
10*5e4dc74cSPablo de Lara;      notice, this list of conditions and the following disclaimer in
11*5e4dc74cSPablo de Lara;      the documentation and/or other materials provided with the
12*5e4dc74cSPablo de Lara;      distribution.
13*5e4dc74cSPablo de Lara;    * Neither the name of Intel Corporation nor the names of its
14*5e4dc74cSPablo de Lara;      contributors may be used to endorse or promote products derived
15*5e4dc74cSPablo de Lara;      from this software without specific prior written permission.
16*5e4dc74cSPablo de Lara;
17*5e4dc74cSPablo de Lara;  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*5e4dc74cSPablo de Lara;  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*5e4dc74cSPablo de Lara;  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*5e4dc74cSPablo de Lara;  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*5e4dc74cSPablo de Lara;  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*5e4dc74cSPablo de Lara;  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*5e4dc74cSPablo de Lara;  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*5e4dc74cSPablo de Lara;  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*5e4dc74cSPablo de Lara;  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*5e4dc74cSPablo de Lara;  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*5e4dc74cSPablo de Lara;  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*5e4dc74cSPablo de Lara;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
29*5e4dc74cSPablo de Lara
30*5e4dc74cSPablo de Lara%include "reg_sizes.asm"
31*5e4dc74cSPablo de Lara
32*5e4dc74cSPablo de Laradefault rel
33*5e4dc74cSPablo de Lara
34*5e4dc74cSPablo de Lara%define SELF_TEST_DONE_AND_OK   0x0 ; Same value as success for internal self tests
35*5e4dc74cSPablo de Lara%define SELF_TEST_DONE_AND_FAIL 0x1 ; Same value as failure for internal self tests
36*5e4dc74cSPablo de Lara%define SELF_TEST_NOT_DONE      0x2
37*5e4dc74cSPablo de Lara%define SELF_TEST_RUNNING       0x3
38*5e4dc74cSPablo de Lara
39*5e4dc74cSPablo de Larasection .data
40*5e4dc74cSPablo de Laraalign 16
41*5e4dc74cSPablo de Lara
42*5e4dc74cSPablo de Laraself_test_status:
43*5e4dc74cSPablo de Laradd      SELF_TEST_NOT_DONE
44*5e4dc74cSPablo de Lara
45*5e4dc74cSPablo de Larasection .text
46*5e4dc74cSPablo de Lara
47*5e4dc74cSPablo de Lara%ifidn __OUTPUT_FORMAT__, elf64
48*5e4dc74cSPablo de Lara	%xdefine arg1 edi
49*5e4dc74cSPablo de Lara%else
50*5e4dc74cSPablo de Lara	%xdefine arg1 ecx
51*5e4dc74cSPablo de Lara%endif
52*5e4dc74cSPablo de Lara
53*5e4dc74cSPablo de Lara;
54*5e4dc74cSPablo de Lara; Returns self tests status and sets internal atomic status to SELF_TEST_RUNNING,
55*5e4dc74cSPablo de Lara; if the self tests have not been run yet.
56*5e4dc74cSPablo de Lara;
57*5e4dc74cSPablo de Lara; Returns 0 if self tests were successful
58*5e4dc74cSPablo de Lara; Returns 1 if self tests fail
59*5e4dc74cSPablo de Lara; Returns 3 if self tests not done yet
60*5e4dc74cSPablo de Laraalign 32
61*5e4dc74cSPablo de Laramk_global asm_check_self_tests_status, function
62*5e4dc74cSPablo de Laraasm_check_self_tests_status:
63*5e4dc74cSPablo de Lara        mov     eax, [self_test_status]
64*5e4dc74cSPablo de Lara        ; Check if self tests are done (SELF_TEST_DONE_AND_OK or SELF_TEST_DONE_AND_FAIL, so 0 or 1)
65*5e4dc74cSPablo de Lara        test    eax, 0x2
66*5e4dc74cSPablo de Lara        jnz     check_self_test_not_done
67*5e4dc74cSPablo de Lara
68*5e4dc74cSPablo de Lara        ; Returns 0 or 1
69*5e4dc74cSPablo de Lara        ret
70*5e4dc74cSPablo de Lara
71*5e4dc74cSPablo de Laracheck_self_test_not_done:
72*5e4dc74cSPablo de Lara        ; At this stage, the self tests either have not been run or they are being run by another thread
73*5e4dc74cSPablo de Lara        mov     eax, SELF_TEST_NOT_DONE
74*5e4dc74cSPablo de Lara
75*5e4dc74cSPablo de Lara        mov     edx, SELF_TEST_RUNNING
76*5e4dc74cSPablo de Lara        ; If self tests status == SELF_TEST_NOT_DONE (in eax),
77*5e4dc74cSPablo de Lara        ; change self tests status = SELF_TEST_RUNNING
78*5e4dc74cSPablo de Lara        lock cmpxchg dword [self_test_status], edx
79*5e4dc74cSPablo de Lara        jz      return
80*5e4dc74cSPablo de Lara
81*5e4dc74cSPablo de Lara        ; At this stage, some other thread has started running the tests, so loop until it changes
82*5e4dc74cSPablo de Laracheck_status_loop:
83*5e4dc74cSPablo de Lara        pause
84*5e4dc74cSPablo de Lara        cmp     dword [self_test_status], SELF_TEST_RUNNING
85*5e4dc74cSPablo de Lara        je      check_status_loop
86*5e4dc74cSPablo de Lara
87*5e4dc74cSPablo de Lara        ; Read value set by the other thread and return it
88*5e4dc74cSPablo de Lara        mov     eax, [self_test_status]
89*5e4dc74cSPablo de Larareturn:
90*5e4dc74cSPablo de Lara        ret
91*5e4dc74cSPablo de Lara
92*5e4dc74cSPablo de Lara
93*5e4dc74cSPablo de Laraalign 32
94*5e4dc74cSPablo de Laramk_global asm_set_self_tests_status, function
95*5e4dc74cSPablo de Laraasm_set_self_tests_status:
96*5e4dc74cSPablo de Lara        ; Set self tests status
97*5e4dc74cSPablo de Lara        mov     dword [self_test_status], arg1 ; Either 0 (SELF_TEST_DONE_AND_OK) or 1 (SELF_TEST_DONE_AND_FAIL)
98*5e4dc74cSPablo de Lara        ret
99