Changeset 71eef11 in mainline


Ignore:
Timestamp:
2008-02-06T14:24:13Z (16 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7208b6c
Parents:
1b067315
Message:

remove config.memory_size, get_memory_size() and memory_init.{c|d}
the amount of available memory can be calculated from the sizes of the zones
add FRAMES2SIZE, SIZE2KB and SIZE2MB functions/macros (code readability)

Location:
kernel
Files:
14 deleted
26 edited
2 moved

Legend:

Unmodified
Added
Removed
  • kernel/arch/amd64/Makefile.inc

    r1b067315 r71eef11  
    8888        arch/$(ARCH)/src/fpu_context.c \
    8989        arch/$(ARCH)/src/boot/boot.S \
     90        arch/$(ARCH)/src/boot/memmap.c \
    9091        arch/$(ARCH)/src/pm.c \
    9192        arch/$(ARCH)/src/context.S \
     
    104105        arch/$(ARCH)/src/mm/tlb.c \
    105106        arch/$(ARCH)/src/asm_utils.S \
    106         arch/$(ARCH)/src/mm/memory_init.c \
    107107        arch/$(ARCH)/src/cpu/cpu.c \
    108108        arch/$(ARCH)/src/proc/scheduler.c \
  • kernel/arch/amd64/src/amd64.c

    r1b067315 r71eef11  
    5151
    5252#include <arch/bios/bios.h>
    53 #include <arch/mm/memory_init.h>
    5453#include <arch/cpu.h>
    5554#include <print.h>
  • kernel/arch/amd64/src/boot/boot.S

    r1b067315 r71eef11  
    183183               
    184184                xorl %ecx, %ecx                                 # no memory size or map available
    185                 movl %ecx, e801memorysize
    186185                movl %ecx, e820counter
    187186               
     
    191190               
    192191                movl (%ebx), %eax                               # ebx = physical address of struct multiboot_info
    193                
    194                 bt $0, %eax                                     # mbi->flags[0] (mem_lower, mem_upper valid)
    195                 jc mem_valid
    196                        
    197                         xorl %ecx, %ecx
    198                         jmp mem_invalid
    199                        
    200                 mem_valid:
    201                 movl 4(%ebx), %ecx                              # mbi->mem_lower
    202                 addl 8(%ebx), %ecx                              # mbi->mem_upper
    203                
    204                 mem_invalid:
    205                 movl %ecx, e801memorysize
    206192               
    207193                bt $3, %eax                                     # mbi->flags[3] (mods_count, mods_addr valid)
  • kernel/arch/amd64/src/boot/memmap.c

    r1b067315 r71eef11  
    2727 */
    2828
    29 /** @addtogroup ia32mm 
     29/** @addtogroup amd64mm
    3030 * @{
    3131 */
    3232/** @file
    33  * @ingroup ia32mm, am64mm
    3433 */
    3534
    36 #ifndef KERN_ia32_MEMORY_INIT_H_
    37 #define KERN_ia32_MEMORY_INIT_H_
     35#include <arch/boot/memmap.h>
    3836
    39 size_t get_memory_size(void);
    40 
    41 #endif
     37uint8_t e820counter = 0xff;
     38e820memmap_t e820table[MEMMAP_E820_MAX_RECORDS];
    4239
    4340/** @}
  • kernel/arch/arm32/Makefile.inc

    r1b067315 r71eef11  
    8989        arch/$(ARCH)/src/mm/page.c \
    9090        arch/$(ARCH)/src/mm/tlb.c \
    91         arch/$(ARCH)/src/mm/memory_init.c \
    9291        arch/$(ARCH)/src/mm/page_fault.c
    9392
  • kernel/arch/arm32/src/mm/frame.c

    r1b067315 r71eef11  
    3636#include <mm/frame.h>
    3737#include <arch/mm/frame.h>
     38#include <arch/machine.h>
    3839#include <config.h>
    3940#include <arch/debug/print.h>
     
    4647{
    4748        /* all memory as one zone */
    48         zone_create(0, ADDR2PFN(config.memory_size),
     49        zone_create(0, ADDR2PFN(machine_get_memory_size()),
    4950            BOOT_PAGE_TABLE_START_FRAME + BOOT_PAGE_TABLE_SIZE_IN_FRAMES, 0);
    50         last_frame = config.memory_size;
     51        last_frame = machine_get_memory_size();
    5152
    5253        /* blacklist boot page table */
  • kernel/arch/ia32/Makefile.inc

    r1b067315 r71eef11  
    142142        arch/$(ARCH)/src/mm/as.c \
    143143        arch/$(ARCH)/src/mm/frame.c \
    144         arch/$(ARCH)/src/mm/memory_init.c \
    145144        arch/$(ARCH)/src/mm/page.c \
    146145        arch/$(ARCH)/src/mm/tlb.c \
     
    151150        arch/$(ARCH)/src/drivers/vesa.c \
    152151        arch/$(ARCH)/src/boot/boot.S \
     152        arch/$(ARCH)/src/boot/memmap.c \
    153153        arch/$(ARCH)/src/fpu_context.c \
    154154        arch/$(ARCH)/src/debugger.c
  • kernel/arch/ia32/include/boot/memmap.h

    r1b067315 r71eef11  
    6666extern e820memmap_t e820table[MEMMAP_E820_MAX_RECORDS];
    6767extern uint8_t e820counter;
    68 extern uint32_t e801memorysize;         /**< Size of available memory in KB. */
    6968
    7069#endif
  • kernel/arch/ia32/src/boot/boot.S

    r1b067315 r71eef11  
    110110        je valid_boot
    111111               
    112                 xorl %ecx, %ecx                                                 # no memory size or map available
    113                 movl %ecx, e801memorysize
     112                xorl %ecx, %ecx                                                 # no memory map available
    114113                movl %ecx, e820counter
    115114               
     
    119118               
    120119                movl (%ebx), %eax                                               # ebx = physical address of struct multiboot_info
    121                
    122                 bt $0, %eax                                                             # mbi->flags[0] (mem_lower, mem_upper valid)
    123                 jc mem_valid
    124                        
    125                         xorl %ecx, %ecx
    126                         jmp mem_invalid
    127                        
    128                 mem_valid:
    129                 movl 4(%ebx), %ecx                                              # mbi->mem_lower
    130                 addl 8(%ebx), %ecx                                              # mbi->mem_upper
    131                
    132                 mem_invalid:
    133                 movl %ecx, e801memorysize
    134120               
    135121                bt $3, %eax                                                             # mbi->flags[3] (mods_count, mods_addr valid)
  • kernel/arch/ia32/src/boot/memmap.c

    r1b067315 r71eef11  
    11/*
    2  * Copyright (c) 2005 Martin Decky
     2 * Copyright (c) 2005 Josef Cejka
    33 * All rights reserved.
    44 *
     
    2727 */
    2828
    29 /** @addtogroup ppc64mm
     29/** @addtogroup ia32mm
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #ifndef KERN_ppc64_MEMORY_INIT_H_
    36 #define KERN_ppc64_MEMORY_INIT_H_
     35#include <arch/boot/memmap.h>
    3736
    38 size_t get_memory_size(void);
    39 
    40 #endif
     37uint8_t e820counter = 0xff;
     38e820memmap_t e820table[MEMMAP_E820_MAX_RECORDS];
    4139
    4240/** @}
  • kernel/arch/ia32/src/ia32.c

    r1b067315 r71eef11  
    5555#include <arch/bios/bios.h>
    5656
    57 #include <arch/mm/memory_init.h>
    5857#include <interrupt.h>
    5958#include <ddi/irq.h>
  • kernel/arch/ia32xen/Makefile.inc

    r1b067315 r71eef11  
    132132        arch/$(ARCH)/src/mm/as.c \
    133133        arch/$(ARCH)/src/mm/frame.c \
    134         arch/$(ARCH)/src/mm/memory_init.c \
    135134        arch/$(ARCH)/src/mm/page.c \
    136135        arch/$(ARCH)/src/mm/tlb.c \
  • kernel/arch/ia32xen/src/ia32xen.c

    r1b067315 r71eef11  
    5454#include <arch/bios/bios.h>
    5555
    56 #include <arch/mm/memory_init.h>
    5756#include <interrupt.h>
    5857#include <arch/debugger.h>
  • kernel/arch/ia64/src/mm/frame.c

    r1b067315 r71eef11  
    4242 * for real ia64 systems that provide memory map.
    4343 */
     44#define MEMORY_SIZE     (512 * 1024 * 1024)
    4445#define ROM_BASE        0xa0000
    45 #define ROM_SIZE        (384*1024)
     46#define ROM_SIZE        (384 * 1024)
    4647
    4748void frame_arch_init(void)
    4849{
    49         zone_create(0, config.memory_size >> FRAME_WIDTH, 1, 0);
     50        zone_create(0, SIZE2FRAMES(MEMORY_SIZE), 1, 0);
    5051       
    5152        /*
    5253         * Blacklist ROM regions.
    5354         */
    54         frame_mark_unavailable(ADDR2PFN(ROM_BASE), ROM_SIZE >> FRAME_WIDTH);
     55        frame_mark_unavailable(ADDR2PFN(ROM_BASE), SIZE2FRAMES(ROM_SIZE));
    5556}
    5657
  • kernel/arch/mips32/src/drivers/arc.c

    r1b067315 r71eef11  
    221221                }       
    222222        } else
    223                 printf("%#10x %#10x free\n", 0, config.memory_size);
     223                printf("%#10x %#10x free\n", 0, CONFIG_MEMORY_SIZE);
    224224}
    225225
     
    363363        if (arc_enabled()) {
    364364                arc_memdescriptor_t *desc;
    365                 int total = 0;
    366365                uintptr_t base;
    367366                size_t basesize;
     
    380379                                basesize = ALIGN_DOWN(basesize, FRAME_SIZE);
    381380       
    382                                 total += basesize;
    383                                
    384381                                zone_create(ADDR2PFN(base), SIZE2FRAMES(basesize),
    385382                                            ADDR2PFN(base), 0);
     
    388385                }
    389386       
    390                 config.memory_size = total;
    391387                return true;
    392388        }
  • kernel/arch/mips32/src/mm/frame.c

    r1b067315 r71eef11  
    4747{
    4848        if (!arc_frame_init()) {
    49                 zone_create(0, ADDR2PFN(config.memory_size), 1, 0);
     49                zone_create(0, ADDR2PFN(CONFIG_MEMORY_SIZE), 1, 0);
    5050                /*
    5151                 * Blacklist interrupt vector
  • kernel/arch/ppc32/Makefile.inc

    r1b067315 r71eef11  
    8080        arch/$(ARCH)/src/mm/as.c \
    8181        arch/$(ARCH)/src/mm/frame.c \
    82         arch/$(ARCH)/src/mm/memory_init.c \
    8382        arch/$(ARCH)/src/mm/page.c \
    8483        arch/$(ARCH)/src/mm/tlb.c \
  • kernel/arch/ppc32/src/mm/frame.c

    r1b067315 r71eef11  
    3535#include <arch/boot/boot.h>
    3636#include <arch/mm/frame.h>
    37 #include <arch/mm/memory_init.h>
    3837#include <mm/frame.h>
    3938#include <align.h>
  • kernel/arch/ppc32/src/ppc32.c

    r1b067315 r71eef11  
    3737#include <arch/boot/boot.h>
    3838#include <arch/drivers/cuda.h>
    39 #include <arch/mm/memory_init.h>
    4039#include <arch/interrupt.h>
    4140#include <genarch/fb/fb.h>
  • kernel/arch/ppc64/Makefile.inc

    r1b067315 r71eef11  
    6868        arch/$(ARCH)/src/mm/as.c \
    6969        arch/$(ARCH)/src/mm/frame.c \
    70         arch/$(ARCH)/src/mm/memory_init.c \
    7170        arch/$(ARCH)/src/mm/page.c \
    7271        arch/$(ARCH)/src/mm/tlb.c \
  • kernel/arch/ppc64/src/mm/frame.c

    r1b067315 r71eef11  
    3535#include <arch/boot/boot.h>
    3636#include <arch/mm/frame.h>
    37 #include <arch/mm/memory_init.h>
    3837#include <mm/frame.h>
    3938#include <align.h>
  • kernel/arch/ppc64/src/ppc64.c

    r1b067315 r71eef11  
    3535#include <arch.h>
    3636#include <arch/boot/boot.h>
    37 #include <arch/mm/memory_init.h>
    3837#include <arch/interrupt.h>
    3938#include <genarch/fb/fb.h>
  • kernel/arch/sparc64/Makefile.inc

    r1b067315 r71eef11  
    9090        arch/$(ARCH)/src/mm/page.c \
    9191        arch/$(ARCH)/src/mm/tlb.c \
    92         arch/$(ARCH)/src/mm/memory_init.c \
    9392        arch/$(ARCH)/src/sparc64.c \
    9493        arch/$(ARCH)/src/start.S \
  • kernel/generic/include/config.h

    r1b067315 r71eef11  
    7070
    7171        uintptr_t base;
    72         size_t memory_size;             /**< Size of detected memory in bytes. */
    7372        size_t kernel_size;             /**< Size of memory in bytes taken by kernel and stack */
    7473       
  • kernel/generic/include/macros.h

    r1b067315 r71eef11  
    6767#define PA_overlaps(x, szx, y, szy)     overlaps(KA2PA(x), szx, KA2PA(y), szy)
    6868
     69#define SIZE2KB(size) (size >> 10)
     70#define SIZE2MB(size) (size >> 20)
     71
    6972#define STRING(arg) STRING_ARG(arg)
    7073#define STRING_ARG(arg) #arg
  • kernel/generic/include/mm/frame.h

    r1b067315 r71eef11  
    8585}
    8686
     87static inline size_t FRAMES2SIZE(count_t frames)
     88{
     89        return (size_t) (frames << FRAME_WIDTH);
     90}
     91
    8792#define IS_BUDDY_ORDER_OK(index, order)         \
    8893        ((~(((unative_t) -1) << (order)) & (index)) == 0)
     
    105110
    106111extern int zone_create(pfn_t start, count_t count, pfn_t confframe, int flags);
    107 void *frame_get_parent(pfn_t frame, unsigned int hint);
    108 void frame_set_parent(pfn_t frame, void *data, unsigned int hint);
    109 void frame_mark_unavailable(pfn_t start, count_t count);
    110 uintptr_t zone_conf_size(count_t count);
    111 void zone_merge(unsigned int z1, unsigned int z2);
    112 void zone_merge_all(void);
     112extern void *frame_get_parent(pfn_t frame, unsigned int hint);
     113extern void frame_set_parent(pfn_t frame, void *data, unsigned int hint);
     114extern void frame_mark_unavailable(pfn_t start, count_t count);
     115extern uintptr_t zone_conf_size(count_t count);
     116extern void zone_merge(unsigned int z1, unsigned int z2);
     117extern void zone_merge_all(void);
     118extern uint64_t zone_total_size(void);
    113119
    114120/*
     
    116122 */
    117123extern void zone_print_list(void);
    118 void zone_print_one(unsigned int znum);
     124extern void zone_print_one(unsigned int znum);
    119125
    120126#endif
  • kernel/generic/src/main/main.c

    r1b067315 r71eef11  
    6464#include <align.h>
    6565#include <interrupt.h>
    66 #include <arch/mm/memory_init.h>
    6766#include <mm/frame.h>
    6867#include <mm/page.h>
     
    144143       
    145144        config.base = hardcoded_load_address;
    146         config.memory_size = get_memory_size();
    147        
    148145        config.kernel_size = ALIGN_UP(hardcoded_ktext_size +
    149146            hardcoded_kdata_size, PAGE_SIZE);
     
    220217        ddi_init();
    221218        arch_post_mm_init();
    222 
     219       
    223220        version_print();
    224         printf("kernel: %.*p hardcoded_ktext_size=%zdK, "
    225             "hardcoded_kdata_size=%zdK\n", sizeof(uintptr_t) * 2,
    226             config.base, hardcoded_ktext_size >> 10,
    227             hardcoded_kdata_size >> 10);
    228         printf("stack:  %.*p size=%zdK\n", sizeof(uintptr_t) * 2,
    229             config.stack_base, config.stack_size >> 10);
    230 
     221        printf("kernel: %.*p hardcoded_ktext_size=%zd KB, "
     222            "hardcoded_kdata_size=%zd KB\n", sizeof(uintptr_t) * 2,
     223                config.base, SIZE2KB(hardcoded_ktext_size),
     224                SIZE2KB(hardcoded_kdata_size));
     225        printf("stack:  %.*p size=%zd KB\n", sizeof(uintptr_t) * 2,
     226            config.stack_base, SIZE2KB(config.stack_size));
     227       
    231228        arch_pre_smp_init();
    232229        smp_init();
    233230        /* Slab must be initialized after we know the number of processors. */
    234231        slab_enable_cpucache();
    235 
    236         printf("config.memory_size=%zdM\n", config.memory_size >> 20);
    237         printf("config.cpu_count=%zd\n", config.cpu_count);
     232       
     233        printf("Detected %zu CPU(s), %llu MB free memory\n",
     234                config.cpu_count, SIZE2MB(zone_total_size()));
    238235        cpu_init();
    239236       
  • kernel/generic/src/mm/frame.c

    r1b067315 r71eef11  
    105105
    106106
    107 /*********************************/
     107/********************/
    108108/* Helper functions */
     109/********************/
     110
    109111static inline index_t frame_index(zone_t *zone, frame_t *frame)
    110112{
    111         return (index_t)(frame - zone->frames);
    112 }
     113        return (index_t) (frame - zone->frames);
     114}
     115
    113116static inline index_t frame_index_abs(zone_t *zone, frame_t *frame)
    114117{
    115         return (index_t)(frame - zone->frames) + zone->base;
    116 }
     118        return (index_t) (frame - zone->frames) + zone->base;
     119}
     120
    117121static inline int frame_index_valid(zone_t *zone, index_t index)
    118122{
    119         return index >= 0 && index < zone->count;
     123        return (index >= 0) && (index < zone->count);
    120124}
    121125
     
    123127static index_t make_frame_index(zone_t *zone, frame_t *frame)
    124128{
    125         return frame - zone->frames;
     129        return (frame - zone->frames);
    126130}
    127131
     
    138142}
    139143
    140 /*************************************/
     144/**********************/
    141145/* Zoneinfo functions */
     146/**********************/
    142147
    143148/**
     
    155160        ipl = interrupts_disable();
    156161        spinlock_lock(&zones.lock);
     162       
    157163        /* Try to merge */
    158         if (zones.count + 1 == ZONES_MAX)
    159                 panic("Maximum zone(%d) count exceeded.", ZONES_MAX);
     164        if (zones.count + 1 == ZONES_MAX) {
     165                printf("Maximum zone count %u exceeded!\n", ZONES_MAX);
     166                spinlock_unlock(&zones.lock);
     167                interrupts_restore(ipl);
     168                return -1;
     169        }
     170       
    160171        for (i = 0; i < zones.count; i++) {
    161172                /* Check for overflow */
    162173                z = zones.info[i];
    163                 if (overlaps(newzone->base,newzone->count, z->base,
    164                     z->count)) {
     174                if (overlaps(newzone->base, newzone->count, z->base, z->count)) {
    165175                        printf("Zones overlap!\n");
    166176                        return -1;
     
    169179                        break;
    170180        }
     181       
    171182        /* Move other zones up */
    172183        for (j = i; j < zones.count; j++)
    173184                zones.info[j + 1] = zones.info[j];
     185       
    174186        zones.info[i] = newzone;
    175187        zones.count++;
     188       
    176189        spinlock_unlock(&zones.lock);
    177190        interrupts_restore(ipl);
     
    182195/**
    183196 * Try to find a zone where can we find the frame
    184  
     197 *
    185198 * Assume interrupts are disabled.
    186  
     199 *
    187200 * @param frame Frame number contained in zone
    188201 * @param pzone If not null, it is used as zone hint. Zone index
     
    901914        }
    902915
    903         z = (zone_t *)PA2KA(PFN2ADDR(confframe));
     916        z = (zone_t *) PA2KA(PFN2ADDR(confframe));
    904917        zone_construct(start, count, z, flags);
    905918        znum = zones_add_zone(z);
     
    11101123
    11111124
     1125/** Return total size of all zones
     1126 *
     1127 */
     1128uint64_t zone_total_size(void) {
     1129        zone_t *zone = NULL;
     1130        unsigned int i;
     1131        ipl_t ipl;
     1132        uint64_t total = 0;
     1133
     1134        ipl = interrupts_disable();
     1135        spinlock_lock(&zones.lock);
     1136       
     1137        for (i = 0; i < zones.count; i++) {
     1138                zone = zones.info[i];
     1139                spinlock_lock(&zone->lock);
     1140                total += (uint64_t) FRAMES2SIZE(zone->count);
     1141                spinlock_unlock(&zone->lock);
     1142        }
     1143       
     1144        spinlock_unlock(&zones.lock);
     1145        interrupts_restore(ipl);
     1146       
     1147        return total;
     1148}
     1149
     1150
    11121151
    11131152/** Prints list of zones
     
    11611200
    11621201        for (i = 0; i < zones.count; i++) {
    1163                 if (i == num || PFN2ADDR(zones.info[i]->base) == num) {
     1202                if ((i == num) || (PFN2ADDR(zones.info[i]->base) == num)) {
    11641203                        zone = zones.info[i];
    11651204                        break;
     
    11751214        printf("Zone base address: %#.*p\n", sizeof(uintptr_t) * 2,
    11761215            PFN2ADDR(zone->base));
    1177         printf("Zone size: %zd frames (%zdK)\n", zone->count,
    1178             ((zone->count) * FRAME_SIZE) >> 10);
    1179         printf("Allocated space: %zd frames (%zdK)\n", zone->busy_count,
    1180             (zone->busy_count * FRAME_SIZE) >> 10);
    1181         printf("Available space: %zd frames (%zdK)\n", zone->free_count,
    1182             (zone->free_count * FRAME_SIZE) >> 10);
     1216        printf("Zone size: %zd frames (%zd KB)\n", zone->count,
     1217                SIZE2KB(FRAMES2SIZE(zone->count)));
     1218        printf("Allocated space: %zd frames (%zd KB)\n", zone->busy_count,
     1219                SIZE2KB(FRAMES2SIZE(zone->busy_count)));
     1220        printf("Available space: %zd frames (%zd KB)\n", zone->free_count,
     1221                SIZE2KB(FRAMES2SIZE(zone->free_count)));
    11831222        buddy_system_structure_print(zone->buddy_system, FRAME_SIZE);
    1184        
    11851223        spinlock_unlock(&zone->lock);
     1224       
    11861225out:
    11871226        spinlock_unlock(&zones.lock);
Note: See TracChangeset for help on using the changeset viewer.