AllocPages.c revision 1.1 1 1.1 jmcneill /* $NetBSD: AllocPages.c,v 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