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 + -
显示快捷键?