📄 tct.s
字号:
#/* the task is executed. */
#/* */
#/* AUTHOR */
#/* */
#/* Barry Sellew, Accelerated Technology, Inc. */
#/* */
#/* CALLED BY */
#/* */
#/* TCC_Send_Signals Send signals to a task */
#/* */
#/* CALLS */
#/* */
#/* None */
#/* */
#/* INPUTS */
#/* */
#/* task (argument in r3) Task control block pointer */
#/* */
#/* OUTPUTS */
#/* */
#/* None */
#/* */
#/* HISTORY */
#/* */
#/* NAME DATE REMARKS */
#/* */
#/* Barry Sellew 06-24-1996 Created initial version 1.0 */
#/* */
#/*************************************************************************/
#VOID TCT_Build_Signal_Frame(TC_TCB *task)
#{
.text
.align 2
TCT_Build_Signal_Frame:
#
# /* Pickup the stack pointer. */
# REG_Stack_Ptr = (BYTE_PTR) task -> tc_stack_pointer;
#
lwz r9,56(r3)
#
# /* Reference the Signal shell. */
# REG_Function_Ptr = (VOID *) TCC_Signal_Shell;
#
# /* Build a signal stack. This signal stack frame facilitates an
# solicited return to the TCC_Signal_Shell function, which in turn
# invokes the appropriate signal handler. The initial HISR stack frame
# has the following format:
#
# (Lower Address) Stack Top, new SP (r9) -> XXXX empty space for store
# XXXX DIAB/DATA LR
# XXXX DIAB/DATA SP
# 0 (Solicited stack type)
# MSR Current MSR value
# r14 Saved GPR14
# r15 Saved GPR15
# r16 Saved GPR16
# r17 Saved GPR17
# r18 Saved GPR18
# r19 Saved GPR19
# r20 Saved GPR20
# r21 Saved GPR21
# r22 Saved GPR22
# r23 Saved GPR23
# r24 Saved GPR24
# r25 Saved GPR25
# r26 Saved GPR26
# r27 Saved GPR27
# r28 Saved GPR28
# r29 Saved GPR29
# r30 Saved GPR30
# r31 Saved GPR31
# CTR Saved CTR
# XER Saved XER
# TCC_Signal_Shell Return address
# XXXX Old LR from DIAB/DATA
# (Higher Address) Stack Bottom, old SP (r1)-> XXXX Old SP from DIAB/DATA
#
addi r9,r9,-8 # allow old SP and LR from DIAB/DATA
li r8,0
addis r7,0,TCC_Signal_Shell@ha
addi r7,r7,TCC_Signal_Shell@l
stwu r7,0(r9) # Store entry address on stack
stwu r8,-4(r9) # store XER for restore
stwu r8,-4(r9) # store CTR for restore
stwu r8,-4(r9) # store r31 for space only
stwu r8,-4(r9) # store r30 for space only
stwu r8,-4(r9) # store r29 for space only
stwu r8,-4(r9) # store r28 for space only
stwu r8,-4(r9) # store r27 for space only
stwu r8,-4(r9) # store r26 for space only
stwu r8,-4(r9) # store r25 for space only
stwu r8,-4(r9) # store r24 for space only
stwu r8,-4(r9) # store r23 for space only
stwu r8,-4(r9) # store r22 for space only
stwu r8,-4(r9) # store r21 for space only
stwu r8,-4(r9) # store r20 for space only
stwu r8,-4(r9) # store r19 for space only
stwu r8,-4(r9) # store r18 for space only
stwu r8,-4(r9) # store r17 for space only
stwu r8,-4(r9) # store r16 for space only
stwu r8,-4(r9) # store r15 for space only
stwu r8,-4(r9) # store r14 for space only
#
# /* Store the MSR value for compatibility with SingleStep MTD */
#
stwu r12,-4(r9)
stwu r8,-4(r9) # store solicited stack type
#
# /* Allocate the extra space for the DIAB/DATA C to ASM interface */
#
addi r9,r9,-12
#
# /* Save the new stack pointer into the task's control block. */
# task -> tc_stack_pointer = (VOID *) REG_Stack_Ptr;
#
stw r9,56(r3)
#
# /* Return to caller */
#
blr
#
#}
#
#/*************************************************************************/
#/* */
#/* FUNCTION */
#/* */
#/* TCT_Check_Stack */
#/* */
#/* DESCRIPTION */
#/* */
#/* This function checks the current stack for overflow conditions. */
#/* Additionally, this function keeps track of the minimum amount */
#/* of stack space for the calling thread and returns the current */
#/* available stack space. */
#/* */
#/* AUTHOR */
#/* */
#/* Barry Sellew, Accelerated Technology, Inc. */
#/* */
#/* CALLED BY */
#/* */
#/* TCC_Send_Signals Send signals to a task */
#/* */
#/* CALLS */
#/* */
#/* ERC_System_Error System error handler */
#/* */
#/* INPUTS */
#/* */
#/* None */
#/* */
#/* OUTPUTS */
#/* */
#/* available bytes in stack (returned in r3) */
#/* */
#/* HISTORY */
#/* */
#/* NAME DATE REMARKS */
#/* */
#/* Barry Sellew 06-24-1996 Created initial version 1.0 */
#/* */
#/*************************************************************************/
#UNSIGNED TCT_Check_Stack(VOID)
#{
#
.text
.align 2
TCT_Check_Stack:
#
# /* Save the SP and LR for the return */
#
stwu r1,-16(r1)
mfspr r0,LR
stw r0,20(r1)
#
# /* Pickup the current task/HISR pointer. */
# thread = (TC_TCB *) TCD_Current_Thread;
#
addis r10,0,TCD_Current_Thread@ha
lwz r10,TCD_Current_Thread@l(r10)
#
# /* Determine if there is a current thread. */
# if (thread)
# {
#
cmpi 0,r10,0
beq TCT_Skip_Stack_Check # equal to zero
#
# /* Determine if the stack pointers are out of range. */
# if (( ((int *) current_stack < ((int *) thread -> tc_stack_start))
# || (((int *) current_stack) > ((int *) thread -> tc_stack_end)))
#
lwz r11,48(r10) # tc_stack_start
cmp 0,r1,r11 # current_stack < tc_stack_start
blt TCT_Stack_Range_Error
lwz r11,52(r10) # tc_stack_end
cmp 0,r1,r11 # current_stack < tc_stack_end
blt TCT_Stack_Range_Okay
TCT_Stack_Range_Error:
#
# /* Stack overflow condition exits. */
# ERC_System_Error(NU_STACK_OVERFLOW);
#
li r3,3
bl ERC_System_Error
TCT_Stack_Range_Okay:
#
# /* Calculate the amount of available space on the stack. */
# remaining = (BYTE_PTR) current_stack -
# (BYTE_PTR) thread -> tc_stack_start;
lwz r11,48(r10)
subf r9,r11,r1
#
# /* Determine if there is enough memory on the stack to save all of the
# registers. Note: The amount of the stack space must be enough
# for the interrupt frame. */
# if (remaining < 300)
#
cmpi 0,r9,300
bgt TCT_No_Stack_Error # remaining > 300
#
# /* Stack overflow condition is about to happen. */
# ERC_System_Error(NU_STACK_OVERFLOW);
#
li r3,3
bl ERC_System_Error
TCT_No_Stack_Error:
#
# /* Determine if this is a new minimum amount of stack space. */
# if (remaining < thread -> tc_stack_minimum)
#
lwz r12,64(r10)
cmpl 0,r9,r12
bgt TCT_Check_Stack_Exit # minimum > remaining
#
# /* Save the new stack minimum. */
# thread -> tc_stack_minimum = remaining;
#
stw r9,64(r10)
b TCT_Check_Stack_Exit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -