This is a prototype patch for adding ELF notes. ELF notes can be used to attach domain-specific data to ELF files. This could be used to store for example the RTEMS version, Git commit, configuration options, expected test state, etc. in the executable ELF file.
Example: readelf -n build/arm/xilinx_zynq_a9_qemu/testsuites/samples/ticker.exe Displaying notes found in: .note.rtems Owner Data size Description RTEMS 0x00000004 Unknown note type: (0x00010000) description data: 06 00 00 00 RTEMS 0x00000004 Unknown note type: (0x00010001) description data: 00 00 00 00 RTEMS 0x00000004 Unknown note type: (0x00010002) description data: 00 00 00 00 RTEMS 0x00000029 Unknown note type: (0x00010003) description data: 37 39 34 38 31 66 39 61 37 61 31 32 35 62 64 31 66 64 65 31 66 38 32 39 61 65 64 39 33 62 31 38 36 36 39 38 66 62 38 32 00 RTEMS 0x00000008 Unknown note type: (0x00010004) description data: 44 45 46 41 55 4c 54 00 RTEMS 0x00000004 Unknown note type: (0x00010005) description data: 01 00 00 00 RTEMS 0x00000004 Unknown note type: (0x00010006) description data: 00 00 00 00 RTEMS 0x00000004 Unknown note type: (0x00010007) description data: 00 00 00 00 RTEMS 0x00000004 Unknown note type: (0x00010008) description data: 00 00 00 00 RTEMS 0x00000004 Unknown note type: (0x00010009) description data: 00 00 00 00 RTEMS 0x00000004 Unknown note type: (0x0001000a) description data: 00 00 00 00 RTEMS 0x0000000b Unknown note type: (0x0001000b) description data: 43 4c 4f 43 4b 20 54 49 43 4b 00 RTEMS 0x00000004 Unknown note type: (0x0001000c) description data: 00 00 00 00 Update #4888. --- bsps/arm/shared/start/linkcmds.base | 1 + bsps/arm/shared/start/start.S | 2 + bsps/include/bsp/startelfnotes.h | 98 +++++++++++++++++++ cpukit/include/rtems/score/elfnote.h | 139 +++++++++++++++++++++++++++ cpukit/include/rtems/test-info.h | 11 +++ testsuites/samples/ticker/init.c | 2 +- 6 files changed, 252 insertions(+), 1 deletion(-) create mode 100644 bsps/include/bsp/startelfnotes.h create mode 100644 cpukit/include/rtems/score/elfnote.h diff --git a/bsps/arm/shared/start/linkcmds.base b/bsps/arm/shared/start/linkcmds.base index 8c4d87dfdc..2c0fb87df0 100644 --- a/bsps/arm/shared/start/linkcmds.base +++ b/bsps/arm/shared/start/linkcmds.base @@ -436,6 +436,7 @@ SECTIONS { .debug_sup 0 : { *(.debug_sup) } .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) KEEP (*(.gnu.attributes)) } .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) } + .note.rtems 0 : { KEEP (*(.note.rtems)) } /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) } /* diff --git a/bsps/arm/shared/start/start.S b/bsps/arm/shared/start/start.S index bc8753df93..dd17197ee0 100644 --- a/bsps/arm/shared/start/start.S +++ b/bsps/arm/shared/start/start.S @@ -596,3 +596,5 @@ bsp_start_hook_0_done: .set bsp_start_vector_table_size, bsp_start_vector_table_end - bsp_start_vector_table_begin .set bsp_vector_table_size, bsp_start_vector_table_size + +#include <bsp/startelfnotes.h> diff --git a/bsps/include/bsp/startelfnotes.h b/bsps/include/bsp/startelfnotes.h new file mode 100644 index 0000000000..ad38edb03c --- /dev/null +++ b/bsps/include/bsp/startelfnotes.h @@ -0,0 +1,98 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup RTEMSBSPsSharedStartup + * + * @brief This header file provides ELF notes for the start file. + */ + +/* + * Copyright (C) 2023 embedded brains GmbH + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _BSP_STARTELFNOTES_H +#define _BSP_STARTELFNOTES_H + +#include <rtems/score/elfnote.h> + +#include <bspopts.h> +#include <version-vc-key.h> + +#ifndef ASM +#error "This header file shall be included by assembly files only." +#endif + +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_MAJOR, .long __RTEMS_MAJOR__ ) + +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_MINOR, .long __RTEMS_MINOR__ ) + +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_REVISION, .long __RTEMS_REVISION__ ) + +#ifdef RTEMS_VERSION_VC_KEY +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_VERSION_VC_KEY, .asciz RTEMS_VERSION_VC_KEY ) +#else +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_VERSION_VC_KEY, .asciz "" ) +#endif + +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_BUILD_LABEL, .asciz RTEMS_BUILD_LABEL ) + +#ifdef RTEMS_DEBUG +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_DEBUG, .long 1 ) +#else +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_DEBUG, .long 0 ) +#endif + +#ifdef RTEMS_MULTIPROCESSING +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_MULTIPROCESSING, .long 1 ) +#else +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_MULTIPROCESSING, .long 0 ) +#endif + +#ifdef RTEMS_PARAVIRT +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_PARAVIRT, .long 1 ) +#else +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_PARAVIRT, .long 0 ) +#endif + +#ifdef RTEMS_POSIX_API +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_POSIX_API, .long 1 ) +#else +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_POSIX_API, .long 0 ) +#endif + +#ifdef RTEMS_PROFILING +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_PROFILING, .long 1 ) +#else +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_PROFILING, .long 0 ) +#endif + +#ifdef RTEMS_SMP +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_SMP, .long 1 ) +#else +ELF_NOTE_ASM_RTEMS( ELF_NOTE_RTEMS_SMP, .long 0 ) +#endif + +#endif /* _BSP_STARTELFNOTES_H */ diff --git a/cpukit/include/rtems/score/elfnote.h b/cpukit/include/rtems/score/elfnote.h new file mode 100644 index 0000000000..af97b6ee50 --- /dev/null +++ b/cpukit/include/rtems/score/elfnote.h @@ -0,0 +1,139 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup RTEMSScoreELFNote + * + * @brief This header file provides the interfaces of the + * @ref RTEMSScoreELFNote. + */ + +/* + * Copyright (C) 2023 embedded brains GmbH + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _RTEMS_SCORE_ELFNOTE_H +#define _RTEMS_SCORE_ELFNOTE_H + +#include <rtems/score/basedefs.h> + +#ifndef ASM +#include <elf.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup RTEMSScoreELFNote ELF Note Handler + * + * @ingroup RTEMSScore + * + * @brief This group contains the ELF Note Handler implementation. + * + * @{ + */ + +/** + * @brief Defines an ELF note. + * + * @param _elf_size is the ELF size of the executable, either 32 or 64. + * + * @param _section is the note section name. + * + * @param _name is the name. It shall be a NUL-terminated string. + * + * @param _unique is a unique number for each use of the macro in a translation + * unit. + * + * @param _type is the type of the note. It shall be an ELF word integer. + * + * @param _desc is the description of the note. + * + */ +#define ELF_NOTE_DEFINE( _elf_size, _section, _name, _unique, _type, _desc ) \ + static const struct { \ + Elf##_elf_size##_Nhdr Note_header; \ + RTEMS_ALIGNED( sizeof( Elf##_elf_size##_Word ) ) \ + unsigned char Name[sizeof( _name )]; \ + RTEMS_ALIGNED( sizeof( Elf##_elf_size##_Word ) ) \ + __typeof__( _desc ) Description; \ + } \ + RTEMS_CONCAT( _note_, _unique ) \ + RTEMS_USED \ + RTEMS_UNUSED \ + RTEMS_SECTION( ".note." _section ) \ + RTEMS_ALIGNED( sizeof( Elf##_elf_size##_Word ) ) = \ + { { sizeof( _name ), sizeof( _desc ), _type }, _name, _desc } + +#define ELF_NOTE_ASM_DEFINE( _section, _name, _type, _desc ) \ + .pushsection RTEMS_STRING( .note.##_section ), "a", %note ; \ + .balign 4 ; \ + .long 2f - 1f ; \ + .long 4f - 3f ; \ + .long _type ; \ + 1: .asciz _name ; \ + 2: .balign 4 ; \ + 3: _desc ; \ + 4: .balign 4 ; \ + .popsection + +#define ELF_NOTE_RTEMS_TYPE( _index ) ( ( _index ) + 0x10000 ) + +#if CPU_SIZEOF_POINTER == 8 +#define ELF_NOTE_RTEMS( _type, _desc ) \ + ELF_NOTE_DEFINE( 64, "rtems", "RTEMS", _type, \ + ELF_NOTE_RTEMS_TYPE( _type ), _desc ) +#else +#define ELF_NOTE_RTEMS( _type, _desc ) \ + ELF_NOTE_DEFINE( 32, "rtems", "RTEMS", _type, \ + ELF_NOTE_RTEMS_TYPE( _type ), _desc ) +#endif + +#define ELF_NOTE_ASM_RTEMS( _type, _desc ) \ + ELF_NOTE_ASM_DEFINE(rtems, "RTEMS", ELF_NOTE_RTEMS_TYPE( _type ), _desc ) + +#define ELF_NOTE_RTEMS_MAJOR 0 +#define ELF_NOTE_RTEMS_MINOR 1 +#define ELF_NOTE_RTEMS_REVISION 2 +#define ELF_NOTE_RTEMS_VERSION_VC_KEY 3 +#define ELF_NOTE_RTEMS_BUILD_LABEL 4 +#define ELF_NOTE_RTEMS_DEBUG 5 +#define ELF_NOTE_RTEMS_MULTIPROCESSING 6 +#define ELF_NOTE_RTEMS_PARAVIRT 7 +#define ELF_NOTE_RTEMS_POSIX_API 8 +#define ELF_NOTE_RTEMS_PROFILING 9 +#define ELF_NOTE_RTEMS_SMP 10 +#define ELF_NOTE_RTEMS_TEST_NAME 11 +#define ELF_NOTE_RTEMS_TEST_STATE 12 + +/** @} */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _RTEMS_SCORE_ELFNOTE_H */ diff --git a/cpukit/include/rtems/test-info.h b/cpukit/include/rtems/test-info.h index 3b839533c2..aa67dc04d9 100644 --- a/cpukit/include/rtems/test-info.h +++ b/cpukit/include/rtems/test-info.h @@ -31,6 +31,7 @@ #include <rtems.h> #include <rtems/printer.h> #include <rtems/score/atomic.h> +#include <rtems/score/elfnote.h> #include <rtems/score/smpbarrier.h> #ifdef __cplusplus @@ -95,16 +96,26 @@ typedef enum #if TEST_STATE_EXPECTED_FAIL #define TEST_STATE RTEMS_TEST_STATE_FAIL + #define TEST_STATE_NOTE 1 #elif TEST_STATE_USER_INPUT #define TEST_STATE RTEMS_TEST_STATE_USER_INPUT + #define TEST_STATE_NOTE 2 #elif TEST_STATE_INDETERMINATE #define TEST_STATE RTEMS_TEST_STATE_INDETERMINATE + #define TEST_STATE_NOTE 3 #elif TEST_STATE_BENCHMARK #define TEST_STATE RTEMS_TEST_STATE_BENCHMARK + #define TEST_STATE_NOTE 4 #else #define TEST_STATE RTEMS_TEST_STATE_PASS + #define TEST_STATE_NOTE 0 #endif +#define RTEMS_TEST_IDENT( name ) \ + ELF_NOTE_RTEMS( ELF_NOTE_RTEMS_TEST_NAME, name ); \ + ELF_NOTE_RTEMS( ELF_NOTE_RTEMS_TEST_STATE, TEST_STATE_NOTE ); \ + const char rtems_test_name[] = name + /** * @brief Prints a begin of test message using printf(). * diff --git a/testsuites/samples/ticker/init.c b/testsuites/samples/ticker/init.c index 86f87ad736..370f308dc4 100644 --- a/testsuites/samples/ticker/init.c +++ b/testsuites/samples/ticker/init.c @@ -33,7 +33,7 @@ #define CONFIGURE_INIT #include "system.h" -const char rtems_test_name[] = "CLOCK TICK"; +RTEMS_TEST_IDENT( "CLOCK TICK" ); /* * Keep the names and IDs in global variables so another task can use them. -- 2.35.3 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel