Annotation of mstools/h/alpha/kxalpha.h, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3:   Copyright (c) 1992, 1993 Digital Equipment Corporation
        !             4: 
        !             5: 
        !             6:   Module:
        !             7:            kxalpha.h
        !             8:           
        !             9:   Abstract:
        !            10:            Contains alpha architecture constants and assembly macros.
        !            11:   
        !            12:   Author:  
        !            13:           Joe Notarangelo  31-March-1992   (based on Dave Cutler's kxmips.h)
        !            14: 
        !            15: 
        !            16:   Revision History
        !            17: 
        !            18:   16-July-1992       John DeRosa
        !            19: 
        !            20:   Removed fwcalpal.h hook.
        !            21: 
        !            22: 
        !            23:   8-July-1992        John DeRosa
        !            24: 
        !            25:   Added fwcalpal.h hooks, defined HALT call_pal.
        !            26: 
        !            27: 
        !            28: --*/
        !            29: 
        !            30: //
        !            31: // Define Sfw Interrupt Levels and masks
        !            32: //
        !            33: 
        !            34: #define APC_INTERRUPT 0x1
        !            35: #define DISPATCH_INTERRUPT 0x2
        !            36: 
        !            37: //
        !            38: // Define standard integer registers.
        !            39: //
        !            40: // N.B. `at' is `AT' so it doesn't conflict with the `.set at' pseudo-op.
        !            41: //
        !            42: 
        !            43: #define v0 $0                   // return value register
        !            44: #define t0 $1                   // caller saved (temporary) registers
        !            45: #define t1 $2                   //
        !            46: #define t2 $3                   //
        !            47: #define t3 $4                   //
        !            48: #define t4 $5                   //
        !            49: #define t5 $6                   //
        !            50: #define t6 $7                   //
        !            51: #define t7 $8                   //
        !            52: #define s0 $9                   // callee saved (nonvolatile) registers
        !            53: #define s1 $10                  //
        !            54: #define s2 $11                  //
        !            55: #define s3 $12                  //
        !            56: #define s4 $13                  //
        !            57: #define s5 $14                  //
        !            58: #define fp $15                  // frame pointer register, or s6
        !            59: #define a0 $16                  // argument registers
        !            60: #define a1 $17                  //
        !            61: #define a2 $18                  //
        !            62: #define a3 $19                  //
        !            63: #define a4 $20                  //
        !            64: #define a5 $21                  //
        !            65: #define t8 $22                  // caller saved (temporary) registers
        !            66: #define t9 $23                  //
        !            67: #define t10 $24                 //
        !            68: #define t11 $25                 //
        !            69: #define ra $26                  // return address register
        !            70: #define t12 $27                 // caller saved (temporary) registers
        !            71: #define AT $28                  // assembler temporary register
        !            72: #define gp $29                  // global pointer register
        !            73: #define sp $30                  // stack pointer register
        !            74: #define zero $31                // zero register
        !            75: 
        !            76: #ifndef PALCODE
        !            77: 
        !            78: //
        !            79: // Define standard floating point registers.
        !            80: //
        !            81: 
        !            82: #define f0 $f0                  // return value register
        !            83: #define f1 $f1                  // return value register
        !            84: #define f2 $f2                  // callee saved (nonvolatile) registers
        !            85: #define f3 $f3                  //
        !            86: #define f4 $f4                  //
        !            87: #define f5 $f5                  //
        !            88: #define f6 $f6                  //
        !            89: #define f7 $f7                  //
        !            90: #define f8 $f8                  //
        !            91: #define f9 $f9                  //
        !            92: #define f10 $f10                // caller saved (temporary) registers
        !            93: #define f11 $f11                //
        !            94: #define f12 $f12                //
        !            95: #define f13 $f13                //
        !            96: #define f14 $f14                //
        !            97: #define f15 $f15                //
        !            98: #define f16 $f16                // argument registers
        !            99: #define f17 $f17                //
        !           100: #define f18 $f18                //
        !           101: #define f19 $f19                //
        !           102: #define f20 $f20                //
        !           103: #define f21 $f21                //
        !           104: #define f22 $f22                // caller saved (temporary) registers
        !           105: #define f23 $f23                //
        !           106: #define f24 $f24                //
        !           107: #define f25 $f25                //
        !           108: #define f26 $f26                //
        !           109: #define f27 $f27                //
        !           110: #define f28 $f28                //
        !           111: #define f29 $f29                //
        !           112: #define f30 $f30                //
        !           113: #define f31 $f31                // floating zero register
        !           114: #define fzero $f31              // floating zero register (alias)
        !           115: 
        !           116: #endif //!PALCODE
        !           117: 
        !           118: 
        !           119: //
        !           120: // Define procedure entry macros
        !           121: //
        !           122: 
        !           123: #define ALTERNATE_ENTRY(Name)           \
        !           124:         .globl  Name;                   \
        !           125: Name:;
        !           126: 
        !           127: #define LEAF_ENTRY(Name)                \
        !           128:         .text;                          \
        !           129:         .align  4;                      \
        !           130:         .globl  Name;                   \
        !           131:         .ent    Name, 0;                \
        !           132: Name:;                                  \
        !           133:         .frame  sp, 0, ra;              \
        !           134:         .prologue 0;
        !           135: 
        !           136: #define NESTED_ENTRY(Name, fsize, retrg) \
        !           137:         .text;                          \
        !           138:         .align  4;                      \
        !           139:         .globl  Name;                   \
        !           140:         .ent    Name, 0;                \
        !           141: Name:;                                  \
        !           142:         .frame  sp, fsize, retrg;
        !           143: 
        !           144: //
        !           145: // Define global definition macros.
        !           146: //
        !           147: 
        !           148: #define END_REGION(Name)                \
        !           149:         .globl  Name;                   \
        !           150: Name:;
        !           151: 
        !           152: #define START_REGION(Name)              \
        !           153:         .globl  Name;                   \
        !           154: Name:;
        !           155: 
        !           156: //
        !           157: // Define exception handling macros.
        !           158: //
        !           159: 
        !           160: #define EXCEPTION_HANDLER(Handler)      \
        !           161:         .edata 1, Handler;
        !           162: 
        !           163: 
        !           164: #define PROLOGUE_END  .prologue 1;
        !           165: 
        !           166: //
        !           167: // Define save and restore floating state macros.
        !           168: //
        !           169: 
        !           170: #define SAVE_NONVOLATILE_FLOAT_STATE    \
        !           171:         bsr     ra, KiSaveNonVolatileFloatState
        !           172: 
        !           173: //
        !           174: // Define interfaces to pcr and palcode
        !           175: //
        !           176: //    The interfaces defined in the following macros will be PALcode
        !           177: //    calls for some implemenations, but may be in-line code in others
        !           178: //    (eg. uniprocessor vs multiprocessor).  At the current time all of
        !           179: //    the interfaces are PALcode calls.
        !           180: //
        !           181: 
        !           182: //
        !           183: // Define interfaces for cache coherency
        !           184: //
        !           185: 
        !           186: //++
        !           187: //
        !           188: // IMB
        !           189: //
        !           190: // Macro Description:
        !           191: //
        !           192: //     Issue the architecture-defined Instruction Memory Barrier.  This
        !           193: //     instruction will make the processor instruction stream coherent with
        !           194: //     the system memory.
        !           195: //
        !           196: // Mode:
        !           197: //
        !           198: //     Kernel and User.
        !           199: //
        !           200: // Arguments:
        !           201: //
        !           202: //     None.
        !           203: //
        !           204: // Return Value:
        !           205: //
        !           206: //     None.
        !           207: //
        !           208: // Registers Used:
        !           209: //
        !           210: //     None.
        !           211: //
        !           212: //--
        !           213: 
        !           214: #define IMB          call_pal imb
        !           215: 
        !           216: //
        !           217: // Define PALcode Environment Transition Interfaces
        !           218: //
        !           219: 
        !           220: //++
        !           221: //
        !           222: // HALT
        !           223: //
        !           224: // Macro Description:
        !           225: //
        !           226: //     Halt the processor and return to firmware.
        !           227: //
        !           228: // Mode:
        !           229: //
        !           230: //     Kernel only.
        !           231: //
        !           232: // Arguments:
        !           233: //
        !           234: //     None.
        !           235: //
        !           236: // Return Value:
        !           237: //
        !           238: //     Does not return.
        !           239: //
        !           240: // Registers Used:
        !           241: //
        !           242: //     None.
        !           243: //
        !           244: //--
        !           245: 
        !           246: #define HALT         call_pal halt
        !           247: 
        !           248: //++
        !           249: //
        !           250: // RESTART
        !           251: //
        !           252: // Macro Description:
        !           253: //
        !           254: //     Restart the processor with the processor state found in a 
        !           255: //     restart block.
        !           256: //
        !           257: // Mode:
        !           258: //
        !           259: //     Kernel only.
        !           260: //
        !           261: // Arguments:
        !           262: //
        !           263: //     a0 - Supplies a pointer to an ARC restart block with an Alpha AXP
        !           264: //          saved state area.
        !           265: //
        !           266: // Return Value:
        !           267: //
        !           268: //     If successful the call does not return.  Otherwise, any return
        !           269: //     is considered a failure.
        !           270: //
        !           271: // Registers Used:
        !           272: //
        !           273: //     None.
        !           274: //
        !           275: //--
        !           276: 
        !           277: #define RESTART      call_pal restart
        !           278: 
        !           279: //++
        !           280: //
        !           281: // SWPPAL
        !           282: //
        !           283: // Macro Description:
        !           284: //
        !           285: //     Swap the execution environment to a new PALcode image.
        !           286: //
        !           287: // Mode:
        !           288: //
        !           289: //     Kernel only.
        !           290: //
        !           291: // Arguments:
        !           292: //
        !           293: //     a0 - Supplies the physical address of the base of the new PALcode
        !           294: //          image.
        !           295: //
        !           296: //     a1 - a5 - Supply arguments to the new PALcode environment.
        !           297: //
        !           298: // Return Value:
        !           299: //
        !           300: //     Does not return.
        !           301: //
        !           302: // Registers Used:
        !           303: //
        !           304: //     None.
        !           305: //
        !           306: //--
        !           307: 
        !           308: #define SWPPAL       call_pal swppal
        !           309: 
        !           310: //
        !           311: // Define IRQL and interrupt interfaces
        !           312: //
        !           313: 
        !           314: //++
        !           315: //
        !           316: // DISABLE_INTERRUPTS
        !           317: //
        !           318: // Macro Description:
        !           319: //
        !           320: //     Disable all interrupts for the current processor and return the
        !           321: //     previous PSR.
        !           322: //
        !           323: // Mode:
        !           324: //
        !           325: //     Kernel only.
        !           326: //
        !           327: // Arguments:
        !           328: //
        !           329: //     None.
        !           330: //
        !           331: // Return Value:
        !           332: //
        !           333: //     None.
        !           334: //
        !           335: // Registers Used:
        !           336: //
        !           337: //     None.
        !           338: //
        !           339: //--
        !           340: 
        !           341: #define DISABLE_INTERRUPTS        call_pal di
        !           342: 
        !           343: //++
        !           344: //
        !           345: // ENABLE_INTERRUPTS
        !           346: //
        !           347: // Macro Description:
        !           348: //
        !           349: //     Enable interrupts according to the current PSR for the current
        !           350: //     processor.
        !           351: //
        !           352: // Mode:
        !           353: //
        !           354: //     Kernel only.
        !           355: //
        !           356: // Arguments:
        !           357: //
        !           358: //     None.
        !           359: //
        !           360: // Return Value:
        !           361: //
        !           362: //     None.
        !           363: //
        !           364: // Registers Used:
        !           365: //
        !           366: //     None.
        !           367: //
        !           368: //--
        !           369: 
        !           370: #define ENABLE_INTERRUPTS         call_pal ei
        !           371: 
        !           372: //++
        !           373: //
        !           374: // SWAP_IRQL
        !           375: //
        !           376: // Macro Description:
        !           377: //
        !           378: //     Swap the IRQL level for the current processor.
        !           379: //
        !           380: // Mode:
        !           381: //
        !           382: //     Kernel only.
        !           383: //
        !           384: // Arguments:
        !           385: //
        !           386: //     a0 - Supplies the new IRQL level.
        !           387: //
        !           388: // Return Value:
        !           389: //
        !           390: //     v0 = previous IRQL level.
        !           391: //
        !           392: // Registers Used:
        !           393: //
        !           394: //     AT, a1 - a3.
        !           395: //
        !           396: //--
        !           397: 
        !           398: #define SWAP_IRQL    call_pal swpirql
        !           399: 
        !           400: //++
        !           401: //
        !           402: // GET_CURRENT_IRQL
        !           403: //
        !           404: // Macro Description:
        !           405: //
        !           406: //     Return the current processor Interrupt Request Level (IRQL).
        !           407: //
        !           408: // Mode:
        !           409: //
        !           410: //     Kernel only.
        !           411: //
        !           412: // Arguments:
        !           413: //
        !           414: //     None.
        !           415: //
        !           416: // Return Value:
        !           417: //
        !           418: //     v0 = current IRQL.
        !           419: //
        !           420: // Registers Used:
        !           421: //
        !           422: //     AT.
        !           423: //
        !           424: //--
        !           425: 
        !           426: #define GET_CURRENT_IRQL  call_pal rdirql
        !           427: 
        !           428: 
        !           429: //
        !           430: // Define interfaces for software interrupts
        !           431: //
        !           432: 
        !           433: //++
        !           434: //
        !           435: // DEASSERT_SOFTWARE_INTERRUPT
        !           436: //
        !           437: // Macro Description:
        !           438: //
        !           439: //     Deassert the software interrupts indicated in a0 for the current
        !           440: //     processor.
        !           441: //
        !           442: // Mode:
        !           443: //
        !           444: //     Kernel only.
        !           445: //
        !           446: // Arguments:
        !           447: //
        !           448: //     a0 - Supplies the mask for the software interrupt to be de-asserted.
        !           449: //          a0<1> - Deassert DISPATCH software interrupt.
        !           450: //          a0<0> - Deassert APC software interrupt.
        !           451: //
        !           452: // Return Value:
        !           453: //
        !           454: //     None.
        !           455: //
        !           456: // Registers Used:
        !           457: //
        !           458: //     AT, a1 - a3.
        !           459: //
        !           460: //--
        !           461: 
        !           462: #define DEASSERT_SOFTWARE_INTERRUPT    call_pal csir
        !           463: 
        !           464: //++
        !           465: //
        !           466: // REQUEST_SOFTWARE_INTERRUPT
        !           467: //
        !           468: // Macro Description:
        !           469: //
        !           470: //     Request software interrupts on the current processor according to 
        !           471: //     the mask supplied in a0.
        !           472: //
        !           473: // Mode:
        !           474: //
        !           475: //     Kernel only.
        !           476: //
        !           477: // Arguments:
        !           478: //
        !           479: //     a0 - Supplies the mask of software interrupts to be requested.
        !           480: //          a0<1> - Request DISPATCH software interrupt.
        !           481: //          a0<0> - Request APC software interrupt.
        !           482: //
        !           483: // Return Value:
        !           484: //
        !           485: //     None.
        !           486: //
        !           487: // Registers Used:
        !           488: //
        !           489: //     AT, a1 - a3.
        !           490: //
        !           491: //--
        !           492: 
        !           493: #define REQUEST_SOFTWARE_INTERRUPT     call_pal ssir
        !           494: 
        !           495: //
        !           496: // Define interfaces to Processor Status Register
        !           497: //
        !           498: 
        !           499: //++
        !           500: //
        !           501: // GET_CURRENT_PROCESSOR_STATUS_REGISTER
        !           502: //
        !           503: // Macro Description:
        !           504: //
        !           505: //     Return the current Processor Status Register (PSR) for the current
        !           506: //     processor.
        !           507: //
        !           508: // Mode:
        !           509: //
        !           510: //     Kernel only.
        !           511: //
        !           512: // Arguments:
        !           513: //
        !           514: //     None.
        !           515: //
        !           516: // Return Value:
        !           517: //
        !           518: //     v0 = current PSR.
        !           519: //
        !           520: // Registers Used:
        !           521: //
        !           522: //     AT.
        !           523: //
        !           524: //--
        !           525: 
        !           526: #define GET_CURRENT_PROCESSOR_STATUS_REGISTER   call_pal rdpsr
        !           527: 
        !           528: 
        !           529: //
        !           530: // Define current thread interface
        !           531: //
        !           532: 
        !           533: //++
        !           534: //
        !           535: // GET_THREAD_ENVIRONMENT_BLOCK
        !           536: //
        !           537: // Macro Description:
        !           538: //
        !           539: //     Return the base address of the current Thread Environment Block (TEB),
        !           540: //     for the currently executing thread on the current processor.
        !           541: //
        !           542: // Mode;
        !           543: //
        !           544: //     Kernel and User.
        !           545: //
        !           546: // Arguments:
        !           547: //
        !           548: //     None.
        !           549: //
        !           550: // Return Value:
        !           551: //
        !           552: //     v0 = TEB base address.
        !           553: //
        !           554: // Registers Used:
        !           555: //
        !           556: //     None.
        !           557: //
        !           558: //--
        !           559: 
        !           560: #define GET_THREAD_ENVIRONMENT_BLOCK  call_pal rdteb
        !           561: 
        !           562: //++
        !           563: //
        !           564: // GET_CURRENT_THREAD
        !           565: //
        !           566: // Macro Description:
        !           567: //
        !           568: //     Return the thread object address for the currently executing thread
        !           569: //     on the current processor.
        !           570: //
        !           571: // Mode:
        !           572: //
        !           573: //     Kernel only.
        !           574: //
        !           575: // Arguments:
        !           576: //
        !           577: //     None.
        !           578: //
        !           579: // Return Value:
        !           580: //
        !           581: //     v0 = PCR base address.
        !           582: //
        !           583: // Registers Used:
        !           584: //
        !           585: //     AT.
        !           586: //
        !           587: //--
        !           588: 
        !           589: #ifdef NT_UP
        !           590: 
        !           591: //
        !           592: // If uni-processor, retrieve current thread address from the global
        !           593: // variable KiCurrentThread.
        !           594: //
        !           595: 
        !           596: #define GET_CURRENT_THREAD             \
        !           597:        lda     v0, KiCurrentThread;    \
        !           598:        ldl     v0, 0(v0)
        !           599: 
        !           600: #else
        !           601: 
        !           602: //
        !           603: // If multi-processor, retrive per-processor current thread via a call pal.
        !           604: //
        !           605: 
        !           606: #define GET_CURRENT_THREAD    call_pal rdthread
        !           607: 
        !           608: #endif //NT_UP
        !           609: 
        !           610: //
        !           611: // Define per-processor data area routine interfaces
        !           612: //
        !           613: 
        !           614: //++
        !           615: //
        !           616: // GET_PROCESSOR_CONTROL_REGION_BASE
        !           617: //
        !           618: // Macro Description:
        !           619: //
        !           620: //     Return the base address of the Process Control Region (PCR)
        !           621: //     for the current processor.
        !           622: //
        !           623: // Mode:
        !           624: //
        !           625: //     Kernel only.
        !           626: //
        !           627: // Arguments:
        !           628: //
        !           629: //     None.
        !           630: //
        !           631: // Return Value:
        !           632: //
        !           633: //     v0 = PCR base address.
        !           634: //
        !           635: // Registers Used:
        !           636: //
        !           637: //     AT.
        !           638: //
        !           639: //--
        !           640: 
        !           641: #ifdef NT_UP
        !           642: 
        !           643: //
        !           644: // Uni-processor, address of PCR is in global variable.
        !           645: //
        !           646: 
        !           647: #define GET_PROCESSOR_CONTROL_REGION_BASE \
        !           648:        lda     v0, KiPcrBaseAddress;     \
        !           649:        ldl     v0, 0(v0)
        !           650: 
        !           651: #else
        !           652: 
        !           653: //
        !           654: // Multi-processor, get per-processor value via call pal.
        !           655: //
        !           656: 
        !           657: #define GET_PROCESSOR_CONTROL_REGION_BASE    call_pal rdpcr
        !           658: 
        !           659: #endif //NT_UP
        !           660: 
        !           661: //++
        !           662: //
        !           663: // GET_PROCESSOR_CONTROL_BLOCK_BASE
        !           664: //
        !           665: // Macro Description:
        !           666: //
        !           667: //     Return the Processor Control Block base address.
        !           668: //
        !           669: // Mode:
        !           670: //
        !           671: //     Kernel only.
        !           672: //
        !           673: // Arguments:
        !           674: //
        !           675: //     None.
        !           676: //
        !           677: // Return Value:
        !           678: //
        !           679: //     v0 = PRCB base address.
        !           680: //
        !           681: // Registers Used:
        !           682: //
        !           683: //     AT.
        !           684: //
        !           685: //--
        !           686: 
        !           687: #define GET_PROCESSOR_CONTROL_BLOCK_BASE   \
        !           688:        GET_PROCESSOR_CONTROL_REGION_BASE; \
        !           689:        ldl     v0, PcPrcb(v0)
        !           690: 
        !           691: 
        !           692: //
        !           693: // Define kernel stack interfaces
        !           694: //
        !           695: 
        !           696: //++
        !           697: //
        !           698: // GET_INITIAL_KERNEL_STACK
        !           699: //
        !           700: // Macro Description:
        !           701: //
        !           702: //     Return the initial kernel stack address for the current thread.
        !           703: //
        !           704: // Mode:
        !           705: //
        !           706: //     Kernel only.
        !           707: //
        !           708: // Arguments:
        !           709: //
        !           710: //     None.
        !           711: //
        !           712: // Return Value:
        !           713: //
        !           714: //     v0 = initial kernel stack address.
        !           715: //
        !           716: // Registers Used:
        !           717: //
        !           718: //     AT.
        !           719: //
        !           720: //--
        !           721: 
        !           722: #define GET_INITIAL_KERNEL_STACK  call_pal rdksp
        !           723: 
        !           724: //++
        !           725: //
        !           726: // SET_INITIAL_KERNEL_STACK
        !           727: //
        !           728: // Macro Description:
        !           729: //
        !           730: //     Set the initial kernel stack address for the current thread.
        !           731: //
        !           732: // Mode:
        !           733: //
        !           734: //     Kernel only.
        !           735: //
        !           736: // Arguments:
        !           737: //
        !           738: //     a0 - Supplies the new initial kernel stack address.
        !           739: //
        !           740: // Return Value:
        !           741: //
        !           742: //     v0 - Previous initial kernel stack address.
        !           743: //
        !           744: // Registers Used:
        !           745: //
        !           746: //     AT.
        !           747: //
        !           748: //--
        !           749: 
        !           750: #define SET_INITIAL_KERNEL_STACK  call_pal swpksp
        !           751: 
        !           752: //
        !           753: // Define initialization routine interfaces
        !           754: //
        !           755: 
        !           756: //++
        !           757: //
        !           758: // INITIALIZE_PAL
        !           759: //
        !           760: // Macro Description:
        !           761: //
        !           762: //     Supply values to initialize the PALcode.
        !           763: //
        !           764: // Mode:
        !           765: //
        !           766: //     Kernel only.
        !           767: //
        !           768: // Arguments:
        !           769: //
        !           770: //     a0 - Supplies initial PageDirectoryBase (32-bit superpage address).
        !           771: //     a1 - Supplies PRCB Base Address (32-bit superpage address).
        !           772: //     a2 - Supplies address of initial kernel thread object.
        !           773: //     a3 - Supplies address of TEB for initial kernel thread object.
        !           774: //     gp - Supplies kernel image global pointer.
        !           775: //     sp - Supplies initial thread kernel stack pointer.
        !           776: //
        !           777: // Return Value:
        !           778: //
        !           779: //     v0 = PAL base address in 32-bit super-page format (KSEG0). 
        !           780: //
        !           781: // Registers Used:
        !           782: //
        !           783: //     AT, a3.
        !           784: //
        !           785: //--
        !           786: 
        !           787: #define INITIALIZE_PAL  call_pal initpal
        !           788: 
        !           789: //++
        !           790: //
        !           791: // WRITE_KERNEL_ENTRY_POINT
        !           792: //
        !           793: // Macro Description:
        !           794: //
        !           795: //     Register the kernel entry point to receive control for a
        !           796: //     class of exceptions.
        !           797: //
        !           798: // Mode:
        !           799: //
        !           800: //     Kernel only.
        !           801: //
        !           802: // Arguments:
        !           803: //
        !           804: //     a0 - Supplies the address of the kernel entry point.
        !           805: //     a1 - Supplies the class of exception dispatched to this entry point.
        !           806: //          0 = bug check conditions
        !           807: //          1 = memory management faults
        !           808: //          2 = interrupts
        !           809: //          3 = system service calls
        !           810: //          4 = general exception traps
        !           811: //
        !           812: // Return Value:
        !           813: //
        !           814: //     None.
        !           815: //
        !           816: // Registers Used:
        !           817: //
        !           818: //     AT, a2-a3.
        !           819: //
        !           820: //--
        !           821: 
        !           822: #define WRITE_KERNEL_ENTRY_POINT  call_pal wrentry
        !           823: 
        !           824: //
        !           825: // Define entry point values for the wrentry callpal function
        !           826: //
        !           827: 
        !           828: #define entryBugCheck   0
        !           829: #define entryMM         1
        !           830: #define entryInterrupt  2
        !           831: #define entrySyscall    3
        !           832: #define entryGeneral    4
        !           833: 
        !           834: //++
        !           835: //
        !           836: // CACHE_PCR_VALUES
        !           837: //
        !           838: // Macro Description:
        !           839: //
        !           840: //     Notify the PALcode that the PCR has been initialized by the
        !           841: //     kernel and the HAL and that the PALcode may now read values
        !           842: //     from the PCR and cache them inside the processor.
        !           843: //
        !           844: //     N.B. - the PCR pointer must have already been established in
        !           845: //          initpal
        !           846: //
        !           847: //     N.B. - This interface is a processor-specific implementation
        !           848: //          and cannot be assumed to be present on all processors.
        !           849: //          Currently implemented for the following processors:
        !           850: //
        !           851: //              DECchip 21064
        !           852: //
        !           853: // Mode:
        !           854: //
        !           855: //     Kernel only.
        !           856: //
        !           857: // Arguments:
        !           858: //
        !           859: //     None.
        !           860: //
        !           861: // Return Value:
        !           862: //
        !           863: //     None.
        !           864: //
        !           865: // Registers Used:
        !           866: //
        !           867: //     AT, a0 - a3.
        !           868: //
        !           869: //--
        !           870: 
        !           871: #define CACHE_PCR_VALUES  call_pal initpcr
        !           872: 
        !           873: //
        !           874: // Define transition interfaces
        !           875: //
        !           876: 
        !           877: //++
        !           878: //
        !           879: // RETURN_FROM_TRAP_OR_INTERRUPT
        !           880: //
        !           881: // Macro Description:
        !           882: //
        !           883: //     Return to execution thread after processing a trap or 
        !           884: //     interrupt.  Traps can be general exceptions (breakpoint,
        !           885: //     arithmetic traps, etc.) or memory management faults.
        !           886: //     This macro is also used to startup a thread of execution
        !           887: //     for the first time.
        !           888: //
        !           889: // Mode:
        !           890: //
        !           891: //     Kernel only.
        !           892: //
        !           893: // Arguments:
        !           894: //
        !           895: //     a0 - Supplies the previous processor status register.
        !           896: //     a1 - Supplies new software interrupt requests.
        !           897: //          a1<1> - Request a DISPATCH Interrupt.
        !           898: //          a1<0> - Request an APC Interrupt.
        !           899: //
        !           900: // Return Value:
        !           901: //
        !           902: //     Does not return.
        !           903: //
        !           904: // Registers Used:
        !           905: //
        !           906: //     None.
        !           907: //
        !           908: //--
        !           909: 
        !           910: #define RETURN_FROM_TRAP_OR_INTERRUPT      call_pal rfe
        !           911: 
        !           912: //++
        !           913: //
        !           914: // RETURN_FROM_SYSTEM_CALL
        !           915: //
        !           916: // Macro Description:
        !           917: //
        !           918: //     Return from a system service call.
        !           919: //
        !           920: // Mode:
        !           921: //
        !           922: //     Kernel only.
        !           923: //
        !           924: // Arguments:
        !           925: //
        !           926: //     a0 - Supplies the previous processor status register.
        !           927: //     a1 - Supplies new software interrupt requests.
        !           928: //          a1<1> - Request a DISPATCH Interrupt.
        !           929: //          a1<0> - Request an APC Interrupt.
        !           930: //
        !           931: // Return Value:
        !           932: //
        !           933: //     Does not return.
        !           934: //
        !           935: // Registers Used:
        !           936: //
        !           937: //     All volatile registers.
        !           938: //
        !           939: //--
        !           940: 
        !           941: #define RETURN_FROM_SYSTEM_CALL   call_pal retsys
        !           942: 
        !           943: //++
        !           944: //
        !           945: // SYSCALL
        !           946: //
        !           947: // Macro Description:
        !           948: //
        !           949: //     Call a system service.
        !           950: //
        !           951: // Mode:
        !           952: //
        !           953: //     Kernel and User.
        !           954: //
        !           955: // Arguments:
        !           956: //
        !           957: //     v0 - Supplies the system service number.
        !           958: //     [other arguments as per calling standard]
        !           959: //
        !           960: // Return Value:
        !           961: //
        !           962: //     Will not return directly, returns via retsys, no return value.
        !           963: //
        !           964: // Registers Used:
        !           965: //
        !           966: //     All volatile registers.
        !           967: //
        !           968: //--
        !           969: 
        !           970: #define SYSCALL  call_pal callsys
        !           971: 
        !           972: //
        !           973: // Define breakpoint interfaces
        !           974: //
        !           975: 
        !           976: //++
        !           977: //
        !           978: // BREAK
        !           979: //
        !           980: // Macro Description:
        !           981: //
        !           982: //     Issue a user breakpoint which may be handled by a user-mode
        !           983: //     debugger.
        !           984: //
        !           985: // Mode:
        !           986: //
        !           987: //     Kernel and User.
        !           988: //
        !           989: // Arguments:
        !           990: //
        !           991: //     None.
        !           992: //
        !           993: // Return Value:
        !           994: //
        !           995: //     Will not return directly, returns via rti, no return value.
        !           996: //
        !           997: // Registers Used:
        !           998: //
        !           999: //     None.
        !          1000: //
        !          1001: //--
        !          1002: 
        !          1003: #define BREAK    call_pal bpt
        !          1004: 
        !          1005: //++
        !          1006: //
        !          1007: // BREAK_DEBUG_STOP
        !          1008: //
        !          1009: // Macro Description:
        !          1010: //
        !          1011: //     Issue a stop breakpoint to the kernel debugger.
        !          1012: //
        !          1013: // Mode:
        !          1014: //
        !          1015: //     Kernel and User.
        !          1016: //
        !          1017: // Arguments:
        !          1018: //
        !          1019: //     None.
        !          1020: //
        !          1021: // Return Value:
        !          1022: //
        !          1023: //     Will not return directly, returns via rti, no return value.
        !          1024: //
        !          1025: // Registers Used:
        !          1026: //
        !          1027: //     AT, v0.
        !          1028: //
        !          1029: //--
        !          1030: 
        !          1031: #define BREAK_DEBUG_STOP \
        !          1032:     ldil    v0, DEBUG_STOP_BREAKPOINT; \
        !          1033:     call_pal callkd
        !          1034: 
        !          1035: //++
        !          1036: //++
        !          1037: //
        !          1038: // BREAK_BREAKIN
        !          1039: //
        !          1040: // Macro Description:
        !          1041: //
        !          1042: //     Issue a breakin breakpoint to the kernel debugger.
        !          1043: //
        !          1044: // Mode:
        !          1045: //
        !          1046: //     Kernel and User.
        !          1047: //
        !          1048: // Arguments:
        !          1049: //
        !          1050: //     None.
        !          1051: //
        !          1052: // Return Value:
        !          1053: //
        !          1054: //     Will not return directly, returns via rti, no return value.
        !          1055: //
        !          1056: // Registers Used:
        !          1057: //
        !          1058: //     AT, v0.
        !          1059: //
        !          1060: //--
        !          1061: 
        !          1062: #define BREAK_BREAKIN \
        !          1063:     ldil    v0, BREAKIN_BREAKPOINT; \
        !          1064:     call_pal callkd
        !          1065: 
        !          1066: //++
        !          1067: //
        !          1068: // BREAK_DEBUG_LOAD_SYMBOLS
        !          1069: //
        !          1070: // Macro Description:
        !          1071: //
        !          1072: //     Issue a load symbols breakpoint to the kernel debugger.
        !          1073: //
        !          1074: // Mode:
        !          1075: //
        !          1076: //     Kernel and User.
        !          1077: //
        !          1078: // Arguments:
        !          1079: //
        !          1080: //     None.
        !          1081: //
        !          1082: // Return Value:
        !          1083: //
        !          1084: //     Will not return directly, returns via rti, no return value.
        !          1085: //
        !          1086: // Registers Used:
        !          1087: //
        !          1088: //     AT, v0.
        !          1089: //
        !          1090: //--
        !          1091: 
        !          1092: #define BREAK_DEBUG_LOAD_SYMBOLS \
        !          1093:     ldil    v0, DEBUG_LOAD_SYMBOLS_BREAKPOINT; \
        !          1094:     call_pal callkd
        !          1095: 
        !          1096: //++
        !          1097: //
        !          1098: // BREAK_DEBUG_UNLOAD_SYMBOLS
        !          1099: //
        !          1100: // Macro Description:
        !          1101: //
        !          1102: //     Issue a unload symbols breakpoint to the kernel debugger.
        !          1103: //
        !          1104: // Mode:
        !          1105: //
        !          1106: //     Kernel and User.
        !          1107: //
        !          1108: // Arguments:
        !          1109: //
        !          1110: //     None.
        !          1111: //
        !          1112: // Return Value:
        !          1113: //
        !          1114: //     Will not return directly, returns via rti, no return value.
        !          1115: //
        !          1116: // Registers Used:
        !          1117: //
        !          1118: //     AT, v0.
        !          1119: //
        !          1120: //--
        !          1121: 
        !          1122: #define BREAK_DEBUG_UNLOAD_SYMBOLS \
        !          1123:     ldil    v0, DEBUG_UNLOAD_SYMBOLS_BREAKPOINT; \
        !          1124:     call_pal callkd
        !          1125: 
        !          1126: //++
        !          1127: //
        !          1128: // BREAK_DEBUG_PRINT
        !          1129: //
        !          1130: // Macro Description:
        !          1131: //
        !          1132: //     Cause a debug print breakpoint which will be interpreted by
        !          1133: //     the kernel debugger and will print a string to the kernel debugger
        !          1134: //     port.
        !          1135: //
        !          1136: // Mode:
        !          1137: //
        !          1138: //     Kernel and User.
        !          1139: //
        !          1140: // Arguments:
        !          1141: //
        !          1142: //     a0 - Supplies the address of ASCII string to print.
        !          1143: //     a1 - Supplies the length of the string to print.
        !          1144: //
        !          1145: // Return Value:
        !          1146: //
        !          1147: //     Does not return directly, returns via rti, no return value.
        !          1148: //
        !          1149: // Registers Used:
        !          1150: //
        !          1151: //     AT, v0.
        !          1152: //
        !          1153: //--
        !          1154: 
        !          1155: 
        !          1156: #define BREAK_DEBUG_PRINT \
        !          1157:     ldil    v0, DEBUG_PRINT_BREAKPOINT; \
        !          1158:     call_pal callkd
        !          1159: 
        !          1160: //++
        !          1161: //
        !          1162: // BREAK_DEBUG_PROMPT
        !          1163: //
        !          1164: // Macro Description:
        !          1165: //
        !          1166: //     Cause a debug print breakpoint which will be interpreted by
        !          1167: //     the kernel debugger and will receive a string from the kernel debugger
        !          1168: //     port after prompting for input.
        !          1169: //
        !          1170: // Mode:
        !          1171: //
        !          1172: //     Kernel and User.
        !          1173: //
        !          1174: // Arguments:
        !          1175: //
        !          1176: //     a0 - Supplies the address of ASCII string to print.
        !          1177: //     a1 - Supplies the length of the string to print.
        !          1178: //     a2 - Supplies the address of the buffer to receive the input string.
        !          1179: //     a3 - Supplies the maximum length of the input string.
        !          1180: //
        !          1181: // Return Value:
        !          1182: //
        !          1183: //     Does not return directly, returns via rti, no return value.
        !          1184: //
        !          1185: // Registers Used:
        !          1186: //
        !          1187: //     AT, v0.
        !          1188: //
        !          1189: //--
        !          1190: 
        !          1191: 
        !          1192: #define BREAK_DEBUG_PROMPT \
        !          1193:     ldil    v0, DEBUG_PROMPT_BREAKPOINT; \
        !          1194:     call_pal callkd
        !          1195: 
        !          1196: //
        !          1197: // Define tb manipulation interfaces
        !          1198: //
        !          1199: 
        !          1200: //++
        !          1201: //
        !          1202: // TB_INVALIDATE_ALL
        !          1203: //
        !          1204: // Macro Description:
        !          1205: //
        !          1206: //     Invalidate all cached virtual address translations for the current
        !          1207: //     processor that are not fixed.
        !          1208: //     Some translations may be fixed in hardware and/or software and
        !          1209: //     these are not invalidated (eg. super-pages).
        !          1210: //
        !          1211: // Mode:
        !          1212: //
        !          1213: //     Kernel only.
        !          1214: //
        !          1215: // Arguments:
        !          1216: //
        !          1217: //     None.
        !          1218: //
        !          1219: // Return Value:
        !          1220: //
        !          1221: //     None.
        !          1222: //
        !          1223: // Registers Used:
        !          1224: //
        !          1225: //     a0 - a3.
        !          1226: //
        !          1227: //--
        !          1228: 
        !          1229: 
        !          1230: #define TB_INVALIDATE_ALL   call_pal tbia
        !          1231: 
        !          1232: //++
        !          1233: //
        !          1234: // TB_INVALIDATE_SINGLE
        !          1235: //
        !          1236: // Macro Description:
        !          1237: //
        !          1238: //     Invalidate any cached virtual address translations for a single
        !          1239: //     virtual address.
        !          1240: //
        !          1241: //     Note - it is legal for an implementation to invalidate more
        !          1242: //     translations that the single one specified.
        !          1243: //
        !          1244: // Mode:
        !          1245: //
        !          1246: //     Kernel only.
        !          1247: //
        !          1248: // Arguments:
        !          1249: //
        !          1250: //     a0 - Supplies the Virtual Address of the translation to invalidate.
        !          1251: //
        !          1252: // Return Value:
        !          1253: //
        !          1254: //     None.
        !          1255: //
        !          1256: // Registers Used:
        !          1257: //
        !          1258: //     a1 - a3.
        !          1259: //
        !          1260: //--
        !          1261: 
        !          1262: #define TB_INVALIDATE_SINGLE   call_pal tbis
        !          1263: 
        !          1264: //++
        !          1265: //
        !          1266: // DATA_TB_INVALIDATE_SINGLE
        !          1267: //
        !          1268: // Macro Description:
        !          1269: //
        !          1270: //     Invalidate data stream translations for a single virtual address.
        !          1271: //
        !          1272: //     Note - it is legal for an implementation to invalidate more
        !          1273: //     translations that the single one specified.
        !          1274: //
        !          1275: // Mode:
        !          1276: //
        !          1277: //     Kernel only.
        !          1278: //
        !          1279: // Arguments:
        !          1280: //
        !          1281: //     a0 - Supplies the Virtual Address of the translation to invalidate.
        !          1282: //
        !          1283: // Return Value:
        !          1284: //
        !          1285: //     None.
        !          1286: //
        !          1287: // Registers Used:
        !          1288: //
        !          1289: //     a1 - a3.
        !          1290: //
        !          1291: //--
        !          1292: 
        !          1293: #define DATA_TB_INVALIDATE_SINGLE  call_pal dtbis
        !          1294: 
        !          1295: //
        !          1296: // Define context switch interfaces
        !          1297: //
        !          1298: 
        !          1299: //++
        !          1300: //
        !          1301: // SWAP_THREAD_CONTEXT
        !          1302: //
        !          1303: // Macro Description:
        !          1304: //
        !          1305: //     
        !          1306: //     Change to a new thread context.  This will mean a new kernel stack,
        !          1307: //     new current thread address and a new thread environment block.
        !          1308: //
        !          1309: // Mode:
        !          1310: //
        !          1311: //     Kernel only.
        !          1312: //
        !          1313: // Arguments:
        !          1314: //
        !          1315: //     a0 - Supplies the Virtual Address of new initial kernel stack.
        !          1316: //     a1 - Supplies the address of new thread object.
        !          1317: //     a2 - Supplies the address of new thread environment block.
        !          1318: //     a3 - Supplies the PFN of the new page directory if the process
        !          1319: //          is to be swapped, -1 otherwise.
        !          1320: //     a4 - Supplies the ASN of the new processor if the process is to
        !          1321: //          be swapped, undefined otherwise.
        !          1322: //     a5 - Supplies the ASN wrap indicator if the process is to be swapped,
        !          1323: //          undefined otherwise.
        !          1324: //
        !          1325: // Return Value:
        !          1326: //
        !          1327: //     None.
        !          1328: //
        !          1329: // Registers Used:
        !          1330: //
        !          1331: //     AT.
        !          1332: //
        !          1333: //--
        !          1334: 
        !          1335: #define SWAP_THREAD_CONTEXT   call_pal  swpctx
        !          1336: 
        !          1337: //++
        !          1338: //
        !          1339: // SWAP_PROCESS_CONTEXT
        !          1340: //
        !          1341: // Macro Description:
        !          1342: //
        !          1343: //     Change from one process address space to another.
        !          1344: //
        !          1345: // Mode:
        !          1346: //
        !          1347: //     Kernel only.
        !          1348: //
        !          1349: // Arguments:
        !          1350: //
        !          1351: //     a0 - Supplies the Pfn of Page Directory for new address space.
        !          1352: //     a1 - Supplies the Address Space Number for new address space.
        !          1353: //     a2 - Supplies the ASN wrap indicator (0 = no wrap, non-zero = wrap).
        !          1354: //
        !          1355: // Return Value:
        !          1356: //
        !          1357: //     None.
        !          1358: //
        !          1359: // Registers Used:
        !          1360: //
        !          1361: //     AT, a3.
        !          1362: //
        !          1363: //--
        !          1364: 
        !          1365: #define SWAP_PROCESS_CONTEXT  call_pal  swpprocess
        !          1366: 
        !          1367: //
        !          1368: // Define access to DPC Active flag
        !          1369: //
        !          1370: 
        !          1371: //++
        !          1372: //
        !          1373: // GET_DPC_ACTIVE_FLAG
        !          1374: //
        !          1375: // Macro Description:
        !          1376: //
        !          1377: //     Return the DPC Active Flag for the current processor.
        !          1378: //
        !          1379: // Mode:
        !          1380: //
        !          1381: //     Kernel only.
        !          1382: //
        !          1383: // Arguments:
        !          1384: //
        !          1385: //     None.
        !          1386: //
        !          1387: // Return Value:
        !          1388: //
        !          1389: //     v0 = DPC Active Flag
        !          1390: //
        !          1391: // Registers Used:
        !          1392: //
        !          1393: //     AT.
        !          1394: //
        !          1395: //--
        !          1396: 
        !          1397: #define GET_DPC_ACTIVE_FLAG \
        !          1398:        GET_PROCESSOR_CONTROL_REGION_BASE; \
        !          1399:        ldl     v0, PcDpcRoutineActive(v0)
        !          1400: 
        !          1401: //++
        !          1402: //
        !          1403: // SET_DPC_ACTIVE_FLAG
        !          1404: //
        !          1405: // Macro Description:
        !          1406: //
        !          1407: //     Set the DPC Active Flag for the current processor.
        !          1408: //
        !          1409: // Mode:
        !          1410: //
        !          1411: //     Kernel only.
        !          1412: //
        !          1413: // Arguments:
        !          1414: //
        !          1415: //     a0 = Supplies the DPC Active Flag Value to set.
        !          1416: //
        !          1417: // Return Value:
        !          1418: //
        !          1419: //     None.
        !          1420: //
        !          1421: // Registers Used:
        !          1422: //
        !          1423: //     AT.
        !          1424: //
        !          1425: //--
        !          1426: 
        !          1427: #define SET_DPC_ACTIVE_FLAG                    \
        !          1428:        .set    noat;                           \
        !          1429:        GET_PROCESSOR_CONTROL_REGION_BASE;      \
        !          1430:        stl     a0, PcDpcRoutineActive(v0);     \
        !          1431:        .set    at
        !          1432: 
        !          1433: 
        !          1434: //
        !          1435: // Define interfaces for generate trap
        !          1436: //
        !          1437: 
        !          1438: //++
        !          1439: //
        !          1440: // GENERATE_TRAP
        !          1441: //
        !          1442: // Macro Description:
        !          1443: //
        !          1444: //     Generate a trap.  Code has discovered an exception condition
        !          1445: //     and wants to raise a trap to indicate the condition.  Anticipated
        !          1446: //     for use by compilers for divide by zero, etc..
        !          1447: //
        !          1448: // Mode:
        !          1449: //
        !          1450: //     Kernel and User.
        !          1451: //
        !          1452: // Arguments:
        !          1453: //
        !          1454: //     a0 = Supplies the trap number which identifies the exception.
        !          1455: //
        !          1456: // Return Value:
        !          1457: //
        !          1458: //     Does not return, generates a trap to kernel mode, no return value.
        !          1459: //
        !          1460: // Registers Used:
        !          1461: //
        !          1462: //     None.
        !          1463: //
        !          1464: //--
        !          1465: 
        !          1466: #define GENERATE_TRAP call_pal gentrap
        !          1467: 
        !          1468: //
        !          1469: // Define performance and debug interfaces.
        !          1470: //
        !          1471: 
        !          1472: //++
        !          1473: //
        !          1474: // GET_INTERNAL_COUNTERS
        !          1475: //
        !          1476: // Macro Description:
        !          1477: //
        !          1478: //     Read the internal processor event counters.  The counter formats
        !          1479: //     and the events counted are processor implementation-dependent.
        !          1480: //
        !          1481: //     N.B. - the counters will only be implemented for checked builds.
        !          1482: //
        !          1483: // Mode:
        !          1484: //
        !          1485: //     Kernel.
        !          1486: //
        !          1487: // Arguments:
        !          1488: //
        !          1489: //     a0 - Supplies the superpage 32 address of the buffer to receive
        !          1490: //          the counter data.  The address must be quadword aligned.
        !          1491: //
        !          1492: //     a1 - Supplies the length of the buffer allocated for the counters.
        !          1493: //
        !          1494: // Return Value:
        !          1495: //
        !          1496: //     v0 - 0 is returned if the interface is not implemented.
        !          1497: //          If v0 <= a1 then v0 is the length of the data returned.
        !          1498: //          If v0 > a1 then v0 is the length of the processor implementation
        !          1499: //          counter record. 
        !          1500: //
        !          1501: // Registers Used:
        !          1502: //
        !          1503: //     AT, a2 - a3.
        !          1504: //
        !          1505: //--
        !          1506: 
        !          1507: #define GET_INTERNAL_COUNTERS  call_pal rdcounters
        !          1508: 
        !          1509: //++
        !          1510: //
        !          1511: // GET_INTERNAL_PROCESSOR_STATE
        !          1512: //
        !          1513: // Macro Description:
        !          1514: //
        !          1515: //     Read the internal processor state.  The data values returned and
        !          1516: //     their format are processor implementation-dependent.
        !          1517: //
        !          1518: // Mode:
        !          1519: //
        !          1520: //     Kernel.
        !          1521: //
        !          1522: // Arguments:
        !          1523: //
        !          1524: //     a0 - Supplies the superpage 32 address of the buffer to receive
        !          1525: //          the processor state data.  The address must be quadword aligned.
        !          1526: //
        !          1527: //     a1 - Supplies the length of the buffer allocated for the state.
        !          1528: //
        !          1529: // Return Value:
        !          1530: //
        !          1531: //     v0 - If v0 <= a1 then v0 is the length of the data returned.
        !          1532: //          If v0 > a1 then v0 is the length of the processor implementation
        !          1533: //          state record. 
        !          1534: //
        !          1535: // Registers Used:
        !          1536: //
        !          1537: //     AT, a2 - a3.
        !          1538: //
        !          1539: //--
        !          1540: 
        !          1541: #define GET_INTERNAL_PROCESSOR_STATE  call_pal rdstate
        !          1542: 
        !          1543: //++
        !          1544: //
        !          1545: // WRITE_PERFORMANCE_COUNTERS
        !          1546: //
        !          1547: // Macro Description:
        !          1548: //
        !          1549: //     Write the state of the internal processor performance counters.
        !          1550: //     The number of performance counters, the events they count, and their
        !          1551: //     usage is processor implementation-depedent.
        !          1552: //
        !          1553: // Mode:
        !          1554: //
        !          1555: //     Kernel.
        !          1556: //
        !          1557: // Arguments:
        !          1558: //
        !          1559: //     a0 - Supplies the number of the performance counter.
        !          1560: //
        !          1561: //     a1 - Supplies a flag that indicates if the performance counter is
        !          1562: //          to be enabled or disabled (0 = disabled, non-zero = enabled).
        !          1563: //
        !          1564: //     a2 - a5 - Supply processor implementation-dependent parameters.
        !          1565: //
        !          1566: // Return Value:
        !          1567: //
        !          1568: //     v0 - 0 is returned if the operation is unsuccessful or the performance
        !          1569: //          counter does not exist.  Otherwise, a non-zero value is returned.
        !          1570: //
        !          1571: // Registers Used:
        !          1572: //
        !          1573: //     AT, a2 - a5.
        !          1574: //
        !          1575: //--
        !          1576: 
        !          1577: #define WRITE_PERFORMANCE_COUNTERS  call_pal wrperfmon
        !          1578: 
        !          1579: 
        !          1580: //
        !          1581: // Define interfaces for controlling the state of machine checks.
        !          1582: //
        !          1583: 
        !          1584: //++
        !          1585: //
        !          1586: // DRAIN_ABORTS
        !          1587: //
        !          1588: // Macro Description:
        !          1589: //
        !          1590: //     Stall processor execution until all previous instructions have
        !          1591: //     executed to the point that any exceptions they may raise have been
        !          1592: //     signalled.
        !          1593: //
        !          1594: // Mode:
        !          1595: //
        !          1596: //     Kernel.
        !          1597: //
        !          1598: // Arguments:
        !          1599: //
        !          1600: //     None.
        !          1601: //
        !          1602: // Return Value:
        !          1603: //
        !          1604: //     None.
        !          1605: //
        !          1606: // Registers Used:
        !          1607: //
        !          1608: //     None.
        !          1609: //
        !          1610: //--
        !          1611: 
        !          1612: #define DRAIN_ABORTS  call_pal draina
        !          1613: 
        !          1614: 
        !          1615: //++
        !          1616: //
        !          1617: // GET_MACHINE_CHECK_ERROR_SUMMARY
        !          1618: //
        !          1619: // Macro Description:
        !          1620: //
        !          1621: //     Read the processor machine check error summary register.
        !          1622: //
        !          1623: // Mode:
        !          1624: //
        !          1625: //     Kernel.
        !          1626: //
        !          1627: // Arguments:
        !          1628: //
        !          1629: //     None.
        !          1630: //
        !          1631: // Return Value:
        !          1632: //
        !          1633: //     v0 - The value of the MCES register.
        !          1634: //
        !          1635: // Registers Used:
        !          1636: //
        !          1637: //     AT.
        !          1638: //
        !          1639: //--
        !          1640: 
        !          1641: #define GET_MACHINE_CHECK_ERROR_SUMMARY  call_pal rdmces
        !          1642: 
        !          1643: 
        !          1644: //++
        !          1645: //
        !          1646: // WRITE_MACHINE_CHECK_ERROR_SUMMARY
        !          1647: //
        !          1648: // Macro Description:
        !          1649: //
        !          1650: //     Write new values to the machine check error summary register.
        !          1651: //
        !          1652: // Mode:
        !          1653: //
        !          1654: //     Kernel.
        !          1655: //
        !          1656: // Arguments:
        !          1657: //
        !          1658: //     a0 - Supplies the values to write to the MCES register.
        !          1659: //
        !          1660: // Return Value:
        !          1661: //
        !          1662: //     v0 - Previous value of the MCES register.
        !          1663: //
        !          1664: // Registers Used:
        !          1665: //
        !          1666: //     AT, a1 - a3.
        !          1667: //
        !          1668: //--
        !          1669: 
        !          1670: #define WRITE_MACHINE_CHECK_ERROR_SUMMARY  call_pal wrmces
        !          1671: 
        !          1672: 
        !          1673: 
        !          1674: //
        !          1675: // Define subtitle macro
        !          1676: //
        !          1677: 
        !          1678: #define SBTTL(x)
        !          1679: 
        !          1680: //
        !          1681: // Define mnemonic for writing callpal in assembly language that will
        !          1682: // fit in the opcode field.
        !          1683: //
        !          1684: 
        !          1685: #define callpal call_pal
        !          1686: 
        !          1687: //
        !          1688: // Define exception data section and align.
        !          1689: //
        !          1690: // Nearly all source files that include this header file need the following
        !          1691: // few pseudo-ops and so, by default, they are placed once here rather than
        !          1692: // repeated in every source file.  If these pseudo-ops are not needed, then
        !          1693: // define HEADER_FILE prior to including this file.
        !          1694: //
        !          1695: // Also the PALCODE environment uses this include file but cannot use
        !          1696: // these definitions.
        !          1697: //
        !          1698: 
        !          1699: #if  !defined(HEADER_FILE) && !defined(PALCODE)
        !          1700: 
        !          1701:         .edata 0
        !          1702:         .align 2
        !          1703:         .text
        !          1704: 
        !          1705: #endif

unix.superglobalmegacorp.com

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