Fixed identify

This commit is contained in:
notsomeidiot123 2025-09-20 17:08:23 -04:00
parent 9c1f32a49c
commit a1abe56104
2 changed files with 44 additions and 39 deletions

View File

@ -17,7 +17,7 @@ all: bootloader tools kernel
sudo mkdir mount/sys # for system files sudo mkdir mount/sys # for system files
# ./diskwrite -v -o image.bin # ./diskwrite -v -o image.bin
# ./diskwrite -v -l kernel.elf idm.elf -o image.bin # ./diskwrite -v -l kernel.elf idm.elf -o image.bin
qemu-system-i386 -hda image.bin --no-reboot --no-shutdown -m 32m -smp 2 -serial mon:stdio -D intlog.txt -d int qemu-system-i386 -hda image.bin -hdb test.bin --no-reboot --no-shutdown -m 32m -smp 2 -serial mon:stdio -D intlog.txt -d int
sudo umount mount sudo umount mount
tools: tools:

View File

@ -16,16 +16,16 @@ CREATE interface when reading and writing from virtual files
make fini function to destroy global object, and free any remaining resources. make fini function to destroy global object, and free any remaining resources.
*/ */
#define ATA_DATA + 0 #define ATA_DATA 0
#define ATA_ERROR + 1 #define ATA_ERROR 1
#define ATA_FEATURES + 1 #define ATA_FEATURES 1
#define ATA_SECTOR_COUNT + 2 #define ATA_SECTOR_COUNT 2
#define ATA_SECTOR_NUMBER + 3 #define ATA_SECTOR_NUMBER 3
#define ATA_CYLINDER_LOW + 4 #define ATA_CYLINDER_LOW 4
#define ATA_CYLINDER_HIGH + 5 #define ATA_CYLINDER_HIGH 5
#define ATA_DRIVE_HEAD + 6 #define ATA_DRIVE_HEAD 6
#define ATA_STATUS + 7 #define ATA_STATUS 7
#define ATA_COMMAND + 7 #define ATA_COMMAND 7
#define ATA_LBA_LOW ATA_SECTOR_NUMBER #define ATA_LBA_LOW ATA_SECTOR_NUMBER
#define ATA_LBA_MID ATA_CYLINDER_LOW #define ATA_LBA_MID ATA_CYLINDER_LOW
@ -150,13 +150,13 @@ int ata_ready(uint32_t BAR, uint32_t BAR2, uint8_t drive){
if(last_disk != drive && last_bar != BAR){ if(last_disk != drive && last_bar != BAR){
last_disk = drive; last_disk = drive;
last_bar == BAR; last_bar == BAR;
outb(BAR ATA_DRIVE_HEAD, drive); outb(BAR + ATA_DRIVE_HEAD, drive);
} }
for(uint32_t i = 0; i < 15; i++){ for(uint32_t i = 0; i < 4; i++){
uint8_t _ = inb(BAR2 ATA_STATUS); uint8_t _ = inb(BAR2 + ATA_STATUS);
} }
uint8_t status = inb(BAR2 ATA_ALT_STATUS); uint8_t status = inb(BAR2 ATA_ALT_STATUS);
return ~(status >> 7); return (status >> 7) == 0;
} }
void ata_reset(uint16_t bar1){ void ata_reset(uint16_t bar1){
outw(bar1 ATA_DEVICE_CONTROL, 0x4); outw(bar1 ATA_DEVICE_CONTROL, 0x4);
@ -182,38 +182,43 @@ uint32_t find_free_drive(){
uint8_t ata_identify(uint32_t index, uint16_t disk){ uint8_t ata_identify(uint32_t index, uint16_t disk){
uint16_t bar0 = drives[index].BARs[0] >> 2; uint16_t bar0 = drives[index].BARs[0] >> 2;
uint16_t bar1 = drives[index].BARs[1] >> 2; uint16_t bar1 = drives[index].BARs[1] >> 2;
while(!ata_ready(bar0, bar1, disk)){ if(!ata_ready(bar0, bar1, disk)){
asm volatile ("" ::: "memory");
}
outb(bar0 ATA_DRIVE_HEAD, disk);
outw(bar0 ATA_SECTOR_COUNT, 0);
outw(bar0 ATA_LBA_HIH, 0);
outw(bar0 ATA_LBA_MID, 0);
outw(bar0 ATA_LBA_LOW, 0);
outw(bar0 ATA_COMMAND, ATA_CMD_IDENTIFY);
uint16_t identify[256] = {0};
uint8_t status = inb(bar0 ATA_STATUS);
if(!status){
return -1; return -1;
} }
while(ATA_BSY(status)){ // outb(bar0 ATA_DRIVE_HEAD, disk);
asm volatile ("":::"memory"); //prevent gcc from optimizing out this loop outb(bar0 + ATA_SECTOR_COUNT, 0);
if(inw(bar0 ATA_LBA_MID)){ outb(bar0 + ATA_LBA_LOW, 0);
return -1;//we don't support ATAPI and SATAPI yet outb(bar0 + ATA_LBA_MID, 0);
} outb(bar0 + ATA_LBA_HIH, 0);
status = inw(bar0 ATA_STATUS); outb(bar0 + ATA_COMMAND, ATA_CMD_IDENTIFY);
if(ATA_ERR(status)){
return -1; uint8_t status = inb(bar0 + ATA_STATUS);
} if (status == 0x00) return -1; // No device
while (ATA_BSY(status)) {
status = inb(bar0 + ATA_STATUS);
if (ATA_ERR(status)) return -1;
} }
// Check device signature for non-ATA devices
uint8_t lba_mid = inb(bar0 + ATA_LBA_MID);
uint8_t lba_high = inb(bar0 + ATA_LBA_HIH);
if (lba_mid != 0 || lba_high != 0) {
return -1; // Not an ATA device or no device
}
// Check for DRQ
status = inb(bar0 + ATA_STATUS);
if (!(ATA_DRQ(status))) return -1;
uint16_t identify[256] = {0};
for(uint16_t i = 0; i < 256; i++){ for(uint16_t i = 0; i < 256; i++){
identify[i] = inw(bar0 ATA_DATA); identify[i] = inw(bar0 + ATA_DATA);
} }
// drives[index].size_sectors // drives[index].size_sectors
uint32_t lba48 = (identify[83] & (1 << 10)); uint32_t lba48 = (identify[83] & (1 << 10));
drives[index].flags.huge = lba48 ? 1 : 0; drives[index].flags.huge = lba48 ? 1 : 0;
drives[index].size_sectors = lba48 ? (identify[60] | (identify[61] << 16)) : ((uint64_t)(identify[100]) | (uint64_t)(identify[101] << 16) | ((uint64_t)identify[102] << 32)); drives[index].size_sectors = !lba48 ? (identify[60] | (identify[61] << 16)) : ((uint64_t)(identify[100]) | (uint64_t)(identify[101] << 16) | ((uint64_t)identify[102] << 32));
api(MODULE_API_PRINT, MODULE_NAME, "Sector Count: %x\n", drives[index].size_sectors); api(MODULE_API_PRINT, MODULE_NAME, "Sector Count: %x\n", drives[index].size_sectors);
return 1; return 1;