Added page-coloring support to SPARC port
[akaros.git] / kern / arch / sparc / 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 __DEPUTY__
9 #pragma nodeputy
10 #endif
11
12 #include <sys/queue.h>
13 #include <page_alloc.h>
14 #include <pmap.h>
15 #include <kmalloc.h>
16 #include <multiboot.h>
17
18 page_list_t page_free_list;    // Free list of physical pages
19 DECLARE_CACHE_COLORED_PAGE_FREE_LISTS(); // Free list of pages filed by color
20
21 /*
22  * Initialize the memory free lists.
23  * After this point, ONLY use the functions below
24  * to allocate and deallocate physical memory via the 
25  * page_free_lists. 
26  */
27 void page_alloc_init() 
28 {
29         // Now, initialize the lists required to manage the page free lists
30         LIST_INIT(&page_free_list);
31         INIT_CACHE_COLORED_PAGE_FREE_LISTS();
32         
33         //  Finally, mark the pages already in use by the kernel. 
34         //  1) Mark page 0 as in use.
35         //     This way we preserve the real-mode IDT and BIOS structures
36         //     in case we ever need them.  (Currently we don't, but...)
37         //  2) Mark the rest of base memory as free.
38         //  3) Then comes the IO hole [IOPHYSMEM, EXTPHYSMEM).
39         //     Mark it as in use so that it can never be allocated.      
40         //  4) Then extended memory [EXTPHYSMEM, ...).
41         //     Some of it is in use, some is free.
42         int i;
43         physaddr_t physaddr_after_kernel = PADDR(ROUNDUP(boot_freemem, PGSIZE));
44
45         // mark [0, physaddr_after_kernel) as in-use
46         for(i = 0; i < PPN(physaddr_after_kernel); i++)
47                 pages[i].page_ref = 1;
48
49         // mark [physaddr_after_kernel, maxaddrpa) as free
50         for(i = PPN(physaddr_after_kernel); i < PPN(maxaddrpa); i++)
51         {
52                 pages[i].page_ref = 0;
53                 LIST_INSERT_HEAD(&page_free_list,&pages[i],global_link);
54                 INSERT_CACHE_COLORING_PAGE_ONTO_FREE_LISTS(&pages[i]);
55         }
56
57         // mark [maxaddrpa, ...) as in-use (as they are invalid)
58         for(i = PPN(maxaddrpa); i < npages; i++)
59                 pages[i].page_ref = 1;
60 }