Subversion Repositories HelenOS-historic

Rev

Rev 552 | Rev 615 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 552 Rev 564
Line 1... Line 1...
1
/*
1
/*
2
 * Copyright (C) 2001-2004 Jakub Jermar
2
 * Copyright (C) 2001-2005 Jakub Jermar
-
 
3
 * Copyright (C) 2005 Sergey Bondari
3
 * All rights reserved.
4
 * All rights reserved.
4
 *
5
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 * are met:
Line 223... Line 224...
223
{
224
{
224
    index_t index;
225
    index_t index;
225
    index = zone_blacklist_count++;
226
    index = zone_blacklist_count++;
226
 
227
 
227
    /* Force base to the nearest lower address frame boundary. */
228
    /* Force base to the nearest lower address frame boundary. */
228
    base &= ~(FRAME_SIZE - 1);
229
    base = ALIGN_DOWN(base, FRAME_SIZE);
229
    /* Align size to frame boundary. */
230
    /* Align size to frame boundary. */
230
    size = ALIGN(size, FRAME_SIZE);
231
    size = ALIGN_UP(size, FRAME_SIZE);
231
 
232
 
232
    ASSERT(zone_blacklist_count <= ZONE_BLACKLIST_SIZE);
233
    ASSERT(index < ZONE_BLACKLIST_SIZE);
233
    zone_blacklist[index].base = base;
234
    zone_blacklist[index].base = base;
234
    zone_blacklist[index].size = size;
235
    zone_blacklist[index].size = size;
235
}
236
}
236
 
237
 
237
 
238
 
Line 282... Line 283...
282
    }
283
    }
283
   
284
   
284
    z = zone_create(base, size, 0);
285
    z = zone_create(base, size, 0);
285
 
286
 
286
    if (!z) {
287
    if (!z) {
287
        panic("Cannot allocate zone (%dB).\n", size);
288
        panic("Cannot allocate zone (base=%P, size=%d).\n", base, size);
288
    }
289
    }
289
   
290
   
290
    zone_attach(z);
291
    zone_attach(z);
291
}
292
}
292
 
293
 
Line 391... Line 392...
391
 * @return Buddy for given block if found
392
 * @return Buddy for given block if found
392
 */
393
 */
393
link_t * zone_buddy_find_buddy(buddy_system_t *b, link_t * block) {
394
link_t * zone_buddy_find_buddy(buddy_system_t *b, link_t * block) {
394
    frame_t * frame;
395
    frame_t * frame;
395
    zone_t * zone;
396
    zone_t * zone;
396
    count_t index;
397
    index_t index;
397
    bool is_left, is_right;
398
    bool is_left, is_right;
398
 
399
 
399
    frame = list_get_instance(block, frame_t, buddy_link);
400
    frame = list_get_instance(block, frame_t, buddy_link);
400
    zone = (zone_t *) b->data;
401
    zone = (zone_t *) b->data;
401
   
402
   
-
 
403
    ASSERT(IS_BUDDY_ORDER_OK(FRAME_INDEX(zone, frame), frame->buddy_order));
-
 
404
   
402
    is_left = IS_BUDDY_LEFT_BLOCK(zone, frame);
405
    is_left = IS_BUDDY_LEFT_BLOCK(zone, frame);
-
 
406
    is_right = IS_BUDDY_RIGHT_BLOCK(zone, frame);
-
 
407
   
403
    is_right = !is_left;
408
    ASSERT(is_left ^ is_right);
404
   
409
   
405
    /*
-
 
406
     * test left buddy
-
 
407
     */
-
 
408
    if (is_left) {
410
    if (is_left) {
409
        index = (FRAME_INDEX(zone, frame)) + (1 << frame->buddy_order);
411
        index = (FRAME_INDEX(zone, frame)) + (1 << frame->buddy_order);
410
    } else if (is_right) {
412
    } else if (is_right) {
411
        index = (FRAME_INDEX(zone, frame)) - (1 << frame->buddy_order);
413
        index = (FRAME_INDEX(zone, frame)) - (1 << frame->buddy_order);
412
    }
414
    }
Line 428... Line 430...
428
 *
430
 *
429
 * @return right block
431
 * @return right block
430
 */
432
 */
431
link_t * zone_buddy_bisect(buddy_system_t *b, link_t * block) {
433
link_t * zone_buddy_bisect(buddy_system_t *b, link_t * block) {
432
    frame_t * frame_l, * frame_r;
434
    frame_t * frame_l, * frame_r;
-
 
435
 
433
    frame_l = list_get_instance(block, frame_t, buddy_link);
436
    frame_l = list_get_instance(block, frame_t, buddy_link);
434
    frame_r = (frame_l + (1 << (frame_l->buddy_order - 1)));
437
    frame_r = (frame_l + (1 << (frame_l->buddy_order - 1)));
-
 
438
   
435
    return &frame_r->buddy_link;
439
    return &frame_r->buddy_link;
436
}
440
}
437
 
441
 
438
/** Buddy system coalesce implementation
442
/** Buddy system coalesce implementation
439
 *
443
 *
Line 443... Line 447...
443
 *
447
 *
444
 * @return Coalesced block (actually block that represents lower address)
448
 * @return Coalesced block (actually block that represents lower address)
445
 */
449
 */
446
link_t * zone_buddy_coalesce(buddy_system_t *b, link_t * block_1, link_t * block_2) {
450
link_t * zone_buddy_coalesce(buddy_system_t *b, link_t * block_1, link_t * block_2) {
447
    frame_t * frame1, * frame2;
451
    frame_t * frame1, * frame2;
-
 
452
   
448
    frame1 = list_get_instance(block_1, frame_t, buddy_link);
453
    frame1 = list_get_instance(block_1, frame_t, buddy_link);
449
    frame2 = list_get_instance(block_2, frame_t, buddy_link);
454
    frame2 = list_get_instance(block_2, frame_t, buddy_link);
-
 
455
   
450
    return frame1 < frame2 ? block_1 : block_2;
456
    return frame1 < frame2 ? block_1 : block_2;
451
}
457
}
452
 
458
 
453
/** Buddy system set_order implementation
459
/** Buddy system set_order implementation
454
 *
460
 *