[BACK]Return to alpha_cpu.h CVS log [TXT][DIR] Up to [local] / sys / arch / alpha / include

Annotation of sys/arch/alpha/include/alpha_cpu.h, Revision 1.1

1.1     ! nbrk        1: /* $OpenBSD: alpha_cpu.h,v 1.8 2002/11/26 01:35:23 art Exp $ */
        !             2: /* $NetBSD: alpha_cpu.h,v 1.43 2001/12/18 04:18:22 thorpej Exp $ */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 1996 Carnegie-Mellon University.
        !             6:  * All rights reserved.
        !             7:  *
        !             8:  * Author: Chris G. Demetriou
        !             9:  *
        !            10:  * Permission to use, copy, modify and distribute this software and
        !            11:  * its documentation is hereby granted, provided that both the copyright
        !            12:  * notice and this permission notice appear in all copies of the
        !            13:  * software, derivative works or modified versions, and any portions
        !            14:  * thereof, and that both notices appear in supporting documentation.
        !            15:  *
        !            16:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
        !            17:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
        !            18:  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !            19:  *
        !            20:  * Carnegie Mellon requests users of this software to return to
        !            21:  *
        !            22:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
        !            23:  *  School of Computer Science
        !            24:  *  Carnegie Mellon University
        !            25:  *  Pittsburgh PA 15213-3890
        !            26:  *
        !            27:  * any improvements or extensions that they make and grant Carnegie the
        !            28:  * rights to redistribute these changes.
        !            29:  */
        !            30:
        !            31: #ifndef __ALPHA_ALPHA_CPU_H__
        !            32: #define        __ALPHA_ALPHA_CPU_H__
        !            33:
        !            34: /*
        !            35:  * Alpha CPU + OSF/1 PALcode definitions for use by the kernel.
        !            36:  *
        !            37:  * Definitions for:
        !            38:  *
        !            39:  *     Process Control Block
        !            40:  *     Interrupt/Exception/Syscall Stack Frame
        !            41:  *     Processor Status Register
        !            42:  *     Machine Check Error Summary Register
        !            43:  *     Machine Check Logout Area
        !            44:  *     Per CPU state Management of Machine Check Handling
        !            45:  *     Virtual Memory Management
        !            46:  *     Kernel Entry Vectors
        !            47:  *     MMCSR Fault Type Codes
        !            48:  *     Translation Buffer Invalidation
        !            49:  *
        !            50:  * and miscellaneous PALcode operations.
        !            51:  */
        !            52:
        !            53:
        !            54: /*
        !            55:  * Process Control Block definitions [OSF/1 PALcode Specific]
        !            56:  */
        !            57:
        !            58: struct alpha_pcb {
        !            59:        unsigned long   apcb_ksp;       /* kernel stack ptr */
        !            60:        unsigned long   apcb_usp;       /* user stack ptr */
        !            61:        unsigned long   apcb_ptbr;      /* page table base reg */
        !            62:        unsigned int    apcb_cpc;       /* charged process cycles */
        !            63:        unsigned int    apcb_asn;       /* address space number */
        !            64:        unsigned long   apcb_unique;    /* process unique value */
        !            65: #define        apcb_backup_ksp apcb_unique     /* backup kernel stack ptr */
        !            66:        unsigned long   apcb_flags;     /* flags; see below */
        !            67:        unsigned long   apcb_decrsv0;   /* DEC reserved */
        !            68:        unsigned long   apcb_decrsv1;   /* DEC reserved */
        !            69: };
        !            70:
        !            71: #define        ALPHA_PCB_FLAGS_FEN     0x0000000000000001
        !            72: #define        ALPHA_PCB_FLAGS_PME     0x4000000000000000
        !            73:
        !            74: /*
        !            75:  * Interrupt/Exception/Syscall "Hardware" (really PALcode)
        !            76:  * Stack Frame definitions
        !            77:  *
        !            78:  * These are quadword offsets from the sp on kernel entry, i.e.
        !            79:  * to get to the value in question you access (sp + (offset * 8)).
        !            80:  *
        !            81:  * On syscall entry, A0-A2 aren't written to memory but space
        !            82:  * _is_ reserved for them.
        !            83:  */
        !            84:
        !            85: #define        ALPHA_HWFRAME_PS        0       /* processor status register */
        !            86: #define        ALPHA_HWFRAME_PC        1       /* program counter */
        !            87: #define        ALPHA_HWFRAME_GP        2       /* global pointer */
        !            88: #define        ALPHA_HWFRAME_A0        3       /* a0 */
        !            89: #define        ALPHA_HWFRAME_A1        4       /* a1 */
        !            90: #define        ALPHA_HWFRAME_A2        5       /* a2 */
        !            91:
        !            92: #define        ALPHA_HWFRAME_SIZE      6       /* 6 8-byte words */
        !            93:
        !            94: /*
        !            95:  * Processor Status Register [OSF/1 PALcode Specific]
        !            96:  *
        !            97:  * Includes user/kernel mode bit, interrupt priority levels, etc.
        !            98:  */
        !            99:
        !           100: #define        ALPHA_PSL_USERMODE      0x0008          /* set -> user mode */
        !           101: #define        ALPHA_PSL_IPL_MASK      0x0007          /* interrupt level mask */
        !           102:
        !           103: #define        ALPHA_PSL_IPL_0         0x0000          /* all interrupts enabled */
        !           104: #define        ALPHA_PSL_IPL_SOFT      0x0001          /* software ints disabled */
        !           105: #define        ALPHA_PSL_IPL_IO        0x0004          /* I/O dev ints disabled */
        !           106: #define        ALPHA_PSL_IPL_CLOCK     0x0005          /* clock ints disabled */
        !           107: #define        ALPHA_PSL_IPL_HIGH      0x0006          /* all but mchecks disabled */
        !           108:
        !           109: #define        ALPHA_PSL_MUST_BE_ZERO  0xfffffffffffffff0
        !           110:
        !           111: /* Convenience constants: what must be set/clear in user mode */
        !           112: #define        ALPHA_PSL_USERSET       ALPHA_PSL_USERMODE
        !           113: #define        ALPHA_PSL_USERCLR       (ALPHA_PSL_MUST_BE_ZERO | ALPHA_PSL_IPL_MASK)
        !           114:
        !           115: /*
        !           116:  * Interrupt Type Code Definitions [OSF/1 PALcode Specific]
        !           117:  */
        !           118:
        !           119: #define        ALPHA_INTR_XPROC        0       /* interprocessor interrupt */
        !           120: #define        ALPHA_INTR_CLOCK        1       /* clock interrupt */
        !           121: #define        ALPHA_INTR_ERROR        2       /* correctable error or mcheck */
        !           122: #define        ALPHA_INTR_DEVICE       3       /* device interrupt */
        !           123: #define        ALPHA_INTR_PERF         4       /* performance counter */
        !           124: #define        ALPHA_INTR_PASSIVE      5       /* passive release */
        !           125:
        !           126: /*
        !           127:  * Machine Check Error Summary Register definitions [OSF/1 PALcode Specific]
        !           128:  *
        !           129:  * The following bits are values as read.  On write, _PCE, _SCE, and
        !           130:  * _MIP are "write 1 to clear."
        !           131:  */
        !           132:
        !           133: #define        ALPHA_MCES_IMP                                                  \
        !           134:     0xffffffff00000000 /* impl. dependent */
        !           135: #define        ALPHA_MCES_RSVD                                                 \
        !           136:     0x00000000ffffffe0 /* reserved */
        !           137: #define        ALPHA_MCES_DSC                                                  \
        !           138:     0x0000000000000010 /* disable system correctable error reporting */
        !           139: #define        ALPHA_MCES_DPC                                                  \
        !           140:     0x0000000000000008 /* disable processor correctable error reporting */
        !           141: #define        ALPHA_MCES_PCE                                                  \
        !           142:     0x0000000000000004 /* processor correctable error in progress */
        !           143: #define        ALPHA_MCES_SCE                                                  \
        !           144:     0x0000000000000002 /* system correctable error in progress */
        !           145: #define        ALPHA_MCES_MIP                                                  \
        !           146:     0x0000000000000001 /* machine check in progress */
        !           147:
        !           148: /*
        !           149:  * Machine Check Error Summary Register definitions [OSF/1 PALcode Specific]
        !           150:  *
        !           151:  * Note that these are *generic* OSF/1 PALcode specific defines. There are
        !           152:  * platform variations to these entities.
        !           153:  */
        !           154:
        !           155: struct alpha_logout_area {
        !           156:        unsigned int    la_frame_size;          /* frame size */
        !           157:        unsigned int    la_flags;               /* flags; see below */
        !           158:        unsigned int    la_cpu_offset;          /* offset to cpu area */
        !           159:        unsigned int    la_system_offset;       /* offset to system area */
        !           160: };
        !           161:
        !           162: #define        ALPHA_LOGOUT_FLAGS_RETRY        0x80000000      /* OK to continue */
        !           163: #define        ALPHA_LOGOUT_FLAGS_SE           0x40000000      /* second error */
        !           164: #define        ALPHA_LOGOUT_FLAGS_SBZ          0x3fffffff      /* should be zero */
        !           165:
        !           166: #define        ALPHA_LOGOUT_NOT_BUILT                                          \
        !           167:     (struct alpha_logout_area *)0xffffffffffffffff)
        !           168:
        !           169: #define        ALPHA_LOGOUT_PAL_AREA(lap)                                      \
        !           170:     (unsigned long *)((unsigned char *)(lap) + 16)
        !           171: #define        ALPHA_LOGOUT_PAL_SIZE(lap)                                      \
        !           172:     ((lap)->la_cpu_offset - 16)
        !           173: #define        ALPHA_LOGOUT_CPU_AREA(lap)                                      \
        !           174:     (unsigned long *)((unsigned char *)(lap) + (lap)->la_cpu_offset)
        !           175: #define        ALPHA_LOGOUT_CPU_SIZE(lap)                                      \
        !           176:     ((lap)->la_system_offset - (lap)->la_cpu_offset)
        !           177: #define        ALPHA_LOGOUT_SYSTEM_AREA(lap)                                   \
        !           178:     (unsigned long *)((unsigned char *)(lap) + (lap)->la_system_offset)
        !           179: #define        ALPHA_LOGOUT_SYSTEM_SIZE(lap)                                   \
        !           180:     ((lap)->la_frame_size - (lap)->la_system_offset)
        !           181:
        !           182: /* types of machine checks */
        !           183: #define        ALPHA_SYS_ERROR         0x620   /* System correctable error     */
        !           184: #define        ALPHA_PROC_ERROR        0x630   /* Processor correctable error  */
        !           185: #define        ALPHA_SYS_MCHECK        0x660   /* System machine check         */
        !           186: #define        ALPHA_PROC_MCHECK       0x670   /* Processor machine check      */
        !           187:
        !           188: /*
        !           189:  * Virtual Memory Management definitions [OSF/1 PALcode Specific]
        !           190:  *
        !           191:  * Includes user and kernel space addresses and information,
        !           192:  * page table entry definitions, etc.
        !           193:  *
        !           194:  * NOTE THAT THESE DEFINITIONS MAY CHANGE IN FUTURE ALPHA CPUS!
        !           195:  */
        !           196:
        !           197: #define        ALPHA_PGSHIFT           13
        !           198: #define        ALPHA_PGBYTES           (1 << ALPHA_PGSHIFT)
        !           199:
        !           200: #define        ALPHA_USEG_BASE         0                       /* virtual */
        !           201: #define        ALPHA_USEG_END          0x000003ffffffffff
        !           202:
        !           203: #define        ALPHA_K0SEG_BASE        0xfffffc0000000000      /* direct-mapped */
        !           204: #define        ALPHA_K0SEG_END         0xfffffdffffffffff
        !           205: #define        ALPHA_K1SEG_BASE        0xfffffe0000000000      /* virtual */
        !           206: #define        ALPHA_K1SEG_END         0xffffffffffffffff
        !           207:
        !           208: #define ALPHA_K0SEG_TO_PHYS(x) ((x) & ~ALPHA_K0SEG_BASE)
        !           209: #define ALPHA_PHYS_TO_K0SEG(x) ((x) | ALPHA_K0SEG_BASE)
        !           210:
        !           211: #define        ALPHA_PTE_VALID                 0x0001UL
        !           212:
        !           213: #define        ALPHA_PTE_FAULT_ON_READ         0x0002UL
        !           214: #define        ALPHA_PTE_FAULT_ON_WRITE        0x0004UL
        !           215: #define        ALPHA_PTE_FAULT_ON_EXECUTE      0x0008UL
        !           216:
        !           217: #define        ALPHA_PTE_ASM                   0x0010UL        /* addr. space match */
        !           218: #define        ALPHA_PTE_GRANULARITY           0x0060UL        /* granularity hint */
        !           219:
        !           220: #define        ALPHA_PTE_PROT                  0xff00UL
        !           221: #define        ALPHA_PTE_KR                    0x0100UL
        !           222: #define        ALPHA_PTE_UR                    0x0200UL
        !           223: #define        ALPHA_PTE_KW                    0x1000UL
        !           224: #define        ALPHA_PTE_UW                    0x2000UL
        !           225:
        !           226: #define        ALPHA_PTE_WRITE                 (ALPHA_PTE_KW | ALPHA_PTE_UW)
        !           227:
        !           228: #define        ALPHA_PTE_SOFTWARE              0x00000000ffff0000UL
        !           229: #define        ALPHA_PTE_PALCODE               (~ALPHA_PTE_SOFTWARE) /* shorthand */
        !           230:
        !           231: #define        ALPHA_PTE_PFN                   0xffffffff00000000UL
        !           232:
        !           233: #define        ALPHA_PTE_TO_PFN(pte)           ((pte) >> 32)
        !           234: #define        ALPHA_PTE_FROM_PFN(pfn)         ((pfn) << 32)
        !           235:
        !           236: typedef unsigned long alpha_pt_entry_t;
        !           237:
        !           238: /*
        !           239:  * Kernel Entry Vectors.  [OSF/1 PALcode Specific]
        !           240:  */
        !           241:
        !           242: #define        ALPHA_KENTRY_INT        0
        !           243: #define        ALPHA_KENTRY_ARITH      1
        !           244: #define        ALPHA_KENTRY_MM         2
        !           245: #define        ALPHA_KENTRY_IF         3
        !           246: #define        ALPHA_KENTRY_UNA        4
        !           247: #define        ALPHA_KENTRY_SYS        5
        !           248:
        !           249: /*
        !           250:  * MMCSR Fault Type Codes.  [OSF/1 PALcode Specific]
        !           251:  */
        !           252:
        !           253: #define        ALPHA_MMCSR_INVALTRANS  0
        !           254: #define        ALPHA_MMCSR_ACCESS      1
        !           255: #define        ALPHA_MMCSR_FOR         2
        !           256: #define        ALPHA_MMCSR_FOE         3
        !           257: #define        ALPHA_MMCSR_FOW         4
        !           258:
        !           259: /*
        !           260:  * Instruction Fault Type Codes.  [OSF/1 PALcode Specific]
        !           261:  */
        !           262:
        !           263: #define        ALPHA_IF_CODE_BPT       0
        !           264: #define        ALPHA_IF_CODE_BUGCHK    1
        !           265: #define        ALPHA_IF_CODE_GENTRAP   2
        !           266: #define        ALPHA_IF_CODE_FEN       3
        !           267: #define        ALPHA_IF_CODE_OPDEC     4
        !           268:
        !           269: #ifdef _KERNEL
        !           270:
        !           271: /*
        !           272:  * Translation Buffer Invalidation definitions [OSF/1 PALcode Specific]
        !           273:  */
        !           274:
        !           275: #define        ALPHA_TBIA()    alpha_pal_tbi(-2, 0)            /* all TB entries */
        !           276: #define        ALPHA_TBIAP()   alpha_pal_tbi(-1, 0)            /* all per-process */
        !           277: #define        ALPHA_TBISI(va) alpha_pal_tbi(1, (va))          /* ITB entry for va */
        !           278: #define        ALPHA_TBISD(va) alpha_pal_tbi(2, (va))          /* DTB entry for va */
        !           279: #define        ALPHA_TBIS(va)  alpha_pal_tbi(3, (va))          /* all for va */
        !           280:
        !           281: #endif /* _KERNEL */
        !           282:
        !           283: /*
        !           284:  * Bits used in the amask instruction [EV56 and later]
        !           285:  */
        !           286:
        !           287: #define        ALPHA_AMASK_BWX         0x0001          /* byte/word extension */
        !           288: #define        ALPHA_AMASK_FIX         0x0002          /* floating point conv. ext. */
        !           289: #define        ALPHA_AMASK_CIX         0x0004          /* count extension */
        !           290: #define        ALPHA_AMASK_MVI         0x0100          /* multimedia extension */
        !           291: #define        ALPHA_AMASK_PAT         0x0200          /* precise arith. traps */
        !           292:
        !           293: #define        ALPHA_AMASK_ALL         (ALPHA_AMASK_BWX|ALPHA_AMASK_FIX|       \
        !           294:                                 ALPHA_AMASK_CIX|ALPHA_AMASK_MVI|       \
        !           295:                                 ALPHA_AMASK_PAT)
        !           296:
        !           297: #define        ALPHA_AMASK_BITS                                                \
        !           298:     "\20\12PAT\11MVI\3CIX\2FIX\1BWX"
        !           299:
        !           300: /*
        !           301:  * Chip family IDs returned by implver instruction
        !           302:  */
        !           303:
        !           304: #define        ALPHA_IMPLVER_EV4       0               /* LCA/EV4/EV45 */
        !           305: #define        ALPHA_IMPLVER_EV5       1               /* EV5/EV56/PCA56 */
        !           306: #define        ALPHA_IMPLVER_EV6       2               /* EV6 */
        !           307:
        !           308: #ifdef _KERNEL
        !           309:
        !           310: /*
        !           311:  * Maximum processor ID we allow from `whami', and related constants.
        !           312:  *
        !           313:  * XXX This is not really processor or PALcode specific, but this is
        !           314:  * a convenient place to put these definitions.
        !           315:  *
        !           316:  * XXX This is clipped at 63 so that we can use `long's for proc bitmasks.
        !           317:  */
        !           318:
        !           319: #define        ALPHA_WHAMI_MAXID       63
        !           320: #define        ALPHA_MAXPROCS          (ALPHA_WHAMI_MAXID + 1)
        !           321:
        !           322: /*
        !           323:  * Misc. support routines.
        !           324:  */
        !           325: const char     *alpha_dsr_sysname(void);
        !           326:
        !           327: /*
        !           328:  * Stubs for Alpha instructions normally inaccessible from C.
        !           329:  */
        !           330: unsigned long  alpha_amask(unsigned long);
        !           331: unsigned long  alpha_implver(void);
        !           332:
        !           333: #endif /* _KERNEL */
        !           334:
        !           335: /* XXX Expose the insn wrappers to userspace, for now. */
        !           336:
        !           337: static __inline unsigned long
        !           338: alpha_rpcc(void)
        !           339: {
        !           340:        unsigned long v0;
        !           341:
        !           342:        __asm __volatile("rpcc %0" : "=r" (v0));
        !           343:        return (v0);
        !           344: }
        !           345:
        !           346: #define        alpha_mb()      __asm __volatile("mb" : : : "memory")
        !           347: #define        alpha_wmb()     __asm __volatile("mb" : : : "memory")   /* XXX */
        !           348:
        !           349: #if defined(_KERNEL) || defined(_STANDALONE)
        !           350:
        !           351: /*
        !           352:  * Stubs for OSF/1 PALcode operations.
        !           353:  */
        !           354: #include <machine/pal.h>
        !           355:
        !           356: void           alpha_pal_cflush(unsigned long);
        !           357: void           alpha_pal_halt(void) __attribute__((__noreturn__));
        !           358: unsigned long  _alpha_pal_swpipl(unsigned long);       /* for profiling */
        !           359: void           alpha_pal_wrent(void *, unsigned long);
        !           360: void           alpha_pal_wrvptptr(unsigned long);
        !           361:
        !           362: #define        alpha_pal_draina() __asm __volatile("call_pal %0 # PAL_draina"  \
        !           363:                                : : "i" (PAL_draina) : "memory")
        !           364:
        !           365: #define        alpha_pal_imb() __asm __volatile("call_pal %0 # PAL_imb"        \
        !           366:                                : : "i" (PAL_imb) : "memory")
        !           367:
        !           368: static __inline unsigned long
        !           369: alpha_pal_rdmces(void)
        !           370: {
        !           371:        register unsigned long v0 __asm("$0");
        !           372:
        !           373:        __asm __volatile("call_pal %1 # PAL_OSF1_rdmces"
        !           374:                : "=r" (v0)
        !           375:                : "i" (PAL_OSF1_rdmces)
        !           376:                /* clobbers t0, t8..t11 */
        !           377:                : "$1", "$22", "$23", "$24", "$25");
        !           378:
        !           379:        return (v0);
        !           380: }
        !           381:
        !           382: static __inline unsigned long
        !           383: alpha_pal_rdps(void)
        !           384: {
        !           385:        register unsigned long v0 __asm("$0");
        !           386:
        !           387:        __asm __volatile("call_pal %1 # PAL_OSF1_rdps"
        !           388:                : "=r" (v0)
        !           389:                : "i" (PAL_OSF1_rdps)
        !           390:                /* clobbers t0, t8..t11 */
        !           391:                : "$1", "$22", "$23", "$24", "$25");
        !           392:
        !           393:        return (v0);
        !           394: }
        !           395:
        !           396: static __inline unsigned long
        !           397: alpha_pal_rdusp(void)
        !           398: {
        !           399:        register unsigned long v0 __asm("$0");
        !           400:
        !           401:        __asm __volatile("call_pal %1 # PAL_OSF1_rdusp"
        !           402:                : "=r" (v0)
        !           403:                : "i" (PAL_OSF1_rdusp)
        !           404:                /* clobbers t0, t8..t11 */
        !           405:                : "$1", "$22", "$23", "$24", "$25");
        !           406:
        !           407:        return (v0);
        !           408: }
        !           409:
        !           410: static __inline unsigned long
        !           411: alpha_pal_rdval(void)
        !           412: {
        !           413:        register unsigned long v0 __asm("$0");
        !           414:
        !           415:        __asm __volatile("call_pal %1 # PAL_OSF1_rdval"
        !           416:                : "=r" (v0)
        !           417:                : "i" (PAL_OSF1_rdval)
        !           418:                /* clobbers t0, t8..t11 */
        !           419:                : "$1", "$22", "$23", "$24", "$25");
        !           420:
        !           421:        return (v0);
        !           422: }
        !           423:
        !           424: static __inline unsigned long
        !           425: alpha_pal_swpctx(unsigned long ctx)
        !           426: {
        !           427:        register unsigned long a0 __asm("$16") = ctx;
        !           428:        register unsigned long v0 __asm("$0");
        !           429:
        !           430:        __asm __volatile("call_pal %2 # PAL_OSF1_swpctx"
        !           431:                : "=r" (a0), "=r" (v0)
        !           432:                : "i" (PAL_OSF1_swpctx), "0" (a0)
        !           433:                /* clobbers t0, t8..t11, a0 (above) */
        !           434:                : "$1", "$22", "$23", "$24", "$25", "memory");
        !           435:
        !           436:        return (v0);
        !           437: }
        !           438:
        !           439: static __inline unsigned long
        !           440: alpha_pal_swpipl(unsigned long ipl)
        !           441: {
        !           442:        register unsigned long a0 __asm("$16") = ipl;
        !           443:        register unsigned long v0 __asm("$0");
        !           444:
        !           445:        __asm __volatile("call_pal %2 # PAL_OSF1_swpipl"
        !           446:                : "=r" (a0), "=r" (v0)
        !           447:                : "i" (PAL_OSF1_swpipl), "0" (a0)
        !           448:                /* clobbers t0, t8..t11, a0 (above) */
        !           449:                : "$1", "$22", "$23", "$24", "$25", "memory");
        !           450:
        !           451:        return (v0);
        !           452: }
        !           453:
        !           454: static __inline void
        !           455: alpha_pal_tbi(unsigned long op, vaddr_t va)
        !           456: {
        !           457:        register unsigned long a0 __asm("$16") = op;
        !           458:        register unsigned long a1 __asm("$17") = va;
        !           459:
        !           460:        __asm __volatile("call_pal %2 # PAL_OSF1_tbi"
        !           461:                : "=r" (a0), "=r" (a1)
        !           462:                : "i" (PAL_OSF1_tbi), "0" (a0), "1" (a1)
        !           463:                /* clobbers t0, t8..t11, a0 (above), a1 (above) */
        !           464:                : "$1", "$22", "$23", "$24", "$25");
        !           465: }
        !           466:
        !           467: static __inline unsigned long
        !           468: alpha_pal_whami(void)
        !           469: {
        !           470:        register unsigned long v0 __asm("$0");
        !           471:
        !           472:        __asm __volatile("call_pal %1 # PAL_OSF1_whami"
        !           473:                : "=r" (v0)
        !           474:                : "i" (PAL_OSF1_whami)
        !           475:                /* clobbers t0, t8..t11 */
        !           476:                : "$1", "$22", "$23", "$24", "$25");
        !           477:
        !           478:        return (v0);
        !           479: }
        !           480:
        !           481: static __inline void
        !           482: alpha_pal_wrfen(unsigned long onoff)
        !           483: {
        !           484:        register unsigned long a0 __asm("$16") = onoff;
        !           485:
        !           486:        __asm __volatile("call_pal %1 # PAL_OSF1_wrfen"
        !           487:                : "=r" (a0)
        !           488:                : "i" (PAL_OSF1_wrfen), "0" (a0)
        !           489:                /* clobbers t0, t8..t11, a0 (above) */
        !           490:                : "$1", "$22", "$23", "$24", "$25");
        !           491: }
        !           492:
        !           493: static __inline void
        !           494: alpha_pal_wripir(unsigned long cpu_id)
        !           495: {
        !           496:        register unsigned long a0 __asm("$16") = cpu_id;
        !           497:
        !           498:        __asm __volatile("call_pal %1 # PAL_ipir"
        !           499:                : "=r" (a0)
        !           500:                : "i" (PAL_ipir), "0" (a0)
        !           501:                /* clobbers t0, t8..t11, a0 (above) */
        !           502:                : "$1", "$22", "$23", "$24", "$25");
        !           503: }
        !           504:
        !           505: static __inline void
        !           506: alpha_pal_wrusp(unsigned long usp)
        !           507: {
        !           508:        register unsigned long a0 __asm("$16") = usp;
        !           509:
        !           510:        __asm __volatile("call_pal %1 # PAL_OSF1_wrusp"
        !           511:                : "=r" (a0)
        !           512:                : "i" (PAL_OSF1_wrusp), "0" (a0)
        !           513:                /* clobbers t0, t8..t11, a0 (above) */
        !           514:                : "$1", "$22", "$23", "$24", "$25");
        !           515: }
        !           516:
        !           517: static __inline void
        !           518: alpha_pal_wrmces(unsigned long mces)
        !           519: {
        !           520:        register unsigned long a0 __asm("$16") = mces;
        !           521:
        !           522:        __asm __volatile("call_pal %1 # PAL_OSF1_wrmces"
        !           523:                : "=r" (a0)
        !           524:                : "i" (PAL_OSF1_wrmces), "0" (a0)
        !           525:                /* clobbers t0, t8..t11 */
        !           526:                : "$1", "$22", "$23", "$24", "$25");
        !           527: }
        !           528:
        !           529: static __inline void
        !           530: alpha_pal_wrval(unsigned long val)
        !           531: {
        !           532:        register unsigned long a0 __asm("$16") = val;
        !           533:
        !           534:        __asm __volatile("call_pal %1 # PAL_OSF1_wrval"
        !           535:                : "=r" (a0)
        !           536:                : "i" (PAL_OSF1_wrval), "0" (a0)
        !           537:                /* clobbers t0, t8..t11, a0 (above) */
        !           538:                : "$1", "$22", "$23", "$24", "$25");
        !           539: }
        !           540:
        !           541: #endif /* _KERNEL */
        !           542:
        !           543: #endif /* __ALPHA_ALPHA_CPU_H__ */

CVSweb