📄 tct.s
字号:
mtmsr r11 # write current interrupt status
#
# /* return the old interrupt level */
#
li r3,0
rlwinm r4,r4,0,16,16 # allow only the MSR[EE] bit
ori r3,r4,0
blr
#
#}
#
#/*************************************************************************/
#/* */
#/* FUNCTION */
#/* */
#/* TCT_Restore_Interrupts */
#/* */
#/* DESCRIPTION */
#/* */
#/* This function restores interrupts to that specified in the */
#/* global TCD_Interrupt_Level variable. */
#/* */
#/* CALLED BY */
#/* */
#/* Application */
#/* */
#/* CALLS */
#/* */
#/* None */
#/* */
#/* INPUTS */
#/* */
#/* None */
#/* */
#/* OUTPUTS */
#/* */
#/* None */
#/* */
#/* */
#/* HISTORY */
#/* */
#/* NAME DATE REMARKS */
#/* */
#/* Barry Sellew 06-24-1996 Created initial version 1.0 */
#/* */
#/*************************************************************************/
#VOID TCT_Restore_Interrupts(VOID)
#{
.text
.align 2
TCT_Restore_Interrupts:
#
# /* lock out all interrupts */
#
mfmsr r11 # get current MSR value
rlwinm r11,r11,0,17,15 # mask off MSR[EE] bit
mtmsr r11 # write current interrupt status
#
# /* read in the current interrupt level */
#
addis r4,0,TCD_Interrupt_Level@ha
lwz r4,TCD_Interrupt_Level@l(r4)
#
# /* restore the current interrupt level */
#
or r11,r11,r4 # or in the interrupt bits
mtmsr r11 # write current interrupt status
#
# /* return to the caller */
#
blr
#
#}
#
#/*************************************************************************/
#/* */
#/* FUNCTION */
#/* */
#/* TCT_Build_Task_Stack */
#/* */
#/* DESCRIPTION */
#/* */
#/* This function builds an initial stack frame for a task. The */
#/* initial stack contains information concerning initial values of */
#/* registers and the task's point of entry. Furthermore, the */
#/* initial stack frame is in the same form as an interrupt stack */
#/* frame. */
#/* */
#/* CALLED BY */
#/* */
#/* TCC_Create_Task Create a new task */
#/* TCC_Reset_Task Reset the specified 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_Task_Stack(TC_TCB *task)
#{
.text
.align 2
TCT_Build_Task_Stack:
#
# /* Pickup the stack base. */
# REG_Stack_Base = (BYTE_PTR) task -> tc_stack_start;
#
lwz r11,48(r3)
#
# /* Pickup the stack size. */
# REG_Stack_Size = task -> tc_stack_size;
#
lwz r10,60(r3)
#
# /* Calculate the stack ending address. */
# REG_Stack_End = REG_Stack_Base + REG_Stack_Size;
#
add r9,r11,r10
rlwinm r9,r9,0,0,29 # word alignment
#
# /* Save the stack ending address. */
# task -> tc_stack_end = REG_Stack_End - DIAB/DATA space;
#
subi r9,r9,0x10
stw r9,52(r3)
#
#
# /* Save the minimum amount of remaining stack memory. */
# task -> tc_stack_minimum = REG_Stack_Size - 164;
#
addi r10,r10,-164
#
# /* Store the base size used in the stack */
#
stw r10,64(r3)
#
# /* Reference the task shell. */
# REG_Function_Ptr = (VOID *) TCC_Task_Shell;
#
#
# /* Build an initial stack. This initial stack frame facilitates an
# interrupt return to the TCC_Task_Shell function, which in turn
# invokes the application task. The initial stack frame has the
# following format:
# (Lower Address) Stack Top, new SP (r1) -> 0 XXX Empty space to fill next
# 4 XXX Old SP DIAB/DATA uses
# 8 XXX Old LR DIAB/DATA uses
# 12 1 (Interrupt stack type)
# SRR1 Old MSR
# Note: The floating point registers are
# only saved if the MSR[FP] bit is
# set/enabled.
# FPSCR Saved FPSCR
# f0 Saved FPR0
# f1 Saved FPR1
# f2 Saved FPR2
# f3 Saved FPR3
# f4 Saved FPR4
# f5 Saved FPR5
# f6 Saved FPR6
# f7 Saved FPR7
# f8 Saved FPR8
# f9 Saved FPR9
# f10 Saved FPR10
# f11 Saved FPR11
# f12 Saved FPR12
# f13 Saved FPR13
# f14 Saved FPR14
# f15 Saved FPR15
# f16 Saved FPR16
# f17 Saved FPR17
# f18 Saved FPR18
# f19 Saved FPR19
# f20 Saved FPR20
# f21 Saved FPR21
# f22 Saved FPR22
# f23 Saved FPR23
# f24 Saved FPR24
# f25 Saved FPR25
# f26 Saved FPR26
# f27 Saved FPR27
# f28 Saved FPR28
# f29 Saved FPR29
# f30 Saved FPR30
# f31 Saved FPR31
#
# r0 Saved GPR0
# r3 Saved GPR3
# r4 Saved GPR4
# r5 Saved GPR5
# r6 Saved GPR6
# r7 Saved GPR7
# r8 Saved GPR8
# 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
# CR Saved CR
# LR Saved LR
# SRR1 Saved MSR before IRQ
# SRR0 Saved PC before IRQ
# r9 Saved GPR9
# r10 Saved GPR10
# r11 Saved GPR11
# r12 Saved GPR12
# XXX Old SP DAIB/DATA uses
# (Higher Address) Stack Bottom, old SP (r1)-> XXX Old LR DAIB/DATA uses
#
# */
#
addi r9,r9,-8 # subtract 8 bytes for DIAB/DATA
# location which will be used
# by the C to ASM calling convetion
li r8,0 # clear for doing space filler
stw r8,0(r9) # store r12 zero for space only
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -