5eb11614b92154ad489534578b37797499e2804b
[akaros.git] / kern / src / colored_caches.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 #include <ros/common.h>
13 #include <arch/mmu.h>
14 #include <colored_caches.h>
15 #include <stdio.h>
16
17 /************** Cache Related Functions  *****************/
18 inline void init_cache_properties(cache_t *c, size_t sz_k, size_t wa, size_t clsz) {
19         c->wa = wa;
20         c->sz_k = sz_k;
21         c->clsz = clsz;
22         
23         //Added as optimization (derived from above);
24         c->num_colors = get_cache_num_page_colors(c);
25 }
26 inline size_t get_page_color(uintptr_t page, cache_t *c) {
27     return (page % c->num_colors);
28 }
29 inline size_t get_offset_in_cache_line(uintptr_t addr, cache_t *c) {
30     return (addr % get_cache_bytes_per_line(c));
31 }
32
33 void print_cache_properties(char *NT lstring, cache_t *c)
34 {
35         printk("%s_WAYS_ASSOCIATIVE: %ld\n", lstring, get_cache_ways_associative(c));
36         printk("%s_LINE_SIZE_BYTES: %ld\n", lstring, get_cache_line_size_bytes(c));
37         printk("%s_SIZE_BYTES: %ld\n", lstring, get_cache_size_bytes(c));
38         printk("%s_SIZE_KILOBYTES: %ld\n", lstring, get_cache_size_kilobytes(c));
39         printk("%s_SIZE_MEGABYTES: %ld\n", lstring, get_cache_size_megabytes(c));
40         printk("%s_OFFSET_BITS: %ld\n", lstring, get_cache_num_offset_bits(c));
41         printk("%s_INDEX_BITS: %ld\n", lstring, get_cache_num_index_bits(c));
42         printk("%s_TAG_BITS: %ld\n", lstring, get_cache_num_tag_bits(c));
43         printk("%s_PAGE_COLOR_BITS: %ld\n", lstring, get_cache_num_page_color_bits(c));
44         printk("%s_BYTES_PER_LINE: %ld\n", lstring, get_cache_bytes_per_line(c));
45         printk("%s_NUM_LINES: %ld\n", lstring, get_cache_num_lines(c));
46         printk("%s_NUM_SETS: %ld\n", lstring, get_cache_num_sets(c));
47         printk("%s_LINES_PER_SET: %ld\n", lstring, get_cache_lines_per_set(c));
48         printk("%s_LINES_PER_PAGE: %ld\n", lstring, get_cache_lines_per_page(c));
49         printk("%s_BYTES_PER_WAY: %ld\n", lstring, get_cache_bytes_per_way(c));
50         printk("%s_LINES_PER_WAY: %ld\n", lstring, get_cache_lines_per_way(c));
51         printk("%s_PAGES_PER_WAY: %ld\n", lstring, get_cache_pages_per_way(c));
52         printk("%s_NUM_PAGE_COLORS: %ld\n", lstring, get_cache_num_page_colors(c));
53 }
54
55 /****************** Cache Properties *********************/
56 inline size_t get_cache_ways_associative(cache_t *c) {
57         return (c->wa);
58 }
59 inline size_t get_cache_line_size_bytes(cache_t *c) {
60         return (c->clsz);
61 }
62 inline size_t get_cache_size_bytes(cache_t *c) {
63         return (c->sz_k * ONE_KILOBYTE);
64 }
65 inline size_t get_cache_size_kilobytes(cache_t *c) {
66         return (c->sz_k);
67 }
68 inline size_t get_cache_size_megabytes(cache_t *c) {
69         return (c->sz_k / ONE_KILOBYTE);
70 }
71 inline size_t get_cache_num_offset_bits(cache_t *c) {
72         return (LOG2(get_cache_line_size_bytes(c)));
73 }
74 inline size_t get_cache_num_index_bits(cache_t *c) {
75         return (LOG2(get_cache_size_bytes(c) 
76                    / get_cache_ways_associative(c)
77                    / get_cache_line_size_bytes(c)));
78 }
79 inline size_t get_cache_num_tag_bits(cache_t *c) {
80         return (NUM_ADDR_BITS - get_cache_num_offset_bits(c) 
81                           - get_cache_num_index_bits(c));
82 }
83 inline size_t get_cache_num_page_color_bits(cache_t *c) {
84         return (get_cache_num_offset_bits(c) 
85                   + get_cache_num_index_bits(c) 
86                   - PGSHIFT); 
87 }
88 inline size_t get_cache_bytes_per_line(cache_t *c) {
89         return (1 << get_cache_num_offset_bits(c));
90 }
91 inline size_t get_cache_num_lines(cache_t *c) {
92         return (get_cache_size_bytes(c)/get_cache_bytes_per_line(c));  
93 }
94 inline size_t get_cache_num_sets(cache_t *c) {
95         return (get_cache_num_lines(c)/get_cache_ways_associative(c));
96 }
97 inline size_t get_cache_lines_per_set(cache_t *c) {
98         return (get_cache_ways_associative(c));
99 }
100 inline size_t get_cache_lines_per_page(cache_t *c) {
101         return (PGSIZE / get_cache_bytes_per_line(c));
102 }
103 inline size_t get_cache_bytes_per_way(cache_t *c) {
104         return (get_cache_size_bytes(c)/get_cache_ways_associative(c));
105
106 inline size_t get_cache_lines_per_way(cache_t *c) {
107         return (get_cache_num_lines(c)/get_cache_ways_associative(c));
108
109 inline size_t get_cache_pages_per_way(cache_t *c) {
110         return (get_cache_lines_per_way(c)/get_cache_lines_per_page(c));
111 }
112 inline size_t get_cache_num_page_colors(cache_t *c) {
113         return get_cache_pages_per_way(c);
114 }
115