view src/nucleus/gcc/tmt.S @ 14:35f7a1dc9f7d

cdg-hybrid: import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 07:15:38 +0000
parents 4e78acac3d88
children
line wrap: on
line source

/*
 ************************************************************************
 *                                                                       
 *               Copyright Mentor Graphics Corporation 2002              
 *                         All Rights Reserved.                          
 *                                                                       
 * THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS  
 * THE PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS   
 * SUBJECT TO LICENSE TERMS.                                             
 *                                                                       
 ************************************************************************
 ************************************************************************
 *                                                                       
 * FILE NAME                              VERSION                        
 *                                                                       
 *      tmt.s                   Nucleus PLUS\ARM925\Code Composer 1.14.1 
 *                                                                       
 * COMPONENT                                                             
 *                                                                       
 *      TM - Timer Management                                            
 *                                                                       
 * DESCRIPTION                                                           
 *                                                                       
 *      This file contains the target dependent routines of the timer    
 *      management component.                                            
 *                                                                       
 * FUNCTIONS                                                             
 *                                                                       
 *      TMT_Set_Clock                       Set system clock             
 *      TMT_Retrieve_Clock                  Retrieve system clock        
 *      TMT_Read_Timer                      Read count-down timer        
 *      TMT_Enable_Timer                    Enable count-down timer      
 *      TMT_Adjust_Timer                    Adjust count-down timer      
 *      TMT_Disable_Timer                   Disable count-down timer     
 *      TMT_Retrieve_TS_Task                Retrieve time-sliced task ptr
 *      TMT_Timer_Interrupt                 Process timer interrupt      
 *                                                                       
 * DEPENDENCIES                                                          
 *                                                                       
 *      tc_extr.h                           Thread Control functions     
 *      tm_extr.h                           Timer functions              
 *                                                                       
 * HISTORY                                                               
 *                                                                       
 *         NAME            DATE                    REMARKS               
 *                                                                       
 *      B. Ronquillo     08-28-2002           Released version 1.14.1     
 *                                                                       
 *                                                                       
 ************************************************************************
 */

#define         NU_SOURCE_FILE

/*
 ******************************
 * INCLUDE ASSEMBLY CONSTANTS *
 ******************************
 * Define constants used in low-level initialization.
 */

#include "asm_defs.h"

	.code 32

    .text

/*
 **********************************
 * LOCAL VARIABLE DECLARATIONS    *
 **********************************
 * Define various data structure pointers so their addresses 
 * can be obtained in a PC-relative manner.
 */

System_Clock:
        .word     TMD_System_Clock

Timer:
        .word     TMD_Timer

Timer_State:
        .word     TMD_Timer_State

Slice_State:
        .word     TMD_Time_Slice_State

Time_Slice:
        .word     TMD_Time_Slice

Current_Thread:
        .word     TCD_Current_Thread

Slice_Task:
        .word     TMD_Time_Slice_Task

HISR:
        .word     TMD_HISR

Int_Level:
        .word     TCD_Interrupt_Level

/*
 ************************************************************************
 *                                                                       
 * FUNCTION                                                              
 *                                                                       
 *      TMT_Set_Clock                                                    
 *                                                                       
 * DESCRIPTION                                                           
 *                                                                       
 *      This function sets the system clock to the specified value.      
 *                                                                       
 * CALLED BY                                                             
 *                                                                       
 *      Application                                                      
 *                                                                       
 * CALLS                                                                 
 *                                                                       
 *      None                                                             
 *                                                                       
 * INPUTS                                                                
 *                                                                       
 *      new_value                           New value for the clock      
 *                                                                       
 * OUTPUTS                                                               
 *                                                                       
 *      None                                                             
 *                                                                       
 * HISTORY                                                               
 *                                                                       
 *         NAME            DATE                    REMARKS               
 *                                                                       
 *      W. Lamie        02-15-1994      Created initial version 1.0      
 *      D. Lamie        02-15-1994      Verified version 1.0             
 *                                                                       
 ************************************************************************
 */

