📄 sysalib.s
字号:
/* sysALib.s - Motorola LoPEC system-dependent assembly routines *//* Copyright 1984-2001 Wind River Systems,Inc. *//* Copyright 1996-2001 Motorola,Inc. All Rights Reserved */ .data .globl copyright_wind_river .long copyright_wind_river/*modification history--------------------01d,22jan01,scb removed not needed sysPciConfig...() routines.01c,07dec00,scb consolidated errata into callable functions, matching romInit.s01b,20nov00,scb Processor support01a,02nov00,djs created based on 01g,08feb00,rhk mv2100*//*DESCRIPTIONThis module contains system-dependent routines written in assemblylanguage.This module must be the first specified in the \f3ld\f1 command used tobuild the system. The sysInit() routine is the system start-up code.*//* defines */#define _ASMLANGUAGE#define SGE_CLEAR 0x00000080 /* SGE: clear */#define MEMSSCR1 0x01000000 /* Max Memory SubSystem Control Reg 1 */#define MEMSSCR1_NITRO 0x00040000 /* Nitro Mem SubSystem Control Reg 1 */#define DL1HWFLSH 0x00800000 /* L1 data cache HW flush bit 8 */#include "vxWorks.h"#include "sysLib.h"#include "config.h"#include "regs.h"#include "asm.h" /* globals */ .globl _sysInit /* start of system code */ .globl sysInByte .globl sysOutByte .globl sysPciInByte .globl sysPciOutByte .globl sysInWord .globl sysInWordRev .globl sysOutWord .globl sysPciInWord .globl sysPciOutWord .globl sysInLong .globl sysOutLong .globl sysPciInLong .globl sysPciOutLong .globl sysMemProbeSup .globl sysProbeExc .globl sysL2crPut .globl sysL2crGet .globl sysTimeBaseLGet .globl sysHid1Get .globl sysHid2Set .globl sysHid2Get /* externals */ .extern usrInit .text/********************************************************************************* sysInit - start after boot** This is the system start-up entry point for VxWorks in RAM,the* first code executed after booting. It disables interrupts,sets up* the stack,and jumps to the C routine usrInit() in usrConfig.c.** The initial stack is set to grow down from the address of sysInit(). This* stack is used only by usrInit() and is never used again. Memory for the* stack must be accounted for when determining the system load address.** NOTE: This routine should not be called by the user.** RETURNS: N/A* sysInit (void) /@ THIS IS NOT A CALLABLE ROUTINE @/*/_sysInit: /* disable external interrupts */ xor p0,p0,p0 mtmsr p0 /* clear the MSR register */ /* return from decrementer exceptions */ addis p1,r0,0x4c00 addi p1,p1,0x0064 /* load rfi (0x4c000064) to p1 */ stw p1,0x900(r0) /* store rfi at 0x00000900 */ /* initialize the stack pointer */ lis sp,HIADJ(RAM_LOW_ADRS) addi sp,sp,LO(RAM_LOW_ADRS) mfspr r28,PVR rlwinm r28,r28,16,16,31 cmpwi r28,CPU_TYPE_MAX bne cpuNotMax /* MAX L1 Data Cache HW Flush per Max Book 4,Rev. 2.0 */ lis r2,HI(DL1HWFLSH) ori r2,r2,LO(DL1HWFLSH) mtspr 1014,r2 /* MSSCR0 */ /* * required sync to guarantee that all data from the dL1 has * been written to the system address interface. */ sync bl maxErratacpuNotMax: cmpli 0,0,r28,CPU_TYPE_NITRO bne cpuNotNitro bl nitroErratacpuNotNitro: /* Enable and invalidate both caches */ mfspr r3,HID0 ori r3,r3,(_PPC_HID0_ICFI | _PPC_HID0_DCFI) ori r3,r3,(_PPC_HID0_ICE | _PPC_HID0_DCE) sync /* required before changing DCE */ isync /* required before changing ICE */ mtspr HID0, r3 /* * enable the branch history table, unlock both caches, disable the * data cache and optionally disable the instruction cache. */ ori r3,r3,_PPC_HID0_BHTE#ifdef USER_I_CACHE_ENABLE rlwinm r3,r3,0,_PPC_HID0_BIT_DLOCK+1,_PPC_HID0_BIT_DCE-1#else rlwinm r3,r3,0,_PPC_HID0_BIT_DLOCK+1,_PPC_HID0_BIT_ICE-1#endif sync /* required before changing DCE */ isync /* required before changing ICE */ mtspr HID0,r3 /* disable instruction and data translations in the MMU */ sync mfmsr r3 /* get the value in msr * /* clear bits IR and DR */ rlwinm r4,r3,0,_PPC_MSR_BIT_DR+1,_PPC_MSR_BIT_IR-1 mtmsr r4 /* set the msr */ isync /* flush inst. pipe and re-fetch */ /* initialize the BAT register */ li p3,0 /* clear p0 */ isync mtspr IBAT0U,p3 /* SPR 528 (IBAT0U) */ isync mtspr IBAT0L,p3 /* SPR 529 (IBAT0L) */ isync mtspr IBAT1U,p3 /* SPR 530 (IBAT1U) */ isync mtspr IBAT1L,p3 /* SPR 531 (IBAT1L) */ isync mtspr IBAT2U,p3 /* SPR 532 (IBAT2U) */ isync mtspr IBAT2L,p3 /* SPR 533 (IBAT2L) */ isync mtspr IBAT3U,p3 /* SPR 534 (IBAT3U) */ isync mtspr IBAT3L,p3 /* SPR 535 (IBAT3L) */ isync mtspr DBAT0U,p3 /* SPR 536 (DBAT0U) */ isync mtspr DBAT0L,p3 /* SPR 537 (DBAT0L) */ isync mtspr DBAT1U,p3 /* SPR 538 (DBAT1U) */ isync mtspr DBAT1L,p3 /* SPR 539 (DBAT1L) */ isync mtspr DBAT2U,p3 /* SPR 540 (DBAT2U) */ isync mtspr DBAT2L,p3 /* SPR 541 (DBAT2L) */ isync mtspr DBAT3U,p3 /* SPR 542 (DBAT3U) */ isync mtspr DBAT3L,p3 /* SPR 543 (DBAT3L) */ isync /* invalidate entries within both TLBs */ li p1,128 xor p0,p0,p0 /* p0 = 0 */ mtctr p1 /* CTR = 32 */ 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,HIADJ(_SDA2_BASE_) addi r2,r2,LO(_SDA2_BASE_) lis r13,HIADJ(_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 *//******************************************************************************* sysInByte - reads a byte from an io address.** This function reads a byte from a specified io address or from local memory.* It operates in big-endian mode and does not perform any translation* operations on either the supplied address or the retrieved data.** RETURNS: byte from address.** UINT8 sysInByte (UINT8 * dataPtr)*/sysInByte: /* Read byte from address */ lbzx r3,r0,r3 /* Return to caller */ bclr 20,0/******************************************************************************** sysOutByte - writes a byte to an io address.** This function writes a byte to a specified io address or to local memory.* It operates in big-endian mode and does not perform any translation* operations on either the supplied address or data.** RETURNS: N/A** void sysOutByte (UINT8 * dataPtr,UINT8 data)*/sysOutByte: /* Write a byte to address */ stbx r4,r0,r3 /* Sync I/O operation */ sync /* Return to caller */ bclr 20,0/******************************************************************************* sysPciInByte - reads a byte from PCI I/O or Memory space** This function reads a byte from a specified PCI I/O or Memory address* via the PCI bridge chip. This function should be used for access* to the I/O or Memory mapped registers of a PCI device. Since this routine* accesses only a single byte of data no address or data manipulation is* required.** RETURNS: byte from address.** UINT8 sysPciInByte (UINT8 * dataPtr)*/sysPciInByte: /* Read byte from address */ lbzx r3,r0,r3 /* Return to caller */ bclr 20,0/******************************************************************************* sysPciOutByte - writes a byte to PCI I/O or Memory space** This function writes a byte to a specified PCI I/O or Memory address* via the QSPAN bridge chip. This function should be used for writing* to the I/O or Memory mapped registers of a PCI device. Since this routine* writes only a single byte of data no address or data manipulation is* required.** RETURNS: N/A** void sysPciOutByte (UINT8 * dataPtr,UINT8 data)*/sysPciOutByte: /* Write a byte to address */ stbx r4,r0,r3 /* Sync I/O operation */ sync /* Return to caller */ bclr 20,0/******************************************************************************* sysInWord - reads a word (16-bit big-endian) from an io address.** This function reads a word from a specified io address or local memory.* It operates in big-endian mode and does not perform any translation* operations on either the supplied address or the retrieved data.** RETURNS: 16-bit word from read from address** UINT16 sysInWord (UINT16 * dataPtr)*/sysInWord: /* Read word from address */ lhzx r3,r0,r3 /* Return to caller */ bclr 20,0/******************************************************************************* sysInWordRev - reads a word (16-bit byte reversed) from an io address.** This function reads a word from a specified io address,or memory* and reverses the bytes.** RETURNS: 16 bit word (byte swapped) read from address** UINT16 sysInWordRev (UINT16 * dataPtr)*/sysInWordRev: /* Read word from address */ lhbrx r3,r0,r3 /* Return to caller */ bclr 20,0/******************************************************************************** sysOutWord - writes a word (16-bit big-endian) to an io address.** This function writes a word to a specified io address or to local memory.* It operates in big-endian mode and does not perform any translation* operations on either the supplied address or data.** RETURNS: N/A*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -