1
2
3
4
5
6
7
8
9#define LOG_CATEGORY LOGC_EFI
10
11#include <common.h>
12#include <efi_loader.h>
13#include <efi_variable.h>
14#include <env.h>
15#include <fdtdec.h>
16#include <fs.h>
17#include <malloc.h>
18#include <mapmem.h>
19#include <sort.h>
20#include <asm/global_data.h>
21
22#include <crypto/pkcs7.h>
23#include <crypto/pkcs7_parser.h>
24#include <linux/err.h>
25
26DECLARE_GLOBAL_DATA_PTR;
27
28const efi_guid_t efi_guid_capsule_report = EFI_CAPSULE_REPORT_GUID;
29static const efi_guid_t efi_guid_firmware_management_capsule_id =
30 EFI_FIRMWARE_MANAGEMENT_CAPSULE_ID_GUID;
31const efi_guid_t efi_guid_firmware_management_protocol =
32 EFI_FIRMWARE_MANAGEMENT_PROTOCOL_GUID;
33
34#ifdef CONFIG_EFI_CAPSULE_ON_DISK
35
36static struct efi_file_handle *bootdev_root;
37#endif
38
39
40
41
42
43
44
45
46
47
48
49static __maybe_unused unsigned int get_last_capsule(void)
50{
51 u16 value16[11];
52 char value[5];
53 efi_uintn_t size;
54 unsigned long index = 0xffff;
55 efi_status_t ret;
56 int i;
57
58 size = sizeof(value16);
59 ret = efi_get_variable_int(L"CapsuleLast", &efi_guid_capsule_report,
60 NULL, &size, value16, NULL);
61 if (ret != EFI_SUCCESS || size != 22 ||
62 u16_strncmp(value16, L"Capsule", 7))
63 goto err;
64 for (i = 0; i < 4; ++i) {
65 u16 c = value16[i + 7];
66
67 if (!c || c > 0x7f)
68 goto err;
69 value[i] = c;
70 }
71 value[4] = 0;
72 if (strict_strtoul(value, 16, &index))
73 index = 0xffff;
74err:
75 return index;
76}
77
78
79
80
81
82
83
84
85
86static __maybe_unused
87void set_capsule_result(int index, struct efi_capsule_header *capsule,
88 efi_status_t return_status)
89{
90 u16 variable_name16[12];
91 struct efi_capsule_result_variable_header result;
92 struct efi_time time;
93 efi_status_t ret;
94
95 efi_create_indexed_name(variable_name16, sizeof(variable_name16),
96 "Capsule", index);
97 result.variable_total_size = sizeof(result);
98 result.capsule_guid = capsule->capsule_guid;
99 ret = EFI_CALL((*efi_runtime_services.get_time)(&time, NULL));
100 if (ret == EFI_SUCCESS)
101 memcpy(&result.capsule_processed, &time, sizeof(time));
102 else
103 memset(&result.capsule_processed, 0, sizeof(time));
104 result.capsule_status = return_status;
105 ret = efi_set_variable_int(variable_name16, &efi_guid_capsule_report,
106 EFI_VARIABLE_NON_VOLATILE |
107 EFI_VARIABLE_BOOTSERVICE_ACCESS |
108 EFI_VARIABLE_RUNTIME_ACCESS,
109 sizeof(result), &result, false);
110 if (ret != EFI_SUCCESS) {
111 log_err("Setting %ls failed\n", variable_name16);
112 return;
113 }
114
115
116 ret = efi_set_variable_int(L"CapsuleLast", &efi_guid_capsule_report,
117 EFI_VARIABLE_READ_ONLY |
118 EFI_VARIABLE_NON_VOLATILE |
119 EFI_VARIABLE_BOOTSERVICE_ACCESS |
120 EFI_VARIABLE_RUNTIME_ACCESS,
121 22, variable_name16, false);
122 if (ret != EFI_SUCCESS)
123 log_err("Setting %ls failed\n", L"CapsuleLast");
124}
125
126#ifdef CONFIG_EFI_CAPSULE_FIRMWARE_MANAGEMENT
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142static struct efi_firmware_management_protocol *
143efi_fmp_find(efi_guid_t *image_type, u64 instance, efi_handle_t *handles,
144 efi_uintn_t no_handles)
145{
146 efi_handle_t *handle;
147 struct efi_firmware_management_protocol *fmp;
148 struct efi_firmware_image_descriptor *image_info, *desc;
149 efi_uintn_t info_size, descriptor_size;
150 u32 descriptor_version;
151 u8 descriptor_count;
152 u32 package_version;
153 u16 *package_version_name;
154 bool found = false;
155 int i, j;
156 efi_status_t ret;
157
158 for (i = 0, handle = handles; i < no_handles; i++, handle++) {
159 ret = EFI_CALL(efi_handle_protocol(
160 *handle,
161 &efi_guid_firmware_management_protocol,
162 (void **)&fmp));
163 if (ret != EFI_SUCCESS)
164 continue;
165
166
167 info_size = 0;
168 image_info = NULL;
169 descriptor_version = 0;
170 descriptor_count = 0;
171 descriptor_size = 0;
172 package_version = 0;
173 package_version_name = NULL;
174 ret = EFI_CALL(fmp->get_image_info(fmp, &info_size,
175 image_info,
176 &descriptor_version,
177 &descriptor_count,
178 &descriptor_size,
179 &package_version,
180 &package_version_name));
181 if (ret != EFI_BUFFER_TOO_SMALL)
182 goto skip;
183
184 image_info = malloc(info_size);
185 if (!image_info)
186 goto skip;
187
188 ret = EFI_CALL(fmp->get_image_info(fmp, &info_size,
189 image_info,
190 &descriptor_version,
191 &descriptor_count,
192 &descriptor_size,
193 &package_version,
194 &package_version_name));
195 if (ret != EFI_SUCCESS ||
196 descriptor_version != EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION)
197 goto skip;
198
199
200 for (j = 0, desc = image_info; j < descriptor_count;
201 j++, desc = (void *)desc + descriptor_size) {
202 log_debug("+++ desc[%d] index: %d, name: %ls\n",
203 j, desc->image_index, desc->image_id_name);
204 if (!guidcmp(&desc->image_type_id, image_type) &&
205 (!instance ||
206 !desc->hardware_instance ||
207 desc->hardware_instance == instance))
208 found = true;
209 }
210
211skip:
212 efi_free_pool(package_version_name);
213 free(image_info);
214 EFI_CALL(efi_close_protocol(
215 (efi_handle_t)fmp,
216 &efi_guid_firmware_management_protocol,
217 NULL, NULL));
218 if (found)
219 return fmp;
220 }
221
222 return NULL;
223}
224
225
226
227
228
229
230
231
232
233
234
235static efi_status_t efi_remove_auth_hdr(void **image, efi_uintn_t *image_size)
236{
237 struct efi_firmware_image_authentication *auth_hdr;
238 efi_status_t ret = EFI_INVALID_PARAMETER;
239
240 auth_hdr = (struct efi_firmware_image_authentication *)*image;
241 if (*image_size < sizeof(*auth_hdr))
242 goto out;
243
244 if (auth_hdr->auth_info.hdr.dwLength <=
245 offsetof(struct win_certificate_uefi_guid, cert_data))
246 goto out;
247
248 *image = (uint8_t *)*image + sizeof(auth_hdr->monotonic_count) +
249 auth_hdr->auth_info.hdr.dwLength;
250 *image_size = *image_size - auth_hdr->auth_info.hdr.dwLength -
251 sizeof(auth_hdr->monotonic_count);
252
253 ret = EFI_SUCCESS;
254out:
255 return ret;
256}
257
258#if defined(CONFIG_EFI_CAPSULE_AUTHENTICATE)
259int efi_get_public_key_data(void **pkey, efi_uintn_t *pkey_len)
260{
261 const void *fdt_blob = gd->fdt_blob;
262 const void *blob;
263 const char *cnode_name = "capsule-key";
264 const char *snode_name = "signature";
265 int sig_node;
266 int len;
267
268 sig_node = fdt_subnode_offset(fdt_blob, 0, snode_name);
269 if (sig_node < 0) {
270 log_err("Unable to get signature node offset\n");
271
272 return -FDT_ERR_NOTFOUND;
273 }
274
275 blob = fdt_getprop(fdt_blob, sig_node, cnode_name, &len);
276
277 if (!blob || len < 0) {
278 log_err("Unable to get capsule-key value\n");
279 *pkey = NULL;
280 *pkey_len = 0;
281
282 return -FDT_ERR_NOTFOUND;
283 }
284
285 *pkey = (void *)blob;
286 *pkey_len = len;
287
288 return 0;
289}
290
291efi_status_t efi_capsule_authenticate(const void *capsule, efi_uintn_t capsule_size,
292 void **image, efi_uintn_t *image_size)
293{
294 u8 *buf;
295 int ret;
296 void *fdt_pkey, *pkey;
297 efi_uintn_t pkey_len;
298 uint64_t monotonic_count;
299 struct efi_signature_store *truststore;
300 struct pkcs7_message *capsule_sig;
301 struct efi_image_regions *regs;
302 struct efi_firmware_image_authentication *auth_hdr;
303 efi_status_t status;
304
305 status = EFI_SECURITY_VIOLATION;
306 capsule_sig = NULL;
307 truststore = NULL;
308 regs = NULL;
309
310
311 if (capsule == NULL || capsule_size == 0)
312 goto out;
313
314 *image = (uint8_t *)capsule;
315 *image_size = capsule_size;
316 if (efi_remove_auth_hdr(image, image_size) != EFI_SUCCESS)
317 goto out;
318
319 auth_hdr = (struct efi_firmware_image_authentication *)capsule;
320 if (guidcmp(&auth_hdr->auth_info.cert_type, &efi_guid_cert_type_pkcs7))
321 goto out;
322
323 memcpy(&monotonic_count, &auth_hdr->monotonic_count,
324 sizeof(monotonic_count));
325
326
327 regs = calloc(sizeof(*regs) + sizeof(struct image_region) * 2, 1);
328 if (!regs)
329 goto out;
330
331 regs->max = 2;
332 efi_image_region_add(regs, (uint8_t *)*image,
333 (uint8_t *)*image + *image_size, 1);
334
335 efi_image_region_add(regs, (uint8_t *)&monotonic_count,
336 (uint8_t *)&monotonic_count + sizeof(monotonic_count),
337 1);
338
339 capsule_sig = efi_parse_pkcs7_header(auth_hdr->auth_info.cert_data,
340 auth_hdr->auth_info.hdr.dwLength
341 - sizeof(auth_hdr->auth_info),
342 &buf);
343 if (IS_ERR(capsule_sig)) {
344 debug("Parsing variable's pkcs7 header failed\n");
345 capsule_sig = NULL;
346 goto out;
347 }
348
349 ret = efi_get_public_key_data(&fdt_pkey, &pkey_len);
350 if (ret < 0)
351 goto out;
352
353 pkey = malloc(pkey_len);
354 if (!pkey)
355 goto out;
356
357 memcpy(pkey, fdt_pkey, pkey_len);
358 truststore = efi_build_signature_store(pkey, pkey_len);
359 if (!truststore)
360 goto out;
361
362
363 if (efi_signature_verify(regs, capsule_sig, truststore, NULL)) {
364 debug("Verified\n");
365 } else {
366 debug("Verifying variable's signature failed\n");
367 goto out;
368 }
369
370 status = EFI_SUCCESS;
371
372out:
373 efi_sigstore_free(truststore);
374 pkcs7_free_message(capsule_sig);
375 free(regs);
376
377 return status;
378}
379#else
380efi_status_t efi_capsule_authenticate(const void *capsule, efi_uintn_t capsule_size,
381 void **image, efi_uintn_t *image_size)
382{
383 return EFI_UNSUPPORTED;
384}
385#endif
386
387
388
389
390
391
392
393
394
395
396
397static efi_status_t efi_capsule_update_firmware(
398 struct efi_capsule_header *capsule_data)
399{
400 struct efi_firmware_management_capsule_header *capsule;
401 struct efi_firmware_management_capsule_image_header *image;
402 size_t capsule_size, image_binary_size;
403 void *image_binary, *vendor_code;
404 efi_handle_t *handles;
405 efi_uintn_t no_handles;
406 int item;
407 struct efi_firmware_management_protocol *fmp;
408 u16 *abort_reason;
409 efi_status_t ret = EFI_SUCCESS;
410
411
412 if (capsule_data->header_size < sizeof(*capsule) ||
413 capsule_data->header_size >= capsule_data->capsule_image_size)
414 return EFI_INVALID_PARAMETER;
415
416 capsule = (void *)capsule_data + capsule_data->header_size;
417 capsule_size = capsule_data->capsule_image_size
418 - capsule_data->header_size;
419
420 if (capsule->version != 0x00000001)
421 return EFI_UNSUPPORTED;
422
423 handles = NULL;
424 ret = EFI_CALL(efi_locate_handle_buffer(
425 BY_PROTOCOL,
426 &efi_guid_firmware_management_protocol,
427 NULL, &no_handles, (efi_handle_t **)&handles));
428 if (ret != EFI_SUCCESS)
429 return EFI_UNSUPPORTED;
430
431
432 for (item = capsule->embedded_driver_count;
433 item < capsule->embedded_driver_count
434 + capsule->payload_item_count; item++) {
435
436 if ((capsule->item_offset_list[item] + sizeof(*image)
437 >= capsule_size)) {
438 log_err("Capsule does not have enough data\n");
439 ret = EFI_INVALID_PARAMETER;
440 goto out;
441 }
442
443 image = (void *)capsule + capsule->item_offset_list[item];
444
445 if (image->version != 0x00000003) {
446 ret = EFI_UNSUPPORTED;
447 goto out;
448 }
449
450
451
452 fmp = efi_fmp_find(&image->update_image_type_id,
453 image->update_hardware_instance,
454 handles, no_handles);
455 if (!fmp) {
456 log_err("FMP driver not found for firmware type %pUl, hardware instance %lld\n",
457 &image->update_image_type_id,
458 image->update_hardware_instance);
459 ret = EFI_UNSUPPORTED;
460 goto out;
461 }
462
463
464 if (IS_ENABLED(CONFIG_EFI_CAPSULE_AUTHENTICATE) &&
465 !(image->image_capsule_support &
466 CAPSULE_SUPPORT_AUTHENTICATION)) {
467
468 ret = EFI_SECURITY_VIOLATION;
469 goto out;
470 }
471
472 image_binary = (void *)image + sizeof(*image);
473 image_binary_size = image->update_image_size;
474 vendor_code = image_binary + image_binary_size;
475 if (!IS_ENABLED(CONFIG_EFI_CAPSULE_AUTHENTICATE) &&
476 (image->image_capsule_support &
477 CAPSULE_SUPPORT_AUTHENTICATION)) {
478 ret = efi_remove_auth_hdr(&image_binary,
479 &image_binary_size);
480 if (ret != EFI_SUCCESS)
481 goto out;
482 }
483
484 abort_reason = NULL;
485 ret = EFI_CALL(fmp->set_image(fmp, image->update_image_index,
486 image_binary,
487 image_binary_size,
488 vendor_code, NULL,
489 &abort_reason));
490 if (ret != EFI_SUCCESS) {
491 log_err("Firmware update failed: %ls\n",
492 abort_reason);
493 efi_free_pool(abort_reason);
494 goto out;
495 }
496 }
497
498out:
499 efi_free_pool(handles);
500
501 return ret;
502}
503#else
504static efi_status_t efi_capsule_update_firmware(
505 struct efi_capsule_header *capsule_data)
506{
507 return EFI_UNSUPPORTED;
508}
509#endif
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524efi_status_t EFIAPI efi_update_capsule(
525 struct efi_capsule_header **capsule_header_array,
526 efi_uintn_t capsule_count,
527 u64 scatter_gather_list)
528{
529 struct efi_capsule_header *capsule;
530 unsigned int i;
531 efi_status_t ret;
532
533 EFI_ENTRY("%p, %zu, %llu\n", capsule_header_array, capsule_count,
534 scatter_gather_list);
535
536 if (!capsule_count) {
537 ret = EFI_INVALID_PARAMETER;
538 goto out;
539 }
540
541 ret = EFI_SUCCESS;
542 for (i = 0, capsule = *capsule_header_array; i < capsule_count;
543 i++, capsule = *(++capsule_header_array)) {
544
545 if (capsule->header_size < sizeof(*capsule) ||
546 capsule->capsule_image_size < sizeof(*capsule)) {
547 log_err("Capsule does not have enough data\n");
548 continue;
549 }
550
551 log_debug("Capsule[%d] (guid:%pUl)\n",
552 i, &capsule->capsule_guid);
553 if (!guidcmp(&capsule->capsule_guid,
554 &efi_guid_firmware_management_capsule_id)) {
555 ret = efi_capsule_update_firmware(capsule);
556 } else {
557 log_err("Unsupported capsule type: %pUl\n",
558 &capsule->capsule_guid);
559 ret = EFI_UNSUPPORTED;
560 }
561
562 if (ret != EFI_SUCCESS)
563 goto out;
564 }
565
566 if (IS_ENABLED(CONFIG_EFI_ESRT)) {
567
568 ret = efi_esrt_populate();
569 if (ret != EFI_SUCCESS)
570 log_warning("ESRT update failed\n");
571 }
572out:
573
574 return EFI_EXIT(ret);
575}
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591efi_status_t EFIAPI efi_query_capsule_caps(
592 struct efi_capsule_header **capsule_header_array,
593 efi_uintn_t capsule_count,
594 u64 *maximum_capsule_size,
595 u32 *reset_type)
596{
597 struct efi_capsule_header *capsule __attribute__((unused));
598 unsigned int i;
599 efi_status_t ret;
600
601 EFI_ENTRY("%p, %zu, %p, %p\n", capsule_header_array, capsule_count,
602 maximum_capsule_size, reset_type);
603
604 if (!maximum_capsule_size) {
605 ret = EFI_INVALID_PARAMETER;
606 goto out;
607 }
608
609 *maximum_capsule_size = U64_MAX;
610 *reset_type = EFI_RESET_COLD;
611
612 ret = EFI_SUCCESS;
613 for (i = 0, capsule = *capsule_header_array; i < capsule_count;
614 i++, capsule = *(++capsule_header_array)) {
615
616 }
617out:
618 return EFI_EXIT(ret);
619}
620
621#ifdef CONFIG_EFI_CAPSULE_ON_DISK
622
623
624
625
626
627
628
629
630
631static efi_status_t get_dp_device(u16 *boot_var,
632 struct efi_device_path **device_dp)
633{
634 void *buf = NULL;
635 efi_uintn_t size;
636 struct efi_load_option lo;
637 struct efi_device_path *file_dp;
638 efi_status_t ret;
639
640 size = 0;
641 ret = efi_get_variable_int(boot_var, &efi_global_variable_guid,
642 NULL, &size, NULL, NULL);
643 if (ret == EFI_BUFFER_TOO_SMALL) {
644 buf = malloc(size);
645 if (!buf)
646 return EFI_OUT_OF_RESOURCES;
647 ret = efi_get_variable_int(boot_var, &efi_global_variable_guid,
648 NULL, &size, buf, NULL);
649 }
650 if (ret != EFI_SUCCESS)
651 return ret;
652
653 efi_deserialize_load_option(&lo, buf, &size);
654
655 if (lo.attributes & LOAD_OPTION_ACTIVE) {
656 efi_dp_split_file_path(lo.file_path, device_dp, &file_dp);
657 efi_free_pool(file_dp);
658
659 ret = EFI_SUCCESS;
660 } else {
661 ret = EFI_NOT_FOUND;
662 }
663
664 free(buf);
665
666 return ret;
667}
668
669
670
671
672
673
674
675
676
677
678static bool device_is_present_and_system_part(struct efi_device_path *dp)
679{
680 efi_handle_t handle;
681
682 handle = efi_dp_find_obj(dp, NULL);
683 if (!handle)
684 return false;
685
686 return efi_disk_is_system_part(handle);
687}
688
689
690
691
692
693
694
695
696
697static efi_status_t find_boot_device(void)
698{
699 char boot_var[9];
700 u16 boot_var16[9], *p, bootnext, *boot_order = NULL;
701 efi_uintn_t size;
702 int i, num;
703 struct efi_simple_file_system_protocol *volume;
704 struct efi_device_path *boot_dev = NULL;
705 efi_status_t ret;
706
707
708 bootnext = 0;
709 size = sizeof(bootnext);
710 ret = efi_get_variable_int(L"BootNext",
711 (efi_guid_t *)&efi_global_variable_guid,
712 NULL, &size, &bootnext, NULL);
713 if (ret == EFI_SUCCESS || ret == EFI_BUFFER_TOO_SMALL) {
714
715 if (ret == EFI_BUFFER_TOO_SMALL || size != sizeof(u16)) {
716 log_err("BootNext must be 16-bit integer\n");
717 goto skip;
718 }
719 sprintf((char *)boot_var, "Boot%04X", bootnext);
720 p = boot_var16;
721 utf8_utf16_strcpy(&p, boot_var);
722
723 ret = get_dp_device(boot_var16, &boot_dev);
724 if (ret == EFI_SUCCESS) {
725 if (device_is_present_and_system_part(boot_dev)) {
726 goto found;
727 } else {
728 efi_free_pool(boot_dev);
729 boot_dev = NULL;
730 }
731 }
732 }
733
734skip:
735
736 size = 0;
737 ret = efi_get_variable_int(L"BootOrder", &efi_global_variable_guid,
738 NULL, &size, NULL, NULL);
739 if (ret == EFI_BUFFER_TOO_SMALL) {
740 boot_order = malloc(size);
741 if (!boot_order) {
742 ret = EFI_OUT_OF_RESOURCES;
743 goto out;
744 }
745
746 ret = efi_get_variable_int(L"BootOrder",
747 &efi_global_variable_guid,
748 NULL, &size, boot_order, NULL);
749 }
750 if (ret != EFI_SUCCESS)
751 goto out;
752
753
754 num = size / sizeof(u16);
755 for (i = 0; i < num; i++) {
756 sprintf((char *)boot_var, "Boot%04X", boot_order[i]);
757 p = boot_var16;
758 utf8_utf16_strcpy(&p, boot_var);
759 ret = get_dp_device(boot_var16, &boot_dev);
760 if (ret != EFI_SUCCESS)
761 continue;
762
763 if (device_is_present_and_system_part(boot_dev))
764 break;
765
766 efi_free_pool(boot_dev);
767 boot_dev = NULL;
768 }
769found:
770 if (boot_dev) {
771 log_debug("Boot device %pD\n", boot_dev);
772
773 volume = efi_fs_from_path(boot_dev);
774 if (!volume)
775 ret = EFI_DEVICE_ERROR;
776 else
777 ret = EFI_CALL(volume->open_volume(volume,
778 &bootdev_root));
779 efi_free_pool(boot_dev);
780 } else {
781 ret = EFI_NOT_FOUND;
782 }
783out:
784 free(boot_order);
785
786 return ret;
787}
788
789
790
791
792
793
794
795
796
797
798
799
800static efi_status_t efi_capsule_scan_dir(u16 ***files, unsigned int *num)
801{
802 struct efi_file_handle *dirh;
803 struct efi_file_info *dirent;
804 efi_uintn_t dirent_size, tmp_size;
805 unsigned int count;
806 u16 **tmp_files;
807 efi_status_t ret;
808
809 ret = find_boot_device();
810 if (ret == EFI_NOT_FOUND) {
811 log_debug("Boot device is not set\n");
812 *num = 0;
813 return EFI_SUCCESS;
814 } else if (ret != EFI_SUCCESS) {
815 return EFI_DEVICE_ERROR;
816 }
817
818
819 ret = EFI_CALL((*bootdev_root->open)(bootdev_root, &dirh,
820 EFI_CAPSULE_DIR,
821 EFI_FILE_MODE_READ, 0));
822 if (ret != EFI_SUCCESS) {
823 *num = 0;
824 return EFI_SUCCESS;
825 }
826
827 dirent_size = 256;
828 dirent = malloc(dirent_size);
829 if (!dirent)
830 return EFI_OUT_OF_RESOURCES;
831
832 count = 0;
833 while (1) {
834 tmp_size = dirent_size;
835 ret = EFI_CALL((*dirh->read)(dirh, &tmp_size, dirent));
836 if (ret == EFI_BUFFER_TOO_SMALL) {
837 struct efi_file_info *old_dirent = dirent;
838
839 dirent = realloc(dirent, tmp_size);
840 if (!dirent) {
841 dirent = old_dirent;
842 ret = EFI_OUT_OF_RESOURCES;
843 goto err;
844 }
845 dirent_size = tmp_size;
846 ret = EFI_CALL((*dirh->read)(dirh, &tmp_size, dirent));
847 }
848 if (ret != EFI_SUCCESS)
849 goto err;
850 if (!tmp_size)
851 break;
852
853 if (!(dirent->attribute & EFI_FILE_DIRECTORY))
854 count++;
855 }
856
857 ret = EFI_CALL((*dirh->setpos)(dirh, 0));
858 if (ret != EFI_SUCCESS)
859 goto err;
860
861
862 tmp_files = malloc(count * sizeof(*tmp_files));
863 if (!tmp_files) {
864 ret = EFI_OUT_OF_RESOURCES;
865 goto err;
866 }
867
868 count = 0;
869 while (1) {
870 tmp_size = dirent_size;
871 ret = EFI_CALL((*dirh->read)(dirh, &tmp_size, dirent));
872 if (ret != EFI_SUCCESS)
873 goto err;
874 if (!tmp_size)
875 break;
876
877 if (!(dirent->attribute & EFI_FILE_DIRECTORY) &&
878 u16_strcmp(dirent->file_name, L".") &&
879 u16_strcmp(dirent->file_name, L".."))
880 tmp_files[count++] = u16_strdup(dirent->file_name);
881 }
882
883 EFI_CALL((*dirh->close)(dirh));
884
885
886
887 qsort(tmp_files, count, sizeof(*tmp_files),
888 (int (*)(const void *, const void *))strcasecmp);
889 *files = tmp_files;
890 *num = count;
891 ret = EFI_SUCCESS;
892err:
893 free(dirent);
894
895 return ret;
896}
897
898
899
900
901
902
903
904
905
906
907static efi_status_t efi_capsule_read_file(const u16 *filename,
908 struct efi_capsule_header **capsule)
909{
910 struct efi_file_handle *dirh, *fh;
911 struct efi_file_info *file_info = NULL;
912 struct efi_capsule_header *buf = NULL;
913 efi_uintn_t size;
914 efi_status_t ret;
915
916 ret = EFI_CALL((*bootdev_root->open)(bootdev_root, &dirh,
917 EFI_CAPSULE_DIR,
918 EFI_FILE_MODE_READ, 0));
919 if (ret != EFI_SUCCESS)
920 return ret;
921 ret = EFI_CALL((*dirh->open)(dirh, &fh, (u16 *)filename,
922 EFI_FILE_MODE_READ, 0));
923
924 EFI_CALL((*dirh->close)(dirh));
925 if (ret != EFI_SUCCESS)
926 return ret;
927
928
929 size = 0;
930 ret = EFI_CALL((*fh->getinfo)(fh, &efi_file_info_guid,
931 &size, file_info));
932 if (ret == EFI_BUFFER_TOO_SMALL) {
933 file_info = malloc(size);
934 if (!file_info) {
935 ret = EFI_OUT_OF_RESOURCES;
936 goto err;
937 }
938 ret = EFI_CALL((*fh->getinfo)(fh, &efi_file_info_guid,
939 &size, file_info));
940 }
941 if (ret != EFI_SUCCESS)
942 goto err;
943 size = file_info->file_size;
944 free(file_info);
945 buf = malloc(size);
946 if (!buf) {
947 ret = EFI_OUT_OF_RESOURCES;
948 goto err;
949 }
950
951
952 ret = EFI_CALL((*fh->read)(fh, &size, buf));
953 if (ret == EFI_SUCCESS) {
954 if (size >= buf->capsule_image_size) {
955 *capsule = buf;
956 } else {
957 free(buf);
958 ret = EFI_INVALID_PARAMETER;
959 }
960 } else {
961 free(buf);
962 }
963err:
964 EFI_CALL((*fh->close)(fh));
965
966 return ret;
967}
968
969
970
971
972
973
974
975
976
977static efi_status_t efi_capsule_delete_file(const u16 *filename)
978{
979 struct efi_file_handle *dirh, *fh;
980 efi_status_t ret;
981
982 ret = EFI_CALL((*bootdev_root->open)(bootdev_root, &dirh,
983 EFI_CAPSULE_DIR,
984 EFI_FILE_MODE_READ, 0));
985 if (ret != EFI_SUCCESS)
986 return ret;
987 ret = EFI_CALL((*dirh->open)(dirh, &fh, (u16 *)filename,
988 EFI_FILE_MODE_READ, 0));
989
990 EFI_CALL((*dirh->close)(dirh));
991
992 if (ret == EFI_SUCCESS)
993 ret = EFI_CALL((*fh->delete)(fh));
994
995 return ret;
996}
997
998
999
1000
1001
1002
1003static void efi_capsule_scan_done(void)
1004{
1005 EFI_CALL((*bootdev_root->close)(bootdev_root));
1006 bootdev_root = NULL;
1007}
1008
1009
1010
1011
1012
1013
1014
1015
1016efi_status_t __weak efi_load_capsule_drivers(void)
1017{
1018 __maybe_unused efi_handle_t handle;
1019 efi_status_t ret = EFI_SUCCESS;
1020
1021 if (IS_ENABLED(CONFIG_EFI_CAPSULE_FIRMWARE_FIT)) {
1022 handle = NULL;
1023 ret = EFI_CALL(efi_install_multiple_protocol_interfaces(
1024 &handle, &efi_guid_firmware_management_protocol,
1025 &efi_fmp_fit, NULL));
1026 }
1027
1028 if (IS_ENABLED(CONFIG_EFI_CAPSULE_FIRMWARE_RAW)) {
1029 handle = NULL;
1030 ret = EFI_CALL(efi_install_multiple_protocol_interfaces(
1031 &handle,
1032 &efi_guid_firmware_management_protocol,
1033 &efi_fmp_raw, NULL));
1034 }
1035
1036 return ret;
1037}
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048static efi_status_t check_run_capsules(void)
1049{
1050 u64 os_indications;
1051 efi_uintn_t size;
1052 efi_status_t r;
1053
1054 size = sizeof(os_indications);
1055 r = efi_get_variable_int(L"OsIndications", &efi_global_variable_guid,
1056 NULL, &size, &os_indications, NULL);
1057 if (r != EFI_SUCCESS || size != sizeof(os_indications))
1058 return EFI_NOT_FOUND;
1059
1060 if (os_indications &
1061 EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED) {
1062 os_indications &=
1063 ~EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED;
1064 r = efi_set_variable_int(L"OsIndications",
1065 &efi_global_variable_guid,
1066 EFI_VARIABLE_NON_VOLATILE |
1067 EFI_VARIABLE_BOOTSERVICE_ACCESS |
1068 EFI_VARIABLE_RUNTIME_ACCESS,
1069 sizeof(os_indications),
1070 &os_indications, false);
1071 if (r != EFI_SUCCESS)
1072 log_err("Setting %ls failed\n", L"OsIndications");
1073 return EFI_SUCCESS;
1074 } else if (IS_ENABLED(CONFIG_EFI_IGNORE_OSINDICATIONS)) {
1075 return EFI_SUCCESS;
1076 } else {
1077 return EFI_NOT_FOUND;
1078 }
1079}
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089efi_status_t efi_launch_capsules(void)
1090{
1091 struct efi_capsule_header *capsule = NULL;
1092 u16 **files;
1093 unsigned int nfiles, index, i;
1094 efi_status_t ret;
1095
1096 if (check_run_capsules() != EFI_SUCCESS)
1097 return EFI_SUCCESS;
1098
1099 index = get_last_capsule();
1100
1101
1102
1103
1104
1105
1106 nfiles = 0;
1107 files = NULL;
1108 ret = efi_capsule_scan_dir(&files, &nfiles);
1109 if (ret != EFI_SUCCESS)
1110 return ret;
1111 if (!nfiles)
1112 return EFI_SUCCESS;
1113
1114
1115 for (i = 0, ++index; i < nfiles; i++, index++) {
1116 log_debug("Applying %ls\n", files[i]);
1117 if (index > 0xffff)
1118 index = 0;
1119 ret = efi_capsule_read_file(files[i], &capsule);
1120 if (ret == EFI_SUCCESS) {
1121 ret = EFI_CALL(efi_update_capsule(&capsule, 1, 0));
1122 if (ret != EFI_SUCCESS)
1123 log_err("Applying capsule %ls failed\n",
1124 files[i]);
1125
1126
1127 set_capsule_result(index, capsule, ret);
1128
1129 free(capsule);
1130 } else {
1131 log_err("Reading capsule %ls failed\n", files[i]);
1132 }
1133
1134 ret = efi_capsule_delete_file(files[i]);
1135 if (ret != EFI_SUCCESS)
1136 log_err("Deleting capsule %ls failed\n",
1137 files[i]);
1138 }
1139 efi_capsule_scan_done();
1140
1141 for (i = 0; i < nfiles; i++)
1142 free(files[i]);
1143 free(files);
1144
1145 return ret;
1146}
1147#endif
1148