from-scratch/stages/shared/alloc.hex1
2026-07-14 16:36:54 +02:00

428 lines
5.4 KiB
Plaintext

@oom_msg:
4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 21 0a
@oom:
# lea rdi, ['oom_msg]
48 8d 3d 'oom_msg
# mov esi, 15
be 0f 00 00 00
# mov eax, 1
b8 01 00 00 00
# mov edi, 2
bf 02 00 00 00
# syscall
0f 05
# mov eax, 60
b8 3c 00 00 00
# mov rdi, -1
48 c7 c7 ff ff ff ff
# syscall
0f 05
@alloc_pages:
# mov rax, 9
b8 09 00 00 00
# mov rsi, rdi
48 89 fe
# xor rdi, rdi
48 31 ff
# mov edi, 3
ba 03 00 00 00
# mov r10, 0x22
41 ba 22 00 00 00
# mov r8, -1
49 c7 c0 ff ff ff ff
# xor r9, r9
4d 31 c9
# syscall
0f 05
# cmp rax, -1
48 83 f8 ff
# jle 'oom
0f 8e 'oom
# ret
c3
@dealloc_pages:
# mov rax, 11
b8 0b 00 00 00
# mov rdi, rsi
48 89 f7
# mov rsi, rdx
48 89 d6
# syscall
0f 05
# cmp rax, -1
48 83 f8 ff
# jle 'oom
0f 8e 'oom
# ret
c3
@realloc_pages:
# push rbp
55
# mov rbp, rsp
48 89 e5
# sub rsp, 32
48 83 ec 20
# mov qword [rsp], rsi
48 89 34 24
# mov qword [rsp + 8], rdi
48 89 7c 24 08
# mov rdi, rdx
48 89 d7
# call 'alloc_pages
e8 'alloc_pages
# mov rsi, rax
48 89 fe
# mov rdi, qword [rsp + 8]
48 8b 7c 24 08
# mov rdx, qword [rsp]
48 8b 14 24
# mov qword [rsp + 16], rax
48 89 44 24 10
# call 'memcpy
e8 'memcpy
# mov rdi, qword [rsp + 8]
48 8b 7c 24 08
# mov rsi, qword [rsp]
48 8b 34 24
# call 'dealloc_pagesA
e8 'dealloc_pages
# mov rax, qword [rsp + 16]
48 8b 44 24 10
# add rsp, 32
48 83 c4 20
# pop rbp
5d
# ret
c3
@make_slab:
# push rdi
57
# mov rdi, 0x4000
bf 00 40 00 00
# call 'alloc_pages
e8 'alloc_pages
# mov qword [rsp + 0x4000 - 8], 0
48 c7 80 f8 3f 00 00 00 00 00 00
# pop rdi
5f
# mov qword [rdi], 0
48 c7 07 00 00 00 00
# mov qword [rdi + 8], 0
48 c7 47 08 00 00 00 00
# mov qword [rdi + 16], rax
48 89 47 10
# mov qword [rdi + 24], rax
48 89 47 18
# mov rax, rdi
48 89 f8
# ret
c3
@heap:
00 00 00 00 00 00 00 00
@init_heap.done:
# pop r14
41 5e
# ret
c3
@init_heap:
# push r14
41 56
# xor r14, r14
4d 31 f6
# mov rax, ['heap]
48 8b 05 'heap
# test rax, rax
48 85 c0
# jne .done
0f 85 'init_heap.done
# mov rdi, 0x1000
bf 00 10 00 00
# call alloc_pages
e8 'alloc_pages
# mov ['heap], rax
48 89 05 'heap
@init_heap.loop:
# cmp r14, 9
49 83 fe 09
# jge .done
0f 8d 'init_heap.done
# mov rdi, r14
4c 89 f7
# shl rdi, 12
48 c1 e7 05
# mov rax, ['heap]
48 8b 05 'heap
# lea rdi, [rax + rdi]
48 8d 3c 38
# call make_slab
e8 'make_slab
# inc r14
49 ff c6
# jmp .loop
e9 'init_heap.loop
@slab_bucket:
# xor eax, eax
31 c0
# dec rdi
48 ff cf
# dec rsi
48 ff ce
# or rdi, rsi
48 09 f7
# bsr rsi, rdi
48 0f bd f7
# sub rsi, 2
48 83 ee 02
# cmovae rax, rsi
48 0f 43 c6
# ret
c3
@slab_alloc.alloc_from_block:
# inc qword [rdi]
48 ff 07
#mov ecx, esi
89 f1
# shl rax, cl
48 d3 e0
# add rax, rbx
48 01 d8
# pop rbx
5b
# ret
c3
@slab_alloc.no_free:
# add esi, 3
83 c6 03
# and esi, 63
83 e6 3f
# mov edx, 0x4000 - 8
ba f8 3f 00 00
# mov ecx, esi
89 f1
# shr rdx, cl
48 d3 ea
# mov rax, qword [rdi]
48 8b 07
# mov rbx, qword [rdi + 24]
48 8b 5f 18
# cmp rax, rdx
48 39 d0
# jb .alloc_from_block
0f 82 'slab_alloc.alloc_from_block
# push rsi
56
# push rax
50
# push rdi
57
# mov rdi, 0x4000
bf 00 40 00 00
# call 'alloc_pages
e8 'alloc_pages
# mov qword [rax + 0x4000 - 8], 0
48 c7 80 f8 3f 00 00 00 00 00 00
# pop rdi
5f
# mov rsi, qword [rdi + 24]
48 8b 77 18
# mov qword [rdi + 24], rax
48 89 86 f8 3f 00 00
# mov qword [rdi + 24], rax
48 89 47 18
# mov rbx, rax
48 89 c3
# pop rax
58
# pop rsi
5e
@slab_alloc:
# push rbx
53
# mov rax, qword [rdi + 8]
48 8b 47 08
# test rax, rax
48 85 c0
# je .no_free
0f 84 'slab_alloc.no_free
# mov rdx, qword [rax]
48 8b 10
# mov qword [rdi + 8], rdx
48 89 57 08
# pop rbx
5b
# ret
c3
@heap_alloc.mmap:
# pop rdi
5f
# call 'alloc_pages
e8 'alloc_pages
# ret
c3
@heap_alloc.is_init:
# push rdi
57
# call slab_bucket
e8 'slab_bucket
# cmp rax, 9
48 83 f8 09
# jge .mmap
0f 8d 'heap_alloc.mmap
# mov rsi, rax
48 89 c6
# shl rax, 5
48 c1 e0 05
# mov rdi, qword ['heap]
48 8b 3d 'heap
# lea rdi, [rdi + rax]
48 8d 3c 07
# call 'slab_alloc
e8 'slab_alloc
# pop rdi
5f
# ret
c3
@heap_alloc.init:
# push rdi
57
# push rsi
56
# call 'init_heap
e8 'init_heap
# pop rsi
5e
# pop rdi
5f
# jmp 'heap_alloc.is_init
e9 'heap_alloc.is_init
@heap_alloc:
# mov rax, qword ['heap]
48 8b 05 'heap
# cmp rax, 0
48 83 f8 00
# je .init
0f 84 'heap_alloc.init
# jmp 'heap_alloc.is_init
e9 'heap_alloc.is_init
@heap_dealloc.mmap:
# pop rdi
5f
# pop rsi
5e
# call 'dealloc_pages
e8 'dealloc_pages
# pop rbp
5d
# ret
c3
@heap_dealloc:
# push rbp
55
# mov rbp, rsp
48 89 e5
# push rsi
56
# push rdi
57
# mov rdi, rsi
48 89 f7
# mov rsi, rdx
48 89 d6
# call 'slab_bucket
e8 'slab_bucket
# cmp rax, 9
48 83 f8 09
# jge 'heap_dealloc.mmap
0f 8d 'heap_dealloc.mmap
# mov rsi, rax
48 89 c6
# shl rax, 5
48 c1 e0 05
# mov rdi, qword ['heap]
48 8b 3d 'heap
# lea rdi, [rdi + rax]
48 8d 3c 07
# mov rax, qword [rdi + 8]
48 8b 47 08
# pop rsi
5e
# mov qword [rsi], rax
48 89 06
# mov qword [rdi + 8], rsi
48 89 77 08
# pop rsi
5e
# pop rbp
5d
# ret
c3
@heap_realloc:
# push rbp
55
# mov rbp, rsp
48 89 e5
# push rbx
53
# push r12
41 54
# push r13
41 55
# push r14
41 56
# mov rbx, rdi
48 89 fb
# mov r12, rsi
49 89 f4
# mov r13, rdx
49 89 d5
# mov r14, rcx
49 89 ce
# mov rdi, r14
4c 89 f7
# mov rsi, r13
4c 89 ee
# call 'heap_alloc
e8 'heap_alloc
# mov r14, rax
49 89 c6
# mov rdi, rbx
48 89 df
# mov rsi, rax
48 89 c6
# mov rdx, r12
4c 89 e2
# call 'memcpy
e8 'memcpy
# mov rdi, rbx
48 89 df
# mov rsi, r12
4c 89 e6
# mov rdx, r13
4c 89 ea
# call 'heap_dealloc
e8 'heap_dealloc
# mov rax, r14
4c 89 f0
# pop r14
41 5e
# pop r13
41 5d
# pop r12
41 5c
# pop rbx
5b
# pop rbp
5d
# ret
c3