176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <efi.h>
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <efilib.h>
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanefi_main(
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	EFI_HANDLE image_handle,
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	EFI_SYSTEM_TABLE *systab
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman)
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	EFI_GUID loaded_image_protocol = LOADED_IMAGE_PROTOCOL;
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	EFI_STATUS efi_status;
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	EFI_LOADED_IMAGE *li;
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	UINTN pat = PoolAllocationType;
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	VOID *void_li_p;
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	InitializeLib(image_handle, systab);
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	PoolAllocationType = 2; /* klooj */
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"Hello World! (0xd=0x%x, 13=%d)\n", 13, 13);
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"before InitializeLib(): PoolAllocationType=%d\n",
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		pat);
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L" after InitializeLib(): PoolAllocationType=%d\n",
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		PoolAllocationType);
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/*
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 * Locate loaded_image_handle instance.
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	 */
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"BS->HandleProtocol()  ");
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	efi_status = uefi_call_wrapper(
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		BS->HandleProtocol,
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		3,
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		image_handle,
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		&loaded_image_protocol,
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		&void_li_p);
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	li = void_li_p;
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"%xh (%r)\n", efi_status, efi_status);
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (efi_status != EFI_SUCCESS) {
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		return efi_status;
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"  li: %xh\n", li);
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (!li) {
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		return EFI_UNSUPPORTED;
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"  li->Revision:        %xh\n", li->Revision);
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"  li->ParentHandle:    %xh\n", li->ParentHandle);
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"  li->SystemTable:     %xh\n", li->SystemTable);
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"  li->DeviceHandle:    %xh\n", li->DeviceHandle);
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"  li->FilePath:        %xh\n", li->FilePath);
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"  li->Reserved:        %xh\n", li->Reserved);
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"  li->LoadOptionsSize: %xh\n", li->LoadOptionsSize);
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"  li->LoadOptions:     %xh\n", li->LoadOptions);
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"  li->ImageBase:       %xh\n", li->ImageBase);
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"  li->ImageSize:       %xh\n", li->ImageSize);
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"  li->ImageCodeType:   %xh\n", li->ImageCodeType);
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"  li->ImageDataType:   %xh\n", li->ImageDataType);
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	Print(L"  li->Unload:          %xh\n", li->Unload);
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if 0
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct {
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32                          Revision;
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    EFI_HANDLE                      ParentHandle;
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    struct _EFI_SYSTEM_TABLE        *SystemTable;
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    // Source location of image
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    EFI_HANDLE                      DeviceHandle;
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    EFI_DEVICE_PATH                 *FilePath;
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    VOID                            *Reserved;
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    // Images load options
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT32                          LoadOptionsSize;
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    VOID                            *LoadOptions;
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    // Location of where image was loaded
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    VOID                            *ImageBase;
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINT64                          ImageSize;
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    EFI_MEMORY_TYPE                 ImageCodeType;
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    EFI_MEMORY_TYPE                 ImageDataType;
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    // If the driver image supports a dynamic unload request
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    EFI_IMAGE_UNLOAD                Unload;
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} EFI_LOADED_IMAGE;
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return EFI_SUCCESS;
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
96