diff options
| author | Scott Larson <[email protected]> | 2020-08-07 16:56:45 -0700 |
|---|---|---|
| committer | Scott Larson <[email protected]> | 2020-08-07 16:56:45 -0700 |
| commit | 6f61053f2ac6cfa01a33b910401a61e63bca0972 (patch) | |
| tree | 7ba850077c3fb4d024c8f6d59609e94c6c627707 /common_smp/src/tx_thread_smp_debug_entry_insert.c | |
| parent | 49e3c27f3f140cd76147d85ccbb1eea31e09ee16 (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.c | 223 |
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 + |