@VOID  TMT_Set_Clock(UNSIGNED new_value)
@{

	.globl  TMT_Set_Clock
TMT_Set_Clock:

@ Set the system clock to the specified value.
@    TMD_System_Clock =  new_value;

        LDR     r1,System_Clock             @ Build address of system clock
        STR     r0,[r1,#0]                  @ Store new system clock value

        BX      r14                         @ Return to caller

@}

/*
 ************************************************************************
 *                                                                       
 * FUNCTION                                                              
 *                                                                       
 *      TMT_Retrieve_Clock                                               
 *                                                                       
 * DESCRIPTION                                                           
 *                                                                       
 *      This function returns the current value of the system clock.     
 *                                                                       
 * CALLED BY                                                             
 *                                                                       
 *      Application                                                      
 *                                                                       
 * CALLS                                                                 
 *                                                                       
 *      None                                                             
 *                                                                       
 * INPUTS                                                                
 *                                                                       
 *      None                                                             
 *                                                                       
 * OUTPUTS                                                               
 *                                                                       
 *      TMD_System_Clock                    Value of system clock        
 *                                                                       
 * HISTORY                                                               
 *                                                                       
 *         NAME            DATE                    REMARKS               
 *                                                                       
 *      W. Lamie        02-15-1994      Created initial version 1.0      
 *      D. Lamie        02-15-1994      Verified version 1.0             
 *                                                                       
 ************************************************************************
 */

@UNSIGNED  TMT_Retrieve_Clock(void)
@{

	.globl  TMT_Retrieve_Clock
TMT_Retrieve_Clock:

@ Return the current value of the system clock.
@    return(TMD_System_Clock);

        LDR     r0,System_Clock             @ Build address to system clock
        LDR     r0,[r0,#0]                  @ Pickup system clock contents

        BX      r14                         @ Return to caller

@}

/*
 ************************************************************************
 *                                                                       
 * FUNCTION                                                              
 *                                                                       
 *      TMT_Read_Timer                                                   
 *                                                                       
 * DESCRIPTION                                                           
 *                                                                       
 *      This function returns the current value of the count-down timer. 
 *                                                                       
 * CALLED BY                                                             
 *                                                                       
 *      TMC_Start_Timer                     Start timer function         
 *                                                                       
 * CALLS                                                                 
 *                                                                       
 *      None                                                             
 *                                                                       
 * INPUTS                                                                
 *                                                                       
 *      None                                                             
 *                                                                       
 * OUTPUTS                                                               
 *                                                                       
 *      TMD_Timer                           Value of count-down timer    
 *                                                                       
 * HISTORY                                                               
 *                                                                       
 *         NAME            DATE                    REMARKS               
 *                                                                       
 *      W. Lamie        02-15-1994      Created initial version 1.0      
 *      D. Lamie        02-15-1994      Verified version 1.0             
 *                                                                       
 ************************************************************************
 */

@UNSIGNED  TMT_Read_Timer(void)
@{

	.globl  TMT_Read_Timer
TMT_Read_Timer:

@ Return the current value of the count-down timer.
@    return(TMD_Timer);

        LDR     r0,Timer                    @ Build address to timer
        LDR     r0,[r0,#0]                  @ Pickup timer contents

        BX      r14                         @ Return to caller

@}

/*
 ************************************************************************
 *                                                                       
 * FUNCTION                                                              
 *                                                                       
 *      TMT_Enable_Timer                                                 
 *                                                                       
 * DESCRIPTION                                                           
 *                                                                       
 *      This function enables the count-down timer with the specified    
 *      value.                                                           
 *                                                                       
 * CALLED BY                                                             
 *                                                                       
 *      TMC_Start_Timer                     Start timer function         
 *      TMC_Timer_Task                      Timer expiration task        
 *                                                                       
 * CALLS                                                                 
 *                                                                       
 *      None                                                             
 *                                                                       
 * INPUTS                                                                
 *                                                                       
 *      time                                New count-down time          
 *                                                                       
 * OUTPUTS                                                               
 *                                                                       
 *      None                                                             
 *                                                                       
 * HISTORY                                                               
 *                                                                       
 *         NAME            DATE                    REMARKS               
 *                                                                       
 *      W. Lamie        02-15-1994      Created initial version 1.0      
 *      D. Lamie        02-15-1994      Verified version 1.0             
 *                                                                       
 ************************************************************************
 */

@VOID  TMT_Enable_Timer(UNSIGNED time)
@{

	.globl  TMT_Enable_Timer
TMT_Enable_Timer:

@ Place the new time value into the count-down timer.
@    TMD_Timer =  time;

        LDR     r1,Timer                    @ Build address of timer
        STR     r0,[r1,#0]                  @ Store new timer value

@ Indicate that the timer is active.
@    TMD_Timer_State =  TM_ACTIVE;

        MOV     r0,#0                       @ Build TM_ACTIVE value
        LDR     r1,Timer_State              @ Build address of timer state var
        STR     r0,[r1,#0]                  @ Change the state to active

        BX      r14                         @ Return to caller

@}

/*
 ************************************************************************
 *                                                                       
 * FUNCTION                                                              
 *                                                                       
 *      TMT_Adjust_Timer                                                 
 *                                                                       
 * DESCRIPTION                                                           
 *                                                                       
 *      This function adjusts the count-down timer with the specified    
 *      value, if the new value is less than the current.                
 *                                                                       
 * CALLED BY                                                             
 *                                                                       
 *      None                                                             
 *                                                                       
 * CALLS                                                                 
 *                                                                       
 *      None                                                             
 *                                                                       
 * INPUTS                                                                
 *                                                                       
 *      time                                New count-down time.         
 *                                                                       
 * OUTPUTS                                                               
 *                                                                       
 *      None                                                             
 *                                                                       
 * HISTORY                                                               
 *                                                                       
 *         NAME            DATE                    REMARKS               
 *                                                                       
 *      C. Meredith     03-01-1994      Created initial version 1.1      
 *      D. Lamie        03-18-1994      Verified version 1.1             
 *      C. Meredith     08-27-1994      Corrected bug in new timer       
 *                                        adjust routine, resulting in   
 *                                        version 1.1a                   
 *      W. Lamie        08-27-1994      Verified version 1.1a            
 *                                                                       
 ************************************************************************
 */

@VOID  TMT_Adjust_Timer(UNSIGNED time)
@{

	.globl  TMT_Adjust_Timer
TMT_Adjust_Timer:

@ Lockout all interrupts
@    TMD_Timer_State =  TM_NOT_ACTIVE;

        MRS     r3,CPSR                     @ Pickup current CPSR
        ORR     r2,r3,#LOCKOUT              @ Build lockout CPSR
        MSR     CPSR,r2                     @ Setup new CPSR interrupt bits

@ Check for the new value is less than the current time value
@    if (time < TMD_Timer)

        LDR     r1,Timer                    @ Build address to timer var
        LDR     r2,[r1,#0]                  @ read value of the timer
        CMP     r2,r0                       @ Do Timer - time > 0, means
        BLT     TMT_No_Adjust               @ time < Timer.

@        Adjust the time 
@        TMD_Timer = time;

        STR     r0,[r1,#0]                  @ load passed in timer value

@ Return to caller after restoring interrupts

TMT_No_Adjust:

        MSR     CPSR,r3                     @ Setup new CPSR enable bits

        BX      r14                         @ Return to caller
@}

/*
 ************************************************************************
 *                                                                       
 * FUNCTION                                                              
 *                                                                       
 *      TMT_Disable_Timer                                                
 *                                                                       
 * DESCRIPTION                                                           
 *                                                                       
 *      This function disables the count-down timer.                     
 *                                                                       
 * CALLED BY                                                             
 *                                                                       
 *      TMC_Start_Timer                     Start timer function         
 *      TMC_Timer_Task                      Timer expiration task        
 *                                                                       
 * CALLS                                                                 
 *                                                                       
 *      None                                                             
 *                                                                       
 * INPUTS                                                                
 *                                                                       
 *      None                                                             
 *                                                                       
 * OUTPUTS                                                               
 *                                                                       
 *      None                                                             
 *                                                                       
 * HISTORY                                                               
 *                                                                       
 *         NAME            DATE                    REMARKS               
 *                                                                       
 *      W. Lamie        02-15-1994      Created initial version 1.0      
 *      D. Lamie        02-15-1994      Verified version 1.0             
 *                                                                       
 ************************************************************************
 */

@VOID  TMT_Disable_Timer(void)
@{

	.globl  TMT_Disable_Timer
TMT_Disable_Timer:

@ Disable the count-down timer.
@    TMD_Timer_State =  TM_NOT_ACTIVE;

        MOV     r1,#1                       @ Build TM_NOT_ACTIVE value
        LDR     r0,Timer_State              @ Build address to timer state var
        STR     r1,[r0,#0]                  @ Change timer state to not active

        BX      r14                         @ Return to caller
@}

/*
 ************************************************************************
 *                                                                       
 * FUNCTION                                                              
 *                                                                       
 *      TMT_Retreive_TS_Timer                                            
 *                                                                       
 * DESCRIPTION                                                           
 *                                                                       
 *      This function returns the time-sliced task pointer.              
 *                                                                       
 * CALLED BY                                                             
 *                                                                       
 *      TMC_Timer_HISR                      Timer HISR                   
 *                                                                       
 * CALLS                                                                 
 *                                                                       
 *      None                                                             
 *                                                                       
 * INPUTS                                                                
 *                                                                       
 *      None                                                             
 *                                                                       
 * OUTPUTS                                                               
 *                                                                       
 *      TMD_Time_Slice_Task                 Time sliced task pointer     
 *                                                                       
 * HISTORY                                                               
 *                                                                       
 *         NAME            DATE                    REMARKS               
 *                                                                       
 *      C. Meredith     03-01-1994      Created initial version 1.1      
 *      D. Lamie        03-18-1994      Verified version 1.1             
 *                                                                       
 ************************************************************************
 */

@NU_TASK TMT_Retrieve_TS_Task (VOID)
@{

	.globl  TMT_Retrieve_TS_Task
TMT_Retrieve_TS_Task:

@ Read the current TMD_Time_Slice_Task variable and load for
@ return to caller.

        LDR     r1,Slice_Task                @ Build address to timer slice var
        LDR     r0,[r1,#0]                   @ Get task pointer to be returned

@ Return to caller time slice value back to caller

        BX      r14                          @ Return to caller

@}

/*
 ************************************************************************
 *                                                                       
 * FUNCTION                                                              
 *                                                                       
 *      TMT_Timer_Interrupt                                              
 *                                                                       
 * DESCRIPTION                                                           
 *                                                                       
 *      This function processes the actual hardware interrupt.           
 *      Processing includes updating the system clock and the count-     
 *      down timer and the time-slice timer.  If one or both of the      
 *      timers expire, the timer HISR is activated.                      
 *                                                                       
 * CALLED BY                                                             
 *                                                                       
 *      Interrupt Vector                                                 
 *                                                                       
 * CALLS                                                                 
 *                                                                       
 *      TCT_Activate_HISR                   Activate timer HISR          
 *      TCT_Interrupt_Context_Save          Save interrupted context     
 *      TCT_Interrupt_Context_Restore       Restore interrupted context  
 *                                                                       
 * INPUTS                                                                
 *                                                                       
 *      None                                                             
 *                                                                       
 * OUTPUTS                                                               
 *                                                                       
 *      None                                                             
 *                                                                       
 * HISTORY                                                               
 *                                                                       
 *         NAME            DATE                    REMARKS               
 *                                                                       
 *      W. Lamie        02-15-1994      Created initial version 1.0      
 *      D. Lamie        02-15-1994      Verified version 1.0             
 *                                                                       
 ************************************************************************
 */

@VOID  TMT_Timer_Interrupt(void)
@{
	.globl	TMT_Timer_Interrupt
TMT_Timer_Interrupt:

        MRS     r1,CPSR                         @ Pickup current CPSR
        ORR     r1,r1,#LOCKOUT                  @ Set the interrupt lockout bits
        MSR     CPSR,r1                         @ Lockout interrupts

@ Increment the system clock.
@    TMD_System_Clock++;

        LDR     r0,System_Clock                 @ Pickup system clock address
        LDR     r1,[r0,#0]                      @ Pickup system clock contents
        ADD     r1,r1,#1                        @ Increment system clock
        STR     r1,[r0,#0]                      @ Store new system clock value

@ Determine if the count-down timer is active.
@    if (TMD_Timer_State == TM_ACTIVE)
@    {

        LDR     r1,Timer_State                  @ Build address to timer state flag
        LDR     r0,[r1,#0]                      @ Pickup timer state
        MOV     r3,#2                           @ Build expired value
        CMP     r0,#0                           @ Is there a timer active?
        BNE     TMT_No_Timer_Active             @ No, skip timer processing

@ Decrement the count-down timer.
@        TMD_Timer--;

        LDR     r0,Timer                        @ Build timer address
        LDR     r2,[r0,#0]                      @ Pickup the current timer value

@ Test if the Timer is at 0 and if so skip the decrement 
        cmp     r2,#1
        beq     EXPIRED

        SUBS    r2,r2,#1                        @ Decrement the timer value
        STR     r2,[r0,#0]                      @ Store the new timer value

        bne     TMT_No_Timer_Active             @ Skip over the Set Timer State

@ Determine if the timer has expired. If so, modify the state 
@ to indicate that it has expired.
@        if (TMD_Timer == 0)

@            TMD_Timer_State =  TM_EXPIRED;

EXPIRED:
        STREQ   r3,[r1,#0]                      @ Change the timer state to 
                                                @ expired

@    }
TMT_No_Timer_Active:

@ Determine if the time-slice timer is active.  Note that the parameters
@ for the time-slice are controlled by the Thread Control (TC) 
@ component.
@    if (TMD_Time_Slice_State == TM_ACTIVE)
@    {
        LDR     r0,Slice_State                  @ Build time slice state address
        LDR     r2,[r0,#0]                      @ Pickup time slice state
        CMP     r2,#0                           @ Is there a time slice active?
        BNE     TMT_No_Time_Slice_Active        @ No, skip time slice processing

@ Decrement the time slice counter.
@        TMD_Time_Slice--;

        LDR     r2,Time_Slice                   @ Build time slice address
        LDR     r3,[r2,#0]                      @ Pickup the time slice value
        SUBS    r3,r3,#1                        @ Decrement the time slice
        STR     r3,[r2,#0]                      @ Store the new time slice value

        @ Determine if the time-slice timer has expired. If so, modify the
        @ time-slice state to indicate that it has.
@        if (TMD_Time_Slice == 0)
@        {

        BNE     TMT_No_Time_Slice_Active        @ Has time slice expired?

@            TMD_Time_Slice_State =  TM_EXPIRED;

        MOV     r3,#2                           @ Build TM_EXPIRED value
        STR     r3,[r0,#0]                      @ Indicate time slice is expired

        @ Copy the current thread into the time-slice task pointer.
@            TMD_Time_Slice_Task =  TCD_Current_Thread;

        LDR     r2,Current_Thread               @ Pickup current thread pointer adr
        LDR     r2,[r2,#0]                      @ Pickup current thread pointer
        LDR     r3,Slice_Task                   @ Pickup time slice task pointer ad
        STR     r2,[r3,#0]                      @ Store current thread pointer

@            ((TC_TCB *) TCD_Current_Thread) -> tc_cur_time_slice =  1;

        MOV     r3,#1                           @ For safety, place a minimal time-
        STR     a4,[a3,#0x20]!                  @ slice into the task's control
                                                @ block

@        }
@    }
TMT_No_Time_Slice_Active:

    @ Determine if either of the basic timers have expired.  If so, 
    @ activate the timer HISR.
@    if ((TMD_Timer_State == TM_EXPIRED) ||
@        (TMD_Time_Slice_State == TM_EXPIRED))
@    {

        LDR     r1,[r1,#0]                      @ Pickup timer state 
        CMP     r1,#2                           @ Does it indicate expiration?
        LDRNE   r0,[r0,#0]                      @ Pickup time slice state
        CMPNE   r0,#2                           @ Does it indicate expiration?
         
        BXNE    r14                             @ Return if no expiration

        @ Activate the HISR timer function.
@        TCT_Activate_HISR(&TMD_HISR);

        STR     r14,[r13, #-4]!                 @ Save r14 on the stack
        LDR     r0,HISR                         @ Build address of timer HISR
        BL      TCT_Activate_HISR               @ Activate timer HISR
        LDR     r14,[r13], #4                   @ Recover return address
@    }

        BX      r14                             @ Return to caller

@}