Warning clean up
[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 #ifdef __SHARC__
9 #pragma nosharc
10 #endif
11
12 #ifdef __DEPUTY__
13 #pragma nodeputy
14 #endif
15
16 #include <sys/queue.h>
17 #include <page_alloc.h>
18 #include <pmap.h>
19 #include <kmalloc.h>
20 #include <multiboot.h>
21 #include <colored_caches.h>
22
23 page_list_t* colored_page_free_list = NULL;
24 spinlock_t colored_page_free_list_lock = SPINLOCK_INITIALIZER_IRQSAVE;
25
26 /*
27  * Initialize the memory free lists.
28  * After this point, ONLY use the functions below
29  * to allocate and deallocate physical memory via the 
30  * page_free_lists. 
31  */
32 void page_alloc_init(struct multiboot_info *mbi)
33 {
34         init_once_racy(return);
35
36         size_t list_size = llc_cache->num_colors*sizeof(page_list_t);;
37         page_list_t* lists = (page_list_t*)boot_alloc(list_size, PGSIZE);
38
39         size_t num_colors = llc_cache->num_colors;
40         for (size_t i = 0; i < num_colors; i++)
41                 LIST_INIT(&lists[i]);
42         
43         uintptr_t first_free_page = ROUNDUP(boot_freemem, PGSIZE);
44         uintptr_t first_invalid_page = LA2PPN(boot_freelimit);
45         assert(first_invalid_page == max_nr_pages);
46
47         // mark kernel pages as in-use
48         for (uintptr_t page = 0; page < first_free_page; page++)
49                 page_setref(&pages[page], 1);
50         
51         // append other pages to the free lists
52         for (uintptr_t page = first_free_page; page < first_invalid_page; page++)
53         {
54                 page_setref(&pages[page], 0);
55                 LIST_INSERT_HEAD(&lists[page & (num_colors-1)], &pages[page], pg_link);
56         }
57         nr_free_pages = first_invalid_page - first_free_page;
58
59         colored_page_free_list = lists;
60 }