1*10465441SEvalZero /* 2*10465441SEvalZero * File : mips_asm.h 3*10465441SEvalZero * This file is part of RT-Thread RTOS 4*10465441SEvalZero * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team 5*10465441SEvalZero * 6*10465441SEvalZero * This program is free software; you can redistribute it and/or modify 7*10465441SEvalZero * it under the terms of the GNU General Public License as published by 8*10465441SEvalZero * the Free Software Foundation; either version 2 of the License, or 9*10465441SEvalZero * (at your option) any later version. 10*10465441SEvalZero * 11*10465441SEvalZero * This program is distributed in the hope that it will be useful, 12*10465441SEvalZero * but WITHOUT ANY WARRANTY; without even the implied warranty of 13*10465441SEvalZero * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*10465441SEvalZero * GNU General Public License for more details. 15*10465441SEvalZero * 16*10465441SEvalZero * You should have received a copy of the GNU General Public License along 17*10465441SEvalZero * with this program; if not, write to the Free Software Foundation, Inc., 18*10465441SEvalZero * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19*10465441SEvalZero * 20*10465441SEvalZero * Change Logs: 21*10465441SEvalZero * Date Author Notes 22*10465441SEvalZero * 2016��9��7�� Urey the first version 23*10465441SEvalZero */ 24*10465441SEvalZero 25*10465441SEvalZero #ifndef _MIPS_ASM_H_ 26*10465441SEvalZero #define _MIPS_ASM_H_ 27*10465441SEvalZero 28*10465441SEvalZero 29*10465441SEvalZero /* ********************************************************************* */ 30*10465441SEvalZero /* Interface macro & data definition */ 31*10465441SEvalZero 32*10465441SEvalZero #ifdef __ASSEMBLY__ 33*10465441SEvalZero 34*10465441SEvalZero /******** ASSEMBLER SPECIFIC DEFINITIONS ********/ 35*10465441SEvalZero 36*10465441SEvalZero #ifdef __ghs__ 37*10465441SEvalZero #define ALIGN(x) .##align (1 << (x)) 38*10465441SEvalZero #else 39*10465441SEvalZero #define ALIGN(x) .##align (x) 40*10465441SEvalZero #endif 41*10465441SEvalZero 42*10465441SEvalZero #ifdef __ghs__ 43*10465441SEvalZero #define SET_MIPS3() 44*10465441SEvalZero #define SET_MIPS0() 45*10465441SEvalZero #define SET_PUSH() 46*10465441SEvalZero #define SET_POP() 47*10465441SEvalZero #else 48*10465441SEvalZero #define SET_MIPS3() .##set mips3 49*10465441SEvalZero #define SET_MIPS0() .##set mips0 50*10465441SEvalZero #define SET_PUSH() .##set push 51*10465441SEvalZero #define SET_POP() .##set pop 52*10465441SEvalZero #endif 53*10465441SEvalZero 54*10465441SEvalZero /* Different assemblers have different requirements for how to 55*10465441SEvalZero * indicate that the next section is bss : 56*10465441SEvalZero * 57*10465441SEvalZero * Some use : .bss 58*10465441SEvalZero * Others use : .section bss 59*10465441SEvalZero * 60*10465441SEvalZero * We select which to use based on _BSS_OLD_, which may be defined 61*10465441SEvalZero * in makefile. 62*10465441SEvalZero */ 63*10465441SEvalZero #ifdef _BSS_OLD_ 64*10465441SEvalZero #define BSS .##section bss 65*10465441SEvalZero #else 66*10465441SEvalZero #define BSS .##bss 67*10465441SEvalZero #endif 68*10465441SEvalZero 69*10465441SEvalZero #define LEAF(name)\ 70*10465441SEvalZero .##text;\ 71*10465441SEvalZero .##globl name;\ 72*10465441SEvalZero .##ent name;\ 73*10465441SEvalZero name: 74*10465441SEvalZero 75*10465441SEvalZero 76*10465441SEvalZero #define SLEAF(name)\ 77*10465441SEvalZero .##text;\ 78*10465441SEvalZero .##ent name;\ 79*10465441SEvalZero name: 80*10465441SEvalZero 81*10465441SEvalZero 82*10465441SEvalZero #ifdef __ghs__ 83*10465441SEvalZero #define END(name)\ 84*10465441SEvalZero .##end name 85*10465441SEvalZero #else 86*10465441SEvalZero #define END(name)\ 87*10465441SEvalZero .##size name,.-name;\ 88*10465441SEvalZero .##end name 89*10465441SEvalZero #endif 90*10465441SEvalZero 91*10465441SEvalZero 92*10465441SEvalZero #define EXTERN(name) 93*10465441SEvalZero 94*10465441SEvalZero #else 95*10465441SEvalZero 96*10465441SEvalZero #define U64 unsigned long long 97*10465441SEvalZero #define U32 unsigned int 98*10465441SEvalZero #define U16 unsigned short 99*10465441SEvalZero #define U8 unsigned char 100*10465441SEvalZero #define S64 signed long long 101*10465441SEvalZero #define S32 int 102*10465441SEvalZero #define S16 short int 103*10465441SEvalZero #define S8 signed char 104*10465441SEvalZero //#define bool U8 105*10465441SEvalZero 106*10465441SEvalZero #ifndef _SIZE_T_ 107*10465441SEvalZero #define _SIZE_T_ 108*10465441SEvalZero #ifdef __ghs__ 109*10465441SEvalZero typedef unsigned int size_t; 110*10465441SEvalZero #else 111*10465441SEvalZero typedef unsigned long size_t; 112*10465441SEvalZero #endif 113*10465441SEvalZero #endif 114*10465441SEvalZero 115*10465441SEvalZero /* Sets the result on bPort */ 116*10465441SEvalZero #define BIT_SET(bPort,bBitMask) (bPort |= bBitMask) 117*10465441SEvalZero #define BIT_CLR(bPort,bBitMask) (bPort &= ~bBitMask) 118*10465441SEvalZero 119*10465441SEvalZero /* Returns the result */ 120*10465441SEvalZero #define GET_BIT_SET(bPort,bBitMask) (bPort | bBitMask) 121*10465441SEvalZero #define GET_BIT_CLR(bPort,bBitMask) (bPort & ~bBitMask) 122*10465441SEvalZero 123*10465441SEvalZero /* Returns 0 if the condition is False & a non-zero value if it is True */ 124*10465441SEvalZero #define TEST_BIT_SET(bPort,bBitMask) (bPort & bBitMask) 125*10465441SEvalZero #define TEST_BIT_CLR(bPort,bBitMask) ((~bPort) & bBitMask) 126*10465441SEvalZero 127*10465441SEvalZero /* Split union definitions */ 128*10465441SEvalZero typedef union tunSU16 129*10465441SEvalZero { 130*10465441SEvalZero U16 hwHW; 131*10465441SEvalZero struct tst2U8 132*10465441SEvalZero { 133*10465441SEvalZero U8 bB0; 134*10465441SEvalZero U8 bB1; 135*10465441SEvalZero }st2U8; 136*10465441SEvalZero }tunSU16; 137*10465441SEvalZero 138*10465441SEvalZero typedef union tunSU32 139*10465441SEvalZero { 140*10465441SEvalZero U32 wW; 141*10465441SEvalZero struct tst2U16 142*10465441SEvalZero { 143*10465441SEvalZero U16 hwHW0; 144*10465441SEvalZero U16 hwHW1; 145*10465441SEvalZero }st2U16; 146*10465441SEvalZero struct tst4U8 147*10465441SEvalZero { 148*10465441SEvalZero U8 bB0; 149*10465441SEvalZero U8 bB1; 150*10465441SEvalZero U8 bB2; 151*10465441SEvalZero U8 bB3; 152*10465441SEvalZero }st4U8; 153*10465441SEvalZero }tunSU32; 154*10465441SEvalZero 155*10465441SEvalZero #endif /* #ifdef __ASSEMBLY__ */ 156*10465441SEvalZero 157*10465441SEvalZero 158*10465441SEvalZero /******** DEFINITIONS FOR BOTH ASSEMBLER AND C ********/ 159*10465441SEvalZero 160*10465441SEvalZero 161*10465441SEvalZero #define NO_ERR 0x00000000 /* operation completed successfully */ 162*10465441SEvalZero #define ERR 0xffffffff /* operation completed not successfully */ 163*10465441SEvalZero 164*10465441SEvalZero #define False 0 165*10465441SEvalZero #define True !False 166*10465441SEvalZero 167*10465441SEvalZero #ifndef NULL 168*10465441SEvalZero #define NULL ((void *)0) 169*10465441SEvalZero #endif//NULL 170*10465441SEvalZero 171*10465441SEvalZero #ifndef MIN 172*10465441SEvalZero #define MIN(x,y) ((x) < (y) ? (x) : (y)) 173*10465441SEvalZero #endif//MIN 174*10465441SEvalZero 175*10465441SEvalZero #ifndef MAX 176*10465441SEvalZero #define MAX(x,y) ((x) > (y) ? (x) : (y)) 177*10465441SEvalZero #endif//MAX 178*10465441SEvalZero 179*10465441SEvalZero #define MAXUINT(w) (\ 180*10465441SEvalZero ((w) == sizeof(U8)) ? 0xFFU :\ 181*10465441SEvalZero ((w) == sizeof(U16)) ? 0xFFFFU :\ 182*10465441SEvalZero ((w) == sizeof(U32)) ? 0xFFFFFFFFU : 0\ 183*10465441SEvalZero ) 184*10465441SEvalZero 185*10465441SEvalZero #define MAXINT(w) (\ 186*10465441SEvalZero ((w) == sizeof(S8)) ? 0x7F :\ 187*10465441SEvalZero ((w) == sizeof(S16)) ? 0x7FFF :\ 188*10465441SEvalZero ((w) == sizeof(S32)) ? 0x7FFFFFFF : 0\ 189*10465441SEvalZero ) 190*10465441SEvalZero 191*10465441SEvalZero #define MSK(n) ((1 << (n)) - 1) 192*10465441SEvalZero 193*10465441SEvalZero #define KUSEG_MSK 0x80000000 194*10465441SEvalZero #define KSEG_MSK 0xE0000000 195*10465441SEvalZero 196*10465441SEvalZero #define KUSEGBASE 0x00000000 197*10465441SEvalZero #define KSEG0BASE 0x80000000 198*10465441SEvalZero #define KSEG1BASE 0xA0000000 199*10465441SEvalZero #define KSSEGBASE 0xC0000000 200*10465441SEvalZero #define KSEG3BASE 0xE0000000 201*10465441SEvalZero 202*10465441SEvalZero /* Below macros perform the following functions : 203*10465441SEvalZero * 204*10465441SEvalZero * KSEG0 : Converts KSEG0/1 or physical addr (below 0.5GB) to KSEG0. 205*10465441SEvalZero * KSEG1 : Converts KSEG0/1 or physical addr (below 0.5GB) to KSEG1. 206*10465441SEvalZero * PHYS : Converts KSEG0/1 or physical addr (below 0.5GB) to physical address. 207*10465441SEvalZero * KSSEG : Not relevant for converting, but used for determining range. 208*10465441SEvalZero * KSEG3 : Not relevant for converting, but used for determining range. 209*10465441SEvalZero * KUSEG : Not relevant for converting, but used for determining range. 210*10465441SEvalZero * KSEG0A : Same as KSEG0 but operates on register rather than constant. 211*10465441SEvalZero * KSEG1A : Same as KSEG1 but operates on register rather than constant. 212*10465441SEvalZero * PHYSA : Same as PHYS but operates on register rather than constant. 213*10465441SEvalZero * CACHED : Alias for KSEG0 macro . 214*10465441SEvalZero * (Note that KSEG0 cache attribute is determined by K0 215*10465441SEvalZero * field of Config register, but this is typically cached). 216*10465441SEvalZero * UNCACHED : Alias for KSEG1 macro . 217*10465441SEvalZero */ 218*10465441SEvalZero #ifdef __ASSEMBLY__ 219*10465441SEvalZero #define KSEG0(addr) (((addr) & ~KSEG_MSK) | KSEG0BASE) 220*10465441SEvalZero #define KSEG1(addr) (((addr) & ~KSEG_MSK) | KSEG1BASE) 221*10465441SEvalZero #define KSSEG(addr) (((addr) & ~KSEG_MSK) | KSSEGBASE) 222*10465441SEvalZero #define KSEG3(addr) (((addr) & ~KSEG_MSK) | KSEG3BASE) 223*10465441SEvalZero #define KUSEG(addr) (((addr) & ~KUSEG_MSK) | KUSEGBASE) 224*10465441SEvalZero #define PHYS(addr) ( (addr) & ~KSEG_MSK) 225*10465441SEvalZero #define KSEG0A(reg) and reg, ~KSEG_MSK; or reg, KSEG0BASE 226*10465441SEvalZero #define KSEG1A(reg) and reg, ~KSEG_MSK; or reg, KSEG1BASE 227*10465441SEvalZero #define PHYSA(reg) and reg, ~KSEG_MSK 228*10465441SEvalZero #else 229*10465441SEvalZero #define KSEG0(addr) (((U32)(addr) & ~KSEG_MSK) | KSEG0BASE) 230*10465441SEvalZero #define KSEG1(addr) (((U32)(addr) & ~KSEG_MSK) | KSEG1BASE) 231*10465441SEvalZero #define KSSEG(addr) (((U32)(addr) & ~KSEG_MSK) | KSSEGBASE) 232*10465441SEvalZero #define KSEG3(addr) (((U32)(addr) & ~KSEG_MSK) | KSEG3BASE) 233*10465441SEvalZero #define KUSEG(addr) (((U32)(addr) & ~KUSEG_MSK) | KUSEGBASE) 234*10465441SEvalZero #define PHYS(addr) ((U32)(addr) & ~KSEG_MSK) 235*10465441SEvalZero #endif 236*10465441SEvalZero 237*10465441SEvalZero #define CACHED(addr) KSEG0(addr) 238*10465441SEvalZero #define UNCACHED(addr) KSEG1(addr) 239*10465441SEvalZero 240*10465441SEvalZero 241*10465441SEvalZero #ifdef __ASSEMBLY__ 242*10465441SEvalZero /* Macroes to access variables at constant addresses 243*10465441SEvalZero * Compensates for signed 16 bit displacement 244*10465441SEvalZero * Typical use: li a0, HIKSEG1(ATLAS_ASCIIWORD) 245*10465441SEvalZero * sw v1, LO_OFFS(ATLAS_ASCIIWORD)(a0) 246*10465441SEvalZero */ 247*10465441SEvalZero #define HIKSEG0(addr) ((KSEG0(addr) + 0x8000) & 0xffff0000) 248*10465441SEvalZero #define HIKSEG1(addr) ((KSEG1(addr) + 0x8000) & 0xffff0000) 249*10465441SEvalZero #define HI_PART(addr) (((addr) + 0x8000) & 0xffff0000) 250*10465441SEvalZero #define LO_OFFS(addr) ((addr) & 0xffff) 251*10465441SEvalZero #endif 252*10465441SEvalZero 253*10465441SEvalZero 254*10465441SEvalZero /* Most/Least significant 32 bit from 64 bit double word */ 255*10465441SEvalZero #define HI32(data64) ((U32)(data64 >> 32)) 256*10465441SEvalZero #define LO32(data64) ((U32)(data64 & 0xFFFFFFFF)) 257*10465441SEvalZero 258*10465441SEvalZero #if ((!defined(__ASSEMBLY__)) && (!defined(__LANGUAGE_ASSEMBLY))) 259*10465441SEvalZero #define REG8( addr ) (*(volatile U8 *) (addr)) 260*10465441SEvalZero #define REG16( addr ) (*(volatile U16 *)(addr)) 261*10465441SEvalZero #define REG32( addr ) (*(volatile U32 *)(addr)) 262*10465441SEvalZero #define REG64( addr ) (*(volatile U64 *)(addr)) 263*10465441SEvalZero #endif 264*10465441SEvalZero 265*10465441SEvalZero /* Register field mapping */ 266*10465441SEvalZero #define REGFIELD(reg, rfld) (((reg) & rfld##_MSK) >> rfld##_SHF) 267*10465441SEvalZero 268*10465441SEvalZero /* absolute register address, access */ 269*10465441SEvalZero #define REGA(addr) REG32(addr) 270*10465441SEvalZero 271*10465441SEvalZero /* physical register address, access: base address + offsett */ 272*10465441SEvalZero #define REGP(base,phys) REG32( (U32)(base) + (phys) ) 273*10465441SEvalZero 274*10465441SEvalZero /* relative register address, access: base address + offsett */ 275*10465441SEvalZero #define REG(base,offs) REG32( (U32)(base) + offs##_##OFS ) 276*10465441SEvalZero 277*10465441SEvalZero /* relative register address, access: base address + offsett */ 278*10465441SEvalZero #define REG_8(base,offs) REG8( (U32)(base) + offs##_##OFS ) 279*10465441SEvalZero 280*10465441SEvalZero /* relative register address, access: base address + offsett */ 281*10465441SEvalZero #define REG_16(base,offs) REG16( (U32)(base) + offs##_##OFS ) 282*10465441SEvalZero 283*10465441SEvalZero /* relative register address, access: base address + offsett */ 284*10465441SEvalZero #define REG_64(base,offs) REG64( (U32)(base) + offs##_##OFS ) 285*10465441SEvalZero 286*10465441SEvalZero /************************************** 287*10465441SEvalZero * Macroes not used by YAMON any more 288*10465441SEvalZero * (kept for backwards compatibility) 289*10465441SEvalZero */ 290*10465441SEvalZero /* register read field */ 291*10465441SEvalZero #define REGARD(addr,fld) ((REGA(addr) & addr##_##fld##_##MSK) \ 292*10465441SEvalZero >> addr##_##fld##_##SHF) 293*10465441SEvalZero 294*10465441SEvalZero /* register write numeric field value */ 295*10465441SEvalZero #define REGAWRI(addr,fld,intval) ((REGA(addr) & ~(addr##_##fld##_##MSK))\ 296*10465441SEvalZero | ((intval) << addr##_##fld##_##SHF)) 297*10465441SEvalZero 298*10465441SEvalZero /* register write enumerated field value */ 299*10465441SEvalZero #define REGAWRE(addr,fld,enumval) ((REGA(addr) & ~(addr##_##fld##_##MSK))\ 300*10465441SEvalZero | ((addr##_##fld##_##enumval) << addr##_##fld##_##SHF)) 301*10465441SEvalZero 302*10465441SEvalZero 303*10465441SEvalZero /* Examples: 304*10465441SEvalZero * 305*10465441SEvalZero * exccode = REGARD(CPU_CAUSE,EXC); 306*10465441SEvalZero * 307*10465441SEvalZero * REGA(SDR_CONTROL) = REGAWRI(OSG_CONTROL,TMO,17) 308*10465441SEvalZero * | REGAWRE(OSG_CONTROL,DTYPE,PC1); 309*10465441SEvalZero */ 310*10465441SEvalZero 311*10465441SEvalZero 312*10465441SEvalZero /* register read field */ 313*10465441SEvalZero #define REGRD(base,offs,fld) ((REG(base,offs) & offs##_##fld##_##MSK) \ 314*10465441SEvalZero >> offs##_##fld##_##SHF) 315*10465441SEvalZero 316*10465441SEvalZero /* register write numeric field value */ 317*10465441SEvalZero #define REGWRI(base,offs,fld,intval)((REG(base,offs)& ~(offs##_##fld##_##MSK))\ 318*10465441SEvalZero | (((intval) << offs##_##fld##_##SHF) & offs##_##fld##_##MSK)) 319*10465441SEvalZero 320*10465441SEvalZero /* register write enumerated field value */ 321*10465441SEvalZero #define REGWRE(base,offs,fld,enumval)((REG(base,offs) & ~(offs##_##fld##_##MSK))\ 322*10465441SEvalZero | ((offs##_##fld##_##enumval) << offs##_##fld##_##SHF)) 323*10465441SEvalZero 324*10465441SEvalZero 325*10465441SEvalZero /* physical register read field */ 326*10465441SEvalZero #define REGPRD(base,phys,fld) ((REGP(base,phys) & phys##_##fld##_##MSK) \ 327*10465441SEvalZero >> phys##_##fld##_##SHF) 328*10465441SEvalZero 329*10465441SEvalZero /* physical register write numeric field value */ 330*10465441SEvalZero #define REGPWRI(base,phys,fld,intval)((REGP(base,phys)& ~(phys##_##fld##_##MSK))\ 331*10465441SEvalZero | ((intval) << phys##_##fld##_##SHF)) 332*10465441SEvalZero 333*10465441SEvalZero /* physical register write enumerated field value */ 334*10465441SEvalZero #define REGPWRE(base,phys,fld,enumval)((REGP(base,phys) & ~(phys##_##fld##_##MSK))\ 335*10465441SEvalZero | ((phys##_##fld##_##enumval) << phys##_##fld##_##SHF)) 336*10465441SEvalZero /* 337*10465441SEvalZero * End of macroes not used by YAMON any more 338*10465441SEvalZero *********************************************/ 339*10465441SEvalZero 340*10465441SEvalZero /* Endian related macros */ 341*10465441SEvalZero 342*10465441SEvalZero #define SWAP_BYTEADDR32( addr ) ( (addr) ^ 0x3 ) 343*10465441SEvalZero #define SWAP_U16ADDR32( addr ) ( (addr) ^ 0x2 ) 344*10465441SEvalZero 345*10465441SEvalZero /* Set byte address to little endian format */ 346*10465441SEvalZero #ifdef EL 347*10465441SEvalZero #define SWAP_BYTEADDR_EL(addr) addr 348*10465441SEvalZero #else 349*10465441SEvalZero #define SWAP_BYTEADDR_EL(addr) SWAP_BYTEADDR32( addr ) 350*10465441SEvalZero #endif 351*10465441SEvalZero 352*10465441SEvalZero /* Set byte address to big endian format */ 353*10465441SEvalZero #ifdef EB 354*10465441SEvalZero #define SWAP_BYTEADDR_EB(addr) addr 355*10465441SEvalZero #else 356*10465441SEvalZero #define SWAP_BYTEADDR_EB(addr) SWAP_BYTEADDR32( addr ) 357*10465441SEvalZero #endif 358*10465441SEvalZero 359*10465441SEvalZero /* Set U16 address to little endian format */ 360*10465441SEvalZero #ifdef EL 361*10465441SEvalZero #define SWAP_U16ADDR_EL(addr) addr 362*10465441SEvalZero #else 363*10465441SEvalZero #define SWAP_U16ADDR_EL(addr) SWAP_U16ADDR32( addr ) 364*10465441SEvalZero #endif 365*10465441SEvalZero 366*10465441SEvalZero /* Set U16 address to big endian format */ 367*10465441SEvalZero #ifdef EB 368*10465441SEvalZero #define SWAP_U16ADDR_EB(addr) addr 369*10465441SEvalZero #else 370*10465441SEvalZero #define SWAP_U16ADDR_EB(addr) SWAP_U16ADDR32( addr ) 371*10465441SEvalZero #endif 372*10465441SEvalZero 373*10465441SEvalZero #ifdef EL 374*10465441SEvalZero #define REGW32LE(addr, data) REG32(addr) = (data) 375*10465441SEvalZero #define REGR32LE(addr, data) (data) = REG32(addr) 376*10465441SEvalZero #else 377*10465441SEvalZero #define REGW32LE(addr, data) REG32(addr) = SWAPEND32(data) 378*10465441SEvalZero #define REGR32LE(addr, data) (data) = REG32(addr), (data) = SWAPEND32(data) 379*10465441SEvalZero #endif 380*10465441SEvalZero 381*10465441SEvalZero /* Set of 'LE'-macros, convert by BE: */ 382*10465441SEvalZero #ifdef EL 383*10465441SEvalZero #define CPU_TO_LE32( value ) (value) 384*10465441SEvalZero #define LE32_TO_CPU( value ) (value) 385*10465441SEvalZero 386*10465441SEvalZero #define CPU_TO_LE16( value ) (value) 387*10465441SEvalZero #define LE16_TO_CPU( value ) (value) 388*10465441SEvalZero #else 389*10465441SEvalZero #define CPU_TO_LE32( value ) ( ( ((U32)value) << 24) | \ 390*10465441SEvalZero ((0x0000FF00UL & ((U32)value)) << 8) | \ 391*10465441SEvalZero ((0x00FF0000UL & ((U32)value)) >> 8) | \ 392*10465441SEvalZero ( ((U32)value) >> 24) ) 393*10465441SEvalZero #define LE32_TO_CPU( value ) CPU_TO_LE32( value ) 394*10465441SEvalZero 395*10465441SEvalZero #define CPU_TO_LE16( value ) ( ((U16)(((U16)value) << 8)) | \ 396*10465441SEvalZero ((U16)(((U16)value) >> 8)) ) 397*10465441SEvalZero #define LE16_TO_CPU( value ) CPU_TO_LE16( value ) 398*10465441SEvalZero #endif 399*10465441SEvalZero 400*10465441SEvalZero /* Set of 'BE'-macros, convert by LE: */ 401*10465441SEvalZero #ifdef EB 402*10465441SEvalZero #define CPU_TO_BE32( value ) (value) 403*10465441SEvalZero #define BE32_TO_CPU( value ) (value) 404*10465441SEvalZero 405*10465441SEvalZero #define CPU_TO_BE16( value ) (value) 406*10465441SEvalZero #define BE16_TO_CPU( value ) (value) 407*10465441SEvalZero #else 408*10465441SEvalZero #define CPU_TO_BE32( value ) ( ( ((U32)value) << 24) | \ 409*10465441SEvalZero ((0x0000FF00UL & ((U32)value)) << 8) | \ 410*10465441SEvalZero ((0x00FF0000UL & ((U32)value)) >> 8) | \ 411*10465441SEvalZero ( ((U32)value) >> 24) ) 412*10465441SEvalZero #define BE32_TO_CPU( value ) CPU_TO_BE32( value ) 413*10465441SEvalZero 414*10465441SEvalZero #define CPU_TO_BE16( value ) ( ((U16)(((U16)value) << 8)) | \ 415*10465441SEvalZero ((U16)(((U16)value) >> 8)) ) 416*10465441SEvalZero #define BE16_TO_CPU( value ) CPU_TO_BE16( value ) 417*10465441SEvalZero #endif 418*10465441SEvalZero 419*10465441SEvalZero 420*10465441SEvalZero /* Control characters */ 421*10465441SEvalZero #define CTRL_A ('A'-0x40) 422*10465441SEvalZero #define CTRL_B ('B'-0x40) 423*10465441SEvalZero #define CTRL_C ('C'-0x40) 424*10465441SEvalZero #define CTRL_D ('D'-0x40) 425*10465441SEvalZero #define CTRL_E ('E'-0x40) 426*10465441SEvalZero #define CTRL_F ('F'-0x40) 427*10465441SEvalZero #define CTRL_H ('H'-0x40) 428*10465441SEvalZero #define CTRL_K ('K'-0x40) 429*10465441SEvalZero #define CTRL_N ('N'-0x40) 430*10465441SEvalZero #define CTRL_P ('P'-0x40) 431*10465441SEvalZero #define CTRL_U ('U'-0x40) 432*10465441SEvalZero #define BACKSPACE 0x08 433*10465441SEvalZero #define DEL 0x7F 434*10465441SEvalZero #define TAB 0x09 435*10465441SEvalZero #define CR 0x0D /* Enter Key */ 436*10465441SEvalZero #define LF 0x0A 437*10465441SEvalZero #define ESC 0x1B 438*10465441SEvalZero #define SP 0x20 439*10465441SEvalZero #define CSI 0x9B 440*10465441SEvalZero 441*10465441SEvalZero 442*10465441SEvalZero /* DEF2STR(x) converts #define symbol to string */ 443*10465441SEvalZero #define DEF2STR1(x) #x 444*10465441SEvalZero #define DEF2STR(x) DEF2STR1(x) 445*10465441SEvalZero 446*10465441SEvalZero 447*10465441SEvalZero #endif /* _MIPS_ASM_H_ */ 448