Annotation of XNU/EXTERNAL_HEADERS/architecture/ppc/basic_regs.h, revision 1.1

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

unix.superglobalmegacorp.com

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