summaryrefslogtreecommitdiff
path: root/common_smp
diff options
context:
space:
mode:
authorXiuwen Cai <[email protected]>2023-05-12 10:13:42 +0800
committerGitHub <[email protected]>2023-05-12 10:13:42 +0800
commit6b8ece0ff28fb0160a2fdf51c09df09d587f4575 (patch)
tree7f1f6ba9a727d43831eedd020ea50d027c1053c8 /common_smp
parent6d9f25fac9d091a097c70f9cbff0e50252fde52a (diff)
Add random number stack filling option. (#257)
Co-authored-by: TiejunZhou <[email protected]>
Diffstat (limited to 'common_smp')
-rw-r--r--common_smp/inc/tx_api.h31
-rw-r--r--common_smp/inc/tx_user_sample.h14
-rw-r--r--common_smp/src/tx_initialize_kernel_enter.c11
-rw-r--r--common_smp/src/tx_thread_create.c17
4 files changed, 68 insertions, 5 deletions
diff --git a/common_smp/inc/tx_api.h b/common_smp/inc/tx_api.h
index 568d48c9..cc88566c 100644
--- a/common_smp/inc/tx_api.h
+++ b/common_smp/inc/tx_api.h
@@ -26,7 +26,7 @@
/* APPLICATION INTERFACE DEFINITION RELEASE */
/* */
/* tx_api.h PORTABLE SMP */
-/* 6.2.1 */
+/* 6.x */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -85,6 +85,10 @@
/* 03-08-2023 Tiejun Zhou Modified comment(s), */
/* update patch number, */
/* resulting in version 6.2.1 */
+/* xx-xx-xxxx Xiuwen Cai Modified comment(s), */
+/* added option for random */
+/* number stack filling, */
+/* resulting in version 6.x */
/* */
/**************************************************************************/
@@ -172,7 +176,11 @@ extern "C" {
#define TX_NO_MESSAGES ((UINT) 0)
#define TX_EMPTY ((ULONG) 0)
#define TX_CLEAR_ID ((ULONG) 0)
+#if defined(TX_ENABLE_RANDOM_NUMBER_STACK_FILLING) && defined(TX_ENABLE_STACK_CHECKING)
+#define TX_STACK_FILL (thread_ptr -> tx_thread_stack_fill_value)
+#else
#define TX_STACK_FILL ((ULONG) 0xEFEFEFEFUL)
+#endif
/* Thread execution state values. */
@@ -639,6 +647,12 @@ typedef struct TX_THREAD_STRUCT
cleanup routine executes. */
ULONG tx_thread_suspension_sequence;
+#if defined(TX_ENABLE_RANDOM_NUMBER_STACK_FILLING) && defined(TX_ENABLE_STACK_CHECKING)
+
+ /* Define the random stack fill number. This can be used to detect stack overflow. */
+ ULONG tx_thread_stack_fill_value;
+#endif
+
/* Define the user extension field. This typically is defined
to white space, but some ports of ThreadX may need to have
additional fields in the thread control block. This is
@@ -1886,6 +1900,21 @@ UINT _tx_trace_interrupt_control(UINT new_posture);
#endif
+/* Add a default macro that can be re-defined in tx_port.h to add processing to the initialize random number generator.
+ By default, this is simply defined as whitespace. */
+
+#ifndef TX_INITIALIZE_RANDOM_GENERATOR_INITIALIZATION
+#define TX_INITIALIZE_RANDOM_GENERATOR_INITIALIZATION
+#endif
+
+
+/* Define the TX_RAND macro to the standard library function, if not already defined. */
+
+#ifndef TX_RAND
+#define TX_RAND() rand()
+#endif
+
+
/* Check for MISRA compliance requirements. */
#ifdef TX_MISRA_ENABLE
diff --git a/common_smp/inc/tx_user_sample.h b/common_smp/inc/tx_user_sample.h
index d04d2dcb..e637346f 100644
--- a/common_smp/inc/tx_user_sample.h
+++ b/common_smp/inc/tx_user_sample.h
@@ -26,7 +26,7 @@
/* PORT SPECIFIC C INFORMATION RELEASE */
/* */
/* tx_user.h PORTABLE C */
-/* 6.1.11 */
+/* 6.x */
/* */
/* AUTHOR */
/* */
@@ -62,6 +62,10 @@
/* optimized the definition of */
/* TX_TIMER_TICKS_PER_SECOND, */
/* resulting in version 6.1.11 */
+/* xx-xx-xxxx Xiuwen Cai Modified comment(s), */
+/* added option for random */
+/* number stack filling, */
+/* resulting in version 6.x */
/* */
/**************************************************************************/
@@ -170,6 +174,14 @@
#define TX_ENABLE_STACK_CHECKING
*/
+/* Determine if random number is used for stack filling. By default, ThreadX uses a fixed
+ pattern for stack filling. When the following is defined, ThreadX uses a random number
+ for stack filling. This is effective only when TX_ENABLE_STACK_CHECKING is defined. */
+
+/*
+#define TX_ENABLE_RANDOM_NUMBER_STACK_FILLING
+*/
+
/* Determine if preemption-threshold should be disabled. By default, preemption-threshold is
enabled. If the application does not use preemption-threshold, it may be disabled to reduce
code size and improve performance. */
diff --git a/common_smp/src/tx_initialize_kernel_enter.c b/common_smp/src/tx_initialize_kernel_enter.c
index 4f57da02..b35981b8 100644
--- a/common_smp/src/tx_initialize_kernel_enter.c
+++ b/common_smp/src/tx_initialize_kernel_enter.c
@@ -47,7 +47,7 @@ TX_SAFETY_CRITICAL_EXCEPTION_HANDLER
/* FUNCTION RELEASE */
/* */
/* _tx_initialize_kernel_enter PORTABLE SMP */
-/* 6.1 */
+/* 6.x */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -87,7 +87,11 @@ TX_SAFETY_CRITICAL_EXCEPTION_HANDLER
/* */
/* DATE NAME DESCRIPTION */
/* */
-/* 09-30-2020 William E. Lamie Initial Version 6.1 */
+/* 09-30-2020 William E. Lamie Initial Version 6.1 */
+/* xx-xx-xxxx Xiuwen Cai Modified comment(s), */
+/* added random generator */
+/* initialization, */
+/* resulting in version 6.x */
/* */
/**************************************************************************/
VOID _tx_initialize_kernel_enter(VOID)
@@ -134,6 +138,9 @@ ULONG other_core_status, i;
later used to represent interrupt nesting. */
_tx_thread_system_state[0] = TX_INITIALIZE_IN_PROGRESS;
+ /* Optional random number generator initialization. */
+ TX_INITIALIZE_RANDOM_GENERATOR_INITIALIZATION
+
/* Call the application provided initialization function. Pass the
first available memory address to it. */
tx_application_define(_tx_initialize_unused_memory);
diff --git a/common_smp/src/tx_thread_create.c b/common_smp/src/tx_thread_create.c
index 2c799a9b..ffb37132 100644
--- a/common_smp/src/tx_thread_create.c
+++ b/common_smp/src/tx_thread_create.c
@@ -37,7 +37,7 @@
/* FUNCTION RELEASE */
/* */
/* _tx_thread_create PORTABLE SMP */
-/* 6.2.0 */
+/* 6.x */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -89,6 +89,10 @@
/* restore interrupts at end */
/* of if block, */
/* resulting in version 6.2.0 */
+/* xx-xx-xxxx Xiuwen Cai Modified comment(s), */
+/* added option for random */
+/* number stack filling, */
+/* resulting in version 6.x */
/* */
/**************************************************************************/
UINT _tx_thread_create(TX_THREAD *thread_ptr, CHAR *name_ptr,
@@ -110,6 +114,17 @@ ALIGN_TYPE updated_stack_start;
#ifndef TX_DISABLE_STACK_FILLING
+#if defined(TX_ENABLE_RANDOM_NUMBER_STACK_FILLING) && defined(TX_ENABLE_STACK_CHECKING)
+
+ /* Initialize the stack fill value to a 8-bit random value. */
+ thread_ptr -> tx_thread_stack_fill_value = ((ULONG) TX_RAND()) & 0xFFUL;
+
+ /* Duplicate the random value in each of the 4 bytes of the stack fill value. */
+ thread_ptr -> tx_thread_stack_fill_value = thread_ptr -> tx_thread_stack_fill_value |
+ (thread_ptr -> tx_thread_stack_fill_value << 8) |
+ (thread_ptr -> tx_thread_stack_fill_value << 16) |
+ (thread_ptr -> tx_thread_stack_fill_value << 24);
+#endif
/* Set the thread stack to a pattern prior to creating the initial
stack frame. This pattern is used by the stack checking routines