1 1.1 jmcneill /* $NetBSD: AllocPages.c,v 1.1.1.1 2018/08/16 18:17:47 jmcneill Exp $ */ 2 1.1 jmcneill 3 1.1 jmcneill 4 1.1 jmcneill /* 5 1.1 jmcneill * Copyright (C) 2013 Jerry Hoemann <jerry.hoemann (at) hp.com> 6 1.1 jmcneill * 7 1.1 jmcneill * 8 1.1 jmcneill * Application to allocate memory at EFI. Syntax of command 9 1.1 jmcneill * mimics the EFI Boot Service "AllocatePages." 10 1.1 jmcneill * 11 1.1 jmcneill * See UEFI spec 2.3, Section 6.2. 12 1.1 jmcneill * 13 1.1 jmcneill * 14 1.1 jmcneill 15 1.1 jmcneill 16 1.1 jmcneill 17 1.1 jmcneill 18 1.1 jmcneill FS1:\> memmap 19 1.1 jmcneill Type Start End #pages Attributes 20 1.1 jmcneill BS_Code 0000000000000000-0000000000000FFF 0000000000000001 000000000000000F 21 1.1 jmcneill Available 0000000000001000-000000000008DFFF 000000000000008D 000000000000000F 22 1.1 jmcneill Reserved 000000000008E000-000000000008FFFF 0000000000000002 000000000000000F 23 1.1 jmcneill Available 0000000000090000-000000000009FFFF 0000000000000010 000000000000000F 24 1.1 jmcneill Available 0000000000100000-000000000FFFFFFF 000000000000FF00 000000000000000F 25 1.1 jmcneill BS_Code 0000000010000000-0000000010061FFF 0000000000000062 000000000000000F 26 1.1 jmcneill Available 0000000010062000-000000005CDFFFFF 000000000004CD9E 000000000000000F 27 1.1 jmcneill ACPI_NVS 000000005CE00000-000000005DDFFFFF 0000000000001000 000000000000000F 28 1.1 jmcneill BS_Data 000000005DE00000-000000005DFFFFFF 0000000000000200 000000000000000F 29 1.1 jmcneill Available 000000005E000000-000000005EF1CFFF 0000000000000F1D 000000000000000F 30 1.1 jmcneill BS_Data 000000005EF1D000-00000000709FBFFF 0000000000011ADF 000000000000000F 31 1.1 jmcneill Available 00000000709FC000-00000000710E3FFF 00000000000006E8 000000000000000F 32 1.1 jmcneill LoaderCode 00000000710E4000-00000000711FEFFF 000000000000011B 000000000000000F 33 1.1 jmcneill Available 00000000711FF000-0000000071901FFF 0000000000000703 000000000000000F 34 1.1 jmcneill BS_Code 0000000071902000-00000000721FEFFF 00000000000008FD 000000000000000F 35 1.1 jmcneill 36 1.1 jmcneill 37 1.1 jmcneill Example to allocat 5 pages type BootCode at address 20000000 (hex) 38 1.1 jmcneill 39 1.1 jmcneill 40 1.1 jmcneill FS1:\> AllocPages.efi 2 3 5 20000000 41 1.1 jmcneill AllocatePage: __AllocType__ __MemType__ __NumPages__ [__Addr__] 42 1.1 jmcneill __AllocType__ {0,1,2} -- Any, MaxAddr, Addr 43 1.1 jmcneill __MemType__ {0..13}, Reserved ==0, LCode==1, LData==2, BSCode==3, BSData==4, ... 44 1.1 jmcneill __NumPages__ {0..F000000} 45 1.1 jmcneill [__Addr__] 0... 3FFFFFFFFFFF 46 1.1 jmcneill All numbers in hex no leading 0x 47 1.1 jmcneill 48 1.1 jmcneill AllocatPage(2,3,5,20000000) 49 1.1 jmcneill 50 1.1 jmcneill 51 1.1 jmcneill Example to allocat 5 pages type BootCode at address 30000000 (hex) 52 1.1 jmcneill 53 1.1 jmcneill 54 1.1 jmcneill FS1:\> AllocPages.efi 2 3 5 30000000 55 1.1 jmcneill AllocatePage: __AllocType__ __MemType__ __NumPages__ [__Addr__] 56 1.1 jmcneill __AllocType__ {0,1,2} -- Any, MaxAddr, Addr 57 1.1 jmcneill __MemType__ {0..13}, Reserved ==0, LCode==1, LData==2, BSCode==3, BSData==4, ... 58 1.1 jmcneill __NumPages__ {0..F000000} 59 1.1 jmcneill [__Addr__] 0... 3FFFFFFFFFFF 60 1.1 jmcneill All numbers in hex no leading 0x 61 1.1 jmcneill 62 1.1 jmcneill 63 1.1 jmcneill 64 1.1 jmcneill FS1:\> memmap 65 1.1 jmcneill Type Start End #pages Attributes 66 1.1 jmcneill BS_Code 0000000000000000-0000000000000FFF 0000000000000001 000000000000000F 67 1.1 jmcneill Available 0000000000001000-000000000008DFFF 000000000000008D 000000000000000F 68 1.1 jmcneill Reserved 000000000008E000-000000000008FFFF 0000000000000002 000000000000000F 69 1.1 jmcneill Available 0000000000090000-000000000009FFFF 0000000000000010 000000000000000F 70 1.1 jmcneill Available 0000000000100000-000000000FFFFFFF 000000000000FF00 000000000000000F 71 1.1 jmcneill BS_Code 0000000010000000-0000000010061FFF 0000000000000062 000000000000000F 72 1.1 jmcneill Available 0000000010062000-000000001FFFFFFF 000000000000FF9E 000000000000000F 73 1.1 jmcneill BS_Code 0000000020000000-0000000020004FFF 0000000000000005 000000000000000F 74 1.1 jmcneill Available 0000000020005000-000000002FFFFFFF 000000000000FFFB 000000000000000F 75 1.1 jmcneill BS_Code 0000000030000000-0000000030004FFF 0000000000000005 000000000000000F 76 1.1 jmcneill Available 0000000030005000-000000005CDFFFFF 000000000002CDFB 000000000000000F 77 1.1 jmcneill ACPI_NVS 000000005CE00000-000000005DDFFFFF 0000000000001000 000000000000000F 78 1.1 jmcneill BS_Data 000000005DE00000-000000005DFFFFFF 0000000000000200 000000000000000F 79 1.1 jmcneill Available 000000005E000000-000000005EF1CFFF 0000000000000F1D 000000000000000F 80 1.1 jmcneill BS_Data 000000005EF1D000-00000000709FBFFF 0000000000011ADF 000000000000000F 81 1.1 jmcneill Available 00000000709FC000-00000000710E3FFF 00000000000006E8 000000000000000F 82 1.1 jmcneill LoaderCode 00000000710E4000-00000000711FEFFF 000000000000011B 000000000000000F 83 1.1 jmcneill Available 00000000711FF000-0000000071901FFF 0000000000000703 000000000000000F 84 1.1 jmcneill BS_Code 0000000071902000-00000000721FEFFF 00000000000008FD 000000000000000F 85 1.1 jmcneill 86 1.1 jmcneill 87 1.1 jmcneill 88 1.1 jmcneill 89 1.1 jmcneill 90 1.1 jmcneill */ 91 1.1 jmcneill 92 1.1 jmcneill #include <efi.h> 93 1.1 jmcneill #include <efilib.h> 94 1.1 jmcneill 95 1.1 jmcneill 96 1.1 jmcneill #define MAX_NUM_PAGES 0x000000000F000000 97 1.1 jmcneill #define MAX_ADDR ((1ULL << 46) - 1) 98 1.1 jmcneill 99 1.1 jmcneill 100 1.1 jmcneill #ifdef DEBUG 101 1.1 jmcneill #undef DEBUG 102 1.1 jmcneill #endif 103 1.1 jmcneill #define DEBUG 0 104 1.1 jmcneill 105 1.1 jmcneill 106 1.1 jmcneill 107 1.1 jmcneill EFI_STATUS 108 1.1 jmcneill efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) 109 1.1 jmcneill { 110 1.1 jmcneill 111 1.1 jmcneill EFI_STATUS efi_status; 112 1.1 jmcneill CHAR16 **argv; 113 1.1 jmcneill INTN argc; 114 1.1 jmcneill INTN err = 0; 115 1.1 jmcneill #if DEBUG 116 1.1 jmcneill INTN c = 0; 117 1.1 jmcneill #endif 118 1.1 jmcneill INTN AllocType = -1; 119 1.1 jmcneill INTN MemType = -1; 120 1.1 jmcneill INTN NumPages = -1; 121 1.1 jmcneill EFI_PHYSICAL_ADDRESS Addr = 0; 122 1.1 jmcneill 123 1.1 jmcneill InitializeLib(image, systab); 124 1.1 jmcneill 125 1.1 jmcneill Print(L"AllocatePage: __AllocType__ __MemType__ __NumPages__ [__Addr__]\n"); 126 1.1 jmcneill Print(L"__AllocType__ {0,1,2} -- Any, MaxAddr, Addr\n"); 127 1.1 jmcneill Print(L"__MemType__ {0..13}, Reserved ==0, LCode==1, LData==2, BSCode==3, BSData==4, ...\n"); 128 1.1 jmcneill Print(L"__NumPages__ {0..%x}\n", MAX_NUM_PAGES); 129 1.1 jmcneill Print(L"[__Addr__] 0... %llx\n", MAX_ADDR); 130 1.1 jmcneill Print(L"All numbers in hex no leading 0x\n"); 131 1.1 jmcneill Print(L"\n"); 132 1.1 jmcneill 133 1.1 jmcneill #if DEBUG 134 1.1 jmcneill Print(L"Now get argc/argv\n"); 135 1.1 jmcneill #endif 136 1.1 jmcneill argc = GetShellArgcArgv(image, &argv); 137 1.1 jmcneill #if DEBUG 138 1.1 jmcneill Print(L"argc = %d\n", argc); 139 1.1 jmcneill #endif 140 1.1 jmcneill 141 1.1 jmcneill #if DEBUG 142 1.1 jmcneill for (c = 0; c < argc; c++ ) { 143 1.1 jmcneill Print(L"argv[%d] = <%s>\n", c, argv[c]); 144 1.1 jmcneill } 145 1.1 jmcneill #endif 146 1.1 jmcneill if ( (argc < 4) || (argc > 5) ) { 147 1.1 jmcneill Print(L"Wrong argument count\n"); 148 1.1 jmcneill return EFI_SUCCESS; 149 1.1 jmcneill } 150 1.1 jmcneill 151 1.1 jmcneill AllocType = xtoi(argv[1]); 152 1.1 jmcneill MemType = xtoi(argv[2]); 153 1.1 jmcneill NumPages = xtoi(argv[3]); 154 1.1 jmcneill if ( argc == 5 ) Addr = xtoi(argv[4]); 155 1.1 jmcneill 156 1.1 jmcneill if ( (AllocType < 0) || (AllocType > 2)) { 157 1.1 jmcneill Print(L"Invalid AllocType\n"); 158 1.1 jmcneill err++; 159 1.1 jmcneill } 160 1.1 jmcneill if ( (MemType < 0) || (MemType > 13) ) { 161 1.1 jmcneill Print(L"Invalid MemType\n"); 162 1.1 jmcneill err++; 163 1.1 jmcneill } 164 1.1 jmcneill if ( (NumPages < 0) || (NumPages > MAX_NUM_PAGES) ) { 165 1.1 jmcneill Print(L"Inavlid NumPages\n"); 166 1.1 jmcneill err++; 167 1.1 jmcneill } 168 1.1 jmcneill if ( Addr > MAX_ADDR ) { 169 1.1 jmcneill Print(L"Inavlid Address\n"); 170 1.1 jmcneill err++; 171 1.1 jmcneill } 172 1.1 jmcneill if ( err ) { 173 1.1 jmcneill return EFI_INVALID_PARAMETER; 174 1.1 jmcneill } 175 1.1 jmcneill 176 1.1 jmcneill Print(L"AllocatPage(%d,%d,%d,%lx)\n", AllocType, MemType, NumPages, Addr); 177 1.1 jmcneill 178 1.1 jmcneill efi_status = uefi_call_wrapper(BS->AllocatePages, 4, AllocType, MemType, NumPages, &Addr); 179 1.1 jmcneill 180 1.1 jmcneill if ( EFI_ERROR(efi_status) ) { 181 1.1 jmcneill Print(L"Allocate Pages Failed: %d\n", efi_status); 182 1.1 jmcneill return efi_status; 183 1.1 jmcneill } 184 1.1 jmcneill 185 1.1 jmcneill return EFI_SUCCESS; 186 1.1 jmcneill } 187