vxALib.s
上传用户:baixin
上传日期:2008-03-13
资源大小:4795k
文件大小:12k
开发平台:

MultiPlatform

  1. /* vxALib.s - i80x86 miscellaneous assembly routines */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history 
  5. --------------------
  6. 01f,20nov01,hdn  doc clean up for 5.5
  7. 01e,01nov01,hdn  added vxDr[SG]et(), vxTss[GS]et(), vx[GIL]dtGet()
  8. 01d,21aug01,hdn  added FUNC/FUNC_LABEL, replaced .align with .balign
  9. 01c,01jun93,hdn  updated to 5.1.
  10.   - fixed #else and #endif
  11.   - changed VOID to void
  12.   - changed ASMLANGUAGE to _ASMLANGUAGE
  13.   - changed copyright notice
  14. 01a,03mar92,hdn  written based on TRON, 68k version.
  15. */
  16. /*
  17. DESCRIPTION
  18. This module contains miscellaneous VxWorks support routines for the
  19. I80x86 family of processors.
  20. SEE ALSO: vxLib
  21. */
  22. #define _ASMLANGUAGE
  23. #include "vxWorks.h"
  24. #include "asm.h"
  25. .data
  26. .globl FUNC(copyright_wind_river)
  27. .long FUNC(copyright_wind_river)
  28. /* externals */
  29. /* internals */
  30. #if (CPU != SIMNT)
  31. .globl GTEXT(vxMemProbeSup)
  32. .globl GTEXT(vxMemProbeTrap)
  33. .globl GTEXT(vxTas)
  34. .globl GTEXT(vxCr0Get)
  35. .globl GTEXT(vxCr0Set)
  36. .globl GTEXT(vxCr2Get)
  37. .globl GTEXT(vxCr2Set)
  38. .globl GTEXT(vxCr3Get)
  39. .globl GTEXT(vxCr3Set)
  40. .globl GTEXT(vxCr4Get)
  41. .globl GTEXT(vxCr4Set)
  42. .globl GTEXT(vxEflagsGet)
  43. .globl GTEXT(vxEflagsSet)
  44. .globl GTEXT(vxDrGet)
  45. .globl GTEXT(vxDrSet)
  46. .globl GTEXT(vxTssGet)
  47. .globl GTEXT(vxTssSet)
  48. .globl GTEXT(vxGdtrGet)
  49. .globl GTEXT(vxIdtrGet)
  50. .globl GTEXT(vxLdtrGet)
  51. #endif /* CPU != SIMNT */
  52. .text
  53. .balign 16
  54. #if (CPU != SIMNT)
  55. /*******************************************************************************
  56. *
  57. * vxMemProbeSup - vxMemProbe support routine
  58. *
  59. * This routine is called to try to read byte, word, or long, as specified
  60. * by length, from the specified source to the specified destination.
  61. *
  62. * NOMANUAL
  63. * STATUS vxMemProbeSup (length, src, dest)
  64. *     int length; /* length of cell to test (1, 2, 4) *
  65. *     char *src; /* address to read *
  66. *     char *dest; /* address to write *
  67. */
  68. FUNC_LABEL(vxMemProbeSup)
  69. pushl %ebp
  70. movl %esp,%ebp
  71. pushl %ebx /* save non-volatile registers */
  72. pushl %esi
  73. pushl %edi
  74. movl ARG2(%ebp),%esi /* get source address */
  75. movl ARG3(%ebp),%edi /* get destination address */
  76. xorl %eax,%eax /* preset status = OK */
  77. movl ARG1(%ebp),%edx /* get length */
  78. cmpl $1,%edx
  79. jne vmp10
  80. movb (%esi),%bl /* read  byte */
  81. movb %bl,(%edi) /* write byte */
  82. jmp vmpRtn
  83. .balign 16,0x90
  84. vmp10:
  85. cmp $2,%edx
  86. jne vmp20
  87. movw (%esi),%bx /* read  word */
  88. movw %bx,(%edi) /* write word */
  89. jmp vmpRtn
  90. .balign 16,0x90
  91. vmp20:
  92. movl (%esi),%ebx /* read  long */
  93. movl %ebx,(%edi) /* write long */
  94. /* NOTE: vmpRtn is known by vxMemProbTrap to stop retry */
  95. vmpRtn:
  96. popl %edi /* restore non-volatile registers */
  97. popl %esi
  98. popl %ebx
  99. leave
  100. ret
  101. /*******************************************************************************
  102. *
  103. * vxMemProbeTrap - vxMemProbe support routine
  104. *
  105. * This entry point is momentarily attached to the bus error exception vector.
  106. * It simply sets %eax to ERROR to indicate that
  107. * the general protection fault did occur, and returns from the interrupt.
  108. *
  109. * NOTE:
  110. * The instruction that caused the general protection fault must not be run 
  111. * again so we have to set some special bits in the exception stack frame.
  112. *
  113. * NOMANUAL
  114. *
  115. * void vxMemProbeTrap()
  116. */
  117. .balign 16,0x90
  118. FUNC_LABEL(vxMemProbeTrap) /* we get here via the general prot. fault */
  119. addl $8,%esp
  120. pushl $vmpRtn /* patch return address, EIP */
  121. movl $-1,%eax /* set status to ERROR */
  122. iret /* return to the subroutine */
  123. /*******************************************************************************
  124. * vxTas - C-callable atomic test-and-set primitive
  125. *
  126. * This routine provides a C-callable interface to the test-and-set
  127. * instruction.  The LOCK-BTS instruction is executed on the specified
  128. * address.
  129. *
  130. * RETURNS:
  131. * TRUE if value had been not set, but is now,
  132. * FALSE if the value was set already.
  133. * BOOL vxTas (address)
  134. *     char *address; /* address to be tested *
  135. */
  136. .balign 16,0x90
  137. FUNC_LABEL(vxTas)
  138. movl SP_ARG1(%esp),%edx /* get address */
  139. xorl %eax,%eax /* set status to FALSE */
  140. lock /* lock the Bus during the next inst */
  141. bts $0,(%edx) /* XXX set MSB with bus-lock */
  142. jc vxTas1
  143. incl %eax /* set status to TRUE */
  144. vxTas1:
  145. ret
  146. /*******************************************************************************
  147. *
  148. * vxCr0Get - get a content of the Control Register 0
  149. *
  150. * This routine gets a content of the Control Register 0. 
  151. *
  152. * RETURNS: a value of the Control Register 0
  153. * int vxCr0Get (void)
  154.  
  155. */
  156.         .balign 16,0x90
  157. FUNC_LABEL(vxCr0Get)
  158. movl %cr0, %eax /* get CR0 */
  159. ret
  160. /*******************************************************************************
  161. *
  162. * vxCr0Set - set a value to the Control Register 0
  163. *
  164. * This routine sets a value to the Control Register 0.
  165. *
  166. * RETURNS: N/A
  167. * void vxCr0Set (value)
  168. *       int value; /@ CR0 value @/
  169.  
  170. */
  171.         .balign 16,0x90
  172. FUNC_LABEL(vxCr0Set)
  173. movl SP_ARG1(%esp), %eax
  174. movl %eax, %cr0 /* set CR0 */
  175. ret
  176. /*******************************************************************************
  177. *
  178. * vxCr2Get - get a content of the Control Register 2
  179. *
  180. * This routine gets a content of the Control Register 2. 
  181. *
  182. * RETURNS: a value of the Control Register 2
  183. * int vxCr2Get (void)
  184.  
  185. */
  186.         .balign 16,0x90
  187. FUNC_LABEL(vxCr2Get)
  188. movl %cr2, %eax /* get CR2 */
  189. ret
  190. /*******************************************************************************
  191. *
  192. * vxCr2Set - set a value to the Control Register 2
  193. *
  194. * This routine sets a value to the Control Register 2.
  195. *
  196. * RETURNS: N/A
  197. * void vxCr2Set (value)
  198. *       int value; /@ CR2 value @/
  199.  
  200. */
  201.         .balign 16,0x90
  202. FUNC_LABEL(vxCr2Set)
  203. movl SP_ARG1(%esp), %eax
  204. movl %eax, %cr2 /* set CR2 */
  205. ret
  206. /*******************************************************************************
  207. *
  208. * vxCr3Get - get a content of the Control Register 3
  209. *
  210. * This routine gets a content of the Control Register 3. 
  211. *
  212. * RETURNS: a value of the Control Register 3
  213. * int vxCr3Get (void)
  214.  
  215. */
  216.         .balign 16,0x90
  217. FUNC_LABEL(vxCr3Get)
  218. movl %cr3, %eax /* get CR3 */
  219. ret
  220. /*******************************************************************************
  221. *
  222. * vxCr3Set - set a value to the Control Register 3
  223. *
  224. * This routine sets a value to the Control Register 3.
  225. *
  226. * RETURNS: N/A
  227. * void vxCr3Set (value)
  228. *       int value; /@ CR3 value @/
  229.  
  230. */
  231.         .balign 16,0x90
  232. FUNC_LABEL(vxCr3Set)
  233. movl SP_ARG1(%esp), %eax
  234. movl %eax, %cr3 /* set CR3 */
  235. ret
  236. /*******************************************************************************
  237. *
  238. * vxCr4Get - get a content of the Control Register 4
  239. *
  240. * This routine gets a content of the Control Register 4. 
  241. *
  242. * RETURNS: a value of the Control Register 4
  243. * int vxCr4Get (void)
  244.  
  245. */
  246.         .balign 16,0x90
  247. FUNC_LABEL(vxCr4Get)
  248. movl %cr4, %eax /* get CR4 */
  249. ret
  250. /*******************************************************************************
  251. *
  252. * vxCr4Set - set a value to the Control Register 4
  253. *
  254. * This routine sets a value to the Control Register 4.
  255. *
  256. * RETURNS: N/A
  257. * void vxCr4Set (value)
  258. *       int value; /@ CR4 value @/
  259.  
  260. */
  261.         .balign 16,0x90
  262. FUNC_LABEL(vxCr4Set)
  263. movl SP_ARG1(%esp), %eax
  264. movl %eax, %cr4 /* set CR4 */
  265. ret
  266. /*******************************************************************************
  267. *
  268. * vxEflagsGet - get a content of the EFLAGS register
  269. *
  270. * This routine gets a content of the EFLAGS register
  271. *
  272. * RETURNS: a value of the EFLAGS register
  273. * int vxEflagsGet (void)
  274.  
  275. */
  276.         .balign 16,0x90
  277. FUNC_LABEL(vxEflagsGet)
  278. pushfl
  279. popl %eax /* get EFLAGS */
  280. ret
  281. /*******************************************************************************
  282. *
  283. * vxEflagsSet - set a value to the EFLAGS register
  284. *
  285. * This routine sets a value to the EFLAGS register
  286. *
  287. * RETURNS: N/A
  288. * void vxEflagsSet (value)
  289. *       int value; /@ EFLAGS value @/
  290.  
  291. */
  292.         .balign 16,0x90
  293. FUNC_LABEL(vxEflagsSet)
  294. pushl SP_ARG1(%esp)
  295. popfl /* set EFLAGS */
  296. ret
  297. /*******************************************************************************
  298. *
  299. * vxDrGet - get a content of the Debug Register 0 to 7
  300. *
  301. * SYNOPSIS
  302. * ss
  303. * void vxDrGet (pDr0, pDr1, pDr2, pDr3, pDr4, pDr5, pDr6, pDr7)
  304. *       int * pDr0; /@ DR0 @/
  305. *       int * pDr1; /@ DR1 @/
  306. *       int * pDr2; /@ DR2 @/
  307. *       int * pDr3; /@ DR3 @/
  308. *       int * pDr4; /@ DR4 @/
  309. *       int * pDr5; /@ DR5 @/
  310. *       int * pDr6; /@ DR6 @/
  311. *       int * pDr7; /@ DR7 @/
  312. * se
  313. *
  314. * This routine gets a content of the Debug Register 0 to 7. 
  315. *
  316. * RETURNS: N/A
  317. */
  318.         .balign 16,0x90
  319. FUNC_LABEL(vxDrGet)
  320. movl SP_ARG1(%esp), %edx
  321. movl %dr0, %eax
  322. movl %eax, (%edx)
  323. movl SP_ARG2(%esp), %edx
  324. movl %dr1, %eax
  325. movl %eax, (%edx)
  326. movl SP_ARG3(%esp), %edx
  327. movl %dr2, %eax
  328. movl %eax, (%edx)
  329. movl SP_ARG4(%esp), %edx
  330. movl %dr3, %eax
  331. movl %eax, (%edx)
  332. movl SP_ARG5(%esp), %edx
  333. movl %dr4, %eax
  334. movl %eax, (%edx)
  335. movl SP_ARG6(%esp), %edx
  336. movl %dr5, %eax
  337. movl %eax, (%edx)
  338. movl SP_ARG7(%esp), %edx
  339. movl %dr6, %eax
  340. movl %eax, (%edx)
  341. movl SP_ARG8(%esp), %edx
  342. movl %dr7, %eax
  343. movl %eax, (%edx)
  344. ret
  345. /*******************************************************************************
  346. *
  347. * vxDrSet - set a value to the Debug Register 0 to 7
  348. *
  349. * SYNOPSIS
  350. * ss
  351. * void vxDrSet (dr0, dr1, dr2, dr3, dr4, dr5, dr6, dr7)
  352. *       int dr0; /@ DR0 @/
  353. *       int dr1; /@ DR1 @/
  354. *       int dr2; /@ DR2 @/
  355. *       int dr3; /@ DR3 @/
  356. *       int dr4; /@ DR4 @/
  357. *       int dr5; /@ DR5 @/
  358. *       int dr6; /@ DR6 @/
  359. *       int dr7; /@ DR7 @/
  360. * se
  361. *
  362. * This routine sets a value to the Debug Register 0 to 7. 
  363. *
  364. * RETURNS: N/A
  365. */
  366.         .balign 16,0x90
  367. FUNC_LABEL(vxDrSet)
  368. movl SP_ARG1(%esp), %eax
  369. movl %eax, %dr0
  370. movl SP_ARG2(%esp), %eax
  371. movl %eax, %dr1
  372. movl SP_ARG3(%esp), %eax
  373. movl %eax, %dr2
  374. movl SP_ARG4(%esp), %eax
  375. movl %eax, %dr3
  376. movl SP_ARG5(%esp), %eax
  377. movl %eax, %dr4
  378. movl SP_ARG6(%esp), %eax
  379. movl %eax, %dr5
  380. movl SP_ARG7(%esp), %eax
  381. movl %eax, %dr6
  382. movl SP_ARG8(%esp), %eax
  383. movl %eax, %dr7
  384. ret
  385. /*******************************************************************************
  386. *
  387. * vxTssGet - get a content of the TASK register
  388. *
  389. * This routine gets a content of the TASK register
  390. *
  391. * RETURNS: a value of the TASK register
  392. * int vxTssGet (void)
  393.  
  394. */
  395.         .balign 16,0x90
  396. FUNC_LABEL(vxTssGet)
  397. xorl %eax, %eax
  398. str %ax /* get a value of the TASK register */
  399. ret
  400. /*******************************************************************************
  401. *
  402. * vxTssSet - set a value to the TASK register
  403. *
  404. * This routine sets a value to the TASK register
  405. *
  406. * RETURNS: N/A
  407. * void vxTssSet (value)
  408. *       int value; /@ TASK register value @/
  409.  
  410. */
  411.         .balign 16,0x90
  412. FUNC_LABEL(vxTssSet)
  413. movl SP_ARG1(%esp), %eax
  414. ltr %ax /* set it to TASK register */
  415. ret
  416. /*******************************************************************************
  417. *
  418. * vxGdtrGet - get a content of the Global Descriptor Table Register
  419. *
  420. * This routine gets a content of the Global Descriptor Table Register
  421. *
  422. * RETURNS: N/A
  423. * void vxGdtrGet (pGdtr)
  424. *     long long int * pGdtr; /@ memory to store GDTR @/
  425.  
  426. */
  427.         .balign 16,0x90
  428. FUNC_LABEL(vxGdtrGet)
  429. movl SP_ARG1(%esp), %eax
  430. sgdt (%eax) /* get a value of the GDTR */
  431. ret
  432. /*******************************************************************************
  433. *
  434. * vxIdtrGet - get a content of the Interrupt Descriptor Table Register
  435. *
  436. * This routine gets a content of the Interrupt Descriptor Table Register
  437. *
  438. * RETURNS: N/A
  439. * void vxIdtrGet (pIdtr)
  440. *     long long int * pIdtr; /@ memory to store IDTR @/
  441.  
  442. */
  443.         .balign 16,0x90
  444. FUNC_LABEL(vxIdtrGet)
  445. movl SP_ARG1(%esp), %eax
  446. sidt (%eax) /* get a value of the IDTR */
  447. ret
  448. /*******************************************************************************
  449. *
  450. * vxLdtrGet - get a content of the Local Descriptor Table Register
  451. *
  452. * This routine gets a content of the Local Descriptor Table Register
  453. *
  454. * RETURNS: N/A
  455. * void vxLdtrGet (pLdtr)
  456. *     long long int * pLdtr; /@ memory to store LDTR @/
  457.  
  458. */
  459.         .balign 16,0x90
  460. FUNC_LABEL(vxLdtrGet)
  461. movl SP_ARG1(%esp), %eax
  462. sldt (%eax) /* get a value of the LDTR */
  463. ret
  464. #endif /* CPU != SIMNT */