driver: looks like zig UB, going to upgrade to master

This commit is contained in:
Jack Halford 2020-01-12 00:11:25 +01:00
parent 7483995316
commit 2db4f9899a
2 changed files with 20 additions and 11 deletions

View file

@ -189,6 +189,7 @@ fn ide_ata_access(direction: u8, drive: u8, lba: u64, numsects: u8, selector: u1
head = @intCast(u8, (lba + 1 - sect) % (16 * 63) / (63)); // Head number is written to HDDEVSEL lower 4-bits. head = @intCast(u8, (lba + 1 - sect) % (16 * 63) / (63)); // Head number is written to HDDEVSEL lower 4-bits.
lba_mode = 0; lba_mode = 0;
} }
kernel.println("lba_mode {}", lba_mode);
// (III) Wait if the drive is busy; // (III) Wait if the drive is busy;
while (ide_read(channel, ATA_REG_STATUS) & ATA_SR_BSY != 0) {} // Wait if busy.) while (ide_read(channel, ATA_REG_STATUS) & ATA_SR_BSY != 0) {} // Wait if busy.)
@ -283,14 +284,15 @@ fn ide_ata_access(direction: u8, drive: u8, lba: u64, numsects: u8, selector: u1
pub const blockdev = kernel.bio.BlockDev{ .read = ide_block_read }; pub const blockdev = kernel.bio.BlockDev{ .read = ide_block_read };
pub const sectorbuffer = [1]u8{0} ** 512; pub const sectorbuffer = [1]u8{0} ** 512;
pub fn ide_block_read(lba: u64) void { pub fn ide_block_read(lba: u64) void {
_ = ide_read_sectors(0, 1, lba, 0x8, @ptrToInt(&sectorbuffer[0])); const a = ide_read_sectors(0, 1, lba, 0x8, @ptrToInt(&sectorbuffer[0]));
if (a != 0) kernel.println("ide_read_sectors failed {}", a);
} }
pub fn ide_read_sectors(drive: u8, numsects: u8, lba: u64, es: u8, edi: usize) u8 { pub fn ide_read_sectors(drive: u2, numsects: u8, lba: u64, es: u8, edi: usize) u8 {
// 1: Check if the drive presents: // 1: Check if the drive presents:
if (drive > 3 or ide_devices[drive].reserved == 0) { if (ide_devices[drive].reserved == 0) {
return 0x1; // Drive Not Found! return 0x1; // Drive Not Found!
} else if (((lba + numsects) > ide_devices[drive].size) and (ide_devices[drive].idetype == IDE_ATA)) { } else if (ide_devices[drive].idetype == IDE_ATA and (lba + numsects) > ide_devices[drive].size) {
// 2: Check if inputs are valid: // 2: Check if inputs are valid:
return 0x2; // Seeking to invalid position. return 0x2; // Seeking to invalid position.
} else { } else {
@ -400,6 +402,13 @@ pub fn init(dev: kernel.pci.PciDevice) void {
ide_devices[count].size = @ptrCast(*const usize, &ide_buf[ATA_IDENT_MAX_LBA]).*; ide_devices[count].size = @ptrCast(*const usize, &ide_buf[ATA_IDENT_MAX_LBA]).*;
} }
kernel.println("120 {x}", ide_buf[120..122]);
kernel.println("max_lba = {x}", ide_buf[ATA_IDENT_MAX_LBA .. ATA_IDENT_MAX_LBA + 4]);
kernel.println("max_lba = {x}", ide_buf[ATA_IDENT_MAX_LBA]);
kernel.println("max_lba = {x}", ide_buf[ATA_IDENT_MAX_LBA + 1]);
kernel.println("max_lba = {x}", ide_buf[ATA_IDENT_MAX_LBA + 2]);
kernel.println("max_lba = {x}", ide_buf[ATA_IDENT_MAX_LBA + 3]);
kernel.println("max_lba = {}", @ptrCast(*const u8, &ide_buf[ATA_IDENT_MAX_LBA]).*);
// (VIII) String indicates model of device (like Western Digital HDD and SONY DVD-RW...): // (VIII) String indicates model of device (like Western Digital HDD and SONY DVD-RW...):
var k: u16 = 0; var k: u16 = 0;
while (k < 40) : (k = k + 2) { while (k < 40) : (k = k + 2) {

View file

@ -30,13 +30,13 @@ export fn kmain(magic: u32, info: *const multiboot.MultibootInfo) noreturn {
_ = task.new(@ptrToInt(topbar)) catch unreachable; _ = task.new(@ptrToInt(topbar)) catch unreachable;
_ = task.new(@ptrToInt(console.loop)) catch unreachable; _ = task.new(@ptrToInt(console.loop)) catch unreachable;
// driver.ide.blockdev.read(0); var i: u16 = 0;
// println("{}", driver.ide.sectorbuffer[0]); var sum: u64 = 0;
// println("{}", driver.ide.sectorbuffer[1]); driver.ide.blockdev.read(2);
// println("{}", driver.ide.sectorbuffer[2]); while (i < 512) : (i += 1) {
// println("{}", driver.ide.sectorbuffer[3]); sum += driver.ide.sectorbuffer[i];
// println("{}", driver.ide.sectorbuffer[4]); }
// println("{}", driver.ide.sectorbuffer[5]); println("sum: {}", sum);
task.terminate(); task.terminate();
} }