vxLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:20k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* vxLib.c - miscellaneous support routines */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01t,05jun02,wsl  remove reference to SPARC and i960
  7. 01s,20nov01,hdn  updated x86 specific sections
  8. 01r,16nov01,tlc  Update for MIPS architecture.
  9. 01q,29oct01,zl   SH documentation updates.
  10. 01p,03mar00,zl   merged SH support into T2
  11. 01o,12mar99,elg  VX_POWER_MODE_NAP is not supported by PPC860 (SPR 22432).
  12. 01n,05oct98,jmp  doc: added {...} when necessary.
  13. 01m,18aug98,fle  doc : added star character at the beginning of the
  14.                  vxPowerDown description
  15. 01l,21apr98,jpd  added ARM SWPB note.
  16. 01k,04jun97,dat  added vxMemArchProbe, SPR 8658
  17. 01j,12nov96,dgp  doc: add vxPowerModeGet/Set/Down routines
  18. 01i,25nov95,jdi  removed 29k stuff.
  19. 01h,23oct95,jdi  doc: added bit values to vxMemProbe() arg (SPR 4276).
  20. 01g,22oct95,jdi  doc: added am29k test-and-set instruction (SPR 4356).
  21. 01f,20mar95,jdi  added new vxSSEnable()/vxSSDisable() stuff from
  22. mc68k/vxALib.s.
  23. 01e,31jan95,rhp  doc tweaks.
  24.             jdi  changed 80960 to i960.
  25. 01d,08nov93,pme Added vxUnalignedAccessEnable() and vxUnalignedAccessDisable().
  26. 01c,15feb93,jdi made NOMANUAL: vxAtomicModify(), vxIACSend(), vxIMRClear(),
  27. vxIMRSet(), vxSysctlSend().
  28. 01b,20jan93,jdi documentation cleanup.
  29. 01a,23sep92,jdi written, based on vxALib.s and vxLib.c for
  30. mc68k, sparc, i960, mips.
  31. */
  32. /*
  33. DESCRIPTION
  34. This module contains miscellaneous VxWorks support routines.
  35. INCLUDE FILES: vxLib.h
  36. */
  37. /*******************************************************************************
  38. *
  39. * vxTas - C-callable atomic test-and-set primitive
  40. *
  41. * This routine provides a C-callable interface to a test-and-set
  42. * instruction.  The test-and-set instruction is executed on the specified
  43. * address.  The architecture test-and-set instruction is:
  44. *
  45. * 68K: 'tas'
  46. * x86:    'lock bts'
  47. * SH: 'tas.b'
  48. * ARM: 'swpb'
  49. *
  50. * This routine is equivalent to sysBusTas() in sysLib.
  51. *
  52. * MIPS:
  53. * Because VxWorks does not support the MIPS MMU, only kseg0 and kseg1
  54. * addresses are accepted; other addresses return FALSE. 
  55. *
  56. * NOTE X86:
  57. * BTS "Bit Test and Set" instruction is executed with LOCK instruction prefix
  58. * to lock the Bus during the execution.  The bit position 0 is toggled.
  59. *
  60. * NOTE SH:
  61. * The SH version of vxTas() simply executes the `tas.b' instruction, and the
  62. * test-and-set (atomic read-modify-write) operation may require an external
  63. * bus locking mechanism on some hardware.  In this case, wrap the vxTas()
  64. * with a bus locking and unlocking code in the sysBusTas().
  65. *
  66. * RETURNS:
  67. * TRUE if the value had not been set (but is now), or FALSE if the
  68. * value was set already.
  69. *
  70. * SEE ALSO: sysBusTas()
  71. */
  72. BOOL vxTas 
  73.     (
  74.     void * address /* address to test and set */
  75.     )
  76.     {
  77.     ...
  78.     }
  79. /*******************************************************************************
  80. *
  81. * vxMemArchProbe - architecture specific part of vxMemProbe
  82. *
  83. * This is the routine implementing the architecture specific part of the
  84. * vxMemProbe routine.  It traps the relevant exceptions
  85. * while accessing the specified address.  If an
  86. * exception occurs, then the result will be ERROR.  If no exception occurs
  87. * then the result will be OK.
  88. *
  89. * RETURNS: OK or ERROR if an exception occurred during access.
  90. */
  91. STATUS vxMemArchProbe 
  92.     (
  93.     FAST char *  adrs,    /* address to be probed          */
  94.     int          mode,    /* VX_READ or VX_WRITE           */
  95.     int          length,  /* 1, 2, 4, or 8                 */
  96.     FAST char *  pVal     /* where to return value,        */
  97.   /* or ptr to value to be written */
  98.     )
  99.     {
  100.     ...
  101.     }
  102. /*******************************************************************************
  103. *
  104. * vxMemProbe - probe an address for a bus error
  105. *
  106. * This routine probes a specified address to see if it is readable or
  107. * writable, as specified by <mode>.  The address is read or written as
  108. * 1, 2, or 4 bytes, as specified by <length> (values other than 1, 2, or 4
  109. * yield unpredictable results).  If the probe is a VX_READ (0), the value
  110. * read is copied to the location pointed to by <pVal>.  If the probe is a
  111. * VX_WRITE (1), the value written is taken from the location pointed to by
  112. * <pVal>.  In either case, <pVal> should point to a value of 1, 2, or 4
  113. * bytes, as specified by <length>.
  114. *
  115. * Note that only bus errors are trapped during the probe, and that the
  116. * access must otherwise be valid (i.e., it must not generate an 
  117. * address error).
  118. *
  119. * EXAMPLE
  120. * .CS
  121. *     testMem (adrs)
  122. *         char *adrs;
  123. *         {
  124. *         char testW = 1;
  125. *         char testR;
  126. *
  127. *         if (vxMemProbe (adrs, VX_WRITE, 1, &testW) == OK)
  128. *             printf ("value %d written to adrs %xen", testW, adrs);
  129. *
  130. *         if (vxMemProbe (adrs, VX_READ, 1, &testR) == OK)
  131. *             printf ("value %d read from adrs %xen", testR, adrs);
  132. *         }
  133. * .CE
  134. *
  135. * MODIFICATION
  136. * The BSP can modify the behaviour of vxMemProbe() by supplying an alternate
  137. * routine and placing the address in the global variable
  138. * _func_vxMemProbeHook.  The BSP routine will be called instead of the
  139. * architecture specific routine vxMemArchProbe().
  140. *
  141. * INTERNAL
  142. * This routine functions by setting the bus error trap vector to
  143. * vxMemProbeTrap and then trying to read/write the specified byte.  If the
  144. * address doesn't exist, vxMemProbeTrap will return ERROR.  Note that this
  145. * routine saves and restores the bus error vector that was there prior to
  146. * this call.  The entire procedure is done with interrupts locked out.
  147. *
  148. * RETURNS:
  149. * OK, or ERROR if the probe caused a bus error or was misaligned.
  150. *
  151. * SEE ALSO:
  152. * vxMemArchProbe()
  153. */
  154. STATUS vxMemProbe 
  155.     (
  156.     FAST char *  adrs,    /* address to be probed          */
  157.     int          mode,    /* VX_READ or VX_WRITE           */
  158.     int          length,  /* 1, 2, 4, or 8                 */
  159.     FAST char *  pVal     /* where to return value,        */
  160.   /* or ptr to value to be written */
  161.     )
  162.     {
  163.     ...
  164.     }
  165. /*******************************************************************************
  166. *
  167. * vxMemProbeAsi - probe address in ASI space for bus error (SPARC)
  168. *
  169. * This routine probes the specified address to see if it is readable or
  170. * writable, as specified by <mode>.  The address will be
  171. * read/written as 1, 2, 4, or 8 bytes as specified by <length> 
  172. * (values other than 1, 2, 4, or 8 return ERROR).  If the probe is a
  173. * VX_READ (0), then the value read will be returned in the location pointed to
  174. * by <pVal>.  If the probe is a VX_WRITE (1), then the value written will be
  175. * taken from the location pointed to by <pVal>.  In either case, <pVal>
  176. * should point to a value of the appropriate length, 1, 2, 4, or 8 bytes, as
  177. * specified by <length>.
  178. *
  179. * The fifth parameter <adrsAsi> is the ASI parameter used to modify
  180. * the <adrs> parameter.
  181. *
  182. * EXAMPLE
  183. * .CS
  184. *     testMem (adrs)
  185. *        char *adrs;
  186. *        {
  187. *        char testW = 1;
  188. *        char testR;
  189. *
  190. *        if (vxMemProbeAsi (adrs, VX_WRITE, 1, &testW) == OK)
  191. *            printf ("value %d written to adrs %xen", testW, adrs);
  192. *
  193. *        if (vxMemProbeAsi (adrs, VX_READ, 1, &testR) == OK)
  194. *            printf ("value %d read from adrs %xen", testR, adrs);
  195. *        }
  196. * .CE
  197. *
  198. * INTERNAL
  199. * This routine functions by setting the bus error trap vector to vxMemProbeTrap
  200. * and then trying to read/write the specified byte.
  201. * If the address doesn't exist, vxMemProbeTrap will return ERROR.
  202. * Note that this routine saves and restores the bus error vector that was
  203. * there prior to this call.  The entire procedure is done with interrupts
  204. * locked out.
  205. *
  206. * RETURNS:
  207. * OK, or ERROR if the probe caused a bus error or
  208. * was misaligned.
  209. *
  210. * NOMANUAL
  211. */
  212. STATUS vxMemProbeAsi
  213.     (
  214.     FAST char *  adrs,   /* address to be probed              */
  215.     int          mode,   /* VX_READ or VX_WRITE               */
  216.     int          length,  /* 1, 2, 4, or 8                     */ 
  217.     FAST char *  pVal,   /* where to return value,            */
  218.   /* or ptr to value to be written     */
  219.     int adrsAsi   /* ASI field of address to be probed */
  220.     )
  221.     {
  222.     ...
  223.     }
  224. /*******************************************************************************
  225. *
  226. * vxAtomicModify - interface to the 'atmod' instruction (i960)
  227. *
  228. * This routine atomically modifies a location in memory.
  229. *
  230. * RETURNS: The original value in the memory location.
  231. *
  232. * NOMANUAL
  233. */
  234. UINT8 vxAtomicModify
  235.     (
  236.     UINT8    value,         /* value to place in memory */
  237.     UINT8 *  pMem,          /* location to modify       */
  238.     UINT8    mask           /* bit mask for value       */
  239.     )
  240.     {
  241.     ...
  242.     }
  243. /******************************************************************************
  244. *
  245. * vxCacheInvalidate - invalidate the instruction cache (i960)
  246. *
  247. * This routine invalidates the instruction cache.  The entire instruction
  248. * cache is flushed.
  249. *
  250. * RETURNS: N/A
  251. *
  252. * NOMANUAL
  253. */  
  254. vxCacheInvalidate (void)
  255.     {
  256.     ...
  257.     }
  258. /******************************************************************************
  259. *
  260. * vxSysctlSend - send a SYSCTL message to the processor (i960 CA)
  261. *
  262. * This routine sends a SYSCTL message to the processor.
  263. *
  264. * RETURNS: N/A
  265. *
  266. * NOMANUAL
  267. */
  268. vxSysctlSend
  269.     (
  270.     UINT32 f12, /* arg0 contains field2 messageType field1 */
  271.     UINT32 f3, /* arg1 contains field3                    */
  272.     UINT32 f4 /* arg2 contains field4                    */
  273.     )
  274.     {
  275.     ...
  276.     }
  277. /******************************************************************************
  278. *
  279. * vxIACSend - send an IAC message to the processor (i960 KB/SB)
  280. *
  281. * This routine sends an intra-agent communication (IAC) message to 
  282. * the processor.
  283. *
  284. * RETURNS: N/A
  285. *
  286. * NOMANUAL
  287. */
  288. vxIACSend
  289.     (
  290.     UINT32 *  iac /* arg0 contains pointer to IAC structure */
  291.     )
  292.     {
  293.     ...
  294.     }
  295. /******************************************************************************
  296. *
  297. * vxIMRClear - clear the interrupt mask register (i960)
  298. *
  299. * This routine clears bits in the interrupt mask register.
  300. *
  301. * RETURNS: N/A
  302. *
  303. * NOMANUAL
  304. */
  305. vxIMRClear
  306.     (
  307.     UINT32 mask /* bits to clear in interrupt mask reg */
  308.     )
  309.     {
  310.     ...
  311.     }
  312. /******************************************************************************
  313. *
  314. * vxIMRSet - set the interrupt mask register (i960)
  315. *
  316. * This routine sets bits in the interrupt mask register.
  317. *
  318. * RETURNS: N/A
  319. *
  320. * NOMANUAL
  321. */
  322. vxIMRSet
  323.     (
  324.     UINT32 mask /* bits to set in interrupt mask reg */
  325.     )
  326.     {
  327.     ...
  328.     }
  329. /*******************************************************************************
  330. *
  331. * vxSSEnable - enable the superscalar dispatch (MC68060)
  332. *
  333. * This function sets the ESS bit of the Processor Configuration Register (PCR)
  334. * to enable the superscalar dispatch.
  335. *
  336. * RETURNS : N/A
  337. */
  338. void vxSSEnable (void)
  339.     {
  340.     ...
  341.     }
  342. /*******************************************************************************
  343. *
  344. * vxSSDisable - disable the superscalar dispatch (MC68060)
  345. *
  346. * This function resets the ESS bit of the Processor Configuration Register (PCR)
  347. * to disable the superscalar dispatch.
  348. *
  349. * RETURNS : N/A
  350. */
  351. void vxSSDisable (void)
  352.     {
  353.     ...
  354.     }
  355. /*******************************************************************************
  356. *
  357. * vxPowerModeSet - set the power management mode (PowerPC, SH, x86)
  358. *
  359. * This routine selects the power management mode to be activated when
  360. * vxPowerDown() is called.  vxPowerModeSet() is normally called in the BSP
  361. * initialization routine sysHwInit().
  362. *
  363. * USAGE PPC:
  364. * Power management modes include the following:
  365. * .iP "VX_POWER_MODE_DISABLE (0x1)"
  366. * Power management is disabled; this prevents the MSR(POW) bit from being
  367. * set (all PPC).
  368. * .iP "VX_POWER_MODE_FULL (0x2)"
  369. * All CPU units are active while the kernel is idle (PPC603, PPCEC603 and
  370. * PPC860 only).
  371. * .iP "VX_POWER_MODE_DOZE (0x4)"
  372. * Only the decrementer, data cache, and bus snooping are active while the
  373. * kernel is idle (PPC603, PPCEC603 and PPC860).
  374. * .iP "VX_POWER_MODE_NAP (0x8)"
  375. * Only the decrementer is active while the kernel is idle (PPC603, PPCEC603 and
  376. * PPC604 ).
  377. * .iP "VX_POWER_MODE_SLEEP (0x10)"
  378. * All CPU units are inactive while the kernel is idle (PPC603, PPCEC603 and
  379. * PPC860 - not recommended for the PPC603 and PPCEC603 architecture).
  380. * .iP "VX_POWER_MODE_DEEP_SLEEP (0x20)"
  381. * All CPU units are inactive while the kernel is idle (PPC860 only - not
  382. * recommended).
  383. * .iP "VX_POWER_MODE_DPM (0x40)"
  384. * Dynamic Power Management Mode (PPC603 and PPCEC603 only).
  385. * .iP "VX_POWER_MODE_DOWN (0x80)"
  386. * Only a hard reset causes an exit from power-down low power mode (PPC860 only
  387. * - not recommended).
  388. *
  389. * USAGE SH:
  390. * Power management modes include the following:
  391. * .iP "VX_POWER_MODE_DISABLE (0x0)"
  392. * Power management is disabled.
  393. * .iP "VX_POWER_MODE_SLEEP (0x1)"
  394. * The core CPU is halted, on-chip peripherals operating, external memory
  395. * refreshing.
  396. * .iP "VX_POWER_MODE_DEEP_SLEEP (0x2)"
  397. * The core CPU is halted, on-chip peripherals operating, external memory
  398. * self-refreshing (SH-4 only).
  399. * .iP "VX_POWER_MODE_USER (0xff)"
  400. * Set up to three 8-bit standby registers with user-specified values:
  401. * .CS
  402. *     vxPowerModeSet (VX_POWER_MODE_USER | sbr1<<8 | sbr2<<16 | sbr3<<24);
  403. * .CE
  404. * The sbr1 value is written to the STBCR or SBYCR1, sbr2 is written to
  405. * the STBCR2 or SBYCR2, and sbr3 is written to the STBCR3 register (when
  406. * available), depending on the SH processor type.
  407. *
  408. * .LP
  409. * USAGE X86:
  410. * vxPowerModeSet() is called in the BSP initialization routine sysHwInit().
  411. * Power management modes include the following:
  412. * .iP "VX_POWER_MODE_DISABLE (0x1)"
  413. * Power management is disable: this prevents halting the CPU.
  414. * .iP "VX_POWER_MODE_AUTOHALT (0x4)"
  415. * Power management is enable: this allows halting the CPU.
  416. *
  417. * RETURNS: OK, or ERROR if <mode> is incorrect or not supported by the
  418. * processor.
  419. *
  420. * SEE ALSO:
  421. * vxPowerModeGet(), vxPowerDown()
  422. */
  423. STATUS vxPowerModeSet
  424.     (
  425.     UINT32 mode                 /* power management mode to select */
  426.     )
  427.     {
  428.     ...
  429.     }
  430. /*******************************************************************************
  431. *
  432. * vxPowerModeGet - get the power management mode (PowerPC, SH, x86)
  433. *
  434. * This routine returns the power management mode set by vxPowerModeSet().
  435. *
  436. * RETURNS:
  437. * The power management mode, or ERROR if no mode has been selected or if 
  438. * power management is not supported.
  439. *
  440. * SEE ALSO:
  441. * vxPowerModeSet(), vxPowerDown()
  442. */
  443. UINT32 vxPowerModeGet (void)
  444.     {
  445.     ...
  446.     }
  447. /*******************************************************************************
  448. *
  449. * vxPowerDown - place the processor in reduced-power mode (PowerPC, SH)
  450. *
  451. * This routine activates the reduced-power mode if power management is enabled.
  452. * It is called by the scheduler when the kernel enters the idle loop.
  453. * The power management mode is selected by vxPowerModeSet().
  454. *
  455. * RETURNS: OK, or ERROR if power management is not supported or if external
  456. * interrupts are disabled.
  457. *
  458. * SEE ALSO: vxPowerModeSet(), vxPowerModeGet()
  459. *
  460. */
  461. UINT32 vxPowerDown (void)
  462.     {
  463.     ...
  464.     }
  465. /*******************************************************************************
  466. *
  467. * vxCr0Get - get a content of the Control Register 0 (x86)
  468. *
  469. * This routine gets a content of the Control Register 0. 
  470. *
  471. * RETURNS: a value of the Control Register 0
  472. */
  473. int vxCr0Get (void)
  474.     {
  475.     ...
  476.     }
  477. /*******************************************************************************
  478. *
  479. * vxCr0Set - set a value to the Control Register 0 (x86)
  480. *
  481. * This routine sets a value to the Control Register 0.
  482. *
  483. * RETURNS: N/A
  484. */
  485. void vxCr0Set
  486.     (
  487.     int value /* CR0 value */
  488.     )
  489.     {
  490.     ...
  491.     }
  492. /*******************************************************************************
  493. *
  494. * vxCr2Get - get a content of the Control Register 2 (x86)
  495. *
  496. * This routine gets a content of the Control Register 2. 
  497. *
  498. * RETURNS: a value of the Control Register 2
  499. */
  500. int vxCr2Get (void)
  501.     {
  502.     ...
  503.     }
  504. /*******************************************************************************
  505. *
  506. * vxCr2Set - set a value to the Control Register 2 (x86)
  507. *
  508. * This routine sets a value to the Control Register 2.
  509. *
  510. * RETURNS: N/A
  511. */
  512. void vxCr2Set
  513.     (
  514.     int value /* CR2 value */
  515.     )
  516.     {
  517.     ...
  518.     }
  519. /*******************************************************************************
  520. *
  521. * vxCr3Get - get a content of the Control Register 3 (x86)
  522. *
  523. * This routine gets a content of the Control Register 3. 
  524. *
  525. * RETURNS: a value of the Control Register 3
  526. */
  527. int vxCr3Get (void)
  528.     {
  529.     ...
  530.     }
  531. /*******************************************************************************
  532. *
  533. * vxCr3Set - set a value to the Control Register 3 (x86)
  534. *
  535. * This routine sets a value to the Control Register 3.
  536. *
  537. * RETURNS: N/A
  538. */
  539. void vxCr3Set
  540.     (
  541.     int value /* CR3 value */
  542.     )
  543.     {
  544.     ...
  545.     }
  546. /*******************************************************************************
  547. *
  548. * vxCr4Get - get a content of the Control Register 4 (x86)
  549. *
  550. * This routine gets a content of the Control Register 4. 
  551. *
  552. * RETURNS: a value of the Control Register 4
  553. */
  554. int vxCr4Get (void)
  555.     {
  556.     ...
  557.     }
  558. /*******************************************************************************
  559. *
  560. * vxCr4Set - set a value to the Control Register 4 (x86)
  561. *
  562. * This routine sets a value to the Control Register 4.
  563. *
  564. * RETURNS: N/A
  565. */
  566. void vxCr4Set
  567.     (
  568.     int value /* CR4 value */
  569.     )
  570.     {
  571.     ...
  572.     }
  573. /*******************************************************************************
  574. *
  575. * vxEflagsGet - get a content of the EFLAGS register (x86)
  576. *
  577. * This routine gets a content of the EFLAGS register
  578. *
  579. * RETURNS: a value of the EFLAGS register
  580. */
  581. int vxEflagsGet (void)
  582.     {
  583.     ...
  584.     }
  585. /*******************************************************************************
  586. *
  587. * vxEflagsSet - set a value to the EFLAGS register (x86)
  588. *
  589. * This routine sets a value to the EFLAGS register
  590. *
  591. * RETURNS: N/A
  592. */
  593. void vxEflagsSet
  594.     (
  595.     int value /* EFLAGS value */
  596.     )
  597.     {
  598.     ...
  599.     }
  600. /*******************************************************************************
  601. *
  602. * vxDrGet - get a content of the Debug Register 0 to 7 (x86)
  603. *
  604. * This routine gets a content of the Debug Register 0 to 7. 
  605. *
  606. * RETURNS: N/A
  607. */
  608. void vxDrGet
  609.     (
  610.     int * pDr0, /* DR0 */
  611.     int * pDr1, /* DR1 */
  612.     int * pDr2, /* DR2 */
  613.     int * pDr3, /* DR3 */
  614.     int * pDr4, /* DR4 */
  615.     int * pDr5, /* DR5 */
  616.     int * pDr6, /* DR6 */
  617.     int * pDr7 /* DR7 */
  618.     )
  619.     {
  620.     ...
  621.     }
  622. /*******************************************************************************
  623. *
  624. * vxDrSet - set a value to the Debug Register 0 to 7 (x86)
  625. *
  626. * This routine sets a value to the Debug Register 0 to 7. 
  627. *
  628. * RETURNS: N/A
  629. */
  630. void vxDrSet
  631.     (
  632.     int dr0, /* DR0 */
  633.     int dr1, /* DR1 */
  634.     int dr2, /* DR2 */
  635.     int dr3, /* DR3 */
  636.     int dr4, /* DR4 */
  637.     int dr5, /* DR5 */
  638.     int dr6, /* DR6 */
  639.     int dr7 /* DR7 */
  640.     )
  641.     {
  642.     ...
  643.     }
  644. /*******************************************************************************
  645. *
  646. * vxTssGet - get a content of the TASK register (x86)
  647. *
  648. * This routine gets a content of the TASK register
  649. *
  650. * RETURNS: a value of the TASK register
  651. */
  652. int vxTssGet (void)
  653.     {
  654.     ...
  655.     }
  656. /*******************************************************************************
  657. *
  658. * vxTssSet - set a value to the TASK register (x86)
  659. *
  660. * This routine sets a value to the TASK register
  661. *
  662. * RETURNS: N/A
  663. */
  664. void vxTssSet
  665.     (
  666.     int value /* TASK register value */
  667.     )
  668.     {
  669.     ...
  670.     }
  671. /*******************************************************************************
  672. *
  673. * vxGdtrGet - get a content of the Global Descriptor Table Register (x86)
  674. *
  675. * This routine gets a content of the Global Descriptor Table Register
  676. *
  677. * RETURNS: N/A
  678. */
  679. void vxGdtrGet
  680.     (
  681.     long long int * pGdtr /* memory to store GDTR */
  682.     )
  683.     {
  684.     ...
  685.     }
  686. /*******************************************************************************
  687. *
  688. * vxIdtrGet - get a content of the Interrupt Descriptor Table Register (x86)
  689. *
  690. * This routine gets a content of the Interrupt Descriptor Table Register
  691. *
  692. * RETURNS: N/A
  693. */
  694. void vxIdtrGet
  695.     (
  696.     long long int * pIdtr /* memory to store IDTR */
  697.     )
  698.     {
  699.     ...
  700.     }
  701. /*******************************************************************************
  702. *
  703. * vxLdtrGet - get a content of the Local Descriptor Table Register (x86)
  704. *
  705. * This routine gets a content of the Local Descriptor Table Register
  706. *
  707. * RETURNS: N/A
  708. */
  709. void vxLdtrGet
  710.     (
  711.     long long int * pLdtr /* memory to store LDTR */
  712.     )
  713.     {
  714.     ...
  715.     }