summaryrefslogtreecommitdiff
path: root/common_smp/src/tx_thread_smp_debug_entry_insert.c
diff options
context:
space:
mode:
authorScott Larson <[email protected]>2020-08-07 16:56:45 -0700
committerScott Larson <[email protected]>2020-08-07 16:56:45 -0700
commit6f61053f2ac6cfa01a33b910401a61e63bca0972 (patch)
tree7ba850077c3fb4d024c8f6d59609e94c6c627707 /common_smp/src/tx_thread_smp_debug_entry_insert.c
parent49e3c27f3f140cd76147d85ccbb1eea31e09ee16 (diff)
add SMP, Modules, and more processor/tools releases
Diffstat (limited to 'common_smp/src/tx_thread_smp_debug_entry_insert.c')
-rw-r--r--common_smp/src/tx_thread_smp_debug_entry_insert.c223
1 files changed, 223 insertions, 0 deletions
diff --git a/common_smp/src/tx_thread_smp_debug_entry_insert.c b/common_smp/src/tx_thread_smp_debug_entry_insert.c
new file mode 100644
index 00000000..4472dba5
--- /dev/null
+++ b/common_smp/src/tx_thread_smp_debug_entry_insert.c
@@ -0,0 +1,223 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Thread */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
+#define TX_SOURCE_CODE
+#define TX_THREAD_SMP_SOURCE_CODE
+
+
+/* Include necessary system files. */
+
+
+#include "tx_api.h"
+#include "tx_initialize.h"
+#include "tx_timer.h"
+#include "tx_thread.h"
+
+
+/* Determine if debugging is enabled. */
+
+#ifdef TX_THREAD_SMP_DEBUG_ENABLE
+
+
+/* Define the maximum number of debug entries. */
+
+#ifndef TX_THREAD_SMP_MAX_DEBUG_ENTRIES
+#define TX_THREAD_SMP_MAX_DEBUG_ENTRIES 100
+#endif
+
+
+/* Define the debug information structures. */
+
+typedef struct TX_THREAD_SMP_DEBUG_ENTRY_STRUCT
+{
+
+ ULONG tx_thread_smp_debug_entry_id;
+ ULONG tx_thread_smp_debug_entry_suspend;
+ ULONG tx_thread_smp_debug_entry_core_index;
+ ULONG tx_thread_smp_debug_entry_time;
+ ULONG tx_thread_smp_debug_entry_timer_clock;
+ TX_THREAD *tx_thread_smp_debug_entry_thread;
+ UINT tx_thread_smp_debug_entry_thread_priority;
+ UINT tx_thread_smp_debug_entry_thread_threshold;
+ ULONG tx_thread_smp_debug_entry_thread_core_control;
+ TX_THREAD *tx_thread_smp_debug_entry_current_thread;
+ TX_THREAD_SMP_PROTECT tx_thread_smp_debug_protection;
+ ULONG tx_thread_smp_debug_entry_preempt_disable;
+ ULONG tx_thread_smp_debug_entry_system_state[TX_THREAD_SMP_MAX_CORES];
+#ifndef TX_DISABLE_PREEMPTION_THRESHOLD
+ ULONG tx_thread_smp_debug_entry_preempt_map;
+#endif
+ TX_THREAD *tx_thread_smp_debug_entry_preempt_thread;
+ ULONG tx_thread_smp_debug_entry_priority_map;
+ ULONG tx_thread_smp_debug_entry_reschedule_pending;
+ TX_THREAD *tx_thread_smp_debug_entry_current_threads[TX_THREAD_SMP_MAX_CORES];
+ TX_THREAD *tx_thread_smp_debug_entry_execute_threads[TX_THREAD_SMP_MAX_CORES];
+
+} TX_THREAD_SMP_DEBUG_ENTRY_INFO;
+
+
+/* Define the circular array of debug entries. */
+
+TX_THREAD_SMP_DEBUG_ENTRY_INFO _tx_thread_smp_debug_info_array[TX_THREAD_SMP_MAX_DEBUG_ENTRIES];
+
+
+/* Define the starting index. */
+
+ULONG _tx_thread_smp_debug_info_current_index;
+
+
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _tx_thread_smp_debug_entry_insert PORTABLE SMP */
+/* 6.0.1 */
+/* AUTHOR */
+/* */
+/* William E. Lamie, Microsoft Corporation */
+/* */
+/* DESCRIPTION */
+/* */
+/* This function is responsible for making an entry in the circular */
+/* debug log. */
+/* */
+/* INPUT */
+/* */
+/* id ID of event */
+/* suspend Flag set to true for suspend */
+/* events */
+/* thread_ptr Specified thread */
+/* */
+/* OUTPUT */
+/* */
+/* None */
+/* */
+/* CALLS */
+/* */
+/* _tx_thread_smp_time_get Get global time stamp */
+/* */
+/* CALLED BY */
+/* */
+/* Internal routines */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */
+/* */
+/**************************************************************************/
+void _tx_thread_smp_debug_entry_insert(ULONG id, ULONG suspend, VOID *thread_void_ptr)
+{
+
+ULONG i;
+ULONG core_index;
+TX_THREAD_SMP_DEBUG_ENTRY_INFO *entry_ptr;
+TX_THREAD *thread_ptr;
+
+
+ /* Spin, if an error is detected. No sense in populating the debug after the error occurs. */
+ while (_tx_thread_smp_system_error)
+ {
+
+ /* Spin here! */
+ }
+
+ /* Check for a bad current index. */
+ while (_tx_thread_smp_debug_info_current_index >= TX_THREAD_SMP_MAX_DEBUG_ENTRIES)
+ {
+
+ /* Spin here! */
+ }
+
+ thread_ptr = (TX_THREAD *) thread_void_ptr;
+
+ /* It is assumed that interrupts are locked out at this point. */
+
+ /* Setup pointer to debug entry. */
+ entry_ptr = &_tx_thread_smp_debug_info_array[_tx_thread_smp_debug_info_current_index++];
+
+ /* Check for wrap on the index. */
+ if (_tx_thread_smp_debug_info_current_index >= TX_THREAD_SMP_MAX_DEBUG_ENTRIES)
+ {
+
+ /* Wrap back to 0. */
+ _tx_thread_smp_debug_info_current_index = 0;
+ }
+
+ /* Get the index. */
+ core_index = TX_SMP_CORE_ID;
+
+ /* We know at this point that multithreading and interrupts are disabled... so start populating the array. */
+ entry_ptr -> tx_thread_smp_debug_entry_id = id;
+ entry_ptr -> tx_thread_smp_debug_entry_suspend = suspend;
+ entry_ptr -> tx_thread_smp_debug_entry_thread = thread_ptr;
+ entry_ptr -> tx_thread_smp_debug_entry_time = _tx_thread_smp_time_get();
+ entry_ptr -> tx_thread_smp_debug_entry_timer_clock = _tx_timer_system_clock;
+ entry_ptr -> tx_thread_smp_debug_entry_core_index = core_index;
+ entry_ptr -> tx_thread_smp_debug_entry_current_thread = _tx_thread_current_ptr[core_index];
+ if (entry_ptr -> tx_thread_smp_debug_entry_current_thread)
+ {
+
+ entry_ptr -> tx_thread_smp_debug_entry_thread_priority = (entry_ptr -> tx_thread_smp_debug_entry_current_thread) -> tx_thread_priority;
+ entry_ptr -> tx_thread_smp_debug_entry_thread_threshold = (entry_ptr -> tx_thread_smp_debug_entry_current_thread) -> tx_thread_preempt_threshold;
+ entry_ptr -> tx_thread_smp_debug_entry_thread_core_control = (entry_ptr -> tx_thread_smp_debug_entry_current_thread) -> tx_thread_smp_core_control;
+ }
+ else
+ {
+
+ entry_ptr -> tx_thread_smp_debug_entry_thread_priority = 0;
+ entry_ptr -> tx_thread_smp_debug_entry_thread_threshold = 0;
+ entry_ptr -> tx_thread_smp_debug_entry_thread_core_control = 0;
+ }
+
+ entry_ptr -> tx_thread_smp_debug_protection = _tx_thread_smp_protection;
+ entry_ptr -> tx_thread_smp_debug_entry_preempt_disable = _tx_thread_preempt_disable;
+#ifndef TX_DISABLE_PREEMPTION_THRESHOLD
+ entry_ptr -> tx_thread_smp_debug_entry_preempt_map = _tx_thread_preempted_maps[0];
+#endif
+ entry_ptr -> tx_thread_smp_debug_entry_preempt_thread = _tx_thread_preemption__threshold_scheduled;
+ entry_ptr -> tx_thread_smp_debug_entry_priority_map = _tx_thread_priority_maps[0];
+
+#ifndef TX_THREAD_SMP_DYNAMIC_CORE_MAX
+
+ /* Loop to save the current and execute lists. */
+ for (i = 0; i < TX_THREAD_SMP_MAX_CORES; i++)
+#else
+
+ /* Loop to save the current and execute lists. */
+ for (i = 0; i < _tx_thread_smp_max_cores; i++)
+#endif
+ {
+
+ /* Save the pointers. */
+ entry_ptr -> tx_thread_smp_debug_entry_current_threads[i] = _tx_thread_current_ptr[i];
+ entry_ptr -> tx_thread_smp_debug_entry_execute_threads[i] = _tx_thread_execute_ptr[i];
+
+ /* Save the system state. */
+ entry_ptr -> tx_thread_smp_debug_entry_system_state[i] = _tx_thread_system_state[i];
+ }
+}
+
+
+#endif
+