home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / util / misc / VMM_src.lha / VMM / dma_patch.asm < prev    next >
Encoding:
Assembly Source File  |  1995-12-16  |  3.2 KB  |  102 lines

  1.                     INCLUDE   "shared_defs.i"
  2.                     INCLUDE   "macros.i"
  3.                     INCLUDE   "exec/execbase.i"
  4.                     INCLUDE   "exec/funcdef.i"
  5.                     INCLUDE   "exec/exec_lib.i"
  6.  
  7.                     XDEF      _CachePreDMAPatch
  8.                     XDEF      _CachePostDMAPatch
  9.                     XREF      _OrigCachePreDMA
  10.                     XREF      _OrigCachePostDMA
  11.  
  12.                     XREF      _VirtAddrStart
  13.                     XREF      _VirtAddrEnd
  14.  
  15.                     XREF      _GenDescr
  16.                     XREF      _CPushP
  17.                     XREF      _FlushVirt
  18.  
  19.                     IFD       DEBUG
  20.                     XDEF      _OpenPatch
  21.                     XREF      _OrigOpen
  22.                     ENDC
  23.  
  24.  
  25. _CachePreDMAPatch:  * inputs:
  26.                     *   a0: APTR  vaddr,
  27.                     *   a1: LONG *length
  28.                     *   d0: ULONG flags
  29.                     * outputs:
  30.                     *   d0: APTR paddr
  31.                     *   a1: LONG *length (modified)
  32.  
  33.                     IN_VM     a0,PreDMANotInVM
  34.  
  35.                     PRINT_DEB "CachePreDMA in VM. Addr = %lx",a0
  36.                     PRINT_DEB "                   Length = %lx",(a1)
  37.                     move.b    (a0),d1        ; touch vaddr, so we are sure
  38.                                              ; that the page is in
  39.                     movem.l   a0-a1,-(sp)
  40.                     move.l    a0,-(sp)
  41.  
  42.                     move.l    _GenDescr,a0
  43.                     jsr       (a0)
  44.  
  45.                     add.w     #4,sp
  46.                     movem.l   (sp)+,a0-a1
  47.                     move.l    a0,d1
  48.                     add.l     #PAGESIZE,d1
  49.                     and.w     #~(PAGESIZE-1),d1
  50.                     sub.l     a0,d1
  51.                     cmp.l     (a1),d1
  52.                     bgt       FullLength
  53.                     move.l    d1,(a1)
  54. FullLength:
  55.                     move.l    d0,-(sp)
  56.                     move.l    _CPushP,a0
  57.                     jsr       (a0)
  58.                     move.l    (sp)+,d0
  59.                     rts
  60.  
  61. PreDMANotInVM       move.l    _OrigCachePreDMA,-(sp)
  62.                     rts
  63.  
  64.  
  65. _CachePostDMAPatch: * inputs:
  66.                     *   a0: APTR  vaddr,
  67.                     *   a1: LONG *length
  68.                     *   d0: ULONG flags
  69.                     * outputs:
  70.                     *   none
  71.  
  72.                     IN_VM     a0,PostDMANotInVM
  73.  
  74.                     PRINT_DEB "CachePostDMA in VM. Addr = %lx",a0
  75.                     PRINT_DEB "                    Length = %lx",(a1)
  76.  
  77.                     and.b     #(DMAF_NoModify+DMAF_ReadFromRAM),d0
  78.  
  79.                     bne       PostDMAReady
  80.                     move.l    _FlushVirt,a0
  81.                     jmp       (a0)
  82.  
  83. PostDMANotInVM      move.l    _OrigCachePostDMA,-(sp)
  84. PostDMAReady        rts
  85.  
  86.  
  87.                     IFD       DEBUG
  88.  
  89. _OpenPatch          PRINT_DEB "Opening file"
  90.                     move.l    d1,-(sp)
  91.                     move.l    #0,-(sp)
  92.                     move.l    d1,-(sp)
  93.                     jsr       _PrintDebugMsg
  94.                     add.w     #8,sp
  95.                     move.l    (sp)+,d1
  96.                     move.l    _OrigOpen,a0
  97.                     jmp       (a0)
  98.  
  99.                     ENDC
  100.  
  101.                     end
  102.