From 463de590f0946b2457a48e9d0ebb3abfcdae086b Mon Sep 17 00:00:00 2001 From: Jennifer Averett Date: Wed, 16 Apr 2014 09:42:37 -0500 Subject: capture: Fix capture engine to handle new extensions. --- cpukit/libmisc/capture/capture.c | 94 ++++++++++++++++++++++++++++------------ cpukit/libmisc/capture/capture.h | 17 +++++--- 2 files changed, 76 insertions(+), 35 deletions(-) diff --git a/cpukit/libmisc/capture/capture.c b/cpukit/libmisc/capture/capture.c index 6f8e0a242d..9ec07b8051 100644 --- a/cpukit/libmisc/capture/capture.c +++ b/cpukit/libmisc/capture/capture.c @@ -51,11 +51,41 @@ RTEMS_CAPTURE_DELETED_BY_EVENT | \ RTEMS_CAPTURE_DELETED_EVENT | \ RTEMS_CAPTURE_BEGIN_EVENT | \ - RTEMS_CAPTURE_EXITTED_EVENT) + RTEMS_CAPTURE_EXITTED_EVENT | \ + RTEMS_CAPTURE_TERMINATED_EVENT) #else #define RTEMS_CAPTURE_RECORD_EVENTS (0) #endif +static bool +rtems_capture_create_task (rtems_tcb* current_task, + rtems_tcb* new_task); + +static void +rtems_capture_start_task (rtems_tcb* current_task, + rtems_tcb* started_task); + +static void +rtems_capture_restart_task (rtems_tcb* current_task, + rtems_tcb* restarted_task); + +static void +rtems_capture_delete_task (rtems_tcb* current_task, + rtems_tcb* deleted_task); + +static void +rtems_capture_switch_task (rtems_tcb* current_task, + rtems_tcb* heir_task); + +static void +rtems_capture_begin_task (rtems_tcb* begin_task); + +static void +rtems_capture_exitted_task (rtems_tcb* exitted_task); + +static void +rtems_capture_terminated_task (rtems_tcb* terminated_task); + /* * Global capture flags. */ @@ -88,6 +118,18 @@ static rtems_id capture_reader; static rtems_interrupt_lock capture_lock = RTEMS_INTERRUPT_LOCK_INITIALIZER("capture"); +static const rtems_extensions_table capture_extensions = { + .thread_create = rtems_capture_create_task, + .thread_start = rtems_capture_start_task, + .thread_restart = rtems_capture_restart_task, + .thread_delete = rtems_capture_delete_task, + .thread_switch = rtems_capture_switch_task, + .thread_begin = rtems_capture_begin_task, + .thread_exitted = rtems_capture_exitted_task, + .fatal = NULL, + .thread_terminate = rtems_capture_terminated_task +}; + /* * RTEMS Event text. */ @@ -101,6 +143,7 @@ static const char* capture_event_text[] = "RESTARTED", "DELETED_BY", "DELETED", + "TERMINATED", "BEGIN", "EXITTED", "SWITCHED_OUT", @@ -787,21 +830,28 @@ rtems_capture_exitted_task (rtems_tcb* exitted_task) static void rtems_capture_terminated_task (rtems_tcb* terminated_task) { - rtems_capture_delete_task (terminated_task, terminated_task); -} + /* + * Get the capture task control block so we can trace this + * event. + */ + rtems_capture_task_t* tt; -/* - * This function is called when a fatal error occurs. - */ -static void -rtems_capture_fatal( - Internal_errors_Source source, - bool is_internal, - Internal_errors_t code -) -{ + tt = terminated_task->extensions[capture_extension_index]; + + /* + * The task pointers may not be known as the task may have + * been created before the capture engine was open. Add them. + */ + + if (tt == NULL) + tt = rtems_capture_create_capture_task (terminated_task); + + if (rtems_capture_trigger (NULL, tt, RTEMS_CAPTURE_TERMINATED)) + rtems_capture_record (tt, RTEMS_CAPTURE_TERMINATED_EVENT); + + rtems_capture_task_stack_usage (tt); } - + /* * This function is called when a context is switched. */ @@ -887,7 +937,6 @@ rtems_capture_switch_task (rtems_tcb* current_task, rtems_status_code rtems_capture_open (uint32_t size, rtems_capture_timestamp timestamp __attribute__((unused))) { - rtems_extensions_table capture_extensions; rtems_name name; rtems_status_code sc; @@ -912,19 +961,6 @@ rtems_capture_open (uint32_t size, rtems_capture_timestamp timestamp __attribu capture_ceiling = 0; capture_floor = 255; - /* - * Create the extension table. This is copied so we - * can create it as a local. - */ - capture_extensions.thread_create = rtems_capture_create_task; - capture_extensions.thread_start = rtems_capture_start_task; - capture_extensions.thread_restart = rtems_capture_restart_task; - capture_extensions.thread_delete = rtems_capture_delete_task; - capture_extensions.thread_switch = rtems_capture_switch_task; - capture_extensions.thread_begin = rtems_capture_begin_task; - capture_extensions.thread_exitted = rtems_capture_exitted_task; - capture_extensions.fatal = NULL; - /* * Register the user extension handlers for the CAPture Engine. */ @@ -1341,6 +1377,8 @@ rtems_capture_map_trigger (rtems_capture_trigger_t trigger) return RTEMS_CAPTURE_BEGIN; case rtems_capture_exitted: return RTEMS_CAPTURE_EXITTED; + case rtems_capture_terminated: + return RTEMS_CAPTURE_TERMINATED; default: break; } diff --git a/cpukit/libmisc/capture/capture.h b/cpukit/libmisc/capture/capture.h index fa82f6dd19..737c73f754 100644 --- a/cpukit/libmisc/capture/capture.h +++ b/cpukit/libmisc/capture/capture.h @@ -120,6 +120,7 @@ typedef struct rtems_capture_control_s #define RTEMS_CAPTURE_DELETE (1 << 4) #define RTEMS_CAPTURE_BEGIN (1 << 5) #define RTEMS_CAPTURE_EXITTED (1 << 6) +#define RTEMS_CAPTURE_TERMINATED (1 << 7) #define RTEMS_CAPTURE_FROM_TRIGS (RTEMS_CAPTURE_SWITCH | \ RTEMS_CAPTURE_CREATE | \ @@ -208,12 +209,13 @@ typedef struct rtems_capture_record_s #define RTEMS_CAPTURE_RESTARTED_EVENT UINT32_C (0x00200000) #define RTEMS_CAPTURE_DELETED_BY_EVENT UINT32_C (0x00400000) #define RTEMS_CAPTURE_DELETED_EVENT UINT32_C (0x00800000) -#define RTEMS_CAPTURE_BEGIN_EVENT UINT32_C (0x01000000) -#define RTEMS_CAPTURE_EXITTED_EVENT UINT32_C (0x02000000) -#define RTEMS_CAPTURE_SWITCHED_OUT_EVENT UINT32_C (0x04000000) -#define RTEMS_CAPTURE_SWITCHED_IN_EVENT UINT32_C (0x08000000) -#define RTEMS_CAPTURE_TIMESTAMP UINT32_C (0x10000000) -#define RTEMS_CAPTURE_EVENT_END (28) +#define RTEMS_CAPTURE_TERMINATED_EVENT UINT32_C (0x01000000) +#define RTEMS_CAPTURE_BEGIN_EVENT UINT32_C (0x02000000) +#define RTEMS_CAPTURE_EXITTED_EVENT UINT32_C (0x04000000) +#define RTEMS_CAPTURE_SWITCHED_OUT_EVENT UINT32_C (0x08000000) +#define RTEMS_CAPTURE_SWITCHED_IN_EVENT UINT32_C (0x10000000) +#define RTEMS_CAPTURE_TIMESTAMP UINT32_C (0x20000000) +#define RTEMS_CAPTURE_EVENT_END (29) /** * @brief Capture trigger modes @@ -240,7 +242,8 @@ typedef enum rtems_capture_trigger_e rtems_capture_restart, rtems_capture_delete, rtems_capture_begin, - rtems_capture_exitted + rtems_capture_exitted, + rtems_capture_terminated } rtems_capture_trigger_t; /** -- cgit v1.2.3