Annotation of GNUtools/cctools/include/architecture/m98k/basic_regs.h, revision 1.1

1.1     ! root        1: /* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved.
        !             2:  *
        !             3:  *     File:   architecture/m98k/basic_regs.h
        !             4:  *     Author: Doug Mitchell, NeXT Computer, Inc.
        !             5:  *
        !             6:  *     Basic m98k registers.
        !             7:  *
        !             8:  * HISTORY
        !             9:  * 05-Nov-92  Doug Mitchell at NeXT
        !            10:  *     Created.
        !            11:  */
        !            12: 
        !            13: #ifndef _ARCH_M98K_BASIC_REGS_H_
        !            14: #define _ARCH_M98K_BASIC_REGS_H_
        !            15: 
        !            16: #import <architecture/m98k/reg_help.h>
        !            17: #import <architecture/nrw/macro_help.h>
        !            18: 
        !            19: /*
        !            20:  * Number of General Purpose registers.
        !            21:  */
        !            22: #define M98K_NGP_REGS  32
        !            23: 
        !            24: /*
        !            25:  * Common half-word used in Machine State Register and in 
        !            26:  * various exception frames. Defined as a macro because the compiler
        !            27:  * will align a struct to a word boundary when used inside another struct.
        !            28:  */
        !            29: #define MSR_BITS                                                          \
        !            30:        unsigned        ee:BIT_WIDTH(15),       /* external intr enable */ \
        !            31:                        pr:BIT_WIDTH(14),       /* problem state        */ \
        !            32:                        fp:BIT_WIDTH(13),       /* floating point avail */ \
        !            33:                        me:BIT_WIDTH(12),       /* machine check enable */ \
        !            34:                        fe0:BIT_WIDTH(11),      /* fp exception mode 0  */ \
        !            35:                        se:BIT_WIDTH(10),       /* single step enable   */ \
        !            36:                        be:BIT_WIDTH(9),        /* branch trace enable  */ \
        !            37:                        fe1:BIT_WIDTH(8),       /* fp exception mode 0  */ \
        !            38:                        rsvd1:BIT_WIDTH(7),     /* reserved             */ \
        !            39:                        ip:BIT_WIDTH(6),        /* interrupt prefix     */ \
        !            40:                        ir:BIT_WIDTH(5),        /* instruction relocate */ \
        !            41:                        dr:BIT_WIDTH(4),        /* data relocate        */ \
        !            42:                        rsvd2:BITS_WIDTH(3,1),  /* reserved             */ \
        !            43:                        psfr:BIT_WIDTH(0)       /* 64 bit mode          */
        !            44: 
        !            45: /*
        !            46:  * Machine state register.
        !            47:  * Read and written via get_msr() and set_msr() inlines, below.
        !            48:  */
        !            49: typedef struct {
        !            50:        unsigned        rsvd3:BITS_WIDTH(31,16);        // reserved
        !            51:                        MSR_BITS;                       // see above
        !            52: } msr_t;
        !            53: 
        !            54: /*
        !            55:  * Data Storage Interrupt Status Register (DSISR)
        !            56:  */
        !            57: typedef struct {
        !            58:        unsigned        dse:BIT_WIDTH(31);      // direct-store error
        !            59:        unsigned        tnf:BIT_WIDTH(30);      // translation not found
        !            60:        unsigned        :BITS_WIDTH(29,28);
        !            61:        unsigned        pe:BIT_WIDTH(27);       // protection error
        !            62:        unsigned        dsr:BIT_WIDTH(26);      // lwarx/stwcx to direct-store
        !            63:        unsigned        rw:BIT_WIDTH(25);       // 1 => store, 0 => load
        !            64:        unsigned        :BITS_WIDTH(24,23);
        !            65:        unsigned        dab:BIT_WIDTH(22);      // data address bkpt (601)
        !            66:        unsigned        ssf:BIT_WIDTH(21);      // seg table search failed
        !            67:        unsigned        :BITS_WIDTH(20,0);
        !            68: } dsisr_t;
        !            69: 
        !            70: /*
        !            71:  * Instruction Storage Interrupt Status Register (really SRR1)
        !            72:  */
        !            73: typedef struct {
        !            74:        unsigned        :BIT_WIDTH(31);
        !            75:        unsigned        tnf:BIT_WIDTH(30);      // translation not found
        !            76:        unsigned        :BIT_WIDTH(29);
        !            77:        unsigned        dse:BIT_WIDTH(28);      // direct-store fetch error
        !            78:        unsigned        pe:BIT_WIDTH(27);       // protection error
        !            79:        unsigned        :BITS_WIDTH(26,22);
        !            80:        unsigned        ssf:BIT_WIDTH(21);      // seg table search failed
        !            81:        unsigned        :BITS_WIDTH(20,16);
        !            82:        MSR_BITS;
        !            83: } isisr_t;
        !            84: 
        !            85: /*
        !            86:  * Alignment Interrupt Status Register (really DSISR)
        !            87:  * NOTE: bit numbers in field *names* are in IBM'ese (0 is MSB).
        !            88:  * FIXME: Yuck!!! Double Yuck!!!
        !            89:  */
        !            90: typedef struct {
        !            91:        unsigned        :BITS_WIDTH(31,20);
        !            92:        unsigned        ds3031:BITS_WIDTH(19,18);// bits 30:31 if DS form
        !            93:        unsigned        :BIT_WIDTH(17);
        !            94:        unsigned        x2930:BITS_WIDTH(16,15); // bits 29:30 if X form
        !            95:        unsigned        x25:BIT_WIDTH(14);       // bit 25 if X form or
        !            96:                                                 // bit 5 if D or DS form
        !            97:        unsigned        x2124:BITS_WIDTH(13,10); // bits 21:24 if X form or
        !            98:                                                 // bits 1:4 if D or DS form
        !            99:        unsigned        all615:BITS_WIDTH(9,0);  // bits 6:15 of instr
        !           100:        MSR_BITS;
        !           101: } aisr_t;
        !           102: 
        !           103: /*
        !           104:  * Program Interrupt Status Register (really SRR1)
        !           105:  */
        !           106: typedef struct {
        !           107:        unsigned        :BITS_WIDTH(31,21);
        !           108:        unsigned        fpee:BIT_WIDTH(20);     // floating pt enable exception
        !           109:        unsigned        ill:BIT_WIDTH(19);      // illegal instruction
        !           110:        unsigned        priv:BIT_WIDTH(18);     // privileged instruction
        !           111:        unsigned        trap:BIT_WIDTH(17);     // trap program interrupt
        !           112:        unsigned        subseq:BIT_WIDTH(16);   // 1 => SRR0 points to
        !           113:                                                // subsequent instruction
        !           114:        MSR_BITS;
        !           115: } pisr_t;
        !           116: 
        !           117: /*
        !           118:  * Condition register. May not be useful in C, let's see...
        !           119:  */
        !           120: typedef struct {
        !           121:        unsigned        lt:BIT_WIDTH(31),       // negative
        !           122:                        gt:BIT_WIDTH(30),       // positive
        !           123:                        eq:BIT_WIDTH(29),       // equal to zero
        !           124:                        so:BIT_WIDTH(28),       // summary overflow
        !           125:                        fx:BIT_WIDTH(27),       // floating point exception
        !           126:                        fex:BIT_WIDTH(26),      // fp enabled exception
        !           127:                        vx:BIT_WIDTH(25),       // fp invalid operation
        !           128:                                                //    exception
        !           129:                        ox:BIT_WIDTH(24),       // fp overflow exception
        !           130:                        rsvd:BITS_WIDTH(23,0);  // reserved
        !           131: } cr_t;
        !           132: 
        !           133: /*
        !           134:  * Program mode register.
        !           135:  * Read and written via get_prog_mode() and set_prog_mode() inlines, below.
        !           136:  *
        !           137:  * NOT SUPPORTED ON M98601
        !           138:  */
        !           139: typedef struct {
        !           140:        unsigned        rsvd1:BITS_WIDTH(31,12),
        !           141:                        fe0:BIT_WIDTH(11),
        !           142:                        rsvd2:BITS_WIDTH(10,9),
        !           143:                        fe1:BIT_WIDTH(8),
        !           144:                        rsvd3:BITS_WIDTH(7,1),
        !           145:                        sf:BIT_WIDTH(0);        // 64 bit mode
        !           146: } prog_mode_t;
        !           147: 
        !           148: /*
        !           149:  * Abstract values representing fe0:fe1.
        !           150:  * See get_fp_exc_mode(), below.
        !           151:  */
        !           152: typedef enum {
        !           153:        FEM_IGNORE_EXCEP,       // ignore exceptions
        !           154:        FEM_IMPR_NONREC,        // imprecise nonrecoverable
        !           155:        FEM_IMPR_RECOV,         // imprecise recoverable
        !           156:        FEM_PRECISE,
        !           157: } fp_exc_mode_t;
        !           158: 
        !           159: 
        !           160: /*
        !           161:  * Special purpose registers.
        !           162:  */
        !           163:  
        !           164: /*
        !           165:  * Processor version register (special purpose register pvr).
        !           166:  */
        !           167: typedef struct {
        !           168:        unsigned        version:BITS_WIDTH(31,16),      
        !           169:                        revision:BITS_WIDTH(15,0);
        !           170: } pvr_t;
        !           171: 
        !           172: /*
        !           173:  * Fixed point exception register (special purpose register xer)
        !           174:  */
        !           175: typedef struct {
        !           176:        unsigned        so:BIT_WIDTH(31),       // summary overflow
        !           177:                        ov:BIT_WIDTH(30),       // overflow
        !           178:                        ca:BIT_WIDTH(29),       // carry
        !           179:                        rsvd1:BITS_WIDTH(28,16),// reserved
        !           180:                        byte:BITS_WIDTH(15,8),  // byte to be compared
        !           181:                        rsvd2:BIT_WIDTH(7),     // reserved
        !           182:                        byte_count:BITS_WIDTH(6,0);     
        !           183: } xer_t;
        !           184: 
        !           185: /*
        !           186:  * Inlines and macros to manipulate the above registers.
        !           187:  */
        !           188:  
        !           189: /*
        !           190:  * Get/set machine state register.
        !           191:  */
        !           192: static __inline__ msr_t
        !           193: get_msr()
        !           194: {
        !           195:        msr_t   __msr_tmp;      
        !           196:        
        !           197:        __asm__ volatile ("mfmsr %0  /* mfmsr */"  \
        !           198:                : "=r" (__msr_tmp));
        !           199:        return __msr_tmp;
        !           200: }
        !           201: 
        !           202: static __inline__ void
        !           203: set_msr(msr_t msr)
        !           204: {
        !           205:        __asm__ volatile ("mtmsr %0 /* mtmsr */ "       \
        !           206:          : : "r" (msr));       
        !           207: }
        !           208: 
        !           209: /*
        !           210:  * Read/write program mode register.
        !           211:  *
        !           212:  * NOT SUPPORTED ON M98601
        !           213:  */
        !           214: static __inline__ prog_mode_t 
        !           215: get_prog_mode()
        !           216: {
        !           217:        prog_mode_t     __pm_tmp;       
        !           218:        __asm__ volatile ("mfpmr %0  /* mfpmr */"       \
        !           219:                : "=r" (__pm_tmp));
        !           220:        return __pm_tmp;                
        !           221: }
        !           222: 
        !           223: static __inline__ void 
        !           224: set_prog_mode(prog_mode_t prog_mode)
        !           225: {
        !           226:        __asm__ volatile ("mtpmr %0; /* mtpmr */ "      \
        !           227:          : : "r" (prog_mode)); 
        !           228: }
        !           229: 
        !           230: 
        !           231: /* 
        !           232:  * Determine current fp_exc_mode_t given prog_mode.
        !           233:  */
        !           234: static __inline__ fp_exc_mode_t
        !           235: get_fp_exc_mode(prog_mode_t prog_mode)
        !           236: {
        !           237:        if(prog_mode.fe0) {
        !           238:                return prog_mode.fe1 ? FEM_PRECISE : FEM_IMPR_RECOV;
        !           239:        }
        !           240:        else {
        !           241:                return prog_mode.fe1 ? FEM_IMPR_NONREC : FEM_IGNORE_EXCEP;
        !           242:        }
        !           243: }
        !           244: 
        !           245: /*
        !           246:  * Software definitions for special purpose registers.
        !           247:  * The same register is used as per_cpu data pointer and
        !           248:  * vector base register. This requires that the vector
        !           249:  * table be the first item in the per_cpu table.
        !           250:  */
        !           251: #define SR_EXCEPTION_TMP_LR    sprg0
        !           252: #define SR_EXCEPTION_TMP_CR    sprg1
        !           253: #define SR_EXCEPTION_TMP_AT    sprg2
        !           254: #define SR_PER_CPU_DATA                sprg3
        !           255: #define SR_VBR                 sprg3
        !           256: 
        !           257: /*
        !           258:  * Get/set special purpose registers.
        !           259:  *
        !           260:  * GET_SPR - get SPR by name.
        !           261:  *
        !           262:  * Example usage:
        !           263:  *
        !           264:  *   {
        !           265:  *     xer_t   some_xer;
        !           266:  *
        !           267:  *     some_xer = GET_SPR(xer_t, xer);
        !           268:  *     ...
        !           269:  *   }
        !           270:  *
        !           271:  * This is a strange one. We're creating a list of C expressions within
        !           272:  * a set of curlies; the last expression ("__spr_tmp;") is the return value
        !           273:  * of the statement created by the curlies.
        !           274:  *
        !           275:  * WARNING: The m88k version of this did not compile with -O2. Let's hope
        !           276:  * the 2.2.2 compiler fixes this.
        !           277:  */
        !           278:  
        !           279: #define GET_SPR(type, spr)                                     \
        !           280: ({                                                             \
        !           281:        unsigned        __spr_tmp;                              \
        !           282:        __asm__ volatile ("mfspr %0, "  STRINGIFY(spr)          \
        !           283:                 : "=r" (__spr_tmp));                           \
        !           284:        *(type *)&__spr_tmp;                                    \
        !           285: })
        !           286: 
        !           287: /* 
        !           288:  * Example usage of SET_SPR:
        !           289:  *
        !           290:  *   {
        !           291:  *     xer_t some_xer;
        !           292:  *
        !           293:  *     ...set up some_xer...
        !           294:  *     SET_SPR(xer, some_xer);
        !           295:  *   }
        !           296:  */
        !           297: #define        SET_SPR(spr, val)                                       \
        !           298: MACRO_BEGIN                                                    \
        !           299:        __typeof__ (val) __spr_tmp = (val);                     \
        !           300:        __asm__ volatile ("mtspr "STRINGIFY(spr) ", %0"         \
        !           301:          : : "r" (__spr_tmp));                                 \
        !           302: MACRO_END
        !           303: 
        !           304: /*
        !           305:  * Fully synchronize instruction stream.
        !           306:  */
        !           307: static __inline__ void
        !           308: m98k_sync()
        !           309: {
        !           310:        __asm__ volatile ("sync         /* sync */"     \
        !           311:                : : );
        !           312: }
        !           313: 
        !           314: #endif _ARCH_M98K_BASIC_REGS_H_
        !           315: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.