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

📄 wdbdbgalib.s

📁 VXWORKS源代码
💻 S
字号:
/* wdbDbgALib.s - i80x86 debugging aids assembly interface *//* Copyright 1984-2002 Wind River Systems, Inc. *//*modification history--------------------01f,30may02,hdn  added WDB_CTX_LOAD that is _wdbDbgCtxLoad() (spr 75694)01e,23aug01,hdn  added FUNC/FUNC_LABEL, replaced .align w .balign		 fixed stack adjustment bug in wdbDbgBpStub.01d,08jan98,dbt  modified for new breakpoint scheme. Added hardware		 breakpoints support01c,01jun93,hdn  updated to 5.1.		  - fixed #else and #endif		  - changed VOID to void		  - changed ASMLANGUAGE to _ASMLANGUAGE		  - changed copyright notice01b,13oct92,hdn  debugged.01a,08jul92,hdn  written based on TRON version.*//*DESCRIPTIONThis module contains assembly language routines needed for the debugpackage and the i80x86 exception vectors. .ne 24PICTURE OF STACK GROWING.CS  							 sp_5 ---------								sp_1(pointer to ESF0)							 sp_4 ---------								sp_2(pointer to REGS)							---------							0 or 1			  fp/sp_3 ---------		 ---------				     fp			 fp			     sp_2 ---------		 ---------				db0			db0				 |			  |				db7			db7				    edi			edi				     |			  |				    eax			eax  sp_1 ---------		 ---------		 ---------	 EIP			EIP			EIP	---------		 ---------		 ---------	 CS			 CS			 CS	---------		 ---------		 ---------	 EFLAGS		    EFLAGS		    EFLAGS	---------		 ---------		 ---------       fig.1		     fig.2		     fig.3.CE   SEE ALSO: dbgLib(1), "Debugging"*/#define _ASMLANGUAGE#include "vxWorks.h"#include "asm.h"#include "wdb/wdbDbgLib.h"	.data	.globl	FUNC(copyright_wind_river)	.long	FUNC(copyright_wind_river)		/* externals */	.globl	FUNC(wdbDbgPreBreakpoint) /* breakpoint processing routine */	.globl	FUNC(wdbDbgPreTrace)	/* trace processing routine */	.globl  VAR(wdbDbgCtxPc)	/* saved PC */	.globl  VAR(wdbDbgCtxCs)	/* saved CS */	.globl  VAR(wdbDbgCtxEsp)	/* saved ESP */	.globl  VAR(sysCsSuper)		/* task level CS */	/* internals */	.globl	GTEXT(wdbDbgBpStub)	/* breakpoint exceptions handler */	.globl	GTEXT(wdbDbgTraceStub)	/* trace exceptions handler */	.globl	GTEXT(wdbDbgRegsSet)	/* set Debug Registers */	.globl	GTEXT(_wdbDbgCtxLoad)	/* load the new context */	.text	.balign 16/****************************************************************************** wdbDbgBpStub - software breakpoint handling** This routine is attached to the breakpoint trap (default int $3).  It* saves the entire task context on the stack and calls wdbDbgBreakpoint () to * handle the event.** NOMANUAL*/FUNC_LABEL(wdbDbgBpStub)		/* sp_1: breakpoint trap driver */	pushal				/* sp_2: save regs */	movl	%db7,%eax	pushl	%eax	movl	%db6,%eax	pushl	%eax	movl	%db3,%eax	pushl	%eax	movl	%db2,%eax	pushl	%eax	movl	%db1,%eax	pushl	%eax	movl	%db0,%eax	pushl	%eax	movl	%esp,%eax		/*     : sp points to saved regs */	pushl	%ebp			/*     : save a frame-pointer */	movl	%esp,%ebp		/* sp_3: make a frame-pointer */	decl	SAVED_REGS+0x4(%ebp)	/*     : adjust saved program counter */	pushl	$0			/*     : push FALSE is hardware break */	pushl	%eax			/* sp_4: push pointer to saved regs */	leal	SAVED_REGS+0x4(%ebp),%eax	pushl	%eax			/* sp_5: push pointer to saved info */	call	FUNC(wdbDbgPreBreakpoint) /*     : do breakpoint handling */	/* we only return if the breakpoint was hit at interrupt level */	addl	$0x10,%esp		/* sp_2: pop the params,frame-pointer */	addl	$ SAVED_DBGREGS,%esp	/*     : pop saved debug registers */	popal				/* sp_1: restore regs */	iret/**************************************************************************** wdbDbgTraceStub - hardware breakpoint and trace exception handling** This routine is attached to the i80x86 trace exception vector.  It saves the* entire task context on the stack and calls wdbDbgTrace () to handle the event.* This handler is for any of these situations:*     (1) Single step.				Trap	BS=1*     (2) Hardware instruction breakpoint.	Falt	Bn=1*     (3) Hardware data breakpoint.		Trap	Bn=1** NOMANUAL*/	.balign 16,0x90FUNC_LABEL(wdbDbgTraceStub)		/* sp_1: trace trap driver */	andl	$0xfffffeff,0x8(%esp)	/* clear TraceFlag in saved EFLAGS */	pushal				/* sp_2: save regs */	movl	%db7,%eax	pushl	%eax	movl	%db6,%eax	pushl	%eax	movl	%db3,%eax	pushl	%eax	movl	%db2,%eax	pushl	%eax	movl	%db1,%eax	pushl	%eax	movl	%db0,%eax	pushl	%eax	movl	%esp,%eax		/*     : sp points to saved regs */	pushl	%ebp			/*     : save a frame-pointer */	movl	%esp,%ebp		/* sp_3: make a frame-pointer */	pushl	$1			/*     : push TRUE is hardware break */	pushl	%eax			/* sp_4: push pointer to saved regs */	leal	SAVED_REGS+4(%ebp),%eax	pushl	%eax			/* sp_5: push pointer to saved info */	movl	%db6,%eax		/* get DR6 debug status reg */	movl	%db6,%eax		/* get DR6 debug status reg */	xorl	%edx,%edx	movl	%edx,%db7		/* clear DR7 debug control reg */	movl	%edx,%db6		/* clear DR6 debug status reg */	movl	%edx,%db3		/* clear DR3 debug reg */	movl	%edx,%db2		/* clear DR2 debug reg */	movl	%edx,%db1		/* clear DR1 debug reg */	movl	%edx,%db0		/* clear DR0 debug reg */	btl	$14,%eax		/* is it a trace-exception ? */	jc	wdbDbgTrace0		/* if yes, jump wdbDbgTrace0 */	orl	$0x00010000,SAVED_REGS+12(%ebp) /* set ResumeFlag */	call	FUNC(wdbDbgPreBreakpoint) /* do breakpoint handling */	jmp	wdbDbgTrace1	.balign 16,0x90wdbDbgTrace0:	call	FUNC(wdbDbgPreTrace)	/* do trace handling */wdbDbgTrace1:	/* we returned from wdbDbgTrace if this was a CONTINUE or the break	 * was hit at interrupt level	 */	addl	$0x10,%esp		/* sp_2: pop the params,frame-pointer */	popl	%eax	movl	%eax,%db0	popl	%eax	movl	%eax,%db1	popl	%eax	movl	%eax,%db2	popl	%eax	movl	%eax,%db3	popl	%eax	xorl	%eax,%eax	movl	%eax,%db6		/* clear status bits in DR6 */	popl	%eax	movl	%eax,%db7	popal				/* sp_1: restore regs */	iret/**************************************************************************** wdbDbgRegsSet - set the debug registers** This routine set hardware breakpoint registers.** SEE ALSO: "i80x86 32-Bit Microprocessor User's Manual"* void wdbDbgRegsSet (pReg)*     int *pReg;		/* pointer to saved registers **/	.balign 16,0x90FUNC_LABEL(wdbDbgRegsSet)	pushl	%ebp	movl	%esp,%ebp	movl	ARG1(%ebp),%edx	movl	0(%edx),%eax	movl	%eax,%db0	movl	4(%edx),%eax	movl	%eax,%db1	movl	8(%edx),%eax	movl	%eax,%db2	movl	12(%edx),%eax	movl	%eax,%db3	movl	16(%edx),%eax	movl	%eax,%db6	movl	20(%edx),%eax	movl	%eax,%db7	leave	ret/********************************************************************************* _wdbDbgCtxLoad - Load a new context in the current task** This is just like longjmp, but every register must be loaded.* You could also look at this as half a context switch.** RETURNS: Never returns* void _wdbDbgCtxLoad*     (*     REG_SET * pRegs		/@ Context to load @/*     )*/	.balign 16,0x90FUNC_LABEL(_wdbDbgCtxLoad)	movl	SP_ARG1(%esp),%eax	movl	0x00(%eax),%edi		/* load 5 registers */	movl	0x04(%eax),%esi	movl	0x08(%eax),%ebp	movl	0x10(%eax),%ebx	movl	0x18(%eax),%ecx	cli				/* LOCK INTERRUPTS */	movl	0x0c(%eax),%esp		/* load the stack pointer */	pushl	0x20(%eax)		/* push EFLAGS */	/*	 * Restoring the previous CS(code selector) is required	 * to go back to the int-level context.  This happens	 * when we switch back to the system from the external	 * agent.  To do this, the CS should be included in the	 * REG_SET.  In the mean time, the CS in the breakpoint 	 * and trace exception stack frame is saved in the 	 * handler and restored here.  To find the right REG_SET, 	 * the saved PC(program counter) and ESP(stack pointer) 	 * are compared to ones in REG_SET beforehand.	 */	movl	0x24(%eax),%edx		/* get the PC in REG_SET */	cmpl	FUNC(wdbDbgCtxPc),%edx	/* compare the PC */	jne	wdbDbgCtxLoad0		/* jump if different */	movl	0x0c(%eax),%edx		/* get the ESP in REG_SET */	cmpl	FUNC(wdbDbgCtxEsp),%edx	/* compare the ESP */	jne	wdbDbgCtxLoad0		/* jump if different */	pushl	FUNC(wdbDbgCtxCs)	/* push the previous CS */	jmp	wdbDbgCtxLoad1wdbDbgCtxLoad0:	pushl	FUNC(sysCsSuper)	/* push the task level CS */wdbDbgCtxLoad1:	pushl	0x24(%eax)		/* push PC */	movl	0x14(%eax),%edx		/* load remaining 2 registers */	movl	0x1c(%eax),%eax	iret				/* UNLOCK INTERRUPTS */

⌨️ 快捷键说明

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