📄 debug.s
字号:
;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;
;
; Module: SUB_debug
;
; Initial version:Jinshi Huang 5/7/97
;
; Calling : none
; Called by: none
; Return: ret
; Param in:
; Temp reg:
; AGR reg:
; Local buffer:
;************************************************************************
.nolist
#include "regdef.h"
#include "debug.h"
.list
.data
.globl SUB_DSP_DEBUGGER
.globl dbg_last_inst
SUB_DSP_DEBUGGER:
#ifdef DEBUGGER
movi DcacheBase,DBG_SEG
//-----------------------------------------------------------------------
// dump registers to DRAM
//-----------------------------------------------------------------------
dsw r0, DB_GPR0
mov r0, TrapReg
dsw r0, DB_TRAP // save TrapReg at 0x1eed00
rlwi r0, DSP_INT_CTRL
dsw r0, INT_CTRL_TEMP // save Reg274
li r0, 0x38000000
rswi r0, DSP_INT_CTRL // reset Reg274
dsw r1, DB_GPR1
dsw r2, DB_GPR2
dsw r3, DB_GPR3
dsw r4, DB_GPR4
dsw r5, DB_GPR5
dsw r6, DB_GPR6
dsw r7, DB_GPR7
dsw r8, DB_GPR8
dsw r9, DB_GPR9
dsw r10, DB_GPR10
dsw r11, DB_GPR11
dsw r12, DB_GPR12
dsw r13, DB_GPR13
dsw r14, DB_GPR14
dsw r15, DB_GPR15
dsw r16, DB_GPR16
dsw r17, DB_GPR17
dsw r18, DB_GPR18
dsw r19, DB_GPR19
dsw r20, DB_GPR20
dsw r21, DB_GPR21
dsw r22, DB_GPR22
dsw r23, DB_GPR23
dsw r24, DB_GPR24
dsw r25, DB_GPR25
dsw r26, DB_GPR26
dsw r27, DB_GPR27
dsw r28, DB_GPR28
dsw r29, DB_GPR29
dsw r30, DB_GPR30
dsw r31, DB_GPR31
//--------------------------------------------------------------------
// DUMP AGR REGISTERS
//--------------------------------------------------------------------
// copy to general registers first
mov r0, AGRAdr0
mov r1, AGRAdr1
mov r2, AGRAdr2
mov r3, AGRAdr3
mov r4, AGRAdr4
mov r5, AGRAdr5
mov r6, AGRAdr6
mov r7, AGRAdr7
mov r8, AGRMod0
mov r9, AGRMod1
mov r10, AGRMod2
mov r11, AGRMod3
mov r12, AGRMod4
mov r13, AGRMod5
mov r14, AGRMod6
mov r15, AGRMod7
mov r16, AGRSiz0
mov r17, AGRSiz1
mov r18, AGRSiz2
mov r19, AGRSiz3
mov r20, AGRSiz4
mov r21, AGRSiz5
mov r22, AGRSiz6
mov r23, AGRSiz7
mov r24, AGRInc0
mov r25, AGRInc1
mov r26, AGRInc2
mov r27, AGRInc3
mov r28, AGRInc4
mov r29, AGRInc5
mov r30, AGRInc6
mov r31, AGRInc7
// then dump these registers
dsw r0, DB_AGRADR0
dsw r1, DB_AGRADR1
dsw r2, DB_AGRADR2
dsw r3, DB_AGRADR3
dsw r4, DB_AGRADR4
dsw r5, DB_AGRADR5
dsw r6, DB_AGRADR6
dsw r7, DB_AGRADR7
dsw r8, DB_AGRMOD0
dsw r9, DB_AGRMOD1
dsw r10, DB_AGRMOD2
dsw r11, DB_AGRMOD3
dsw r12, DB_AGRMOD4
dsw r13, DB_AGRMOD5
dsw r14, DB_AGRMOD6
dsw r15, DB_AGRMOD7
dsw r16, DB_AGRSIZ0
dsw r17, DB_AGRSIZ1
dsw r18, DB_AGRSIZ2
dsw r19, DB_AGRSIZ3
dsw r20, DB_AGRSIZ4
dsw r21, DB_AGRSIZ5
dsw r22, DB_AGRSIZ6
dsw r23, DB_AGRSIZ7
dsw r24, DB_AGRINC0
dsw r25, DB_AGRINC1
dsw r26, DB_AGRINC2
dsw r27, DB_AGRINC3
dsw r28, DB_AGRINC4
dsw r29, DB_AGRINC5
dsw r30, DB_AGRINC6
dsw r31, DB_AGRINC7
//------------------------------------------------------------------
// other registers
//------------------------------------------------------------------
// The following internal registers won't be restored when exit this routine
mov r0,Gb_Getbits_Ptr
mov r1,Gb_Shadow_Ptr
mov r2,Gb_Control
mov r3,Gb_RdWrPtr
mov r4,Gb_Prev_LocalData
mov r5,Gb_dma_addr
// mov r6,LoopCount
dsw r0,DB_Gb_Getbits_Ptr
dsw r1,DB_Gb_Shadow_Ptr
dsw r2,DB_Gb_Control
dsw r3,DB_Gb_RdWrPtr
dsw r4,DB_Gb_Prev_LocalData
dsw r5,DB_Gb_dma_addr
// dsw r6,DB_LoopCount
// The following internal registers will be restored when exit this routine
dlw r1, DB_TRAP // TrapReg value at 0x1eed00
mov r0, StatusReg
dsw r0, DB_STATUS
mov r0, IcacheSegment
dsw r0, DB_IcacheSegment
movi TrapReg, 0 // disable all Trap and Interrupts
andi r1,0x700 // mask trap code
//------------------------------------------------------------------
//wait until host says "c"
//------------------------------------------------------------------
la r0, dbg_last_inst
andi r0, 0xffff
dsw r0, RETURN_OFFSET
tsti r1, TRAP_CODE_INT_TRAP
movi r0, 0x8642
beq save_debug_flag
tsti r1, TRAP_CODE_EXT_TRAP
movi r0, 0x9753
beq save_debug_flag
tsti r1, TRAP_CODE_EXT_INTRP
movi r0, 0xa864
beq save_debug_flag
movi r0, 0x2468 // flag for break point
save_debug_flag:
dsw r0, DB_FLAG
dsw r0, DB_FLAG_T
// nop
wait_debug_flag:
dlw r0, DB_FLAG
nop
tsti r0, 0x4321 // local buffer modify flag
bne check_flag_continue
dlw r0,BREAK_S_ADDR
dlw r2,BREAK_E_ADDR
mov AGRAdr0,r0
movi AGRSiz0,0xffff
movi AGRMod0,0
dlw r3,BREAK_M_DATA
nop
modify_local_buffer:
addi r0,4
mov a0(4),r3
tst r0,r2
blt modify_local_buffer // loop until r0 reaches BREAK_E_ADDR
li r1, 0x0
dsw r1, DB_FLAG
nop
j wait_debug_flag
check_flag_continue:
tsti r0, 0x1234 // continue flag
bne wait_debug_flag
//--------------------------------------------------------------------
// RESTORE AGR REGISTERS
//--------------------------------------------------------------------
// load AGR registers to general registers first
dlw r0, DB_AGRADR0
dlw r1, DB_AGRADR1
dlw r2, DB_AGRADR2
dlw r3, DB_AGRADR3
dlw r4, DB_AGRADR4
dlw r5, DB_AGRADR5
dlw r6, DB_AGRADR6
dlw r7, DB_AGRADR7
dlw r8, DB_AGRMOD0
dlw r9, DB_AGRMOD1
dlw r10, DB_AGRMOD2
dlw r11, DB_AGRMOD3
dlw r12, DB_AGRMOD4
dlw r13, DB_AGRMOD5
dlw r14, DB_AGRMOD6
dlw r15, DB_AGRMOD7
dlw r16, DB_AGRSIZ0
dlw r17, DB_AGRSIZ1
dlw r18, DB_AGRSIZ2
dlw r19, DB_AGRSIZ3
dlw r20, DB_AGRSIZ4
dlw r21, DB_AGRSIZ5
dlw r22, DB_AGRSIZ6
dlw r23, DB_AGRSIZ7
dlw r24, DB_AGRINC0
dlw r25, DB_AGRINC1
dlw r26, DB_AGRINC2
dlw r27, DB_AGRINC3
dlw r28, DB_AGRINC4
dlw r29, DB_AGRINC5
dlw r30, DB_AGRINC6
dlw r31, DB_AGRINC7
// restore to AGR registers
mov AGRAdr0, r0
mov AGRAdr1, r1
mov AGRAdr2, r2
mov AGRAdr3, r3
mov AGRAdr4, r4
mov AGRAdr5, r5
mov AGRAdr6, r6
mov AGRAdr7, r7
mov AGRMod0, r8
mov AGRMod1, r9
mov AGRMod2, r10
mov AGRMod3, r11
mov AGRMod4, r12
mov AGRMod5, r13
mov AGRMod6, r14
mov AGRMod7, r15
mov AGRSiz0, r16
mov AGRSiz1, r17
mov AGRSiz2, r18
mov AGRSiz3, r19
mov AGRSiz4, r20
mov AGRSiz5, r21
mov AGRSiz6, r22
mov AGRSiz7, r23
mov AGRInc0, r24
mov AGRInc1, r25
mov AGRInc2, r26
mov AGRInc3, r27
mov AGRInc4, r28
mov AGRInc5, r29
mov AGRInc6, r30
mov AGRInc7, r31
// restore general registers
dlw r2, DB_GPR2
dlw r3, DB_GPR3
dlw r4, DB_GPR4
dlw r5, DB_GPR5
dlw r6, DB_GPR6
dlw r7, DB_GPR7
dlw r8, DB_GPR8
dlw r9, DB_GPR9
dlw r10, DB_GPR10
dlw r11, DB_GPR11
dlw r12, DB_GPR12
dlw r13, DB_GPR13
dlw r14, DB_GPR14
dlw r15, DB_GPR15
dlw r16, DB_GPR16
dlw r17, DB_GPR17
dlw r18, DB_GPR18
dlw r19, DB_GPR19
dlw r20, DB_GPR20
dlw r21, DB_GPR21
dlw r22, DB_GPR22
dlw r23, DB_GPR23
dlw r24, DB_GPR24
dlw r25, DB_GPR25
dlw r26, DB_GPR26
dlw r27, DB_GPR27
dlw r28, DB_GPR28
dlw r29, DB_GPR29
dlw r30, DB_GPR30
dlw r31, DB_GPR31
nop
movi r0, 0
dsw r0, DB_FLAG // clear flag
dlw r0, DB_FLAG_T // load flag
dlw r1, BREAK_I_INST // instruction
tsti r0, 0x2468 // test break point flag
bne inc_r30_done // branch if not break point
addi r30,4 // execute the inst next to bp
// when return
inc_r30_done:
la r0, dbg_last_inst
movi DcacheBase,MEM_SEG
dswr r1, r0 ; restore instruction
movi DcacheBase,DBG_SEG
dlw r0, DB_IcacheSegment
nop
mov IcacheSegment, r0; to flush I cache
nop
nop
nop
//------------------------------------------------------------------
// other registers
//------------------------------------------------------------------
dlw r0, DB_TRAP
nop
andi r0,0x3f // clear all status bits
ori r0,TRAPREGINIT
mov TrapReg, r0
dlw r0, DB_STATUS
movi r1, 0x2000
mov StatusReg, r0
rswi r1, DSP_INT_CLEAR
dlw r0, INT_CTRL_TEMP // save Reg274
nop
rswi r0, DSP_INT_CTRL // restore Reg274
// restore general registers
dlw r0, DB_GPR0
dlw r1, DB_GPR1
movi DcacheBase,MEM_SEG
#ifdef QT_SYNC
movw r20, LWTempR20
movw r21, LWTempR21
movw r22, LWTempR22
movw r23, LWTempR23
movw r24, LWTempR24
movw r25, LWTempR25
#endif // QT_SYNC
dbg_last_inst:
nop // When host executes command 'Continue', this instruction
// will be replaced with the original instruction at
// the breakpoint. Displacement in branch instructions will be
// taken into account by host.
nop
nop
nop
nop
#endif //DEBUGGER
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -