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