1 /* Copyright (c) 2009, 2010 The Regents of the University of California.
2 * See the COPYRIGHT files at the top of this source tree for full
5 * Kevin Klues <klueska@cs.berkeley.edu>
6 * Barret Rhoden <brho@cs.berkeley.edu> */
12 #include <sys/queue.h>
15 #include <colored_page_alloc.h>
19 #include <multiboot.h>
21 struct page_map; /* preprocessor games */
23 /****************** Page Structures *********************/
26 typedef struct page page_t;
27 typedef LIST_HEAD(PageList, page) page_list_t;
28 typedef LIST_ENTRY(page) page_list_entry_t;
30 /* Per-page flag bits related to their state in the page cache */
31 #define PG_LOCKED 0x001 /* involved in an IO op */
32 #define PG_UPTODATE 0x002 /* page map, filled with file data */
33 #define PG_DIRTY 0x004 /* page map, data is dirty */
34 #define PG_BUFFER 0x008 /* is a buffer page, has BHs */
35 #define PG_PAGEMAP 0x010 /* belongs to a page map */
36 #define PG_REMOVAL 0x020 /* Working flag for page map removal */
38 /* TODO: this struct is not protected from concurrent operations in some
39 * functions. If you want to lock on it, use the spinlock in the semaphore.
40 * This structure is getting pretty big (and we're wasting RAM). If it becomes
41 * an issue, we can dynamically allocate some of these things when we're a
42 * buffer page (in a page mapping) */
44 LIST_ENTRY(page) pg_link; /* membership in various lists */
47 struct page_map *pg_mapping; /* for debugging... */
48 unsigned long pg_index;
50 void *pg_private; /* type depends on page usage */
51 struct semaphore pg_sem; /* for blocking on IO */
52 uint64_t gpa; /* physical address in guest */
53 /* pg_private is overloaded. */
56 /******** Externally visible global variables ************/
57 extern uint8_t* global_cache_colors_map;
58 extern spinlock_t colored_page_free_list_lock;
59 extern page_list_t LCKD(&colored_page_free_list_lock) * RO CT(llc_num_colors)
60 colored_page_free_list;
62 /*************** Functional Interface *******************/
63 void page_alloc_init(struct multiboot_info *mbi);
64 void colored_page_alloc_init(void);
66 error_t upage_alloc(struct proc* p, page_t *SAFE *page, int zero);
67 error_t kpage_alloc(page_t *SAFE *page);
68 void *kpage_alloc_addr(void);
69 void *kpage_zalloc_addr(void);
70 error_t upage_alloc_specific(struct proc* p, page_t *SAFE *page, size_t ppn);
71 error_t kpage_alloc_specific(page_t *SAFE *page, size_t ppn);
73 void *CT(1 << order) get_cont_pages(size_t order, int flags);
74 void *CT(1 << order) get_cont_pages_node(int node, size_t order, int flags);
75 void free_cont_pages(void *buf, size_t order);
77 void page_incref(page_t *SAFE page);
78 void page_decref(page_t *SAFE page);
79 void page_setref(page_t *SAFE page, size_t val);
81 int page_is_free(size_t ppn);
82 void lock_page(struct page *page);
83 void unlock_page(struct page *page);
84 void print_pageinfo(struct page *page);