annotate bootx64.c @ 14:8b2ce241f5f1 default tip

add files
author one
date Mon, 30 Jun 2014 00:38:55 +0900
parents 56e8a3d49069
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
8d0e5be5d742 test exit boot services
taiki
parents:
diff changeset
1 #include <efi.h>
8d0e5be5d742 test exit boot services
taiki
parents:
diff changeset
2 #include <efilib.h>
8d0e5be5d742 test exit boot services
taiki
parents:
diff changeset
3
1
259b5f0e03ba add registers.h
taiki
parents: 0
diff changeset
4 #include "registers.h"
259b5f0e03ba add registers.h
taiki
parents: 0
diff changeset
5
10
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
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
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
20
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
21 CHAR16*
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
22 get_kernel_name(CHAR16 *options, UINT32 options_size)
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
23 {
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
24 /*
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
25 * skip first option,
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
26 * first option is file name of this efi executable.
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
27 */
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
28
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
29 UINT32 count = options_size;
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
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
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
34 options++;
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
35 count--;
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
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
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
42 }
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
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
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
47 options++;
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
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
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
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
56e8a3d49069 add README to how to use efi executable.
taiki
parents: 11
diff changeset
55
56e8a3d49069 add README to how to use efi executable.
taiki
parents: 11
diff changeset
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
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
60
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
61 return kernel_name;
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
62
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
63 }
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
64
0
8d0e5be5d742 test exit boot services
taiki
parents:
diff changeset
65 EFI_STATUS
10
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
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
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
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
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
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
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
103 if (!EFI_ERROR(status)) {
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
104 break;
9
d6a8d676a1ac add load kernel function, but the function don't have important process
taiki
parents: 8
diff changeset
105 }
10
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
106
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
107 FreePool(path);
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
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
56e8a3d49069 add README to how to use efi executable.
taiki
parents: 11
diff changeset
116 Print(L"Should execute CloseSimpleReadFile function.\n");
56e8a3d49069 add README to how to use efi executable.
taiki
parents: 11
diff changeset
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
8d0e5be5d742 test exit boot services
taiki
parents:
diff changeset
130 efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
8d0e5be5d742 test exit boot services
taiki
parents:
diff changeset
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
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
133
0
8d0e5be5d742 test exit boot services
taiki
parents:
diff changeset
134 InitializeLib(image, systab);
8d0e5be5d742 test exit boot services
taiki
parents:
diff changeset
135
8
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
136 uefi_call_wrapper(systab->ConOut->Reset, 2, systab->ConOut, FALSE);
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
137
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
138 Print(L"---- start ----\n");
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
139
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
140 EFI_STATUS status;
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
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
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
143 status = uefi_call_wrapper(
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
144 BS->OpenProtocol,
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
145 6,
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
146 image,
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
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
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
149 image,
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
150 NULL,
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
151 EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
152
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
153 if (EFI_ERROR(status)) {
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
154 Print(L"OpenProtocol is %r\n", status);
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
155 }
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
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
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
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
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
161 Print(L"%s\n", kernel_name);
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
162
0c55588d01b0 add get kernel name from option
taiki
parents: 9
diff changeset
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
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
166 status = uefi_call_wrapper(
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
167 BS->CloseProtocol,
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
168 4,
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
169 image,
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
170 &LoadedImageProtocol,
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
171 image,
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
172 NULL);
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
173
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
174 if (EFI_ERROR(status)) {
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
175 Print(L"CloseProtocol is %r\n", status);
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
176 }
b4db4b6c8d00 can open protocol and close protocol
taiki
parents: 7
diff changeset
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
8d0e5be5d742 test exit boot services
taiki
parents:
diff changeset
179
8d0e5be5d742 test exit boot services
taiki
parents:
diff changeset
180 return EFI_SUCCESS;
8d0e5be5d742 test exit boot services
taiki
parents:
diff changeset
181 }
9
d6a8d676a1ac add load kernel function, but the function don't have important process
taiki
parents: 8
diff changeset
182