STACKS.ASM
上传用户:xiaogehua
上传日期:2007-01-08
资源大小:1183k
文件大小:9k
源码类别:

操作系统开发

开发平台:

Asm

  1. ;    File              : $STACKS.ASM$
  2. ;
  3. ;    Description       :
  4. ;
  5. ;    Original Author   : DIGITAL RESEARCH
  6. ;
  7. ;    Last Edited By    : $CALDERA$
  8. ;
  9. ;-----------------------------------------------------------------------;
  10. ;    Copyright Work of Caldera, Inc. All Rights Reserved.
  11. ;      
  12. ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
  13. ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
  14. ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
  15. ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
  16. ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
  17. ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
  18. ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
  19. ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
  20. ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
  21. ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
  22. ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
  23. ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
  24. ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
  25. ;    CIVIL LIABILITY.
  26. ;-----------------------------------------------------------------------;
  27. ;
  28. ;    *** Current Edit History ***
  29. ;    *** End of Current Edit History ***
  30. ;
  31. ;    $Log$
  32. ;    STACKS.ASM 1.6 93/10/26 19:08:13
  33. ;    Fix bug when we run out of stacks
  34. ;    STACKS.ASM 1.4 93/09/02 22:36:47
  35. ;    Add header to system allocations
  36. ;    ENDLOG
  37. CGROUP group INITCODE, STACKS
  38. STACKS segment public para 'STACKS'
  39. Assume CS:STACKS, DS:Nothing, ES:Nothing, SS:Nothing
  40. StackCode:
  41. ;************
  42. ; FIXED DATA
  43. ;************
  44.         dw  0       
  45. NumOfStacks dw 0 ; we have this many stacks
  46. StackCB dw 0 ; NumOfStacks*8 = size of control array
  47. StackSize       dw 0 ; size of an individual stack
  48. StackPtr label dword ; pointer to stack data
  49. StackOff dw offset STACKS:StackHeap
  50. StackSeg dw 0
  51. FirstStack dw offset STACKS:StackHeap
  52. LastStack dw offset STACKS:StackHeap-STACK_CB_SIZE
  53. NextStack dw offset STACKS:StackHeap-STACK_CB_SIZE
  54. ;************
  55. ; FIXED DATA
  56. ;************
  57. STACK_CB_FLAGS equ word ptr 0 ; stack flags
  58. STACK_CB_SP equ word ptr 2 ; old stack saved here
  59. STACK_CB_SS equ word ptr 4
  60. STACK_CB_TOP equ word ptr 6 ; stack top lives here
  61. STACK_CB_SIZE equ 8
  62. STACK_FREE equ 0 ; stack is available to allocate
  63. STACK_INUSE equ 1 ; stack is in use
  64. STACK_OVERFLOW equ 2 ; stack has overflowed
  65. ;
  66. ; Our hardware interrupt handlers which are of the form
  67. ;
  68. ; call SwapStack
  69. ; db 0EAh ; JMPF opcode
  70. ; dd oldIntHandler
  71. ;
  72. ; By looking at the near return address we can find the address of the old
  73. ; interrupt handler.
  74. ; We try to allocate a stack from our pool of stacks, working downward to
  75. ; reduce the problems of stack overflow.
  76. ;
  77. ; We check the top of the stack contains a pointer to our control block and
  78. ; if this is invalid we assume the stack has overflowed, and try the next one.
  79. ; We have no way of recovering a stack that has overflowed (eg. by zapping
  80. ; everything below us on exit).
  81. ;
  82. ; If we run out of stacks we just continue on the callers stack, rather than
  83. ; halting the system.
  84. ;
  85. Int02:
  86. call SwapStack
  87. db 0EAh ; JMPF
  88. i02Off dw 4*02h,0
  89. Int08:
  90. call SwapStack
  91. db 0EAh ; JMPF
  92. i08Off dw 4*08h,0
  93. Int09:
  94. call SwapStack
  95. db 0EAh
  96. i09Off dw 4*09h,0
  97. Int0A:
  98. call SwapStack
  99. db 0EAh ; JMPF
  100. i0AOff dw 4*0Ah,0
  101. Int0B:
  102. call SwapStack
  103. db 0EAh ; JMPF
  104. i0BOff dw 4*0Bh,0
  105. Int0C:
  106. call SwapStack
  107. db 0EAh ; JMPF
  108. i0COff dw 4*0Ch,0
  109. Int0D:
  110. call SwapStack
  111. db 0EAh ; JMPF
  112. i0DOff dw 4*0Dh,0
  113. Int0E:
  114. call SwapStack
  115. db 0EAh ; JMPF
  116. i0EOff dw 4*0Eh,0
  117. Int70:
  118. call SwapStack
  119. db 0EAh ; JMPF
  120. i70Off dw 4*70h,0
  121. Int72:
  122. call SwapStack
  123. db 0EAh ; JMPF
  124. i72Off dw 4*72h,0
  125. Int73:
  126. call SwapStack
  127. db 0EAh ; JMPF
  128. i73Off dw 4*73h,0
  129. Int74:
  130. call SwapStack
  131. db 0EAh ; JMPF
  132. i74Off dw 4*74h,0
  133. Int76:
  134. call SwapStack
  135. db 0EAh ; JMPF
  136. i76Off dw 4*76h,0
  137. Int77:
  138. call SwapStack
  139. db 0EAh ; JMPF
  140. i77Off dw 4*77h,0
  141. SwapStack proc near
  142. ; On Entry:
  143. ; As per INT except word on stack from near call, which gives old vector
  144. ; On Exit:
  145. ; None
  146. ;
  147. cli ; just in case
  148. push bp
  149. push si ; save work registers
  150. mov si,cs:NextStack ; start looking here for a stack
  151. SwapStack10:
  152. cmp cs:STACK_CB_FLAGS[si],STACK_FREE
  153.  jne SwapStack20 ; use this stack if possible
  154. mov bp,cs:STACK_CB_TOP[si] ; get the top of this stack
  155. cmp si,cs:word ptr [bp] ; does the check match ?
  156.  jne SwapStack20 ; no, try the next one
  157. mov cs:NextStack,si ; remember where we are
  158. mov cs:STACK_CB_FLAGS[si],STACK_INUSE
  159. mov cs:STACK_CB_SS[si],ss ; save old stack
  160. mov cs:STACK_CB_SP[si],sp
  161. mov bp,sp
  162. xchg bx,ss:word ptr 4[bp] ; BX = return address, BX saved
  163. mov bp,cs
  164. mov ss,bp
  165. mov sp,cs:STACK_CB_TOP[si] ; switch stacks
  166. pushf
  167. call cs:dword ptr 1[bx] ; fake an INT to old handler
  168. mov ss,cs:STACK_CB_SS[si]
  169. mov sp,cs:STACK_CB_SP[si] ; swap back to the original stack
  170. mov cs:STACK_CB_FLAGS[si],STACK_FREE
  171. mov cs:NextStack,si ; update in case we were nested
  172. pop si ; restore registers
  173. pop bp
  174. pop bx ; (was return address, now saved BX)
  175. iret ; exit interrupt handler
  176. SwapStack20:
  177. sub si,STACK_CB_SIZE ; it's not, so try the next
  178. cmp si,cs:FirstStack ;  if there is one
  179.  jae SwapStack10
  180. pop si ; restore registers
  181. pop bp
  182. ret ; back to JMPF as we can't swap stacks
  183. SwapStack endp
  184. i19Table dw 4*02H, offset STACKS:i02Off
  185. dw 4*08H, offset STACKS:i08Off
  186. dw 4*09H, offset STACKS:i09Off
  187. dw 4*0AH, offset STACKS:i0AOff
  188. dw 4*0BH, offset STACKS:i0BOff
  189. dw 4*0CH, offset STACKS:i0COff
  190. dw 4*0DH, offset STACKS:i0DOff
  191. dw 4*0EH, offset STACKS:i0EOff
  192. dw 4*70H, offset STACKS:i70Off
  193. dw 4*72H, offset STACKS:i72Off
  194. dw 4*73H, offset STACKS:i73Off
  195. dw 4*74H, offset STACKS:i74Off
  196. dw 4*76H, offset STACKS:i76Off
  197. dw 4*77H, offset STACKS:i77Off
  198. dw 0
  199. Int19:
  200. ; Trap the Int 19 reboot and restore any hardware vectors we have hooked
  201. cli
  202. cld
  203. xor ax,ax
  204. mov es,ax ; ES = interrupt vectors
  205. push cs
  206. pop ds
  207. lea si,i19Table ; DS:SI -> table to restore
  208. Int1910:
  209. lodsw
  210. xchg ax,di ; ES:DI -> address to restore to
  211. lodsw
  212. xchg ax,si ; CS:SI -> value to restore
  213. movsw
  214. movsw
  215. xchg ax,si ; restore position in table
  216. cmp ds:word ptr [si],0
  217.  jne Int1910
  218. db 0EAh ; JMPF
  219. i19Off dw 4*19h,0
  220. even ; word align our stacks
  221. StackHeap label word ; dynamically build stack CB's here
  222. RELOCATE_SIZE equ ($ - StackCode)
  223. STACKS ends
  224. INITCODE segment public para 'INITCODE'
  225. Assume CS:CGROUP, DS:CGROUP, ES:Nothing, SS:Nothing
  226. extrn alloc_hiseg:near
  227. Public InitStacks
  228. ;==========
  229. InitStacks:
  230. ;==========
  231. ; On Entry:
  232. ; CX = number of stacks
  233. ; DX = size of stack
  234. ; Values are checked
  235. ; On Exit:
  236. ; None
  237. ;
  238. push ds
  239. push es
  240. inc dx ; let's ensure stacks are WORD
  241. and dx,0FFFEh ;  aligned...
  242. mov NumOfStacks,cx
  243. mov StackSize,dx
  244. mov ax,STACK_CB_SIZE
  245. mul cx ; AX = bytes in control area
  246. mov StackCB,ax
  247. add LastStack,ax
  248. add NextStack,ax
  249. add StackOff,ax ; adjust our pointers
  250. xchg ax,cx ; AX = NumOfStacks
  251. mul StackSize ; AX bytes are required for stacks
  252. add ax,StackOff ; add to start of stacks
  253. push ax ; save length in bytes
  254. add ax,15 ; allow for rounding
  255. mov cl,4
  256. shr ax,cl ; convert it to para's
  257. mov dl,'S' ; allocation signature is Stacks
  258. call alloc_hiseg ; allocate some memory
  259. pop cx ; CX = length in bytes
  260. mov StackSeg,ax ; remember where
  261. mov es,ax
  262. Assume ES:STACKS
  263. xor di,di
  264. mov al,0CCh ; fill stacks with CC for debug
  265. rep stosb
  266. xor di,di
  267. mov si,offset CGROUP:StackCode
  268. mov cx,RELOCATE_SIZE
  269. rep movsb ; relocate the code
  270. mov bx,FirstStack ; lets start building the CB's
  271. mov cx,NumOfStacks
  272. lds si,StackPtr ; SI = bottom of stack area
  273. Assume DS:STACKS
  274. sub si,WORD ; we want the word below top of stack
  275. InitStacks10:
  276. add si,StackSize ; SI = top of stack
  277. mov ds:STACK_CB_FLAGS[bx],STACK_FREE
  278. mov ds:STACK_CB_TOP[bx],si ; set top of stack
  279. mov ds:word ptr [si],bx ; set backlink
  280. add bx,STACK_CB_SIZE ; onto next control block
  281. loop InitStacks10
  282. xor ax,ax
  283. mov ds,ax
  284. Assume DS:Nothing
  285. cli
  286. mov si,offset CGROUP:iTable ; now we fixup the vectors
  287. InitStacks20:
  288. mov ax,cs:word ptr 0[si] ; ES:AX = entry point
  289. mov di,cs:word ptr 2[si] ; ES:DI = fixup location
  290. mov bx,es:word ptr [di] ; get the vector to fixup
  291. xchg ax,ds:word ptr [bx] ; set entry offset while saving
  292. stosw ;  previous handler offset
  293. mov ax,es
  294. xchg ax,ds:word ptr 2[bx] ; now the segment
  295. stosw
  296. add si,2*WORD ; onto next entry
  297. cmp cs:word ptr 0[si],0 ; (zero terminated)
  298.  jnz InitStacks20
  299. sti
  300. InitStacks30:
  301. pop es
  302. pop ds
  303. ret
  304. iTable dw offset STACKS:Int02, offset STACKS:i02Off
  305. dw offset STACKS:Int08, offset STACKS:i08Off
  306. dw offset STACKS:Int09, offset STACKS:i09Off
  307. dw offset STACKS:Int0A, offset STACKS:i0AOff
  308. dw offset STACKS:Int0B, offset STACKS:i0BOff
  309. dw offset STACKS:Int0C, offset STACKS:i0COff
  310. dw offset STACKS:Int0D, offset STACKS:i0DOff
  311. dw offset STACKS:Int0E, offset STACKS:i0EOff
  312. dw offset STACKS:Int70, offset STACKS:i70Off
  313. dw offset STACKS:Int72, offset STACKS:i72Off
  314. dw offset STACKS:Int73, offset STACKS:i73Off
  315. dw offset STACKS:Int74, offset STACKS:i74Off
  316. dw offset STACKS:Int76, offset STACKS:i76Off
  317. dw offset STACKS:Int77, offset STACKS:i77Off
  318. dw offset STACKS:Int19, offset STACKS:i19Off
  319. dw 0
  320. INITCODE ends
  321. end