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

VxWorks

开发平台:

C/C++

  1. /* unixALib.s - network assembly language routines */
  2. /* Copyright 1984-1992 Wind River Systems, Inc. */
  3. .data
  4. .globl  _copyright_wind_river
  5. .long   _copyright_wind_river
  6. /*
  7. modification history
  8. --------------------
  9. 01o,17jun92,jwt  using PORTABLE version because this code no longer works.
  10. 01n,26may92,rrr  the tree shuffle
  11. 01m,04oct91,rrr  passed through the ansification filter
  12.   -changed ASMLANGUAGE to _ASMLANGUAGE
  13.   -changed copyright notice
  14. 01l,07sep89,gae  cleanup.
  15. 01k,02sep88,ecs  SPARC version.
  16. 01j,22jun88,dnw  removed unnecessary intLock()s in insque() and remque().
  17.  removed setjmp()/longjmp() to cALib.s.
  18. 01i,13feb87,dnw  changed setjmp and longjmp register lists to be processable
  19.    by Motorola assemblers.
  20.  added .data before copyright.
  21. 01h,13nov87,rdc  added setjmp and longjmp (temporary).
  22. 01g,24oct87,dnw  removed erroneous ';' at end of copyright.
  23. 01f,03apr87,ecs  added copyright.
  24. 01e,02apr87,jlf  removed .globl of tas, left behind after 01d.
  25. 01d,27mar86,rdc  moved tas() to vxALib.s for non-network systems.
  26. 01c,22dec86,dnw  more changes for assembler compatibility:
  27.    changed jeq/jne/jra to beq/bne/bra.
  28.    added .globl declarations of intLock(), intUnlock().
  29. 01b,30nov86,dnw  changed to be acceptable to various assemblers:
  30.    changed ".align 1" to ".even".
  31.    changed "mov" to "move"
  32.    replaced <n>[fb] labels with real labels.
  33. 01a,06aug86,rdc  written
  34. */
  35. #define unixALib_PORTABLE
  36. #ifndef unixALib_PORTABLE
  37. #define _ASMLANGUAGE
  38. /* internals */
  39. .global _cksum
  40. .global __insque
  41. .global __remque
  42. .seg "text"
  43. .align 4
  44. /**************************************************************************
  45. *
  46. * cksum - compute check sum
  47. *
  48. * return 16bit one's complement sum of 'sum' and the 16bit one's
  49. * complement sum of the string 'string' of byte length 'len'.
  50. * Complicated by 'len' or 'sumlen' not being even.
  51. *
  52. * RETURNS  int
  53. *
  54. * int cksum (sum, string, len, sumlen);
  55. */
  56. _cksum: tst %o2 /* length of string */
  57. be ck9 /* zero length string, return */
  58. nop
  59. btst 1, %o3 /* sumlen odd? */
  60. bne ck4 /* yes, goto ck4 */
  61. nop
  62. /* sum is word aligned, don't swap bytes */
  63. btst 1, %o1 /* address odd? */
  64. be ck1 /* no, skip ahead */
  65. nop
  66. /* odd start address, do first byte, and then swap bytes */
  67. dec %o2 /* --len */
  68. ldub [%o1], %o4 /* get 1st byte */
  69. sll %o4, 8, %o4 /* put it in upper byte */
  70. add %o4, %o0, %o0 /* add to sum */
  71. ba ck5
  72. inc %o1 /* point at next byte */
  73. /* even address, sum aligned */
  74. ck1: mov %o2, %o5
  75. ba ck3
  76. nop
  77. ck2: lduh [%o1], %o4 /* get half word from string */
  78. addx %o4, %o0, %o0 /* add to sum */
  79. ck3: deccc 2, %o5 /* length -= 2 bytes */
  80. bne ck2
  81. inc 2, %o1 /* point at next half word */
  82. btst 1, %o2 /* len param even? */
  83. be ck8 /* yes, skip ahead */
  84. nop
  85. /* odd length, take care of last byte */
  86. ldub [%o1], %o4 /* get last byte */
  87. sll %o4, 8, %o4 /* put it in upper byte */
  88. addx %o4, %o0, %o0 /* add to sum */
  89. ba ck8
  90. nop
  91. /* sum is not word aligned, swap bytes */
  92. ck4: btst 1, %o1 /* address odd? */
  93. be ck5 /* no, goto ck5 */
  94. nop
  95. /* odd start address, do first byte, and then don't swap bytes */
  96. dec %o2 /* --len */
  97. ldub [%o1], %o4 /* get 1st byte */
  98. add %o4, %o0, %o0 /* add to sum */
  99. ba ck1
  100. nop
  101. /* even address, sum misaligned, swap bytes */
  102. ck5: mov %o2, %o5
  103. ba ck7
  104. nop
  105. ck6: lduh [%o1], %o4 /* get half word from string */
  106. srl %o4, 8, %o3 /* lower byte of o3 gets upper byte */
  107. and %o4, 0xff, %o4 /* mask off upper byte */
  108. sll %o4, 8, %o4 /* lower byte now in upper byte */
  109. or %o4, %o3, %o4 /* bytes are now switched */
  110. addx %o4, %o0, %o0 /* add to sum */
  111. ck7: deccc 2, %o5 /* length -= 2 bytes */
  112. bne ck6
  113. inc 2, %o1 /* point at next half word */
  114. btst 1, %o2 /* length param even? */
  115. be ck8 /* yes, goto ck8 */
  116. nop
  117. /* odd length, take care of last byte */
  118. ldub [%o1], %o4 /* get last byte */
  119. addx %o4, %o0, %o0 /* add to sum */
  120. /* fold in last carry bit */
  121. ck8: srl %o0, 16, %o4 /* get upper half word of sum */
  122. set 0xffff, %o5
  123. and %o0, %o5, %o0 /* clear upper half word of sum */
  124. addx %o4, %o0, %o0 /* add in upper half word overflow */
  125. addx %g0, %o0, %o0 /* add in carry */
  126. ck9: retl
  127. nop
  128. /*******************************************************************************
  129. *
  130. * insque - insert a node into a linked list
  131. *
  132. */
  133. __insque:
  134. ld [%o1], %o2 /* o2 = pred->q_forw */
  135. st %o2, [%o0] /* elem->q_forw = pred->q_forw */
  136. st %o0, [%o1] /* pred->q_forw = elem */
  137. st %o1, [%o0 + 4] /* elem->q_back = pred */
  138. retl
  139. st %o0, [%o2 + 4] /* elem->q_forw->q_back = elem */
  140. /*******************************************************************************
  141. *
  142. * remque - delete a node from a linked list
  143. *
  144. */
  145. __remque:
  146. ld [%o0], %o1 /* o1 = elem->q_forw */
  147. ld [%o0 + 4], %o2 /* o2 = elem->q_back */
  148. st %o1, [%o2] /* elem->q_back->q_forw = elem->q_forw */
  149. retl
  150. st %o2, [%o1 + 4] /* elem->q_forw->q_back = elem->q_back */
  151. #endif /* unixALib_PORTABLE */