Reworked the user VM map and added sysevent queue
[akaros.git] / kern / src / kmalloc.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 <arch/types.h>
9 #include <ros/error.h>
10 #include <pmap.h>
11 #include <kmalloc.h>
12 #include <stdio.h>
13
14 #define kmallocdebug(args...)  printk(args)
15
16 static page_list_t pages_list;  //List of physical pages used by kmalloc
17 extern size_t naddrpage;
18
19 void kmalloc_init() {
20         LIST_INIT(&pages_list);
21 }
22
23 void* kmalloc(size_t size, int flags) {
24         int npages = ROUNDUP(size, PGSIZE) / PGSIZE;
25         
26         // Find 'npages' free consecutive pages
27         int first = -1;
28         kmallocdebug("naddrpage: %u\n", naddrpage);
29         kmallocdebug("npages: %u\n", npages);
30         for(int i=(naddrpage-1); i>=(npages-1); i--) {
31                 int j;
32                 for(j=i; j>=i-(npages-1); j--) {
33                         if( !page_is_free(j) )
34                                 break;
35                 }
36                 if( j == i-(npages-1)-1 ) {
37                         first = j+1;
38                         break;
39                 }
40         }
41         //If we couldn't find them, return NULL
42         if( first == -1 )
43                 return NULL;
44         
45         //Otherwise go ahead and allocate them to ourselves now
46         for(int i=0; i<npages; i++) {
47                 page_t* page;
48                 page_alloc_specific(&page, first+i);
49                 page->num_cons_links = npages-i;
50                 LIST_INSERT_HEAD(&pages_list, page, pp_link);
51                 kmallocdebug("mallocing page: %u\n", first+i);
52                 kmallocdebug("at addr: %p\n", ppn2kva(first+i));
53         }
54         //And return the address of the first one
55         return ppn2kva(first);
56 }
57 void kfree(void *addr) {
58         kmallocdebug("incoming address: %p\n", addr);
59         page_t* page = kva2page(addr);
60         int num_links = page->num_cons_links;
61         kmallocdebug("getting page: %u\n", page2ppn(page));
62         for(int i=0; i<num_links; i++) {
63                 page_t* p = ppn2page((page2ppn(page) + i));
64                 LIST_REMOVE(p, pp_link);
65                 page_free(p);
66                 kmallocdebug("freeing page: %d\n", page2ppn(p));
67         }
68 }