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.

2085 lines
38 KiB

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