blob: 82d761e712071e1aac7edc1e52b7b308100c3e70 [file] [log] [blame]
/*
* Copyright (c) 2009 The Regents of the University of California.
* See the COPYRIGHT files at the top of this source tree for full
* license information.
*/
/**
* @author Kevin Klues <klueska@cs.berkeley.edu>
*/
#ifndef ROS_KERN_COLORED_PAGE_ALLOC_H
#define ROS_KERN_COLORED_PAGE_ALLOC_H
#include <colored_caches.h>
#include <arch/colored_page_alloc.h>
#include <stdio.h>
#define DECLARE_CACHE_COLORED_PAGE_LINK(_cache) \
page_list_entry_t _cache##_cache_colored_pg_link;
#define DECLARE_CACHE_COLORED_PAGE_FREE_LIST(_cache) \
uint8_t _cache##_num_colors = 0; \
page_list_t *COUNT(_cache##_num_colors) _cache##_cache_colored_page_list = NULL;
#define DECLARE_EXTERN_CACHE_COLORED_PAGE_FREE_LIST(_cache) \
extern uint8_t _cache##_num_colors; \
extern page_list_t *COUNT(_cache##_num_colors) _cache##_cache_colored_page_list;
#define DECLARE_CACHE_COLORED_PAGE_ALLOC_FUNCTION(_cache) \
error_t _cache##_page_alloc(page_t** page, size_t color) \
{ \
/* TODO: Put a lock around this */ \
if(available_caches._cache && !LIST_EMPTY(&(_cache##_cache_colored_page_list)[(color)])) { \
*(page) = LIST_FIRST(&(_cache##_cache_colored_page_list)[(color)]); \
LIST_REMOVE(*page, global_link); \
REMOVE_CACHE_COLORING_PAGE_FROM_FREE_LISTS(page); \
page_clear(*page); \
return ESUCCESS; \
} \
return -ENOMEM; \
}
#define INIT_CACHE_COLORED_PAGE_FREE_LIST(_cache) \
{ \
if(available_caches._cache == TRUE) { \
_cache##_num_colors = get_cache_num_page_colors(&(_cache)); \
assert(((_cache##_num_colors) & ((_cache##_num_colors)-1)) == 0); \
size_t list_size = _cache##_num_colors*sizeof(page_list_t); \
_cache##_cache_colored_page_list \
= (page_list_t*) boot_alloc(list_size, PGSIZE); \
for(int i=0; i<_cache##_num_colors; i++) { \
LIST_INIT(&(_cache##_cache_colored_page_list[i])); \
} \
} \
}
#define REMOVE_CACHE_COLORING_PAGE_FROM_FREE_LIST(_page, _cache) \
if(available_caches._cache == TRUE) \
LIST_REMOVE(*(_page), _cache##_cache_colored_pg_link);
#define INSERT_CACHE_COLORING_PAGE_ONTO_FREE_LIST(_page, _cache) \
if(available_caches._cache == TRUE) { \
LIST_INSERT_HEAD( \
&(_cache##_cache_colored_page_list \
[get_page_color(page2ppn((_page)), &(_cache))]), \
(_page), \
_cache##_cache_colored_pg_link \
); \
}
#endif // ROS_KERN_COLORED_PAGE_ALLOC_H