More progress and fixes
This commit is contained in:
parent
e791edb02a
commit
6476a774dc
@ -80,6 +80,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
{ initalise a drive with a MBR - TODO needs to be expanded for partitioning }
|
{ initalise a drive with a MBR - TODO needs to be expanded for partitioning }
|
||||||
|
//this is now deprecated functionality moved to storagemanagment
|
||||||
procedure init_drive_command(driveIndex : uint32);
|
procedure init_drive_command(driveIndex : uint32);
|
||||||
var
|
var
|
||||||
bootrecord : PMaster_Boot_Record;
|
bootrecord : PMaster_Boot_Record;
|
||||||
@ -94,7 +95,7 @@ begin
|
|||||||
drive := PStorage_device(LL_Get(storageDevices, driveIndex));
|
drive := PStorage_device(LL_Get(storageDevices, driveIndex));
|
||||||
|
|
||||||
MBR.setup_partition(partition, 100, drive^.maxSectorCount-300);
|
MBR.setup_partition(partition, 100, drive^.maxSectorCount-300);
|
||||||
bootrecord^.partition_0 := partition^;
|
bootrecord^.partition[0] := partition^;
|
||||||
|
|
||||||
//write MBR and partition table to disk
|
//write MBR and partition table to disk
|
||||||
drive^.writeCallback(drive, 0, 1, puint32(bootrecord));
|
drive^.writeCallback(drive, 0, 1, puint32(bootrecord));
|
||||||
@ -117,7 +118,7 @@ begin
|
|||||||
console.writestringlnWnd('Please provide valid arguments.', getTerminalHWND());
|
console.writestringlnWnd('Please provide valid arguments.', getTerminalHWND());
|
||||||
console.writestringlnWnd(' ls - for listing all drives', getTerminalHWND());
|
console.writestringlnWnd(' ls - for listing all drives', getTerminalHWND());
|
||||||
console.writestringlnWnd(' info [drive] - display formation for specified drive', getTerminalHWND());
|
console.writestringlnWnd(' info [drive] - display formation for specified drive', getTerminalHWND());
|
||||||
console.writestringlnWnd(' init [drive] - destructive, formats a drive with a blank partition', getTerminalHWND());
|
console.writestringlnWnd(' init [drive] - DEPRECATED destructive, formats a drive with a blank partition', getTerminalHWND());
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -926,7 +926,7 @@ begin
|
|||||||
filesystem.detectcallback:= @detect_volumes;
|
filesystem.detectcallback:= @detect_volumes;
|
||||||
filesystem.writecallback:= @writeFile;
|
filesystem.writecallback:= @writeFile;
|
||||||
filesystem.readcallback := @readFile;
|
filesystem.readcallback := @readFile;
|
||||||
filesystem.formatVolumeCallback := @create_volume;
|
// filesystem.formatVolumeCallback := @create_volume;
|
||||||
|
|
||||||
volumemanager.register_filesystem(@filesystem);
|
volumemanager.register_filesystem(@filesystem);
|
||||||
end;
|
end;
|
||||||
|
@ -100,7 +100,7 @@ begin
|
|||||||
filesystem.detectcallback:= @detect_volumes;
|
filesystem.detectcallback:= @detect_volumes;
|
||||||
filesystem.writecallback:= @writeFile;
|
filesystem.writecallback:= @writeFile;
|
||||||
filesystem.readcallback := @readFile;
|
filesystem.readcallback := @readFile;
|
||||||
filesystem.formatVolumeCallback := @create_volume;
|
// filesystem.formatVolumeCallback := @create_volume;
|
||||||
|
|
||||||
volumemanager.register_filesystem(@filesystem);
|
volumemanager.register_filesystem(@filesystem);
|
||||||
end;
|
end;
|
||||||
|
@ -33,14 +33,12 @@ uses
|
|||||||
tracer,
|
tracer,
|
||||||
rtc,
|
rtc,
|
||||||
MBR,
|
MBR,
|
||||||
volumemanager;
|
volumemanager,
|
||||||
|
storagetypes;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
TControllerType = (ControllerIDE, ControllerUSB, ControllerAHCI, ControllerNET, ControllerRAM, rsvctr1, rsvctr2, rsvctr3);
|
|
||||||
TDirectory_Entry_Type = (directoryEntry, fileEntry, mountEntry);
|
TDirectory_Entry_Type = (directoryEntry, fileEntry, mountEntry);
|
||||||
PStorage_volume = ^TStorage_Volume;
|
|
||||||
PStorage_device = ^TStorage_Device;
|
|
||||||
APStorage_Volume = array[0..10] of PStorage_volume;
|
APStorage_Volume = array[0..10] of PStorage_volume;
|
||||||
byteArray8 = array[0..7] of char;
|
byteArray8 = array[0..7] of char;
|
||||||
PByteArray8 = ^byteArray8;
|
PByteArray8 = ^byteArray8;
|
||||||
@ -56,42 +54,6 @@ type
|
|||||||
|
|
||||||
PPHIOHook_ = procedure;
|
PPHIOHook_ = procedure;
|
||||||
|
|
||||||
// TFilesystem = record
|
|
||||||
// sName : pchar;
|
|
||||||
// writeCallback : PPWriteHook;
|
|
||||||
// readCallback : PPReadHook;
|
|
||||||
// createCallback : PPCreateHook;
|
|
||||||
// detectCallback : PPDetectHook;
|
|
||||||
// createDirCallback : PPCreateDirHook;
|
|
||||||
// readDirCallback : PPReadDirHook;
|
|
||||||
// end;
|
|
||||||
// PFileSystem = ^TFilesystem;
|
|
||||||
|
|
||||||
// TStorage_Volume = record
|
|
||||||
// device : PStorage_device;
|
|
||||||
// sectorStart : uint32;
|
|
||||||
// sectorSize : uint32;
|
|
||||||
// freeSectors : uint32;
|
|
||||||
// filesystem : PFilesystem;
|
|
||||||
// { True if this drive contains the loaded OS }
|
|
||||||
// isBootDrive : boolean;
|
|
||||||
// end;
|
|
||||||
|
|
||||||
{ Generic storage device }
|
|
||||||
TStorage_Device = record
|
|
||||||
idx : uint8;
|
|
||||||
controller : TControllerType;
|
|
||||||
controllerId0 : uint32;
|
|
||||||
maxSectorCount : uint32;
|
|
||||||
sectorSize : uint32;
|
|
||||||
writable : boolean;
|
|
||||||
volumes : PLinkedListBase;
|
|
||||||
writeCallback : PPHIOHook;
|
|
||||||
readCallback : PPHIOHook;
|
|
||||||
hpc : uint16;
|
|
||||||
spt : uint16;
|
|
||||||
end;
|
|
||||||
|
|
||||||
APStorage_Device = array[0..255] of PStorage_device;
|
APStorage_Device = array[0..255] of PStorage_device;
|
||||||
|
|
||||||
{ Generic directory entry }
|
{ Generic directory entry }
|
||||||
@ -113,14 +75,6 @@ procedure init();
|
|||||||
procedure register_device(device : PStorage_Device);
|
procedure register_device(device : PStorage_Device);
|
||||||
function get_device_list() : PLinkedListBase;
|
function get_device_list() : PLinkedListBase;
|
||||||
|
|
||||||
procedure register_filesystem(filesystem : PFilesystem);
|
|
||||||
|
|
||||||
// procedure register_volume(device : PStorage_Device; volume : PStorage_Volume);
|
|
||||||
//function writeNewFile(fileName : pchar; extension : pchar; buffer : puint32; size : uint32) : uint32;
|
|
||||||
//function readFile(fileName : pchar; extension : pchar; buffer : puint32; byteCount : puint32) : puint32;
|
|
||||||
|
|
||||||
//TODO write partition table
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
function controller_type_2_string(controllerType : TControllerType) : pchar;
|
function controller_type_2_string(controllerType : TControllerType) : pchar;
|
||||||
@ -172,7 +126,6 @@ var
|
|||||||
drive : PStorage_Device;
|
drive : PStorage_Device;
|
||||||
|
|
||||||
filesystemString : pchar;
|
filesystemString : pchar;
|
||||||
filesystem : PFileSystem;
|
|
||||||
spc : puint32;
|
spc : puint32;
|
||||||
|
|
||||||
sectorCount : uint32;
|
sectorCount : uint32;
|
||||||
@ -191,37 +144,39 @@ begin
|
|||||||
driveIndex:= stringToInt( getParam(1, params) );
|
driveIndex:= stringToInt( getParam(1, params) );
|
||||||
drive:= PStorage_Device(LL_Get(storageDevices, driveIndex));
|
drive:= PStorage_Device(LL_Get(storageDevices, driveIndex));
|
||||||
|
|
||||||
|
filesystemString := getParam(2, params);
|
||||||
|
|
||||||
sectorCount := stringToInt( getParam(4, params) );
|
sectorCount := stringToInt( getParam(4, params) );
|
||||||
|
|
||||||
// if sector count is 0, use full drive
|
// if sector count is 0, use full drive
|
||||||
if sectorCount = 0 then begin
|
if sectorCount = 0 then begin
|
||||||
sectorCount = drive^.maxSectorCount - 10;
|
sectorCount := drive^.maxSectorCount - 10;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
//create MBR if none, and partition table
|
//create MBR if none, and partition table
|
||||||
|
|
||||||
mb := PMaster_Boot_Record(kalloc(sizeof(TMaster_Boot_Record)));
|
mb := PMaster_Boot_Record(kalloc(sizeof(TMaster_Boot_Record)));
|
||||||
mb := drive^.readCallback(drive, 0, 1);
|
drive^.readCallback(drive, 0, 1, PuInt32(mb));
|
||||||
|
|
||||||
//check if MBR exists
|
//check if MBR exists
|
||||||
if not mb^.boot_sector = $55AA then begin
|
if not mb^.boot_sector = $55AA then begin
|
||||||
|
|
||||||
//create MBR
|
//create MBR
|
||||||
mb^.signature := $A570 + drive^.idx;
|
mb^.signature := $A570 + drive^.id;
|
||||||
mb^.boot_sector := $55AA;
|
mb^.boot_sector := $55AA;
|
||||||
|
|
||||||
//create partition table
|
//create partition table
|
||||||
mbr.setup_partition(@mb^.partition[0], 2, sectorCount);
|
mbr.setup_partition(@mb^.partition[0], 2, sectorCount);
|
||||||
|
|
||||||
//write MBR
|
//write MBR
|
||||||
disk^.writeCallback(drive, 0, 1, mb);
|
drive^.writeCallback(drive, 0, 1, puint32(mb));
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
kfree(mb);
|
kfree(puint32(mb));
|
||||||
|
|
||||||
//setup volume
|
//setup volume
|
||||||
|
volumemanager.create_volume(drive, filesystemString, 2, sectorCount);
|
||||||
|
|
||||||
//todo change b4 adding in aniother filesytem
|
//todo change b4 adding in aniother filesytem
|
||||||
// PFilesystem(LL_Get(filesystems, 0))^.createCallback(drive, drive^.maxSectorCount-1, 1, spc);
|
// PFilesystem(LL_Get(filesystems, 0))^.createCallback(drive, drive^.maxSectorCount-1, 1, spc);
|
||||||
|
@ -44,11 +44,10 @@ type
|
|||||||
PPWriteHook = procedure(volume : PStorage_volume; directory : pchar; entry : PDirectory_Entry; byteCount : uint32; buffer : puint32; statusOut : puint32);
|
PPWriteHook = procedure(volume : PStorage_volume; directory : pchar; entry : PDirectory_Entry; byteCount : uint32; buffer : puint32; statusOut : puint32);
|
||||||
PPReadHook = function(volume : PStorage_Volume; directory : pchar; fileName : pchar; fileExtension : pchar; buffer : puint32; bytecount : puint32) : uint32;
|
PPReadHook = function(volume : PStorage_Volume; directory : pchar; fileName : pchar; fileExtension : pchar; buffer : puint32; bytecount : puint32) : uint32;
|
||||||
PPHIOHook = procedure(volume : PStorage_device; addr : uint32; sectors : uint32; buffer : puint32);
|
PPHIOHook = procedure(volume : PStorage_device; addr : uint32; sectors : uint32; buffer : puint32);
|
||||||
PPCreateHook = procedure(disk : PStorage_Device; sectors : uint32; start : uint32; config : puint32);
|
PPCreateHook = procedure(disk : PStorage_Device; start : uint32; size : uint32; config : puint32);
|
||||||
PPDetectHook = procedure(disk : PStorage_Device);
|
PPDetectHook = procedure(disk : PStorage_Device);
|
||||||
PPCreateDirHook = procedure(volume : PStorage_volume; directory : pchar; dirname : pchar; attributes : uint32; status : puint32);
|
PPCreateDirHook = procedure(volume : PStorage_volume; directory : pchar; dirname : pchar; attributes : uint32; status : puint32);
|
||||||
PPReadDirHook = function(volume : PStorage_volume; directory : pchar; status : puint32) : PLinkedListBase; //returns: 0 = success, 1 = dir not exsist, 2 = not directory, 3 = error //returns: 0 = success, 1 = dir not exsist, 2 = not directory, 3 = error
|
PPReadDirHook = function(volume : PStorage_volume; directory : pchar; status : puint32) : PLinkedListBase; //returns: 0 = success, 1 = dir not exsist, 2 = not directory, 3 = error //returns: 0 = success, 1 = dir not exsist, 2 = not directory, 3 = error
|
||||||
PPFormatVolumeHook = procedure(disk : PStorage_device; sectorCount : uint32; start : uint32; config : puint32);
|
|
||||||
|
|
||||||
PPHIOHook_ = procedure;
|
PPHIOHook_ = procedure;
|
||||||
|
|
||||||
@ -57,11 +56,10 @@ type
|
|||||||
system_id : uint8;
|
system_id : uint8;
|
||||||
writeCallback : PPWriteHook;
|
writeCallback : PPWriteHook;
|
||||||
readCallback : PPReadHook;
|
readCallback : PPReadHook;
|
||||||
createCallback : PPCreateHook;
|
createCallback : PPCreateHook; //create volume
|
||||||
detectCallback : PPDetectHook;
|
detectCallback : PPDetectHook; //detect volume
|
||||||
createDirCallback : PPCreateDirHook;
|
createDirCallback : PPCreateDirHook;
|
||||||
readDirCallback : PPReadDirHook;
|
readDirCallback : PPReadDirHook;
|
||||||
formatVolumeCallback : PPFormatVolumeHook;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TStorage_Volume = record
|
TStorage_Volume = record
|
||||||
@ -93,6 +91,7 @@ var
|
|||||||
|
|
||||||
procedure register_filesystem(filesystem : PFilesystem);
|
procedure register_filesystem(filesystem : PFilesystem);
|
||||||
procedure check_for_volumes(drive : PStorage_device);
|
procedure check_for_volumes(drive : PStorage_device);
|
||||||
|
procedure create_volume(disk : PStorage_device; filesystem : PChar; sectorStart : uint32; sectorCount : uint32);
|
||||||
|
|
||||||
//IO functions
|
//IO functions
|
||||||
|
|
||||||
@ -105,6 +104,8 @@ var
|
|||||||
config : puint32;
|
config : puint32;
|
||||||
begin
|
begin
|
||||||
push_trace('VolumeManager.format_volume_command');
|
push_trace('VolumeManager.format_volume_command');
|
||||||
|
console.writestringlnWND('Not implimented, use disk format', getTerminalHWND());
|
||||||
|
exit;
|
||||||
|
|
||||||
if paramCount(params) < 3 then begin
|
if paramCount(params) < 3 then begin
|
||||||
console.writestringlnWND('Invalid arguments', getTerminalHWND());
|
console.writestringlnWND('Invalid arguments', getTerminalHWND());
|
||||||
@ -122,7 +123,7 @@ begin
|
|||||||
//TODO check things exsist
|
//TODO check things exsist
|
||||||
|
|
||||||
console.writestringlnWND('Staring volume formatting...', getTerminalHWND());
|
console.writestringlnWND('Staring volume formatting...', getTerminalHWND());
|
||||||
filesystem^.formatVolumeCallback(volume^.device, volume^.sectorSize, volume^.sectorStart, config);
|
// filesystem^.formatVolumeCallback(volume^.device, volume^.sectorSize, volume^.sectorStart, config);
|
||||||
console.writestringlnWND('Volume format finished.', getTerminalHWND());
|
console.writestringlnWND('Volume format finished.', getTerminalHWND());
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -253,12 +254,12 @@ begin
|
|||||||
drive^.readCallback(drive, 0, 1, puint32(bootrecord));
|
drive^.readCallback(drive, 0, 1, puint32(bootrecord));
|
||||||
|
|
||||||
//TODO multipe partition entries
|
//TODO multipe partition entries
|
||||||
if bootrecord^.partition_0.LBA_start <> 0 then
|
if bootrecord^.partition[0].LBA_start <> 0 then
|
||||||
begin
|
begin
|
||||||
//set volume information
|
//set volume information
|
||||||
storageVolume.device := drive;
|
storageVolume.device := drive;
|
||||||
storageVolume.sectorStart := bootrecord^.partition_0.LBA_start;
|
storageVolume.sectorStart := bootrecord^.partition[0].LBA_start;
|
||||||
storageVolume.sectorCount := bootrecord^.partition_0.sector_count;
|
storageVolume.sectorCount := bootrecord^.partition[0].sector_count;
|
||||||
storageVolume.sectorSize := drive^.sectorSize;
|
storageVolume.sectorSize := drive^.sectorSize;
|
||||||
storageVolume.freeSectors := 0; //TODO impliment
|
storageVolume.freeSectors := 0; //TODO impliment
|
||||||
storageVolume.filesystem := nil;
|
storageVolume.filesystem := nil;
|
||||||
@ -270,7 +271,7 @@ begin
|
|||||||
|
|
||||||
//check for filesystem type
|
//check for filesystem type
|
||||||
for i:=0 to LL_Size(filesystems) - 1 do begin
|
for i:=0 to LL_Size(filesystems) - 1 do begin
|
||||||
if bootrecord^.partition_0.system_id = PFilesystem(LL_Get(filesystems, i))^.system_id then
|
if bootrecord^.partition[0].system_id = PFilesystem(LL_Get(filesystems, i))^.system_id then
|
||||||
begin
|
begin
|
||||||
storageVolume.filesystem := PFilesystem(LL_Get(filesystems, i));
|
storageVolume.filesystem := PFilesystem(LL_Get(filesystems, i));
|
||||||
end;
|
end;
|
||||||
@ -293,14 +294,16 @@ procedure create_volume(disk : PStorage_device; filesystem : PChar; sectorStart
|
|||||||
var
|
var
|
||||||
volume : PStorage_Volume;
|
volume : PStorage_Volume;
|
||||||
elm : void;
|
elm : void;
|
||||||
|
i : uint16;
|
||||||
|
config : PuInt32;
|
||||||
begin
|
begin
|
||||||
|
|
||||||
volume := PStorage_Volume(kalloc(SizeOf(TStorage_Volume)));
|
volume := PStorage_Volume(kalloc(SizeOf(TStorage_Volume)));
|
||||||
volume^.device := disk;
|
volume^.device := disk;
|
||||||
volume^.sectorStart := sectorStart;
|
volume^.sectorStart := sectorStart;
|
||||||
volume^.sectorCount := sectorCount;
|
volume^.sectorCount := sectorCount - 10; //-10 is temp also in storagemanager
|
||||||
volume^.sectorSize := disk^.sectorSize;
|
volume^.sectorSize := disk^.sectorSize;
|
||||||
volume^.freeSectors := 0; //TODO impliment
|
volume^.freeSectors := 0; //setup by filesystem
|
||||||
|
|
||||||
//find filesystem
|
//find filesystem
|
||||||
for i:=0 to LL_Size(filesystems) - 1 do begin
|
for i:=0 to LL_Size(filesystems) - 1 do begin
|
||||||
@ -310,7 +313,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
//format volume
|
//format volume
|
||||||
volume^.filesystem^.formatVolumeCallback(disk, sectorStart, sectorCount, 0);
|
volume^.filesystem^.createCallback(disk, sectorStart, sectorCount, config);
|
||||||
|
|
||||||
//add volume to list
|
//add volume to list
|
||||||
elm := LL_Add(storageVolumes);
|
elm := LL_Add(storageVolumes);
|
||||||
@ -330,7 +333,7 @@ begin
|
|||||||
elm := LL_Add(device^.volumes);
|
elm := LL_Add(device^.volumes);
|
||||||
PStorage_volume(elm)^:= volume^;
|
PStorage_volume(elm)^:= volume^;
|
||||||
|
|
||||||
if rootVolume = PStorage_Volume(0) then rootVolume:= volume;
|
// if rootVolume = PStorage_Volume(0) then rootVolume:= volume;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
Loading…
x
Reference in New Issue
Block a user