diff --git a/components/esp_common/CMakeLists.txt b/components/esp_common/CMakeLists.txt new file mode 100644 index 00000000..6efd9986 --- /dev/null +++ b/components/esp_common/CMakeLists.txt @@ -0,0 +1,16 @@ +if(BOOTLOADER_BUILD) + # For bootloader, all we need from esp_common is headers + idf_component_register(INCLUDE_DIRS include) + set_property(TARGET ${COMPONENT_LIB} APPEND PROPERTY INTERFACE_LINK_LIBRARIES "-Wl,--gc-sections") +else() + # Regular app build + idf_component_register(SRCS "src/stack_check.c" + INCLUDE_DIRS include) + + set_source_files_properties( + "src/stack_check.c" + PROPERTIES COMPILE_FLAGS + -fno-stack-protector) + set_property(TARGET ${COMPONENT_LIB} APPEND PROPERTY LINK_LIBRARIES "-Wl,--gc-sections") + set_property(TARGET ${COMPONENT_LIB} APPEND PROPERTY INTERFACE_LINK_LIBRARIES "-Wl,--gc-sections") +endif() diff --git a/components/esp_common/component.mk b/components/esp_common/component.mk new file mode 100644 index 00000000..64c67abc --- /dev/null +++ b/components/esp_common/component.mk @@ -0,0 +1,9 @@ +# +# Component Makefile +# + +COMPONENT_ADD_INCLUDEDIRS := include +COMPONENT_SRCDIRS := src + +# disable stack protection in files which are involved in initialization of that feature +src/stack_check.o: CFLAGS := $(filter-out -fstack-protector%, $(CFLAGS)) diff --git a/components/esp_common/include/esp_bit_defs.h b/components/esp_common/include/esp_bit_defs.h new file mode 100644 index 00000000..a15d17fd --- /dev/null +++ b/components/esp_common/include/esp_bit_defs.h @@ -0,0 +1,57 @@ +// Copyright 2010-2019 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +//Register Bits{{ +#define BIT31 0x80000000 +#define BIT30 0x40000000 +#define BIT29 0x20000000 +#define BIT28 0x10000000 +#define BIT27 0x08000000 +#define BIT26 0x04000000 +#define BIT25 0x02000000 +#define BIT24 0x01000000 +#define BIT23 0x00800000 +#define BIT22 0x00400000 +#define BIT21 0x00200000 +#define BIT20 0x00100000 +#define BIT19 0x00080000 +#define BIT18 0x00040000 +#define BIT17 0x00020000 +#define BIT16 0x00010000 +#define BIT15 0x00008000 +#define BIT14 0x00004000 +#define BIT13 0x00002000 +#define BIT12 0x00001000 +#define BIT11 0x00000800 +#define BIT10 0x00000400 +#define BIT9 0x00000200 +#define BIT8 0x00000100 +#define BIT7 0x00000080 +#define BIT6 0x00000040 +#define BIT5 0x00000020 +#define BIT4 0x00000010 +#define BIT3 0x00000008 +#define BIT2 0x00000004 +#define BIT1 0x00000002 +#define BIT0 0x00000001 +//}} + +#ifndef __ASSEMBLER__ +#define BIT(nr) (1UL << (nr)) +#define BIT64(nr) (1ULL << (nr)) +#else +#define BIT(nr) (1 << (nr)) +#endif \ No newline at end of file diff --git a/components/esp_common/src/stack_check.c b/components/esp_common/src/stack_check.c new file mode 100644 index 00000000..a820004b --- /dev/null +++ b/components/esp_common/src/stack_check.c @@ -0,0 +1,40 @@ +// Copyright 2017 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include "sdkconfig.h" +#include "esp_system.h" + +#if CONFIG_COMPILER_STACK_CHECK + +#define LOG_LOCAL_LEVEL CONFIG_LOG_DEFAULT_LEVEL +#include "esp_log.h" +const static char *TAG = "stack_chk"; + +void *__stack_chk_guard = NULL; + +static void __attribute__ ((constructor)) +__esp_stack_guard_setup (void) +{ + ESP_LOGD(TAG, "Intialize random stack guard"); + __stack_chk_guard = (void *)esp_random(); +} + +void __stack_chk_fail (void) +{ + ets_printf("\r\nStack smashing protect failure!\r\n\r\n"); + abort(); +} + +#endif