Rev 68 | Rev 113 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 68 | Rev 102 | ||
---|---|---|---|
Line 40... | Line 40... | ||
40 | 40 | ||
41 | #include <panic.h> |
41 | #include <panic.h> |
42 | 42 | ||
43 | #include <synch/spinlock.h> |
43 | #include <synch/spinlock.h> |
44 | 44 | ||
45 | __u32 frames; |
45 | count_t frames = 0; |
46 | __u32 frames_free; |
46 | count_t frames_free; |
47 | 47 | ||
48 | __u8 *frame_bitmap; |
48 | __u8 *frame_bitmap; |
49 | __u32 frame_bitmap_octets; |
49 | count_t frame_bitmap_octets; |
50 | 50 | ||
51 | /* |
51 | /* |
52 | * This is for kernel address space frames (allocated with FRAME_KA). |
52 | * This is for kernel address space frames (allocated with FRAME_KA). |
53 | * Their addresses may not interfere with user address space. |
53 | * Their addresses may not interfere with user address space. |
54 | */ |
54 | */ |
55 | __u8 *frame_kernel_bitmap; |
55 | __u8 *frame_kernel_bitmap; |
56 | __u32 kernel_frames; |
56 | count_t kernel_frames; |
57 | __u32 kernel_frames_free; |
57 | count_t kernel_frames_free; |
58 | 58 | ||
59 | static spinlock_t framelock; |
59 | static spinlock_t framelock; |
60 | 60 | ||
61 | void frame_init(void) |
61 | void frame_init(void) |
62 | { |
62 | { |
Line 66... | Line 66... | ||
66 | * The bootstrap processor will allocate all necessary memory for frame allocation. |
66 | * The bootstrap processor will allocate all necessary memory for frame allocation. |
67 | */ |
67 | */ |
68 | 68 | ||
69 | frames = config.memory_size / FRAME_SIZE; |
69 | frames = config.memory_size / FRAME_SIZE; |
70 | frame_bitmap_octets = frames / 8 + (frames % 8 > 0); |
70 | frame_bitmap_octets = frames / 8 + (frames % 8 > 0); |
71 | - | ||
72 | frame_bitmap = (__u8 *) malloc(frame_bitmap_octets); |
71 | frame_bitmap = (__u8 *) malloc(frame_bitmap_octets); |
73 | if (!frame_bitmap) |
72 | if (!frame_bitmap) |
74 | panic("malloc/frame_bitmap\n"); |
73 | panic("malloc/frame_bitmap\n"); |
75 | 74 | ||
76 | /* |
75 | /* |
Line 108... | Line 107... | ||
108 | __address frame_alloc(int flags) |
107 | __address frame_alloc(int flags) |
109 | { |
108 | { |
110 | int i; |
109 | int i; |
111 | pri_t pri; |
110 | pri_t pri; |
112 | __u8 **frame_bitmap_ptr = &frame_bitmap; |
111 | __u8 **frame_bitmap_ptr = &frame_bitmap; |
113 | __u32 *frames_ptr = &frames, *frames_free_ptr = &frames_free; |
112 | count_t *frames_ptr = &frames, *frames_free_ptr = &frames_free; |
114 | 113 | ||
115 | if (flags & FRAME_KA) { |
114 | if (flags & FRAME_KA) { |
116 | frame_bitmap_ptr = &frame_kernel_bitmap; |
115 | frame_bitmap_ptr = &frame_kernel_bitmap; |
117 | frames_ptr = &kernel_frames; |
116 | frames_ptr = &kernel_frames; |
118 | frames_free_ptr = &kernel_frames_free; |
117 | frames_free_ptr = &kernel_frames_free; |
Line 163... | Line 162... | ||
163 | */ |
162 | */ |
164 | void frame_free(__address addr) |
163 | void frame_free(__address addr) |
165 | { |
164 | { |
166 | pri_t pri; |
165 | pri_t pri; |
167 | __u32 frame; |
166 | __u32 frame; |
168 | __u32 *frames_free_ptr = &frames_free, *frames_ptr = &frames; |
167 | count_t *frames_free_ptr = &frames_free, *frames_ptr = &frames; |
169 | __u8 **frame_bitmap_ptr = &frame_bitmap; |
168 | __u8 **frame_bitmap_ptr = &frame_bitmap; |
170 | 169 | ||
171 | if (IS_KA(addr)) { |
170 | if (IS_KA(addr)) { |
172 | frames_free_ptr = &kernel_frames_free; |
171 | frames_free_ptr = &kernel_frames_free; |
173 | frame_bitmap_ptr = &frame_kernel_bitmap; |
172 | frame_bitmap_ptr = &frame_kernel_bitmap; |
Line 193... | Line 192... | ||
193 | * It is still necessary to increment frames_free. |
192 | * It is still necessary to increment frames_free. |
194 | */ |
193 | */ |
195 | frames_free++; |
194 | frames_free++; |
196 | } |
195 | } |
197 | } |
196 | } |
198 | else panic("frame_free: frame already free\n"); |
197 | else panic("frame already free\n"); |
199 | } |
198 | } |
200 | else panic("frame_free: frame number too big\n"); |
199 | else panic("frame number too big\n"); |
201 | 200 | ||
202 | spinlock_unlock(&framelock); |
201 | spinlock_unlock(&framelock); |
203 | cpu_priority_restore(pri); |
202 | cpu_priority_restore(pri); |
204 | } |
203 | } |
205 | 204 | ||
Line 209... | Line 208... | ||
209 | */ |
208 | */ |
210 | void frame_not_free(__address addr) |
209 | void frame_not_free(__address addr) |
211 | { |
210 | { |
212 | pri_t pri; |
211 | pri_t pri; |
213 | __u32 frame; |
212 | __u32 frame; |
214 | __u32 *frames_ptr = &frames, *frames_free_ptr = &frames_free; |
213 | count_t *frames_ptr = &frames, *frames_free_ptr = &frames_free; |
215 | __u8 **frame_bitmap_ptr = &frame_bitmap; |
214 | __u8 **frame_bitmap_ptr = &frame_bitmap; |
216 | 215 | ||
217 | pri = cpu_priority_high(); |
216 | pri = cpu_priority_high(); |
218 | spinlock_lock(&framelock); |
217 | spinlock_lock(&framelock); |
219 | frame = IS_KA(addr) ? KA2PA(addr) : addr; |
218 | frame = IS_KA(addr) ? KA2PA(addr) : addr; |