Add necessary sections for stack protection area and implement fill function
This commit is contained in:
		@@ -50,4 +50,8 @@ static inline uint32_t read_stack_pointer()
 | 
			
		||||
	return stack_pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int stack_check_init_corruption_detect_area(void);
 | 
			
		||||
 | 
			
		||||
int stack_check_corruption_detect_area(void);
 | 
			
		||||
 | 
			
		||||
#endif /* __STACK_CHECK_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -20,9 +20,10 @@
 | 
			
		||||
 | 
			
		||||
#include <reflow-controller/stack-check.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stm-periph/rng.h>
 | 
			
		||||
 | 
			
		||||
extern char __ld_top_of_stack;
 | 
			
		||||
extern char __ld_eheap;
 | 
			
		||||
extern char __ld_end_stack;
 | 
			
		||||
 | 
			
		||||
int32_t stack_check_get_usage()
 | 
			
		||||
{
 | 
			
		||||
@@ -41,7 +42,45 @@ int32_t stack_check_get_free()
 | 
			
		||||
	uint32_t stack_ptr;
 | 
			
		||||
 | 
			
		||||
	stack_ptr = read_stack_pointer();
 | 
			
		||||
	upper_heap_boundary = (uint32_t)&__ld_eheap;
 | 
			
		||||
	upper_heap_boundary = (uint32_t)&__ld_end_stack;
 | 
			
		||||
 | 
			
		||||
	return stack_ptr - upper_heap_boundary;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
extern uint32_t __ld_start_stack_corruption_detect_area;
 | 
			
		||||
extern uint32_t __ld_end_stack_corruption_detect_area;
 | 
			
		||||
 | 
			
		||||
int stack_check_init_corruption_detect_area(void)
 | 
			
		||||
{
 | 
			
		||||
	volatile uint32_t *ptr = &__ld_start_stack_corruption_detect_area;
 | 
			
		||||
	volatile uint32_t *end_ptr = &__ld_end_stack_corruption_detect_area;
 | 
			
		||||
	enum random_number_error rng_stat;
 | 
			
		||||
	uint32_t rng_number;
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
 | 
			
		||||
	end_ptr--;
 | 
			
		||||
 | 
			
		||||
	random_number_gen_init(false);
 | 
			
		||||
 | 
			
		||||
	while (ptr < end_ptr) {
 | 
			
		||||
		rng_stat = random_number_gen_get_number(&rng_number, true);
 | 
			
		||||
 | 
			
		||||
		if (rng_stat != RNG_ERROR_OK) {
 | 
			
		||||
			ret = -1;
 | 
			
		||||
			goto exit_deinit_rng;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		*ptr = rng_number;
 | 
			
		||||
		ptr++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
exit_deinit_rng:
 | 
			
		||||
	random_number_gen_deinit();
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int stack_check_corruption_detect_area(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@
 | 
			
		||||
/* USER PARAMETERS */
 | 
			
		||||
__ld_stack_size = 0x3000;
 | 
			
		||||
__ld_heap_size  = 0x2100;
 | 
			
		||||
__stack_corruption_area_size = 64;
 | 
			
		||||
 | 
			
		||||
/* END OF USER PARAMETERS */
 | 
			
		||||
ENTRY(Reset_Handler)
 | 
			
		||||
@@ -150,6 +151,12 @@ SECTIONS
 | 
			
		||||
		__ld_sheap = .;
 | 
			
		||||
		. = . + __ld_heap_size;
 | 
			
		||||
		__ld_eheap = .;
 | 
			
		||||
		. = ALIGN(4)
 | 
			
		||||
		__ld_start_stack_corruption_detect_area = .;
 | 
			
		||||
		. = . + __stack_corruption_area_size;
 | 
			
		||||
		. = ALIGN(4);
 | 
			
		||||
		__ld_end_stack_corruption_detect_area = .;
 | 
			
		||||
		__ld_end_stack = .
 | 
			
		||||
		. = . + __ld_stack_size;
 | 
			
		||||
		. = ALIGN(4);
 | 
			
		||||
	} >RAM
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user