Changeset e49e234 in mainline for kernel/arch


Ignore:
Timestamp:
2009-02-27T11:32:31Z (17 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c1f7f6ea
Parents:
5f0f29ce
Message:

kernel memory management revisited (phase 2): map physical memory according to zones

  • ia32: register reserved and ACPI zones
  • pareas are now used only for mapping of present physical memory (hw_area() is gone)
  • firmware zones and physical addresses outside any zones are allowed to be mapped generally
  • fix nasty antient bug in zones_insert_zone()
Location:
kernel/arch
Files:
21 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/amd64/include/mm/frame.h

    r5f0f29ce re49e234  
    2727 */
    2828
    29 /** @addtogroup amd64mm 
     29/** @addtogroup amd64mm
    3030 * @{
    3131 */
     
    4040#endif /* __ASM__ */
    4141
    42 #define FRAME_WIDTH             12      /* 4K */
    43 #define FRAME_SIZE              (1 << FRAME_WIDTH)
     42#define FRAME_WIDTH  12  /* 4K */
     43#define FRAME_SIZE   (1 << FRAME_WIDTH)
    4444
    4545#ifndef __ASM__
    4646extern uintptr_t last_frame;
    47 extern uintptr_t end_frame;
    4847extern void frame_arch_init(void);
    4948extern void physmem_print(void);
  • kernel/arch/amd64/src/mm/page.c

    r5f0f29ce re49e234  
    3535#include <arch/mm/page.h>
    3636#include <genarch/mm/page_pt.h>
    37 #include <genarch/drivers/ega/ega.h>
    38 #include <genarch/drivers/legacy/ia32/io.h>
    3937#include <arch/mm/frame.h>
    4038#include <mm/page.h>
     
    4947#include <panic.h>
    5048#include <align.h>
    51 #include <ddi/ddi.h>
    52 
    53 /** Physical memory area for devices. */
    54 static parea_t dev_area;
    55 static parea_t ega_area;
    5649
    5750/* Definitions for identity page mapper */
     
    222215}
    223216
    224 void hw_area(void)
    225 {
    226         dev_area.pbase = end_frame;
    227         dev_area.frames = SIZE2FRAMES(0xfffffffffffff - end_frame);
    228         ddi_parea_register(&dev_area);
    229        
    230         ega_area.pbase = EGA_VIDEORAM;
    231         ega_area.frames = SIZE2FRAMES(EGA_VRAM_SIZE);
    232         ddi_parea_register(&ega_area);
    233 }
    234 
    235217/** @}
    236218 */
  • kernel/arch/arm32/include/mm/frame.h

    r5f0f29ce re49e234  
    2727 */
    2828
    29 /** @addtogroup arm32mm 
     29/** @addtogroup arm32mm
    3030 * @{
    3131 */
     
    3737#define KERN_arm32_FRAME_H_
    3838
    39 #define FRAME_WIDTH             12 /* 4KB frames */
    40 #define FRAME_SIZE              (1 << FRAME_WIDTH)
     39#define FRAME_WIDTH  12 /* 4KB frames */
     40#define FRAME_SIZE   (1 << FRAME_WIDTH)
    4141
    4242#ifdef KERNEL
     
    4545#include <arch/types.h>
    4646
    47 #define BOOT_PAGE_TABLE_SIZE    0x4000
    48 #define BOOT_PAGE_TABLE_ADDRESS 0x4000
     47#define BOOT_PAGE_TABLE_SIZE     0x4000
     48#define BOOT_PAGE_TABLE_ADDRESS  0x4000
    4949
    5050#define BOOT_PAGE_TABLE_START_FRAME     (BOOT_PAGE_TABLE_ADDRESS >> FRAME_WIDTH)
     
    5252
    5353extern uintptr_t last_frame;
    54 extern uintptr_t end_frame;
    5554
    5655extern void frame_arch_init(void);
  • kernel/arch/arm32/src/mm/frame.c

    r5f0f29ce re49e234  
    2727 */
    2828
    29 /** @addtogroup arm32mm 
     29/** @addtogroup arm32mm
    3030 * @{
    3131 */
     
    4242/** Address of the last frame in the memory. */
    4343uintptr_t last_frame = 0;
    44 uintptr_t end_frame = 0;
    4544
    4645/** Creates memory zones. */
     
    5150            BOOT_PAGE_TABLE_START_FRAME + BOOT_PAGE_TABLE_SIZE_IN_FRAMES, 0);
    5251        last_frame = machine_get_memory_size();
    53         end_frame = last_frame;
    5452       
    5553        /* blacklist boot page table */
  • kernel/arch/arm32/src/mm/page.c

    r5f0f29ce re49e234  
    4444#include <interrupt.h>
    4545#include <arch/mm/frame.h>
    46 #include <ddi/ddi.h>
    47 
    48 /** Physical memory area for devices. */
    49 static parea_t dev_area;
    5046
    5147/** Initializes page tables.
     
    111107}
    112108
    113 void hw_area(void)
    114 {
    115         dev_area.pbase = end_frame;
    116         dev_area.frames = SIZE2FRAMES(0xffffffff - end_frame);
    117         ddi_parea_register(&dev_area);
    118 }
    119 
    120109/** @}
    121110 */
  • kernel/arch/ia32/include/boot/memmap.h

    r5f0f29ce re49e234  
    2727 */
    2828
    29 /** @addtogroup ia32   
     29/** @addtogroup ia32
    3030 * @{
    3131 */
     
    3636#define KERN_ia32_MEMMAP_H_
    3737
    38 /* E820h memory range types - other values*/
    39         /* Free memory */
    40 #define MEMMAP_MEMORY_AVAILABLE 1
    41         /* Not available for OS */
    42 #define MEMMAP_MEMORY_RESERVED  2
    43         /* OS may use it after reading ACPI table */
    44 #define MEMMAP_MEMORY_ACPI      3
    45         /* Unusable, required to be saved and restored across an NVS sleep */
    46 #define MEMMAP_MEMORY_NVS       4
    47         /* Corrupted memory */
    48 #define MEMMAP_MEMORY_UNUSABLE  5
     38/* E820h memory range types */
    4939
    50          /* size of one entry */
    51 #define MEMMAP_E820_RECORD_SIZE 20
    52         /* maximum entries */
    53 #define MEMMAP_E820_MAX_RECORDS 32
     40/* Free memory */
     41#define MEMMAP_MEMORY_AVAILABLE  1
    5442
     43/* Not available for OS */
     44#define MEMMAP_MEMORY_RESERVED   2
     45
     46/* OS may use it after reading ACPI table */
     47#define MEMMAP_MEMORY_ACPI       3
     48
     49/* Unusable, required to be saved and restored across an NVS sleep */
     50#define MEMMAP_MEMORY_NVS        4
     51
     52/* Corrupted memory */
     53#define MEMMAP_MEMORY_UNUSABLE   5
     54
     55/* Size of one entry */
     56#define MEMMAP_E820_RECORD_SIZE  20
     57
     58/* Maximum entries */
     59#define MEMMAP_E820_MAX_RECORDS  32
    5560
    5661#ifndef __ASM__
  • kernel/arch/ia32/include/mm/frame.h

    r5f0f29ce re49e234  
    2727 */
    2828
    29 /** @addtogroup ia32mm 
     29/** @addtogroup ia32mm
    3030 * @{
    3131 */
     
    3636#define KERN_ia32_FRAME_H_
    3737
    38 #define FRAME_WIDTH     12      /* 4K */
    39 #define FRAME_SIZE      (1 << FRAME_WIDTH)
     38#define FRAME_WIDTH  12  /* 4K */
     39#define FRAME_SIZE   (1 << FRAME_WIDTH)
    4040
    4141#ifdef KERNEL
     
    4545
    4646extern uintptr_t last_frame;
    47 extern uintptr_t end_frame;
    4847
    4948extern void frame_arch_init(void);
  • kernel/arch/ia32/src/mm/frame.c

    r5f0f29ce re49e234  
    5151
    5252uintptr_t last_frame = 0;
    53 uintptr_t end_frame = 0;
    5453
    5554static void init_e820_memory(pfn_t minconf)
    5655{
    5756        unsigned int i;
    58         pfn_t start, conf;
    59         size_t size;
    60        
    6157        for (i = 0; i < e820counter; i++) {
     58                uint64_t base = e820table[i].base_address;
     59                uint64_t size = e820table[i].size;
     60               
     61#ifdef __32_BITS__
     62               
     63                /* Ignore physical memory above 4 GB */
     64                if ((base >> 32) != 0)
     65                        continue;
     66               
     67                /* Clip regions above 4 GB */
     68                if (((base + size) >> 32) != 0)
     69                        size = 0xffffffff - base;
     70               
     71#endif
     72                pfn_t pfn;
     73                count_t count;
     74               
    6275                if (e820table[i].type == MEMMAP_MEMORY_AVAILABLE) {
    63                         start = ADDR2PFN(ALIGN_UP(e820table[i].base_address, FRAME_SIZE));
    64                         size = SIZE2FRAMES(ALIGN_DOWN(e820table[i].size, FRAME_SIZE));
     76                        /* To be safe, make available zone possibly smaller */
     77                        pfn = ADDR2PFN(ALIGN_UP(base, FRAME_SIZE));
     78                        count = SIZE2FRAMES(ALIGN_DOWN(size, FRAME_SIZE));
    6579                       
    66                         if ((minconf < start) || (minconf >= start + size))
    67                                 conf = start;
     80                        pfn_t conf;
     81                        if ((minconf < pfn) || (minconf >= pfn + count))
     82                                conf = pfn;
    6883                        else
    6984                                conf = minconf;
    7085                       
    71                         zone_create(start, size, conf, 0);
     86                        zone_create(pfn, count, conf, ZONE_AVAILABLE);
    7287                       
    73                         if (last_frame < ALIGN_UP(e820table[i].base_address +
    74                             e820table[i].size, FRAME_SIZE))
    75                                 last_frame =
    76                                     ALIGN_UP(e820table[i].base_address + e820table[i].size, FRAME_SIZE);
     88                        // XXX this has to be removed
     89                        if (last_frame < ALIGN_UP(base + size, FRAME_SIZE))
     90                                last_frame = ALIGN_UP(base + size, FRAME_SIZE);
     91                }
     92               
     93                if (e820table[i].type == MEMMAP_MEMORY_RESERVED) {
     94                        /* To be safe, make reserved zone possibly larger */
     95                        pfn = ADDR2PFN(ALIGN_DOWN(base, FRAME_SIZE));
     96                        count = SIZE2FRAMES(ALIGN_UP(size, FRAME_SIZE));
     97                       
     98                        zone_create(pfn, count, 0, ZONE_RESERVED);
     99                }
     100               
     101                if (e820table[i].type == MEMMAP_MEMORY_ACPI) {
     102                        /* To be safe, make firmware zone possibly larger */
     103                        pfn = ADDR2PFN(ALIGN_DOWN(base, (uintptr_t) FRAME_SIZE));
     104                        count = SIZE2FRAMES(ALIGN_UP(size, (uintptr_t) FRAME_SIZE));
     105                       
     106                        zone_create(pfn, count, 0, ZONE_FIRMWARE);
    77107                }
    78108        }
    79        
    80         end_frame = last_frame;
    81109}
    82110
  • kernel/arch/ia32/src/mm/page.c

    r5f0f29ce re49e234  
    3535#include <arch/mm/page.h>
    3636#include <genarch/mm/page_pt.h>
    37 #include <genarch/drivers/ega/ega.h>
    38 #include <genarch/drivers/legacy/ia32/io.h>
    3937#include <arch/mm/frame.h>
    4038#include <mm/frame.h>
     
    5149#include <print.h>
    5250#include <interrupt.h>
    53 #include <ddi/ddi.h>
    54 
    55 /** Physical memory area for devices. */
    56 static parea_t dev_area;
    57 static parea_t ega_area;
    5851
    5952void page_arch_init(void)
     
    6154        uintptr_t cur;
    6255        int flags;
    63 
     56       
    6457        if (config.cpu_active == 1) {
    6558                page_mapping_operations = &pt_mapping_operations;
     
    7467                        page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags);
    7568                }
    76 
     69               
    7770                exc_register(14, "page_fault", (iroutine) page_fault);
    7871                write_cr3((uintptr_t) AS_KERNEL->genarch.page_table);
    7972        } else
    8073                write_cr3((uintptr_t) AS_KERNEL->genarch.page_table);
    81 
     74       
    8275        paging_on();
    8376}
     
    9992       
    10093        return virtaddr;
    101 }
    102 
    103 void hw_area(void)
    104 {
    105         dev_area.pbase = end_frame;
    106         dev_area.frames = SIZE2FRAMES(0xffffffff - end_frame);
    107         ddi_parea_register(&dev_area);
    108        
    109         ega_area.pbase = EGA_VIDEORAM;
    110         ega_area.frames = SIZE2FRAMES(EGA_VRAM_SIZE);
    111         ddi_parea_register(&ega_area);
    11294}
    11395
  • kernel/arch/ia64/include/mm/frame.h

    r5f0f29ce re49e234  
    2727 */
    2828
    29 /** @addtogroup ia64mm 
     29/** @addtogroup ia64mm
    3030 * @{
    3131 */
     
    3636#define KERN_ia64_FRAME_H_
    3737
    38 #define FRAME_WIDTH             14      /* 16K */
    39 #define FRAME_SIZE              (1 << FRAME_WIDTH)
     38#define FRAME_WIDTH  14  /* 16K */
     39#define FRAME_SIZE   (1 << FRAME_WIDTH)
    4040
    4141#ifdef KERNEL
     
    4545
    4646extern uintptr_t last_frame;
    47 extern uintptr_t end_frame;
    4847
    4948extern void frame_arch_init(void);
  • kernel/arch/ia64/src/mm/frame.c

    r5f0f29ce re49e234  
    2727 */
    2828
    29 /** @addtogroup ia64mm 
     29/** @addtogroup ia64mm
    3030 * @{
    3131 */
     
    5252
    5353uintptr_t last_frame = 0;
    54 uintptr_t end_frame = 0;
    5554
    5655void frame_arch_init(void)
  • kernel/arch/ia64/src/mm/page.c

    r5f0f29ce re49e234  
    4949#include <memstr.h>
    5050#include <align.h>
    51 #include <ddi/ddi.h>
    52 
    53 /** Physical memory area for devices. */
    54 static parea_t dev_area;
    5551
    5652static void set_environment(void);
     
    6864{
    6965        region_register rr;
    70         pta_register pta;       
     66        pta_register pta;
    7167        int i;
    72 #ifdef CONFIG_VHPT     
     68#ifdef CONFIG_VHPT
    7369        uintptr_t vhpt_base;
    7470#endif
     
    279275}
    280276
    281 void hw_area(void)
    282 {
    283         dev_area.pbase = end_frame;
    284         dev_area.frames = SIZE2FRAMES(0x7fffffffffffffffUL - end_frame);
    285         ddi_parea_register(&dev_area);
    286 }
    287 
    288277/** @}
    289278 */
  • kernel/arch/mips32/include/mm/frame.h

    r5f0f29ce re49e234  
    2727 */
    2828
    29 /** @addtogroup mips32mm       
     29/** @addtogroup mips32mm
    3030 * @{
    3131 */
     
    4747extern void physmem_print(void);
    4848
    49 extern uintptr_t end_frame;
    50 
    5149#endif /* __ASM__ */
    5250#endif /* KERNEL */
  • kernel/arch/mips32/src/mm/frame.c

    r5f0f29ce re49e234  
    6565static count_t phys_regions_count = 0;
    6666static phys_region_t phys_regions[MAX_REGIONS];
    67 
    68 uintptr_t end_frame = 0;
    6967
    7068
     
    239237        }
    240238       
    241         end_frame = frame;
    242        
    243         frame_add_region(start_frame, end_frame);
     239        frame_add_region(start_frame, frame);
    244240       
    245241        /* Blacklist interrupt vector frame */
  • kernel/arch/mips32/src/mm/page.c

    r5f0f29ce re49e234  
    3737#include <mm/page.h>
    3838#include <mm/frame.h>
    39 #include <ddi/ddi.h>
    40 
    41 /** Physical memory area for devices. */
    42 static parea_t dev_area;
    4339
    4440void page_arch_init(void)
     
    5652}
    5753
    58 void hw_area(void)
    59 {
    60         dev_area.pbase = end_frame;
    61         dev_area.frames = SIZE2FRAMES(0xffffffff - end_frame);
    62         ddi_parea_register(&dev_area);
    63 }
    64 
    6554/** @}
    6655 */
  • kernel/arch/ppc32/include/mm/frame.h

    r5f0f29ce re49e234  
    2727 */
    2828
    29 /** @addtogroup ppc32mm 
     29/** @addtogroup ppc32mm
    3030 * @{
    3131 */
     
    3636#define KERN_ppc32_FRAME_H_
    3737
    38 #define FRAME_WIDTH             12      /* 4K */
    39 #define FRAME_SIZE              (1 << FRAME_WIDTH)
     38#define FRAME_WIDTH  12  /* 4K */
     39#define FRAME_SIZE   (1 << FRAME_WIDTH)
    4040
    4141#ifdef KERNEL
     
    4545
    4646extern uintptr_t last_frame;
    47 extern uintptr_t end_frame;
    4847
    4948extern void frame_arch_init(void);
  • kernel/arch/ppc32/src/mm/frame.c

    r5f0f29ce re49e234  
    4141
    4242uintptr_t last_frame = 0;
    43 uintptr_t end_frame = 0;
    4443
    4544void physmem_print(void)
     
    7776        }
    7877       
    79         end_frame = last_frame;
    80        
    8178        /* First is exception vector, second is 'implementation specific',
    8279           third and fourth is reserved, other contain real mode code */
  • kernel/arch/ppc32/src/mm/page.c

    r5f0f29ce re49e234  
    2727 */
    2828
    29 /** @addtogroup ppc32mm 
     29/** @addtogroup ppc32mm
    3030 * @{
    3131 */
     
    3838#include <align.h>
    3939#include <config.h>
    40 #include <ddi/ddi.h>
    41 
    42 /** Physical memory area for devices. */
    43 static parea_t dev_area;
    4440
    4541void page_arch_init(void)
     
    6864}
    6965
    70 void hw_area(void)
    71 {
    72         dev_area.pbase = end_frame;
    73         dev_area.frames = SIZE2FRAMES(0xffffffff - end_frame);
    74         ddi_parea_register(&dev_area);
    75 }
    76 
    7766/** @}
    7867 */
  • kernel/arch/sparc64/include/mm/frame.h

    r5f0f29ce re49e234  
    7474
    7575extern uintptr_t last_frame;
    76 extern uintptr_t end_frame;
    7776extern void frame_arch_init(void);
    7877#define physmem_print()
  • kernel/arch/sparc64/src/mm/frame.c

    r5f0f29ce re49e234  
    2727 */
    2828
    29 /** @addtogroup sparc64mm       
     29/** @addtogroup sparc64mm
    3030 * @{
    3131 */
     
    4242
    4343uintptr_t last_frame = NULL;
    44 uintptr_t end_frame = NULL;
    4544
    4645/** Create memory zones according to information stored in bootinfo.
     
    8180                frame_mark_unavailable(ADDR2PFN(KA2PA(PFN2ADDR(0))), 1);
    8281        }
    83        
    84         end_frame = last_frame;
    8582}
    8683
  • kernel/arch/sparc64/src/mm/page.c

    r5f0f29ce re49e234  
    4242#include <align.h>
    4343#include <config.h>
    44 #include <ddi/ddi.h>
    45 
    46 /** Physical memory area for devices. */
    47 static parea_t dev_area;
    4844
    4945#ifdef CONFIG_SMP
     
    169165}
    170166
    171 void hw_area(void)
    172 {
    173         dev_area.pbase = end_frame;
    174         dev_area.frames = SIZE2FRAMES(0x7ffffffffff - end_frame);
    175         ddi_parea_register(&dev_area);
    176 }
    177 
    178167/** @}
    179168 */
Note: See TracChangeset for help on using the changeset viewer.