Merge branch 'master' of git://git.denx.de/u-boot-spi
[platform/kernel/u-boot.git] / lib / efi_selftest / efi_selftest_exception.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * efi_selftest_exception
4  *
5  * Copyright (c) 2018 Heinrich Schuchardt <xypron.glpk@gmx.de>
6  *
7  * Test the handling of exceptions by trying to execute an undefined
8  * instruction.
9  */
10
11 #include <efi_selftest.h>
12
13 /**
14  * undefined_instruction() - try to executed an undefined instruction
15  */
16 static void undefined_instruction(void)
17 {
18 #if defined(CONFIG_ARM)
19         /*
20          * 0xe7f...f.   is undefined in ARM mode
21          * 0xde..       is undefined in Thumb mode
22          */
23         asm volatile (".word 0xe7f7defb\n");
24 #elif defined(CONFIG_RISCV)
25         asm volatile (".word 0xffffffff\n");
26 #elif defined(CONFIG_X86)
27         asm volatile (".word 0xffff\n");
28 #endif
29 }
30
31 /**
32  * execute() - execute unit test
33  *
34  * Return:      EFI_ST_SUCCESS for success
35  */
36 static int execute(void)
37 {
38         undefined_instruction();
39
40         efi_st_error("An undefined instruction exception was not raised\n");
41
42         return EFI_ST_FAILURE;
43 }
44
45 EFI_UNIT_TEST(exception) = {
46         .name = "exception",
47         .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
48         .execute = execute,
49         .on_request = true,
50 };