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