home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 9 / FreshFishVol9-CD2.bin / bbs / util / appvm-0.9.lha / AppVM / appvm.s < prev    next >
Text File  |  1994-01-28  |  54KB  |  1,668 lines

  1. *************************************************************************************
  2. *
  3. * AppVM ®    (Application VIRTUAL MEMORY)        © Copyright LVA March 1992
  4. * -------                        --------------------------
  5. *
  6. * Written by Laurence Vanhelsuwé.
  7. *
  8. *
  9. * AppVM ® is a stop-gap solution for application writers who need UNIX-style
  10. * Demand Paged Virtual Memory.
  11. * This program extends the functionality of Exec's AllocMem() and FreeMem() and
  12. * AmigaDOS's Read() and Write().
  13. * Only Processes can use VM, not Tasks !
  14. *
  15. * This implementation behaves like an exclusive resource like PAR: or SER: as
  16. * opposed to a shared resource. A single Process at a time can allocate (and use)
  17. * areas of memory that are larger than physical RAM memory as if that memory was
  18. * physically present.
  19. * As soon as this unique Process (referred to in the source as the "client") frees
  20. * all its VM, another client can immediately start using the resource again.
  21. *
  22. * This program is called Application VM because the system (Exec, Intuition)
  23. * is never allowed to handle VM pointers.
  24. * Only applications are able to get VM and use it "internally", i.e. they are not
  25. * allowed to pass a VM ptr to the system (via a call to DoIO() for example).
  26. *  (More precisely, bus error exceptions due to the dereferencing of VM ptrs are
  27. *  only handled correctly if the code trapping is in the scope of the client Process.)
  28. *
  29. * There's one important exception to this rule:
  30. * Exec's AllocMem() is the source of VM ptrs and FreeMem(), Read() and Write() can
  31. * all handle VM ptrs.
  32. * This should be enough for any application (who gets the status of "client") to
  33. * process huge amounts of data and load and/or save into/from VM.
  34. *
  35. * History
  36. * -------
  37. * 24/MAR/92:    started code    (goal: getting the Amiga to use my new MMU tree)
  38. * 25/MAR/92:            (goal: getting instructions which use VM to restart)
  39. * 26/MAR/92:            (goal: getting a client Process to use service)
  40. * 27/MAR/92:            (goal: full service incl. Read()/Write() )
  41. * 29/APR/92: fixed double Close() bug in case disk full
  42. *
  43. *************************************************************************************
  44.  
  45.         include    std
  46.         include    hardware/custom.i
  47.         include    exec/vmemory.i        ;include our new VM include!
  48.  
  49.  
  50. ;-----------------------------------------------
  51. ; Program Global Constants
  52. ;-----------------------------------------------
  53.  
  54. ; This version allows a maximum VM request of 256Mb (if you've got that much spare
  55. ; on your hard disk). The code can handle more though. **!! (How much, 2 Gb ?)
  56. ; The absolute maximum in any case is 2 Gigabytes since VM addresses start at
  57. ; $80000000.
  58.  
  59. MAX_VM_MEGS    equ    256            ;256Mb max LA range
  60.  
  61. ; Since we're only using a single B-level table for the VM logical addresses (which
  62. ; have bit31=1), I can only map a maximum VM range of 256Mb.
  63. ; That should be enough since you also need that much space on your hard disk!
  64.  
  65. KILOBYTE    equ    1024
  66. MEGABYTE    equ    KILOBYTE*KILOBYTE
  67.  
  68. PAGE_SHIFT    equ    15            ;2^15 = 32K
  69. PAGE_SIZE    equ    1<<PAGE_SHIFT        ;one PAGE is 32K big
  70.  
  71. ; Pages are this large because:
  72. ;
  73. ; 1) AmigaDOS is very efficient at transfering large chuncks from/to disk.
  74. ; 2) Bus exception errors become less frequent.
  75. ; 4) The D-level table shrinks significantly.
  76. ; 3) The free pages bitmap shrinks too.
  77.  
  78.  
  79. VM_START    equ    $80000000        ;all VM addresses have b31=1
  80.  
  81. ; What this program does is to create a new MMU table which CONTAINS the standard
  82. ; 2-level (A,B) Exec MMU table and a new branch for VM addresses.
  83. ; The standard table uses TIA=8 and TIB=6 with a table A index LIMIT of 16.
  84. ; This means that the standard table provides translation for the very first 256Mb
  85. ; of address space in the Amiga. Everything above it is off-limit (BUS ERROR).
  86.  
  87. ; What AppVM does is to "shift down" this tree and turn it into a branch of a bigger
  88. ; tree using the following LA field subdivisions:
  89.  
  90.             ;    TABLE  ENTRIES    PER ENTRY
  91.             ;    -----  -------    ---------
  92.  
  93. TIA        equ    4    ;  4Gb 16     = 256 Mb
  94. TIB        equ    4    ;256Mb 16     =  16 Mb
  95. TIC        equ    6    ; 16Mb 64     = 256 K
  96. TID        equ    3    ;256K   8     =  32 K PAGES
  97.  
  98. ; Check whether chosen logical address breakdown fields are legal.
  99.  
  100. TC_CHECK    equ    32-(TIA+TIB+TIC+TID+PAGE_SHIFT)
  101.  
  102.     IFNE    TC_CHECK
  103.  blabla    ; ** WARNING ** SELECTED LA INDEX BREAK-DOWN IS INVALID
  104.     END
  105.     ENDC
  106.  
  107. ; The new TIB,TIC values have to be derived from the TIA,TIB values of the original
  108. ; translation tree. TIC has to be the old TIB. TIB Can be 4 instead the original
  109. ; TIA's 8 because the original A-table is LIMITED to the first 16 indices.
  110. ; This is necessary so that I can retain the existing MMU translation tree as a
  111. ; branch of my bigger tree (which is now a 4-level tree).
  112.  
  113.  
  114. *####################################################################################
  115. *
  116. * RESULTING MMU TRANSLATION TREE STRUCTURE: 
  117. * =========================================
  118. *
  119. *    A-table (one for ENTIRE SYSTEM)
  120. *
  121. *   ____________
  122. * 0 |_1st 256Mb|------> STANDARD Exec MMU table (becomes levels B and C)
  123. * 1 |          |
  124. * 2 |          |
  125. * 3 |          |
  126. * 4 |          |
  127. * 5 |          |
  128. * 6 |          |
  129. * 7 |          |
  130. * 8 |_8th 256Mb|------> VM B-table
  131. * 9 |          |        ____________
  132. * A |          |        | 1st 16Mb |------> 1st VM C-table
  133. * B |          |        | 2nd 16Mb |         ______________
  134. * C |          |        | 3rd 16Mb |         | 1st 256K   |-----> 1st VM D-table
  135. * D |          |        | 4th 16Mb |         | 2nd 256K   |       _______________
  136. * E |          |        | 5th 16Mb |         |            |       | 1st 32K PAGE |
  137. * F |          |        | 6th 16Mb |         :            :       | 2nd 32K PAGE |
  138. *   ------------        | 7th 16Mb |                              | 3rd 32K PAGE |
  139. * All other ranges      | 8th 16Mb |           64 entries         | 4th 32K PAGE |
  140. * are INVALID.          | 9th 16Mb |                              | 5th 32K PAGE |
  141. *                       |10th 16Mb |         :            :       | 6th 32K PAGE |
  142. *                       |11th 16Mb |         |            |       | 7th 32K PAGE |
  143. *                       |12th 16Mb |         | 63rd 256K  |       | 8th 32K PAGE |
  144. *                       |13th 16Mb |         | 64th 256K  |       ----------------
  145. *                       |14th 16Mb |         --------------
  146. *                       |15th 16Mb |
  147. *                       |16th 16Mb |
  148. *                       ------------
  149. *####################################################################################
  150.  
  151. A_TSIZE    equ    (1<<TIA)*4    ;64    ;size of one table at each level
  152. B_TSIZE    equ    (1<<TIB)*4    ;64    ;(using short descriptors)
  153. C_TSIZE    equ    (1<<TIC)*4    ;256
  154. D_TSIZE    equ    (1<<TID)*4    ;32
  155.  
  156. C_TABLES    equ    1<<TIB            ;number of C tables depends on B level
  157. D_TABLES    equ    1<<(TIB+TIC)        ;1024 of them ! (8192 descriptors)
  158.  
  159. TREE_SIZE    equ    A_TSIZE+B_TSIZE+(C_TABLES*C_TSIZE)+(D_TABLES*D_TSIZE)
  160.             ; 64   +  64   +       4096       +     32768
  161.  
  162. SHORT_INVALID    equ    $BAD00000        ;DT bits = 00 = INVALID
  163.                     ;this descriptor HAS to have b31=1 (quick test)
  164.  
  165. PTR_MASK    equ    $FFFFFF00        ;low descriptor byte is not part of ptr
  166.  
  167. MODIFIED_PAGE    equ    4            ;bit set if page has been written to
  168. ACCESSED_PAGE    equ    3            ;bit set if page has been accessed (R/W)
  169.  
  170. DT_INVALID    equ    $0
  171. DT_PAGE        equ    $1
  172. DT_VALID_4BYTE    equ    $2            ;table pointer points to short table
  173. DT_VALID_8BYTE    equ    $3            ;table pointer points to short table
  174.  
  175. TC_ENABLE    equ    1<<31
  176. TC_PSIZE    equ    (%1111)<<20        ;select 32K pages
  177. TC_TIA        equ    TIA<<12
  178. TC_TIB        equ    TIB<<8
  179. TC_TIC        equ    TIC<<4
  180. TC_TID        equ    TID
  181.  
  182. NEW_TC    equ    TC_ENABLE+TC_PSIZE+TC_TIA+TC_TIB+TC_TIC+TC_TID
  183.  
  184. _intena        equ    $dff000+intena        ;for DISABLE/ENABLE
  185.  
  186. ;##########################################################################
  187.  
  188. START_APPVM:    move.l    sp,stack_level        ;store original sp
  189.         move.l    a0,arg_line        ;store raw arguments ptr
  190.  
  191.         bsr    init_all        ;init vars, open DOS, stdout
  192.         beq    bail_out        ;if couldn't open something: exit now
  193.  
  194.         move.l    4.w,a6            ;check to see that this machine is
  195.         move.w    AttnFlags(a6),d0    ;at least 030 based coz I need MMU
  196.         btst    #AFB_68030,d0        ;(**!! SIMPLISTIC TEST: tst mmu config!)
  197.         beq    need_MMU
  198.  
  199.         bsr    parse_args        ;get arguments (VM size, swapfile name)
  200.  
  201.         cmp.l    #$00FFFFFF,$8        ;has other copy of APPVM already been
  202.         bhi    already_resident    ;started ? (**!! SIMPLISTIC TEST)
  203.  
  204.         bsr    create_swapfile        ;create swapfile on disk
  205.  
  206.         bsr    init_VM_p