profisr.s

来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· S 代码 · 共 238 行

S
238
字号
//------------------------------------------------------------------------------
//
//  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
//  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
//  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
//  PARTICULAR PURPOSE.
//  Copyright (c) 1995-2000 Microsoft Corporation.  All rights reserved.
//  
//------------------------------------------------------------------------------
#include "kxmips.h"
#include "nkintr.h"
#include "bldver.h"
#ifdef R3912
#include "cmtthal.h"
#include "R3912.h"
#include "poseidon.h"
#endif

    .data
    .globl  ReschedCount
    .globl  ReschedCountMax
        
_ProfBase:      .space 0xff8 // reserve 4k for a stack for the profiler ISR
_ProfStack:     .space 0x008

ReschedCount: .space 4
ReschedCountMax: .space 4
Save_t: .space  4*27
#ifdef R4000
#define PROFILE_INTERVAL    15000
#include "..\..\..\hal\mips\timer.h"
#endif
#ifdef R3912
#endif

    .text
LEAF_ENTRY(ProfileTimerStart)
    .set noreorder
#ifdef R3912
    la  t0, ReschedCount                // zero resched counter
    li  t1, 25
    sw  t1, 0(t0)
    li  t0, R3912_SYSTEM_ASIC_REGS_BASE
    sh  a0, OFF_PERIODIC_TIMER(t0)
    j   ra
    move v0,zero
#endif
#ifdef R4000
    mfc0    t0, count                   // read count register
    nop
    nop
    addiu   t0, PROFILE_INTERVAL        // t0= profile interval
    mtc0    t0, compare                 // save in compare register
    j   ra
    move    v0,zero
#endif
    .end

LEAF_ENTRY(ProfileTimerStop)
    .set noreorder
#ifdef R3912
    li  t0, R3912_SYSTEM_ASIC_REGS_BASE
    li  t6, 0x3840          // per 25 msec (See. CPURTCSHORT_PERIOD)
                        // 0x7081 = 25msec/0.868(usec)
    sh  t6, OFF_PERIODIC_TIMER(t0)
#endif
#ifdef R4100
    mfc0    t0, count                   // read count register
    nop
    nop
    addi    t0,t0,-1
    mtc0    t0, compare                 // save in compare register
#endif
#if defined(R4300) || defined(IDT32364)
    mfc0    t0, count                   // read count register
    nop
    nop
    li  t1, PERIOD_INC
    addu    t0, t0, t1      // place relative greater value 
    mtc0    t0, compare                 // save in compare register
#endif  
    j   ra
    move    v0,zero
    .end

LEAF_ENTRY(ProfileInterrupt)
    .set noreorder
        
    la  v0, Save_t      // save temps
    sw  t0, 0(v0)
    sw  t1, 4(v0)
    sw  t2, 8(v0)
    sw  t3,12(v0)
    sw  t4,16(v0)
    sw  t5,20(v0)
    sw  t6,24(v0)
    sw  t7,28(v0)
    sw  a0,32(v0)
    sw  a1,36(v0)
    sw  a2,40(v0)
    sw  a3,44(v0)
    sw  ra,48(v0)
    sw  t8,52(v0)
    sw  t9,56(v0)
    sw  v1,60(v0)
    sw  sp,64(v0)

    la  sp, _ProfStack
    
#ifdef R3912
    .set noat
        li      a0, R3912_SYSTEM_ASIC_REGS_BASE
        lw      a1, OFF_INTR_STATUS5(a0)
        lw      a2, OFF_INTR_ENABLE5(a0)
        and     a1, a1, a2
        
        //
        // A1 = Pending, enabled interrupts
        //                                                
        and     AT, a1, kIntPeriodicTimerMask
        beq     zero, AT, 11f                   // Periodic interrupt?
        nop

        li      a2, kIntPeriodicTimerMask
        sw      a2, OFF_INTR_CLEAR5(a0)
        
    la  a0, ReschedCount
    lw  a1,0(a0)
    addi a1,a1,-1
    bne     a1,zero,12f
    sw      a1,0(a0)
    la      a1, ReschedCountMax
    lw      a1,0(a1)
    sw      a1,0(a0)
    //------------------------------------------------------
    //
    //      System Timer Tick (SYSINTR_RESCHED)
    //
    //------------------------------------------------------
        
    // Increment the kernel counters
#if (CE_MAJOR_VER == 0x0003)
    // (cedar)
    lw      a2, AddrCurMSec
    lw      a3, AddrDiffMSec
    addu    a2, CPURTCSHORT_PERIOD
    addu    a3, CPURTCSHORT_PERIOD
    sw      a2, AddrCurMSec
    sw      a3, AddrDiffMSec

#else
    // (dougfir or later)
    lw      a2, AddrCurMSec
    addu    a2, CPURTCSHORT_PERIOD
    sw      a2, AddrCurMSec
#endif
    li      v0, SYSINTR_RESCHED
    j       ra
    nop

11: la      a0, P2ISR
    j       a0
    nop
12:
#endif
    nop
    mfc0    a0,epc          // a0= saved program counter
    nop
    nop
    nop
    nop
        
    jal ProfilerHit 
    nop

#ifdef R4000
    mfc0    a2, count       // count register=0
    nop
    nop
    nop
    addiu   a2, PROFILE_INTERVAL    // a2= profile 500 usec interval
    mtc0    a2, compare     // save in compare register
#endif

#if defined(R4300) || defined(IDT32364)
    la  t0, ReschedCount
    lw  t1,0(t0)
    addi    t1,t1,-1
    sw  t1,0(t0)
    bne t1,zero,pisr_nop
    nop
        li  t1,100
    sw  t1,0(t0)
    
    lw      a2, AddrCurMSec
#if (CE_MAJOR_VER == 0x0003)
    li      a3, CPURTCSHORT_PERIOD
    addiu   a2, a2, CPURTCSHORT_PERIOD

    sw      a2, AddrCurMSec     // +25 mSec
    sw      a3, AddrDiffMSec    // 25 mSec
#else
    addiu   a2, a2, CPURTCSHORT_PERIOD
    sw      a2, AddrCurMSec     // +25 mSec
#endif 
    li  v0, SYSINTR_RESCHED
    beq zero,zero,pisr_end
    nop
pisr_nop:
    lw  t0,0(v0)
    lw  t1,4(v0)
pisr_end:
#endif

    la  v0, Save_t      // restore temps
    lw  t0, 0(v0)
    lw  t1, 4(v0)
    lw  t2, 8(v0)
    lw  t3,12(v0)
    lw  t4,16(v0)
    lw  t5,20(v0)
    lw  t6,24(v0)
    lw  t7,28(v0)
    lw  a0,32(v0)
    lw  a1,36(v0)
    lw  a2,40(v0)
    lw  a3,44(v0)
    lw  ra,48(v0)
    lw  t8,52(v0)
    lw  t9,56(v0)
    lw  v1,60(v0)
    lw  sp,64(v0)

    j   ra
        move    v0,zero
    .end

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?