|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.