Annotation of XNU/osfmk/ppc/proc_reg.h, revision 1.1.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: /*
                     23:  * @OSF_COPYRIGHT@
                     24:  */
                     25: 
                     26: #ifndef _PPC_PROC_REG_H_
                     27: #define _PPC_PROC_REG_H_
                     28: 
                     29: #include <mach/boolean.h>
                     30: 
                     31: /* Define some useful masks that convert from bit numbers */
                     32: 
                     33: #if __PPC__
                     34: #if _BIG_ENDIAN
                     35: #ifndef ENDIAN_MASK
                     36: #define ENDIAN_MASK(val,size) (1 << ((size-1) - val))
                     37: #endif
                     38: #else
                     39: #error code not ported to little endian targets yet
                     40: #endif /* _BIG_ENDIAN */
                     41: #endif /* __PPC__ */
                     42: 
                     43: #define MASK32(PART)   ENDIAN_MASK(PART ## _BIT, 32)
                     44: #define MASK16(PART)   ENDIAN_MASK(PART ## _BIT, 16)
                     45: #define MASK8(PART)    ENDIAN_MASK(PART ## _BIT, 8)
                     46: 
                     47: #undef MASK
                     48: #define MASK(PART)     MASK32(PART)
                     49: 
                     50: #define BITS_PER_WORD  32
                     51: #define BITS_PER_WORD_POW2 5
                     52: 
                     53: /* Defines for decoding the MSR bits */
                     54: 
                     55: #define MSR_SF_BIT     0
                     56: #define MSR_RES1_BIT   1
                     57: #define MSR_RES2_BIT   2
                     58: #define MSR_RES3_BIT   3
                     59: #define MSR_RES4_BIT   4
                     60: #define MSR_RES5_BIT   5
                     61: #define MSR_VEC_BIT            6
                     62: #define MSR_RES7_BIT   7
                     63: #define MSR_RES8_BIT   8
                     64: #define MSR_RES9_BIT   9
                     65: #define MSR_RES10_BIT  10
                     66: #define MSR_RES11_BIT  11
                     67: #define MSR_KEY_BIT    12      /* Key bit on 603e (not on 603) */
                     68: #define        MSR_POW_BIT     13
                     69: #define MSR_TGPR_BIT   14      /* Temporary GPR mappings on 603/603e */
                     70: #define MSR_ILE_BIT    15
                     71: #define        MSR_EE_BIT      16
                     72: #define        MSR_PR_BIT      17
                     73: #define MSR_FP_BIT     18
                     74: #define MSR_ME_BIT     19
                     75: #define MSR_FE0_BIT    20
                     76: #define MSR_SE_BIT     21
                     77: #define        MSR_BE_BIT      22
                     78: #define MSR_FE1_BIT    23
                     79: #define MSR_RES24_BIT  24      /* AL bit in power architectures */
                     80: #define MSR_IP_BIT      25
                     81: #define MSR_IR_BIT      26
                     82: #define MSR_DR_BIT      27
                     83: #define MSR_RES28_BIT  28
                     84: #define MSR_PM_BIT     29
                     85: #define        MSR_RI_BIT      30
                     86: #define MSR_LE_BIT     31
                     87: 
                     88: /* MSR for kernel mode, interrupts disabled, running in virtual mode */
                     89: #define MSR_SUPERVISOR_INT_OFF (MASK(MSR_ME) | MASK(MSR_IR) | MASK(MSR_DR))  
                     90: 
                     91: /* MSR for above but with interrupts enabled */
                     92: #define MSR_SUPERVISOR_INT_ON (MSR_SUPERVISOR_INT_OFF | MASK(MSR_EE))
                     93: 
                     94: /* MSR for physical mode code */
                     95: #define MSR_VM_OFF     (MASK(MSR_ME))
                     96: 
                     97: /* MSR for physical instruction, virtual data */
                     98: #define MSR_PHYS_INST_VIRT_DATA     (MASK(MSR_ME) | MASK(MSR_IR))
                     99: 
                    100: /* MSR mask for user-exported bits - identify bits that must be set/reset */
                    101: 
                    102: /* SET - external exceptions, machine check, vm on, user-level privs */
                    103: #define MSR_EXPORT_MASK_SET    (MASK(MSR_EE)| MASK(MSR_ME)| \
                    104:                                 MASK(MSR_IR)|MASK(MSR_DR)|MASK(MSR_PR))
                    105: 
                    106: /* only the following bits may be changed by a task */
                    107: #define MSR_IMPORT_BITS (MASK(MSR_FE0)|MASK(MSR_SE)|MASK(MSR_BE)| \
                    108:                         MASK(MSR_FE1)| MASK(MSR_PM))
                    109: 
                    110: #define MSR_PREPARE_FOR_IMPORT(origmsr, newmsr) \
                    111:        ((origmsr & ~MSR_IMPORT_BITS) | (newmsr & MSR_IMPORT_BITS))
                    112: 
                    113: #define MSR_VEC_ON     (MASK(MSR_VEC))
                    114: 
                    115: #define USER_MODE(msr) (msr & MASK(MSR_PR) ? TRUE : FALSE)
                    116: 
                    117: /* seg reg values must be simple expressions so that assembler can cope */
                    118: #define SEG_REG_INVALID 0x0000
                    119: #define KERNEL_SEG_REG0_VALUE 0x20000000 /* T=0,Ks=0,Ku=1 PPC_SID_KERNEL=0*/
                    120: 
                    121: /* the following segment register values are only used prior to the probe,
                    122:  * they map the various device areas 1-1 on 601 machines
                    123:  */
                    124: #define KERNEL_SEG_REG5_VALUE 0xa7F00005 /* T=1,Ks=0,Ku=1,BUID=0x7F,SR=5 */
                    125: #define KERNEL_SEG_REG8_VALUE 0xa7F00008 /* T=1,Ks=0,Ku=1,BUID=0x7F,SR=8 */
                    126: #define KERNEL_SEG_REG9_VALUE 0xa7F00009 /* T=1,Ks=0,Ku=1,BUID=0x7F,SR=9 */
                    127: #define KERNEL_SEG_REG10_VALUE 0xa7F0000a /* T=1,Ks=0,Ku=1,BUID=0x7F,SR=a */
                    128: #define KERNEL_SEG_REG11_VALUE 0xa7F0000b /* T=1,Ks=0,Ku=1,BUID=0x7F,SR=b */
                    129: #define KERNEL_SEG_REG12_VALUE 0xa7F0000c /* T=1,Ks=0,Ku=1,BUID=0x7F,SR=c */
                    130: #define KERNEL_SEG_REG13_VALUE 0xa7F0000d /* T=1,Ks=0,Ku=1,BUID=0x7F,SR=d */
                    131: #define KERNEL_SEG_REG14_VALUE 0xa7F0000e /* T=1,Ks=0,Ku=1,BUID=0x7F,SR=e */
                    132: #define KERNEL_SEG_REG15_VALUE 0xa7F0000f /* T=1,Ks=0,Ku=1,BUID=0x7F,SR=f */
                    133: 
                    134: /* For SEG_REG_PROT we have T=0, Ks=0, Ku=1 */
                    135: #define SEG_REG_PROT   0x20000000   /* seg regs should have these bits set */
                    136: 
                    137: /* SR_COPYIN is used for copyin/copyout+remapping and must be
                    138:  * saved and restored in the thread context.
                    139:  */
                    140: /* SR_UNUSED_BY_KERN is unused by the kernel, and thus contains
                    141:  * the space ID of the currently interrupted user task immediately
                    142:  * after an exception and before interrupts are reenabled. It's used
                    143:  * purely for an assert.
                    144:  */
                    145: 
                    146: /* SR_KERNEL used for asserts... */
                    147: 
                    148: #ifdef __ELF__
                    149: #define SR_COPYIN      14
                    150: #define SR_UNUSED_BY_KERN 13
                    151: #define SR_KERNEL      0
                    152: #else
                    153: #define SR_COPYIN      sr14
                    154: #define SR_UNUSED_BY_KERN sr13
                    155: #define SR_KERNEL      sr0
                    156: #endif
                    157: 
                    158: #define SR_UNUSED_BY_KERN_NUM 13
                    159: #define SR_COPYIN_NAME sr14
                    160: #define SR_COPYIN_NUM  14
                    161: 
                    162: 
                    163: /* DSISR bits on data access exceptions */
                    164: 
                    165: #define DSISR_IO_BIT           0       /* NOT USED on 601 */
                    166: #define DSISR_HASH_BIT         1
                    167: #define DSISR_PROT_BIT         4
                    168: #define DSISR_IO_SPC_BIT       5
                    169: #define DSISR_WRITE_BIT                6
                    170: #define DSISR_WATCH_BIT                9
                    171: #define DSISR_EIO_BIT          11
                    172: 
                    173: /* SRR1 bits on data/instruction translation exceptions */
                    174: 
                    175: #define SRR1_TRANS_HASH_BIT    1
                    176: #define SRR1_TRANS_IO_BIT      3
                    177: #define SRR1_TRANS_PROT_BIT    4
                    178: #define SRR1_TRANS_NO_PTE_BIT  10
                    179: 
                    180: /* SRR1 bits on program exceptions */
                    181: 
                    182: #define SRR1_PRG_FE_BIT                11
                    183: #define SRR1_PRG_ILL_INS_BIT   12
                    184: #define SRR1_PRG_PRV_INS_BIT   13
                    185: #define SRR1_PRG_TRAP_BIT      14
                    186: 
                    187: /* BAT information */
                    188: 
                    189: /* Constants used when setting mask values */
                    190: 
                    191: #define BAT_INVALID 0
                    192: 
                    193: /*
                    194:  * Virtual to physical mapping macros/structures.
                    195:  * IMPORTANT NOTE: there is one mapping per HW page, not per MACH page.
                    196:  */
                    197: 
                    198: #define CACHE_LINE_SIZE        32
                    199: #define CACHE_LINE_POW2 5
                    200: #define cache_align(x) (((x) + CACHE_LINE_SIZE-1) & ~(CACHE_LINE_SIZE - 1))
                    201: 
                    202: #define PTE1_WIMG_GUARD_BIT    28      /* Needed for assembler */
                    203: #define PTE1_REFERENCED_BIT    23      /* ditto */
                    204: #define PTE1_CHANGED_BIT       24
                    205: #define PTE0_HASH_ID_BIT       25
                    206: 
                    207: #define PPC_HASHSIZE           2048    /* size of hash table */
                    208: #define PPC_HASHSIZE_LOG2      11
                    209: #define PPC_MIN_MPP            2       /* min # of mappings per phys page */
                    210: 
                    211: /* macros to help decide processor type */
                    212: #define PROCESSOR_VERSION (mfpvr() >> 16)
                    213: #define PROCESSOR_VERSION_601  1
                    214: #define PROCESSOR_VERSION_603  3
                    215: #define PROCESSOR_VERSION_604  4
                    216: #define PROCESSOR_VERSION_603e 6
                    217: #define PROCESSOR_VERSION_750  8
                    218: #define PROCESSOR_VERSION_604e 9
                    219: #define PROCESSOR_VERSION_604ev        10      /* ? */
                    220: #define PROCESSOR_VERSION_Max  12      /* ? */
                    221: 
                    222: #ifndef ASSEMBLER
                    223: #ifdef __GNUC__
                    224: 
                    225: #if _BIG_ENDIAN == 0
                    226: #error - bitfield structures are not checked for bit ordering in words
                    227: #endif /* _BIG_ENDIAN */
                    228: 
                    229: /* Structures and types for machine registers */
                    230: 
                    231: typedef union {
                    232:        unsigned int word;
                    233:        struct {
                    234:                unsigned int htaborg    : 16;
                    235:                unsigned int reserved   : 7;
                    236:                unsigned int htabmask   : 9;
                    237:        } bits;
                    238: } sdr1_t;
                    239: 
                    240: /* BAT register structures.
                    241:  * Not used for standard mappings, but may be used
                    242:  * for mapping devices. Note that the 601 has a
                    243:  * different BAT layout than the other PowerPC processors
                    244:  */
                    245: 
                    246: typedef union {
                    247:        unsigned int word;
                    248:        struct {
                    249:                unsigned int blpi       : 15;
                    250:                unsigned int reserved   : 10;
                    251:                unsigned int wim        : 3;
                    252:                unsigned int ks         : 1;
                    253:                unsigned int ku         : 1;
                    254:                unsigned int pp         : 2;
                    255:        } bits;
                    256: } bat601u_t;
                    257: 
                    258: typedef union {
                    259:        unsigned int word;
                    260:        struct {
                    261:                unsigned int pbn        : 15;
                    262:                unsigned int reserved   : 10;
                    263:                unsigned int valid      : 1;
                    264:                unsigned int bsm        : 6;
                    265:        } bits;
                    266: } bat601l_t;
                    267: 
                    268: typedef struct bat601_t {
                    269:        bat601u_t       upper;
                    270:        bat601l_t       lower;
                    271: } bat601_t;
                    272: 
                    273: typedef union {
                    274:        unsigned int word;
                    275:        struct {
                    276:                unsigned int bepi       : 15;
                    277:                unsigned int reserved   : 4;
                    278:                unsigned int bl         : 11;
                    279:                unsigned int vs         : 1;
                    280:                unsigned int vp         : 1;
                    281:        } bits;
                    282: } batu_t;
                    283: 
                    284: typedef union {
                    285:        unsigned int word;
                    286:        struct {
                    287:                unsigned int brpn       : 15;
                    288:                unsigned int reserved   : 10;
                    289:                unsigned int wimg       : 4;
                    290:                unsigned int reserved2  : 1;
                    291:                unsigned int pp         : 2;
                    292:        } bits;
                    293: } batl_t;
                    294: 
                    295: typedef struct bat_t {
                    296:        batu_t  upper;
                    297:        batl_t  lower;
                    298: } bat_t;
                    299: 
                    300: /* PTE entries
                    301:  * Used extensively for standard mappings
                    302:  */
                    303: 
                    304: typedef        union {
                    305:        unsigned int word;
                    306:        struct {
                    307:                unsigned int valid      : 1;
                    308:                unsigned int segment_id : 24;
                    309:                unsigned int hash_id    : 1;
                    310:                unsigned int page_index : 6; /* Abbreviated */
                    311:        } bits;
                    312:        struct {
                    313:                unsigned int valid      : 1;
                    314:                unsigned int not_used   : 5;
                    315:                unsigned int segment_id : 19; /* Least Sig 19 bits */
                    316:                unsigned int hash_id    : 1;
                    317:                unsigned int page_index : 6;
                    318:        } hash_bits;
                    319: } pte0_t;
                    320: 
                    321: typedef        union {
                    322:        unsigned int word;
                    323:        struct {
                    324:                unsigned int phys_page  : 20;
                    325:                unsigned int reserved3  : 3;
                    326:                unsigned int referenced : 1;
                    327:                unsigned int changed    : 1;
                    328:                unsigned int wimg       : 4;
                    329:                unsigned int reserved1  : 1;
                    330:                unsigned int protection : 2;
                    331:        } bits;
                    332: } pte1_t;
                    333: 
                    334: typedef struct pte_t {
                    335:        pte0_t pte0;
                    336:        pte1_t pte1;
                    337: } pte_t;
                    338: 
                    339: #define PTE_NULL ((pte_t*) NULL) /* No pte found/associated with this */
                    340: #define PTE_EMPTY 0x7fffffbf    /* Value in the pte0.word of a free pte */
                    341: 
                    342: #define PTE_WIMG_CB_CACHED                     0       /* cached, writeback */
                    343: #define PTE_WIMG_CB_CACHED_GUARDED             1       /* cached, writeback, guarded */
                    344: #define PTE_WIMG_CB_CACHED_COHERENT            2       /* cached, writeback, coherent (default) */
                    345: #define PTE_WIMG_CB_CACHED_COHERENT_GUARDED    3       /* cached, writeback, coherent, guarded */
                    346: #define PTE_WIMG_UNCACHED                      4       /* uncached */
                    347: #define PTE_WIMG_UNCACHED_GUARDED              5       /* uncached, guarded */
                    348: #define PTE_WIMG_UNCACHED_COHERENT             6       /* uncached, coherentt */
                    349: #define PTE_WIMG_UNCACHED_COHERENT_GUARDED     7       /* uncached, coherent, guarded */
                    350: #define PTE_WIMG_WT_CACHED                     8       /* cached, writethru */
                    351: #define PTE_WIMG_WT_CACHED_GUARDED             9       /* cached, writethru, guarded */
                    352: #define PTE_WIMG_WT_CACHED_COHERENT            10      /* cached, writethru, coherent */
                    353: #define PTE_WIMG_WT_CACHED_COHERENT_GUARDED    11      /* cached, writethru, coherent, guarded */
                    354: 
                    355: #define PTE_WIMG_DEFAULT       PTE_WIMG_CB_CACHED_COHERENT
                    356: #define PTE_WIMG_IO            PTE_WIMG_UNCACHED_COHERENT_GUARDED
                    357: 
                    358: /*
                    359:  * A virtual address is decoded into various parts when looking for its PTE
                    360:  */
                    361: 
                    362: typedef struct va_full_t {
                    363:        unsigned int seg_num    : 4;
                    364:        unsigned int page_index : 16;
                    365:        unsigned int byte_ofs   : 12;
                    366: } va_full_t;
                    367: 
                    368: typedef struct va_abbrev_t { /* use bits.abbrev for abbreviated page index */
                    369:        unsigned int seg_num    : 4;
                    370:        unsigned int page_index : 6;
                    371:        unsigned int junk       : 10;
                    372:        unsigned int byte_ofs   : 12;
                    373: } va_abbrev_t;
                    374: 
                    375: typedef union {
                    376:        unsigned int word;
                    377:        va_full_t    full;
                    378:        va_abbrev_t  abbrev;
                    379: } virtual_addr_t;
                    380: 
                    381: /* A physical address can be split up into page and offset */
                    382: 
                    383: typedef struct pa_t {
                    384:        unsigned int page_no : 20;
                    385:        unsigned int offset  : 12;
                    386: } pa_t;
                    387: 
                    388: typedef union {
                    389:        unsigned int word;
                    390:        pa_t         bits;
                    391: } physical_addr_t;
                    392: 
                    393: /*
                    394:  * C-helper inline functions for accessing machine registers follow.
                    395:  */
                    396: 
                    397: 
                    398: #ifdef __ELF__
                    399: #define        __CASMNL__      ";"
                    400: #else
                    401: #define        __CASMNL__ "@"
                    402: #endif
                    403: 
                    404: /* Return the current GOT pointer */
                    405: 
                    406: extern unsigned int get_got(void);
                    407: 
                    408: extern __inline__ unsigned int get_got(void)
                    409: {
                    410:         unsigned int result;
                    411: #ifndef __ELF__
                    412:         __asm__ volatile("mr %0,       r2" : "=r" (result));
                    413: #else
                    414:         __asm__ volatile("mr %0,       2" : "=r" (result));
                    415: #endif
                    416:         return result;
                    417: }
                    418: 
                    419: /*
                    420:  * Various memory/IO synchronisation instructions
                    421:  */
                    422: 
                    423:         /*     Use eieio as a memory barrier to order stores.
                    424:          *     Useful for device control and PTE maintenance.
                    425:          */
                    426: 
                    427: #define eieio() \
                    428:         __asm__ volatile("eieio")
                    429: 
                    430:         /*     Use sync to ensure previous stores have completed.
                    431:                This is  required when manipulating locks and/or
                    432:                maintaining PTEs or other shared structures on SMP 
                    433:                machines.
                    434:         */
                    435: 
                    436: #define sync() \
                    437:         __asm__ volatile("sync")
                    438: 
                    439:         /*     Use isync to sychronize context; that is, the ensure
                    440:                no prefetching of instructions happen before the
                    441:                instruction.
                    442:         */
                    443: 
                    444: #define isync() \
                    445:         __asm__ volatile("isync")
                    446: 
                    447: 
                    448: /*
                    449:  *             This guy will make sure all tlbs on all processors finish their tlbies
                    450:  */
                    451: #define tlbsync() \
                    452:         __asm__ volatile("tlbsync")
                    453: 
                    454: 
                    455:                /*      Invalidate TLB entry. Caution, requires context synchronization.
                    456:                */
                    457: extern void tlbie(unsigned int val);
                    458: 
                    459: extern __inline__ void tlbie(unsigned int val)
                    460: {
                    461:         __asm__ volatile("tlbie %0" : : "r" (val));
                    462:         return;
                    463: }
                    464: 
                    465: 
                    466: 
                    467: /*
                    468:  * Access to various system registers
                    469:  */
                    470: 
                    471: extern unsigned int mflr(void);
                    472: 
                    473: extern __inline__ unsigned int mflr(void)
                    474: {
                    475:         unsigned int result;
                    476:         __asm__ volatile("mflr %0" : "=r" (result));
                    477:         return result;
                    478: }
                    479: 
                    480: extern unsigned int mfpvr(void);
                    481: 
                    482: extern __inline__ unsigned int mfpvr(void)
                    483: {
                    484:         unsigned int result;
                    485:         __asm__ ("mfpvr %0" : "=r" (result));
                    486:         return result;
                    487: }
                    488: 
                    489: /* mtmsr might need syncs etc around it, don't provide simple
                    490:  * inline macro
                    491:  */
                    492: 
                    493: extern unsigned int mfmsr(void);
                    494: 
                    495: extern __inline__ unsigned int mfmsr(void)
                    496: {
                    497:         unsigned int result;
                    498:         __asm__ volatile("mfmsr %0" : "=r" (result));
                    499:         return result;
                    500: }
                    501: 
                    502: /* mtsr and mfsr must be macros since SR must be hardcoded */
                    503: 
                    504: #if __ELF__
                    505: #define mtsr(SR, REG)                                                       \
                    506:        __asm__ volatile("sync" __CASMNL__ "mtsr %0, %1 " __CASMNL__ "isync" : : "i" (SR), "r" (REG));
                    507: #define mfsr(REG, SR) \
                    508:        __asm__ volatile("mfsr %0, %1" : "=r" (REG) : "i" (SR));
                    509: #else
                    510: #define mtsr(SR, REG)                                                       \
                    511:        __asm__ volatile("sync" __CASMNL__ "mtsr sr%0, %1 " __CASMNL__ "isync" : : "i" (SR), "r" (REG)); 
                    512: 
                    513: #define mfsr(REG, SR) \
                    514:        __asm__ volatile("mfsr %0, sr%1" : "=r" (REG) : "i" (SR));
                    515: #endif
                    516: 
                    517: 
                    518: extern void mtsrin(unsigned int val, unsigned int reg);
                    519: 
                    520: extern __inline__ void mtsrin(unsigned int val, unsigned int reg)
                    521: {
                    522:         __asm__ volatile("sync" __CASMNL__ "mtsrin %0, %1" __CASMNL__ " isync" : : "r" (val), "r" (reg));
                    523:         return;
                    524: }
                    525: 
                    526: extern unsigned int mfsrin(unsigned int reg);
                    527: 
                    528: extern __inline__ unsigned int mfsrin(unsigned int reg)
                    529: {
                    530:        unsigned int result;
                    531:         __asm__ volatile("mfsrin %0, %1" : "=r" (result) : "r" (reg));
                    532:         return result;
                    533: }
                    534: 
                    535: extern void mtsdr1(unsigned int val);
                    536: 
                    537: extern __inline__ void mtsdr1(unsigned int val)
                    538: {
                    539:         __asm__ volatile("mtsdr1 %0" : : "r" (val));
                    540:         return;
                    541: }
                    542: 
                    543: extern void mtdar(unsigned int val);
                    544: 
                    545: extern __inline__ void mtdar(unsigned int val)
                    546: {
                    547:         __asm__ volatile("mtdar %0" : : "r" (val));
                    548:         return;
                    549: }
                    550: 
                    551: extern unsigned int mfdar(void);
                    552: 
                    553: extern __inline__ unsigned int mfdar(void)
                    554: {
                    555:         unsigned int result;
                    556:         __asm__ volatile("mfdar %0" : "=r" (result));
                    557:         return result;
                    558: }
                    559: 
                    560: extern void mtdec(unsigned int val);
                    561: 
                    562: extern __inline__ void mtdec(unsigned int val)
                    563: {
                    564:         __asm__ volatile("mtdec %0" : : "r" (val));
                    565:         return;
                    566: }
                    567: 
                    568: extern int isync_mfdec(void);
                    569: 
                    570: extern __inline__ int isync_mfdec(void)
                    571: {
                    572:         int result;
                    573:         __asm__ volatile("isync" __CASMNL__ "mfdec %0" : "=r" (result));
                    574:         return result;
                    575: }
                    576: 
                    577: /* Read and write the value from the real-time clock
                    578:  * or time base registers. Note that you have to
                    579:  * use the right ones depending upon being on
                    580:  * 601 or 603/604. Care about carries between
                    581:  * the words and using the right registers must be
                    582:  * done by the calling function.
                    583:  */
                    584: 
                    585: extern void mttb(unsigned int val);
                    586: 
                    587: extern __inline__ void mttb(unsigned int val)
                    588: {
                    589:         __asm__ volatile("mtspr tbl, %0" : : "r" (val));
                    590:         return;
                    591: }
                    592: 
                    593: extern unsigned int mftb(void);
                    594: 
                    595: extern __inline__ unsigned int mftb(void)
                    596: {
                    597:         unsigned int result;
                    598:         __asm__ volatile("mftb %0" : "=r" (result));
                    599:         return result;
                    600: }
                    601: 
                    602: extern void mttbu(unsigned int val);
                    603: 
                    604: extern __inline__ void mttbu(unsigned int val)
                    605: {
                    606:         __asm__ volatile("mtspr tbu, %0" : : "r" (val));
                    607:         return;
                    608: }
                    609: 
                    610: extern unsigned int mftbu(void);
                    611: 
                    612: extern __inline__ unsigned int mftbu(void)
                    613: {
                    614:         unsigned int result;
                    615:         __asm__ volatile("mftbu %0" : "=r" (result));
                    616:         return result;
                    617: }
                    618: 
                    619: extern void mtrtcl(unsigned int val);
                    620: 
                    621: extern __inline__ void mtrtcl(unsigned int val)
                    622: {
                    623:         __asm__ volatile("mtspr  21,%0" : : "r" (val));
                    624:         return;
                    625: }
                    626: 
                    627: extern unsigned int mfrtcl(void);
                    628: 
                    629: extern __inline__ unsigned int mfrtcl(void)
                    630: {
                    631:         unsigned int result;
                    632:         __asm__ volatile("mfspr %0,5" : "=r" (result));
                    633:         return result;
                    634: }
                    635: 
                    636: extern void mtrtcu(unsigned int val);
                    637: 
                    638: extern __inline__ void mtrtcu(unsigned int val)
                    639: {
                    640:         __asm__ volatile("mtspr 20,%0" : : "r" (val));
                    641:         return;
                    642: }
                    643: 
                    644: extern unsigned int mfrtcu(void);
                    645: 
                    646: extern __inline__ unsigned int mfrtcu(void)
                    647: {
                    648:         unsigned int result;
                    649:         __asm__ volatile("mfspr %0,4" : "=r" (result));
                    650:         return result;
                    651: }
                    652: 
                    653: extern void mtl2cr(unsigned int val);
                    654: 
                    655: extern __inline__ void mtl2cr(unsigned int val)
                    656: {
                    657:   __asm__ volatile("mtspr l2cr, %0" : : "r" (val));
                    658:   return;
                    659: }
                    660: 
                    661: extern unsigned int mfl2cr(void);
                    662: 
                    663: extern __inline__ unsigned int mfl2cr(void)
                    664: {
                    665:   unsigned int result;
                    666:   __asm__ volatile("mfspr %0, l2cr" : "=r" (result));
                    667:   return result;
                    668: }
                    669: 
                    670: extern unsigned int cntlzw(unsigned int num);
                    671: 
                    672: extern __inline__ unsigned int cntlzw(unsigned int num)
                    673: {
                    674:   unsigned int result;
                    675:   __asm__ volatile("cntlzw %0, %1" : "=r" (result) : "r" (num));
                    676:   return result;
                    677: }
                    678: 
                    679: 
                    680: /* functions for doing byte reversed loads and stores */
                    681: 
                    682: extern unsigned int lwbrx(unsigned int addr);
                    683: 
                    684: extern __inline__ unsigned int lwbrx(unsigned int addr)
                    685: {
                    686:   unsigned int result;
                    687:   __asm__ volatile("lwbrx %0, 0, %1" : "=r" (result) : "r" (addr));
                    688:   return result;
                    689: }
                    690: 
                    691: extern void stwbrx(unsigned int data, unsigned int addr);
                    692: 
                    693: extern __inline__ void stwbrx(unsigned int data, unsigned int addr)
                    694: {
                    695:   __asm__ volatile("stwbrx %0, 0, %1" : : "r" (data), "r" (addr));
                    696: }
                    697: 
                    698: /* Performance Monitor Register access routines */
                    699: extern unsigned long   mfmmcr0(void);
                    700: extern void                    mtmmcr0(unsigned long);
                    701: extern unsigned long   mfmmcr1(void);
                    702: extern void                    mtmmcr1(unsigned long);
                    703: extern unsigned long   mfmmcr2(void);
                    704: extern void                    mtmmcr2(unsigned long);
                    705: extern unsigned long   mfpmc1(void);
                    706: extern void                    mtpmc1(unsigned long);
                    707: extern unsigned long   mfpmc2(void);
                    708: extern void                    mtpmc2(unsigned long);
                    709: extern unsigned long   mfpmc3(void);
                    710: extern void                    mtpmc3(unsigned long);
                    711: extern unsigned long   mfpmc4(void);
                    712: extern void                    mtpmc4(unsigned long);
                    713: extern unsigned long   mfsia(void);
                    714: extern unsigned long   mfsda(void);
                    715: 
                    716: /* macros since the argument n is a hard-coded constant */
                    717: 
                    718: #define mtibatu(n, reg) __asm__ volatile("mtibatu " # n ", %0" : : "r" (reg))
                    719: #define mtibatl(n, reg) __asm__ volatile("mtibatl " # n ", %0" : : "r" (reg))
                    720: 
                    721: #define mtdbatu(n, reg) __asm__ volatile("mtdbatu " # n ", %0" : : "r" (reg))
                    722: #define mtdbatl(n, reg) __asm__ volatile("mtdbatl " # n ", %0" : : "r" (reg))
                    723: 
                    724: #define mfibatu(reg, n) __asm__ volatile("mfibatu %0, " # n : "=r" (reg))
                    725: #define mfibatl(reg, n) __asm__ volatile("mfibatl %0, " # n : "=r" (reg))
                    726: 
                    727: #define mfdbatu(reg, n) __asm__ volatile("mfdbatu %0, " # n : "=r" (reg))
                    728: #define mfdbatl(reg, n) __asm__ volatile("mfdbatl %0, " # n : "=r" (reg))
                    729: 
                    730: #define mtsprg(n, reg)  __asm__ volatile("mtsprg  " # n ", %0" : : "r" (reg))
                    731: #define mfsprg(reg, n)  __asm__ volatile("mfsprg  %0, " # n : "=r" (reg))
                    732: 
                    733: #define mtspr(spr, val)  __asm__ volatile("mtspr  " # spr ", %0" : : "r" (val))
                    734: #define mfspr(reg, spr)  __asm__ volatile("mfspr  %0, " # spr : "=r" (reg))
                    735: 
                    736: #endif /* __GNUC__ */
                    737: #endif /* !ASSEMBLER */
                    738: 
                    739: #endif /* _PPC_PROC_REG_H_ */

unix.superglobalmegacorp.com

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