summaryrefslogtreecommitdiff
path: root/ports/arc_em
diff options
context:
space:
mode:
authorYuxin Zhou <[email protected]>2021-04-03 01:03:21 +0000
committerYuxin Zhou <[email protected]>2021-04-03 01:03:21 +0000
commitb12bd44faaca46dbad4b06cb93a8669c6e36e02a (patch)
tree033f9c24f940f39d8c4b1b40fcd0d388e80bf317 /ports/arc_em
parent6ffaf848a06ce9dbf8948254ed806ed94ae58305 (diff)
Release 6.1.6v6.1.6_rel
Diffstat (limited to 'ports/arc_em')
-rw-r--r--ports/arc_em/metaware/inc/tx_port.h9
-rw-r--r--ports/arc_em/metaware/readme_threadx.txt12
-rw-r--r--ports/arc_em/metaware/src/tx_initialize_low_level.s124
-rw-r--r--ports/arc_em/metaware/src/tx_thread_context_restore.s99
-rw-r--r--ports/arc_em/metaware/src/tx_thread_context_save.s96
-rw-r--r--ports/arc_em/metaware/src/tx_thread_interrupt_control.s76
-rw-r--r--ports/arc_em/metaware/src/tx_thread_schedule.s117
-rw-r--r--ports/arc_em/metaware/src/tx_thread_stack_build.s96
-rw-r--r--ports/arc_em/metaware/src/tx_thread_system_return.s82
-rw-r--r--ports/arc_em/metaware/src/tx_timer_interrupt.s93
10 files changed, 385 insertions, 419 deletions
diff --git a/ports/arc_em/metaware/inc/tx_port.h b/ports/arc_em/metaware/inc/tx_port.h
index 2fee779d..64b14664 100644
--- a/ports/arc_em/metaware/inc/tx_port.h
+++ b/ports/arc_em/metaware/inc/tx_port.h
@@ -26,7 +26,7 @@
/* PORT SPECIFIC C INFORMATION RELEASE */
/* */
/* tx_port.h ARCv2_EM/MetaWare */
-/* 6.1 */
+/* 6.1.6 */
/* */
/* AUTHOR */
/* */
@@ -48,6 +48,9 @@
/* DATE NAME DESCRIPTION */
/* */
/* 09-30-2020 William E. Lamie Initial Version 6.1 */
+/* 04-02-2021 Bhupendra Naphade Modified comment(s),updated */
+/* macro definition, */
+/* resulting in version 6.1.6 */
/* */
/**************************************************************************/
@@ -288,7 +291,7 @@ ULONG _tx_misra_time_stamp_get(VOID);
macros. */
-#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save;
+#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save;
#define TX_DISABLE interrupt_save = _clri();
#define TX_RESTORE _seti(interrupt_save);
@@ -308,7 +311,7 @@ ULONG _tx_misra_time_stamp_get(VOID);
#ifdef TX_THREAD_INIT
CHAR _tx_version_id[] =
- "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX ARCv2_EM/MetaWare Version 6.1 *";
+ "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX ARCv2_EM/MetaWare Version 6.1.6 *";
#else
#ifdef TX_MISRA_ENABLE
extern CHAR _tx_version_id[100];
diff --git a/ports/arc_em/metaware/readme_threadx.txt b/ports/arc_em/metaware/readme_threadx.txt
index d7791171..276c9867 100644
--- a/ports/arc_em/metaware/readme_threadx.txt
+++ b/ports/arc_em/metaware/readme_threadx.txt
@@ -209,6 +209,18 @@ For generic code revision information, please refer to the readme_threadx_generi
file, which is included in your distribution. The following details the revision
information associated with this specific port of ThreadX:
+04-02-2021 Release 6.1.6 changes:
+ tx_port.h Updated macro definition
+ tx_initialize_low_level.s Modified comments
+ tx_thread_context_restore.s r25/r30 are caller saved
+ tx_thread_context_save.s r25/r30 are caller saved
+ tx_thread_interrupt_control.s Modified comments
+ tx_thread_schedule.s fixed interrupt priority overwritting bug,
+ and fixed hardware stack checker disable and reenable logic
+ tx_thread_stack_build.s Modified comments
+ tx_thread_system_return.s Modified comments
+ tx_timer_interrupt.s remove unneeded load of _tx_thread_preempt_disable
+
09-30-2020 Initial ThreadX 6.1 for ARCv2 EM using MetaWare tools.
diff --git a/ports/arc_em/metaware/src/tx_initialize_low_level.s b/ports/arc_em/metaware/src/tx_initialize_low_level.s
index bcd91dff..4be1e0c1 100644
--- a/ports/arc_em/metaware/src/tx_initialize_low_level.s
+++ b/ports/arc_em/metaware/src/tx_initialize_low_level.s
@@ -8,33 +8,32 @@
;/* and in the root directory of this software. */
;/* */
;/**************************************************************************/
-;
-;
+
;/**************************************************************************/
;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
+;/** */
+;/** ThreadX Component */
;/** */
;/** Initialize */
;/** */
;/**************************************************************************/
;/**************************************************************************/
-;
+
.equ IRQ_SELECT, 0x40B
.equ KSTACK_TOP, 0x264
.equ KSTACK_BASE, 0x265
.equ STATUS32_SC, 0x4000
-;
+
;
; /* Define section for placement after all linker allocated RAM memory. This
-; is used to calculate the first free address that is passed to
+; is used to calculate the first free address that is passed to
; tx_appication_define, soley for the ThreadX application's use. */
;
.section ".free_memory","aw"
.align 4
.global _tx_first_free_address
_tx_first_free_address:
- .space 4
+ .space 4
;
; /* Define section for placement before the main stack area for setting
; up the STACK_TOP address for hardware stack checking. */
@@ -53,54 +52,55 @@ _tx_system_stack_top_address:
.global _tx_system_stack_base_address
_tx_system_stack_base_address:
.space 4
-;
-;
+
.text
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
+;/**************************************************************************/
+;/* */
+;/* FUNCTION RELEASE */
+;/* */
;/* _tx_initialize_low_level ARCv2_EM/MetaWare */
-;/* 6.1 */
+;/* 6.1.6 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
;/* */
;/* DESCRIPTION */
-;/* */
-;/* This function is responsible for any low-level processor */
-;/* initialization, including setting up interrupt vectors, setting */
-;/* up a periodic timer interrupt source, saving the system stack */
-;/* pointer for use in ISR processing later, and finding the first */
-;/* available RAM memory address for tx_application_define. */
-;/* */
-;/* INPUT */
-;/* */
-;/* None */
-;/* */
-;/* OUTPUT */
-;/* */
-;/* None */
-;/* */
-;/* CALLS */
-;/* */
-;/* None */
-;/* */
-;/* CALLED BY */
-;/* */
-;/* _tx_initialize_kernel_enter ThreadX entry function */
-;/* */
-;/* RELEASE HISTORY */
-;/* */
+;/* */
+;/* This function is responsible for any low-level processor */
+;/* initialization, including setting up interrupt vectors, setting */
+;/* up a periodic timer interrupt source, saving the system stack */
+;/* pointer for use in ISR processing later, and finding the first */
+;/* available RAM memory address for tx_application_define. */
+;/* */
+;/* INPUT */
+;/* */
+;/* None */
+;/* */
+;/* OUTPUT */
+;/* */
+;/* None */
+;/* */
+;/* CALLS */
+;/* */
+;/* None */
+;/* */
+;/* CALLED BY */
+;/* */
+;/* _tx_initialize_kernel_enter ThreadX entry function */
+;/* */
+;/* RELEASE HISTORY */
+;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
+;/* 04-02-2021 Andres Mlinar Modified comments, */
+;/* resulting in version 6.1.6 */
;/* */
;/**************************************************************************/
;VOID _tx_initialize_low_level(VOID)
;{
.global _tx_initialize_low_level
- .type _tx_initialize_low_level, @function
+ .type _tx_initialize_low_level, @function
_tx_initialize_low_level:
.ifdef TX_ENABLE_HW_STACK_CHECKING
@@ -130,7 +130,7 @@ _tx_initialize_low_level:
;
;
; /* Setup Timer 0 for periodic interrupts at interrupt vector 16. */
-;
+;
mov r0, 0 ; Disable additional ISR reg saving/restoring
sr r0, [AUX_IRQ_CTRL] ;
@@ -171,7 +171,7 @@ _tx_initialize_low_level:
;
; /* Define default vector table entries. */
;
- .global _tx_memory_error
+ .global _tx_memory_error
_tx_memory_error:
flag 1
nop
@@ -179,7 +179,7 @@ _tx_memory_error:
nop
b _tx_memory_error
- .global _tx_instruction_error
+ .global _tx_instruction_error
_tx_instruction_error:
flag 1
nop
@@ -187,7 +187,7 @@ _tx_instruction_error:
nop
b _tx_instruction_error
- .global _tx_ev_machine_check
+ .global _tx_ev_machine_check
_tx_ev_machine_check:
flag 1
nop
@@ -195,7 +195,7 @@ _tx_ev_machine_check:
nop
b _tx_ev_machine_check
- .global _tx_ev_tblmiss_inst
+ .global _tx_ev_tblmiss_inst
_tx_ev_tblmiss_inst:
flag 1
nop
@@ -203,7 +203,7 @@ _tx_ev_tblmiss_inst:
nop
b _tx_ev_tblmiss_inst
- .global _tx_ev_tblmiss_data
+ .global _tx_ev_tblmiss_data
_tx_ev_tblmiss_data:
flag 1
nop
@@ -211,7 +211,7 @@ _tx_ev_tblmiss_data:
nop
b _tx_ev_tblmiss_data
- .global _tx_ev_protection_viol
+ .global _tx_ev_protection_viol
_tx_ev_protection_viol:
flag 1
nop
@@ -219,7 +219,7 @@ _tx_ev_protection_viol:
nop
b _tx_ev_protection_viol
- .global _tx_ev_privilege_viol
+ .global _tx_ev_privilege_viol
_tx_ev_privilege_viol:
flag 1
nop
@@ -227,7 +227,7 @@ _tx_ev_privilege_viol:
nop
b _tx_ev_privilege_viol
- .global _tx_ev_software_int
+ .global _tx_ev_software_int
_tx_ev_software_int:
flag 1
nop
@@ -235,7 +235,7 @@ _tx_ev_software_int:
nop
b _tx_ev_software_int
- .global _tx_ev_trap
+ .global _tx_ev_trap
_tx_ev_trap:
flag 1
nop
@@ -243,7 +243,7 @@ _tx_ev_trap:
nop
b _tx_ev_trap
- .global _tx_ev_extension
+ .global _tx_ev_extension
_tx_ev_extension:
flag 1
nop
@@ -251,7 +251,7 @@ _tx_ev_extension:
nop
b _tx_ev_extension
- .global _tx_ev_divide_by_zero
+ .global _tx_ev_divide_by_zero
_tx_ev_divide_by_zero:
flag 1
nop
@@ -259,7 +259,7 @@ _tx_ev_divide_by_zero:
nop
b _tx_ev_divide_by_zero
- .global _tx_ev_dc_error
+ .global _tx_ev_dc_error
_tx_ev_dc_error:
flag 1
nop
@@ -267,7 +267,7 @@ _tx_ev_dc_error:
nop
b _tx_ev_dc_error
- .global _tx_ev_maligned
+ .global _tx_ev_maligned
_tx_ev_maligned:
flag 1
nop
@@ -275,7 +275,7 @@ _tx_ev_maligned:
nop
b _tx_ev_maligned
- .global _tx_unsued_0
+ .global _tx_unsued_0
_tx_unsued_0:
flag 1
nop
@@ -283,7 +283,7 @@ _tx_unsued_0:
nop
b _tx_unsued_0
- .global _tx_unused_1
+ .global _tx_unused_1
_tx_unused_1:
flag 1
nop
@@ -291,7 +291,7 @@ _tx_unused_1:
nop
b _tx_unused_1
- .global _tx_timer_0
+ .global _tx_timer_0
_tx_timer_0:
;
; /* By default, setup Timer 0 as the ThreadX timer interrupt. */
@@ -311,7 +311,7 @@ _tx_timer_0:
; nop
; b _tx_timer_0
- .global _tx_timer_1
+ .global _tx_timer_1
_tx_timer_1:
sub sp, sp, 160 ; Allocate an interrupt stack frame
st blink, [sp, 16] ; Save blink
@@ -333,7 +333,7 @@ _tx_timer_1:
; nop
; b _tx_timer_1
- .global _tx_undefined_0
+ .global _tx_undefined_0
_tx_undefined_0:
flag 1
nop
@@ -341,7 +341,7 @@ _tx_undefined_0:
nop
b _tx_undefined_0
- .global _tx_undefined_1
+ .global _tx_undefined_1
_tx_undefined_1:
flag 1
nop
@@ -349,7 +349,7 @@ _tx_undefined_1:
nop
b _tx_undefined_1
- .global _tx_undefined_2
+ .global _tx_undefined_2
_tx_undefined_2:
flag 1
nop
diff --git a/ports/arc_em/metaware/src/tx_thread_context_restore.s b/ports/arc_em/metaware/src/tx_thread_context_restore.s
index 882b306c..df072a7b 100644
--- a/ports/arc_em/metaware/src/tx_thread_context_restore.s
+++ b/ports/arc_em/metaware/src/tx_thread_context_restore.s
@@ -8,77 +8,70 @@
;/* and in the root directory of this software. */
;/* */
;/**************************************************************************/
-;
-;
+
+
;/**************************************************************************/
;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
+;/** */
+;/** ThreadX Component */
;/** */
;/** Thread */
;/** */
;/**************************************************************************/
;/**************************************************************************/
-;
-;
-;#define TX_SOURCE_CODE
-;
+
.equ BTA, 0x412
.equ KSTACK_TOP, 0x264
.equ KSTACK_BASE, 0x265
.equ STATUS32_SC, 0x4000
-;
-;/* Include necessary system files. */
-;
-;#include "tx_api.h"
-;#include "tx_thread.h"
-;#include "tx_timer.h"
-;
-;
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
+
+;/**************************************************************************/
+;/* */
+;/* FUNCTION RELEASE */
+;/* */
;/* _tx_thread_context_restore ARCv2_EM/MetaWare */
-;/* 6.1 */
+;/* 6.1.6 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
;/* */
;/* DESCRIPTION */
-;/* */
-;/* This function restores the interrupt context if it is processing a */
-;/* nested interrupt. If not, it returns to the interrupt thread if no */
-;/* preemption is necessary. Otherwise, if preemption is necessary or */
-;/* if no thread was running, the function returns to the scheduler. */
-;/* */
-;/* INPUT */
-;/* */
-;/* None */
-;/* */
-;/* OUTPUT */
-;/* */
-;/* None */
-;/* */
-;/* CALLS */
-;/* */
-;/* _tx_thread_schedule Thread scheduling routine */
-;/* */
-;/* CALLED BY */
-;/* */
-;/* ISRs Interrupt Service Routines */
-;/* */
-;/* RELEASE HISTORY */
-;/* */
+;/* */
+;/* This function restores the interrupt context if it is processing a */
+;/* nested interrupt. If not, it returns to the interrupt thread if no */
+;/* preemption is necessary. Otherwise, if preemption is necessary or */
+;/* if no thread was running, the function returns to the scheduler. */
+;/* */
+;/* INPUT */
+;/* */
+;/* None */
+;/* */
+;/* OUTPUT */
+;/* */
+;/* None */
+;/* */
+;/* CALLS */
+;/* */
+;/* _tx_thread_schedule Thread scheduling routine */
+;/* */
+;/* CALLED BY */
+;/* */
+;/* ISRs Interrupt Service Routines */
+;/* */
+;/* RELEASE HISTORY */
+;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
+;/* 04-02-2021 Andres Mlinar Modified comment(s), and */
+;/* r25/r30 are caller saved, */
+;/* resulting in version 6.1.6 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_context_restore(VOID)
;{
.global _tx_thread_context_restore
- .type _tx_thread_context_restore, @function
+ .type _tx_thread_context_restore, @function
_tx_thread_context_restore:
;
; /* Note: it is assumed that the stack pointer is in the same position now as
@@ -109,7 +102,7 @@ _tx_thread_context_restore:
;
; /* Interrupts are nested. */
;
-; /* Just recover the saved registers and return to the point of
+; /* Just recover the saved registers and return to the point of
; interrupt. */
;
@@ -119,7 +112,7 @@ __tx_thread_nested_restore:
sr r0, [LP_START] ; Restore LP_START
ld r1, [sp, 8] ; Recover LP_END
sr r1, [LP_END] ; Restore LP_END
- ld r2, [sp, 12] ; Recover LP_COUNT
+ ld r2, [sp, 12] ; Recover LP_COUNT
mov LP_COUNT, r2
ld r2, [sp, 156] ; Pickup BTA
sr r2, [BTA] ; Recover BTA
@@ -128,6 +121,7 @@ __tx_thread_nested_restore:
ld r59, [sp, 144] ; Recover r59
.endif
ld blink, [sp, 16] ; Recover blink
+ ld r25, [sp, 32] ; Recover r25
ld r12, [sp, 84] ; Recover r12
ld r11, [sp, 88] ; Recover r11
ld r10, [sp, 92] ; Recover r10
@@ -140,8 +134,9 @@ __tx_thread_nested_restore:
ld r3, [sp, 120] ; Recover r3
ld r2, [sp, 124] ; Recover r2
ld r1, [sp, 128] ; Recover r1
- ld r0, [sp, 132] ; Recover r0
- add sp, sp, 160 ; Recover interrupt stack frame
+ ld r0, [sp, 132] ; Recover r0
+ ld r30, [sp, 136] ; Recover r30
+ add sp, sp, 160 ; Recover interrupt stack frame
rtie ; Return from interrupt
;
;
@@ -149,7 +144,7 @@ __tx_thread_nested_restore:
__tx_thread_not_nested_restore:
;
; /* Determine if a thread was interrupted and no preemption is required. */
-; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr)
+; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr)
; || (_tx_thread_preempt_disable))
; {
;
@@ -207,6 +202,7 @@ __tx_thread_no_preempt_restore:
ld r59, [sp, 144] ; Recover r59
.endif
ld blink, [sp, 16] ; Recover blink
+ ld r25, [sp, 32] ; Recover r25
ld r12, [sp, 84] ; Recover r12
ld r11, [sp, 88] ; Recover r11
ld r10, [sp, 92] ; Recover r10
@@ -220,6 +216,7 @@ __tx_thread_no_preempt_restore:
ld r2, [sp, 124] ; Recover r2
ld r1, [sp, 128] ; Recover r1
ld r0, [sp, 132] ; Recover r0
+ ld r30, [sp, 136] ; Recover r30
add sp, sp, 160 ; Recover interrupt stack frame
rtie ; Return from interrupt
;
diff --git a/ports/arc_em/metaware/src/tx_thread_context_save.s b/ports/arc_em/metaware/src/tx_thread_context_save.s
index e67cdd80..e252af97 100644
--- a/ports/arc_em/metaware/src/tx_thread_context_save.s
+++ b/ports/arc_em/metaware/src/tx_thread_context_save.s
@@ -8,76 +8,68 @@
;/* and in the root directory of this software. */
;/* */
;/**************************************************************************/
-;
-;
+
;/**************************************************************************/
;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
+;/** */
+;/** ThreadX Component */
;/** */
;/** Thread */
;/** */
;/**************************************************************************/
;/**************************************************************************/
-;
-;
-;#define TX_SOURCE_CODE
-;
+
.equ BTA, 0x412
.equ KSTACK_TOP, 0x264
.equ KSTACK_BASE, 0x265
.equ STATUS32_SC, 0x4000
-;
-;/* Include necessary system files. */
-;
-;#include "tx_api.h"
-;#include "tx_thread.h"
-;#include "tx_timer.h"
-;
-;
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
+
+;/**************************************************************************/
+;/* */
+;/* FUNCTION RELEASE */
+;/* */
;/* _tx_thread_context_save ARCv2_EM/MetaWare */
-;/* 6.1 */
+;/* 6.1.6 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
;/* */
;/* DESCRIPTION */
-;/* */
-;/* This function saves the context of an executing thread in the */
-;/* beginning of interrupt processing. The function also ensures that */
-;/* the system stack is used upon return to the calling ISR. */
-;/* */
-;/* INPUT */
-;/* */
-;/* None */
-;/* */
-;/* OUTPUT */
-;/* */
-;/* None */
-;/* */
-;/* CALLS */
-;/* */
-;/* None */
-;/* */
-;/* CALLED BY */
-;/* */
-;/* ISRs */
-;/* */
-;/* RELEASE HISTORY */
-;/* */
+;/* */
+;/* This function saves the context of an executing thread in the */
+;/* beginning of interrupt processing. The function also ensures that */
+;/* the system stack is used upon return to the calling ISR. */
+;/* */
+;/* INPUT */
+;/* */
+;/* None */
+;/* */
+;/* OUTPUT */
+;/* */
+;/* None */
+;/* */
+;/* CALLS */
+;/* */
+;/* None */
+;/* */
+;/* CALLED BY */
+;/* */
+;/* ISRs */
+;/* */
+;/* RELEASE HISTORY */
+;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
+;/* 04-02-2021 Andres Mlinar Modified comment(s), and */
+;/* r25/r30 are caller saved, */
+;/* resulting in version 6.1.6 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_context_save(VOID)
;{
.global _tx_thread_context_save
- .type _tx_thread_context_save, @function
+ .type _tx_thread_context_save, @function
_tx_thread_context_save:
;
; /* Upon entry to this routine, it is assumed that an interrupt stack frame
@@ -106,6 +98,8 @@ _tx_thread_context_save:
; calling ISR. */
;
__tx_thread_nested_save: ; Label is for special nested interrupt case from idle system save below
+ st r30, [sp, 136] ; Save r30
+ st r25, [sp, 32] ; Save r25
st r12, [sp, 84] ; Save r12
st r11, [sp, 88] ; Save r11
st r10, [sp, 92] ; Save r10
@@ -114,7 +108,7 @@ __tx_thread_nested_save: ; Label is for special n
st r7, [sp, 104] ; Save r7
st r6, [sp, 108] ; Save r6
st r5, [sp, 112] ; Save r5
- st r4, [sp, 116] ; Save r6
+ st r4, [sp, 116] ; Save r4
lr r10, [LP_START] ; Pickup LP_START
lr r9, [LP_END] ; Pickup LP_END
st LP_COUNT, [sp, 12] ; Save LP_COUNT
@@ -156,6 +150,8 @@ __tx_thread_not_nested_save:
add r0, r0, 1 ; Increment the nested interrupt count
st r0, [gp, _tx_thread_system_state@sda] ; Update system state
ld r1, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread pointer
+ st r30, [sp, 136] ; Save r30
+ st r25, [sp, 32] ; Save r25
st r12, [sp, 84] ; Save r12
st r11, [sp, 88] ; Save r11
breq r1, 0, __tx_thread_idle_system_save ; If no thread is running, idle system was
@@ -247,13 +243,15 @@ __tx_thread_idle_system_save:
lr r0, [AUX_IRQ_ACT] ; Pickup the interrupt active register
neg r1, r0 ; Negate
and r1, r0, r1 ; See if there are any other interrupts present
- brne r0, r1, __tx_thread_nested_save ; If more interrupts, go into the nested interrupt save logic
+ breq r0, r1, __tx_thread_not_nested
+ j __tx_thread_nested_save ; If more interrupts, go into the nested interrupt save logic
+__tx_thread_not_nested:
;
-; /* Not much to do here, just adjust the stack pointer, and return to
+; /* Not much to do here, just adjust the stack pointer, and return to
; ISR processing. */
;
j_s.d [blink] ; Return to ISR
- add sp, sp, 160 ; Recover stack space
+ add sp, sp, 160 ; Recover stack space
;
; }
;}
diff --git a/ports/arc_em/metaware/src/tx_thread_interrupt_control.s b/ports/arc_em/metaware/src/tx_thread_interrupt_control.s
index e032d6d8..59a078fa 100644
--- a/ports/arc_em/metaware/src/tx_thread_interrupt_control.s
+++ b/ports/arc_em/metaware/src/tx_thread_interrupt_control.s
@@ -8,69 +8,61 @@
;/* and in the root directory of this software. */
;/* */
;/**************************************************************************/
-;
-;
+
;/**************************************************************************/
;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
+;/** */
+;/** ThreadX Component */
;/** */
;/** Thread */
;/** */
;/**************************************************************************/
;/**************************************************************************/
-;
-;#define TX_SOURCE_CODE
-;
-;
-;/* Include necessary system files. */
-;
-;#include "tx_api.h"
-;#include "tx_thread.h"
-;
-;
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
+
+;/**************************************************************************/
+;/* */
+;/* FUNCTION RELEASE */
+;/* */
;/* _tx_thread_interrupt_control ARCv2_EM/MetaWare */
-;/* 6.1 */
+;/* 6.1.6 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
;/* */
;/* DESCRIPTION */
-;/* */
-;/* This function is responsible for changing the interrupt lockout */
-;/* posture of the system. */
-;/* */
-;/* INPUT */
-;/* */
-;/* new_posture New interrupt lockout posture */
-;/* */
-;/* OUTPUT */
-;/* */
-;/* old_posture Old interrupt lockout posture */
-;/* */
-;/* CALLS */
-;/* */
-;/* None */
-;/* */
-;/* CALLED BY */
-;/* */
-;/* Application Code */
-;/* */
-;/* RELEASE HISTORY */
-;/* */
+;/* */
+;/* This function is responsible for changing the interrupt lockout */
+;/* posture of the system. */
+;/* */
+;/* INPUT */
+;/* */
+;/* new_posture New interrupt lockout posture */
+;/* */
+;/* OUTPUT */
+;/* */
+;/* old_posture Old interrupt lockout posture */
+;/* */
+;/* CALLS */
+;/* */
+;/* None */
+;/* */
+;/* CALLED BY */
+;/* */
+;/* Application Code */
+;/* */
+;/* RELEASE HISTORY */
+;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
+;/* 04-02-2021 Andres Mlinar Modified comments, */
+;/* resulting in version 6.1.6 */
;/* */
;/**************************************************************************/
;UINT _tx_thread_interrupt_control(UINT new_posture)
;{
.global _tx_thread_interrupt_control
- .type _tx_thread_interrupt_control, @function
+ .type _tx_thread_interrupt_control, @function
_tx_thread_interrupt_control:
;
; /* Pickup current interrupt lockout posture. */
diff --git a/ports/arc_em/metaware/src/tx_thread_schedule.s b/ports/arc_em/metaware/src/tx_thread_schedule.s
index bb50e563..0cc74757 100644
--- a/ports/arc_em/metaware/src/tx_thread_schedule.s
+++ b/ports/arc_em/metaware/src/tx_thread_schedule.s
@@ -8,73 +8,67 @@
;/* and in the root directory of this software. */
;/* */
;/**************************************************************************/
-;
-;
+
;/**************************************************************************/
;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
+;/** */
+;/** ThreadX Component */
;/** */
;/** Thread */
;/** */
;/**************************************************************************/
;/**************************************************************************/
-;
-;
-;#define TX_SOURCE_CODE
-;
-;
+
.equ BTA, 0x412
.equ KSTACK_TOP, 0x264
.equ KSTACK_BASE, 0x265
.equ STATUS32_SC, 0x4000
-;
-;/* Include necessary system files. */
-;
-;#include "tx_api.h"
-;#include "tx_thread.h"
-;#include "tx_timer.h"
-;
-;
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
+
+;/**************************************************************************/
+;/* */
+;/* FUNCTION RELEASE */
+;/* */
;/* _tx_thread_schedule ARCv2_EM/MetaWare */
-;/* 6.1 */
+;/* 6.1.6 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
;/* */
;/* DESCRIPTION */
-;/* */
-;/* This function waits for a thread control block pointer to appear in */
-;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */
-;/* in the variable, the corresponding thread is resumed. */
-;/* */
-;/* INPUT */
-;/* */
-;/* None */
-;/* */
-;/* OUTPUT */
-;/* */
+;/* */
+;/* This function waits for a thread control block pointer to appear in */
+;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */
+;/* in the variable, the corresponding thread is resumed. */
+;/* */
+;/* INPUT */
+;/* */
+;/* None */
+;/* */
+;/* OUTPUT */
+;/* */
;/* None */
-;/* */
-;/* CALLS */
-;/* */
+;/* */
+;/* CALLS */
+;/* */
;/* None */
-;/* */
-;/* CALLED BY */
-;/* */
-;/* _tx_initialize_kernel_enter ThreadX entry function */
-;/* _tx_thread_system_return Return to system from thread */
-;/* _tx_thread_context_restore Restore thread's context */
-;/* */
-;/* RELEASE HISTORY */
-;/* */
+;/* */
+;/* CALLED BY */
+;/* */
+;/* _tx_initialize_kernel_enter ThreadX entry function */
+;/* _tx_thread_system_return Return to system from thread */
+;/* _tx_thread_context_restore Restore thread's context */
+;/* */
+;/* RELEASE HISTORY */
+;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
+;/* 04-02-2021 Andres Mlinar Modified comment(s), and */
+;/* fixed interrupt priority */
+;/* overwritting bug, and */
+;/* fixed hardware stack checker*/
+;/* disable and reenable logic, */
+;/* resulting in version 6.1.6 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_schedule(VOID)
@@ -85,8 +79,13 @@ _tx_thread_schedule:
;
; /* Enable interrupts. */
;
- mov r0, 0x1F ; Build enable interrupt value
- seti r0 ; Enable interrupts
+ seti 0 ; Enable interrupts without changing threshold level
+
+ .ifdef TX_ENABLE_HW_STACK_CHECKING
+ lr r2, [status32] ; Pickup current STATUS32
+ and r2, r2, ~STATUS32_SC ; Clear the hardware stack checking enable bit (SC)
+ kflag r2 ; Disable hardware stack checking
+ .endif
;
; /* Wait for a thread to execute. */
; do
@@ -99,7 +98,7 @@ __tx_thread_schedule_loop:
;
; }
; while(_tx_thread_execute_ptr == TX_NULL);
-;
+;
; /* Yes! We have a thread to execute. Lockout interrupts and
; transfer control to it. */
;
@@ -118,16 +117,6 @@ __tx_thread_schedule_loop:
ld r4, [r0, 24] ; Pickup time-slice for this thread
add r3, r3, 1 ; Increment run counter
st r3, [r0, 4] ; Store the new run counter
-
- .ifdef TX_ENABLE_HW_STACK_CHECKING
- lr r2, [status32] ; Pickup current STATUS32
- and r2, r2, ~STATUS32_SC ; Clear the hardware stack checking enable bit (SC)
- kflag r2 ; Disable hardware stack checking
- ld r3, [r0, 12] ; Pickup the top of the thread's stack (lowest address)
- sr r3, [KSTACK_TOP] ; Setup KSTACK_TOP
- ld r3, [r0, 16] ; Pickup the base of the thread's stack (highest address)
- sr r3, [KSTACK_BASE] ; Setup KSTACK_BASE
- .endif
;
; /* Setup time-slice, if present. */
; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice;
@@ -135,6 +124,10 @@ __tx_thread_schedule_loop:
ld sp, [r0, 8] ; Switch to thread's stack
.ifdef TX_ENABLE_HW_STACK_CHECKING
+ ld r3, [r0, 12] ; Pickup the top of the thread's stack (lowest address)
+ sr r3, [KSTACK_TOP] ; Setup KSTACK_TOP
+ ld r3, [r0, 16] ; Pickup the base of the thread's stack (highest address)
+ sr r3, [KSTACK_BASE] ; Setup KSTACK_BASE
or r2, r2, STATUS32_SC ; Or in hardware stack checking enable bit (SC)
kflag r2 ; Enable hardware stack checking
.endif
@@ -176,8 +169,8 @@ __tx_thread_schedule_loop:
ld r13, [sp, 64] ; Recover r13
ld r1, [sp, 68] ; Pickup status32
ld r30, [sp, 72] ; Recover r30
- add sp, sp, 76 ; Recover solicited stack frame
- j_s.d [blink] ; Return to thread and restore flags
+ add sp, sp, 76 ; Recover solicited stack frame
+ j_s.d [blink] ; Return to thread and restore flags
seti r1 ; Recover STATUS32
;
__tx_thread_schedule_int_ret:
@@ -189,7 +182,7 @@ __tx_thread_schedule_int_ret:
sr r0, [LP_START] ; Restore LP_START
ld r1, [sp, 8] ; Recover LP_END
sr r1, [LP_END] ; Restore LP_END
- ld r2, [sp, 12] ; Recover LP_COUNT
+ ld r2, [sp, 12] ; Recover LP_COUNT
mov LP_COUNT, r2
ld r0, [sp, 156] ; Pickup saved BTA
sr r0, [BTA] ; Recover BTA
@@ -230,7 +223,7 @@ __tx_thread_schedule_int_ret:
.endif
add sp, sp, 160 ; Recover interrupt stack frame
rtie ; Return to point of interrupt
-
+
;
;}
;
diff --git a/ports/arc_em/metaware/src/tx_thread_stack_build.s b/ports/arc_em/metaware/src/tx_thread_stack_build.s
index b576b0ff..b6550712 100644
--- a/ports/arc_em/metaware/src/tx_thread_stack_build.s
+++ b/ports/arc_em/metaware/src/tx_thread_stack_build.s
@@ -8,70 +8,60 @@
;/* and in the root directory of this software. */
;/* */
;/**************************************************************************/
-;
-;
+
;/**************************************************************************/
;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
+;/** */
+;/** ThreadX Component */
;/** */
;/** Thread */
;/** */
;/**************************************************************************/
;/**************************************************************************/
-;
-;
-;#define TX_SOURCE_CODE
-;
-;
-;/* Include necessary system files. */
-;
-;#include "tx_api.h"
-;#include "tx_thread.h"
-;
-;
- .equ LONG_ALIGN_MASK, 0xFFFFFFFC
+
+ .equ LONG_ALIGN_MASK, 0xFFFFFFFC
.equ INT_ENABLE_BITS, 0x8000001E
-;
-;
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
+
+;/**************************************************************************/
+;/* */
+;/* FUNCTION RELEASE */
+;/* */
;/* _tx_thread_stack_build ARCv2_EM/MetaWare */
-;/* 6.1 */
+;/* 6.1.6 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
;/* */
;/* DESCRIPTION */
-;/* */
+;/* */
;/* This function builds a stack frame on the supplied thread's stack. */
;/* The stack frame results in a fake interrupt return to the supplied */
-;/* function pointer. */
-;/* */
-;/* INPUT */
-;/* */
+;/* function pointer. */
+;/* */
+;/* INPUT */
+;/* */
;/* thread_ptr Pointer to thread control blk */
;/* function_ptr Pointer to return function */
-;/* */
-;/* OUTPUT */
-;/* */
+;/* */
+;/* OUTPUT */
+;/* */
;/* None */
-;/* */
-;/* CALLS */
-;/* */
+;/* */
+;/* CALLS */
+;/* */
;/* None */
-;/* */
-;/* CALLED BY */
-;/* */
+;/* */
+;/* CALLED BY */
+;/* */
;/* _tx_thread_create Create thread service */
-;/* */
-;/* RELEASE HISTORY */
-;/* */
+;/* */
+;/* RELEASE HISTORY */
+;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
+;/* 04-02-2021 Andres Mlinar Modified comments, */
+;/* resulting in version 6.1.6 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID))
@@ -80,11 +70,11 @@
.type _tx_thread_stack_build, @function
_tx_thread_stack_build:
;
-;
+;
; /* Build a fake interrupt frame. The form of the fake interrupt stack
; on the ARCv2 EM should look like the following after it is built.
; Note that the extension registers are always assigned space here.
-;
+;
; Stack Top: 1 Interrupt stack frame type
; LP_START Initial loop start
; LP_END Initial loop end
@@ -119,7 +109,7 @@ _tx_thread_stack_build:
; r2 Initial r2
; r1 Initial r1
; r0 Initial r0
-; r30 Initial r30
+; r30 Initial r30
; r58 Initial r58
; r59 Initial r59
; 0 Reserved
@@ -127,10 +117,10 @@ _tx_thread_stack_build:
; 0 Initial BTA
; 0 Point of Interrupt (thread entry point)
; 0 Initial STATUS32
-; 0 Backtrace
-; 0 Backtrace
-; 0 Backtrace
-; 0 Backtrace
+; 0 Backtrace
+; 0 Backtrace
+; 0 Backtrace
+; 0 Backtrace
;
; *: these registers will only be saved and restored if flag -Xxmac_d16 is passed to hcac
;
@@ -179,19 +169,19 @@ _tx_thread_stack_build:
st r5, [r3, 128] ; Store initial r1
st r5, [r3, 132] ; Store initial r0
st r5, [r3, 136] ; Store initial r30
- st r5, [r3, 140] ; Store initial r58
+ st r5, [r3, 140] ; Store initial r58
st r5, [r3, 144] ; Store initial r59
st r5, [r3, 148] ; Reserved
st r5, [r3, 152] ; Reserved
st r5, [r3, 156] ; Store initial BTA
- st r1, [r3, 160] ; Store initial point of entry
+ st r1, [r3, 160] ; Store initial point of entry
lr r6, [status32] ; Pickup STATUS32
or r6, r6, INT_ENABLE_BITS ; Make sure interrupts are enabled
st r6, [r3, 164] ; Store initial STATUS32
- st r5, [r3, 168] ; Backtrace 0
- st r5, [r3, 172] ; Backtrace 0
- st r5, [r3, 176] ; Backtrace 0
- st r5, [r3, 180] ; Backtrace 0
+ st r5, [r3, 168] ; Backtrace 0
+ st r5, [r3, 172] ; Backtrace 0
+ st r5, [r3, 176] ; Backtrace 0
+ st r5, [r3, 180] ; Backtrace 0
;
; /* Setup stack pointer. */
; thread_ptr -> tx_thread_stack_ptr = r3;
diff --git a/ports/arc_em/metaware/src/tx_thread_system_return.s b/ports/arc_em/metaware/src/tx_thread_system_return.s
index fa061e1c..b3bbafed 100644
--- a/ports/arc_em/metaware/src/tx_thread_system_return.s
+++ b/ports/arc_em/metaware/src/tx_thread_system_return.s
@@ -8,69 +8,61 @@
;/* and in the root directory of this software. */
;/* */
;/**************************************************************************/
-;
-;
+
;/**************************************************************************/
;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
+;/** */
+;/** ThreadX Component */
;/** */
;/** Thread */
;/** */
;/**************************************************************************/
;/**************************************************************************/
-;
-;#define TX_SOURCE_CODE
-;
+
.equ KSTACK_TOP, 0x264
.equ KSTACK_BASE, 0x265
.equ STATUS32_SC, 0x4000
-;
-;/* Include necessary system files. */
-;
-;#include "tx_api.h"
-;#include "tx_thread.h"
-;#include "tx_timer.h"
-;
-;
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
+
+;/**************************************************************************/
+;/* */
+;/* FUNCTION RELEASE */
+;/* */
;/* _tx_thread_system_return ARCv2_EM/MetaWare */
-;/* 6.1 */
+;/* 6.1.6 */
;/* AUTHOR */
;/* */
;/* William E. Lamie, Microsoft Corporation */
;/* */
;/* DESCRIPTION */
-;/* */
-;/* This function is target processor specific. It is used to transfer */
-;/* control from a thread back to the ThreadX system. Only a */
-;/* minimal context is saved since the compiler assumes temp registers */
-;/* are going to get slicked by a function call anyway. */
-;/* */
-;/* INPUT */
-;/* */
-;/* None */
-;/* */
-;/* OUTPUT */
-;/* */
-;/* None */
-;/* */
-;/* CALLS */
-;/* */
-;/* _tx_thread_schedule Thread scheduling loop */
-;/* */
-;/* CALLED BY */
-;/* */
-;/* ThreadX components */
-;/* */
-;/* RELEASE HISTORY */
-;/* */
+;/* */
+;/* This function is target processor specific. It is used to transfer */
+;/* control from a thread back to the ThreadX system. Only a */
+;/* minimal context is saved since the compiler assumes temp registers */
+;/* are going to get slicked by a function call anyway. */
+;/* */
+;/* INPUT */
+;/* */
+;/* None */
+;/* */
+;/* OUTPUT */
+;/* */
+;/* None */
+;/* */
+;/* CALLS */
+;/* */
+;/* _tx_thread_schedule Thread scheduling loop */
+;/* */
+;/* CALLED BY */
+;/* */
+;/* ThreadX components */
+;/* */
+;/* RELEASE HISTORY */
+;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
+;/* 04-02-2021 Andres Mlinar Modified comments, */
+;/* resulting in version 6.1.6 */
;/* */
;/**************************************************************************/
;VOID _tx_thread_system_return(VOID)
@@ -105,7 +97,7 @@ _tx_thread_system_return:
st r13, [sp, 64] ; Save r13
st r2, [sp, 68] ; Save status32
st r30, [sp, 72] ; Save r30
-;
+;
.ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY
;
; /* Call the thread exit function to indicate the thread is no longer executing. */
diff --git a/ports/arc_em/metaware/src/tx_timer_interrupt.s b/ports/arc_em/metaware/src/tx_timer_interrupt.s
index 27141e01..a3aea5eb 100644
--- a/ports/arc_em/metaware/src/tx_timer_interrupt.s
+++ b/ports/arc_em/metaware/src/tx_timer_interrupt.s
@@ -8,32 +8,21 @@
;/* and in the root directory of this software. */
;/* */
;/**************************************************************************/
-;
-;
+
;/**************************************************************************/
;/**************************************************************************/
-;/** */
-;/** ThreadX Component */
+;/** */
+;/** ThreadX Component */
;/** */
;/** Timer */
;/** */
;/**************************************************************************/
;/**************************************************************************/
-;
-;#define TX_SOURCE_CODE
-;
-;
-;/* Include necessary system files. */
-;
-;#include "tx_api.h"
-;#include "tx_timer.h"
-;#include "tx_thread.h"
-;
-;
-;/**************************************************************************/
-;/* */
-;/* FUNCTION RELEASE */
-;/* */
+
+;/**************************************************************************/
+;/* */
+;/* FUNCTION RELEASE */
+;/* */
;/* _tx_timer_interrupt ARCv2_EM/MetaWare */
;/* 6.1.3 */
;/* AUTHOR */
@@ -41,34 +30,34 @@
;/* William E. Lamie, Microsoft Corporation */
;/* */
;/* DESCRIPTION */
-;/* */
-;/* This function processes the hardware timer interrupt. This */
-;/* processing includes incrementing the system clock and checking for */
-;/* time slice and/or timer expiration. If either is found, the */
-;/* interrupt context save/restore functions are called along with the */
-;/* expiration functions. */
-;/* */
-;/* INPUT */
-;/* */
-;/* None */
-;/* */
-;/* OUTPUT */
-;/* */
-;/* None */
-;/* */
-;/* CALLS */
-;/* */
-;/* _tx_timer_expiration_process Process timer expiration */
-;/* _tx_thread_time_slice Time slice interrupted thread */
-;/* _tx_thread_context_save Save interrupt context */
-;/* _tx_thread_context_restore Restore interrupt context */
-;/* */
-;/* CALLED BY */
-;/* */
-;/* interrupt vector */
-;/* */
-;/* RELEASE HISTORY */
-;/* */
+;/* */
+;/* This function processes the hardware timer interrupt. This */
+;/* processing includes incrementing the system clock and checking for */
+;/* time slice and/or timer expiration. If either is found, the */
+;/* interrupt context save/restore functions are called along with the */
+;/* expiration functions. */
+;/* */
+;/* INPUT */
+;/* */
+;/* None */
+;/* */
+;/* OUTPUT */
+;/* */
+;/* None */
+;/* */
+;/* CALLS */
+;/* */
+;/* _tx_timer_expiration_process Process timer expiration */
+;/* _tx_thread_time_slice Time slice interrupted thread */
+;/* _tx_thread_context_save Save interrupt context */
+;/* _tx_thread_context_restore Restore interrupt context */
+;/* */
+;/* CALLED BY */
+;/* */
+;/* interrupt vector */
+;/* */
+;/* RELEASE HISTORY */
+;/* */
;/* DATE NAME DESCRIPTION */
;/* */
;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
@@ -81,7 +70,7 @@
;VOID _tx_timer_interrupt(VOID)
;{
.global _tx_timer_interrupt
- .type _tx_timer_interrupt, @function
+ .type _tx_timer_interrupt, @function
_tx_timer_interrupt:
;
; /* Upon entry to this routine, it is assumed the interrupt stack frame has
@@ -132,7 +121,7 @@ __tx_timer_no_time_slice:
;
ld r0, [gp, _tx_timer_current_ptr@sda] ; Pickup current timer pointer
ld r2, [r0, 0] ; Pickup examine actual list entry
- breq r2, 0, __tx_timer_no_timer ;
+ breq r2, 0, __tx_timer_no_timer ;
; If NULL, no timer has expired, just move to the next entry
;
; /* Set expiration flag. */
@@ -220,7 +209,7 @@ __tx_timer_dont_activate:
;
__tx_timer_not_ts_expiration:
;
- st 0, [gp, _tx_timer_expired_time_slice@sda]
+ st 0, [gp, _tx_timer_expired_time_slice@sda]
b _tx_thread_context_restore ; Go restore interrupt context..
; ..clearing time-slice expired flag
; Note that we don't return from
@@ -233,9 +222,9 @@ __tx_timer_nothing_expired:
ld r0, [sp, 0] ; Recover r0
ld r1, [sp, 4] ; Recover r1
ld r2, [sp, 8] ; Recover r2
- add sp, sp, 160 ; Recover interrupt stack frame
+ add sp, sp, 160 ; Recover interrupt stack frame
rtie ; Return to point of interrupt
;
;}
.end
-
+