428 lines
5.4 KiB
Plaintext
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 |