Index: boot/arch/ia64/loader/gefi/HelenOS/hello.c
===================================================================
--- boot/arch/ia64/loader/gefi/HelenOS/hello.c	(revision 7208b6cc46de53e520a0beb3636047d8e17c072c)
+++ boot/arch/ia64/loader/gefi/HelenOS/hello.c	(revision 7208b6cc46de53e520a0beb3636047d8e17c072c)
@@ -0,0 +1,184 @@
+#include <efi.h>
+#include <efilib.h>
+
+#define KERNEL_LOAD_ADDRESS 0x4400000
+
+
+static CHAR16 *
+a2u (char *str)
+{
+	static CHAR16 mem[2048];
+	int i;
+
+	for (i = 0; str[i]; ++i)
+		mem[i] = (CHAR16) str[i];
+	mem[i] = 0;
+	return mem;
+}
+char HEX[256];
+
+char hexs[]="0123456789ABCDEF";
+/*
+void to_hex(unsigned long long num)
+{
+    int a;
+    for(a=15;a>=0;a--)    
+    {
+	char c=num - (num & 0xfffffffffffffff0LL);
+	num/=16;
+	c=hexs[c];
+	HEX[a]=c;
+    }
+
+}
+*/
+
+EFI_STATUS
+efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
+{
+	SIMPLE_TEXT_OUTPUT_INTERFACE *conout;
+
+	EFI_INPUT_KEY efi_input_key;
+	EFI_STATUS efi_status;
+
+	InitializeLib(image, systab);
+
+	Print(L"HelloLib application started\n");
+
+	EFI_GUID LoadedImageProtocol=LOADED_IMAGE_PROTOCOL;
+	EFI_GUID DevicePathProtocol=DEVICE_PATH_PROTOCOL;
+	EFI_GUID FileSystemProtocol=SIMPLE_FILE_SYSTEM_PROTOCOL;
+	
+	
+	EFI_LOADED_IMAGE *LoadedImage;
+	EFI_DEVICE_PATH *DevicePath;
+	
+	BS->HandleProtocol(image, 
+	&LoadedImageProtocol, 
+	&LoadedImage);
+	BS->HandleProtocol(LoadedImage->DeviceHandle, 
+	&DevicePathProtocol, 
+	&DevicePath);
+	Print (L"Image device : %s\n", DevicePathToStr (DevicePath));
+	Print (L"Image file   : %s\n", DevicePathToStr (LoadedImage->FilePath));
+	Print (L"Image Base   : %X\n", LoadedImage->ImageBase);
+	Print (L"Image Size   : %X\n", LoadedImage->ImageSize);
+
+
+
+	EFI_FILE_IO_INTERFACE *Vol;
+
+	EFI_FILE *CurDir;
+	EFI_FILE *FileHandle;
+
+	BS->HandleProtocol(LoadedImage->DeviceHandle, &FileSystemProtocol, &Vol);
+	Vol->OpenVolume (Vol, &CurDir);
+
+	char FileName[1024];
+	char *OsKernelBuffer;
+	int i;
+	UINTN Size;
+
+	StrCpy(FileName,DevicePathToStr(LoadedImage->FilePath));
+	for(i=StrLen(FileName);i>=0 && FileName[i]!='\\';i--);
+	FileName[i] = 0;
+	
+	Print(L"%s\n",LoadedImage->LoadOptions);
+	
+	i=0;
+	CHAR16 *LoadOptions = LoadedImage->LoadOptions;
+	
+	
+	
+	while(1) if(LoadOptions[i++]!=L' ') break;
+	while(LoadOptions[i]!=L' '){	
+		if(LoadOptions[i]==0) break;
+		i++;
+	}
+	while(LoadOptions[i]==L' ') if(LoadOptions[i++]==0) break;
+	
+	if(LoadOptions[i++]==0)
+		StrCat(FileName,L"\\image.bin");
+	else{
+		CHAR16 buf[1024];
+		buf[0]='\\';
+		i--;
+		int j;
+		for(j=0;LoadOptions[i+j]!=L' '&&LoadOptions[i+j]!=0;j++)
+			buf[j+1]=LoadOptions[i+j];
+		buf[j+1]=0;
+		StrCat(FileName,buf);
+	}
+	
+	//Print(L"%s\n",FileName);
+
+	EFI_STATUS stat;
+	stat=CurDir->Open(CurDir, &FileHandle, FileName, EFI_FILE_MODE_READ, 0);
+	if(EFI_ERROR(stat)){
+		Print(L"Error Opening Image %s\n",FileName);
+		return 0;
+	}    
+	Size = 0x00400000;
+	BS->AllocatePool(EfiLoaderData, Size, &OsKernelBuffer);
+	FileHandle->Read(FileHandle, &Size, OsKernelBuffer);
+	FileHandle->Close(FileHandle);
+
+	if(Size<1) return 0;
+
+
+	char *  HOS = OsKernelBuffer;  
+	int HOSSize = Size;  
+
+
+	{
+	    UINTN cookie;
+	    void *p=(void *)KERNEL_LOAD_ADDRESS;
+	    UINTN mapsize,descsize;
+	    UINT32 desver;
+	    EFI_STATUS status;
+	    EFI_MEMORY_DESCRIPTOR emd[1024];
+	    
+	        	    
+	    mapsize=1024*sizeof(emd);
+	    
+	    status=BS->AllocatePages(AllocateAnyPages,EfiLoaderData,/*(HOSSize>>12)+1*/ 1,p);
+	    if(EFI_ERROR(status)){
+		Print(L"Error 0\n");
+		if(status == EFI_OUT_OF_RESOURCES) Print(L"EFI_OUT_OF_RESOURCES\n");
+		if(status == EFI_INVALID_PARAMETER) Print(L"EFI_INVALID_PARAMETER\n");
+		if(status == EFI_NOT_FOUND) Print(L"EFI_NOT_FOUND\n");
+		return EFI_SUCCESS;
+	    }
+	    
+	    status=BS->GetMemoryMap(&mapsize,emd,&cookie,&descsize,&desver);
+	    if(EFI_ERROR(status)){
+		Print(L"Error 1\n");
+		return EFI_SUCCESS;
+	    }
+	    status=BS->ExitBootServices(image,cookie);	
+	    if(EFI_ERROR(status)){
+		Print(L"Error 2\n");
+		return EFI_SUCCESS;
+	    }
+	    
+	}
+	int a;
+	
+	for(a=0;a<HOSSize;a++){
+	    ((char *)(0x4400000))[a]=HOS[a];
+	}
+	
+	//Run Kernel
+	asm volatile(	
+		"nop.i 0x00 ;;\n"
+		"movl r15 = 0x4400000 ;;\n"
+		"mov b0 = r15;;"
+		"br.few b0;;\n"
+	);
+	   
+	
+	while(1){
+	    ((volatile int *)(0x80000000000b8000))[0]++;
+	}
+	return EFI_SUCCESS;
+}
