diff --git a/CMakeLists.txt b/CMakeLists.txt index f7383e0bd582..7fb0f6d9870d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -226,6 +226,12 @@ get_property(ASM_OPTIMIZE_FOR_SPEED_FLAG TARGET asm PROPERTY optimization_speed) get_property(ASM_OPTIMIZE_FOR_SIZE_FLAG TARGET asm PROPERTY optimization_size) get_property(ASM_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG TARGET asm PROPERTY optimization_size_aggressive) +get_property(LINKER_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG TARGET linker PROPERTY no_optimization) +get_property(LINKER_OPTIMIZE_FOR_DEBUG_FLAG TARGET linker PROPERTY optimization_debug) +get_property(LINKER_OPTIMIZE_FOR_SPEED_FLAG TARGET linker PROPERTY optimization_speed) +get_property(LINKER_OPTIMIZE_FOR_SIZE_FLAG TARGET linker PROPERTY optimization_size) +get_property(LINKER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG TARGET linker PROPERTY optimization_size_aggressive) + # Let the assembler inherit the optimization flags of the compiler if it is # not set explicitly. if(NOT ASM_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG) @@ -244,23 +250,46 @@ if(NOT ASM_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG) set(ASM_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG ${COMPILER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG}) endif() +# Let the linker inherit the optimization flags of the compiler if it is +# not set explicitly. +if(NOT LINKER_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG) + set(LINKER_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG ${COMPILER_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG}) +endif() +if(NOT LINKER_OPTIMIZE_FOR_DEBUG_FLAG) + set(LINKER_OPTIMIZE_FOR_DEBUG_FLAG ${COMPILER_OPTIMIZE_FOR_DEBUG_FLAG}) +endif() +if(NOT LINKER_OPTIMIZE_FOR_SPEED_FLAG) + set(LINKER_OPTIMIZE_FOR_SPEED_FLAG ${COMPILER_OPTIMIZE_FOR_SPEED_FLAG}) +endif() +if(NOT LINKER_OPTIMIZE_FOR_SIZE_FLAG) + set(LINKER_OPTIMIZE_FOR_SIZE_FLAG ${COMPILER_OPTIMIZE_FOR_SIZE_FLAG}) +endif() +if(NOT LINKER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG) + set(LINKER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG ${COMPILER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG}) +endif() + # From kconfig choice, pick the actual OPTIMIZATION_FLAG to use. # Kconfig choice ensures only one of these CONFIG_*_OPTIMIZATIONS is set. if(CONFIG_NO_OPTIMIZATIONS) set(COMPILER_OPTIMIZATION_FLAG ${COMPILER_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG}) set(ASM_OPTIMIZATION_FLAG ${ASM_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG}) + set(LINKER_OPTIMIZATION_FLAG ${LINKER_OPTIMIZE_FOR_NO_OPTIMIZATIONS_FLAG}) elseif(CONFIG_DEBUG_OPTIMIZATIONS) set(COMPILER_OPTIMIZATION_FLAG ${COMPILER_OPTIMIZE_FOR_DEBUG_FLAG}) set(ASM_OPTIMIZATION_FLAG ${ASM_OPTIMIZE_FOR_DEBUG_FLAG}) + set(LINKER_OPTIMIZATION_FLAG ${LINKER_OPTIMIZE_FOR_DEBUG_FLAG}) elseif(CONFIG_SPEED_OPTIMIZATIONS) set(COMPILER_OPTIMIZATION_FLAG ${COMPILER_OPTIMIZE_FOR_SPEED_FLAG}) set(ASM_OPTIMIZATION_FLAG ${ASM_OPTIMIZE_FOR_SPEED_FLAG}) + set(LINKER_OPTIMIZATION_FLAG ${LINKER_OPTIMIZE_FOR_SPEED_FLAG}) elseif(CONFIG_SIZE_OPTIMIZATIONS) set(COMPILER_OPTIMIZATION_FLAG ${COMPILER_OPTIMIZE_FOR_SIZE_FLAG}) # Default in kconfig set(ASM_OPTIMIZATION_FLAG ${ASM_OPTIMIZE_FOR_SIZE_FLAG}) + set(LINKER_OPTIMIZATION_FLAG ${LINKER_OPTIMIZE_FOR_SIZE_FLAG}) elseif(CONFIG_SIZE_OPTIMIZATIONS_AGGRESSIVE) set(COMPILER_OPTIMIZATION_FLAG ${COMPILER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG}) set(ASM_OPTIMIZATION_FLAG ${ASM_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG}) + set(LINKER_OPTIMIZATION_FLAG ${LINKER_OPTIMIZE_FOR_SIZE_AGGRESSIVE_FLAG}) else() message(FATAL_ERROR "Unreachable code. Expected optimization level to have been chosen. See Kconfig.zephyr") @@ -277,6 +306,9 @@ endif() zephyr_compile_options($<$:${ASM_OPTIMIZATION_FLAG}>) zephyr_compile_options($<$:${COMPILER_OPTIMIZATION_FLAG}>) zephyr_compile_options($<$:${COMPILER_OPTIMIZATION_FLAG}>) +add_link_options(${LINKER_OPTIMIZATION_FLAG}) +compiler_simple_options(simple_options) +toolchain_linker_add_compiler_options(${simple_options}) if(CONFIG_LTO) zephyr_compile_options($) @@ -2371,6 +2403,9 @@ add_subdirectory_ifdef( cmake/makefile_exports ) +# Ask the compiler to set the lib_include_dir and rt_library properties +compiler_set_linker_properties() + toolchain_linker_finalize() # export build information diff --git a/arch/arm/core/cortex_m/thread.c b/arch/arm/core/cortex_m/thread.c index 7abba0cdeef2..a1e281af4d5a 100644 --- a/arch/arm/core/cortex_m/thread.c +++ b/arch/arm/core/cortex_m/thread.c @@ -649,7 +649,7 @@ FUNC_NORETURN void z_arm_switch_to_main_no_multithreading(k_thread_entry_t main_ , [_psplim] "r"(psplim) #endif - : "r0", "r1", "r2", "ip", "lr"); + : "r0", "r1", "r2", "ip", "lr", "memory"); CODE_UNREACHABLE; /* LCOV_EXCL_LINE */ } diff --git a/arch/x86/core/ia32/fatal.c b/arch/x86/core/ia32/fatal.c index 88a6e1be6d80..a4c8c73689fd 100644 --- a/arch/x86/core/ia32/fatal.c +++ b/arch/x86/core/ia32/fatal.c @@ -219,7 +219,7 @@ static FUNC_NORETURN __used void df_handler_top(void) /* NT bit is set in EFLAGS so we will task switch back to _main_tss * and run df_handler_bottom */ - __asm__ volatile ("iret"); + __asm__ volatile ("iret" ::: "memory"); CODE_UNREACHABLE; } diff --git a/arch/x86/zefi/zefi.py b/arch/x86/zefi/zefi.py index 2f9c3482bb4c..b98419f8a49e 100755 --- a/arch/x86/zefi/zefi.py +++ b/arch/x86/zefi/zefi.py @@ -117,7 +117,7 @@ def build_elf(elf_file, include_dirs): includes.extend(["-I", include_dir]) cmd = ([args.compiler, "-shared", "-Wall", "-Werror", "-I."] + includes + ["-fno-stack-protector", "-fpic", "-mno-red-zone", "-fshort-wchar", - "-Wl,-nostdlib", "-T", ldscript, "-o", "zefi.elf", cfile]) + "-Wl,-nostdlib", "-nostartfiles", "-T", ldscript, "-o", "zefi.elf", cfile]) verbose(" ".join(cmd)) subprocess.run(cmd, check = True) diff --git a/arch/xtensa/core/fatal.c b/arch/xtensa/core/fatal.c index 41a7a8d14097..e7a5b1886b1f 100644 --- a/arch/xtensa/core/fatal.c +++ b/arch/xtensa/core/fatal.c @@ -118,7 +118,7 @@ void xtensa_simulator_exit(int return_code) "simcall\n\t" : : [code] "r" (return_code), [call] "i" (SYS_exit) - : "a3", "a2"); + : "a3", "a2", "memory"); CODE_UNREACHABLE; } diff --git a/cmake/compiler/clang/target.cmake b/cmake/compiler/clang/target.cmake index e3d498272672..85eaa5a4d548 100644 --- a/cmake/compiler/clang/target.cmake +++ b/cmake/compiler/clang/target.cmake @@ -100,21 +100,6 @@ if(NOT "${ARCH}" STREQUAL "posix") endif() endif() - # This libgcc code is partially duplicated in compiler/*/target.cmake - execute_process( - COMMAND ${CMAKE_C_COMPILER} ${clang_target_flag} ${TOOLCHAIN_C_FLAGS} - --print-libgcc-file-name - OUTPUT_VARIABLE RTLIB_FILE_NAME - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - - get_filename_component(RTLIB_DIR ${RTLIB_FILE_NAME} DIRECTORY) - get_filename_component(RTLIB_NAME_WITH_PREFIX ${RTLIB_FILE_NAME} NAME_WLE) - string(REPLACE lib "" RTLIB_NAME ${RTLIB_NAME_WITH_PREFIX}) - - set_property(TARGET linker PROPERTY lib_include_dir "-L${RTLIB_DIR}") - set_property(TARGET linker PROPERTY rt_library "-l${RTLIB_NAME}") - list(APPEND CMAKE_REQUIRED_FLAGS -nostartfiles -nostdlib ${isystem_include_flags}) string(REPLACE ";" " " CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") diff --git a/cmake/compiler/gcc/target.cmake b/cmake/compiler/gcc/target.cmake index 65e37d4bc5ec..4b20e398981c 100644 --- a/cmake/compiler/gcc/target.cmake +++ b/cmake/compiler/gcc/target.cmake @@ -98,21 +98,6 @@ if(SYSROOT_DIR) set(LIBC_LIBRARY_DIR "\"${SYSROOT_DIR}\"/lib/${NEWLIB_DIR}") endif() -# This libgcc code is partially duplicated in compiler/*/target.cmake -execute_process( - COMMAND ${CMAKE_C_COMPILER} ${TOOLCHAIN_C_FLAGS} --print-libgcc-file-name - OUTPUT_VARIABLE LIBGCC_FILE_NAME - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - -assert_exists(LIBGCC_FILE_NAME) - -get_filename_component(LIBGCC_DIR ${LIBGCC_FILE_NAME} DIRECTORY) - -assert_exists(LIBGCC_DIR) - -set_linker_property(PROPERTY lib_include_dir "-L\"${LIBGCC_DIR}\"") - # For CMake to be able to test if a compiler flag is supported by the # toolchain we need to give CMake the necessary flags to compile and # link a dummy C file. diff --git a/cmake/compiler/icx/target.cmake b/cmake/compiler/icx/target.cmake index cd389497a5d3..9f1387e4758b 100644 --- a/cmake/compiler/icx/target.cmake +++ b/cmake/compiler/icx/target.cmake @@ -45,21 +45,6 @@ else() list(APPEND TOOLCHAIN_C_FLAGS "-m32") endif() - -# This libgcc code is partially duplicated in compiler/*/target.cmake -execute_process( - COMMAND ${CMAKE_C_COMPILER} ${TOOLCHAIN_C_FLAGS} --print-libgcc-file-name - OUTPUT_VARIABLE LIBGCC_FILE_NAME - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - -get_filename_component(LIBGCC_DIR ${LIBGCC_FILE_NAME} DIRECTORY) - -list(APPEND LIB_INCLUDE_DIR "-L\"${LIBGCC_DIR}\"") -if(LIBGCC_DIR) - list(APPEND TOOLCHAIN_LIBS gcc) -endif() - set(CMAKE_REQUIRED_FLAGS -nostartfiles -nostdlib ${isystem_include_flags}) string(REPLACE ";" " " CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") diff --git a/cmake/compiler/target_template.cmake b/cmake/compiler/target_template.cmake new file mode 100644 index 000000000000..0c83868beba3 --- /dev/null +++ b/cmake/compiler/target_template.cmake @@ -0,0 +1,108 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Copyright (c) 2025, Nordic Semiconductor ASA + +# Template file for optional Zephyr compiler functions. +# +# This file will define optional compiler functions for toolchains that are not +# defining these functions themselves. + +# Extract all of the compiler options which don't involve generator +# expressions. We hope that none of the flags required to compute compiler +# support library paths depend upon those. + +function(compiler_simple_options simple_options_out) + + get_property(flags TARGET zephyr_interface PROPERTY INTERFACE_COMPILE_OPTIONS) + + set(simple_options "") + + foreach(flag ${flags}) + + # Include this flag if GENEX_STRIP has no effect, + # otherwise skip the whole thing + + string(GENEX_STRIP "${flag}" sflag) + if(flag STREQUAL sflag) + if(flag MATCHES "^SHELL:[ ]*(.*)") + separate_arguments(flag UNIX_COMMAND ${CMAKE_MATCH_1}) + endif() + list(APPEND simple_options ${flag}) + endif() + + endforeach() + + set(${simple_options_out} "${simple_options}" PARENT_SCOPE) +endfunction() + +if(NOT COMMAND compiler_file_path) + + # Search for filename in default compiler library path using the + # --print-file-name option which is common to gcc and clang. If the + # file is not found, filepath_out will be set to an empty string. + # + # This only works if none of the compiler flags used to compute + # the library path involve generator expressions as we cannot + # evaluate those in this function. + # + # Compilers needing a different implementation should provide this + # function in their target.cmake file + + function(compiler_file_path filename filepath_out) + + compiler_simple_options(simple_options) + + execute_process( + COMMAND ${CMAKE_C_COMPILER} ${TOOLCHAIN_C_FLAGS} ${COMPILER_OPTIMIZATION_FLAG} ${simple_options} + --print-file-name ${filename} + OUTPUT_VARIABLE filepath + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(${filepath} STREQUAL ${filename}) + set(filepath "") + endif() + set(${filepath_out} "${filepath}" PARENT_SCOPE) + endfunction() + +endif() + +if(NOT COMMAND compiler_set_linker_properties) + + # Set the lib_include_dir and rt_library linker properties + # by searching for the runtime library in the compiler default + # library search path. If no runtime library is found, these + # properties will remain unset + # + # Compilers needing a different implementation should provide this + # function in their target.cmake file + + function(compiler_set_linker_properties) + + compiler_simple_options(simple_options) + + # Compute complete path to the runtime library using the + # --print-libgcc-file-name compiler flag + execute_process( + COMMAND ${CMAKE_C_COMPILER} ${TOOLCHAIN_C_FLAGS} ${COMPILER_OPTIMIZATION_FLAG} ${simple_options} + --print-libgcc-file-name + OUTPUT_VARIABLE library_path + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + # Compute the library directory name + + get_filename_component(library_dir ${library_path} DIRECTORY) + set_linker_property(PROPERTY lib_include_dir "-L${library_dir}") + + # Compute the linker option for this library + + get_filename_component(library_basename ${library_path} NAME_WLE) + + # Remove the leading 'lib' prefix to leave a value suitable for use with + # the linker -l flag + string(REPLACE lib "" library_name ${library_basename}) + + set_linker_property(PROPERTY rt_library "-l${library_name}") + endfunction() + +endif() diff --git a/cmake/compiler/xcc/target.cmake b/cmake/compiler/xcc/target.cmake index 56d15451d3d5..32e5e2288f32 100644 --- a/cmake/compiler/xcc/target.cmake +++ b/cmake/compiler/xcc/target.cmake @@ -55,17 +55,6 @@ foreach(file_name include/stddef.h include-fixed/limits.h) endif() endforeach() -# This libgcc code is partially duplicated in compiler/*/target.cmake -execute_process( - COMMAND ${CMAKE_C_COMPILER} ${TOOLCHAIN_C_FLAGS} --print-libgcc-file-name - OUTPUT_VARIABLE LIBGCC_FILE_NAME - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - -get_filename_component(LIBGCC_DIR ${LIBGCC_FILE_NAME} DIRECTORY) - -list(APPEND LIB_INCLUDE_DIR "-L\"${LIBGCC_DIR}\"") - # For CMake to be able to test if a compiler flag is supported by the # toolchain we need to give CMake the necessary flags to compile and # link a dummy C file. diff --git a/cmake/linker/ld/target.cmake b/cmake/linker/ld/target.cmake index 1b3ce9ec9d81..592596576d11 100644 --- a/cmake/linker/ld/target.cmake +++ b/cmake/linker/ld/target.cmake @@ -159,15 +159,25 @@ macro(toolchain_linker_finalize) set(cpp_link "${common_link}") if(NOT "${ZEPHYR_TOOLCHAIN_VARIANT}" STREQUAL "host") - if(CONFIG_CPP_EXCEPTIONS AND LIBGCC_DIR) + compiler_file_path(crtbegin.o CRTBEGIN_PATH) + compiler_file_path(crtend.o CRTEND_PATH) + if(CONFIG_CPP_EXCEPTIONS AND CRTBEGIN_PATH AND CRTEND_PATH) # When building with C++ Exceptions, it is important that crtbegin and crtend # are linked at specific locations. - set(cpp_link " ${LIBGCC_DIR}/crtbegin.o ${link_libraries} ${LIBGCC_DIR}/crtend.o") + set(cpp_link " ${CRTBEGIN_PATH} ${link_libraries} ${CRTEND_PATH}") endif() endif() set(CMAKE_CXX_LINK_EXECUTABLE " ${cpp_link}") endmacro() +# Function to map compiler flags into suitable linker flags +# When using the compiler driver to run the linker, just pass +# them all through + +function(toolchain_linker_add_compiler_options) + add_link_options(${ARGV}) +endfunction() + # Load toolchain_ld-family macros include(${ZEPHYR_BASE}/cmake/linker/${LINKER}/target_relocation.cmake) include(${ZEPHYR_BASE}/cmake/linker/${LINKER}/target_configure.cmake) diff --git a/cmake/linker/lld/target.cmake b/cmake/linker/lld/target.cmake index b6b96525e706..96df1c123796 100644 --- a/cmake/linker/lld/target.cmake +++ b/cmake/linker/lld/target.cmake @@ -128,6 +128,14 @@ macro(toolchain_linker_finalize) set(CMAKE_CXX_LINK_EXECUTABLE " ${common_link}") endmacro() +# Function to map compiler flags into suitable linker flags +# When using the compiler driver to run the linker, just pass +# them all through + +function(toolchain_linker_add_compiler_options) + add_link_options(${ARGV}) +endfunction() + # Load toolchain_ld-family macros include(${ZEPHYR_BASE}/cmake/linker/ld/target_relocation.cmake) include(${ZEPHYR_BASE}/cmake/linker/ld/target_configure.cmake) diff --git a/cmake/linker/target_template.cmake b/cmake/linker/target_template.cmake index efa27de6fb4f..59e9d8d84f0b 100644 --- a/cmake/linker/target_template.cmake +++ b/cmake/linker/target_template.cmake @@ -11,3 +11,13 @@ if(NOT COMMAND toolchain_linker_finalize) macro(toolchain_linker_finalize) endmacro() endif() + +if(NOT COMMAND toolchain_linker_add_compiler_options) + + # If the linker doesn't provide a method for mapping compiler options + # to linker options, then assume we can't. This matters when the linker + # is using additional flags when computing toolchain library paths. + + function(toolchain_linker_add_compiler_options) + endfunction() +endif() diff --git a/cmake/linker/xt-ld/target.cmake b/cmake/linker/xt-ld/target.cmake index 9a6b76cda621..bdaf9829fcdd 100644 --- a/cmake/linker/xt-ld/target.cmake +++ b/cmake/linker/xt-ld/target.cmake @@ -11,14 +11,16 @@ find_program(CMAKE_LINKER xt-ld ${LD_SEARCH_PATH}) set_ifndef(LINKERFLAGPREFIX -Wl) -if(CONFIG_CPP_EXCEPTIONS) +compiler_file_path(crtbegin.o CRTBEGIN_PATH) +compiler_file_path(crtend.o CRTEND_PATH) +if(CONFIG_CPP_EXCEPTIONS AND CRTBEGIN_PATH AND CRTEND_PATH) # When building with C++ Exceptions, it is important that crtbegin and crtend # are linked at specific locations. # The location is so important that we cannot let this be controlled by normal # link libraries, instead we must control the link command specifically as # part of toolchain. set(CMAKE_CXX_LINK_EXECUTABLE - " ${LIBGCC_DIR}/crtbegin.o -o ${LIBGCC_DIR}/crtend.o") + " ${CRTBEGIN_PATH} -o ${CRTEND_PATH}") endif() # Run $LINKER_SCRIPT file through the C preprocessor, producing ${linker_script_gen} @@ -156,6 +158,14 @@ macro(toolchain_linker_finalize) set(CMAKE_CXX_LINK_EXECUTABLE " ${common_link}") endmacro() +# Function to map compiler flags into suitable linker flags +# When using the compiler driver to run the linker, just pass +# them all through + +function(toolchain_linker_add_compiler_options) + add_link_options(${ARGV}) +endfunction() + # xt-ld is Xtensa's own version of binutils' ld. # So we can reuse most of the ld configurations. include(${ZEPHYR_BASE}/cmake/linker/ld/target_relocation.cmake) diff --git a/cmake/modules/FindTargetTools.cmake b/cmake/modules/FindTargetTools.cmake index e35f577d6979..d5236aa8268c 100644 --- a/cmake/modules/FindTargetTools.cmake +++ b/cmake/modules/FindTargetTools.cmake @@ -106,6 +106,7 @@ include(${ZEPHYR_BASE}/cmake/bintools/bintools_template.cmake) include(${TOOLCHAIN_ROOT}/cmake/bintools/${BINTOOLS}/target.cmake OPTIONAL) include(${TOOLCHAIN_ROOT}/cmake/linker/target_template.cmake) +include(${TOOLCHAIN_ROOT}/cmake/compiler/target_template.cmake) set(TargetTools_FOUND TRUE) set(TARGETTOOLS_FOUND TRUE) diff --git a/drivers/adc/adc_stm32.c b/drivers/adc/adc_stm32.c index aa8c69b43a4d..aff5ae2dfe5d 100644 --- a/drivers/adc/adc_stm32.c +++ b/drivers/adc/adc_stm32.c @@ -498,7 +498,7 @@ static void adc_stm32_calibration_start(const struct device *dev, bool single_en const struct adc_stm32_cfg *config = (const struct adc_stm32_cfg *)dev->config; ADC_TypeDef *adc = config->base; -#ifdef LL_ADC_SINGLE_ENDED +#if defined(LL_ADC_SINGLE_ENDED) && defined(LL_ADC_DIFFERENTIAL_ENDED) uint32_t calib_type = single_ended ? LL_ADC_SINGLE_ENDED : LL_ADC_DIFFERENTIAL_ENDED; #else ARG_UNUSED(single_ended); diff --git a/include/zephyr/arch/x86/ia32/arch.h b/include/zephyr/arch/x86/ia32/arch.h index b230f3bde735..8c61b9788ad6 100644 --- a/include/zephyr/arch/x86/ia32/arch.h +++ b/include/zephyr/arch/x86/ia32/arch.h @@ -362,7 +362,8 @@ extern struct task_state_segment _main_tss; "int %[vector]\n\t" \ : \ : [vector] "i" (Z_X86_OOPS_VECTOR), \ - [reason] "i" (reason_p)); \ + [reason] "i" (reason_p) \ + : "memory"); \ CODE_UNREACHABLE; /* LCOV_EXCL_LINE */ \ } while (false) diff --git a/include/zephyr/arch/x86/intel64/arch.h b/include/zephyr/arch/x86/intel64/arch.h index 48a8f8752aac..671d331f3bd2 100644 --- a/include/zephyr/arch/x86/intel64/arch.h +++ b/include/zephyr/arch/x86/intel64/arch.h @@ -66,7 +66,8 @@ static ALWAYS_INLINE unsigned int arch_irq_lock(void) "movq %[reason], %%rax\n\t" \ "int $32\n\t" \ : \ - : [reason] "i" (reason_p)); \ + : [reason] "i" (reason_p) \ + : "memory"); \ CODE_UNREACHABLE; /* LCOV_EXCL_LINE */ \ } while (false) diff --git a/modules/cmsis-dsp/CMakeLists.txt b/modules/cmsis-dsp/CMakeLists.txt index 2a0924cc25cc..8332ad2006f9 100644 --- a/modules/cmsis-dsp/CMakeLists.txt +++ b/modules/cmsis-dsp/CMakeLists.txt @@ -19,6 +19,9 @@ if(CONFIG_CMSIS_DSP) ${cmsis_glue_path}/CMSIS/Core/Include ) + # Define ZEPHYR_INCLUDE_TOOLCHAIN_STDINT_H_ to avoid using Zephyr's stdint.h + zephyr_library_compile_definitions(ZEPHYR_INCLUDE_TOOLCHAIN_STDINT_H_) + # Global Feature Definitions zephyr_library_compile_definitions_ifdef(CONFIG_CMSIS_DSP_NEON ARM_MATH_NEON) zephyr_library_compile_definitions_ifdef(CONFIG_CMSIS_DSP_NEON_EXPERIMENTAL ARM_MATH_NEON_EXPERIMENTAL) diff --git a/modules/hal_rpi_pico/bootloader/CMakeLists.txt b/modules/hal_rpi_pico/bootloader/CMakeLists.txt index 7e8d39d8951f..241ba3c23c30 100644 --- a/modules/hal_rpi_pico/bootloader/CMakeLists.txt +++ b/modules/hal_rpi_pico/bootloader/CMakeLists.txt @@ -45,8 +45,8 @@ target_include_directories(boot_stage2 PUBLIC target_link_options(boot_stage2 PRIVATE "-nostartfiles" - "--specs=nosys.specs" - "LINKER:--script=${boot_stage_dir}/boot_stage2.ld" + "--specs=picolibc.specs" + "-T${boot_stage_dir}/boot_stage2.ld" ) # The second stage bootloader is compiled without kconfig definitions. diff --git a/soc/intel/intel_adsp/cavs/multiprocessing.c b/soc/intel/intel_adsp/cavs/multiprocessing.c index 5a1d5d95a310..0e837872ab96 100644 --- a/soc/intel/intel_adsp/cavs/multiprocessing.c +++ b/soc/intel/intel_adsp/cavs/multiprocessing.c @@ -201,6 +201,7 @@ __imr void soc_mp_init(void) int soc_adsp_halt_cpu(int id) { +#if CONFIG_MP_MAX_NUM_CPUS > 1 unsigned int irq_mask; if (id == 0 || id == arch_curr_cpu()->id) { @@ -237,4 +238,7 @@ int soc_adsp_halt_cpu(int id) while ((CAVS_SHIM.pwrsts & CAVS_PWRSTS_PDSPPGS(id))) { } return 0; +#else + return -EINVAL; +#endif } diff --git a/submanifests/optional.yaml b/submanifests/optional.yaml index 04bdd669a921..81985cbabc6b 100644 --- a/submanifests/optional.yaml +++ b/submanifests/optional.yaml @@ -23,7 +23,7 @@ manifest: groups: - optional - name: psa-arch-tests - revision: 2cadb02a72eacda7042505dcbdd492371e8ce024 + revision: pull/14/head path: modules/tee/tf-m/psa-arch-tests remote: upstream groups: diff --git a/subsys/testsuite/include/zephyr/interrupt_util.h b/subsys/testsuite/include/zephyr/interrupt_util.h index 15d4770cc189..cc2077d625de 100644 --- a/subsys/testsuite/include/zephyr/interrupt_util.h +++ b/subsys/testsuite/include/zephyr/interrupt_util.h @@ -7,6 +7,8 @@ #ifndef INTERRUPT_UTIL_H_ #define INTERRUPT_UTIL_H_ +#define k_str_out_count(s) k_str_out((s), sizeof(s) - 1); + #if defined(CONFIG_CPU_CORTEX_M) #include @@ -57,7 +59,7 @@ static inline uint32_t get_available_nvic_line(uint32_t initial_offset) static inline void trigger_irq(int irq) { - printk("Triggering irq : %d\n", irq); + k_str_out_count("Triggering irq\n"); #if defined(CONFIG_SOC_TI_LM3S6965_QEMU) || defined(CONFIG_CPU_CORTEX_M0) || \ defined(CONFIG_CPU_CORTEX_M0PLUS) || defined(CONFIG_CPU_CORTEX_M1) || \ defined(CONFIG_ARMV6_M_ARMV8_M_BASELINE) @@ -74,7 +76,7 @@ static inline void trigger_irq(int irq) static inline void trigger_irq(int irq) { - printk("Triggering irq : %d\n", irq); + k_str_out_count("Triggering irq\n"); /* Ensure that the specified IRQ number is a valid SGI interrupt ID */ zassert_true(irq <= 15, "%u is not a valid SGI interrupt ID", irq); @@ -96,7 +98,7 @@ static inline void trigger_irq(int irq) #elif defined(CONFIG_ARC) static inline void trigger_irq(int irq) { - printk("Triggering irq : %d\n", irq); + k_str_out_count("Triggering irq\n"); z_arc_v2_aux_reg_write(_ARC_V2_AUX_IRQ_HINT, irq); } diff --git a/tests/arch/arm/arm_mpu_pxn/src/main.c b/tests/arch/arm/arm_mpu_pxn/src/main.c index 690a0018ab17..4561e5548dfe 100644 --- a/tests/arch/arm/arm_mpu_pxn/src/main.c +++ b/tests/arch/arm/arm_mpu_pxn/src/main.c @@ -18,6 +18,7 @@ */ __customramfunc bool custom_ram_func(void) { + compiler_barrier(); return true; } @@ -28,6 +29,7 @@ __customramfunc bool custom_ram_func(void) */ __ramfunc bool ram_function(void) { + compiler_barrier(); return true; } diff --git a/tests/kernel/interrupt/CMakeLists.txt b/tests/kernel/interrupt/CMakeLists.txt index dac54fb4ce4d..86a74dd8b368 100644 --- a/tests/kernel/interrupt/CMakeLists.txt +++ b/tests/kernel/interrupt/CMakeLists.txt @@ -16,6 +16,10 @@ target_sources(app PRIVATE src/nested_irq.c ) +if(CONFIG_ARM64) + add_compile_options(-mgeneral-regs-only) +endif() + target_sources_ifdef(CONFIG_DYNAMIC_INTERRUPTS app PRIVATE src/dynamic_isr.c) target_sources_ifdef(CONFIG_X86 app PRIVATE src/regular_isr.c) target_sources_ifdef(CONFIG_SHARED_INTERRUPTS app PRIVATE src/static_shared_irq.c) diff --git a/tests/kernel/interrupt/src/nested_irq.c b/tests/kernel/interrupt/src/nested_irq.c index 9c9d909b546d..e2a9b70ee360 100644 --- a/tests/kernel/interrupt/src/nested_irq.c +++ b/tests/kernel/interrupt/src/nested_irq.c @@ -102,19 +102,19 @@ void isr1(const void *param) { ARG_UNUSED(param); - printk("isr1: Enter\n"); + k_str_out_count("ISR1: Enter\n"); /* Set verification token */ isr1_result = ISR1_TOKEN; - printk("isr1: Leave\n"); + k_str_out_count("ISR1: Leave\n"); } void isr0(const void *param) { ARG_UNUSED(param); - printk("isr0: Enter\n"); + k_str_out_count("ISR0: Enter\n"); /* Set verification token */ isr0_result = ISR0_TOKEN; @@ -128,7 +128,7 @@ void isr0(const void *param) /* Validate nested ISR result token */ zassert_equal(isr1_result, ISR1_TOKEN, "isr1 did not execute"); - printk("isr0: Leave\n"); + k_str_out_count("ISR0: Leave\n"); } /** diff --git a/tests/kernel/sched/schedule_api/src/test_sched_timeslice_reset.c b/tests/kernel/sched/schedule_api/src/test_sched_timeslice_reset.c index 231212133e56..6de3f59e1200 100644 --- a/tests/kernel/sched/schedule_api/src/test_sched_timeslice_reset.c +++ b/tests/kernel/sched/schedule_api/src/test_sched_timeslice_reset.c @@ -27,8 +27,8 @@ BUILD_ASSERT(NUM_THREAD <= MAX_NUM_THREAD); /* ... will not take more than 1 ms. */ #define TASK_SWITCH_TOLERANCE (1) #else -/* ... 1ms is faster than a tick, loosen tolerance to 1 tick */ -#define TASK_SWITCH_TOLERANCE (1000 / CONFIG_SYS_CLOCK_TICKS_PER_SEC) +/* ... 1ms is faster than a tick, loosen tolerance to just over 1 tick */ +#define TASK_SWITCH_TOLERANCE (1100 / CONFIG_SYS_CLOCK_TICKS_PER_SEC) #endif K_SEM_DEFINE(sema, 0, NUM_THREAD); diff --git a/west.yml b/west.yml index 2a7ae1a9b2fc..ed38c9ac8e26 100644 --- a/west.yml +++ b/west.yml @@ -122,14 +122,14 @@ manifest: groups: - hal - name: cmsis-dsp - revision: d80a49b2bb186317dc1db4ac88da49c0ab77e6e7 + revision: pull/7/head path: modules/lib/cmsis-dsp - name: cmsis-nn revision: e9328d612ea3ea7d0d210d3ac16ea8667c01abdd path: modules/lib/cmsis-nn - name: cmsis_6 repo-path: CMSIS_6 - revision: 06d952b6713a2ca41c9224a62075e4059402a151 + revision: 30a859f44ef8ab4dc8f84b03ed586fd16ccf9d74 path: modules/hal/cmsis_6 groups: - hal @@ -231,7 +231,7 @@ manifest: - hal - name: hal_rpi_pico path: modules/hal/rpi_pico - revision: 5a981c7c29e3846646549a1902183684f0147e1d + revision: b547a36a722af7787e5f55b551fd6ce72dcba5a4 groups: - hal - name: hal_silabs @@ -305,7 +305,7 @@ manifest: revision: b03edc8e6282a963cd312cd0b409eb5ce263ea75 path: modules/lib/gui/lvgl - name: mbedtls - revision: 85440ef5fffa95d0e9971e9163719189cf34d979 + revision: pull/73/head path: modules/crypto/mbedtls groups: - crypto @@ -358,7 +358,7 @@ manifest: groups: - tee - name: trusted-firmware-m - revision: 021e2bbd50c215e41710a72e05abce3224f074a7 + revision: pull/134/head path: modules/tee/tf-m/trusted-firmware-m groups: - tee