2026-06-19 00:27:08 -05:00
|
|
|
#include "drivers/atapi/ata.h"
|
|
|
|
|
|
|
|
|
|
.code32
|
|
|
|
|
|
2026-06-20 21:02:59 -05:00
|
|
|
.extern selected_drive_primary
|
|
|
|
|
.extern selected_drive_secondary
|
|
|
|
|
|
|
|
|
|
.global ident_device
|
|
|
|
|
ident_device:
|
|
|
|
|
push %ebp
|
|
|
|
|
mov %esp, %ebp
|
|
|
|
|
|
|
|
|
|
push %ebx
|
|
|
|
|
push %ecx
|
|
|
|
|
push %edx
|
|
|
|
|
push $0
|
|
|
|
|
|
|
|
|
|
mov 8(%ebp), %ebx # ebx = bus base address
|
|
|
|
|
mov 12(%ebp), %ecx # ecx = drive select mask
|
|
|
|
|
|
|
|
|
|
# drive select
|
|
|
|
|
mov %ebx, %edx
|
|
|
|
|
add $IO_DRIVE_SELECT_REG, %edx
|
|
|
|
|
mov %cl, %al
|
|
|
|
|
outb %al, (%dx)
|
|
|
|
|
|
|
|
|
|
xor %eax, %eax
|
|
|
|
|
# clear sector count and LBA
|
|
|
|
|
mov %ebx, %edx
|
|
|
|
|
add $IO_SECTOR_COUNT_REG, %edx
|
|
|
|
|
outb %al, (%dx)
|
|
|
|
|
|
|
|
|
|
mov %ebx, %edx
|
|
|
|
|
add $IO_LBA_LO_REG, %edx
|
|
|
|
|
outb %al, (%dx)
|
|
|
|
|
|
|
|
|
|
mov %ebx, %edx
|
|
|
|
|
add $IO_LBA_MID_REG, %edx
|
|
|
|
|
outb %al, (%dx)
|
|
|
|
|
|
|
|
|
|
mov %ebx, %edx
|
|
|
|
|
add $IO_LBA_HI_REG, %edx
|
|
|
|
|
outb %al, (%dx)
|
|
|
|
|
|
|
|
|
|
# send ident
|
|
|
|
|
mov %ebx, %edx
|
|
|
|
|
add $IO_CMD_REG, %edx
|
|
|
|
|
mov $0xEC, %al
|
|
|
|
|
outb %al, (%dx)
|
|
|
|
|
|
|
|
|
|
mov %ebx, %edx
|
|
|
|
|
add $IO_STATUS_REG, %edx
|
|
|
|
|
inb (%dx), %al
|
|
|
|
|
inb (%dx), %al
|
|
|
|
|
inb (%dx), %al
|
|
|
|
|
inb (%dx), %al
|
|
|
|
|
|
|
|
|
|
cmp $0xFF, %al
|
|
|
|
|
je not_found
|
|
|
|
|
test %al, %al
|
|
|
|
|
jz not_found
|
|
|
|
|
|
|
|
|
|
poll_status:
|
|
|
|
|
inb (%dx), %al
|
|
|
|
|
test $STATUS_REG_BSY, %al
|
|
|
|
|
jnz poll_status
|
|
|
|
|
|
|
|
|
|
check_ata:
|
|
|
|
|
mov %ebx, %edx
|
|
|
|
|
add $IO_LBA_MID_REG, %edx
|
|
|
|
|
inb (%dx), %al
|
|
|
|
|
test %al, %al
|
|
|
|
|
jnz check_atapi
|
|
|
|
|
|
|
|
|
|
mov %ebx, %edx
|
|
|
|
|
add $IO_LBA_HI_REG, %edx
|
|
|
|
|
inb (%dx), %al
|
|
|
|
|
test %al, %al
|
|
|
|
|
jnz check_atapi
|
|
|
|
|
|
|
|
|
|
mov $0x01, (%esp)
|
|
|
|
|
jmp poll_drq
|
|
|
|
|
|
|
|
|
|
check_atapi:
|
|
|
|
|
# check if atapi device
|
|
|
|
|
mov %ebx, %edx
|
|
|
|
|
add $IO_LBA_MID_REG, %edx
|
|
|
|
|
inb (%dx), %al
|
|
|
|
|
cmp $0x14, %al
|
|
|
|
|
jne not_found
|
|
|
|
|
|
|
|
|
|
mov %ebx, %edx
|
|
|
|
|
add $IO_LBA_HI_REG, %edx
|
|
|
|
|
inb (%dx), %al
|
|
|
|
|
cmp $0xEB, %al
|
|
|
|
|
jne not_found
|
|
|
|
|
is_atapi:
|
|
|
|
|
mov $0x02, (%esp)
|
|
|
|
|
mov %ebx, %edx
|
|
|
|
|
add $IO_CMD_REG, %edx
|
|
|
|
|
mov $(ATAPI_CMD_IDENTIFY_PACKET), %al
|
|
|
|
|
outb %al, (%dx)
|
|
|
|
|
|
|
|
|
|
mov %ebx, %edx
|
|
|
|
|
add $IO_STATUS_REG, %edx
|
|
|
|
|
inb (%dx), %al
|
|
|
|
|
inb (%dx), %al
|
|
|
|
|
inb (%dx), %al
|
|
|
|
|
inb (%dx), %al
|
|
|
|
|
1:
|
|
|
|
|
inb (%dx), %al
|
|
|
|
|
test $STATUS_REG_BSY, %al
|
|
|
|
|
jnz 1b
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
poll_drq:
|
|
|
|
|
mov %ebx, %edx
|
|
|
|
|
add $IO_STATUS_REG, %edx
|
|
|
|
|
inb (%dx), %al
|
|
|
|
|
|
|
|
|
|
test $STATUS_REG_ERR, %al
|
|
|
|
|
jnz error
|
|
|
|
|
|
|
|
|
|
test $STATUS_REG_DRQ, %al
|
|
|
|
|
jz poll_drq
|
|
|
|
|
|
|
|
|
|
drq_set:
|
|
|
|
|
mov %ebx, %edx
|
|
|
|
|
add $IO_DATA_REG, %edx
|
|
|
|
|
|
|
|
|
|
mov 16(%ebp), %edi
|
|
|
|
|
mov $256, %ecx
|
|
|
|
|
read_data:
|
|
|
|
|
inw (%dx), %ax
|
|
|
|
|
mov %ax, (%edi)
|
|
|
|
|
add $2, %edi
|
|
|
|
|
loop read_data
|
|
|
|
|
|
|
|
|
|
jmp done
|
|
|
|
|
|
|
|
|
|
not_found:
|
|
|
|
|
error:
|
|
|
|
|
mov $0x0, (%esp)
|
|
|
|
|
done:
|
|
|
|
|
pop %eax
|
|
|
|
|
pop %edx
|
|
|
|
|
pop %ecx
|
|
|
|
|
pop %ebx
|
|
|
|
|
leave
|
2026-06-19 00:27:08 -05:00
|
|
|
ret
|