Subversion Repositories HelenOS-historic

Rev

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

Rev 814 Rev 820
Line 59... Line 59...
59
}frame_t;
59
}frame_t;
60
 
60
 
61
typedef struct {
61
typedef struct {
62
    SPINLOCK_DECLARE(lock); /**< this lock protects everything below */
62
    SPINLOCK_DECLARE(lock); /**< this lock protects everything below */
63
    pfn_t base; /**< frame_no of the first frame in the frames array */
63
    pfn_t base; /**< frame_no of the first frame in the frames array */
64
    pfn_t count;          /**< Size of zone */
64
    count_t count;          /**< Size of zone */
65
 
65
 
66
    frame_t *frames;    /**< array of frame_t structures in this zone */
66
    frame_t *frames;    /**< array of frame_t structures in this zone */
67
    count_t free_count; /**< number of free frame_t structures */
67
    count_t free_count; /**< number of free frame_t structures */
68
    count_t busy_count; /**< number of busy frame_t structures */
68
    count_t busy_count; /**< number of busy frame_t structures */
69
   
69
   
Line 97... Line 97...
97
{
97
{
98
    return index >= 0 && index < zone->count;
98
    return index >= 0 && index < zone->count;
99
}
99
}
100
 
100
 
101
/** Compute pfn_t from frame_t pointer & zone pointer */
101
/** Compute pfn_t from frame_t pointer & zone pointer */
102
static pfn_t make_frame_index(zone_t *zone, frame_t *frame)
102
static index_t make_frame_index(zone_t *zone, frame_t *frame)
103
{
103
{
104
    return frame - zone->frames;
104
    return frame - zone->frames;
105
}
105
}
106
 
106
 
107
/** Initialize frame structure
107
/** Initialize frame structure
Line 421... Line 421...
421
 
421
 
422
/** Free frame from zone
422
/** Free frame from zone
423
 *
423
 *
424
 * Assume zone is locked
424
 * Assume zone is locked
425
 */
425
 */
426
static void zone_frame_free(zone_t *zone, pfn_t frame_idx)
426
static void zone_frame_free(zone_t *zone, index_t frame_idx)
427
{
427
{
428
    frame_t *frame;
428
    frame_t *frame;
429
    __u8 order;
429
    __u8 order;
430
 
430
 
431
    frame = &zone->frames[frame_idx];
431
    frame = &zone->frames[frame_idx];
Line 443... Line 443...
443
    zone->free_count += (1 << order);
443
    zone->free_count += (1 << order);
444
    zone->busy_count -= (1 << order);
444
    zone->busy_count -= (1 << order);
445
}
445
}
446
 
446
 
447
/** Return frame from zone */
447
/** Return frame from zone */
448
static frame_t * zone_get_frame(zone_t *zone, pfn_t frame_idx)
448
static frame_t * zone_get_frame(zone_t *zone, index_t frame_idx)
449
{
449
{
450
    ASSERT(frame_idx < zone->count);
450
    ASSERT(frame_idx < zone->count);
451
    return &zone->frames[frame_idx];
451
    return &zone->frames[frame_idx];
452
}
452
}
453
 
453
 
454
/** Mark frame in zone unavailable to allocation */
454
/** Mark frame in zone unavailable to allocation */
455
static void zone_mark_unavailable(zone_t *zone, pfn_t frame_idx)
455
static void zone_mark_unavailable(zone_t *zone, index_t frame_idx)
456
{
456
{
457
    frame_t *frame;
457
    frame_t *frame;
458
    link_t *link;
458
    link_t *link;
459
 
459
 
460
    frame = zone_get_frame(zone, frame_idx);
460
    frame = zone_get_frame(zone, frame_idx);
Line 473... Line 473...
473
 * @param conffram Address of configuration frame
473
 * @param conffram Address of configuration frame
474
 * @param flags Zone flags.
474
 * @param flags Zone flags.
475
 *
475
 *
476
 * @return Initialized zone.
476
 * @return Initialized zone.
477
 */
477
 */
478
static zone_t * zone_construct(pfn_t start, pfn_t count,
478
static zone_t * zone_construct(pfn_t start, count_t count,
479
                   zone_t *z, int flags)
479
                   zone_t *z, int flags)
480
{
480
{
481
    int i;
481
    int i;
482
    __u8 max_order;
482
    __u8 max_order;
483
 
483
 
Line 514... Line 514...
514
    return z;
514
    return z;
515
}
515
}
516
 
516
 
517
 
517
 
518
/** Compute configuration data size for zone */
518
/** Compute configuration data size for zone */
519
__address zone_conf_size(pfn_t start, pfn_t count)
519
__address zone_conf_size(pfn_t start, count_t count)
520
{
520
{
521
    int size = sizeof(zone_t) + count*sizeof(frame_t);
521
    int size = sizeof(zone_t) + count*sizeof(frame_t);
522
    int max_order;
522
    int max_order;
523
 
523
 
524
    for (max_order = 0; count >> max_order; max_order++)
524
    for (max_order = 0; count >> max_order; max_order++)
Line 528... Line 528...
528
}
528
}
529
 
529
 
530
/** Create and add zone to system
530
/** Create and add zone to system
531
 *
531
 *
532
 * @param confframe Where configuration frame is supposed to be.
532
 * @param confframe Where configuration frame is supposed to be.
533
 *                  Always check, that we will not disturb kernel pages
533
 *                  Always check, that we will not disturb the kernel and possibly init.
534
 *                  the kernel and possibly init.
-
 
535
 *                  If confframe is given _outside_ this zone, it is expected,
534
 *                  If confframe is given _outside_ this zone, it is expected,
536
 *                  that the area is already marked BUSY and big enough
535
 *                  that the area is already marked BUSY and big enough
537
 *                  to contain zone_conf_size() amount of data
536
 *                  to contain zone_conf_size() amount of data
538
 */
537
 */
539
void zone_create(pfn_t start, pfn_t count, pfn_t confframe, int flags)
538
void zone_create(pfn_t start, count_t count, pfn_t confframe, int flags)
540
{
539
{
541
    zone_t *z;
540
    zone_t *z;
542
    __address addr,endaddr;
541
    __address addr,endaddr;
543
    pfn_t confcount;
542
    count_t confcount;
544
    int i;
543
    int i;
545
 
544
 
546
    /* Theoretically we could have here 0, practically make sure
545
    /* Theoretically we could have here 0, practically make sure
547
     * nobody tries to do that. If some platform requires, remove
546
     * nobody tries to do that. If some platform requires, remove
548
     * the assert
547
     * the assert
549
     */
548
     */
550
    ASSERT(confframe);
549
    ASSERT(confframe);
551
    /* If conframe is supposed to be inside our zone, then make sure
550
    /* If conframe is supposed to be inside our zone, then make sure
552
     * it does not span kernel & init
551
     * it does not span kernel & init
553
     */
552
     */
554
    confcount = SIZE2PFN(zone_conf_size(start,count));
553
    confcount = SIZE2FRAMES(zone_conf_size(start,count));
555
    if (confframe >= start && confframe < start+count) {
554
    if (confframe >= start && confframe < start+count) {
556
        for (;confframe < start+count;confframe++) {
555
        for (;confframe < start+count;confframe++) {
557
            addr = PFN2ADDR(confframe);
556
            addr = PFN2ADDR(confframe);
558
            endaddr =  PFN2ADDR (confframe + confcount);
557
            endaddr =  PFN2ADDR (confframe + confcount);
559
            if (overlaps(addr, endaddr, KA2PA(config.base),
558
            if (overlaps(addr, endaddr, KA2PA(config.base),
Line 697... Line 696...
697
}
696
}
698
 
697
 
699
 
698
 
700
 
699
 
701
/** Mark given range unavailable in frame zones */
700
/** Mark given range unavailable in frame zones */
702
void frame_mark_unavailable(pfn_t start, pfn_t count)
701
void frame_mark_unavailable(pfn_t start, count_t count)
703
{
702
{
704
    int i;
703
    int i;
705
    zone_t *zone;
704
    zone_t *zone;
706
    int prefzone = 0;
705
    int prefzone = 0;
707
 
706
 
Line 727... Line 726...
727
    }
726
    }
728
    /* Tell the architecture to create some memory */
727
    /* Tell the architecture to create some memory */
729
    frame_arch_init();
728
    frame_arch_init();
730
    if (config.cpu_active == 1) {
729
    if (config.cpu_active == 1) {
731
        frame_mark_unavailable(ADDR2PFN(KA2PA(config.base)),
730
        frame_mark_unavailable(ADDR2PFN(KA2PA(config.base)),
732
                       SIZE2PFN(config.kernel_size));
731
                       SIZE2FRAMES(config.kernel_size));
733
        if (config.init_size > 0)
732
        if (config.init_size > 0)
734
            frame_mark_unavailable(ADDR2PFN(KA2PA(config.init_addr)),
733
            frame_mark_unavailable(ADDR2PFN(KA2PA(config.init_addr)),
735
                           SIZE2PFN(config.init_size));
734
                           SIZE2FRAMES(config.init_size));
736
    }
735
    }
737
}
736
}
738
 
737
 
739
 
738
 
740
 
739