1f739fcd8STom Rini /* SPDX-License-Identifier: GPL-2.0+ */ 2623b3a57SHeinrich Schuchardt /* 3623b3a57SHeinrich Schuchardt * EFI application loader 4623b3a57SHeinrich Schuchardt * 5623b3a57SHeinrich Schuchardt * Copyright (c) 2017 Heinrich Schuchardt <xypron.glpk@gmx.de> 6623b3a57SHeinrich Schuchardt */ 7623b3a57SHeinrich Schuchardt 8623b3a57SHeinrich Schuchardt #ifndef _EFI_SELFTEST_H 9623b3a57SHeinrich Schuchardt #define _EFI_SELFTEST_H 10623b3a57SHeinrich Schuchardt 11623b3a57SHeinrich Schuchardt #include <common.h> 12623b3a57SHeinrich Schuchardt #include <efi.h> 13623b3a57SHeinrich Schuchardt #include <efi_api.h> 14d78e40d6SHeinrich Schuchardt #include <efi_loader.h> 15623b3a57SHeinrich Schuchardt #include <linker_lists.h> 16623b3a57SHeinrich Schuchardt 17e67e7249SHeinrich Schuchardt #define EFI_ST_SUCCESS 0 18e67e7249SHeinrich Schuchardt #define EFI_ST_FAILURE 1 19e67e7249SHeinrich Schuchardt 20623b3a57SHeinrich Schuchardt /* 21853540c8SHeinrich Schuchardt * Prints a message. 22853540c8SHeinrich Schuchardt */ 23853540c8SHeinrich Schuchardt #define efi_st_printf(...) \ 24853540c8SHeinrich Schuchardt (efi_st_printc(-1, __VA_ARGS__)) 25853540c8SHeinrich Schuchardt 26853540c8SHeinrich Schuchardt /* 27623b3a57SHeinrich Schuchardt * Prints an error message. 28623b3a57SHeinrich Schuchardt * 29623b3a57SHeinrich Schuchardt * @... format string followed by fields to print 30623b3a57SHeinrich Schuchardt */ 31623b3a57SHeinrich Schuchardt #define efi_st_error(...) \ 32853540c8SHeinrich Schuchardt (efi_st_printc(EFI_LIGHTRED, "%s(%u):\nERROR: ", __FILE__, __LINE__), \ 33853540c8SHeinrich Schuchardt efi_st_printc(EFI_LIGHTRED, __VA_ARGS__)) 34623b3a57SHeinrich Schuchardt 35623b3a57SHeinrich Schuchardt /* 36927ca890SHeinrich Schuchardt * Prints a TODO message. 37927ca890SHeinrich Schuchardt * 38927ca890SHeinrich Schuchardt * @... format string followed by fields to print 39927ca890SHeinrich Schuchardt */ 40927ca890SHeinrich Schuchardt #define efi_st_todo(...) \ 41853540c8SHeinrich Schuchardt (efi_st_printc(EFI_YELLOW, "%s(%u):\nTODO: ", __FILE__, __LINE__), \ 42853540c8SHeinrich Schuchardt efi_st_printc(EFI_YELLOW, __VA_ARGS__)) \ 43927ca890SHeinrich Schuchardt 44927ca890SHeinrich Schuchardt /* 45623b3a57SHeinrich Schuchardt * A test may be setup and executed at boottime, 46623b3a57SHeinrich Schuchardt * it may be setup at boottime and executed at runtime, 47623b3a57SHeinrich Schuchardt * or it may be setup and executed at runtime. 48623b3a57SHeinrich Schuchardt */ 49623b3a57SHeinrich Schuchardt enum efi_test_phase { 50623b3a57SHeinrich Schuchardt EFI_EXECUTE_BEFORE_BOOTTIME_EXIT = 1, 51623b3a57SHeinrich Schuchardt EFI_SETUP_BEFORE_BOOTTIME_EXIT, 52623b3a57SHeinrich Schuchardt EFI_SETUP_AFTER_BOOTTIME_EXIT, 53623b3a57SHeinrich Schuchardt }; 54623b3a57SHeinrich Schuchardt 55623b3a57SHeinrich Schuchardt extern struct efi_simple_text_output_protocol *con_out; 563e603ec7SHeinrich Schuchardt extern struct efi_simple_text_input_protocol *con_in; 57623b3a57SHeinrich Schuchardt 58623b3a57SHeinrich Schuchardt /* 59623b3a57SHeinrich Schuchardt * Exit the boot services. 60623b3a57SHeinrich Schuchardt * 61623b3a57SHeinrich Schuchardt * The size of the memory map is determined. 62623b3a57SHeinrich Schuchardt * Pool memory is allocated to copy the memory map. 63623b3a57SHeinrich Schuchardt * The memory amp is copied and the map key is obtained. 64623b3a57SHeinrich Schuchardt * The map key is used to exit the boot services. 65623b3a57SHeinrich Schuchardt */ 66623b3a57SHeinrich Schuchardt void efi_st_exit_boot_services(void); 67623b3a57SHeinrich Schuchardt 68623b3a57SHeinrich Schuchardt /* 69853540c8SHeinrich Schuchardt * Print a colored message 70623b3a57SHeinrich Schuchardt * 71853540c8SHeinrich Schuchardt * @color color, see constants in efi_api.h, use -1 for no color 72853540c8SHeinrich Schuchardt * @fmt printf format 73853540c8SHeinrich Schuchardt * @... arguments to be printed 74623b3a57SHeinrich Schuchardt * on return position of terminating zero word 75623b3a57SHeinrich Schuchardt */ 76853540c8SHeinrich Schuchardt void efi_st_printc(int color, const char *fmt, ...) 77853540c8SHeinrich Schuchardt __attribute__ ((format (__printf__, 2, 3))); 78623b3a57SHeinrich Schuchardt 79*262ff411SHeinrich Schuchardt /** 80*262ff411SHeinrich Schuchardt * efi_st_translate_char() - translate a unicode character to a string 81*262ff411SHeinrich Schuchardt * 82*262ff411SHeinrich Schuchardt * @code: unicode character 83*262ff411SHeinrich Schuchardt * Return: string 84*262ff411SHeinrich Schuchardt */ 85*262ff411SHeinrich Schuchardt u16 *efi_st_translate_char(u16 code); 86*262ff411SHeinrich Schuchardt 87*262ff411SHeinrich Schuchardt /** 88*262ff411SHeinrich Schuchardt * efi_st_translate_code() - translate a scan code to a human readable string 89*262ff411SHeinrich Schuchardt * 90*262ff411SHeinrich Schuchardt * @code: unicode character 91*262ff411SHeinrich Schuchardt * Return: string 92*262ff411SHeinrich Schuchardt */ 93*262ff411SHeinrich Schuchardt u16 *efi_st_translate_code(u16 code); 94*262ff411SHeinrich Schuchardt 95623b3a57SHeinrich Schuchardt /* 965ca23ed5SHeinrich Schuchardt * Compare memory. 975ca23ed5SHeinrich Schuchardt * We cannot use lib/string.c due to different CFLAGS values. 985ca23ed5SHeinrich Schuchardt * 995ca23ed5SHeinrich Schuchardt * @buf1: first buffer 1005ca23ed5SHeinrich Schuchardt * @buf2: second buffer 1015ca23ed5SHeinrich Schuchardt * @length: number of bytes to compare 1025ca23ed5SHeinrich Schuchardt * @return: 0 if both buffers contain the same bytes 1035ca23ed5SHeinrich Schuchardt */ 1045ca23ed5SHeinrich Schuchardt int efi_st_memcmp(const void *buf1, const void *buf2, size_t length); 1055ca23ed5SHeinrich Schuchardt 1065ca23ed5SHeinrich Schuchardt /* 107d78e40d6SHeinrich Schuchardt * Compare an u16 string to a char string. 108d78e40d6SHeinrich Schuchardt * 109d78e40d6SHeinrich Schuchardt * @buf1: u16 string 110d78e40d6SHeinrich Schuchardt * @buf2: char string 111d78e40d6SHeinrich Schuchardt * @return: 0 if both buffers contain the same bytes 112d78e40d6SHeinrich Schuchardt */ 113d78e40d6SHeinrich Schuchardt int efi_st_strcmp_16_8(const u16 *buf1, const char *buf2); 114d78e40d6SHeinrich Schuchardt 115d78e40d6SHeinrich Schuchardt /* 116623b3a57SHeinrich Schuchardt * Reads an Unicode character from the input device. 117623b3a57SHeinrich Schuchardt * 118623b3a57SHeinrich Schuchardt * @return: Unicode character 119623b3a57SHeinrich Schuchardt */ 120623b3a57SHeinrich Schuchardt u16 efi_st_get_key(void); 121623b3a57SHeinrich Schuchardt 122623b3a57SHeinrich Schuchardt /** 123623b3a57SHeinrich Schuchardt * struct efi_unit_test - EFI unit test 124623b3a57SHeinrich Schuchardt * 125623b3a57SHeinrich Schuchardt * An efi_unit_test provides a interface to an EFI unit test. 126623b3a57SHeinrich Schuchardt * 127623b3a57SHeinrich Schuchardt * @name: name of unit test 128623b3a57SHeinrich Schuchardt * @phase: specifies when setup and execute are executed 129623b3a57SHeinrich Schuchardt * @setup: set up the unit test 130623b3a57SHeinrich Schuchardt * @teardown: tear down the unit test 131623b3a57SHeinrich Schuchardt * @execute: execute the unit test 132d78e40d6SHeinrich Schuchardt * @on_request: test is only executed on request 133623b3a57SHeinrich Schuchardt */ 134623b3a57SHeinrich Schuchardt struct efi_unit_test { 135623b3a57SHeinrich Schuchardt const char *name; 136623b3a57SHeinrich Schuchardt const enum efi_test_phase phase; 137623b3a57SHeinrich Schuchardt int (*setup)(const efi_handle_t handle, 138623b3a57SHeinrich Schuchardt const struct efi_system_table *systable); 139623b3a57SHeinrich Schuchardt int (*execute)(void); 140623b3a57SHeinrich Schuchardt int (*teardown)(void); 141d78e40d6SHeinrich Schuchardt bool on_request; 142623b3a57SHeinrich Schuchardt }; 143623b3a57SHeinrich Schuchardt 144623b3a57SHeinrich Schuchardt /* Declare a new EFI unit test */ 145623b3a57SHeinrich Schuchardt #define EFI_UNIT_TEST(__name) \ 146623b3a57SHeinrich Schuchardt ll_entry_declare(struct efi_unit_test, __name, efi_unit_test) 147623b3a57SHeinrich Schuchardt 148623b3a57SHeinrich Schuchardt #endif /* _EFI_SELFTEST_H */ 149