Changeset 2eb893b in mainline


Ignore:
Timestamp:
2008-11-22T16:52:33Z (15 years ago)
Author:
Jakub Vana <jakub.vana@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
13964ef
Parents:
48eb7a14
Message:

IA64 correctly find CPU wakeup vector from SAL & EFI memory map support

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • boot/arch/ia64/loader/gefi/HelenOS/hello.c

    r48eb7a14 r2eb893b  
    66#define KERNEL_LOAD_ADDRESS 0x4400000
    77
     8#define MEM_MAP_DESCRIPTOR_OFFSET_TYPE 0           
     9#define MEM_MAP_DESCRIPTOR_OFFSET_BASE 8   
     10#define MEM_MAP_DESCRIPTOR_OFFSET_PAGES 24   
     11
     12
     13
    814//Link image as a data array into hello - usefull with network boot
    9 //#define IMAGE_LINKED
     15#define IMAGE_LINKED
    1016
    1117bootinfo_t *bootinfo=(bootinfo_t *)BOOTINFO_ADDRESS;
     
    178184
    179185
    180         int wakeup_intno;
    181         wakeup_intno=0xf0;
     186        UINT64 wakeup_intno;
     187                LibGetSalWakeupVector(&wakeup_intno);
    182188        Print (L"WAKEUP INTNO:%X\n", wakeup_intno);
    183         //bootinfo->wakeup_intno=wakeup_intno;
    184 
    185 
    186 
    187 
    188 
    189         {
     189
     190
     191
     192
     193
    190194            UINTN cookie;
    191195            void *p=(void *)KERNEL_LOAD_ADDRESS;
     
    193197            UINT32 desver;
    194198            EFI_STATUS status;
    195             EFI_MEMORY_DESCRIPTOR emd[1024];
    196199           
    197200                           
    198             mapsize=1024*sizeof(emd);
    199201           
    200202            status=BS->AllocatePages(AllocateAnyPages,EfiLoaderData,/*(HOSSize>>12)+1*/ 1,p);
     
    207209            }
    208210           
    209             status=BS->GetMemoryMap(&mapsize,emd,&cookie,&descsize,&desver);
    210             if(EFI_ERROR(status)){
    211                 Print(L"Error 1\n");
    212                 return EFI_SUCCESS;
     211            UINTN no_entryes;
     212            void * mds;
     213            mds=LibMemoryMap(&no_entryes,&cookie,&descsize,&desver);
     214           
     215            for(i=0;i<no_entryes;i++)
     216            {
     217           
     218                unsigned int type=*((unsigned int *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_TYPE));
     219                unsigned long long base=*((unsigned long long *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_BASE));
     220                unsigned long long pages=*((unsigned long long *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_PAGES));
     221                Print(L"T:%02d %016llX %016llX\n",type,base,pages*EFI_PAGE_SIZE);
     222               
    213223            }
    214224            status=BS->ExitBootServices(image,cookie); 
     
    218228            }
    219229           
    220         }
     230       
    221231        int a;
    222232       
     
    228238        bootinfo->sys_freq=sys_freq;
    229239        bootinfo->freq_scale=freq_scale;
     240
     241
     242            bootinfo->memmap_items=0;
     243           
     244            for(i=0;i<no_entryes;i++)
     245            {
     246           
     247                unsigned int type=*((unsigned int *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_TYPE));
     248                unsigned long long base=*((unsigned long long *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_BASE));
     249                unsigned long long pages=*((unsigned long long *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_PAGES));
     250               
     251               
     252               
     253                switch (type)
     254                {
     255                        case EfiConventionalMemory:
     256                                bootinfo->memmap[bootinfo->memmap_items].type=EFI_MEMMAP_FREE_MEM;     
     257                                bootinfo->memmap[bootinfo->memmap_items].base=base;     
     258                                bootinfo->memmap[bootinfo->memmap_items].size=pages*EFI_PAGE_SIZE;     
     259                                bootinfo->memmap_items++;
     260                                break;
     261                        case EfiMemoryMappedIO:
     262                                bootinfo->memmap[bootinfo->memmap_items].type=EFI_MEMMAP_IO;   
     263                                bootinfo->memmap[bootinfo->memmap_items].base=base;     
     264                                bootinfo->memmap[bootinfo->memmap_items].size=pages*EFI_PAGE_SIZE;     
     265                                bootinfo->memmap_items++;
     266                                break;
     267                        case EfiMemoryMappedIOPortSpace:
     268                                bootinfo->memmap[bootinfo->memmap_items].type=EFI_MEMMAP_IO_PORTS;     
     269                                bootinfo->memmap[bootinfo->memmap_items].base=base;     
     270                                bootinfo->memmap[bootinfo->memmap_items].size=pages*EFI_PAGE_SIZE;     
     271                                bootinfo->memmap_items++;
     272                                break;
     273                               
     274                        default :
     275                                break;
     276                }
     277               
     278               
     279               
     280               
     281
     282            }
     283
     284
    230285       
    231286        //Run Kernel
  • kernel/arch/ia64/include/bootinfo.h

    r48eb7a14 r2eb893b  
    3434#define CONFIG_INIT_TASKS       32
    3535
     36#define MEMMAP_ITEMS 128
     37
     38#define EFI_MEMMAP_FREE_MEM 0
     39#define EFI_MEMMAP_IO 1
     40#define EFI_MEMMAP_IO_PORTS 2
     41
     42
    3643typedef struct {
    3744        void *addr;
     
    4451} binit_t;
    4552
     53typedef struct {
     54        unsigned int type;
     55        unsigned long base;
     56        unsigned long size;
     57}efi_memmap_item_t;
     58
    4659
    4760typedef struct {
    4861        binit_t taskmap;
     62
     63        efi_memmap_item_t memmap[MEMMAP_ITEMS];
     64        unsigned int memmap_items;
    4965
    5066        unsigned long * sapic;
  • kernel/arch/ia64/src/mm/frame.c

    r48eb7a14 r2eb893b  
    3737#include <config.h>
    3838#include <panic.h>
     39#include <arch/bootinfo.h>
     40#include <align.h>
     41#include <macros.h>
    3942
    4043/*
     
    4245 * for real ia64 systems that provide memory map.
    4346 */
    44 #define MEMORY_SIZE     (64 * 1024 * 1024)
     47#define MEMORY_SIZE     (256 * 1024 * 1024)
    4548#define MEMORY_BASE     (0 * 64 * 1024 * 1024)
     49
     50#define KERNEL_RESERVED_AREA_BASE (0x4400000)
     51#define KERNEL_RESERVED_AREA_SIZE (16*1024*1024)
    4652
    4753#define ONE_TO_ONE_MAPPING_SIZE (256*1048576) // Mapped at start
     
    5157void poke_char(int x,int y,char ch, char c);
    5258
     59#define MIN_ZONE_SIZE (64*1024)
     60
    5361uintptr_t last_frame;
     62#define MINCONF 1
    5463
    5564void frame_arch_init(void)
    5665{
    5766
    58         if(config.cpu_active==1)
    59         {
    60                 zone_create(MEMORY_BASE >> FRAME_WIDTH, SIZE2FRAMES(MEMORY_SIZE), (MEMORY_SIZE) >> FRAME_WIDTH, 0);
     67        if(config.cpu_active==1){
     68               
     69               
     70               
     71                unsigned int i;
     72                for(i=0;i<bootinfo->memmap_items;i++){
     73                        if (bootinfo->memmap[i].type==EFI_MEMMAP_FREE_MEM){
     74                                uint64_t base=bootinfo->memmap[i].base;
     75                                uint64_t size=bootinfo->memmap[i].size;
     76                                uint64_t abase=ALIGN_UP(base,FRAME_SIZE);
     77                                if(size>FRAME_SIZE) size -=abase-base;
     78                               
     79
     80                                if(size>MIN_ZONE_SIZE)  {
     81                                        zone_create(abase >> FRAME_WIDTH, (size) >> FRAME_WIDTH, max(MINCONF,((abase) >> FRAME_WIDTH)), 0);
     82                                }       
     83                        }
     84                }
     85               
     86                //zone_create(MEMORY_BASE >> FRAME_WIDTH, SIZE2FRAMES(MEMORY_SIZE), (MEMORY_SIZE) >> FRAME_WIDTH, 0);
    6187       
    6288                /*
    6389                * Blacklist ROM regions.
    6490                */
    65                 //frame_mark_unavailable(ADDR2PFN(ROM_BASE), SIZE2FRAMES(ROM_SIZE));
     91                frame_mark_unavailable(ADDR2PFN(ROM_BASE), SIZE2FRAMES(ROM_SIZE));
    6692
    67                 frame_mark_unavailable(ADDR2PFN(0), SIZE2FRAMES(1048576));
    68                 last_frame=SIZE2FRAMES((VRN_KERNEL<<VRN_SHIFT)+ONE_TO_ONE_MAPPING_SIZE);       
     93                frame_mark_unavailable(ADDR2PFN(KERNEL_RESERVED_AREA_BASE), SIZE2FRAMES(KERNEL_RESERVED_AREA_SIZE));
    6994        }       
    7095}
Note: See TracChangeset for help on using the changeset viewer.