Subversion Repositories HelenOS-historic

Rev

Rev 68 | Go to most recent revision | Show entire file | Ignore 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;