⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tct.s

📁 文件内包含了nuclues的内核代码和针对Power PC的编译器。需要用VirtNet生成一个虚拟网卡才可使用
💻 S
📖 第 1 页 / 共 5 页
字号:
#/*      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 + -