📄 mips.h
字号:
/* mips.h * * COPYRIGHT (c) 1989-2001. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. * * $Id: mips.h,v 1.14.2.1 2003/09/04 18:47:30 joel Exp $ *//* @(#)mips64orion.h 08/29/96 1.3 */#ifndef _INCLUDE_MIPS_h#define _INCLUDE_MIPS_h#ifdef __cplusplusextern "C" {#endif#ifndef ASM#include <idtcpu.h>#endif/* * SR bits that enable/disable interrupts * * NOTE: XXX what about SR_ERL? */#if __mips == 3#ifdef ASM#define SR_INTERRUPT_ENABLE_BITS 0x01#else#define SR_INTERRUPT_ENABLE_BITS SR_IE#endif#elif __mips == 1#define SR_INTERRUPT_ENABLE_BITS SR_IEC#else#error "mips interrupt enable bits: unknown architecture level!"#endif/* * This file contains the information required to build * RTEMS for a particular member of the "no cpu" * family when executing in protected mode. It does * this by setting variables to indicate which implementation * dependent features are present in a particular member * of the family. */ #if defined(__mips_soft_float)#define MIPS_HAS_FPU 0#else#define MIPS_HAS_FPU 1#endif #if (__mips == 1)#define CPU_MODEL_NAME "ISA Level 1 or 2"#elif (__mips == 3)#if defined(__mips64)#define CPU_MODEL_NAME "ISA Level 4"#else#define CPU_MODEL_NAME "ISA Level 3"#endif#else#error "Unknown MIPS ISA level"#endif/* * Define the name of the CPU family. */#define CPU_NAME "MIPS"/* * RTEMS Vector numbers for exception conditions. This is a direct * map to the causes. */#define MIPS_EXCEPTION_BASE 0#define MIPS_EXCEPTION_INT MIPS_EXCEPTION_BASE+0#define MIPS_EXCEPTION_MOD MIPS_EXCEPTION_BASE+1#define MIPS_EXCEPTION_TLBL MIPS_EXCEPTION_BASE+2#define MIPS_EXCEPTION_TLBS MIPS_EXCEPTION_BASE+3#define MIPS_EXCEPTION_ADEL MIPS_EXCEPTION_BASE+4#define MIPS_EXCEPTION_ADES MIPS_EXCEPTION_BASE+5#define MIPS_EXCEPTION_IBE MIPS_EXCEPTION_BASE+6#define MIPS_EXCEPTION_DBE MIPS_EXCEPTION_BASE+7#define MIPS_EXCEPTION_SYSCALL MIPS_EXCEPTION_BASE+8#define MIPS_EXCEPTION_BREAK MIPS_EXCEPTION_BASE+9#define MIPS_EXCEPTION_RI MIPS_EXCEPTION_BASE+10#define MIPS_EXCEPTION_CPU MIPS_EXCEPTION_BASE+11#define MIPS_EXCEPTION_OVERFLOW MIPS_EXCEPTION_BASE+12#define MIPS_EXCEPTION_TRAP MIPS_EXCEPTION_BASE+13#define MIPS_EXCEPTION_VCEI MIPS_EXCEPTION_BASE+14/* FPE only on mips2 and higher */#define MIPS_EXCEPTION_FPE MIPS_EXCEPTION_BASE+15#define MIPS_EXCEPTION_C2E MIPS_EXCEPTION_BASE+16/* 17-22 reserved */#define MIPS_EXCEPTION_WATCH MIPS_EXCEPTION_BASE+23/* 24-30 reserved */#define MIPS_EXCEPTION_VCED MIPS_EXCEPTION_BASE+31#define MIPS_INTERRUPT_BASE MIPS_EXCEPTION_BASE+32/* * Some macros to access registers */#define mips_get_sr( _x ) \ do { \ asm volatile( "mfc0 %0, $12; nop" : "=r" (_x) : ); \ } while (0)#define mips_set_sr( _x ) \ do { \ register unsigned int __x = (_x); \ asm volatile( "mtc0 %0, $12; nop" : : "r" (__x) ); \ } while (0)/* * Access the Cause register */#define mips_get_cause( _x ) \ do { \ asm volatile( "mfc0 %0, $13; nop" : "=r" (_x) : ); \ } while (0)#define mips_set_cause( _x ) \ do { \ register unsigned int __x = (_x); \ asm volatile( "mtc0 %0, $13; nop" : : "r" (__x) ); \ } while (0)/* * Access the Debug Cache Invalidate Control register */#define mips_get_dcic( _x ) \ do { \ asm volatile( "mfc0 %0, $7; nop" : "=r" (_x) : ); \ } while (0)#define mips_set_dcic( _x ) \ do { \ register unsigned int __x = (_x); \ asm volatile( "mtc0 %0, $7; nop" : : "r" (__x) ); \ } while (0)/* * Access the Breakpoint Program Counter & Mask registers * (_x for BPC, _y for mask) */#define mips_get_bpcrm( _x, _y ) \ do { \ asm volatile( "mfc0 %0, $3; nop" : "=r" (_x) : ); \ asm volatile( "mfc0 %0, $11; nop" : "=r" (_y) : ); \ } while (0)#define mips_set_bpcrm( _x, _y ) \ do { \ register unsigned int __x = (_x); \ register unsigned int __y = (_y); \ asm volatile( "mtc0 %0, $11; nop" : : "r" (__y) ); \ asm volatile( "mtc0 %0, $3; nop" : : "r" (__x) ); \ } while (0)/* * Access the Breakpoint Data Address & Mask registers * (_x for BDA, _y for mask) */#define mips_get_bdarm( _x, _y ) \ do { \ asm volatile( "mfc0 %0, $5; nop" : "=r" (_x) : ); \ asm volatile( "mfc0 %0, $9; nop" : "=r" (_y) : ); \ } while (0)#define mips_set_bdarm( _x, _y ) \ do { \ register unsigned int __x = (_x); \ register unsigned int __y = (_y); \ asm volatile( "mtc0 %0, $9; nop" : : "r" (__y) ); \ asm volatile( "mtc0 %0, $5; nop" : : "r" (__x) ); \ } while (0)/* * Access FCR31 */#define mips_get_fcr31( _x ) \ do { \ asm volatile( "cfc1 %0, $31; nop" : "=r" (_x) : ); \ } while(0)#define mips_set_fcr31( _x ) \ do { \ register unsigned int __x = (_x); \ asm volatile( "ctc1 %0, $31; nop" : : "r" (__x) ); \ } while(0)/* * Manipulate interrupt mask * * mips_unmask_interrupt( _mask) * enables interrupts - mask is positioned so it only needs to be or'ed * into the status reg. This also does some other things !!!! Caution * should be used if invoking this while in the middle of a debugging * session where the client may have nested interrupts. * * mips_mask_interrupt( _mask ) * disable the interrupt - mask is the complement of the bits to be * cleared - i.e. to clear ext int 5 the mask would be - 0xffff7fff * * * NOTE: mips_mask_interrupt() used to be disable_int(). * mips_unmask_interrupt() used to be enable_int(). * */#define mips_enable_in_interrupt_mask( _mask ) \ do { \ unsigned int _sr; \ mips_get_sr( _sr ); \ _sr |= (_mask); \ mips_set_sr( _sr ); \ } while (0)#define mips_disable_in_interrupt_mask( _mask ) \ do { \ unsigned int _sr; \ mips_get_sr( _sr ); \ _sr &= ~(_mask); \ mips_set_sr( _sr ); \ } while (0)#ifdef __cplusplus}#endif#endif /* ! _INCLUDE_MIPS_h *//* end of include file */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -