📄 tct.s
字号:
#/* OUTPUTS */
#/* */
#/* old_level (return in r3) Previous interrupt enable */
#/* level */
#/* */
#/* HISTORY */
#/* */
#/* NAME DATE REMARKS */
#/* */
#/* Barry Sellew 06-24-1996 Created initial version 1.0 */
#/* */
#/*************************************************************************/
#INT TCT_Local_Control_Interrupts(new_level)
#{
#
#INT old_level; #/* Old interrupt level */
.text
.align 2
TCT_Local_Control_Interrupts:
#
# /* read in the old level of the processor */
#
mfmsr r4
#
# /* lock out all the interrupts */
#
ori r11,r4,0
rlwinm r11,r11,0,17,15 # mask off MSR[EE] bit
mtmsr r11 # write current interrupt status
#
# /* set the new level passed in */
#
or r11,r11,r3 # or in the interrupt bits
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. */
#/* */
#/* AUTHOR */
#/* */
#/* Barry Sellew, Accelerated Technology, Inc. */
#/* */
#/* 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. */
#/* */
#/* AUTHOR */
#/* */
#/* Barry Sellew, Accelerated Technology, Inc. */
#/* */
#/* 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
# 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
#
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -