328,7 → 328,7 |
dd 0 ; no closemedia function |
dd ahci_querymedia |
dd ahci_read |
dd 0;ahci_write |
dd ahci_write |
dd 0 ; no flush function |
dd 0 ; use default cache size |
.end: |
981,7 → 981,7 |
|
DEBUGF AHCI_DBGLVL, "sata_error register = 0x%x\n", [edi + HBA_PORT.sata_error] |
|
DEBUGF AHCI_DBGLVL, "reading completed\n" |
DEBUGF AHCI_DBGLVL, "R/W completed\n" |
|
; xor ecx, ecx |
; mov esi, [vbuf_orig] |
1068,6 → 1068,52 |
ret |
endp |
|
; Write sectors |
; return value: 0 = success, otherwise = error |
proc ahci_write stdcall pdata: dword, buffer: dword, startsector: qword, numsectors_ptr:dword |
locals |
numsectors dd ? |
endl |
|
pushad |
|
mov ecx, ahci_mutex |
call mutex_lock |
|
mov eax, [numsectors_ptr] |
mov eax, [eax] |
mov [numsectors], eax |
DEBUGF AHCI_DBGLVL, " ahci_write: buffer = 0x%x, startsector = 0x%x:%x, numsectors = %u\n", [buffer], [startsector], [startsector + 4], eax |
|
xor ecx, ecx ; how many sectors have been read |
.write_loop: |
cmp ecx, [numsectors] |
jae .write_loop_end |
|
mov ebx, [numsectors] |
sub ebx, ecx |
stdcall ahci_rw_sectors, [pdata], [buffer], dword [startsector], dword [startsector + 4], ebx, 1 |
;; TODO check if eax == 0 ? |
|
DEBUGF AHCI_DBGLVL, " EAX = 0x%x\n", eax |
|
add [buffer], eax |
shr eax, 9 ; /= 512 |
add ecx, eax |
add dword [startsector], eax |
adc dword [startsector + 4], 0 |
|
jmp .write_loop |
.write_loop_end: |
|
mov ecx, ahci_mutex |
call mutex_unlock |
|
popad |
xor eax, eax |
ret |
endp |
|
; Start command engine |
; in: eax - address of HBA_PORT structure |
ahci_start_cmd: |