blob: 158ac5e30e30b39855fe9c9be890d14a1e185aa8 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
#ifndef APOS_MEM_H
#define APOS_MEM_H
#include <apos/utils.h>
#include <pages.h>
#if defined(O0_WIDTH)
#define MM_O0_SHIFT (0)
#define MM_O0_WIDTH (1UL << (O0_WIDTH))
#define MM_O0_SIZE (1UL << MM_O0_SHIFT << PAGE_SHIFT)
#else
#define MM_O0_SHIFT 0
#define MM_O0_WIDTH 0
#define MM_O0_SIZE 0
#endif
#if defined(O1_WIDTH)
#define MM_O1_SHIFT (MM_O0_SHIFT + (O0_WIDTH))
#define MM_O1_WIDTH (1UL << (O1_WIDTH))
#define MM_O1_SIZE (1UL << MM_O1_SHIFT << PAGE_SHIFT)
#else
#define MM_O1_SHIFT 0
#define MM_O1_SHIFT 0
#define MM_O1_SIZE 0
#endif
#if defined(O2_WIDTH)
#define MM_O2_SHIFT (MM_O1_SHIFT + (O1_WIDTH))
#define MM_O2_WIDTH (1UL << (O2_WIDTH))
#define MM_O2_SIZE (1UL << MM_O2_SHIFT << PAGE_SHIFT)
#else
#define MM_O2_SHIFT 0
#define MM_O2_WIDTH 0
#define MM_O2_SIZE 0
#endif
#if defined(O3_WIDTH)
#define MM_O3_SHIFT (MM_O2_SHIFT + (O2_WIDTH))
#define MM_O3_WIDTH (1UL << (O3_WIDTH))
#define MM_O3_SIZE (1UL << MM_O3_SHIFT << PAGE_SHIFT)
#else
#define MM_O3_SHIFT 0
#define MM_O3_WIDTH 0
#define MM_O3_SIZE 0
#endif
#if defined(O4_WIDTH)
#define MM_O4_SHIFT (MM_O3_SHIFT + (O3_WIDTH))
#define MM_O4_SHIFT (1UL << (O4_WIDTH))
#define MM_O4_SIZE (1UL << MM_O4_SHIFT << PAGE_SHIFT)
#else
#define MM_O4_SHIFT 0
#define MM_O4_WIDTH 0
#define MM_O4_SIZE 0
#endif
#if defined(O5_WIDTH)
#define MM_O5_SHIFT (MM_O4_SHIFT + (O4_WIDTH))
#define MM_O5_WIDTH (1UL << (O5_WIDTH))
#define MM_O5_SIZE (1UL << MM_O5_SHIFT << PAGE_SHIFT)
#else
#define MM_O5_SHIFT 0
#define MM_O5_WIDTH 0
#define MM_O5_SIZE 0
#endif
#if defined(O6_WIDTH)
#define MM_O6_SHIFT (MM_O5_SHIFT + (O5_WIDTH))
#define MM_O6_WIDTH (1UL << (O6_WIDTH))
#define MM_O6_SIZE (1UL << MM_O6_SHIFT << PAGE_SHIFT)
#else
#define MM_O6_SHIFT 0
#define MM_O6_WIDTH 0
#define MM_O6_SIZE 0
#endif
#if defined(O7_WIDTH)
#define MM_O7_SHIFT (MM_O6_SHIFT + (O6_WIDTH))
#define MM_O7_WIDTH (1UL << (O7_WIDTH))
#define MM_O7_SIZE (1UL << MM_O7_SHIFT << PAGE_SHIFT)
#else
#define MM_O7_SHIFT 0
#define MM_O7_WIDTH 0
#define MM_O7_SIZE 0
#endif
#if defined(O8_WIDTH)
#define MM_O8_SHIFT (MM_O7_SHIFT + (O7_WIDTH))
#define MM_O8_WIDTH (1UL << (O8_WIDTH))
#define MM_O8_SIZE (1UL << MM_O8_SHIFT << PAGE_SHIFT)
#else
#define MM_O8_SHIFT 0
#define MM_O8_WIDTH 0
#define MM_O8_SIZE 0
#endif
#if defined(O9_WIDTH)
#define MM_O9_SHIFT (MM_O8_SHIFT + (O8_WIDTH))
#define MM_O9_WIDTH (1UL << (O9_WIDTH))
#define MM_O9_SIZE (1UL << MM_O9_SHIFT << PAGE_SHIFT)
#else
#define MM_O9_SHIFT 0
#define MM_O9_WIDTH 0
#define MM_O9_SIZE 0
#endif
#define MM_OINFO_WIDTH (sizeof(mm_info_t) * 8)
#define pnum_to_index(pnum, order) (((pnum) >> __o_offset(order)) & (__o_width(order) - 1))
#define paddr_to_index(paddr, order) (pnum_to_index(paddr_to_pnum(paddr), (order)))
#define paddr_to_pnum(paddr) ((paddr) >> PAGE_SHIFT)
#define pnum_to_paddr(pnum) ((pnum) << PAGE_SHIFT)
#define move_forward(var, num) (((var) += (num)) - (num))
#define move_paddr(paddr, base, offset) ((((paddr_t)(paddr)) - (base)) + (offset))
#define num_elems(num) (((num) + MM_OINFO_WIDTH - 1) / MM_OINFO_WIDTH)
#define num_indexes(num) ((num) / MM_OINFO_WIDTH)
#define index_elems(num) ((num) / MM_OINFO_WIDTH)
#define state_elems(num) (sizeof(mm_info_t) * (num_elems(num)))
#define next_elems(num) (sizeof(void *) * (num))
#define max_index(order) (__o_width(order) - 1)
#define __o_offset(order) (mm_shifts[order])
#define __o_width(order) (mm_widths[order])
#define __o_elems(order) (mm_widths[order] / MM_OINFO_WIDTH)
#define __o_container(idx) ((idx) / MM_OINFO_WIDTH)
#define __o_bit(idx) ((idx) & (MM_OINFO_WIDTH - 1))
#endif /* APOS_MEM_H */
|