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

📄 sysalib.s

📁 VxWorks的bootloader实现
💻 S
📖 第 1 页 / 共 2 页
字号:
	isync				/* context sync req'd before tlbie */sysALoop:	tlbie	p0	addi	p0,p0,0x1000		/* increment bits 15-19 */	bdnz	sysALoop		/* decrement CTR, branch if CTR != 0 */	sync				/* sync instr req'd after tlbie      */	/* initialize Small Data Area (SDA) start address */#if	FALSE				/* XXX TPR NO SDA for now */	lis     r2, HI(_SDA2_BASE_)	addi    r2, r2, LO(_SDA2_BASE_)	lis     r13, HI(_SDA_BASE_)	addi    r13, r13, LO(_SDA_BASE_)#endif	addi	sp, sp, -FRAMEBASESZ	/* get frame stack */	li      r3, BOOT_WARM_AUTOBOOT	b	usrInit			/* never returns - starts up kernel */FUNC_END(_sysInit)/******************************************************************************* sysInByte - reads a byte from an io address.** This function reads a byte from a specified io address.** RETURNS: byte from address.* UCHAR sysInByte*     (*     UCHAR *  pAddr		/@ Virtual I/O addr to read from @/*     )*/FUNC_BEGIN(sysInByte)	eieio			/* Sync I/O operation */	sync	lbzx	p0,r0,p0	/* Read byte from I/O space */	bclr	20,0		/* Return to caller */FUNC_END(sysInByte)/******************************************************************************** sysOutByte - writes a byte to an io address.** This function writes a byte to a specified io address.** RETURNS: N/A* VOID sysOutByte*     (*     UCHAR *  pAddr,		/@ Virtual I/O addr to write to @/*     UCHAR    data		/@ data to be written @/*     )*/FUNC_BEGIN(sysOutByte)	stbx	p1,r0,p0	/* Write a byte to PCI space */	eieio			/* Sync I/O operation */	sync	bclr	20,0		/* Return to caller */FUNC_END(sysOutByte)/******************************************************************************* sysInWord - reads a word from an address, swapping the bytes.** This function reads a swapped word from a specified * address.** RETURNS:* Returns swapped 16 bit data from the specified address.* USHORT sysInWord*     (*     ULONG  address,		/@ addr to read from @/*     )*/FUNC_BEGIN(sysInWord)	eieio			/* Sync I/O operation */	sync        lhbrx   p0,r0,p0	/* Read and swap */        bclr    20,0		/* Return to caller */FUNC_END(sysInWord)/******************************************************************************* sysOutWord - writes a word to an address swapping the bytes.** This function writes a swapped word to a specified * address.** RETURNS: N/A* VOID sysOutWord*     (*     ULONG address,		/@ Virtual addr to write to @/*     UINT16  data		/@ Data to be written       @/*     )*/FUNC_BEGIN(sysOutWord)        sthbrx  p1,r0,p0	/* Write with swap to address */	eieio			/* Sync I/O operation */	sync        bclr    20,0		/* Return to caller */FUNC_END(sysOutWord)/******************************************************************************* sysInLong - reads a long from an address.** This function reads a long from a specified PCI Config Space (little-endian)* address.** RETURNS:* Returns 32 bit data from the specified register.  Note that for PCI systems* if no target responds, the data returned to the CPU will be 0xffffffff.* ULONG sysInLong*     (*     ULONG  address,		/@ Virtual addr to read from @/*     )*/FUNC_BEGIN(sysInLong)	eieio			/* Sync I/O operation */	sync        lwbrx   p0,r0,p0	/* Read and swap from address */        bclr    20,0		/* Return to caller */FUNC_END(sysInLong)/******************************************************************************** sysOutLong - write a swapped long to address.** This routine will store a 32-bit data item (input as big-endian)* into an address in little-endian mode.** RETURNS: N/A* VOID sysOutLong*     (*     ULONG   address,		/@ Virtual addr to write to @/*     ULONG   data		/@ Data to be written @/*     )*/FUNC_BEGIN(sysOutLong)        stwbrx  p1,r0,p0	/* store data as little-endian */	eieio			/* Sync I/O operation */	sync        bclr    20,0FUNC_END(sysOutLong)/******************************************************************************** sysPciRead32 - read 32 bit PCI data** This routine will read a 32-bit data item from PCI (I/O or* memory) space.** RETURNS: N/A* VOID sysPciRead32*     (*     ULONG *  pAddr,		/@ Virtual addr to read from @/*     ULONG *  pResult		/@ location to receive data @/*     )*/FUNC_BEGIN(sysPciRead32)	eieio			/* Sync I/O operation */        lwbrx   p0,r0,p0	/* get the data and swap the bytes */        stw     p0,0(p1)	/* store into address ptd. to by p1 */        bclr    20,0FUNC_END(sysPciRead32)/******************************************************************************** sysPciWrite32 - write a 32 bit data item to PCI space** This routine will store a 32-bit data item (input as big-endian)* into PCI (I/O or memory) space in little-endian mode.** RETURNS: N/A* VOID sysPciWrite32*     (*     ULONG *  pAddr,		/@ Virtual addr to write to @/*     ULONG   data		/@ Data to be written @/*     )*/FUNC_BEGIN(sysPciWrite32)        stwbrx  p1,r0,p0	/* store data as little-endian */        bclr    20,0FUNC_END(sysPciWrite32)/******************************************************************************* sysPciInByte - reads a byte from PCI Config Space.** This function reads a byte from a specified PCI Config Space address.** RETURNS:* Returns 8 bit data from the specified register.  Note that for PCI systems* if no target responds, the data returned to the CPU will be 0xff.* UINT8 sysPciInByte*     (*     UINT8 *  pAddr,		/@ Virtual addr to read from @/*     )*/FUNC_BEGIN(sysPciInByte)	eieio			/* Sync I/O operation */        lbzx    p0,r0,p0	/* Read byte from PCI space */        bclr    20,0		/* Return to caller */FUNC_END(sysPciInByte)/******************************************************************************* sysPciInWord - reads a word (16-bit big-endian) from PCI Config Space.** This function reads a word from a specified PCI Config Space (little-endian)* address.** RETURNS:* Returns 16 bit data from the specified register.  Note that for PCI systems* if no target responds, the data returned to the CPU will be 0xffff.* USHORT sysPciInWord*     (*     USHORT *  pAddr,		/@ Virtual addr to read from @/*     )*/FUNC_BEGIN(sysPciInWord)	eieio			/* Sync I/O operation */        lhbrx   p0,r0,p0	/* Read and swap from PCI space */        bclr    20,0		/* Return to caller */FUNC_END(sysPciInWord)/******************************************************************************* sysPciInLong - reads a long (32-bit big-endian) from PCI Config Space.** This function reads a long from a specified PCI Config Space (little-endian)* address.** RETURNS:* Returns 32 bit data from the specified register.  Note that for PCI systems* if no target responds, the data returned to the CPU will be 0xffffffff.* ULONG sysPciInLong*     (*     ULONG *  pAddr,		/@ Virtual addr to read from @/*     )*/FUNC_BEGIN(sysPciInLong)	eieio			/* Sync I/O operation */        lwbrx   p0,r0,p0	/* Read and swap from PCI space */        bclr    20,0		/* Return to caller */FUNC_END(sysPciInLong)/******************************************************************************** sysPciOutByte - writes a byte to PCI Config Space.** This function writes a byte to a specified PCI Config Space address.** RETURNS: N/A* VOID sysPciOutByte*     (*     UINT8 *  pAddr,		/@ Virtual addr to write to @/*     UINT8  data		/@ Data to be written       @/*     )*/FUNC_BEGIN(sysPciOutByte)        stbx    p1,r0,p0	/* Write a byte to PCI space */        bclr    20,0		/* Return to caller */FUNC_END(sysPciOutByte)/******************************************************************************** sysPciOutWord - writes a word (16-bit big-endian) to PCI Config Space.** This function writes a word to a specified PCI Config Space (little-endian)* address.** RETURNS: N/A* VOID sysPciOutWord*     (*     USHORT *  pAddr,		/@ Virtual addr to write to @/*     USHORT  data		/@ Data to be written       @/*     )*/FUNC_BEGIN(sysPciOutWord)        sthbrx  p1,r0,p0	/* Write with swap to PCI space */        bclr    20,0		/* Return to caller */FUNC_END(sysPciOutWord)/******************************************************************************** sysPciOutLong - writes a long (32-bit big-endian) to PCI Config Space.** This function writes a long to a specified PCI Config Space (little-endian)* address.** RETURNS: N/A* VOID sysPciOutLong*     (*     ULONG *  pAddr,		/@ Virtual addr to write to @/*     ULONG  data		/@ Data to be written       @/*     )*/FUNC_BEGIN(sysPciOutLong)        stwbrx  p1,r0,p0	/* Write big-endian long to little-endian */        mr      p0,p1		/* PCI space */        bclr    20,0		/* Return to caller */FUNC_END(sysPciOutLong)/********************************************************************************* sysMemProbeSup - sysBusProbe support routine** This routine is called to try to read byte, word, or long, as specified* by length, from the specified source to the specified destination.** RETURNS: OK if successful probe, else ERROR* STATUS sysMemProbeSup*     (*     int         length, /@ length of cell to test (1, 2, 4) @/*     char *      src,    /@ address to read @/*     char *      dest    /@ address to write @/*     )*/FUNC_BEGIN(sysMemProbeSup)        addi    p7, p0, 0       /* save length to p7 */        xor     p0, p0, p0      /* set return status */        cmpwi   p7, 1           /* check for byte access */        bne     sbpShort        /* no, go check for short word access */        lbz     p6, 0(p1)       /* load byte from source */        stb     p6, 0(p2)       /* store byte to destination */        isync                   /* enforce for immediate exception handling */        blrsbpShort:        cmpwi   p7, 2           /* check for short word access */        bne     sbpWord         /* no, check for word access */        lhz     p6, 0(p1)       /* load half word from source */        sth     p6, 0(p2)       /* store half word to destination */        isync                   /* enforce for immediate exception handling */        blrsbpWord:        cmpwi   p7, 4           /* check for short word access */        bne     sysProbeExc     /* no, check for double word access */        lwz     p6, 0(p1)       /* load half word from source */        stw     p6, 0(p2)       /* store half word to destination */        isync                   /* enforce for immediate exception handling */        blrsysProbeExc:        li      p0, -1          /* shouldn't ever get here, but... */        blrFUNC_END(sysMemProbeSup)/********************************************************************** *  sysPVRReadSys - Read the content of the PVR register *	Once the PVR is read, the 16 least significant bits are shifted *	off. *  Input  - None *  Return - upper 16 bits of PVR stored in r3 */FUNC_BEGIN(sysPVRReadSys)/*	mfspr r4, PVR_REG*/		/* read PVR  *//*	srwi  r3, r4, 16*/		/* shift off the least 16 bits */        mfspr r3, PVR               /* read PVR  */	blrFUNC_END(sysPVRReadSys)/********************************************************************************* sysSioRead - this function reads a register from the UIO chip** In order to read data from the desired Super IO register, the index register* must be written to with the offset of the of the register to be read.  The * desired byte of data is then read from the data register.** RETURNS: byte read from data register** From a C point of view, the routine is defined as follows:UINT8 sysSioRead    (     UINT8 * pSioIndexReg, 	/@ pointer to SIO index register base addr @/    UINT8 sioRegOffset		/@ offset of register to read from @/    )*/FUNC_BEGIN(sysSioRead)        stb     r4,0(r3)        /* write index register with register offset */        eieio        sync        lbz     r3,1(r3)        /* retrieve specified reg offset contents */        eieio        sync        bclr    20,0            /* return to caller */FUNC_END(sysSioRead)/********************************************************************************* sysSioWrite - this function writes a register to the UIO chip** In order to write data to the desired Super IO register, the index* register must be written to with the offset of the of the register to be* modified.  The desired byte of data can then be written via the data* register.** RETURNS: N/A** From a C point of view, the routine is defined as follows:void sysSioWrite    (     UINT8 * pSioIndexReg, 	/@ pointer to SIO index register base addr @/    UINT8 sioRegOffset, 	/@ offset of register to write to @/    UINT8 data			/@ 8-bit data to be written @/    )*/FUNC_BEGIN(sysSioWrite)        stb     r4,0(r3)        /* write index register with register offset */        eieio        sync        stb     r5,1(r3)        /* 1st write */        eieio        sync        stb     r5,1(r3)        /* 2nd write */        eieio        sync        bclr    20,0            /* return to caller */FUNC_END(sysSioWrite)#if defined(INCLUDE_CACHE_L2) #include "sysL2BackCache.s"#endif#if !defined(SP8240)#include "sysCacheLockALib.s"#endif#if defined(INCLUDE_CACHE_L3) #include "sysL3Cache.s"#endif

⌨️ 快捷键说明

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