Subversion Repositories HelenOS

Rev

Rev 3665 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2726 vana 1
#include <efi.h>
2
#include <efilib.h>
3
 
3593 rimsky 4
#include <../../../../../../kernel/arch/ia64/include/bootinfo.h>
5
 
2726 vana 6
#define KERNEL_LOAD_ADDRESS 0x4400000
7
 
3665 rimsky 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
 
3593 rimsky 14
//Link image as a data array into hello - usefull with network boot
3742 rimsky 15
//#define IMAGE_LINKED
2726 vana 16
 
3593 rimsky 17
bootinfo_t *bootinfo=(bootinfo_t *)BOOTINFO_ADDRESS;
18
 
19
 
20
#ifdef IMAGE_LINKED
21
extern char HOSimage[];
22
extern int HOSimagesize;
23
#endif
24
 
25
 
26
 
2726 vana 27
static CHAR16 *
28
a2u (char *str)
29
{
30
    static CHAR16 mem[2048];
31
    int i;
32
 
33
    for (i = 0; str[i]; ++i)
34
        mem[i] = (CHAR16) str[i];
35
    mem[i] = 0;
36
    return mem;
37
}
38
 
39
EFI_STATUS
40
efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
41
{
42
    SIMPLE_TEXT_OUTPUT_INTERFACE *conout;
43
 
44
    EFI_INPUT_KEY efi_input_key;
45
    EFI_STATUS efi_status;
46
 
47
    InitializeLib(image, systab);
48
 
49
    Print(L"HelloLib application started\n");
50
 
51
    EFI_GUID LoadedImageProtocol=LOADED_IMAGE_PROTOCOL;
52
    EFI_GUID DevicePathProtocol=DEVICE_PATH_PROTOCOL;
53
    EFI_GUID FileSystemProtocol=SIMPLE_FILE_SYSTEM_PROTOCOL;
54
 
55
 
56
    EFI_LOADED_IMAGE *LoadedImage;
57
    EFI_DEVICE_PATH *DevicePath;
58
 
59
    BS->HandleProtocol(image,
60
    &LoadedImageProtocol,
61
    &LoadedImage);
62
    BS->HandleProtocol(LoadedImage->DeviceHandle,
63
    &DevicePathProtocol,
64
    &DevicePath);
65
    Print (L"Image device : %s\n", DevicePathToStr (DevicePath));
66
    Print (L"Image file   : %s\n", DevicePathToStr (LoadedImage->FilePath));
67
    Print (L"Image Base   : %X\n", LoadedImage->ImageBase);
68
    Print (L"Image Size   : %X\n", LoadedImage->ImageSize);
69
 
70
 
71
 
72
    EFI_FILE_IO_INTERFACE *Vol;
73
 
74
    EFI_FILE *CurDir;
75
    EFI_FILE *FileHandle;
76
 
77
    BS->HandleProtocol(LoadedImage->DeviceHandle, &FileSystemProtocol, &Vol);
78
 
79
    char FileName[1024];
80
    char *OsKernelBuffer;
81
    int i;
3593 rimsky 82
    int defaultLoad;
83
    int imageLoad;
2726 vana 84
    UINTN Size;
85
 
86
    StrCpy(FileName,DevicePathToStr(LoadedImage->FilePath));
87
    for(i=StrLen(FileName);i>=0 && FileName[i]!='\\';i--);
88
    FileName[i] = 0;
3742 rimsky 89
    FileName[0] = 0;
2726 vana 90
 
91
    Print(L"%s\n",LoadedImage->LoadOptions);
92
 
93
    i=0;
94
    CHAR16 *LoadOptions = LoadedImage->LoadOptions;
95
 
96
 
97
 
98
    while(1) if(LoadOptions[i++]!=L' ') break;
99
    while(LoadOptions[i]!=L' '){   
100
        if(LoadOptions[i]==0) break;
101
        i++;
102
    }
103
    while(LoadOptions[i]==L' ') if(LoadOptions[i++]==0) break;
104
 
3593 rimsky 105
    if(LoadOptions[i++]==0){
2726 vana 106
        StrCat(FileName,L"\\image.bin");
3593 rimsky 107
        defaultLoad=1;
108
    }  
3742 rimsky 109
/*  else{
2726 vana 110
        CHAR16 buf[1024];
3742 rimsky 111
        //buf[0]='\\';
2726 vana 112
        i--;
113
        int j;
114
        for(j=0;LoadOptions[i+j]!=L' '&&LoadOptions[i+j]!=0;j++)
115
            buf[j+1]=LoadOptions[i+j];
116
        buf[j+1]=0;
117
        StrCat(FileName,buf);
3593 rimsky 118
        defaultLoad=0;
3742 rimsky 119
    }*/
120
    else{
121
        CHAR16 buf[1024];
122
        //buf[0]='\\';
123
        i--;
124
        int j;
125
        for(j=0;LoadOptions[i+j]!=L' '&&LoadOptions[i+j]!=0;j++)
126
            buf[j]=LoadOptions[i+j];
127
        buf[j+1]=0;
128
        StrCat(FileName,buf);
129
        defaultLoad=0;
2726 vana 130
    }
131
 
3593 rimsky 132
    imageLoad=1;
133
#ifdef IMAGE_LINKED
134
    if(defaultLoad) {
135
        Print(L"Using Linked Image\n");
136
        imageLoad=0;
2726 vana 137
    }    
3593 rimsky 138
#endif  
139
 
2726 vana 140
 
3593 rimsky 141
    char *  HOS;
142
    if(imageLoad)
143
    {
144
        Size = 0x00400000;
2726 vana 145
 
3593 rimsky 146
            Vol->OpenVolume (Vol, &CurDir);
2726 vana 147
 
3593 rimsky 148
        EFI_STATUS stat;
149
        stat=CurDir->Open(CurDir, &FileHandle, FileName, EFI_FILE_MODE_READ, 0);
150
        if(EFI_ERROR(stat)){
151
            Print(L"Error Opening Image %s\n",FileName);
152
            return 0;
153
        }
154
            BS->AllocatePool(EfiLoaderData, Size, &OsKernelBuffer);
155
        FileHandle->Read(FileHandle, &Size, OsKernelBuffer);
156
        FileHandle->Close(FileHandle);
157
        HOS = OsKernelBuffer;  
158
            if(Size<1) return 0;
159
 
160
    }      
161
#ifdef IMAGE_LINKED
162
    else {
163
        HOS = HOSimage;  
164
        Size = HOSimagesize;
165
        Print(L"Image start %llX\n",(long long)HOS);
166
        Print(L"Image size %llX\n",(long long)Size);
167
        Print(L"Image &size %llX\n",(long long)&Size);
168
    }
169
#endif  
2726 vana 170
    int HOSSize = Size;  
171
 
172
 
3593 rimsky 173
    rArg rSAL;
174
    rArg rPAL;
175
 
176
    //Setup AP's wake up address
177
    LibSalProc(0x01000000,2,0x4400200,0,0,0,0,0,&rSAL);
178
 
179
 
180
    //Get System Frequency
181
    UINT64 sys_freq;
182
    LibSalProc(0x01000012,0,0,0,0,0,0,0,&rSAL);
183
    sys_freq=rSAL.p1;
184
 
185
 
186
    UINT64 freq_scale;
187
    //Get CPU Frequency to System Frequency ratio
188
    LibPalProc(14,0,0,0,&rPAL);
189
    freq_scale=rPAL.p1;
190
 
191
 
192
        UINT64 sapic;
193
        LibGetSalIpiBlock(&sapic);
194
        Print (L"SAPIC:%X\n", sapic);
195
    //bootinfo->sapic=sapic;
196
 
197
 
3665 rimsky 198
        UINT64 wakeup_intno;
199
        LibGetSalWakeupVector(&wakeup_intno);
3593 rimsky 200
        Print (L"WAKEUP INTNO:%X\n", wakeup_intno);
201
 
202
 
203
 
204
 
205
 
2726 vana 206
        UINTN cookie;
207
        void *p=(void *)KERNEL_LOAD_ADDRESS;
208
        UINTN mapsize,descsize;
209
        UINT32 desver;
210
        EFI_STATUS status;
211
 
212
 
213
 
214
        status=BS->AllocatePages(AllocateAnyPages,EfiLoaderData,/*(HOSSize>>12)+1*/ 1,p);
215
        if(EFI_ERROR(status)){
216
        Print(L"Error 0\n");
217
        if(status == EFI_OUT_OF_RESOURCES) Print(L"EFI_OUT_OF_RESOURCES\n");
218
        if(status == EFI_INVALID_PARAMETER) Print(L"EFI_INVALID_PARAMETER\n");
219
        if(status == EFI_NOT_FOUND) Print(L"EFI_NOT_FOUND\n");
220
        return EFI_SUCCESS;
221
        }
222
 
3665 rimsky 223
        UINTN no_entryes;
224
        void * mds;
225
        mds=LibMemoryMap(&no_entryes,&cookie,&descsize,&desver);
226
 
227
        for(i=0;i<no_entryes;i++)
228
        {
229
 
230
            unsigned int type=*((unsigned int *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_TYPE));
231
            unsigned long long base=*((unsigned long long *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_BASE));
232
            unsigned long long pages=*((unsigned long long *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_PAGES));
233
            Print(L"T:%02d %016llX %016llX\n",type,base,pages*EFI_PAGE_SIZE);
234
 
2726 vana 235
        }
236
        status=BS->ExitBootServices(image,cookie); 
237
        if(EFI_ERROR(status)){
238
        Print(L"Error 2\n");
239
        return EFI_SUCCESS;
240
        }
241
 
3665 rimsky 242
 
2726 vana 243
    int a;
244
 
245
    for(a=0;a<HOSSize;a++){
246
        ((char *)(0x4400000))[a]=HOS[a];
247
    }
3593 rimsky 248
    bootinfo->sapic=(unsigned long *)sapic;
249
    bootinfo->wakeup_intno=wakeup_intno;
250
    bootinfo->sys_freq=sys_freq;
251
    bootinfo->freq_scale=freq_scale;
3665 rimsky 252
    bootinfo->hello_configured=1;
253
 
254
 
255
        bootinfo->memmap_items=0;
256
 
257
        for(i=0;i<no_entryes;i++)
258
        {
259
 
260
            unsigned int type=*((unsigned int *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_TYPE));
261
            unsigned long long base=*((unsigned long long *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_BASE));
262
            unsigned long long pages=*((unsigned long long *)(mds+i*descsize+MEM_MAP_DESCRIPTOR_OFFSET_PAGES));
263
 
264
 
265
 
266
            switch (type)
267
            {
268
                case EfiConventionalMemory:
269
                bootinfo->memmap[bootinfo->memmap_items].type=EFI_MEMMAP_FREE_MEM;      
270
                bootinfo->memmap[bootinfo->memmap_items].base=base;    
271
                bootinfo->memmap[bootinfo->memmap_items].size=pages*EFI_PAGE_SIZE;      
272
                    bootinfo->memmap_items++;
273
                    break;
274
                case EfiMemoryMappedIO:
275
                bootinfo->memmap[bootinfo->memmap_items].type=EFI_MEMMAP_IO;    
276
                bootinfo->memmap[bootinfo->memmap_items].base=base;    
277
                bootinfo->memmap[bootinfo->memmap_items].size=pages*EFI_PAGE_SIZE;      
278
                    bootinfo->memmap_items++;
279
                    break;
280
                case EfiMemoryMappedIOPortSpace:
281
                bootinfo->memmap[bootinfo->memmap_items].type=EFI_MEMMAP_IO_PORTS;      
282
                bootinfo->memmap[bootinfo->memmap_items].base=base;    
283
                bootinfo->memmap[bootinfo->memmap_items].size=pages*EFI_PAGE_SIZE;      
284
                    bootinfo->memmap_items++;
285
                    break;
286
 
287
                default :
288
                    break;
289
            }
290
 
291
 
292
 
293
 
294
 
295
        }
296
 
297
 
2726 vana 298
 
299
    //Run Kernel
300
    asm volatile(  
301
        "nop.i 0x00 ;;\n"
302
        "movl r15 = 0x4400000 ;;\n"
303
        "mov b0 = r15;;"
304
        "br.few b0;;\n"
305
    );
306
 
307
 
3593 rimsky 308
    //Not reached      
2726 vana 309
    return EFI_SUCCESS;
310
}