Added taskDeleteHook clean up function to support commands after Ctrl+C (#69)

Log:
```
sysToMonitor: reboot type  BOOT_NORMAL
0x1f03d20 (tRootTask): logging started to /tyCo/0 [3], queue size 50
0x1f03d20 (tRootTask): before usrNetInit()
0x1f03d20 (tRootTask): after usrNetInit()

Wait Flash and Network initialisation ...
Error reading target netmask information.
Defaulting netmask to 0xFFFFFF00.
Using default network mask = 0xFFFFFF00
User Network Init ... done

Launch CMT interface ... Done

[VxWorks Boot]:
0x1f03d20 (tRootTask): sysStartNetDev: Failed to set mask on device motfcc, unit: 1
RTClock set at: 5/1/2000 a 0:14:22
Instantiating /RAMDEV as rawFs,  device = 0x40001
Formatting /RAMDEV for DOSFS
Instantiating /RAMDEV as rawFs, device = 0x40001
Formatting...OK.
Ram Disk </RAMDEV> format and mount done.
Verify Flash structure
Flash structure check finished
@

boot device          : motfcc
unit number          : 0
processor number     : 0
host name            : host
file name            : vxWorks
inet on ethernet (e) : 192.168.0.18
host inet (h)        : 192.168.0.110
user (u)             : user
ftp password (pw)    : password
flags (f)            : 0x4
target name (tn)     : C264
other (o)            : motfcc

Loading... 5618296 + 408 + 624 + 616724
Starting at 0x10000...

Adding 15079 symbols for standalone.

                VxWorks

Copyright 1984-2026  Wind River Systems, Inc.

             CPU: Schneider Electric C264 CPU3 - MPC8270 PowerQUICC II core Frequency 262 MHz
    Runtime Name: VxWorks
 Runtime Version: 6.9
     BSP version: 6.9/D0.22
         Created: Jun 23 2026 01:17:59
ED&R Policy Mode: Deployed
   WDB Comm Type: WDB_COMM_END
             WDB: Agent Disabled.

-> cmd
[vxWorks]# genrsa -out pkey_new.pem 1024
[vxWorks]#
0x0007be50 vxTaskEntry  +0x48 : 0x003a4788 ()
0x003a4788 shellTask    +0x4a8: shellExec ()
0x003a41b0 shellExec    +0x78 : 0x003a3eb8 ()
0x003a3fe8 shellTaskDefaultBaseNameGet+0x81c: ledRead2 ()
0x00386928 ledRead2     +0x18c: 0x003acaac ()
0x003acaac viLedLibInit +0x150: read ()
0x00363930 read         +0x30 : 0x0036384c ()
0x003638bc close        +0xe0 : iosRead ()
0x00366030 iosRead      +0x54 : tyRead ()
0x0036da78 tyRead       +0x34 : semTake (0x1bc938)
0x004a1150 semTake      +0x7c : semBTake ()

Shell task 'tShell0' restarted...

[vxWorks]# genrsa -out pkey_new1.pem 1024
[vxWorks]#
0x0007be50 vxTaskEntry  +0x48 : 0x003a4788 ()
0x003a4788 shellTask    +0x4a8: shellExec ()
0x003a41b0 shellExec    +0x78 : 0x003a3eb8 ()
0x003a3fe8 shellTaskDefaultBaseNameGet+0x81c: ledRead2 ()
0x00386928 ledRead2     +0x18c: 0x003acaac ()
0x003acaac viLedLibInit +0x150: read ()
0x00363930 read         +0x30 : 0x0036384c ()
0x003638bc close        +0xe0 : iosRead ()
0x00366030 iosRead      +0x54 : tyRead ()
0x0036da78 tyRead       +0x34 : semTake (0x1bc938)
0x004a1150 semTake      +0x7c : semBTake ()

Shell task 'tShell0' restarted...

[vxWorks]#
0x0007be50 vxTaskEntry  +0x48 : 0x003a4788 ()
0x003a4788 shellTask    +0x4a8: shellExec ()
0x003a41b0 shellExec    +0x78 : 0x003a3eb8 ()
0x003a3fe8 shellTaskDefaultBaseNameGet+0x81c: ledRead2 ()
0x00386928 ledRead2     +0x18c: 0x003acaac ()
0x003acaac viLedLibInit +0x150: read ()
0x00363930 read         +0x30 : 0x0036384c ()
0x003638bc close        +0xe0 : iosRead ()
0x00366030 iosRead      +0x54 : tyRead ()
0x0036da78 tyRead       +0x34 : semTake (0x10)
0x004a1150 semTake      +0x7c : semBTake ()

Shell task 'tShell0' restarted...

[vxWorks]#
[vxWorks]# C
-> tss_symlist_show

=== TSS Symbol Table ===
TINFO                            ONCE_ARGSTR                      TSSKEYNAME                       TSSKEYVAL        STATE    CLONE
-------------------------------------------------------------------------------------------------------------------------------------
=== End of Table ===

value = 0 = 0x0
-> cmd
[vxWorks]# rand -hex 128
d187fc72364bbfb675724c93a0e9331ce2e51d519f32e7d258d88706e40c2faf7f575a307cc5965f9945b9df0548cdbd3a0d9f832edb803166a09be9449b01df94656ff1df3b7c0bf398e1e03225e9189534325b050dde670315eb4607cbbc4eab108ba8f60effb0111246bd6beec80b4367260ad9e599410ada2f49eec9bbb6
[vxWorks]# C
->
0x0007be50 vxTaskEntry  +0x48 : 0x003a4788 ()
0x003a4788 shellTask    +0x4a8: shellExec ()
0x003a41b0 shellExec    +0x78 : 0x003a3eb8 ()
0x003a3fe8 shellTaskDefaultBaseNameGet+0x81c: ledRead2 ()
0x00386928 ledRead2     +0x18c: 0x003acaac ()
0x003acaac viLedLibInit +0x150: read ()
0x00363930 read         +0x30 : 0x0036384c ()
0x003638bc close        +0xe0 : iosRead ()
0x00366030 iosRead      +0x54 : tyRead ()
0x0036da78 tyRead       +0x34 : semTake (0x17bb501)
0x004a1150 semTake      +0x7c : semBTake ()

Shell task 'tShell0' restarted...

-> cmd
[vxWorks]# genrsa -out pkey_new2.pem 2048
[vxWorks]# enc -aes-256-cbc -in plain.txt -out cipher.enc -K 4d794145533235364b6579466f72546573743132333435363738393000000000 -iv 496e6974566563746f72313643686172
[vxWorks]#
0x0007be50 vxTaskEntry  +0x48 : 0x003a4788 ()
0x003a4788 shellTask    +0x4a8: shellExec ()
0x003a41b0 shellExec    +0x78 : 0x003a3eb8 ()
0x003a3fe8 shellTaskDefaultBaseNameGet+0x81c: ledRead2 ()
0x00386928 ledRead2     +0x18c: 0x003acaac ()
0x003acaac viLedLibInit +0x150: read ()
0x00363930 read         +0x30 : 0x0036384c ()
0x003638bc close        +0xe0 : iosRead ()
0x00366030 iosRead      +0x54 : tyRead ()
0x0036da78 tyRead       +0x34 : semTake (0x4b657946)
0x004a1150 semTake      +0x7c : semBTake ()

Shell task 'tShell0' restarted...

[vxWorks]# enc -aes-256-cbc -d -in cipher.enc -out decrypted.txt -K 4d794145533235364b6579466f72546573743132333435363738393000000000 -iv 496e6974566563746f72313643686172
[vxWorks]#
```

Co-authored-by: subhamgdeb <subhamgdeb>
Reviewed-on: http://13.234.246.121:3000/Neominds/ossl35vx69/pulls/69
Co-authored-by: Subham Gangdeb <subham.gangdeb@neominds.in>
Co-committed-by: Subham Gangdeb <subham.gangdeb@neominds.in>
This commit is contained in:
2026-07-30 20:45:01 +05:30
committed by neelimap
co-authored by subhamgdeb
parent 769a9eefc7
commit 680b258e4e
+82 -19
View File
@@ -17,6 +17,7 @@ typedef struct {
char run_once_arg_str[MAX_STR_LEN];
char tss_key_name[MAX_STR_LEN];
tss_t *tss_key;
void (*dtor)(void *);
} tss_sym_info;
/* Sym table entry */
@@ -202,7 +203,8 @@ tss_symlist_add_new_internal(TASK_ID taskId,
char *tss_key_name,
tss_t *key,
tss_sym_state state,
int cloned)
int cloned,
void (*dtor)(void *))
{
int idx;
@@ -220,12 +222,55 @@ tss_symlist_add_new_internal(TASK_ID taskId,
strncpy(tss_sym_table[idx].info.tss_key_name, tss_key_name, MAX_STR_LEN - 1);
tss_sym_table[idx].info.tss_key_name[MAX_STR_LEN - 1] = '\0';
tss_sym_table[idx].info.tss_key = (tss_t*)key;
tss_sym_table[idx].info.dtor = dtor;
tss_sym_table[idx].state = state;
tss_sym_table[idx].cloned = cloned;
return OK;
}
/* taskHook cleanup */
void
tss_symlist_task_cleanup_hook(int taskId)
{
const char *name = taskName(taskId);
CRYPTO_THREAD_write_lock(tss_sym_table_lock);
int i;
for (i = 0; i < MAX_TSS_SYM_ENTRY; i++) {
if (tss_sym_table[i].state == TSS_SYMLIST_STATE_INVALID ||
tss_sym_table[i].taskid != taskId)
continue;
tss_t *thread_local_ptr = tss_sym_table[i].info.tss_key;
tss_entry_t *entry = (tss_entry_t *)(*thread_local_ptr);
/* Clear the global key pointer for this task immediately */
*thread_local_ptr = (tss_t)0;
if (entry) {
/* Call destructor only if entry->var is non‑NULL and looks valid */
if (entry->var && tss_sym_table[i].info.dtor) {
tss_sym_table[i].info.dtor(entry->var);
}
taskVarDelete(taskId, (void *)&entry->var);
entry->var = NULL;
entry->dtor = NULL;
free(entry);
}
/* clear the table slot */
memset(&tss_sym_table[i], 0, sizeof(tss_sym_entry));
tss_sym_table[i].info.tss_key = NULL;
tss_sym_table[i].state = TSS_SYMLIST_STATE_INVALID;
}
CRYPTO_THREAD_unlock(tss_sym_table_lock);
}
/* Initialize the TSS symbol table and clone list */
int
tss_sym_init(void)
@@ -247,6 +292,9 @@ tss_sym_init(void)
/* Create new lock */
tss_sym_table_lock = (CRYPTO_RWLOCK *)CRYPTO_THREAD_lock_new();
/* Attach cleanup routine to task delete hook chain */
taskDeleteHookAdd((FUNCPTR)tss_symlist_task_cleanup_hook);
g_tss_sym_initialized = 1;
return OK;
@@ -268,8 +316,11 @@ tss_symlist_add_new(TASK_ID taskId, char *run_once_arg_str, char *tss_key_name,
/* Acquire lock */
CRYPTO_THREAD_write_lock(tss_sym_table_lock);
int result = tss_symlist_add_new_internal(taskId, run_once_arg_str,
tss_key_name, key, TSS_SYMLIST_STATE_ADDED, FALSE);
tss_entry_t *tmp_entry = (tss_entry_t*)(*key);
int result = tss_symlist_add_new_internal(taskId, run_once_arg_str, tss_key_name,
key, TSS_SYMLIST_STATE_ADDED, FALSE,
tmp_entry ? tmp_entry->dtor : NULL);
/* Add this entry to the clone list if it isn't already added */
if (result == OK) {
@@ -278,6 +329,7 @@ tss_symlist_add_new(TASK_ID taskId, char *run_once_arg_str, char *tss_key_name,
strncpy(tmp.run_once_arg_str, run_once_arg_str, MAX_STR_LEN - 1);
strncpy(tmp.tss_key_name, tss_key_name, MAX_STR_LEN - 1);
tmp.tss_key = key;
tmp.dtor = tmp_entry ? tmp_entry->dtor : NULL;
tss_clone_list_add(&tmp);
}
@@ -289,7 +341,9 @@ tss_symlist_add_new(TASK_ID taskId, char *run_once_arg_str, char *tss_key_name,
/* Create entry and update the global key (thread_local) for the current task */
static int
tss_create_and_update_table(tss_t *key, char *tss_key_name, char *run_once_arg_str)
tss_create_and_update_table(tss_t *key, char *tss_key_name,
char *run_once_arg_str,
void (*dtor)(void *))
{
tss_entry_t *entry;
TASK_ID selfTaskId;
@@ -318,7 +372,8 @@ tss_create_and_update_table(tss_t *key, char *tss_key_name, char *run_once_arg_s
/* Add to symbol table for tracking */
int result = tss_symlist_add_new_internal(selfTaskId, run_once_arg_str,
tss_key_name, key, TSS_SYMLIST_STATE_ADDED, TRUE);
tss_key_name, key, TSS_SYMLIST_STATE_ADDED,
TRUE, dtor);
if (result != OK) {
/* Rollback on failure */
@@ -336,7 +391,8 @@ static int
tss_symlist_check_and_clone(TASK_ID tid,
const char *tss_key_name,
const char *run_once_arg_str,
tss_t *key)
tss_t *key,
void (*dtor)(void *))
{
int idx;
/* First, check if entry already exists in the symbol table */
@@ -355,7 +411,8 @@ tss_symlist_check_and_clone(TASK_ID tid,
/* Not found, clone entry - lock already held by caller */
return tss_create_and_update_table(key,
(char *)tss_key_name,
(char *)run_once_arg_str);
(char *)run_once_arg_str,
dtor);
}
/* Clone missing entries for a new task */
@@ -388,7 +445,8 @@ tss_symlist_clone_entries_for_new_task(char *run_once_arg_string)
int result = tss_symlist_check_and_clone(current_tid,
tss_clone_list[i].tss_key_name,
tss_clone_list[i].run_once_arg_str,
tss_clone_list[i].tss_key);
tss_clone_list[i].tss_key,
tss_clone_list[i].dtor);
}
CRYPTO_THREAD_unlock(tss_sym_table_lock);
@@ -412,21 +470,28 @@ tss_sym_deinit(void)
/* Acquire write lock before tearing down */
CRYPTO_THREAD_write_lock(tss_sym_table_lock);
/* Remove cleanup hook from task delete chain */
taskDeleteHookDelete((FUNCPTR)tss_symlist_task_cleanup_hook);
/* Free any remaining per-task entries in the symbol table */
for (i = 0; i < MAX_TSS_SYM_ENTRY; i++) {
if (tss_sym_table[i].state == TSS_SYMLIST_STATE_INVALID)
continue;
if (tss_sym_table[i].info.tss_key) {
tss_entry_t *entry = (tss_entry_t *)(*tss_sym_table[i].info.tss_key);
if (entry) {
if (entry->dtor)
entry->dtor(entry->var);
free(entry);
*tss_sym_table[i].info.tss_key = (tss_t)0; /* clear per-task slot */
tss_t *thread_local_ptr = tss_sym_table[i].info.tss_key;
tss_entry_t *entry = NULL;
if (thread_local_ptr) {
entry = (tss_entry_t *)(*thread_local_ptr);
/* Clear the global key for this task immediately */
*thread_local_ptr = (tss_t)0;
}
if (entry) {
if (entry->var && tss_sym_table[i].info.dtor) {
tss_sym_table[i].info.dtor(entry->var);
}
/* Clear the stored pointer to the key variable itself */
tss_sym_table[i].info.tss_key = NULL;
free(entry);
}
/* Clear the table slot */
@@ -436,8 +501,6 @@ tss_sym_deinit(void)
/* Clear clone list entries */
for (i = 0; i < MAX_CLONE_ENTRIES; i++) {
if (tss_clone_list[i].tss_key == NULL)
continue;
memset(&tss_clone_list[i], 0, sizeof(tss_sym_info));
tss_clone_list[i].tss_key = NULL;
}