Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2118 lines
38 KiB

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