📄 hal_cygm.s
字号:
/*=============================================================================//// hal_cygm.S//// SPARClite and CygMon play nice: vector service routines////=============================================================================//####COPYRIGHTBEGIN####//// -------------------------------------------// The contents of this file are subject to the Cygnus eCos Public License// Version 1.0 (the "License"); you may not use this file except in// compliance with the License. You may obtain a copy of the License at// http://sourceware.cygnus.com/ecos// // Software distributed under the License is distributed on an "AS IS"// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the// License for the specific language governing rights and limitations under// the License.// // The Original Code is eCos - Embedded Cygnus Operating System, released// September 30, 1998.// // The Initial Developer of the Original Code is Cygnus. Portions created// by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved.// -------------------------------------------////###COPYRIGHTEND####//=============================================================================//#####DESCRIPTIONBEGIN####//// Author(s): hmt// Contributors:hmt// Date: 1998-02-24// Purpose: SPARClite vectors for interworking with CygMon// Description: see vectors.S and hal_priv.c; these VSRs are installed to// interwork with CygMon.////####DESCRIPTIONEND####////===========================================================================*/!----------------------------------------------------------------------------- .file "hal_cygm.S"!-----------------------------------------------------------------------------#include <pkgconf/system.h>#include <pkgconf/hal.h>#include <pkgconf/hal_sparclite.h>#include <pkgconf/hal_sparclite_sleb.h>!------------------------------------------------------------------------#include <cyg/hal/vectors.h> // eCos vector number et al#include <cyg/hal/hal_cygm.h> // CygMon vector number et al #define DELAYS_AFTER_WRPSR_SAME_WINDOW#define DELAYS_AFTER_WRWIM!------------------------------------------------------------------------ .text!---------------------------------------------------------------------------#ifdef CYG_HAL_USE_ROM_MONITOR_CYGMON .global hal_user_trap_to_cygmon_vsrhal_user_trap_to_cygmon_vsr: ! here,locals have been set up as follows: ! %l0 = psr (with this CWP/window-level in it) ! %l1 = pc ! %l2 = npc ! %l3 = vector number (1-15 for interrupts) ! and we are in our own register window, though it is likely that ! the next one will need to be saved before we can use it: ! ie. this one is the invalid register window. rd %tbr, %l4 ! Get the trap type srl %l4, 4, %l4 ! into the bottom byte and %l4, 0xff, %l4 ! actual trap number ! we deal with traps 1,3,8(+128) and 255 here. ! ta 1 => tt 129 : breakpoint ! ta 3 => tt 131 : flush windows (unneccessary, JIC) ! ta 8 => tt 136 : syscall (apparently) ! ta 127 -OR- Debug Support Unit trap ! => tt 255 : debug trap ! others bounce through to eCos handler, of course. cmp %l4, 129 beq bounce_to_cygmon mov BSP_EXC_BREAK, %l5 ! ta 2 is a "skipped" breakpoint, we increment the PC, NPC ! ourselves to permit continuation. cmp %l4, 130 bne 1f nop mov %l2, %l1 add %l2, 4, %l2 b bounce_to_cygmon mov BSP_EXC_BREAK, %l51: cmp %l4, 131 beq bounce_to_cygmon mov BSP_EXC_WINFLUSH, %l5 cmp %l4, 136 beq bounce_to_cygmon mov BSP_EXC_SYSCALL, %l5 cmp %l4, 255 beq bounce_to_cygmon mov BSP_EXC_DEBUG, %l5 ! if we are here, it~s not a recognized trap to feed to CygMon, so ! call the eCos default trap VSR: .extern hal_default_exception_vsr ba hal_default_exception_vsr ! should be in range nop ! does not return .global hal_nofpcp_trap_to_cygmon_vsrhal_nofpcp_trap_to_cygmon_vsr: rd %tbr, %l4 ! Get the trap type srl %l4, 4, %l4 ! into the bottom byte and %l4, 0xff, %l4 ! actual trap number ! we deal with trap types 4 and 36 here. cmp %l4, 4 beq bounce_to_cygmon mov BSP_EXC_FPDIS, %l5 cmp %l4, 36 beq bounce_to_cygmon mov BSP_EXC_CPDIS, %l5 ! we really should not be here otherwise, but for best debugging... b bounce_to_cygmon mov BSP_EXC_TRAP, %l5 bounce_to_cygmon: ! here we have decided to jump over CygMon, the CygMon vector ! number to use is in %l5. set CYGMON_VECTOR_TABLE_BASE, %l6 sll %l5, 2, %l5 ! to a word offset ! our calling convention is the same, so... ld [ %l6 + %l5 ], %l6 jmp %l6 nop// Now a handler for INT15 (NMI) to assist in debugging; we have to ack and// clear the interrupt, after waiting for the source to go away, I guess... .global hal_nmi_handlerhal_nmi_handler: ! here,locals have been set up as follows: ! %l0 = psr (with this CWP/window-level in it) ! %l1 = pc ! %l2 = npc ! %l3 = vector number (1-15 for interrupts) ! and we are in our own register window, though it is likely that ! the next one will need to be saved before we can use it: ! ie. this one is the invalid register window. #define TRGM0 0#define TRGM1 4 #define REQSNS 8#define REQCLR 12#define IMASK 16#define IRLAT 20#define IMODE 24#define NMIBIT 0x80000000 sethi %hi( 0x10000000 ), %l4 ! base address of the 86940 companion10: add %l4, REQCLR, %l5 ! Request clear register set NMIBIT, %l6 sta %l6, [ %l5 ] 4 ! Clear INT15 add %l4, REQSNS, %l5 ! Request sense register lda [ %l5 ] 4, %l7 andcc %l6, %l7, %g0 ! test the sense bit sethi %hi( 0x02000000 ), %l6 ! Pump it out to the LED srl %l7, 24, %l7 stb %l7, [ %l6 + 3 ] bne 10b ! poll until the request is gone nop nop nop set 0x00100000, %l6 ! clear the latch add %l4, IRLAT, %l5 sta %l6, [ %l5 ] 4 nop nop nop b bounce_to_cygmon mov BSP_EXC_INT15, %l5 #endif // CYG_HAL_USE_ROM_MONITOR_CYGMON ! end of hal_cygm.S
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -