OFSRamVolumes.Mos 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. (* ported version of Minos to work with the ARM backend of the Fox Compiler Suite *)
  2. (* ETH Oberon, Copyright 2006 ETH Zuerich Institut fuer Computersysteme, ETH Zentrum, CH-8092 Zuerich.
  3. Refer to the "General ETH Oberon System Source License" contract available at: http://www.oberon.ethz.ch/ *)
  4. MODULE OFSRamVolumes;
  5. (*@
  6. 001 2007-02-07 tt: First version, adapted from orginal Oberon
  7. *)
  8. (* OFS.Volume implementation in ram. *)
  9. IMPORT SYSTEM, Kernel, OFS, Platform, Strings, Log, Trace;
  10. TYPE
  11. Volume* = POINTER TO RAMVolumeDesc;
  12. RAMVolumeDesc = RECORD (OFS.VolumeDesc)
  13. baseAdr: LONGINT
  14. END;
  15. VAR
  16. (* Counter to generate unique names *)
  17. count: LONGINT;
  18. (* Copy a memory block of size "len" from address "src" to address "dst". len MOD 4 must be 0! *)
  19. PROCEDURE CopyBlock( src, dst, len: ADDRESS);
  20. VAR
  21. data: LONGINT;
  22. bound, lowRAMAddress, highRAMAddress: ADDRESS;
  23. BEGIN
  24. (*ASSERT ( (len MOD 4) = 0 ); *)
  25. (*
  26. lowRAMAddress := Platform.RAMLogicalLow; (* unsigned integer <- signed integer *)
  27. highRAMAddress := Platform.RAMLogicalHigh; (* unsigned integer <- signed integer *)
  28. *)
  29. (*
  30. ASSERT ( (src >= lowRAMAddress) & (src + len <= highRAMAddress) );
  31. ASSERT ( (dst >= lowRAMAddress) & (dst + len <= highRAMAddress) );
  32. *)
  33. bound := src + len;
  34. WHILE src < bound DO
  35. SYSTEM.GET( src, data ); SYSTEM.PUT( dst, data ); INC( src, 4 ); INC( dst, 4 );
  36. END;
  37. END CopyBlock;
  38. (* set a given memory block to 0 *)
  39. PROCEDURE ClearMem( adr, len: LONGINT );
  40. VAR bound: LONGINT;
  41. BEGIN
  42. (*
  43. ASSERT ( (len MOD 4) = 0 );
  44. ASSERT ( (adr >= Platform.RAMLogicalLow) &
  45. (adr + len <= Platform.RAMLogicalHigh) );
  46. *)
  47. bound := adr + len;
  48. WHILE adr < bound DO SYSTEM.PUT( adr, 0 ); INC( adr, 4 ); END;
  49. END ClearMem;
  50. (* Get block from adr [1..size] of volume vol *)
  51. PROCEDURE GetBlock*( volume: OFS.Volume; adr: LONGINT;
  52. VAR blk: ARRAY OF SYSTEM.BYTE; ofs: LONGINT; VAR res: LONGINT );
  53. VAR vol: Volume;
  54. tmp : ADDRESS;
  55. BEGIN
  56. vol := volume( Volume );
  57. tmp := adr;
  58. (*
  59. ASSERT( (tmp >= 1) & (tmp <= vol.size));
  60. ASSERT ( ((vol.baseAdr + tmp * vol.blockSize) <= Platform.RAMLogicalHigh) &
  61. (vol.baseAdr >= Platform.RAMLogicalLow));
  62. *)
  63. (* ASSERT(SIZE(blk) >= vol.blockSize); *) (* With the current compiler, this does unfortunately not work *)
  64. CopyBlock( vol.baseAdr + vol.blockSize * (tmp - 1), ADDRESSOF( blk ) + ofs,
  65. vol.blockSize );
  66. res := OFS.Ok;
  67. END GetBlock;
  68. (* Put block to adr [1..size] of volume vol *)
  69. PROCEDURE PutBlock*( volume: OFS.Volume; adr: LONGINT;
  70. VAR blk: ARRAY OF SYSTEM.BYTE; ofs: LONGINT; VAR res: LONGINT);
  71. VAR vol: Volume;
  72. BEGIN
  73. vol := volume( Volume );
  74. (*
  75. ASSERT( (adr >= 1) & (adr <= vol.size));
  76. ASSERT ( ((vol.baseAdr + adr * vol.blockSize) <= Platform.RAMLogicalHigh) &
  77. (vol.baseAdr >= Platform.RAMLogicalLow));
  78. *)
  79. (* ASSERT(SIZE(blk) >= vol.blockSize); *)
  80. CopyBlock( ADDRESSOF( blk ) + ofs, vol.baseAdr + vol.blockSize * (adr - 1),
  81. vol.blockSize );
  82. res := OFS.Ok;
  83. END PutBlock;
  84. (* Default finalizer of this Volume *)
  85. PROCEDURE Finalize*( vol: OFS.Volume );
  86. BEGIN
  87. vol( Volume ).baseAdr := 0; OFS.DefaultFinalizeVol( vol )
  88. END Finalize;
  89. (** Generate a new ramdisk at adress "adr" in memory of size "size" in bytes and blocksize "blocksize" *)
  90. PROCEDURE New*( adr, size, blocksize: LONGINT; init: BOOLEAN; VAR vol: Volume );
  91. VAR vbs: LONGINT;
  92. BEGIN
  93. vol := NIL;
  94. IF (size > 0) & (blocksize > 0) THEN
  95. Trace.StringLn("New (1)");
  96. NEW( vol );
  97. vol.baseAdr := adr; (* base address of RAMDisk in memory *)
  98. IF init THEN ClearMem( adr, blocksize ); END;
  99. Trace.StringLn("New (2)");
  100. SYSTEM.PUT( adr, OFS.DirMark ); (* Preformat RamDisk *)
  101. vol.name := "RAM"; Strings.AppendInt( vol.name, count );
  102. INC( count ); vol.blockSize := blocksize; vol.size := size; vol.flags := {};
  103. vol.AllocBlock := OFS.DefaultAllocBlock;
  104. vol.FreeBlock := OFS.DefaultFreeBlock;
  105. vol.MarkBlock := OFS.DefaultMarkBlock;
  106. vol.Marked := OFS.DefaultMarked; vol.Available := OFS.DefaultAvailable;
  107. vol.GetBlock := GetBlock; vol.PutBlock := PutBlock;
  108. vol.Sync := OFS.DefaultSync; vol.Finalize := Finalize;
  109. Trace.StringLn("New (2)");
  110. OFS.InitVol( vol );
  111. Trace.StringLn("New (3)");
  112. ELSE Log.S( "OFSRAMVolumes: bad parameters" )
  113. END
  114. END New;
  115. (*
  116. (* Used to cleanup all volumes *)
  117. PROCEDURE Cleanup*;
  118. VAR fs: OFS.FileSystem;
  119. BEGIN
  120. REPEAT (* unmount all file systems using our volume *)
  121. fs := OFS.First(); (* look for fs to unmount *)
  122. WHILE (fs # NIL) & ((fs.vol = NIL) OR ~(fs.vol IS Volume)) DO
  123. fs := OFS.Next(fs)
  124. END;
  125. IF fs # NIL THEN OFS.Remove(fs) END
  126. UNTIL fs = NIL
  127. END Cleanup;
  128. *)
  129. (* Mount the default ram disk *)
  130. PROCEDURE MountRamDisk;
  131. VAR
  132. prefix: OFS.Prefix;
  133. size: LONGINT;
  134. vol: Volume;
  135. BEGIN
  136. prefix := "RAM";
  137. New( Platform.RAMDiskBase, Platform.RAMDiskSize, Platform.OFSBlockSize, TRUE, vol );
  138. IF vol # NIL THEN
  139. OFS.NewFS(prefix, TRUE, vol);
  140. ELSE
  141. Log.SL("Could not mount ramdisk");
  142. END;
  143. END MountRamDisk;
  144. BEGIN
  145. count := 0;
  146. Trace.StringLn("Entereing Init OFSRamVolumes.");
  147. MountRamDisk;
  148. Trace.StringLn("Exiting Init OFSRamVolumes.");
  149. END OFSRamVolumes.