1*53ee8cc1Swenshuai.xi //<MStar Software> 2*53ee8cc1Swenshuai.xi //****************************************************************************** 3*53ee8cc1Swenshuai.xi // MStar Software 4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved. 5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are 6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by 7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties. 8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all 9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written 10*53ee8cc1Swenshuai.xi // permission has been granted by MStar. 11*53ee8cc1Swenshuai.xi // 12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you 13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to 14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations: 15*53ee8cc1Swenshuai.xi // 16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar 17*53ee8cc1Swenshuai.xi // Software and any modification/derivatives thereof. 18*53ee8cc1Swenshuai.xi // No right, ownership, or interest to MStar Software and any 19*53ee8cc1Swenshuai.xi // modification/derivatives thereof is transferred to you under Terms. 20*53ee8cc1Swenshuai.xi // 21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be 22*53ee8cc1Swenshuai.xi // supplied together with third party`s software and the use of MStar 23*53ee8cc1Swenshuai.xi // Software may require additional licenses from third parties. 24*53ee8cc1Swenshuai.xi // Therefore, you hereby agree it is your sole responsibility to separately 25*53ee8cc1Swenshuai.xi // obtain any and all third party right and license necessary for your use of 26*53ee8cc1Swenshuai.xi // such third party`s software. 27*53ee8cc1Swenshuai.xi // 28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as 29*53ee8cc1Swenshuai.xi // MStar`s confidential information and you agree to keep MStar`s 30*53ee8cc1Swenshuai.xi // confidential information in strictest confidence and not disclose to any 31*53ee8cc1Swenshuai.xi // third party. 32*53ee8cc1Swenshuai.xi // 33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any 34*53ee8cc1Swenshuai.xi // kind. Any warranties are hereby expressly disclaimed by MStar, including 35*53ee8cc1Swenshuai.xi // without limitation, any warranties of merchantability, non-infringement of 36*53ee8cc1Swenshuai.xi // intellectual property rights, fitness for a particular purpose, error free 37*53ee8cc1Swenshuai.xi // and in conformity with any international standard. You agree to waive any 38*53ee8cc1Swenshuai.xi // claim against MStar for any loss, damage, cost or expense that you may 39*53ee8cc1Swenshuai.xi // incur related to your use of MStar Software. 40*53ee8cc1Swenshuai.xi // In no event shall MStar be liable for any direct, indirect, incidental or 41*53ee8cc1Swenshuai.xi // consequential damages, including without limitation, lost of profit or 42*53ee8cc1Swenshuai.xi // revenues, lost or damage of data, and unauthorized system use. 43*53ee8cc1Swenshuai.xi // You agree that this Section 4 shall still apply without being affected 44*53ee8cc1Swenshuai.xi // even if MStar Software has been modified by MStar in accordance with your 45*53ee8cc1Swenshuai.xi // request or instruction for your use, except otherwise agreed by both 46*53ee8cc1Swenshuai.xi // parties in writing. 47*53ee8cc1Swenshuai.xi // 48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or 49*53ee8cc1Swenshuai.xi // services in relation with MStar Software to you for your use of 50*53ee8cc1Swenshuai.xi // MStar Software in conjunction with your or your customer`s product 51*53ee8cc1Swenshuai.xi // ("Services"). 52*53ee8cc1Swenshuai.xi // You understand and agree that, except otherwise agreed by both parties in 53*53ee8cc1Swenshuai.xi // writing, Services are provided on an "AS IS" basis and the warranty 54*53ee8cc1Swenshuai.xi // disclaimer set forth in Section 4 above shall apply. 55*53ee8cc1Swenshuai.xi // 56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels 57*53ee8cc1Swenshuai.xi // or otherwise: 58*53ee8cc1Swenshuai.xi // (a) conferring any license or right to use MStar name, trademark, service 59*53ee8cc1Swenshuai.xi // mark, symbol or any other identification; 60*53ee8cc1Swenshuai.xi // (b) obligating MStar or any of its affiliates to furnish any person, 61*53ee8cc1Swenshuai.xi // including without limitation, you and your customers, any assistance 62*53ee8cc1Swenshuai.xi // of any kind whatsoever, or any information; or 63*53ee8cc1Swenshuai.xi // (c) conferring any license or right under any intellectual property right. 64*53ee8cc1Swenshuai.xi // 65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws 66*53ee8cc1Swenshuai.xi // of Taiwan, R.O.C., excluding its conflict of law rules. 67*53ee8cc1Swenshuai.xi // Any and all dispute arising out hereof or related hereto shall be finally 68*53ee8cc1Swenshuai.xi // settled by arbitration referred to the Chinese Arbitration Association, 69*53ee8cc1Swenshuai.xi // Taipei in accordance with the ROC Arbitration Law and the Arbitration 70*53ee8cc1Swenshuai.xi // Rules of the Association by three (3) arbitrators appointed in accordance 71*53ee8cc1Swenshuai.xi // with the said Rules. 72*53ee8cc1Swenshuai.xi // The place of arbitration shall be in Taipei, Taiwan and the language shall 73*53ee8cc1Swenshuai.xi // be English. 74*53ee8cc1Swenshuai.xi // The arbitration award shall be final and binding to both parties. 75*53ee8cc1Swenshuai.xi // 76*53ee8cc1Swenshuai.xi //****************************************************************************** 77*53ee8cc1Swenshuai.xi //<MStar Software> 78*53ee8cc1Swenshuai.xi //========================================================================== 79*53ee8cc1Swenshuai.xi // 80*53ee8cc1Swenshuai.xi // hal_arch.h 81*53ee8cc1Swenshuai.xi // 82*53ee8cc1Swenshuai.xi // Architecture specific abstractions 83*53ee8cc1Swenshuai.xi // 84*53ee8cc1Swenshuai.xi //========================================================================== 85*53ee8cc1Swenshuai.xi //####ECOSGPLCOPYRIGHTBEGIN#### 86*53ee8cc1Swenshuai.xi // ------------------------------------------- 87*53ee8cc1Swenshuai.xi // This file is part of eCos, the Embedded Configurable Operating System. 88*53ee8cc1Swenshuai.xi // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. 89*53ee8cc1Swenshuai.xi // 90*53ee8cc1Swenshuai.xi // eCos is free software; you can redistribute it and/or modify it under 91*53ee8cc1Swenshuai.xi // the terms of the GNU General Public License as published by the Free 92*53ee8cc1Swenshuai.xi // Software Foundation; either version 2 or (at your option) any later version. 93*53ee8cc1Swenshuai.xi // 94*53ee8cc1Swenshuai.xi // eCos is distributed in the hope that it will be useful, but WITHOUT ANY 95*53ee8cc1Swenshuai.xi // WARRANTY; without even the implied warranty of MERCHANTABILITY or 96*53ee8cc1Swenshuai.xi // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 97*53ee8cc1Swenshuai.xi // for more details. 98*53ee8cc1Swenshuai.xi // 99*53ee8cc1Swenshuai.xi // You should have received a copy of the GNU General Public License along 100*53ee8cc1Swenshuai.xi // with eCos; if not, write to the Free Software Foundation, Inc., 101*53ee8cc1Swenshuai.xi // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. 102*53ee8cc1Swenshuai.xi // 103*53ee8cc1Swenshuai.xi // As a special exception, if other files instantiate templates or use macros 104*53ee8cc1Swenshuai.xi // or inline functions from this file, or you compile this file and link it 105*53ee8cc1Swenshuai.xi // with other works to produce a work based on this file, this file does not 106*53ee8cc1Swenshuai.xi // by itself cause the resulting work to be covered by the GNU General Public 107*53ee8cc1Swenshuai.xi // License. However the source code for this file must still be made available 108*53ee8cc1Swenshuai.xi // in accordance with section (3) of the GNU General Public License. 109*53ee8cc1Swenshuai.xi // 110*53ee8cc1Swenshuai.xi // This exception does not invalidate any other reasons why a work based on 111*53ee8cc1Swenshuai.xi // this file might be covered by the GNU General Public License. 112*53ee8cc1Swenshuai.xi // 113*53ee8cc1Swenshuai.xi // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. 114*53ee8cc1Swenshuai.xi // at http://sources.redhat.com/ecos/ecos-license/ 115*53ee8cc1Swenshuai.xi // ------------------------------------------- 116*53ee8cc1Swenshuai.xi //####ECOSGPLCOPYRIGHTEND#### 117*53ee8cc1Swenshuai.xi //========================================================================== 118*53ee8cc1Swenshuai.xi //#####DESCRIPTIONBEGIN#### 119*53ee8cc1Swenshuai.xi // 120*53ee8cc1Swenshuai.xi // Author(s): sfurman 121*53ee8cc1Swenshuai.xi // Contributors: 122*53ee8cc1Swenshuai.xi // Date: 2003-01-17 123*53ee8cc1Swenshuai.xi // Purpose: Define architecture abstractions 124*53ee8cc1Swenshuai.xi // Usage: #include <cyg/hal/hal_arch.h> 125*53ee8cc1Swenshuai.xi // 126*53ee8cc1Swenshuai.xi //####DESCRIPTIONEND#### 127*53ee8cc1Swenshuai.xi // 128*53ee8cc1Swenshuai.xi //========================================================================== 129*53ee8cc1Swenshuai.xi 130*53ee8cc1Swenshuai.xi #ifndef CYGONCE_HAL_HAL_ARCH_H 131*53ee8cc1Swenshuai.xi #define CYGONCE_HAL_HAL_ARCH_H 132*53ee8cc1Swenshuai.xi 133*53ee8cc1Swenshuai.xi // Include macros to access special-purpose registers (SPRs) 134*53ee8cc1Swenshuai.xi //#include "spr_defs.h" 135*53ee8cc1Swenshuai.xi //#include "AEON_SPR.h" 136*53ee8cc1Swenshuai.xi 137*53ee8cc1Swenshuai.xi #define CYG_HAL_OPENRISC_REG_SIZE 4 138*53ee8cc1Swenshuai.xi 139*53ee8cc1Swenshuai.xi 140*53ee8cc1Swenshuai.xi // ------------------------------------------------------------------------- 141*53ee8cc1Swenshuai.xi // Some useful macros. These are defined here by default. 142*53ee8cc1Swenshuai.xi 143*53ee8cc1Swenshuai.xi // externC is used in mixed C/C++ headers to force C linkage on an external 144*53ee8cc1Swenshuai.xi // definition. It avoids having to put all sorts of ifdefs in. 145*53ee8cc1Swenshuai.xi 146*53ee8cc1Swenshuai.xi #ifdef __cplusplus 147*53ee8cc1Swenshuai.xi # define externC extern "C" 148*53ee8cc1Swenshuai.xi #else 149*53ee8cc1Swenshuai.xi # define externC extern 150*53ee8cc1Swenshuai.xi #endif 151*53ee8cc1Swenshuai.xi 152*53ee8cc1Swenshuai.xi #define CYG_MACRO_START do { 153*53ee8cc1Swenshuai.xi #define CYG_MACRO_END } while (0) 154*53ee8cc1Swenshuai.xi 155*53ee8cc1Swenshuai.xi #define CYG_EMPTY_STATEMENT CYG_MACRO_START CYG_MACRO_END 156*53ee8cc1Swenshuai.xi 157*53ee8cc1Swenshuai.xi #ifndef __ASSEMBLER__ 158*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------- 159*53ee8cc1Swenshuai.xi // Processor saved states: 160*53ee8cc1Swenshuai.xi // The layout of this structure is also defined in "arch.inc", for assembly 161*53ee8cc1Swenshuai.xi // code. Do not change this without changing that (or vice versa). 162*53ee8cc1Swenshuai.xi 163*53ee8cc1Swenshuai.xi #define CYG_HAL_OPENRISC_REG unsigned int 164*53ee8cc1Swenshuai.xi #define CYG_WORD unsigned int 165*53ee8cc1Swenshuai.xi #define CYG_WORD32 unsigned int 166*53ee8cc1Swenshuai.xi #define CYG_ADDRESS unsigned int 167*53ee8cc1Swenshuai.xi #define CYG_ADDRWORD unsigned int 168*53ee8cc1Swenshuai.xi #define cyg_uint32 unsigned int 169*53ee8cc1Swenshuai.xi 170*53ee8cc1Swenshuai.xi typedef struct 171*53ee8cc1Swenshuai.xi { 172*53ee8cc1Swenshuai.xi // These are common to all saved states 173*53ee8cc1Swenshuai.xi CYG_HAL_OPENRISC_REG r[32]; // GPR regs 174*53ee8cc1Swenshuai.xi #ifdef __AEONR2__ 175*53ee8cc1Swenshuai.xi CYG_HAL_OPENRISC_REG machi2; // Highest 32-bits of new 32x32=64 multiplier 176*53ee8cc1Swenshuai.xi #endif 177*53ee8cc1Swenshuai.xi CYG_HAL_OPENRISC_REG machi; // High and low words of 178*53ee8cc1Swenshuai.xi CYG_HAL_OPENRISC_REG maclo; // multiply/accumulate reg 179*53ee8cc1Swenshuai.xi 180*53ee8cc1Swenshuai.xi // These are only saved for exceptions and interrupts 181*53ee8cc1Swenshuai.xi CYG_WORD32 vector; /* Vector number */ 182*53ee8cc1Swenshuai.xi CYG_WORD32 sr; /* Status Reg */ 183*53ee8cc1Swenshuai.xi CYG_HAL_OPENRISC_REG pc; /* Program Counter */ 184*53ee8cc1Swenshuai.xi 185*53ee8cc1Swenshuai.xi // Saved only for exceptions, and not restored when continued: 186*53ee8cc1Swenshuai.xi // Effective address of instruction/data access that caused exception 187*53ee8cc1Swenshuai.xi CYG_HAL_OPENRISC_REG eear; /* Exception effective address reg */ 188*53ee8cc1Swenshuai.xi } HAL_SavedRegisters; 189*53ee8cc1Swenshuai.xi 190*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------- 191*53ee8cc1Swenshuai.xi // Utilities 192*53ee8cc1Swenshuai.xi #ifdef NOS_MIPS 193*53ee8cc1Swenshuai.xi #else //NOS_MIPS 194*53ee8cc1Swenshuai.xi // Move from architecture special register (SPR) 195*53ee8cc1Swenshuai.xi #ifdef __AEONR2__ 196*53ee8cc1Swenshuai.xi 197*53ee8cc1Swenshuai.xi // Move from architecture special register (SPR) 198*53ee8cc1Swenshuai.xi #define MFSPR(_spr_) \ 199*53ee8cc1Swenshuai.xi ({ CYG_HAL_OPENRISC_REG _result_; \ 200*53ee8cc1Swenshuai.xi asm volatile ("l.mfspr %0, %1, 0;" \ 201*53ee8cc1Swenshuai.xi : "=r"(_result_) \ 202*53ee8cc1Swenshuai.xi : "r"(_spr_) \ 203*53ee8cc1Swenshuai.xi ); \ 204*53ee8cc1Swenshuai.xi _result_;}) 205*53ee8cc1Swenshuai.xi 206*53ee8cc1Swenshuai.xi // Move data to architecture special registers (SPR) 207*53ee8cc1Swenshuai.xi #define MTSPR(_spr_, _val_) \ 208*53ee8cc1Swenshuai.xi CYG_MACRO_START \ 209*53ee8cc1Swenshuai.xi CYG_HAL_OPENRISC_REG val = _val_; \ 210*53ee8cc1Swenshuai.xi asm volatile ("l.mtspr %1, %0, 0;" \ 211*53ee8cc1Swenshuai.xi : \ 212*53ee8cc1Swenshuai.xi : "r"(val), "r"(_spr_) \ 213*53ee8cc1Swenshuai.xi ); \ 214*53ee8cc1Swenshuai.xi CYG_MACRO_END 215*53ee8cc1Swenshuai.xi 216*53ee8cc1Swenshuai.xi #else 217*53ee8cc1Swenshuai.xi 218*53ee8cc1Swenshuai.xi // Move from architecture special register (SPR) 219*53ee8cc1Swenshuai.xi #define MFSPR(_spr_) \ 220*53ee8cc1Swenshuai.xi ({ CYG_HAL_OPENRISC_REG _result_; \ 221*53ee8cc1Swenshuai.xi asm volatile ("l.mfspr %0, r0, %1;" \ 222*53ee8cc1Swenshuai.xi : "=r"(_result_) \ 223*53ee8cc1Swenshuai.xi : "K"(_spr_) \ 224*53ee8cc1Swenshuai.xi ); \ 225*53ee8cc1Swenshuai.xi _result_;}) 226*53ee8cc1Swenshuai.xi 227*53ee8cc1Swenshuai.xi // Move data to architecture special registers (SPR) 228*53ee8cc1Swenshuai.xi #define MTSPR(_spr_, _val_) \ 229*53ee8cc1Swenshuai.xi CYG_MACRO_START \ 230*53ee8cc1Swenshuai.xi CYG_HAL_OPENRISC_REG val = _val_; \ 231*53ee8cc1Swenshuai.xi asm volatile ("l.mtspr r0, %0, %1;" \ 232*53ee8cc1Swenshuai.xi : \ 233*53ee8cc1Swenshuai.xi : "r"(val), "K"(_spr_) \ 234*53ee8cc1Swenshuai.xi ); \ 235*53ee8cc1Swenshuai.xi CYG_MACRO_END 236*53ee8cc1Swenshuai.xi 237*53ee8cc1Swenshuai.xi #endif 238*53ee8cc1Swenshuai.xi 239*53ee8cc1Swenshuai.xi 240*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------- 241*53ee8cc1Swenshuai.xi // Exception handling function. 242*53ee8cc1Swenshuai.xi // This function is defined by the kernel according to this prototype. It is 243*53ee8cc1Swenshuai.xi // invoked from the HAL to deal with any CPU exceptions that the HAL does 244*53ee8cc1Swenshuai.xi // not want to deal with itself. It usually invokes the kernel's exception 245*53ee8cc1Swenshuai.xi // delivery mechanism. 246*53ee8cc1Swenshuai.xi 247*53ee8cc1Swenshuai.xi externC void cyg_hal_deliver_exception( CYG_WORD __code, CYG_ADDRWORD __data ); 248*53ee8cc1Swenshuai.xi 249*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------- 250*53ee8cc1Swenshuai.xi // Bit manipulation macros 251*53ee8cc1Swenshuai.xi 252*53ee8cc1Swenshuai.xi externC cyg_uint32 hal_lsbit_index(cyg_uint32 mask); 253*53ee8cc1Swenshuai.xi externC cyg_uint32 hal_msbit_index(cyg_uint32 mask); 254*53ee8cc1Swenshuai.xi 255*53ee8cc1Swenshuai.xi #define HAL_LSBIT_INDEX(index, mask) index = hal_lsbit_index(mask); 256*53ee8cc1Swenshuai.xi 257*53ee8cc1Swenshuai.xi // NOTE - Below can be optimized with l.ff1 instruction if that optional 258*53ee8cc1Swenshuai.xi // instruction is implemented in HW. OR12k does not implement 259*53ee8cc1Swenshuai.xi // it at this time, however. 260*53ee8cc1Swenshuai.xi #define HAL_MSBIT_INDEX(index, mask) index = hal_msbit_index(mask); 261*53ee8cc1Swenshuai.xi 262*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------- 263*53ee8cc1Swenshuai.xi // Context Initialization 264*53ee8cc1Swenshuai.xi 265*53ee8cc1Swenshuai.xi 266*53ee8cc1Swenshuai.xi // Initialize the context of a thread. 267*53ee8cc1Swenshuai.xi // Arguments: 268*53ee8cc1Swenshuai.xi // _sparg_ name of variable containing current sp, will be written with new sp 269*53ee8cc1Swenshuai.xi // _thread_ thread object address, passed as argument to entry point 270*53ee8cc1Swenshuai.xi // _entry_ entry point address. 271*53ee8cc1Swenshuai.xi // _id_ bit pattern used in initializing registers, for debugging. 272*53ee8cc1Swenshuai.xi #define HAL_THREAD_INIT_CONTEXT( _sparg_, _thread_, _entry_, _id_ ) \ 273*53ee8cc1Swenshuai.xi { \ 274*53ee8cc1Swenshuai.xi int _i_; \ 275*53ee8cc1Swenshuai.xi register CYG_WORD _sp_ = ((CYG_WORD)_sparg_); \ 276*53ee8cc1Swenshuai.xi register HAL_SavedRegisters *_regs_; \ 277*53ee8cc1Swenshuai.xi _regs_ = (HAL_SavedRegisters *)(((_sp_) - sizeof(HAL_SavedRegisters)) & ~(CYGARC_ALIGNMENT));\ 278*53ee8cc1Swenshuai.xi _sp_ &= ~(CYGARC_ALIGNMENT); \ 279*53ee8cc1Swenshuai.xi for( _i_ = 1; _i_ < 32; _i_++ ) (_regs_)->r[_i_] = (_id_)|_i_; \ 280*53ee8cc1Swenshuai.xi (_regs_)->r[1] = (CYG_HAL_OPENRISC_REG)(_sp_); /* SP = top of stack */ \ 281*53ee8cc1Swenshuai.xi (_regs_)->r[2] = (CYG_HAL_OPENRISC_REG)(_sp_); /* FP = top of stack */ \ 282*53ee8cc1Swenshuai.xi (_regs_)->r[3] = (CYG_HAL_OPENRISC_REG)(_thread_); /* R3 = arg1 = thread ptr */ \ 283*53ee8cc1Swenshuai.xi (_regs_)->maclo = 0; /* MACLO = 0 */ \ 284*53ee8cc1Swenshuai.xi (_regs_)->machi = 0; /* MACHI = 0 */ \ 285*53ee8cc1Swenshuai.xi (_regs_)->sr = (SPR_SR_TEE|SPR_SR_IEE); /* Interrupts enabled */ \ 286*53ee8cc1Swenshuai.xi (_regs_)->pc = (CYG_HAL_OPENRISC_REG)(_entry_); /* PC = entry point */ \ 287*53ee8cc1Swenshuai.xi (_regs_)->r[9] = (CYG_HAL_OPENRISC_REG)(_entry_); /* PC = entry point */ \ 288*53ee8cc1Swenshuai.xi _sparg_ = (CYG_ADDRESS)_regs_; \ 289*53ee8cc1Swenshuai.xi } 290*53ee8cc1Swenshuai.xi 291*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------- 292*53ee8cc1Swenshuai.xi // Context switch macros. 293*53ee8cc1Swenshuai.xi 294*53ee8cc1Swenshuai.xi // The arguments to these macros are *pointers* to locations where the 295*53ee8cc1Swenshuai.xi // stack pointer of the thread is to be stored/retrieved, i.e. *not* 296*53ee8cc1Swenshuai.xi // the value of the stack pointer itself. 297*53ee8cc1Swenshuai.xi 298*53ee8cc1Swenshuai.xi externC void hal_thread_switch_context( CYG_ADDRESS to, CYG_ADDRESS from ); 299*53ee8cc1Swenshuai.xi externC void hal_thread_load_context( CYG_ADDRESS to ) 300*53ee8cc1Swenshuai.xi __attribute__ ((noreturn)); 301*53ee8cc1Swenshuai.xi 302*53ee8cc1Swenshuai.xi #define HAL_THREAD_SWITCH_CONTEXT(_fspptr_,_tspptr_) \ 303*53ee8cc1Swenshuai.xi hal_thread_switch_context( (CYG_ADDRESS)_tspptr_, \ 304*53ee8cc1Swenshuai.xi (CYG_ADDRESS)_fspptr_); 305*53ee8cc1Swenshuai.xi 306*53ee8cc1Swenshuai.xi #define HAL_THREAD_LOAD_CONTEXT(_tspptr_) \ 307*53ee8cc1Swenshuai.xi hal_thread_load_context( (CYG_ADDRESS)_tspptr_ ); 308*53ee8cc1Swenshuai.xi 309*53ee8cc1Swenshuai.xi // Translate a stack pointer as saved by the thread context macros above into 310*53ee8cc1Swenshuai.xi // a pointer to a HAL_SavedRegisters structure. 311*53ee8cc1Swenshuai.xi #define HAL_THREAD_GET_SAVED_REGISTERS( _sp_, _regs_ ) \ 312*53ee8cc1Swenshuai.xi (_regs_) = (HAL_SavedRegisters *)(_sp_) 313*53ee8cc1Swenshuai.xi 314*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------- 315*53ee8cc1Swenshuai.xi // Execution reorder barrier. 316*53ee8cc1Swenshuai.xi // When optimizing the compiler can reorder code. In multithreaded systems 317*53ee8cc1Swenshuai.xi // where the order of actions is vital, this can sometimes cause problems. 318*53ee8cc1Swenshuai.xi // This macro may be inserted into places where reordering should not happen. 319*53ee8cc1Swenshuai.xi // The "memory" keyword is potentially unnecessary, but it is harmless to 320*53ee8cc1Swenshuai.xi // keep it. 321*53ee8cc1Swenshuai.xi 322*53ee8cc1Swenshuai.xi #define HAL_REORDER_BARRIER() asm volatile ( "" : : : "memory" ) 323*53ee8cc1Swenshuai.xi 324*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------- 325*53ee8cc1Swenshuai.xi // Breakpoint support 326*53ee8cc1Swenshuai.xi // HAL_BREAKPOINT() is a code sequence that will cause a breakpoint to 327*53ee8cc1Swenshuai.xi // occur if executed. 328*53ee8cc1Swenshuai.xi // HAL_BREAKINST is the value of the breakpoint instruction and... 329*53ee8cc1Swenshuai.xi // HAL_BREAKINST_SIZE is its size in bytes and... 330*53ee8cc1Swenshuai.xi // HAL_BREAKINST_TYPE is its type. 331*53ee8cc1Swenshuai.xi 332*53ee8cc1Swenshuai.xi #ifdef __AEONR2__ 333*53ee8cc1Swenshuai.xi #define HAL_BREAKPOINT(_label_) \ 334*53ee8cc1Swenshuai.xi asm volatile (" .globl _" #_label_ ";" \ 335*53ee8cc1Swenshuai.xi "_" #_label_ ":" \ 336*53ee8cc1Swenshuai.xi " bt.trap 1;" \ 337*53ee8cc1Swenshuai.xi ); 338*53ee8cc1Swenshuai.xi 339*53ee8cc1Swenshuai.xi #define HAL_BREAKINST (0x8000) // l.trap 1 instruction 340*53ee8cc1Swenshuai.xi 341*53ee8cc1Swenshuai.xi #define HAL_BREAKINST_SIZE 2 342*53ee8cc1Swenshuai.xi 343*53ee8cc1Swenshuai.xi #define HAL_BREAKINST_TYPE cyg_uint16 344*53ee8cc1Swenshuai.xi #else 345*53ee8cc1Swenshuai.xi #define HAL_BREAKPOINT(_label_) \ 346*53ee8cc1Swenshuai.xi asm volatile (" .globl _" #_label_ ";" \ 347*53ee8cc1Swenshuai.xi "_" #_label_ ":" \ 348*53ee8cc1Swenshuai.xi " l.trap 1;" \ 349*53ee8cc1Swenshuai.xi ); 350*53ee8cc1Swenshuai.xi 351*53ee8cc1Swenshuai.xi #define HAL_BREAKINST (0x21000001) // l.trap 1 instruction 352*53ee8cc1Swenshuai.xi 353*53ee8cc1Swenshuai.xi #define HAL_BREAKINST_SIZE 4 354*53ee8cc1Swenshuai.xi 355*53ee8cc1Swenshuai.xi #define HAL_BREAKINST_TYPE cyg_uint32 356*53ee8cc1Swenshuai.xi #endif //__AEONR2__ 357*53ee8cc1Swenshuai.xi 358*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------- 359*53ee8cc1Swenshuai.xi // Thread register state manipulation for GDB support. 360*53ee8cc1Swenshuai.xi 361*53ee8cc1Swenshuai.xi // Default to a 32 bit register size for GDB register dumps. 362*53ee8cc1Swenshuai.xi #ifndef CYG_HAL_GDB_REG 363*53ee8cc1Swenshuai.xi #define CYG_HAL_GDB_REG CYG_WORD32 364*53ee8cc1Swenshuai.xi #endif 365*53ee8cc1Swenshuai.xi 366*53ee8cc1Swenshuai.xi // Register layout expected by GDB 367*53ee8cc1Swenshuai.xi typedef struct 368*53ee8cc1Swenshuai.xi { 369*53ee8cc1Swenshuai.xi CYG_HAL_OPENRISC_REG r[32]; // GPR regs 370*53ee8cc1Swenshuai.xi CYG_HAL_OPENRISC_REG pc; // Program Counter 371*53ee8cc1Swenshuai.xi CYG_HAL_OPENRISC_REG sr; // Supervisor/Status Reg 372*53ee8cc1Swenshuai.xi } GDB_Registers; 373*53ee8cc1Swenshuai.xi 374*53ee8cc1Swenshuai.xi // Copy a set of registers from a HAL_SavedRegisters structure into a 375*53ee8cc1Swenshuai.xi // GDB_Registers structure. 376*53ee8cc1Swenshuai.xi #define HAL_GET_GDB_REGISTERS( _aregval_, _regs_ ) \ 377*53ee8cc1Swenshuai.xi CYG_MACRO_START \ 378*53ee8cc1Swenshuai.xi GDB_Registers *_gdb_ = (GDB_Registers *)(_aregval_); \ 379*53ee8cc1Swenshuai.xi int _i_; \ 380*53ee8cc1Swenshuai.xi \ 381*53ee8cc1Swenshuai.xi for( _i_ = 0; _i_ < 32; _i_++ ) { \ 382*53ee8cc1Swenshuai.xi _gdb_->r[_i_] = (_regs_)->r[_i_]; \ 383*53ee8cc1Swenshuai.xi } \ 384*53ee8cc1Swenshuai.xi \ 385*53ee8cc1Swenshuai.xi _gdb_->pc = (_regs_)->pc; \ 386*53ee8cc1Swenshuai.xi _gdb_->sr = (_regs_)->sr; \ 387*53ee8cc1Swenshuai.xi CYG_MACRO_END 388*53ee8cc1Swenshuai.xi 389*53ee8cc1Swenshuai.xi // Copy a set of registers from a GDB_Registers structure into a 390*53ee8cc1Swenshuai.xi // HAL_SavedRegisters structure. 391*53ee8cc1Swenshuai.xi #define HAL_SET_GDB_REGISTERS( _regs_ , _aregval_ ) \ 392*53ee8cc1Swenshuai.xi CYG_MACRO_START \ 393*53ee8cc1Swenshuai.xi GDB_Registers *_gdb_ = (GDB_Registers *)(_aregval_); \ 394*53ee8cc1Swenshuai.xi int _i_; \ 395*53ee8cc1Swenshuai.xi \ 396*53ee8cc1Swenshuai.xi for( _i_ = 0; _i_ < 32; _i_++ ) \ 397*53ee8cc1Swenshuai.xi (_regs_)->r[_i_] = _gdb_->r[_i_]; \ 398*53ee8cc1Swenshuai.xi \ 399*53ee8cc1Swenshuai.xi (_regs_)->pc = _gdb_->pc; \ 400*53ee8cc1Swenshuai.xi (_regs_)->sr = _gdb_->sr; \ 401*53ee8cc1Swenshuai.xi CYG_MACRO_END 402*53ee8cc1Swenshuai.xi 403*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------- 404*53ee8cc1Swenshuai.xi // HAL setjmp 405*53ee8cc1Swenshuai.xi // Note: These definitions are repeated in context.S. If changes are 406*53ee8cc1Swenshuai.xi // required remember to update both sets. 407*53ee8cc1Swenshuai.xi 408*53ee8cc1Swenshuai.xi #define CYGARC_JMP_BUF_R1 0 409*53ee8cc1Swenshuai.xi #define CYGARC_JMP_BUF_R2 1 410*53ee8cc1Swenshuai.xi #define CYGARC_JMP_BUF_R9 2 411*53ee8cc1Swenshuai.xi #define CYGARC_JMP_BUF_R10 3 412*53ee8cc1Swenshuai.xi #define CYGARC_JMP_BUF_R12 4 413*53ee8cc1Swenshuai.xi #define CYGARC_JMP_BUF_R14 5 414*53ee8cc1Swenshuai.xi #define CYGARC_JMP_BUF_R16 6 415*53ee8cc1Swenshuai.xi #define CYGARC_JMP_BUF_R18 7 416*53ee8cc1Swenshuai.xi #define CYGARC_JMP_BUF_R20 8 417*53ee8cc1Swenshuai.xi #define CYGARC_JMP_BUF_R22 9 418*53ee8cc1Swenshuai.xi #define CYGARC_JMP_BUF_R24 10 419*53ee8cc1Swenshuai.xi #define CYGARC_JMP_BUF_R26 11 420*53ee8cc1Swenshuai.xi #define CYGARC_JMP_BUF_R28 12 421*53ee8cc1Swenshuai.xi #define CYGARC_JMP_BUF_R30 13 422*53ee8cc1Swenshuai.xi 423*53ee8cc1Swenshuai.xi #define CYGARC_JMP_BUF_SIZE 14 424*53ee8cc1Swenshuai.xi 425*53ee8cc1Swenshuai.xi typedef CYG_HAL_OPENRISC_REG hal_jmp_buf[CYGARC_JMP_BUF_SIZE]; 426*53ee8cc1Swenshuai.xi 427*53ee8cc1Swenshuai.xi externC int hal_setjmp(hal_jmp_buf env); 428*53ee8cc1Swenshuai.xi externC void hal_longjmp(hal_jmp_buf env, int val); 429*53ee8cc1Swenshuai.xi 430*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------- 431*53ee8cc1Swenshuai.xi // Idle thread code. 432*53ee8cc1Swenshuai.xi // This macro is called in the idle thread loop, and gives the HAL the 433*53ee8cc1Swenshuai.xi // chance to run code when no threads are runnable. Typical idle 434*53ee8cc1Swenshuai.xi // thread behaviour might be to halt the processor. 435*53ee8cc1Swenshuai.xi 436*53ee8cc1Swenshuai.xi externC void hal_idle_thread_action(cyg_uint32 loop_count); 437*53ee8cc1Swenshuai.xi 438*53ee8cc1Swenshuai.xi #define HAL_IDLE_THREAD_ACTION(_count_) hal_idle_thread_action(_count_) 439*53ee8cc1Swenshuai.xi 440*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------- 441*53ee8cc1Swenshuai.xi // Minimal and sensible stack sizes: the intention is that applications 442*53ee8cc1Swenshuai.xi // will use these to provide a stack size in the first instance prior to 443*53ee8cc1Swenshuai.xi // proper analysis. Idle thread stack should be this big. 444*53ee8cc1Swenshuai.xi 445*53ee8cc1Swenshuai.xi // *** THESE ARE NOT INTENDED TO BE GUARANTEED SUFFICIENT STACK SIZES *** 446*53ee8cc1Swenshuai.xi // They are, however, enough to start programming. 447*53ee8cc1Swenshuai.xi // You might, for example, need to make your stacks larger if you have 448*53ee8cc1Swenshuai.xi // large "auto" variables. 449*53ee8cc1Swenshuai.xi 450*53ee8cc1Swenshuai.xi // This is not a config option because it should not be adjusted except 451*53ee8cc1Swenshuai.xi // under "enough rope to hang yourself" sort of disclaimers. 452*53ee8cc1Swenshuai.xi 453*53ee8cc1Swenshuai.xi // Typical case stack frame size: return link + 10 caller-saved temporaries + 4 locals. 454*53ee8cc1Swenshuai.xi #define CYGNUM_HAL_STACK_FRAME_SIZE (15 * CYG_HAL_OPENRISC_REG_SIZE) 455*53ee8cc1Swenshuai.xi 456*53ee8cc1Swenshuai.xi // Stack needed for a context switch: 457*53ee8cc1Swenshuai.xi #define CYGNUM_HAL_STACK_CONTEXT_SIZE (38 * 4) // sizeof(HAL_SavedRegisters) 458*53ee8cc1Swenshuai.xi 459*53ee8cc1Swenshuai.xi // Interrupt + call to ISR, interrupt_end() and the DSR 460*53ee8cc1Swenshuai.xi #define CYGNUM_HAL_STACK_INTERRUPT_SIZE (CYGNUM_HAL_STACK_CONTEXT_SIZE + 2*CYGNUM_HAL_STACK_FRAME_SIZE) 461*53ee8cc1Swenshuai.xi 462*53ee8cc1Swenshuai.xi // We define a minimum stack size as the minimum any thread could ever 463*53ee8cc1Swenshuai.xi // legitimately get away with. We can throw asserts if users ask for less 464*53ee8cc1Swenshuai.xi // than this. Allow enough for three interrupt sources - clock, serial and 465*53ee8cc1Swenshuai.xi // one other 466*53ee8cc1Swenshuai.xi 467*53ee8cc1Swenshuai.xi //#define CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK 468*53ee8cc1Swenshuai.xi // If interrupts are segregated onto their own stack... 469*53ee8cc1Swenshuai.xi #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK 470*53ee8cc1Swenshuai.xi 471*53ee8cc1Swenshuai.xi // An interrupt stack which is large enough for all possible interrupt 472*53ee8cc1Swenshuai.xi // conditions (and only used for that purpose) exists. "User" stacks 473*53ee8cc1Swenshuai.xi // can therefore be much smaller 474*53ee8cc1Swenshuai.xi // NOTE - interrupt stack sizes can be smaller if we don't allow interrupts 475*53ee8cc1Swenshuai.xi // to nest. 476*53ee8cc1Swenshuai.xi 477*53ee8cc1Swenshuai.xi # define CYGNUM_HAL_STACK_SIZE_MINIMUM \ 478*53ee8cc1Swenshuai.xi ((3 * 5)*CYGNUM_HAL_STACK_FRAME_SIZE + 2*CYGNUM_HAL_STACK_INTERRUPT_SIZE) 479*53ee8cc1Swenshuai.xi 480*53ee8cc1Swenshuai.xi #else 481*53ee8cc1Swenshuai.xi 482*53ee8cc1Swenshuai.xi // No separate interrupt stack exists. Make sure all threads contain 483*53ee8cc1Swenshuai.xi // a stack sufficiently large 484*53ee8cc1Swenshuai.xi # define CYGNUM_HAL_STACK_SIZE_MINIMUM \ 485*53ee8cc1Swenshuai.xi (( 3*CYGNUM_HAL_STACK_INTERRUPT_SIZE) + \ 486*53ee8cc1Swenshuai.xi (25*CYGNUM_HAL_STACK_FRAME_SIZE)) 487*53ee8cc1Swenshuai.xi #endif 488*53ee8cc1Swenshuai.xi 489*53ee8cc1Swenshuai.xi // Now make a reasonable choice for a typical thread size. Pluck figures 490*53ee8cc1Swenshuai.xi // from thin air and say 40 call frames 491*53ee8cc1Swenshuai.xi #define CYGNUM_HAL_STACK_SIZE_TYPICAL \ 492*53ee8cc1Swenshuai.xi (CYGNUM_HAL_STACK_SIZE_MINIMUM + \ 493*53ee8cc1Swenshuai.xi 40 * (CYGNUM_HAL_STACK_FRAME_SIZE)) 494*53ee8cc1Swenshuai.xi 495*53ee8cc1Swenshuai.xi #endif /* __ASSEMBLER__ */ 496*53ee8cc1Swenshuai.xi 497*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------- 498*53ee8cc1Swenshuai.xi // Macro for finding return address of current function 499*53ee8cc1Swenshuai.xi #define CYGARC_HAL_GET_RETURN_ADDRESS(_x_, _dummy_) \ 500*53ee8cc1Swenshuai.xi asm volatile ( "l.ori %0,r9,0;" : "=r" (_x_) ) 501*53ee8cc1Swenshuai.xi 502*53ee8cc1Swenshuai.xi #define CYGARC_HAL_GET_RETURN_ADDRESS_BACKUP(_dummy_) 503*53ee8cc1Swenshuai.xi #endif//NOS_MIPS 504*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------- 505*53ee8cc1Swenshuai.xi #endif // CYGONCE_HAL_HAL_ARCH_H 506*53ee8cc1Swenshuai.xi // End of hal_arch.h 507