@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