VMM: Clean up per-cpu VMCS state
[akaros.git] / kern / arch / riscv / page_alloc.c
1 /* Copyright (c) 2009 The Regents of the University  of California. 
2  * See the COPYRIGHT files at the top of this source tree for full 
3  * license information.
4  * 
5  * Kevin Klues <klueska@cs.berkeley.edu>    
6  */
7  
8 #include <sys/queue.h>
9 #include <page_alloc.h>
10 #include <pmap.h>
11 #include <kmalloc.h>
12 #include <multiboot.h>
13 #include <colored_caches.h>
14
15 page_list_t* colored_page_free_list = NULL;
16 spinlock_t colored_page_free_list_lock = SPINLOCK_INITIALIZER_IRQSAVE;
17
18 /*
19  * Initialize the memory free lists.
20  * After this point, ONLY use the functions below
21  * to allocate and deallocate physical memory via the 
22  * page_free_lists. 
23  */
24 void page_alloc_init(struct multiboot_info *mbi)
25 {
26         init_once_racy(return);
27
28         size_t list_size = llc_cache->num_colors*sizeof(page_list_t);;
29         page_list_t* lists = (page_list_t*)boot_alloc(list_size, PGSIZE);
30
31         size_t num_colors = llc_cache->num_colors;
32         for (size_t i = 0; i < num_colors; i++)
33                 BSD_LIST_INIT(&lists[i]);
34         
35         uintptr_t first_free_page = ROUNDUP(boot_freemem, PGSIZE);
36         uintptr_t first_invalid_page = LA2PPN(boot_freelimit);
37         assert(first_invalid_page == max_nr_pages);
38
39         // mark kernel pages as in-use
40         for (uintptr_t page = 0; page < first_free_page; page++)
41                 page_setref(&pages[page], 1);
42         
43         // append other pages to the free lists
44         for (uintptr_t page = first_free_page; page < first_invalid_page; page++)
45         {
46                 page_setref(&pages[page], 0);
47                 BSD_LIST_INSERT_HEAD(&lists[page & (num_colors-1)], &pages[page],
48                                      pg_link);
49         }
50         nr_free_pages = first_invalid_page - first_free_page;
51
52         colored_page_free_list = lists;
53 }