fix: build

This commit is contained in:
d0p1 🏳️‍⚧️ 2025-01-24 10:26:58 +01:00
parent f676062269
commit 86b3e1fdc9
3 changed files with 143 additions and 29 deletions

View file

@ -117,4 +117,5 @@ Alter Language: Assembly
Add Extensions: asm s inc Add Extensions: asm s inc
Function Prototype Ender: : Function Prototype Ender: :
Macro Prototype Ender: {
Struct Prototype Ender: } Struct Prototype Ender: }

View file

@ -92,7 +92,7 @@ DEFN Vmem
;;; MARK: Private functions ;;; MARK: Private functions
;; Function: _murmur32 ;; Function: _vmem_hashtable_hash
;; ;;
;; In: ;; In:
;; EAX - Address ;; EAX - Address
@ -100,7 +100,7 @@ DEFN Vmem
;; Out: ;; Out:
;; EAX - Hash ;; EAX - Hash
;; ;;
_murmur32: _vmem_hashtable_hash:
; hash hash XOR (hash >> 16) ; hash hash XOR (hash >> 16)
mov ecx, eax mov ecx, eax
shr ecx, 16 shr ecx, 16
@ -121,19 +121,19 @@ _murmur32:
xor eax, ecx xor eax, ecx
ret ret
;; Function: _hash_table_addr ;; Function: _vmem_hashtable_addr
;; ;;
;; In: ;; In:
;; EAX - Vmem ;; EAX - Vmem
;; EDX - ADDR ;; EDX - ADDR
__hash_table_addr: _vmem_hashtable_addr:
push ebp push ebp
mov ebp, esp mov ebp, esp
push esi push esi
mov esi, eax mov esi, eax
mov eax, edx mov eax, edx
call _murmur32 call _vmem_hashtable_hash
and eax, VMEM_HASHTABLE_N-1 ; x % y (y is a power of two) and eax, VMEM_HASHTABLE_N-1 ; x % y (y is a power of two)
shl eax, 2 shl eax, 2
@ -244,9 +244,56 @@ _vmem_refill:
;; ESP[20] - addrp ;; ESP[20] - addrp
;; ;;
_vmem_segfit: _vmem_segfit:
mov edx, [esp + 20]
mov eax, [eax + VmemSegment.base]
mov [edx], eax
xor eax, eax xor eax, eax
ret ret
;; Function: _vmem_add_to_freelist
;;
;; Add segment to <Vmem> freelist.
;;
;; In:
;; EAX - Pointer to <Vmem> object.
;; EDX - Pointer to <VmemSegment> object.
;;
_vmem_add_to_freelist:
mov ecx, [edx + VmemSegment.size]
VMEM_GET_LIST_FROM_SIZE ecx, VMEM_FREELISTS_N
shl ecx, 2
lea eax, [eax + Vmem.freelist]
add eax, ecx
lea edx, [edx + VmemSegment.seglist]
call list_insert_head
ret
;; Function: _vmem_insert_segment
;;
;; In:
;; EAX - Pointer to <Vmem> object.
;; EDX - Pointer to <VmemSegment>.
;; ECX - Pointer to <TailQEntry>.
;;
_vmem_insert_segment:
lea eax, [eax + Vmem.segqueue]
lea edx, [edx + VmemSegment.segqueue]
xchg edx, ecx
call tailq_insert_after
ret
;; Function: _vmem_hashtable_insert
;;
;; In:
;; EAX - Pointer to <Vmem> object.
;; EDX - Pointer
_vmem_hashtable_insert:
ret
;; Function: _vmem_add ;; Function: _vmem_add
;; ;;
;; In: ;; In:
@ -589,7 +636,6 @@ vmem_xalloc:
.best_fit: .best_fit:
; iterate each item in list ; iterate each item in list
xchg bx, bx
mov eax, [ebp - 12] mov eax, [ebp - 12]
.best_fit_loop: .best_fit_loop:
mov eax, [eax] mov eax, [eax]
@ -626,7 +672,7 @@ vmem_xalloc:
cmp [ebp - 12], eax cmp [ebp - 12], eax
jl .best_fit jl .best_fit
.next: .next:
if 0 if 1
; NetBSD does this ; NetBSD does this
; https://github.com/NetBSD/src/blob/trunk/sys/kern/subr_vmem.c#L1296-L1301 ; https://github.com/NetBSD/src/blob/trunk/sys/kern/subr_vmem.c#L1296-L1301
mov eax, [ebp + 24] mov eax, [ebp + 24]
@ -642,18 +688,8 @@ end if
; return error and free allocated segment if needed ; return error and free allocated segment if needed
.fail: .fail:
mov eax, [ebp - 8] xor edi, edi
or eax, eax mov ebx, ENOMEM
jz @f
call _vmem_segfree
@@:
mov eax, [ebp - 4]
or eax, eax
jz @f
call _vmem_segfree
@@:
xor eax, eax
mov edx, ENOMEM
jmp .end jmp .end
.found: .found:
@ -675,33 +711,103 @@ end if
sub ecx, eax sub ecx, eax
mov [edx + VmemSegment.size], ecx mov [edx + VmemSegment.size], ecx
mov eax, [ebp - 16] mov eax, [ebp - 16]
mov dword [eax + VmemSegment.base], [ebp - 20] push ecx
mov ecx, [ebp - 20]
mov [eax + VmemSegment.base], ecx
pop ecx
mov edx, [eax + VmemSegment.size] mov edx, [eax + VmemSegment.size]
sub edx, ecx sub edx, ecx
mov [eax + VmemSegment.size], edx mov [eax + VmemSegment.size], edx
; insert to freelist ; insert to freelist
VMEM_GET_LIST_FROM_SIZE ecx, VMEM_FREELISTS_N
shl ecx, 2
mov eax, esi mov eax, esi
add eax, Vmem.freelist
add eax, ecx
mov edx, [ebp - 8] mov edx, [ebp - 8]
add edx, VmemSegment.seglist call _vmem_add_to_freelist
call list_insert_head
; insert segment before the allocated one
mov eax, esi
mov edx, [ebp - 8]
mov ecx, [ebp - 16]
TAILQ_PREV ecx, VmemSegment.segqueue
call _vmem_insert_segment
mov dword [ebp - 8], 0 mov dword [ebp - 8], 0
@@: @@:
; split right ; split right
; (seg->size != size) && (seg->size - size) > quantum - 1)
mov edx, [ebp - 16]
mov ecx, [edx + VmemSegment.size]
cmp edi, ecx
je @f
mov eax, [esi + Vmem.quantum]
dec eax
sub ecx, edi
cmp ecx, eax
jle @f
; offset the segment
mov [edx + VmemSegment.size], ecx
mov eax, [edx + VmemSegment.base]
mov ecx, eax
add eax, edi
mov [edx + VmemSegment.base], eax
mov edx, [ebp - 4]
mov [edx + VmemSegment.base], ecx
mov [edx + VmemSegment.size], edi
; insert to free list
mov eax, esi
call _vmem_add_to_freelist
; put new allocated seg before
mov eax, esi
mov edx, [ebp - 4]
mov ecx, [ebp - 16]
TAILQ_PREV ecx, VmemSegment.segqueue
call _vmem_insert_segment
mov edx, [ebp - 4]
mov [ebp - 16], edx
mov dword [ebp - 4], 0
@@:
mov edx, [ebp - 16]
mov dword [edx + VmemSegment.type], VMEM_SEGMENT_ALLOCATED
mov eax, esi
call _vmem_hashtable_insert
mov edx, [ebp - 16]
mov edi, [edx + VmemSegment.base]
xor ebx, ebx
if CONFIG_TRACE_VMEM
lea edx, [esi + Vmem.name]
TRACE szTraceVmemAlloc, edx, edi
end if
.end: .end:
mov eax, [ebp - 8]
or eax, eax
jz @f
call _vmem_segfree
@@:
mov eax, [ebp - 4]
or eax, eax
jz @f
call _vmem_segfree
@@:
mov eax, edi
mov edx, ebx
pop ebx pop ebx
pop esi
pop edi pop edi
pop ebx pop esi
leave leave
ret ret
@ -843,5 +949,6 @@ if CONFIG_TRACE_VMM
szTraceVmemBootstrap db "Trace(VMEM): Bootstrap vmem", 0 szTraceVmemBootstrap db "Trace(VMEM): Bootstrap vmem", 0
szTraceVmemCreate db "Trace(VMEM): Create %s [%x, %x)", 0 szTraceVmemCreate db "Trace(VMEM): Create %s [%x, %x)", 0
szTraceVmemAdd db "Trace(VMEM): %s: Add span [%x, %x)", 0 szTraceVmemAdd db "Trace(VMEM): %s: Add span [%x, %x)", 0
szTraceVmemAlloc db "Trace(VMEM): %s: Alloc: %x", 0
szTraceVmemDestroy db "Trace(VMEM): Destroy %s", 0 szTraceVmemDestroy db "Trace(VMEM): Destroy %s", 0
end if end if

View file

@ -98,6 +98,12 @@ struc TailQEntry {
.prev dd ? .prev dd ?
} }
;; Macro: TAILQ_PREV
;;
macro TAILQ_PREV reg, field {
mov reg, [reg + field#.prev]
}
;; Function: tailq_insert_head ;; Function: tailq_insert_head
;; ;;
;; In: ;; In: