2
0
mirror of https://git.missingno.dev/kolibrios-nvme-driver/ synced 2024-12-23 06:18:47 +01:00

refactor build_prp_list and remove free_prp_list

This commit is contained in:
Abdur-Rahman Mansoor 2024-07-12 13:33:26 -04:00
parent 52831db8f8
commit 87fa0e0e3f

View File

@ -454,27 +454,7 @@ proc get_log_page stdcall, pci:dword, dptr:dword, lid:byte
endp endp
proc free_prp_list stdcall, prp_list_ptr:dword, nprps:dword proc build_prp_list stdcall, nprps:dword, buf_physical:dword, prp_list_ptr:dword
push edi esi ebx
mov esi, [prp_list_ptr]
invoke KernelAlloc, PAGE_SIZE
test eax, eax
jz .exit
mov edi, eax
invoke MapPage, edi, esi, PG_SW+PG_NOCACHE
mov ebx, dword [edi + PAGE_SIZE / 8]
invoke FreePage, esi
sub [nprps], PAGE_SIZE / 8
.exit:
xor eax, eax
pop ebx esi edi
ret
endp
proc build_prp_list stdcall, nprps:dword
push esi ebx edi push esi ebx edi
sub esp, 16 sub esp, 16
@ -497,11 +477,16 @@ proc build_prp_list stdcall, nprps:dword
; its important to cache the value ; its important to cache the value
mov dword [esp + 12], 0 mov dword [esp + 12], 0
; the pointer to our PRP list (virtual), needed so
; that the caller can free the PRP list afterwards
mov ebx, [prp_list_ptr]
mov dword [ebx], 0
xor edi, edi xor edi, edi
xor esi, esi xor esi, esi
mov ecx, [nprps] mov ecx, [nprps]
mov ebx, ecx shl ecx, 3 ; multiply by 8 since each PRP pointer is a QWORD
shl ecx, 3
; we'll store consecutive PRP list buffers here, for example ; we'll store consecutive PRP list buffers here, for example
; given 2 PRP lists, we allocate 2 continuous pages ; given 2 PRP lists, we allocate 2 continuous pages
invoke KernelAlloc, ecx ; store pointers to the PRP entries here invoke KernelAlloc, ecx ; store pointers to the PRP entries here
@ -509,22 +494,20 @@ proc build_prp_list stdcall, nprps:dword
jz .err jz .err
mov dword [esp + 12], eax mov dword [esp + 12], eax
mov edi, eax mov edi, eax
mov dword [ebx], eax
; note we assume buf_physical is page-aligned
mov esi, [buf_physical]
.build_prp_list: .build_prp_list:
mov ecx, ebx ; ensure we don't cross a page boundary
cmp ecx, PAGE_SIZE / 8 mov ebx, [nprps]
jne @f cmp ebx, PAGE_SIZE / 8
mov ecx, PAGE_SIZE / 8 jb @f
mov ebx, PAGE_SIZE / 8
sub [nprps], ebx
@@: @@:
imul ecx, PAGE_SIZE
; allocate a massive buffer for the PRPs themselves
invoke KernelAlloc, ecx
test eax, eax
jz .err
invoke GetPhysAddr
mov esi, eax
xor ecx, ecx xor ecx, ecx
cmp dword [esp], 0 cmp dword [esp], 0
jz @f jz @f
@ -534,6 +517,7 @@ proc build_prp_list stdcall, nprps:dword
mov eax, dword [esp + 8] mov eax, dword [esp + 8]
mov dword [eax + PAGE_SIZE - 8], esi mov dword [eax + PAGE_SIZE - 8], esi
mov dword [eax + PAGE_SIZE - 4], 0 mov dword [eax + PAGE_SIZE - 4], 0
jmp .loop
@@: @@:
mov dword [esp], esi mov dword [esp], esi
@ -548,7 +532,7 @@ proc build_prp_list stdcall, nprps:dword
jne .loop jne .loop
; check if we we need to build another PRP list ; check if we we need to build another PRP list
mov dword [esp + 8], edi mov dword [esp + 8], edi
mov ebx, [nprps] add edi, PAGE_SIZE
cmp ebx, PAGE_SIZE / 8 cmp ebx, PAGE_SIZE / 8
je .build_prp_list je .build_prp_list
mov eax, dword [esp] mov eax, dword [esp]
@ -558,20 +542,6 @@ proc build_prp_list stdcall, nprps:dword
ret ret
.err: .err:
mov esi, dword [esp]
test esi, esi
jz @f
sub [nprps], PAGE_SIZE / 8
add edi, PAGE_SIZE
stdcall free_prp_list, esi, [esp + 4]
@@:
mov eax, dword [esp + 12]
test eax, eax
jz @f
invoke KernelFree, eax
@@:
add esp, 16 add esp, 16
pop edi ebx esi pop edi ebx esi
xor eax, eax xor eax, eax
@ -639,7 +609,10 @@ proc alloc_dptr stdcall, ns:dword, prps_ptr:dword, numsectors:dword, nprps_ptr:d
mov esi, [nprps_ptr] mov esi, [nprps_ptr]
dec eax dec eax
mov dword [esi], eax mov dword [esi], eax
stdcall build_prp_list, eax mov edx, dword [edi]
and edx, PAGE_SIZE - 1
add edx, PAGE_SIZE
stdcall build_prp_list, eax, edx
test eax, eax test eax, eax
jz .err jz .err
DEBUGF DBG_INFO, "Successfully allocated PRP list at: %x\n", eax DEBUGF DBG_INFO, "Successfully allocated PRP list at: %x\n", eax
@ -647,12 +620,6 @@ proc alloc_dptr stdcall, ns:dword, prps_ptr:dword, numsectors:dword, nprps_ptr:d
jmp .success jmp .success
.err: .err:
mov eax, dword [edi]
test eax, eax
jz @f
invoke FreePage, eax
@@:
xor eax, eax xor eax, eax
pop edi esi pop edi esi
ret ret