1 global page_map, page_region
2 extern print_hex, print_chr, newline, print_dec, print_str
13 pagebuf: dq pagebuf_init
19 ; allocate new page table buffer
21 ; rsi = buffer (result)
25 ; rax = tmp; used_next
27 mov r8, [pagebuf] ; *pagebuf
28 mov rsi, [r8] ; start = pagebuf->start
30 mov rbx, [r8+8] ; size = pagebuf->size
31 add rbx, rsi ; upper_have = start + size
33 ; round *up* to 0x1000 align
37 and rsi, rax ; aligned_start = (start + 0xfff) & (~0xfff)
39 mov rax, [r8+16] ; used = pagebuf->used
41 add rsi, rax ; upper_need = aligned_start + used + 0x1000
43 cmp rsi, rbx ; if upper_need > upper_have
44 ja .newbuf ; current region is full, get new
46 cmp rsi, r10 ; if upper_need >= next_page
47 jae .oom ; out of memory (target buffer isn't paged yet)
49 mov [r8+16], rax ; pagebuf->used = used + 0x1000
64 ; select next page buffer
77 je .oom ; last region reached
82 je .nextbuf ; region is reserved
85 jne .oom ; region has not been paged yet
103 .oom_msg: db "out of memory for page table", 10, "next_page = ", 0
105 ; get/create page tables
109 ; rdi = address (arg, persist)
112 ; rcx = bits (persist)
113 ; rdx = level (persist)
115 ; rsi = next offset (persist)
126 mov rbx, -1 ; reset remainder mask
127 shl rbx, cl ; update remainder mask
128 not rbx ; negate remainder mask
129 and r8, rbx ; apply remainder mask
137 shl r8, 3 ; multiply by 8
139 mov rbx, 0xfff ; 0x1000 alignment
140 not rbx ; offset mask
142 and rsi, rbx ; apply offset mask
143 add r8, rsi ; add offset
149 mov rsi, [r8] ; next offset
173 mov rdi, [r9] ; ptr = mmap_entry->ptr
193 ; for usable region (type = 1), set mmap_entry->used = 0
194 ; for reserved region (type = 2), set mmap_entry->used = -1
197 mov eax, dword[r9+16]
205 mov r15, rdi ; r15 = end of region
210 and rdi, rax ; round down to 0x1000 aligned
218 call get_tables ; page tables into r11-r14
220 ; start filling L1 map
234 cmp rdi, r15 ; if next >= end
237 ; prepare rcx mask for later
269 ; machine has more than 256TB of RAM, tell user to fuck off
313 .bruh_msg: db "bruh why do you have more than 256TB of RAM (you fucking glow)", 10, 0
315 ; identity map available memory
317 mov r9, 0x0500 ; mmap_entry