Mercurial > hg > Members > taiki > EFITest
annotate bootx64.c @ 14:8b2ce241f5f1 default tip
add files
author | one |
---|---|
date | Mon, 30 Jun 2014 00:38:55 +0900 |
parents | 56e8a3d49069 |
children |
rev | line source |
---|---|
0 | 1 #include <efi.h> |
2 #include <efilib.h> | |
3 | |
1 | 4 #include "registers.h" |
5 | |
10 | 6 CHAR16 *DEFAULT_KERNEL_NAME = L"my_kernel"; |
11
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
7 |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
8 EFI_STATUS |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
9 load_image(SIMPLE_READ_FILE file) |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
10 { |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
11 Print(L"Start load image.\n"); |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
12 return EFI_SUCCESS; |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
13 } |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
14 |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
15 UINTN |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
16 is_space(CHAR16 c) |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
17 { |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
18 return c == L' ' || c == L'\t' || c == L'\r' || c == L'\n'; |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
19 } |
10 | 20 |
21 CHAR16* | |
22 get_kernel_name(CHAR16 *options, UINT32 options_size) | |
23 { | |
24 /* | |
25 * skip first option, | |
26 * first option is file name of this efi executable. | |
27 */ | |
28 | |
29 UINT32 count = options_size; | |
30 | |
11
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
31 Print(L"Options size: %d\n", options_size); |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
32 |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
33 while(count && !is_space(*options)) { |
10 | 34 options++; |
35 count--; | |
36 } | |
11
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
37 |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
38 Print(L"Count size: %d\n", count); |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
39 |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
40 while (is_space(*options)) { |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
41 options++; |
10 | 42 } |
43 | |
11
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
44 CHAR16 *start_ptr = options; |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
45 |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
46 while(!is_space(*options)) { |
10 | 47 options++; |
48 } | |
11
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
49 |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
50 Print(L"optioins -%s-, start_ptr -%s-\n", options, start_ptr); |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
51 |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
52 CHAR16 *kernel_name = (CHAR16 *)AllocatePool((options - start_ptr + 1) * sizeof(CHAR16)); |
10 | 53 |
11
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
54 RtCopyMem(kernel_name, start_ptr, (options - start_ptr) * sizeof(CHAR16)); |
12 | 55 |
56 // delete last 0 | |
11
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
57 kernel_name[options - start_ptr] = 0; |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
58 |
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
59 Print(L"kernel name: -%s- name size: %d\n", kernel_name, (options - start_ptr)); |
10 | 60 |
61 return kernel_name; | |
62 | |
63 } | |
64 | |
0 | 65 EFI_STATUS |
10 | 66 load_kernel(CHAR16 *kernel_name) |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
67 { |
10 | 68 Print(L"Start load kernel: %s\n", kernel_name); |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
69 |
11
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
70 EFI_STATUS status = EFI_SUCCESS; |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
71 UINTN handle_count; |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
72 EFI_HANDLE *handle_buffer; |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
73 |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
74 status = uefi_call_wrapper(BS->LocateHandleBuffer, |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
75 5, |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
76 ByProtocol, |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
77 &FileSystemProtocol, |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
78 NULL, |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
79 &handle_count, |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
80 &handle_buffer); |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
81 |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
82 if (EFI_ERROR(status)) { |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
83 Print(L"LocateHandleBuffer is %r\n", status); |
11
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
84 return status; |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
85 } |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
86 |
11
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
87 EFI_DEVICE_PATH *path = NULL; |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
88 UINTN handle_idx = 0; |
11
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
89 SIMPLE_READ_FILE read_handle; |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
90 |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
91 for (handle_idx = 0; handle_idx < handle_count; handle_idx++) { |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
92 EFI_HANDLE device_handle; |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
93 |
10 | 94 path = FileDevicePath(handle_buffer[handle_idx], kernel_name); |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
95 |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
96 if (!path) { |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
97 status = EFI_NOT_FOUND; |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
98 break; |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
99 } |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
100 |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
101 status = OpenSimpleReadFile(TRUE, NULL, 0, &path, &device_handle, &read_handle); |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
102 |
10 | 103 if (!EFI_ERROR(status)) { |
104 break; | |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
105 } |
10 | 106 |
107 FreePool(path); | |
108 path = NULL; | |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
109 } |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
110 |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
111 if (!EFI_ERROR(status)) { |
11
7d337b6fb379
fix get_kernel_name, correct get kernel name from options
taiki
parents:
10
diff
changeset
|
112 status = load_image(read_handle); |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
113 } |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
114 |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
115 if (read_handle) { |
12 | 116 Print(L"Should execute CloseSimpleReadFile function.\n"); |
117 //CloseSimpleReadFile(read_handle); | |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
118 } |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
119 |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
120 if (path) { |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
121 FreePool(path); |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
122 } |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
123 |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
124 FreePool(handle_buffer); |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
125 |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
126 return status; |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
127 } |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
128 |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
129 EFI_STATUS |
0 | 130 efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) |
131 { | |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
132 EFI_LOADED_IMAGE *loaded_image; |
8 | 133 |
0 | 134 InitializeLib(image, systab); |
135 | |
8 | 136 uefi_call_wrapper(systab->ConOut->Reset, 2, systab->ConOut, FALSE); |
137 | |
138 Print(L"---- start ----\n"); | |
139 | |
140 EFI_STATUS status; | |
141 | |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
142 Print(L"Open LoadedImage Protocol\n"); |
8 | 143 status = uefi_call_wrapper( |
144 BS->OpenProtocol, | |
145 6, | |
146 image, | |
147 &LoadedImageProtocol, | |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
148 (void **)&loaded_image, |
8 | 149 image, |
150 NULL, | |
151 EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL); | |
152 | |
153 if (EFI_ERROR(status)) { | |
154 Print(L"OpenProtocol is %r\n", status); | |
155 } | |
156 | |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
157 Print(L"%s\n", loaded_image->LoadOptions); |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
158 |
10 | 159 CHAR16 *kernel_name = get_kernel_name(loaded_image->LoadOptions, loaded_image->LoadOptionsSize); |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
160 |
10 | 161 Print(L"%s\n", kernel_name); |
162 | |
163 load_kernel(kernel_name); | |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
164 |
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
165 Print(L"Close LoadedImage Protocol\n"); |
8 | 166 status = uefi_call_wrapper( |
167 BS->CloseProtocol, | |
168 4, | |
169 image, | |
170 &LoadedImageProtocol, | |
171 image, | |
172 NULL); | |
173 | |
174 if (EFI_ERROR(status)) { | |
175 Print(L"CloseProtocol is %r\n", status); | |
176 } | |
177 | |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
178 Print(L"---- Faild start kernel ----\n"); |
0 | 179 |
180 return EFI_SUCCESS; | |
181 } | |
9
d6a8d676a1ac
add load kernel function, but the function don't have important process
taiki
parents:
8
diff
changeset
|
182 |