More progress and fixes

This commit is contained in:
Aaron Hance 2022-01-29 22:21:10 +00:00
parent e791edb02a
commit 6476a774dc
5 changed files with 33 additions and 74 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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.