summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
Diffstat (limited to 'dev')
-rw-r--r--dev/Boot/BootKit/BootKit.h3
-rw-r--r--dev/Boot/amd64-desktop.make4
-rw-r--r--dev/Kernel/HALKit/AMD64/HalApplicationProcessor.cc1
-rw-r--r--dev/Kernel/KernelKit/DriveMgr.h4
-rw-r--r--dev/Kernel/src/DriveMgr.cc89
-rw-r--r--dev/Kernel/src/FS/NeFS.cc3
6 files changed, 83 insertions, 21 deletions
diff --git a/dev/Boot/BootKit/BootKit.h b/dev/Boot/BootKit/BootKit.h
index db21ba30..050d5929 100644
--- a/dev/Boot/BootKit/BootKit.h
+++ b/dev/Boot/BootKit/BootKit.h
@@ -345,7 +345,7 @@ namespace Boot
part.Version = kNeFSVersionInteger;
part.CatalogCount = blob_cnt;
part.Kind = kNeFSHardDrive;
- part.SectorSize = sizeof(NFS_ROOT_PARTITION_BLOCK);
+ part.SectorSize = 512;
part.FreeCatalog = fDiskDev.GetSectorsCount() / sizeof(NFS_CATALOG_STRUCT);
part.SectorCount = fDiskDev.GetSectorsCount();
part.FreeSectors = fDiskDev.GetSectorsCount();
@@ -377,6 +377,7 @@ namespace Boot
epm_boot.FsVersion = kNeFSVersionInteger;
epm_boot.LbaStart = kNeFSRootCatalogStartAddress;
+ epm_boot.LbaEnd = fDiskDev.GetDiskSize();
epm_boot.SectorSz = part.SectorSize;
epm_boot.Kind = kEPMZkaOS;
epm_boot.NumBlocks = part.CatalogCount;
diff --git a/dev/Boot/amd64-desktop.make b/dev/Boot/amd64-desktop.make
index 395b4e86..3fc704b6 100644
--- a/dev/Boot/amd64-desktop.make
+++ b/dev/Boot/amd64-desktop.make
@@ -31,7 +31,7 @@ IMG_2=epm-master-2.img
EMU_FLAGS=-net none -smp 4 -m 8G -M q35 \
-bios $(BIOS) -drive \
file=fat:rw:src/Root/,index=2,format=raw \
- -monitor stdio
+ -serial stdio
LD_FLAGS=-e Main --subsystem=10
@@ -44,7 +44,7 @@ REM_FLAG=-f
FLAG_ASM=-f win64
FLAG_GNU=-fshort-wchar -D__EFI_x86_64__ -mno-red-zone -D__MINOSKRNL__ -D__ZBAOSLDR__ \
-DEFI_FUNCTION_WRAPPER -I./ -I../Kernel -I../ -c -nostdlib -fno-rtti -fno-exceptions \
- -std=c++20 -DBOOTZ_GPT_SUPPORT -D__HAVE_ZKA_APIS__ -DZBA_USE_FB -D__ZKA_AMD64__ -D__ZKA__ -DZKA_AUTO_FORMAT
+ -std=c++20 -DBOOTZ_GPT_SUPPORT -DBOOTZ_EPM_SUPPORT -D__HAVE_ZKA_APIS__ -DZBA_USE_FB -D__ZKA_AMD64__ -D__ZKA__ -DZKA_AUTO_FORMAT
BOOTLOADER=zbaosldr.exe
KERNEL=minoskrnl.exe
diff --git a/dev/Kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/Kernel/HALKit/AMD64/HalApplicationProcessor.cc
index 20d512f4..7929d5a8 100644
--- a/dev/Kernel/HALKit/AMD64/HalApplicationProcessor.cc
+++ b/dev/Kernel/HALKit/AMD64/HalApplicationProcessor.cc
@@ -4,7 +4,6 @@
------------------------------------------- */
-#include "NewKit/Defines.h"
#include <Mod/ACPI/ACPIFactoryInterface.h>
#include <KernelKit/UserProcessScheduler.h>
#include <HALKit/AMD64/Processor.h>
diff --git a/dev/Kernel/KernelKit/DriveMgr.h b/dev/Kernel/KernelKit/DriveMgr.h
index 4c879ab5..dfe4e665 100644
--- a/dev/Kernel/KernelKit/DriveMgr.h
+++ b/dev/Kernel/KernelKit/DriveMgr.h
@@ -52,7 +52,8 @@ namespace Kernel
Char fName[kDriveNameLen]; // /System, /Boot, //./Devices/USB...
Int32 fKind; // fMassStorage, fFloppy, fOpticalDisc.
Int32 fFlags; // fReadOnly, fXPMDrive, fXPTDrive
-
+ UInt64 fLbaEnd, fLbaStart;
+ UInt64 fSectorSz;
/// @brief Packet drive (StorageKit compilant.)
struct DrivePacket final
{
@@ -63,6 +64,7 @@ namespace Kernel
Boolean fPacketGood{YES};
Lba fPacketLba{0UL};
Boolean fPacketReadOnly{NO};
+ DriveTrait* fPacketDrive{nullptr};
} fPacket;
Void (*fInput)(DrivePacket* packet_ptr);
diff --git a/dev/Kernel/src/DriveMgr.cc b/dev/Kernel/src/DriveMgr.cc
index 18ff9e5d..d1a6adbf 100644
--- a/dev/Kernel/src/DriveMgr.cc
+++ b/dev/Kernel/src/DriveMgr.cc
@@ -27,15 +27,47 @@ namespace Kernel
/// @return
Void io_drv_input(DriveTrait::DrivePacket* pckt)
{
- if (!pckt)
+ if (!pckt || !pckt->fPacketDrive)
{
return;
}
+ if (pckt->fPacketDrive->fSectorSz == 0)
+ {
+#ifdef __ATA_PIO__
+ pckt->fPacketDrive->fSectorSz = kATASectorSize;
+#elif defined(__AHCI__)
+ pckt->fPacketDrive->fSectorSz = kAHCISectorSize;
+#else
+ pckt->fPacketDrive->fSectorSz = 512;
+#endif
+ }
+
+ if (!StringBuilder::Equals("fs/detect-packet", pckt->fPacketMime) &&
+ pckt->fPacketDrive->fLbaStart > 0 && pckt->fPacketDrive->fLbaEnd > 0)
+ {
+ kcout << "LBA END: " << number(pckt->fPacketDrive->fLbaEnd) << endl;
+ kcout << "LBA: " << number(pckt->fPacketLba) << endl;
+ kcout << "LBA START: " << number(pckt->fPacketDrive->fLbaStart) << endl;
+ kcout << "SECTOR SZ: " << number(pckt->fPacketDrive->fLbaStart) << endl;
+
+ if (pckt->fPacketLba < pckt->fPacketDrive->fLbaStart)
+ {
+ pckt->fPacketGood = NO;
+ return;
+ }
+
+ if (pckt->fPacketLba > pckt->fPacketDrive->fLbaEnd)
+ {
+ pckt->fPacketGood = NO;
+ return;
+ }
+ }
+
#ifdef __AHCI__
- drv_std_read(pckt->fPacketLba, (Char*)pckt->fPacketContent, kAHCISectorSize, pckt->fPacketSize);
+ drv_std_read(pckt->fPacketLba, (Char*)pckt->fPacketContent, pckt->fPacketDrive->fSectorSz, pckt->fPacketSize);
#elif defined(__ATA_PIO__) || defined(__ATA_DMA__)
- drv_std_read(pckt->fPacketLba, kATAIO, kATAMaster, (Char*)pckt->fPacketContent, kATASectorSize, pckt->fPacketSize);
+ drv_std_read(pckt->fPacketLba, kATAIO, kATAMaster, (Char*)pckt->fPacketContent, pckt->fPacketDrive->fSectorSz, pckt->fPacketSize);
#endif
}
@@ -44,15 +76,24 @@ namespace Kernel
/// @return
Void io_drv_output(DriveTrait::DrivePacket* pckt)
{
- if (!pckt)
+ if (!pckt || !pckt->fPacketDrive)
{
return;
}
+ if (!StringBuilder::Equals("fs/detect-packet", pckt->fPacketMime))
+ {
+ if (pckt->fPacketLba < pckt->fPacketDrive->fLbaStart)
+ return;
+
+ if (pckt->fPacketLba > pckt->fPacketDrive->fLbaEnd)
+ return;
+ }
+
#ifdef __AHCI__
- drv_std_write(pckt->fPacketLba, (Char*)pckt->fPacketContent, kAHCISectorSize, pckt->fPacketSize);
+ drv_std_write(pckt->fPacketLba, (Char*)pckt->fPacketContent, pckt->fPacketDrive->fSectorSz, pckt->fPacketSize);
#elif defined(__ATA_PIO__) || defined(__ATA_DMA__)
- drv_std_write(pckt->fPacketLba, kATAIO, kATAMaster, (Char*)pckt->fPacketContent, kATASectorSize, pckt->fPacketSize);
+ drv_std_write(pckt->fPacketLba, kATAIO, kATAMaster, (Char*)pckt->fPacketContent, pckt->fPacketDrive->fSectorSz, pckt->fPacketSize);
#endif
}
@@ -160,8 +201,17 @@ namespace Kernel
{
EPM_PART_BLOCK block_struct;
- trait.fPacket.fPacketLba = kEPMBootBlockLba;
- trait.fPacket.fPacketSize = sizeof(EPM_PART_BLOCK);
+ trait.fPacket.fPacketDrive = &trait;
+
+#ifdef __ATA_PIO__
+ trait.fSectorSz = kATASectorSize;
+#elif defined(__AHCI__)
+ trait.fSectorSz = kAHCISectorSize;
+#else
+ trait.fSectorSz = 512;
+#endif
+ trait.fPacket.fPacketLba = kEPMBootBlockLba;
+ trait.fPacket.fPacketSize = sizeof(EPM_PART_BLOCK);
trait.fPacket.fPacketContent = &block_struct;
rt_copy_memory((VoidPtr) "fs/detect-packet", trait.fPacket.fPacketMime,
@@ -174,14 +224,23 @@ namespace Kernel
if (rt_string_cmp(((BOOT_BLOCK_STRUCT*)trait.fPacket.fPacketContent)->Magic, kEPMMagic, kEPMMagicLength) == 0)
{
trait.fPacket.fPacketReadOnly = NO;
- trait.fKind = kMassStorageDisc | kEPMDrive;
+ trait.fKind = kMassStorageDisc | kEPMDrive;
kcout << "Formatted Disk is EPM (Mass Storage)\r";
+
+ trait.fSectorSz = block_struct.SectorSz;
+ trait.fLbaEnd = block_struct.LbaEnd;
+ trait.fLbaStart = block_struct.LbaStart;
+
+ if (trait.fSectorSz == 0)
+ {
+ ke_panic(RUNTIME_CHECK_FAILED, "Invalid EPM partition!");
+ }
}
else
{
trait.fPacket.fPacketReadOnly = YES;
- trait.fKind = kMassStorageDisc | kUnformattedDrive | kReadOnlyDrive;
+ trait.fKind = kMassStorageDisc | kUnformattedDrive | kReadOnlyDrive;
kcout << "Scheme Found: " << block_struct.Name << endl;
@@ -192,11 +251,11 @@ namespace Kernel
rt_copy_memory((VoidPtr) "*/*", trait.fPacket.fPacketMime,
rt_string_len("*/*"));
- trait.fPacket.fPacketLba = 0;
- trait.fPacket.fPacketSize = 0UL;
+ trait.fPacket.fPacketLba = 0;
+ trait.fPacket.fPacketSize = 0UL;
trait.fPacket.fPacketContent = nullptr;
}
- } // namespace Detail
+ } // namespace Detect
/// @brief Fetches the main drive.
/// @return the new drive. (returns kEPMDrive if EPM formatted)
@@ -216,10 +275,10 @@ namespace Kernel
trait.fInit = io_drv_init;
trait.fDriveKind = io_drv_kind;
- Detect::io_detect_drive(trait);
-
kcout << "Detecting partition scheme of: " << trait.fName << ".\r";
+ Detect::io_detect_drive(trait);
+
return trait;
}
} // namespace Kernel
diff --git a/dev/Kernel/src/FS/NeFS.cc b/dev/Kernel/src/FS/NeFS.cc
index 6f4c43b9..2c6369ce 100644
--- a/dev/Kernel/src/FS/NeFS.cc
+++ b/dev/Kernel/src/FS/NeFS.cc
@@ -360,7 +360,7 @@ _Output NFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char*
return nullptr;
}
- child_catalog->DataFork = part_block->DiskSize - kNeFSRootCatalogStartAddress - start_free;
+ child_catalog->DataFork = part_block->DiskSize - kNeFSRootCatalogStartAddress;
child_catalog->ResourceFork = child_catalog->DataFork;
// Write the new catalog next sibling, if we don't know this parent. //
@@ -1028,6 +1028,7 @@ namespace Kernel::Detail
kcout << "Creating A:\r";
kDiskMountpoint.A() = io_construct_main_drive();
+ kDiskMountpoint.A().fPacket.fPacketDrive = &kDiskMountpoint.A();
kcout << "Creating A: [ OK ]\r";