1 /* 2 * EFI application boot time services 3 * 4 * Copyright (c) 2016 Alexander Graf 5 * 6 * SPDX-License-Identifier: GPL-2.0+ 7 */ 8 9 #include <common.h> 10 #include <div64.h> 11 #include <efi_loader.h> 12 #include <environment.h> 13 #include <malloc.h> 14 #include <asm/global_data.h> 15 #include <libfdt_env.h> 16 #include <u-boot/crc.h> 17 #include <bootm.h> 18 #include <inttypes.h> 19 #include <watchdog.h> 20 21 DECLARE_GLOBAL_DATA_PTR; 22 23 /* Task priority level */ 24 static efi_uintn_t efi_tpl = TPL_APPLICATION; 25 26 /* This list contains all the EFI objects our payload has access to */ 27 LIST_HEAD(efi_obj_list); 28 29 /* 30 * If we're running on nasty systems (32bit ARM booting into non-EFI Linux) 31 * we need to do trickery with caches. Since we don't want to break the EFI 32 * aware boot path, only apply hacks when loading exiting directly (breaking 33 * direct Linux EFI booting along the way - oh well). 34 */ 35 static bool efi_is_direct_boot = true; 36 37 /* 38 * EFI can pass arbitrary additional "tables" containing vendor specific 39 * information to the payload. One such table is the FDT table which contains 40 * a pointer to a flattened device tree blob. 41 * 42 * In most cases we want to pass an FDT to the payload, so reserve one slot of 43 * config table space for it. The pointer gets populated by do_bootefi_exec(). 44 */ 45 static struct efi_configuration_table __efi_runtime_data efi_conf_table[2]; 46 47 #ifdef CONFIG_ARM 48 /* 49 * The "gd" pointer lives in a register on ARM and AArch64 that we declare 50 * fixed when compiling U-Boot. However, the payload does not know about that 51 * restriction so we need to manually swap its and our view of that register on 52 * EFI callback entry/exit. 53 */ 54 static volatile void *efi_gd, *app_gd; 55 #endif 56 57 static int entry_count; 58 static int nesting_level; 59 /* GUID of the EFI_DRIVER_BINDING_PROTOCOL */ 60 const efi_guid_t efi_guid_driver_binding_protocol = 61 EFI_DRIVER_BINDING_PROTOCOL_GUID; 62 63 static efi_status_t EFIAPI efi_disconnect_controller( 64 efi_handle_t controller_handle, 65 efi_handle_t driver_image_handle, 66 efi_handle_t child_handle); 67 68 /* Called on every callback entry */ 69 int __efi_entry_check(void) 70 { 71 int ret = entry_count++ == 0; 72 #ifdef CONFIG_ARM 73 assert(efi_gd); 74 app_gd = gd; 75 gd = efi_gd; 76 #endif 77 return ret; 78 } 79 80 /* Called on every callback exit */ 81 int __efi_exit_check(void) 82 { 83 int ret = --entry_count == 0; 84 #ifdef CONFIG_ARM 85 gd = app_gd; 86 #endif 87 return ret; 88 } 89 90 /* Called from do_bootefi_exec() */ 91 void efi_save_gd(void) 92 { 93 #ifdef CONFIG_ARM 94 efi_gd = gd; 95 #endif 96 } 97 98 /* 99 * Special case handler for error/abort that just forces things back 100 * to u-boot world so we can dump out an abort msg, without any care 101 * about returning back to UEFI world. 102 */ 103 void efi_restore_gd(void) 104 { 105 #ifdef CONFIG_ARM 106 /* Only restore if we're already in EFI context */ 107 if (!efi_gd) 108 return; 109 gd = efi_gd; 110 #endif 111 } 112 113 /* 114 * Return a string for indenting with two spaces per level. A maximum of ten 115 * indent levels is supported. Higher indent levels will be truncated. 116 * 117 * @level indent level 118 * @return indent string 119 */ 120 static const char *indent_string(int level) 121 { 122 const char *indent = " "; 123 const int max = strlen(indent); 124 level = min(max, level * 2); 125 return &indent[max - level]; 126 } 127 128 const char *__efi_nesting(void) 129 { 130 return indent_string(nesting_level); 131 } 132 133 const char *__efi_nesting_inc(void) 134 { 135 return indent_string(nesting_level++); 136 } 137 138 const char *__efi_nesting_dec(void) 139 { 140 return indent_string(--nesting_level); 141 } 142 143 /* 144 * Queue an EFI event. 145 * 146 * This function queues the notification function of the event for future 147 * execution. 148 * 149 * The notification function is called if the task priority level of the 150 * event is higher than the current task priority level. 151 * 152 * For the SignalEvent service see efi_signal_event_ext. 153 * 154 * @event event to signal 155 * @check_tpl check the TPL level 156 */ 157 void efi_signal_event(struct efi_event *event, bool check_tpl) 158 { 159 if (event->notify_function) { 160 event->is_queued = true; 161 /* Check TPL */ 162 if (check_tpl && efi_tpl >= event->notify_tpl) 163 return; 164 EFI_CALL_VOID(event->notify_function(event, 165 event->notify_context)); 166 } 167 event->is_queued = false; 168 } 169 170 /* 171 * Raise the task priority level. 172 * 173 * This function implements the RaiseTpl service. 174 * See the Unified Extensible Firmware Interface (UEFI) specification 175 * for details. 176 * 177 * @new_tpl new value of the task priority level 178 * @return old value of the task priority level 179 */ 180 static unsigned long EFIAPI efi_raise_tpl(efi_uintn_t new_tpl) 181 { 182 efi_uintn_t old_tpl = efi_tpl; 183 184 EFI_ENTRY("0x%zx", new_tpl); 185 186 if (new_tpl < efi_tpl) 187 debug("WARNING: new_tpl < current_tpl in %s\n", __func__); 188 efi_tpl = new_tpl; 189 if (efi_tpl > TPL_HIGH_LEVEL) 190 efi_tpl = TPL_HIGH_LEVEL; 191 192 EFI_EXIT(EFI_SUCCESS); 193 return old_tpl; 194 } 195 196 /* 197 * Lower the task priority level. 198 * 199 * This function implements the RestoreTpl service. 200 * See the Unified Extensible Firmware Interface (UEFI) specification 201 * for details. 202 * 203 * @old_tpl value of the task priority level to be restored 204 */ 205 static void EFIAPI efi_restore_tpl(efi_uintn_t old_tpl) 206 { 207 EFI_ENTRY("0x%zx", old_tpl); 208 209 if (old_tpl > efi_tpl) 210 debug("WARNING: old_tpl > current_tpl in %s\n", __func__); 211 efi_tpl = old_tpl; 212 if (efi_tpl > TPL_HIGH_LEVEL) 213 efi_tpl = TPL_HIGH_LEVEL; 214 215 EFI_EXIT(EFI_SUCCESS); 216 } 217 218 /* 219 * Allocate memory pages. 220 * 221 * This function implements the AllocatePages service. 222 * See the Unified Extensible Firmware Interface (UEFI) specification 223 * for details. 224 * 225 * @type type of allocation to be performed 226 * @memory_type usage type of the allocated memory 227 * @pages number of pages to be allocated 228 * @memory allocated memory 229 * @return status code 230 */ 231 static efi_status_t EFIAPI efi_allocate_pages_ext(int type, int memory_type, 232 efi_uintn_t pages, 233 uint64_t *memory) 234 { 235 efi_status_t r; 236 237 EFI_ENTRY("%d, %d, 0x%zx, %p", type, memory_type, pages, memory); 238 r = efi_allocate_pages(type, memory_type, pages, memory); 239 return EFI_EXIT(r); 240 } 241 242 /* 243 * Free memory pages. 244 * 245 * This function implements the FreePages service. 246 * See the Unified Extensible Firmware Interface (UEFI) specification 247 * for details. 248 * 249 * @memory start of the memory area to be freed 250 * @pages number of pages to be freed 251 * @return status code 252 */ 253 static efi_status_t EFIAPI efi_free_pages_ext(uint64_t memory, 254 efi_uintn_t pages) 255 { 256 efi_status_t r; 257 258 EFI_ENTRY("%"PRIx64", 0x%zx", memory, pages); 259 r = efi_free_pages(memory, pages); 260 return EFI_EXIT(r); 261 } 262 263 /* 264 * Get map describing memory usage. 265 * 266 * This function implements the GetMemoryMap service. 267 * See the Unified Extensible Firmware Interface (UEFI) specification 268 * for details. 269 * 270 * @memory_map_size on entry the size, in bytes, of the memory map buffer, 271 * on exit the size of the copied memory map 272 * @memory_map buffer to which the memory map is written 273 * @map_key key for the memory map 274 * @descriptor_size size of an individual memory descriptor 275 * @descriptor_version version number of the memory descriptor structure 276 * @return status code 277 */ 278 static efi_status_t EFIAPI efi_get_memory_map_ext( 279 efi_uintn_t *memory_map_size, 280 struct efi_mem_desc *memory_map, 281 efi_uintn_t *map_key, 282 efi_uintn_t *descriptor_size, 283 uint32_t *descriptor_version) 284 { 285 efi_status_t r; 286 287 EFI_ENTRY("%p, %p, %p, %p, %p", memory_map_size, memory_map, 288 map_key, descriptor_size, descriptor_version); 289 r = efi_get_memory_map(memory_map_size, memory_map, map_key, 290 descriptor_size, descriptor_version); 291 return EFI_EXIT(r); 292 } 293 294 /* 295 * Allocate memory from pool. 296 * 297 * This function implements the AllocatePool service. 298 * See the Unified Extensible Firmware Interface (UEFI) specification 299 * for details. 300 * 301 * @pool_type type of the pool from which memory is to be allocated 302 * @size number of bytes to be allocated 303 * @buffer allocated memory 304 * @return status code 305 */ 306 static efi_status_t EFIAPI efi_allocate_pool_ext(int pool_type, 307 efi_uintn_t size, 308 void **buffer) 309 { 310 efi_status_t r; 311 312 EFI_ENTRY("%d, %zd, %p", pool_type, size, buffer); 313 r = efi_allocate_pool(pool_type, size, buffer); 314 return EFI_EXIT(r); 315 } 316 317 /* 318 * Free memory from pool. 319 * 320 * This function implements the FreePool service. 321 * See the Unified Extensible Firmware Interface (UEFI) specification 322 * for details. 323 * 324 * @buffer start of memory to be freed 325 * @return status code 326 */ 327 static efi_status_t EFIAPI efi_free_pool_ext(void *buffer) 328 { 329 efi_status_t r; 330 331 EFI_ENTRY("%p", buffer); 332 r = efi_free_pool(buffer); 333 return EFI_EXIT(r); 334 } 335 336 /* 337 * Add a new object to the object list. 338 * 339 * The protocols list is initialized. 340 * The object handle is set. 341 * 342 * @obj object to be added 343 */ 344 void efi_add_handle(struct efi_object *obj) 345 { 346 if (!obj) 347 return; 348 INIT_LIST_HEAD(&obj->protocols); 349 obj->handle = obj; 350 list_add_tail(&obj->link, &efi_obj_list); 351 } 352 353 /* 354 * Create handle. 355 * 356 * @handle new handle 357 * @return status code 358 */ 359 efi_status_t efi_create_handle(efi_handle_t *handle) 360 { 361 struct efi_object *obj; 362 efi_status_t r; 363 364 r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, 365 sizeof(struct efi_object), 366 (void **)&obj); 367 if (r != EFI_SUCCESS) 368 return r; 369 efi_add_handle(obj); 370 *handle = obj->handle; 371 return r; 372 } 373 374 /* 375 * Find a protocol on a handle. 376 * 377 * @handle handle 378 * @protocol_guid GUID of the protocol 379 * @handler reference to the protocol 380 * @return status code 381 */ 382 efi_status_t efi_search_protocol(const efi_handle_t handle, 383 const efi_guid_t *protocol_guid, 384 struct efi_handler **handler) 385 { 386 struct efi_object *efiobj; 387 struct list_head *lhandle; 388 389 if (!handle || !protocol_guid) 390 return EFI_INVALID_PARAMETER; 391 efiobj = efi_search_obj(handle); 392 if (!efiobj) 393 return EFI_INVALID_PARAMETER; 394 list_for_each(lhandle, &efiobj->protocols) { 395 struct efi_handler *protocol; 396 397 protocol = list_entry(lhandle, struct efi_handler, link); 398 if (!guidcmp(protocol->guid, protocol_guid)) { 399 if (handler) 400 *handler = protocol; 401 return EFI_SUCCESS; 402 } 403 } 404 return EFI_NOT_FOUND; 405 } 406 407 /* 408 * Delete protocol from a handle. 409 * 410 * @handle handle from which the protocol shall be deleted 411 * @protocol GUID of the protocol to be deleted 412 * @protocol_interface interface of the protocol implementation 413 * @return status code 414 */ 415 efi_status_t efi_remove_protocol(const efi_handle_t handle, 416 const efi_guid_t *protocol, 417 void *protocol_interface) 418 { 419 struct efi_handler *handler; 420 efi_status_t ret; 421 422 ret = efi_search_protocol(handle, protocol, &handler); 423 if (ret != EFI_SUCCESS) 424 return ret; 425 if (guidcmp(handler->guid, protocol)) 426 return EFI_INVALID_PARAMETER; 427 list_del(&handler->link); 428 free(handler); 429 return EFI_SUCCESS; 430 } 431 432 /* 433 * Delete all protocols from a handle. 434 * 435 * @handle handle from which the protocols shall be deleted 436 * @return status code 437 */ 438 efi_status_t efi_remove_all_protocols(const efi_handle_t handle) 439 { 440 struct efi_object *efiobj; 441 struct efi_handler *protocol; 442 struct efi_handler *pos; 443 444 efiobj = efi_search_obj(handle); 445 if (!efiobj) 446 return EFI_INVALID_PARAMETER; 447 list_for_each_entry_safe(protocol, pos, &efiobj->protocols, link) { 448 efi_status_t ret; 449 450 ret = efi_remove_protocol(handle, protocol->guid, 451 protocol->protocol_interface); 452 if (ret != EFI_SUCCESS) 453 return ret; 454 } 455 return EFI_SUCCESS; 456 } 457 458 /* 459 * Delete handle. 460 * 461 * @handle handle to delete 462 */ 463 void efi_delete_handle(struct efi_object *obj) 464 { 465 if (!obj) 466 return; 467 efi_remove_all_protocols(obj->handle); 468 list_del(&obj->link); 469 free(obj); 470 } 471 472 /* 473 * Our event capabilities are very limited. Only a small limited 474 * number of events is allowed to coexist. 475 */ 476 static struct efi_event efi_events[16]; 477 478 /* 479 * Create an event. 480 * 481 * This function is used inside U-Boot code to create an event. 482 * 483 * For the API function implementing the CreateEvent service see 484 * efi_create_event_ext. 485 * 486 * @type type of the event to create 487 * @notify_tpl task priority level of the event 488 * @notify_function notification function of the event 489 * @notify_context pointer passed to the notification function 490 * @event created event 491 * @return status code 492 */ 493 efi_status_t efi_create_event(uint32_t type, efi_uintn_t notify_tpl, 494 void (EFIAPI *notify_function) ( 495 struct efi_event *event, 496 void *context), 497 void *notify_context, struct efi_event **event) 498 { 499 int i; 500 501 if (event == NULL) 502 return EFI_INVALID_PARAMETER; 503 504 if ((type & EVT_NOTIFY_SIGNAL) && (type & EVT_NOTIFY_WAIT)) 505 return EFI_INVALID_PARAMETER; 506 507 if ((type & (EVT_NOTIFY_SIGNAL|EVT_NOTIFY_WAIT)) && 508 notify_function == NULL) 509 return EFI_INVALID_PARAMETER; 510 511 for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { 512 if (efi_events[i].type) 513 continue; 514 efi_events[i].type = type; 515 efi_events[i].notify_tpl = notify_tpl; 516 efi_events[i].notify_function = notify_function; 517 efi_events[i].notify_context = notify_context; 518 /* Disable timers on bootup */ 519 efi_events[i].trigger_next = -1ULL; 520 efi_events[i].is_queued = false; 521 efi_events[i].is_signaled = false; 522 *event = &efi_events[i]; 523 return EFI_SUCCESS; 524 } 525 return EFI_OUT_OF_RESOURCES; 526 } 527 528 /* 529 * Create an event. 530 * 531 * This function implements the CreateEvent service. 532 * See the Unified Extensible Firmware Interface (UEFI) specification 533 * for details. 534 * 535 * @type type of the event to create 536 * @notify_tpl task priority level of the event 537 * @notify_function notification function of the event 538 * @notify_context pointer passed to the notification function 539 * @event created event 540 * @return status code 541 */ 542 static efi_status_t EFIAPI efi_create_event_ext( 543 uint32_t type, efi_uintn_t notify_tpl, 544 void (EFIAPI *notify_function) ( 545 struct efi_event *event, 546 void *context), 547 void *notify_context, struct efi_event **event) 548 { 549 EFI_ENTRY("%d, 0x%zx, %p, %p", type, notify_tpl, notify_function, 550 notify_context); 551 return EFI_EXIT(efi_create_event(type, notify_tpl, notify_function, 552 notify_context, event)); 553 } 554 555 556 /* 557 * Check if a timer event has occurred or a queued notification function should 558 * be called. 559 * 560 * Our timers have to work without interrupts, so we check whenever keyboard 561 * input or disk accesses happen if enough time elapsed for them to fire. 562 */ 563 void efi_timer_check(void) 564 { 565 int i; 566 u64 now = timer_get_us(); 567 568 for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { 569 if (!efi_events[i].type) 570 continue; 571 if (efi_events[i].is_queued) 572 efi_signal_event(&efi_events[i], true); 573 if (!(efi_events[i].type & EVT_TIMER) || 574 now < efi_events[i].trigger_next) 575 continue; 576 switch (efi_events[i].trigger_type) { 577 case EFI_TIMER_RELATIVE: 578 efi_events[i].trigger_type = EFI_TIMER_STOP; 579 break; 580 case EFI_TIMER_PERIODIC: 581 efi_events[i].trigger_next += 582 efi_events[i].trigger_time; 583 break; 584 default: 585 continue; 586 } 587 efi_events[i].is_signaled = true; 588 efi_signal_event(&efi_events[i], true); 589 } 590 WATCHDOG_RESET(); 591 } 592 593 /* 594 * Set the trigger time for a timer event or stop the event. 595 * 596 * This is the function for internal usage in U-Boot. For the API function 597 * implementing the SetTimer service see efi_set_timer_ext. 598 * 599 * @event event for which the timer is set 600 * @type type of the timer 601 * @trigger_time trigger period in multiples of 100ns 602 * @return status code 603 */ 604 efi_status_t efi_set_timer(struct efi_event *event, enum efi_timer_delay type, 605 uint64_t trigger_time) 606 { 607 int i; 608 609 /* 610 * The parameter defines a multiple of 100ns. 611 * We use multiples of 1000ns. So divide by 10. 612 */ 613 do_div(trigger_time, 10); 614 615 for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { 616 if (event != &efi_events[i]) 617 continue; 618 619 if (!(event->type & EVT_TIMER)) 620 break; 621 switch (type) { 622 case EFI_TIMER_STOP: 623 event->trigger_next = -1ULL; 624 break; 625 case EFI_TIMER_PERIODIC: 626 case EFI_TIMER_RELATIVE: 627 event->trigger_next = 628 timer_get_us() + trigger_time; 629 break; 630 default: 631 return EFI_INVALID_PARAMETER; 632 } 633 event->trigger_type = type; 634 event->trigger_time = trigger_time; 635 event->is_signaled = false; 636 return EFI_SUCCESS; 637 } 638 return EFI_INVALID_PARAMETER; 639 } 640 641 /* 642 * Set the trigger time for a timer event or stop the event. 643 * 644 * This function implements the SetTimer service. 645 * See the Unified Extensible Firmware Interface (UEFI) specification 646 * for details. 647 * 648 * @event event for which the timer is set 649 * @type type of the timer 650 * @trigger_time trigger period in multiples of 100ns 651 * @return status code 652 */ 653 static efi_status_t EFIAPI efi_set_timer_ext(struct efi_event *event, 654 enum efi_timer_delay type, 655 uint64_t trigger_time) 656 { 657 EFI_ENTRY("%p, %d, %"PRIx64, event, type, trigger_time); 658 return EFI_EXIT(efi_set_timer(event, type, trigger_time)); 659 } 660 661 /* 662 * Wait for events to be signaled. 663 * 664 * This function implements the WaitForEvent service. 665 * See the Unified Extensible Firmware Interface (UEFI) specification 666 * for details. 667 * 668 * @num_events number of events to be waited for 669 * @events events to be waited for 670 * @index index of the event that was signaled 671 * @return status code 672 */ 673 static efi_status_t EFIAPI efi_wait_for_event(efi_uintn_t num_events, 674 struct efi_event **event, 675 efi_uintn_t *index) 676 { 677 int i, j; 678 679 EFI_ENTRY("%zd, %p, %p", num_events, event, index); 680 681 /* Check parameters */ 682 if (!num_events || !event) 683 return EFI_EXIT(EFI_INVALID_PARAMETER); 684 /* Check TPL */ 685 if (efi_tpl != TPL_APPLICATION) 686 return EFI_EXIT(EFI_UNSUPPORTED); 687 for (i = 0; i < num_events; ++i) { 688 for (j = 0; j < ARRAY_SIZE(efi_events); ++j) { 689 if (event[i] == &efi_events[j]) 690 goto known_event; 691 } 692 return EFI_EXIT(EFI_INVALID_PARAMETER); 693 known_event: 694 if (!event[i]->type || event[i]->type & EVT_NOTIFY_SIGNAL) 695 return EFI_EXIT(EFI_INVALID_PARAMETER); 696 if (!event[i]->is_signaled) 697 efi_signal_event(event[i], true); 698 } 699 700 /* Wait for signal */ 701 for (;;) { 702 for (i = 0; i < num_events; ++i) { 703 if (event[i]->is_signaled) 704 goto out; 705 } 706 /* Allow events to occur. */ 707 efi_timer_check(); 708 } 709 710 out: 711 /* 712 * Reset the signal which is passed to the caller to allow periodic 713 * events to occur. 714 */ 715 event[i]->is_signaled = false; 716 if (index) 717 *index = i; 718 719 return EFI_EXIT(EFI_SUCCESS); 720 } 721 722 /* 723 * Signal an EFI event. 724 * 725 * This function implements the SignalEvent service. 726 * See the Unified Extensible Firmware Interface (UEFI) specification 727 * for details. 728 * 729 * This functions sets the signaled state of the event and queues the 730 * notification function for execution. 731 * 732 * @event event to signal 733 * @return status code 734 */ 735 static efi_status_t EFIAPI efi_signal_event_ext(struct efi_event *event) 736 { 737 int i; 738 739 EFI_ENTRY("%p", event); 740 for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { 741 if (event != &efi_events[i]) 742 continue; 743 if (event->is_signaled) 744 break; 745 event->is_signaled = true; 746 if (event->type & EVT_NOTIFY_SIGNAL) 747 efi_signal_event(event, true); 748 break; 749 } 750 return EFI_EXIT(EFI_SUCCESS); 751 } 752 753 /* 754 * Close an EFI event. 755 * 756 * This function implements the CloseEvent service. 757 * See the Unified Extensible Firmware Interface (UEFI) specification 758 * for details. 759 * 760 * @event event to close 761 * @return status code 762 */ 763 static efi_status_t EFIAPI efi_close_event(struct efi_event *event) 764 { 765 int i; 766 767 EFI_ENTRY("%p", event); 768 for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { 769 if (event == &efi_events[i]) { 770 event->type = 0; 771 event->trigger_next = -1ULL; 772 event->is_queued = false; 773 event->is_signaled = false; 774 return EFI_EXIT(EFI_SUCCESS); 775 } 776 } 777 return EFI_EXIT(EFI_INVALID_PARAMETER); 778 } 779 780 /* 781 * Check if an event is signaled. 782 * 783 * This function implements the CheckEvent service. 784 * See the Unified Extensible Firmware Interface (UEFI) specification 785 * for details. 786 * 787 * If an event is not signaled yet the notification function is queued. 788 * 789 * @event event to check 790 * @return status code 791 */ 792 static efi_status_t EFIAPI efi_check_event(struct efi_event *event) 793 { 794 int i; 795 796 EFI_ENTRY("%p", event); 797 efi_timer_check(); 798 for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { 799 if (event != &efi_events[i]) 800 continue; 801 if (!event->type || event->type & EVT_NOTIFY_SIGNAL) 802 break; 803 if (!event->is_signaled) 804 efi_signal_event(event, true); 805 if (event->is_signaled) 806 return EFI_EXIT(EFI_SUCCESS); 807 return EFI_EXIT(EFI_NOT_READY); 808 } 809 return EFI_EXIT(EFI_INVALID_PARAMETER); 810 } 811 812 /* 813 * Find the internal EFI object for a handle. 814 * 815 * @handle handle to find 816 * @return EFI object 817 */ 818 struct efi_object *efi_search_obj(const efi_handle_t handle) 819 { 820 struct efi_object *efiobj; 821 822 list_for_each_entry(efiobj, &efi_obj_list, link) { 823 if (efiobj->handle == handle) 824 return efiobj; 825 } 826 827 return NULL; 828 } 829 830 /* 831 * Create open protocol info entry and add it to a protocol. 832 * 833 * @handler handler of a protocol 834 * @return open protocol info entry 835 */ 836 static struct efi_open_protocol_info_entry *efi_create_open_info( 837 struct efi_handler *handler) 838 { 839 struct efi_open_protocol_info_item *item; 840 841 item = calloc(1, sizeof(struct efi_open_protocol_info_item)); 842 if (!item) 843 return NULL; 844 /* Append the item to the open protocol info list. */ 845 list_add_tail(&item->link, &handler->open_infos); 846 847 return &item->info; 848 } 849 850 /* 851 * Remove an open protocol info entry from a protocol. 852 * 853 * @handler handler of a protocol 854 * @return status code 855 */ 856 static efi_status_t efi_delete_open_info( 857 struct efi_open_protocol_info_item *item) 858 { 859 list_del(&item->link); 860 free(item); 861 return EFI_SUCCESS; 862 } 863 864 /* 865 * Install new protocol on a handle. 866 * 867 * @handle handle on which the protocol shall be installed 868 * @protocol GUID of the protocol to be installed 869 * @protocol_interface interface of the protocol implementation 870 * @return status code 871 */ 872 efi_status_t efi_add_protocol(const efi_handle_t handle, 873 const efi_guid_t *protocol, 874 void *protocol_interface) 875 { 876 struct efi_object *efiobj; 877 struct efi_handler *handler; 878 efi_status_t ret; 879 880 efiobj = efi_search_obj(handle); 881 if (!efiobj) 882 return EFI_INVALID_PARAMETER; 883 ret = efi_search_protocol(handle, protocol, NULL); 884 if (ret != EFI_NOT_FOUND) 885 return EFI_INVALID_PARAMETER; 886 handler = calloc(1, sizeof(struct efi_handler)); 887 if (!handler) 888 return EFI_OUT_OF_RESOURCES; 889 handler->guid = protocol; 890 handler->protocol_interface = protocol_interface; 891 INIT_LIST_HEAD(&handler->open_infos); 892 list_add_tail(&handler->link, &efiobj->protocols); 893 if (!guidcmp(&efi_guid_device_path, protocol)) 894 EFI_PRINT("installed device path '%pD'\n", protocol_interface); 895 return EFI_SUCCESS; 896 } 897 898 /* 899 * Install protocol interface. 900 * 901 * This function implements the InstallProtocolInterface service. 902 * See the Unified Extensible Firmware Interface (UEFI) specification 903 * for details. 904 * 905 * @handle handle on which the protocol shall be installed 906 * @protocol GUID of the protocol to be installed 907 * @protocol_interface_type type of the interface to be installed, 908 * always EFI_NATIVE_INTERFACE 909 * @protocol_interface interface of the protocol implementation 910 * @return status code 911 */ 912 static efi_status_t EFIAPI efi_install_protocol_interface( 913 void **handle, const efi_guid_t *protocol, 914 int protocol_interface_type, void *protocol_interface) 915 { 916 efi_status_t r; 917 918 EFI_ENTRY("%p, %pUl, %d, %p", handle, protocol, protocol_interface_type, 919 protocol_interface); 920 921 if (!handle || !protocol || 922 protocol_interface_type != EFI_NATIVE_INTERFACE) { 923 r = EFI_INVALID_PARAMETER; 924 goto out; 925 } 926 927 /* Create new handle if requested. */ 928 if (!*handle) { 929 r = efi_create_handle(handle); 930 if (r != EFI_SUCCESS) 931 goto out; 932 debug("%sEFI: new handle %p\n", indent_string(nesting_level), 933 *handle); 934 } else { 935 debug("%sEFI: handle %p\n", indent_string(nesting_level), 936 *handle); 937 } 938 /* Add new protocol */ 939 r = efi_add_protocol(*handle, protocol, protocol_interface); 940 out: 941 return EFI_EXIT(r); 942 } 943 944 /* 945 * Reinstall protocol interface. 946 * 947 * This function implements the ReinstallProtocolInterface service. 948 * See the Unified Extensible Firmware Interface (UEFI) specification 949 * for details. 950 * 951 * @handle handle on which the protocol shall be 952 * reinstalled 953 * @protocol GUID of the protocol to be installed 954 * @old_interface interface to be removed 955 * @new_interface interface to be installed 956 * @return status code 957 */ 958 static efi_status_t EFIAPI efi_reinstall_protocol_interface( 959 efi_handle_t handle, const efi_guid_t *protocol, 960 void *old_interface, void *new_interface) 961 { 962 EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, old_interface, 963 new_interface); 964 return EFI_EXIT(EFI_ACCESS_DENIED); 965 } 966 967 /* 968 * Get all drivers associated to a controller. 969 * The allocated buffer has to be freed with free(). 970 * 971 * @efiobj handle of the controller 972 * @protocol protocol guid (optional) 973 * @number_of_drivers number of child controllers 974 * @driver_handle_buffer handles of the the drivers 975 * @return status code 976 */ 977 static efi_status_t efi_get_drivers(struct efi_object *efiobj, 978 const efi_guid_t *protocol, 979 efi_uintn_t *number_of_drivers, 980 efi_handle_t **driver_handle_buffer) 981 { 982 struct efi_handler *handler; 983 struct efi_open_protocol_info_item *item; 984 efi_uintn_t count = 0, i; 985 bool duplicate; 986 987 /* Count all driver associations */ 988 list_for_each_entry(handler, &efiobj->protocols, link) { 989 if (protocol && guidcmp(handler->guid, protocol)) 990 continue; 991 list_for_each_entry(item, &handler->open_infos, link) { 992 if (item->info.attributes & 993 EFI_OPEN_PROTOCOL_BY_DRIVER) 994 ++count; 995 } 996 } 997 /* 998 * Create buffer. In case of duplicate driver assignments the buffer 999 * will be too large. But that does not harm. 1000 */ 1001 *number_of_drivers = 0; 1002 *driver_handle_buffer = calloc(count, sizeof(efi_handle_t)); 1003 if (!*driver_handle_buffer) 1004 return EFI_OUT_OF_RESOURCES; 1005 /* Collect unique driver handles */ 1006 list_for_each_entry(handler, &efiobj->protocols, link) { 1007 if (protocol && guidcmp(handler->guid, protocol)) 1008 continue; 1009 list_for_each_entry(item, &handler->open_infos, link) { 1010 if (item->info.attributes & 1011 EFI_OPEN_PROTOCOL_BY_DRIVER) { 1012 /* Check this is a new driver */ 1013 duplicate = false; 1014 for (i = 0; i < *number_of_drivers; ++i) { 1015 if ((*driver_handle_buffer)[i] == 1016 item->info.agent_handle) 1017 duplicate = true; 1018 } 1019 /* Copy handle to buffer */ 1020 if (!duplicate) { 1021 i = (*number_of_drivers)++; 1022 (*driver_handle_buffer)[i] = 1023 item->info.agent_handle; 1024 } 1025 } 1026 } 1027 } 1028 return EFI_SUCCESS; 1029 } 1030 1031 /* 1032 * Disconnect all drivers from a controller. 1033 * 1034 * This function implements the DisconnectController service. 1035 * See the Unified Extensible Firmware Interface (UEFI) specification 1036 * for details. 1037 * 1038 * @efiobj handle of the controller 1039 * @protocol protocol guid (optional) 1040 * @child_handle handle of the child to destroy 1041 * @return status code 1042 */ 1043 static efi_status_t efi_disconnect_all_drivers( 1044 struct efi_object *efiobj, 1045 const efi_guid_t *protocol, 1046 efi_handle_t child_handle) 1047 { 1048 efi_uintn_t number_of_drivers; 1049 efi_handle_t *driver_handle_buffer; 1050 efi_status_t r, ret; 1051 1052 ret = efi_get_drivers(efiobj, protocol, &number_of_drivers, 1053 &driver_handle_buffer); 1054 if (ret != EFI_SUCCESS) 1055 return ret; 1056 1057 ret = EFI_NOT_FOUND; 1058 while (number_of_drivers) { 1059 r = EFI_CALL(efi_disconnect_controller( 1060 efiobj->handle, 1061 driver_handle_buffer[--number_of_drivers], 1062 child_handle)); 1063 if (r == EFI_SUCCESS) 1064 ret = r; 1065 } 1066 free(driver_handle_buffer); 1067 return ret; 1068 } 1069 1070 /* 1071 * Uninstall protocol interface. 1072 * 1073 * This function implements the UninstallProtocolInterface service. 1074 * See the Unified Extensible Firmware Interface (UEFI) specification 1075 * for details. 1076 * 1077 * @handle handle from which the protocol shall be removed 1078 * @protocol GUID of the protocol to be removed 1079 * @protocol_interface interface to be removed 1080 * @return status code 1081 */ 1082 static efi_status_t EFIAPI efi_uninstall_protocol_interface( 1083 efi_handle_t handle, const efi_guid_t *protocol, 1084 void *protocol_interface) 1085 { 1086 struct efi_object *efiobj; 1087 struct efi_handler *handler; 1088 struct efi_open_protocol_info_item *item; 1089 struct efi_open_protocol_info_item *pos; 1090 efi_status_t r; 1091 1092 EFI_ENTRY("%p, %pUl, %p", handle, protocol, protocol_interface); 1093 1094 /* Check handle */ 1095 efiobj = efi_search_obj(handle); 1096 if (!efiobj) { 1097 r = EFI_INVALID_PARAMETER; 1098 goto out; 1099 } 1100 /* Find the protocol on the handle */ 1101 r = efi_search_protocol(handle, protocol, &handler); 1102 if (r != EFI_SUCCESS) 1103 goto out; 1104 /* Disconnect controllers */ 1105 efi_disconnect_all_drivers(efiobj, protocol, NULL); 1106 if (!list_empty(&handler->open_infos)) { 1107 r = EFI_ACCESS_DENIED; 1108 goto out; 1109 } 1110 /* Close protocol */ 1111 list_for_each_entry_safe(item, pos, &handler->open_infos, link) { 1112 if (item->info.attributes == 1113 EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL || 1114 item->info.attributes == EFI_OPEN_PROTOCOL_GET_PROTOCOL || 1115 item->info.attributes == EFI_OPEN_PROTOCOL_TEST_PROTOCOL) 1116 list_del(&item->link); 1117 } 1118 if (!list_empty(&handler->open_infos)) { 1119 r = EFI_ACCESS_DENIED; 1120 goto out; 1121 } 1122 r = efi_remove_protocol(handle, protocol, protocol_interface); 1123 out: 1124 return EFI_EXIT(r); 1125 } 1126 1127 /* 1128 * Register an event for notification when a protocol is installed. 1129 * 1130 * This function implements the RegisterProtocolNotify service. 1131 * See the Unified Extensible Firmware Interface (UEFI) specification 1132 * for details. 1133 * 1134 * @protocol GUID of the protocol whose installation shall be 1135 * notified 1136 * @event event to be signaled upon installation of the protocol 1137 * @registration key for retrieving the registration information 1138 * @return status code 1139 */ 1140 static efi_status_t EFIAPI efi_register_protocol_notify( 1141 const efi_guid_t *protocol, 1142 struct efi_event *event, 1143 void **registration) 1144 { 1145 EFI_ENTRY("%pUl, %p, %p", protocol, event, registration); 1146 return EFI_EXIT(EFI_OUT_OF_RESOURCES); 1147 } 1148 1149 /* 1150 * Determine if an EFI handle implements a protocol. 1151 * 1152 * See the documentation of the LocateHandle service in the UEFI specification. 1153 * 1154 * @search_type selection criterion 1155 * @protocol GUID of the protocol 1156 * @search_key registration key 1157 * @efiobj handle 1158 * @return 0 if the handle implements the protocol 1159 */ 1160 static int efi_search(enum efi_locate_search_type search_type, 1161 const efi_guid_t *protocol, void *search_key, 1162 struct efi_object *efiobj) 1163 { 1164 efi_status_t ret; 1165 1166 switch (search_type) { 1167 case ALL_HANDLES: 1168 return 0; 1169 case BY_REGISTER_NOTIFY: 1170 /* TODO: RegisterProtocolNotify is not implemented yet */ 1171 return -1; 1172 case BY_PROTOCOL: 1173 ret = efi_search_protocol(efiobj->handle, protocol, NULL); 1174 return (ret != EFI_SUCCESS); 1175 default: 1176 /* Invalid search type */ 1177 return -1; 1178 } 1179 } 1180 1181 /* 1182 * Locate handles implementing a protocol. 1183 * 1184 * This function is meant for U-Boot internal calls. For the API implementation 1185 * of the LocateHandle service see efi_locate_handle_ext. 1186 * 1187 * @search_type selection criterion 1188 * @protocol GUID of the protocol 1189 * @search_key registration key 1190 * @buffer_size size of the buffer to receive the handles in bytes 1191 * @buffer buffer to receive the relevant handles 1192 * @return status code 1193 */ 1194 static efi_status_t efi_locate_handle( 1195 enum efi_locate_search_type search_type, 1196 const efi_guid_t *protocol, void *search_key, 1197 efi_uintn_t *buffer_size, efi_handle_t *buffer) 1198 { 1199 struct efi_object *efiobj; 1200 efi_uintn_t size = 0; 1201 1202 /* Check parameters */ 1203 switch (search_type) { 1204 case ALL_HANDLES: 1205 break; 1206 case BY_REGISTER_NOTIFY: 1207 if (!search_key) 1208 return EFI_INVALID_PARAMETER; 1209 /* RegisterProtocolNotify is not implemented yet */ 1210 return EFI_UNSUPPORTED; 1211 case BY_PROTOCOL: 1212 if (!protocol) 1213 return EFI_INVALID_PARAMETER; 1214 break; 1215 default: 1216 return EFI_INVALID_PARAMETER; 1217 } 1218 1219 /* 1220 * efi_locate_handle_buffer uses this function for 1221 * the calculation of the necessary buffer size. 1222 * So do not require a buffer for buffersize == 0. 1223 */ 1224 if (!buffer_size || (*buffer_size && !buffer)) 1225 return EFI_INVALID_PARAMETER; 1226 1227 /* Count how much space we need */ 1228 list_for_each_entry(efiobj, &efi_obj_list, link) { 1229 if (!efi_search(search_type, protocol, search_key, efiobj)) 1230 size += sizeof(void*); 1231 } 1232 1233 if (*buffer_size < size) { 1234 *buffer_size = size; 1235 return EFI_BUFFER_TOO_SMALL; 1236 } 1237 1238 *buffer_size = size; 1239 if (size == 0) 1240 return EFI_NOT_FOUND; 1241 1242 /* Then fill the array */ 1243 list_for_each_entry(efiobj, &efi_obj_list, link) { 1244 if (!efi_search(search_type, protocol, search_key, efiobj)) 1245 *buffer++ = efiobj->handle; 1246 } 1247 1248 return EFI_SUCCESS; 1249 } 1250 1251 /* 1252 * Locate handles implementing a protocol. 1253 * 1254 * This function implements the LocateHandle service. 1255 * See the Unified Extensible Firmware Interface (UEFI) specification 1256 * for details. 1257 * 1258 * @search_type selection criterion 1259 * @protocol GUID of the protocol 1260 * @search_key registration key 1261 * @buffer_size size of the buffer to receive the handles in bytes 1262 * @buffer buffer to receive the relevant handles 1263 * @return 0 if the handle implements the protocol 1264 */ 1265 static efi_status_t EFIAPI efi_locate_handle_ext( 1266 enum efi_locate_search_type search_type, 1267 const efi_guid_t *protocol, void *search_key, 1268 efi_uintn_t *buffer_size, efi_handle_t *buffer) 1269 { 1270 EFI_ENTRY("%d, %pUl, %p, %p, %p", search_type, protocol, search_key, 1271 buffer_size, buffer); 1272 1273 return EFI_EXIT(efi_locate_handle(search_type, protocol, search_key, 1274 buffer_size, buffer)); 1275 } 1276 1277 /* Collapses configuration table entries, removing index i */ 1278 static void efi_remove_configuration_table(int i) 1279 { 1280 struct efi_configuration_table *this = &efi_conf_table[i]; 1281 struct efi_configuration_table *next = &efi_conf_table[i+1]; 1282 struct efi_configuration_table *end = &efi_conf_table[systab.nr_tables]; 1283 1284 memmove(this, next, (ulong)end - (ulong)next); 1285 systab.nr_tables--; 1286 } 1287 1288 /* 1289 * Adds, updates, or removes a configuration table. 1290 * 1291 * This function is used for internal calls. For the API implementation of the 1292 * InstallConfigurationTable service see efi_install_configuration_table_ext. 1293 * 1294 * @guid GUID of the installed table 1295 * @table table to be installed 1296 * @return status code 1297 */ 1298 efi_status_t efi_install_configuration_table(const efi_guid_t *guid, void *table) 1299 { 1300 int i; 1301 1302 /* Check for guid override */ 1303 for (i = 0; i < systab.nr_tables; i++) { 1304 if (!guidcmp(guid, &efi_conf_table[i].guid)) { 1305 if (table) 1306 efi_conf_table[i].table = table; 1307 else 1308 efi_remove_configuration_table(i); 1309 return EFI_SUCCESS; 1310 } 1311 } 1312 1313 if (!table) 1314 return EFI_NOT_FOUND; 1315 1316 /* No override, check for overflow */ 1317 if (i >= ARRAY_SIZE(efi_conf_table)) 1318 return EFI_OUT_OF_RESOURCES; 1319 1320 /* Add a new entry */ 1321 memcpy(&efi_conf_table[i].guid, guid, sizeof(*guid)); 1322 efi_conf_table[i].table = table; 1323 systab.nr_tables = i + 1; 1324 1325 return EFI_SUCCESS; 1326 } 1327 1328 /* 1329 * Adds, updates, or removes a configuration table. 1330 * 1331 * This function implements the InstallConfigurationTable service. 1332 * See the Unified Extensible Firmware Interface (UEFI) specification 1333 * for details. 1334 * 1335 * @guid GUID of the installed table 1336 * @table table to be installed 1337 * @return status code 1338 */ 1339 static efi_status_t EFIAPI efi_install_configuration_table_ext(efi_guid_t *guid, 1340 void *table) 1341 { 1342 EFI_ENTRY("%pUl, %p", guid, table); 1343 return EFI_EXIT(efi_install_configuration_table(guid, table)); 1344 } 1345 1346 /* 1347 * Initialize a loaded_image_info + loaded_image_info object with correct 1348 * protocols, boot-device, etc. 1349 * 1350 * @info loaded image info to be passed to the entry point of the 1351 * image 1352 * @obj internal object associated with the loaded image 1353 * @device_path device path of the loaded image 1354 * @file_path file path of the loaded image 1355 * @return status code 1356 */ 1357 efi_status_t efi_setup_loaded_image( 1358 struct efi_loaded_image *info, struct efi_object *obj, 1359 struct efi_device_path *device_path, 1360 struct efi_device_path *file_path) 1361 { 1362 efi_status_t ret; 1363 1364 /* Add internal object to object list */ 1365 efi_add_handle(obj); 1366 /* efi_exit() assumes that the handle points to the info */ 1367 obj->handle = info; 1368 1369 info->file_path = file_path; 1370 1371 if (device_path) { 1372 info->device_handle = efi_dp_find_obj(device_path, NULL); 1373 /* 1374 * When asking for the device path interface, return 1375 * bootefi_device_path 1376 */ 1377 ret = efi_add_protocol(obj->handle, &efi_guid_device_path, 1378 device_path); 1379 if (ret != EFI_SUCCESS) 1380 goto failure; 1381 } 1382 1383 /* 1384 * When asking for the loaded_image interface, just 1385 * return handle which points to loaded_image_info 1386 */ 1387 ret = efi_add_protocol(obj->handle, &efi_guid_loaded_image, info); 1388 if (ret != EFI_SUCCESS) 1389 goto failure; 1390 1391 ret = efi_add_protocol(obj->handle, &efi_guid_console_control, 1392 (void *)&efi_console_control); 1393 if (ret != EFI_SUCCESS) 1394 goto failure; 1395 1396 ret = efi_add_protocol(obj->handle, 1397 &efi_guid_device_path_to_text_protocol, 1398 (void *)&efi_device_path_to_text); 1399 if (ret != EFI_SUCCESS) 1400 goto failure; 1401 1402 return ret; 1403 failure: 1404 printf("ERROR: Failure to install protocols for loaded image\n"); 1405 return ret; 1406 } 1407 1408 /* 1409 * Load an image using a file path. 1410 * 1411 * @file_path the path of the image to load 1412 * @buffer buffer containing the loaded image 1413 * @return status code 1414 */ 1415 efi_status_t efi_load_image_from_path(struct efi_device_path *file_path, 1416 void **buffer) 1417 { 1418 struct efi_file_info *info = NULL; 1419 struct efi_file_handle *f; 1420 static efi_status_t ret; 1421 uint64_t bs; 1422 1423 f = efi_file_from_path(file_path); 1424 if (!f) 1425 return EFI_DEVICE_ERROR; 1426 1427 bs = 0; 1428 EFI_CALL(ret = f->getinfo(f, (efi_guid_t *)&efi_file_info_guid, 1429 &bs, info)); 1430 if (ret == EFI_BUFFER_TOO_SMALL) { 1431 info = malloc(bs); 1432 EFI_CALL(ret = f->getinfo(f, (efi_guid_t *)&efi_file_info_guid, 1433 &bs, info)); 1434 } 1435 if (ret != EFI_SUCCESS) 1436 goto error; 1437 1438 ret = efi_allocate_pool(EFI_LOADER_DATA, info->file_size, buffer); 1439 if (ret) 1440 goto error; 1441 1442 EFI_CALL(ret = f->read(f, &info->file_size, *buffer)); 1443 1444 error: 1445 free(info); 1446 EFI_CALL(f->close(f)); 1447 1448 if (ret != EFI_SUCCESS) { 1449 efi_free_pool(*buffer); 1450 *buffer = NULL; 1451 } 1452 1453 return ret; 1454 } 1455 1456 /* 1457 * Load an EFI image into memory. 1458 * 1459 * This function implements the LoadImage service. 1460 * See the Unified Extensible Firmware Interface (UEFI) specification 1461 * for details. 1462 * 1463 * @boot_policy true for request originating from the boot manager 1464 * @parent_image the caller's image handle 1465 * @file_path the path of the image to load 1466 * @source_buffer memory location from which the image is installed 1467 * @source_size size of the memory area from which the image is 1468 * installed 1469 * @image_handle handle for the newly installed image 1470 * @return status code 1471 */ 1472 static efi_status_t EFIAPI efi_load_image(bool boot_policy, 1473 efi_handle_t parent_image, 1474 struct efi_device_path *file_path, 1475 void *source_buffer, 1476 unsigned long source_size, 1477 efi_handle_t *image_handle) 1478 { 1479 struct efi_loaded_image *info; 1480 struct efi_object *obj; 1481 efi_status_t ret; 1482 1483 EFI_ENTRY("%d, %p, %pD, %p, %ld, %p", boot_policy, parent_image, 1484 file_path, source_buffer, source_size, image_handle); 1485 1486 info = calloc(1, sizeof(*info)); 1487 obj = calloc(1, sizeof(*obj)); 1488 1489 if (!source_buffer) { 1490 struct efi_device_path *dp, *fp; 1491 1492 ret = efi_load_image_from_path(file_path, &source_buffer); 1493 if (ret != EFI_SUCCESS) 1494 goto failure; 1495 /* 1496 * split file_path which contains both the device and 1497 * file parts: 1498 */ 1499 efi_dp_split_file_path(file_path, &dp, &fp); 1500 ret = efi_setup_loaded_image(info, obj, dp, fp); 1501 if (ret != EFI_SUCCESS) 1502 goto failure; 1503 } else { 1504 /* In this case, file_path is the "device" path, ie. 1505 * something like a HARDWARE_DEVICE:MEMORY_MAPPED 1506 */ 1507 ret = efi_setup_loaded_image(info, obj, file_path, NULL); 1508 if (ret != EFI_SUCCESS) 1509 goto failure; 1510 } 1511 info->reserved = efi_load_pe(source_buffer, info); 1512 if (!info->reserved) { 1513 ret = EFI_UNSUPPORTED; 1514 goto failure; 1515 } 1516 info->system_table = &systab; 1517 info->parent_handle = parent_image; 1518 *image_handle = obj->handle; 1519 return EFI_EXIT(EFI_SUCCESS); 1520 failure: 1521 free(info); 1522 efi_delete_handle(obj); 1523 return EFI_EXIT(ret); 1524 } 1525 1526 /* 1527 * Call the entry point of an image. 1528 * 1529 * This function implements the StartImage service. 1530 * See the Unified Extensible Firmware Interface (UEFI) specification 1531 * for details. 1532 * 1533 * @image_handle handle of the image 1534 * @exit_data_size size of the buffer 1535 * @exit_data buffer to receive the exit data of the called image 1536 * @return status code 1537 */ 1538 static efi_status_t EFIAPI efi_start_image(efi_handle_t image_handle, 1539 unsigned long *exit_data_size, 1540 s16 **exit_data) 1541 { 1542 EFIAPI efi_status_t (*entry)(efi_handle_t image_handle, 1543 struct efi_system_table *st); 1544 struct efi_loaded_image *info = image_handle; 1545 efi_status_t ret; 1546 1547 EFI_ENTRY("%p, %p, %p", image_handle, exit_data_size, exit_data); 1548 entry = info->reserved; 1549 1550 efi_is_direct_boot = false; 1551 1552 /* call the image! */ 1553 if (setjmp(&info->exit_jmp)) { 1554 /* 1555 * We called the entry point of the child image with EFI_CALL 1556 * in the lines below. The child image called the Exit() boot 1557 * service efi_exit() which executed the long jump that brought 1558 * us to the current line. This implies that the second half 1559 * of the EFI_CALL macro has not been executed. 1560 */ 1561 #ifdef CONFIG_ARM 1562 /* 1563 * efi_exit() called efi_restore_gd(). We have to undo this 1564 * otherwise __efi_entry_check() will put the wrong value into 1565 * app_gd. 1566 */ 1567 gd = app_gd; 1568 #endif 1569 /* 1570 * To get ready to call EFI_EXIT below we have to execute the 1571 * missed out steps of EFI_CALL. 1572 */ 1573 assert(__efi_entry_check()); 1574 debug("%sEFI: %lu returned by started image\n", 1575 __efi_nesting_dec(), 1576 (unsigned long)((uintptr_t)info->exit_status & 1577 ~EFI_ERROR_MASK)); 1578 return EFI_EXIT(info->exit_status); 1579 } 1580 1581 ret = EFI_CALL(entry(image_handle, &systab)); 1582 1583 /* 1584 * Usually UEFI applications call Exit() instead of returning. 1585 * But because the world doesn not consist of ponies and unicorns, 1586 * we're happy to emulate that behavior on behalf of a payload 1587 * that forgot. 1588 */ 1589 return EFI_CALL(systab.boottime->exit(image_handle, ret, 0, NULL)); 1590 } 1591 1592 /* 1593 * Leave an EFI application or driver. 1594 * 1595 * This function implements the Exit service. 1596 * See the Unified Extensible Firmware Interface (UEFI) specification 1597 * for details. 1598 * 1599 * @image_handle handle of the application or driver that is exiting 1600 * @exit_status status code 1601 * @exit_data_size size of the buffer in bytes 1602 * @exit_data buffer with data describing an error 1603 * @return status code 1604 */ 1605 static efi_status_t EFIAPI efi_exit(efi_handle_t image_handle, 1606 efi_status_t exit_status, unsigned long exit_data_size, 1607 int16_t *exit_data) 1608 { 1609 /* 1610 * We require that the handle points to the original loaded 1611 * image protocol interface. 1612 * 1613 * For getting the longjmp address this is safer than locating 1614 * the protocol because the protocol may have been reinstalled 1615 * pointing to another memory location. 1616 * 1617 * TODO: We should call the unload procedure of the loaded 1618 * image protocol. 1619 */ 1620 struct efi_loaded_image *loaded_image_info = (void*)image_handle; 1621 1622 EFI_ENTRY("%p, %ld, %ld, %p", image_handle, exit_status, 1623 exit_data_size, exit_data); 1624 1625 /* Make sure entry/exit counts for EFI world cross-overs match */ 1626 EFI_EXIT(exit_status); 1627 1628 /* 1629 * But longjmp out with the U-Boot gd, not the application's, as 1630 * the other end is a setjmp call inside EFI context. 1631 */ 1632 efi_restore_gd(); 1633 1634 loaded_image_info->exit_status = exit_status; 1635 longjmp(&loaded_image_info->exit_jmp, 1); 1636 1637 panic("EFI application exited"); 1638 } 1639 1640 /* 1641 * Unload an EFI image. 1642 * 1643 * This function implements the UnloadImage service. 1644 * See the Unified Extensible Firmware Interface (UEFI) specification 1645 * for details. 1646 * 1647 * @image_handle handle of the image to be unloaded 1648 * @return status code 1649 */ 1650 static efi_status_t EFIAPI efi_unload_image(efi_handle_t image_handle) 1651 { 1652 struct efi_object *efiobj; 1653 1654 EFI_ENTRY("%p", image_handle); 1655 efiobj = efi_search_obj(image_handle); 1656 if (efiobj) 1657 list_del(&efiobj->link); 1658 1659 return EFI_EXIT(EFI_SUCCESS); 1660 } 1661 1662 /* 1663 * Fix up caches for EFI payloads if necessary. 1664 */ 1665 static void efi_exit_caches(void) 1666 { 1667 #if defined(CONFIG_ARM) && !defined(CONFIG_ARM64) 1668 /* 1669 * Grub on 32bit ARM needs to have caches disabled before jumping into 1670 * a zImage, but does not know of all cache layers. Give it a hand. 1671 */ 1672 if (efi_is_direct_boot) 1673 cleanup_before_linux(); 1674 #endif 1675 } 1676 1677 /* 1678 * Stop all boot services. 1679 * 1680 * This function implements the ExitBootServices service. 1681 * See the Unified Extensible Firmware Interface (UEFI) specification 1682 * for details. 1683 * 1684 * All timer events are disabled. 1685 * For exit boot services events the notification function is called. 1686 * The boot services are disabled in the system table. 1687 * 1688 * @image_handle handle of the loaded image 1689 * @map_key key of the memory map 1690 * @return status code 1691 */ 1692 static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle, 1693 unsigned long map_key) 1694 { 1695 int i; 1696 1697 EFI_ENTRY("%p, %ld", image_handle, map_key); 1698 1699 /* Make sure that notification functions are not called anymore */ 1700 efi_tpl = TPL_HIGH_LEVEL; 1701 1702 /* Check if ExitBootServices has already been called */ 1703 if (!systab.boottime) 1704 return EFI_EXIT(EFI_SUCCESS); 1705 1706 /* Notify that ExitBootServices is invoked. */ 1707 for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { 1708 if (efi_events[i].type != EVT_SIGNAL_EXIT_BOOT_SERVICES) 1709 continue; 1710 efi_events[i].is_signaled = true; 1711 efi_signal_event(&efi_events[i], false); 1712 } 1713 1714 /* TODO Should persist EFI variables here */ 1715 1716 board_quiesce_devices(); 1717 1718 /* Fix up caches for EFI payloads if necessary */ 1719 efi_exit_caches(); 1720 1721 /* This stops all lingering devices */ 1722 bootm_disable_interrupts(); 1723 1724 /* Disable boottime services */ 1725 systab.con_in_handle = NULL; 1726 systab.con_in = NULL; 1727 systab.con_out_handle = NULL; 1728 systab.con_out = NULL; 1729 systab.stderr_handle = NULL; 1730 systab.std_err = NULL; 1731 systab.boottime = NULL; 1732 1733 /* Recalculate CRC32 */ 1734 systab.hdr.crc32 = 0; 1735 systab.hdr.crc32 = crc32(0, (const unsigned char *)&systab, 1736 sizeof(struct efi_system_table)); 1737 1738 /* Give the payload some time to boot */ 1739 efi_set_watchdog(0); 1740 WATCHDOG_RESET(); 1741 1742 return EFI_EXIT(EFI_SUCCESS); 1743 } 1744 1745 /* 1746 * Get next value of the counter. 1747 * 1748 * This function implements the NextMonotonicCount service. 1749 * See the Unified Extensible Firmware Interface (UEFI) specification 1750 * for details. 1751 * 1752 * @count returned value of the counter 1753 * @return status code 1754 */ 1755 static efi_status_t EFIAPI efi_get_next_monotonic_count(uint64_t *count) 1756 { 1757 static uint64_t mono = 0; 1758 EFI_ENTRY("%p", count); 1759 *count = mono++; 1760 return EFI_EXIT(EFI_SUCCESS); 1761 } 1762 1763 /* 1764 * Sleep. 1765 * 1766 * This function implements the Stall sercive. 1767 * See the Unified Extensible Firmware Interface (UEFI) specification 1768 * for details. 1769 * 1770 * @microseconds period to sleep in microseconds 1771 * @return status code 1772 */ 1773 static efi_status_t EFIAPI efi_stall(unsigned long microseconds) 1774 { 1775 EFI_ENTRY("%ld", microseconds); 1776 udelay(microseconds); 1777 return EFI_EXIT(EFI_SUCCESS); 1778 } 1779 1780 /* 1781 * Reset the watchdog timer. 1782 * 1783 * This function implements the SetWatchdogTimer service. 1784 * See the Unified Extensible Firmware Interface (UEFI) specification 1785 * for details. 1786 * 1787 * @timeout seconds before reset by watchdog 1788 * @watchdog_code code to be logged when resetting 1789 * @data_size size of buffer in bytes 1790 * @watchdog_data buffer with data describing the reset reason 1791 * @return status code 1792 */ 1793 static efi_status_t EFIAPI efi_set_watchdog_timer(unsigned long timeout, 1794 uint64_t watchdog_code, 1795 unsigned long data_size, 1796 uint16_t *watchdog_data) 1797 { 1798 EFI_ENTRY("%ld, 0x%"PRIx64", %ld, %p", timeout, watchdog_code, 1799 data_size, watchdog_data); 1800 return EFI_EXIT(efi_set_watchdog(timeout)); 1801 } 1802 1803 /* 1804 * Close a protocol. 1805 * 1806 * This function implements the CloseProtocol service. 1807 * See the Unified Extensible Firmware Interface (UEFI) specification 1808 * for details. 1809 * 1810 * @handle handle on which the protocol shall be closed 1811 * @protocol GUID of the protocol to close 1812 * @agent_handle handle of the driver 1813 * @controller_handle handle of the controller 1814 * @return status code 1815 */ 1816 static efi_status_t EFIAPI efi_close_protocol(efi_handle_t handle, 1817 const efi_guid_t *protocol, 1818 efi_handle_t agent_handle, 1819 efi_handle_t controller_handle) 1820 { 1821 struct efi_handler *handler; 1822 struct efi_open_protocol_info_item *item; 1823 struct efi_open_protocol_info_item *pos; 1824 efi_status_t r; 1825 1826 EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, agent_handle, 1827 controller_handle); 1828 1829 if (!agent_handle) { 1830 r = EFI_INVALID_PARAMETER; 1831 goto out; 1832 } 1833 r = efi_search_protocol(handle, protocol, &handler); 1834 if (r != EFI_SUCCESS) 1835 goto out; 1836 1837 r = EFI_NOT_FOUND; 1838 list_for_each_entry_safe(item, pos, &handler->open_infos, link) { 1839 if (item->info.agent_handle == agent_handle && 1840 item->info.controller_handle == controller_handle) { 1841 efi_delete_open_info(item); 1842 r = EFI_SUCCESS; 1843 break; 1844 } 1845 } 1846 out: 1847 return EFI_EXIT(r); 1848 } 1849 1850 /* 1851 * Provide information about then open status of a protocol on a handle 1852 * 1853 * This function implements the OpenProtocolInformation service. 1854 * See the Unified Extensible Firmware Interface (UEFI) specification 1855 * for details. 1856 * 1857 * @handle handle for which the information shall be retrieved 1858 * @protocol GUID of the protocol 1859 * @entry_buffer buffer to receive the open protocol information 1860 * @entry_count number of entries available in the buffer 1861 * @return status code 1862 */ 1863 static efi_status_t EFIAPI efi_open_protocol_information(efi_handle_t handle, 1864 const efi_guid_t *protocol, 1865 struct efi_open_protocol_info_entry **entry_buffer, 1866 efi_uintn_t *entry_count) 1867 { 1868 unsigned long buffer_size; 1869 unsigned long count; 1870 struct efi_handler *handler; 1871 struct efi_open_protocol_info_item *item; 1872 efi_status_t r; 1873 1874 EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, entry_buffer, 1875 entry_count); 1876 1877 /* Check parameters */ 1878 if (!entry_buffer) { 1879 r = EFI_INVALID_PARAMETER; 1880 goto out; 1881 } 1882 r = efi_search_protocol(handle, protocol, &handler); 1883 if (r != EFI_SUCCESS) 1884 goto out; 1885 1886 /* Count entries */ 1887 count = 0; 1888 list_for_each_entry(item, &handler->open_infos, link) { 1889 if (item->info.open_count) 1890 ++count; 1891 } 1892 *entry_count = count; 1893 *entry_buffer = NULL; 1894 if (!count) { 1895 r = EFI_SUCCESS; 1896 goto out; 1897 } 1898 1899 /* Copy entries */ 1900 buffer_size = count * sizeof(struct efi_open_protocol_info_entry); 1901 r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size, 1902 (void **)entry_buffer); 1903 if (r != EFI_SUCCESS) 1904 goto out; 1905 list_for_each_entry_reverse(item, &handler->open_infos, link) { 1906 if (item->info.open_count) 1907 (*entry_buffer)[--count] = item->info; 1908 } 1909 out: 1910 return EFI_EXIT(r); 1911 } 1912 1913 /* 1914 * Get protocols installed on a handle. 1915 * 1916 * This function implements the ProtocolsPerHandleService. 1917 * See the Unified Extensible Firmware Interface (UEFI) specification 1918 * for details. 1919 * 1920 * @handle handle for which the information is retrieved 1921 * @protocol_buffer buffer with protocol GUIDs 1922 * @protocol_buffer_count number of entries in the buffer 1923 * @return status code 1924 */ 1925 static efi_status_t EFIAPI efi_protocols_per_handle( 1926 efi_handle_t handle, efi_guid_t ***protocol_buffer, 1927 efi_uintn_t *protocol_buffer_count) 1928 { 1929 unsigned long buffer_size; 1930 struct efi_object *efiobj; 1931 struct list_head *protocol_handle; 1932 efi_status_t r; 1933 1934 EFI_ENTRY("%p, %p, %p", handle, protocol_buffer, 1935 protocol_buffer_count); 1936 1937 if (!handle || !protocol_buffer || !protocol_buffer_count) 1938 return EFI_EXIT(EFI_INVALID_PARAMETER); 1939 1940 *protocol_buffer = NULL; 1941 *protocol_buffer_count = 0; 1942 1943 efiobj = efi_search_obj(handle); 1944 if (!efiobj) 1945 return EFI_EXIT(EFI_INVALID_PARAMETER); 1946 1947 /* Count protocols */ 1948 list_for_each(protocol_handle, &efiobj->protocols) { 1949 ++*protocol_buffer_count; 1950 } 1951 1952 /* Copy guids */ 1953 if (*protocol_buffer_count) { 1954 size_t j = 0; 1955 1956 buffer_size = sizeof(efi_guid_t *) * *protocol_buffer_count; 1957 r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size, 1958 (void **)protocol_buffer); 1959 if (r != EFI_SUCCESS) 1960 return EFI_EXIT(r); 1961 list_for_each(protocol_handle, &efiobj->protocols) { 1962 struct efi_handler *protocol; 1963 1964 protocol = list_entry(protocol_handle, 1965 struct efi_handler, link); 1966 (*protocol_buffer)[j] = (void *)protocol->guid; 1967 ++j; 1968 } 1969 } 1970 1971 return EFI_EXIT(EFI_SUCCESS); 1972 } 1973 1974 /* 1975 * Locate handles implementing a protocol. 1976 * 1977 * This function implements the LocateHandleBuffer service. 1978 * See the Unified Extensible Firmware Interface (UEFI) specification 1979 * for details. 1980 * 1981 * @search_type selection criterion 1982 * @protocol GUID of the protocol 1983 * @search_key registration key 1984 * @no_handles number of returned handles 1985 * @buffer buffer with the returned handles 1986 * @return status code 1987 */ 1988 static efi_status_t EFIAPI efi_locate_handle_buffer( 1989 enum efi_locate_search_type search_type, 1990 const efi_guid_t *protocol, void *search_key, 1991 efi_uintn_t *no_handles, efi_handle_t **buffer) 1992 { 1993 efi_status_t r; 1994 efi_uintn_t buffer_size = 0; 1995 1996 EFI_ENTRY("%d, %pUl, %p, %p, %p", search_type, protocol, search_key, 1997 no_handles, buffer); 1998 1999 if (!no_handles || !buffer) { 2000 r = EFI_INVALID_PARAMETER; 2001 goto out; 2002 } 2003 *no_handles = 0; 2004 *buffer = NULL; 2005 r = efi_locate_handle(search_type, protocol, search_key, &buffer_size, 2006 *buffer); 2007 if (r != EFI_BUFFER_TOO_SMALL) 2008 goto out; 2009 r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size, 2010 (void **)buffer); 2011 if (r != EFI_SUCCESS) 2012 goto out; 2013 r = efi_locate_handle(search_type, protocol, search_key, &buffer_size, 2014 *buffer); 2015 if (r == EFI_SUCCESS) 2016 *no_handles = buffer_size / sizeof(efi_handle_t); 2017 out: 2018 return EFI_EXIT(r); 2019 } 2020 2021 /* 2022 * Find an interface implementing a protocol. 2023 * 2024 * This function implements the LocateProtocol service. 2025 * See the Unified Extensible Firmware Interface (UEFI) specification 2026 * for details. 2027 * 2028 * @protocol GUID of the protocol 2029 * @registration registration key passed to the notification function 2030 * @protocol_interface interface implementing the protocol 2031 * @return status code 2032 */ 2033 static efi_status_t EFIAPI efi_locate_protocol(const efi_guid_t *protocol, 2034 void *registration, 2035 void **protocol_interface) 2036 { 2037 struct list_head *lhandle; 2038 efi_status_t ret; 2039 2040 EFI_ENTRY("%pUl, %p, %p", protocol, registration, protocol_interface); 2041 2042 if (!protocol || !protocol_interface) 2043 return EFI_EXIT(EFI_INVALID_PARAMETER); 2044 2045 list_for_each(lhandle, &efi_obj_list) { 2046 struct efi_object *efiobj; 2047 struct efi_handler *handler; 2048 2049 efiobj = list_entry(lhandle, struct efi_object, link); 2050 2051 ret = efi_search_protocol(efiobj->handle, protocol, &handler); 2052 if (ret == EFI_SUCCESS) { 2053 *protocol_interface = handler->protocol_interface; 2054 return EFI_EXIT(EFI_SUCCESS); 2055 } 2056 } 2057 *protocol_interface = NULL; 2058 2059 return EFI_EXIT(EFI_NOT_FOUND); 2060 } 2061 2062 /* 2063 * Get the device path and handle of an device implementing a protocol. 2064 * 2065 * This function implements the LocateDevicePath service. 2066 * See the Unified Extensible Firmware Interface (UEFI) specification 2067 * for details. 2068 * 2069 * @protocol GUID of the protocol 2070 * @device_path device path 2071 * @device handle of the device 2072 * @return status code 2073 */ 2074 static efi_status_t EFIAPI efi_locate_device_path( 2075 const efi_guid_t *protocol, 2076 struct efi_device_path **device_path, 2077 efi_handle_t *device) 2078 { 2079 struct efi_device_path *dp; 2080 size_t i; 2081 struct efi_handler *handler; 2082 efi_handle_t *handles; 2083 size_t len, len_dp; 2084 size_t len_best = 0; 2085 efi_uintn_t no_handles; 2086 u8 *remainder; 2087 efi_status_t ret; 2088 2089 EFI_ENTRY("%pUl, %p, %p", protocol, device_path, device); 2090 2091 if (!protocol || !device_path || !*device_path || !device) { 2092 ret = EFI_INVALID_PARAMETER; 2093 goto out; 2094 } 2095 2096 /* Find end of device path */ 2097 len = efi_dp_size(*device_path); 2098 2099 /* Get all handles implementing the protocol */ 2100 ret = EFI_CALL(efi_locate_handle_buffer(BY_PROTOCOL, protocol, NULL, 2101 &no_handles, &handles)); 2102 if (ret != EFI_SUCCESS) 2103 goto out; 2104 2105 for (i = 0; i < no_handles; ++i) { 2106 /* Find the device path protocol */ 2107 ret = efi_search_protocol(handles[i], &efi_guid_device_path, 2108 &handler); 2109 if (ret != EFI_SUCCESS) 2110 continue; 2111 dp = (struct efi_device_path *)handler->protocol_interface; 2112 len_dp = efi_dp_size(dp); 2113 /* 2114 * This handle can only be a better fit 2115 * if its device path length is longer than the best fit and 2116 * if its device path length is shorter of equal the searched 2117 * device path. 2118 */ 2119 if (len_dp <= len_best || len_dp > len) 2120 continue; 2121 /* Check if dp is a subpath of device_path */ 2122 if (memcmp(*device_path, dp, len_dp)) 2123 continue; 2124 *device = handles[i]; 2125 len_best = len_dp; 2126 } 2127 if (len_best) { 2128 remainder = (u8 *)*device_path + len_best; 2129 *device_path = (struct efi_device_path *)remainder; 2130 ret = EFI_SUCCESS; 2131 } else { 2132 ret = EFI_NOT_FOUND; 2133 } 2134 out: 2135 return EFI_EXIT(ret); 2136 } 2137 2138 /* 2139 * Install multiple protocol interfaces. 2140 * 2141 * This function implements the MultipleProtocolInterfaces service. 2142 * See the Unified Extensible Firmware Interface (UEFI) specification 2143 * for details. 2144 * 2145 * @handle handle on which the protocol interfaces shall be installed 2146 * @... NULL terminated argument list with pairs of protocol GUIDS and 2147 * interfaces 2148 * @return status code 2149 */ 2150 static efi_status_t EFIAPI efi_install_multiple_protocol_interfaces( 2151 void **handle, ...) 2152 { 2153 EFI_ENTRY("%p", handle); 2154 2155 va_list argptr; 2156 const efi_guid_t *protocol; 2157 void *protocol_interface; 2158 efi_status_t r = EFI_SUCCESS; 2159 int i = 0; 2160 2161 if (!handle) 2162 return EFI_EXIT(EFI_INVALID_PARAMETER); 2163 2164 va_start(argptr, handle); 2165 for (;;) { 2166 protocol = va_arg(argptr, efi_guid_t*); 2167 if (!protocol) 2168 break; 2169 protocol_interface = va_arg(argptr, void*); 2170 r = EFI_CALL(efi_install_protocol_interface( 2171 handle, protocol, 2172 EFI_NATIVE_INTERFACE, 2173 protocol_interface)); 2174 if (r != EFI_SUCCESS) 2175 break; 2176 i++; 2177 } 2178 va_end(argptr); 2179 if (r == EFI_SUCCESS) 2180 return EFI_EXIT(r); 2181 2182 /* If an error occurred undo all changes. */ 2183 va_start(argptr, handle); 2184 for (; i; --i) { 2185 protocol = va_arg(argptr, efi_guid_t*); 2186 protocol_interface = va_arg(argptr, void*); 2187 EFI_CALL(efi_uninstall_protocol_interface(handle, protocol, 2188 protocol_interface)); 2189 } 2190 va_end(argptr); 2191 2192 return EFI_EXIT(r); 2193 } 2194 2195 /* 2196 * Uninstall multiple protocol interfaces. 2197 * 2198 * This function implements the UninstallMultipleProtocolInterfaces service. 2199 * See the Unified Extensible Firmware Interface (UEFI) specification 2200 * for details. 2201 * 2202 * @handle handle from which the protocol interfaces shall be removed 2203 * @... NULL terminated argument list with pairs of protocol GUIDS and 2204 * interfaces 2205 * @return status code 2206 */ 2207 static efi_status_t EFIAPI efi_uninstall_multiple_protocol_interfaces( 2208 void *handle, ...) 2209 { 2210 EFI_ENTRY("%p", handle); 2211 2212 va_list argptr; 2213 const efi_guid_t *protocol; 2214 void *protocol_interface; 2215 efi_status_t r = EFI_SUCCESS; 2216 size_t i = 0; 2217 2218 if (!handle) 2219 return EFI_EXIT(EFI_INVALID_PARAMETER); 2220 2221 va_start(argptr, handle); 2222 for (;;) { 2223 protocol = va_arg(argptr, efi_guid_t*); 2224 if (!protocol) 2225 break; 2226 protocol_interface = va_arg(argptr, void*); 2227 r = EFI_CALL(efi_uninstall_protocol_interface( 2228 handle, protocol, 2229 protocol_interface)); 2230 if (r != EFI_SUCCESS) 2231 break; 2232 i++; 2233 } 2234 va_end(argptr); 2235 if (r == EFI_SUCCESS) 2236 return EFI_EXIT(r); 2237 2238 /* If an error occurred undo all changes. */ 2239 va_start(argptr, handle); 2240 for (; i; --i) { 2241 protocol = va_arg(argptr, efi_guid_t*); 2242 protocol_interface = va_arg(argptr, void*); 2243 EFI_CALL(efi_install_protocol_interface(&handle, protocol, 2244 EFI_NATIVE_INTERFACE, 2245 protocol_interface)); 2246 } 2247 va_end(argptr); 2248 2249 return EFI_EXIT(r); 2250 } 2251 2252 /* 2253 * Calculate cyclic redundancy code. 2254 * 2255 * This function implements the CalculateCrc32 service. 2256 * See the Unified Extensible Firmware Interface (UEFI) specification 2257 * for details. 2258 * 2259 * @data buffer with data 2260 * @data_size size of buffer in bytes 2261 * @crc32_p cyclic redundancy code 2262 * @return status code 2263 */ 2264 static efi_status_t EFIAPI efi_calculate_crc32(void *data, 2265 unsigned long data_size, 2266 uint32_t *crc32_p) 2267 { 2268 EFI_ENTRY("%p, %ld", data, data_size); 2269 *crc32_p = crc32(0, data, data_size); 2270 return EFI_EXIT(EFI_SUCCESS); 2271 } 2272 2273 /* 2274 * Copy memory. 2275 * 2276 * This function implements the CopyMem service. 2277 * See the Unified Extensible Firmware Interface (UEFI) specification 2278 * for details. 2279 * 2280 * @destination destination of the copy operation 2281 * @source source of the copy operation 2282 * @length number of bytes to copy 2283 */ 2284 static void EFIAPI efi_copy_mem(void *destination, const void *source, 2285 size_t length) 2286 { 2287 EFI_ENTRY("%p, %p, %ld", destination, source, (unsigned long)length); 2288 memcpy(destination, source, length); 2289 EFI_EXIT(EFI_SUCCESS); 2290 } 2291 2292 /* 2293 * Fill memory with a byte value. 2294 * 2295 * This function implements the SetMem service. 2296 * See the Unified Extensible Firmware Interface (UEFI) specification 2297 * for details. 2298 * 2299 * @buffer buffer to fill 2300 * @size size of buffer in bytes 2301 * @value byte to copy to the buffer 2302 */ 2303 static void EFIAPI efi_set_mem(void *buffer, size_t size, uint8_t value) 2304 { 2305 EFI_ENTRY("%p, %ld, 0x%x", buffer, (unsigned long)size, value); 2306 memset(buffer, value, size); 2307 EFI_EXIT(EFI_SUCCESS); 2308 } 2309 2310 /* 2311 * Open protocol interface on a handle. 2312 * 2313 * @handler handler of a protocol 2314 * @protocol_interface interface implementing the protocol 2315 * @agent_handle handle of the driver 2316 * @controller_handle handle of the controller 2317 * @attributes attributes indicating how to open the protocol 2318 * @return status code 2319 */ 2320 static efi_status_t efi_protocol_open( 2321 struct efi_handler *handler, 2322 void **protocol_interface, void *agent_handle, 2323 void *controller_handle, uint32_t attributes) 2324 { 2325 struct efi_open_protocol_info_item *item; 2326 struct efi_open_protocol_info_entry *match = NULL; 2327 bool opened_by_driver = false; 2328 bool opened_exclusive = false; 2329 2330 /* If there is no agent, only return the interface */ 2331 if (!agent_handle) 2332 goto out; 2333 2334 /* For TEST_PROTOCOL ignore interface attribute */ 2335 if (attributes != EFI_OPEN_PROTOCOL_TEST_PROTOCOL) 2336 *protocol_interface = NULL; 2337 2338 /* 2339 * Check if the protocol is already opened by a driver with the same 2340 * attributes or opened exclusively 2341 */ 2342 list_for_each_entry(item, &handler->open_infos, link) { 2343 if (item->info.agent_handle == agent_handle) { 2344 if ((attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) && 2345 (item->info.attributes == attributes)) 2346 return EFI_ALREADY_STARTED; 2347 } 2348 if (item->info.attributes & EFI_OPEN_PROTOCOL_EXCLUSIVE) 2349 opened_exclusive = true; 2350 } 2351 2352 /* Only one controller can open the protocol exclusively */ 2353 if (opened_exclusive && attributes & 2354 (EFI_OPEN_PROTOCOL_EXCLUSIVE | EFI_OPEN_PROTOCOL_BY_DRIVER)) 2355 return EFI_ACCESS_DENIED; 2356 2357 /* Prepare exclusive opening */ 2358 if (attributes & EFI_OPEN_PROTOCOL_EXCLUSIVE) { 2359 /* Try to disconnect controllers */ 2360 list_for_each_entry(item, &handler->open_infos, link) { 2361 if (item->info.attributes == 2362 EFI_OPEN_PROTOCOL_BY_DRIVER) 2363 EFI_CALL(efi_disconnect_controller( 2364 item->info.controller_handle, 2365 item->info.agent_handle, 2366 NULL)); 2367 } 2368 opened_by_driver = false; 2369 /* Check if all controllers are disconnected */ 2370 list_for_each_entry(item, &handler->open_infos, link) { 2371 if (item->info.attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) 2372 opened_by_driver = true; 2373 } 2374 /* Only one controller can be conncected */ 2375 if (opened_by_driver) 2376 return EFI_ACCESS_DENIED; 2377 } 2378 2379 /* Find existing entry */ 2380 list_for_each_entry(item, &handler->open_infos, link) { 2381 if (item->info.agent_handle == agent_handle && 2382 item->info.controller_handle == controller_handle) 2383 match = &item->info; 2384 } 2385 /* None found, create one */ 2386 if (!match) { 2387 match = efi_create_open_info(handler); 2388 if (!match) 2389 return EFI_OUT_OF_RESOURCES; 2390 } 2391 2392 match->agent_handle = agent_handle; 2393 match->controller_handle = controller_handle; 2394 match->attributes = attributes; 2395 match->open_count++; 2396 2397 out: 2398 /* For TEST_PROTOCOL ignore interface attribute. */ 2399 if (attributes != EFI_OPEN_PROTOCOL_TEST_PROTOCOL) 2400 *protocol_interface = handler->protocol_interface; 2401 2402 return EFI_SUCCESS; 2403 } 2404 2405 /* 2406 * Open protocol interface on a handle. 2407 * 2408 * This function implements the OpenProtocol interface. 2409 * See the Unified Extensible Firmware Interface (UEFI) specification 2410 * for details. 2411 * 2412 * @handle handle on which the protocol shall be opened 2413 * @protocol GUID of the protocol 2414 * @protocol_interface interface implementing the protocol 2415 * @agent_handle handle of the driver 2416 * @controller_handle handle of the controller 2417 * @attributes attributes indicating how to open the protocol 2418 * @return status code 2419 */ 2420 static efi_status_t EFIAPI efi_open_protocol( 2421 void *handle, const efi_guid_t *protocol, 2422 void **protocol_interface, void *agent_handle, 2423 void *controller_handle, uint32_t attributes) 2424 { 2425 struct efi_handler *handler; 2426 efi_status_t r = EFI_INVALID_PARAMETER; 2427 2428 EFI_ENTRY("%p, %pUl, %p, %p, %p, 0x%x", handle, protocol, 2429 protocol_interface, agent_handle, controller_handle, 2430 attributes); 2431 2432 if (!handle || !protocol || 2433 (!protocol_interface && attributes != 2434 EFI_OPEN_PROTOCOL_TEST_PROTOCOL)) { 2435 goto out; 2436 } 2437 2438 switch (attributes) { 2439 case EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL: 2440 case EFI_OPEN_PROTOCOL_GET_PROTOCOL: 2441 case EFI_OPEN_PROTOCOL_TEST_PROTOCOL: 2442 break; 2443 case EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER: 2444 if (controller_handle == handle) 2445 goto out; 2446 /* fall-through */ 2447 case EFI_OPEN_PROTOCOL_BY_DRIVER: 2448 case EFI_OPEN_PROTOCOL_BY_DRIVER | EFI_OPEN_PROTOCOL_EXCLUSIVE: 2449 /* Check that the controller handle is valid */ 2450 if (!efi_search_obj(controller_handle)) 2451 goto out; 2452 /* fall-through */ 2453 case EFI_OPEN_PROTOCOL_EXCLUSIVE: 2454 /* Check that the agent handle is valid */ 2455 if (!efi_search_obj(agent_handle)) 2456 goto out; 2457 break; 2458 default: 2459 goto out; 2460 } 2461 2462 r = efi_search_protocol(handle, protocol, &handler); 2463 if (r != EFI_SUCCESS) 2464 goto out; 2465 2466 r = efi_protocol_open(handler, protocol_interface, agent_handle, 2467 controller_handle, attributes); 2468 out: 2469 return EFI_EXIT(r); 2470 } 2471 2472 /* 2473 * Get interface of a protocol on a handle. 2474 * 2475 * This function implements the HandleProtocol service. 2476 * See the Unified Extensible Firmware Interface (UEFI) specification 2477 * for details. 2478 * 2479 * @handle handle on which the protocol shall be opened 2480 * @protocol GUID of the protocol 2481 * @protocol_interface interface implementing the protocol 2482 * @return status code 2483 */ 2484 static efi_status_t EFIAPI efi_handle_protocol(efi_handle_t handle, 2485 const efi_guid_t *protocol, 2486 void **protocol_interface) 2487 { 2488 return efi_open_protocol(handle, protocol, protocol_interface, NULL, 2489 NULL, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL); 2490 } 2491 2492 static efi_status_t efi_bind_controller( 2493 efi_handle_t controller_handle, 2494 efi_handle_t driver_image_handle, 2495 struct efi_device_path *remain_device_path) 2496 { 2497 struct efi_driver_binding_protocol *binding_protocol; 2498 efi_status_t r; 2499 2500 r = EFI_CALL(efi_open_protocol(driver_image_handle, 2501 &efi_guid_driver_binding_protocol, 2502 (void **)&binding_protocol, 2503 driver_image_handle, NULL, 2504 EFI_OPEN_PROTOCOL_GET_PROTOCOL)); 2505 if (r != EFI_SUCCESS) 2506 return r; 2507 r = EFI_CALL(binding_protocol->supported(binding_protocol, 2508 controller_handle, 2509 remain_device_path)); 2510 if (r == EFI_SUCCESS) 2511 r = EFI_CALL(binding_protocol->start(binding_protocol, 2512 controller_handle, 2513 remain_device_path)); 2514 EFI_CALL(efi_close_protocol(driver_image_handle, 2515 &efi_guid_driver_binding_protocol, 2516 driver_image_handle, NULL)); 2517 return r; 2518 } 2519 2520 static efi_status_t efi_connect_single_controller( 2521 efi_handle_t controller_handle, 2522 efi_handle_t *driver_image_handle, 2523 struct efi_device_path *remain_device_path) 2524 { 2525 efi_handle_t *buffer; 2526 size_t count; 2527 size_t i; 2528 efi_status_t r; 2529 size_t connected = 0; 2530 2531 /* Get buffer with all handles with driver binding protocol */ 2532 r = EFI_CALL(efi_locate_handle_buffer(BY_PROTOCOL, 2533 &efi_guid_driver_binding_protocol, 2534 NULL, &count, &buffer)); 2535 if (r != EFI_SUCCESS) 2536 return r; 2537 2538 /* Context Override */ 2539 if (driver_image_handle) { 2540 for (; *driver_image_handle; ++driver_image_handle) { 2541 for (i = 0; i < count; ++i) { 2542 if (buffer[i] == *driver_image_handle) { 2543 buffer[i] = NULL; 2544 r = efi_bind_controller( 2545 controller_handle, 2546 *driver_image_handle, 2547 remain_device_path); 2548 /* 2549 * For drivers that do not support the 2550 * controller or are already connected 2551 * we receive an error code here. 2552 */ 2553 if (r == EFI_SUCCESS) 2554 ++connected; 2555 } 2556 } 2557 } 2558 } 2559 2560 /* 2561 * TODO: Some overrides are not yet implemented: 2562 * - Platform Driver Override 2563 * - Driver Family Override Search 2564 * - Bus Specific Driver Override 2565 */ 2566 2567 /* Driver Binding Search */ 2568 for (i = 0; i < count; ++i) { 2569 if (buffer[i]) { 2570 r = efi_bind_controller(controller_handle, 2571 buffer[i], 2572 remain_device_path); 2573 if (r == EFI_SUCCESS) 2574 ++connected; 2575 } 2576 } 2577 2578 efi_free_pool(buffer); 2579 if (!connected) 2580 return EFI_NOT_FOUND; 2581 return EFI_SUCCESS; 2582 } 2583 2584 /* 2585 * Connect a controller to a driver. 2586 * 2587 * This function implements the ConnectController service. 2588 * See the Unified Extensible Firmware Interface (UEFI) specification 2589 * for details. 2590 * 2591 * First all driver binding protocol handles are tried for binding drivers. 2592 * Afterwards all handles that have openened a protocol of the controller 2593 * with EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER are connected to drivers. 2594 * 2595 * @controller_handle handle of the controller 2596 * @driver_image_handle handle of the driver 2597 * @remain_device_path device path of a child controller 2598 * @recursive true to connect all child controllers 2599 * @return status code 2600 */ 2601 static efi_status_t EFIAPI efi_connect_controller( 2602 efi_handle_t controller_handle, 2603 efi_handle_t *driver_image_handle, 2604 struct efi_device_path *remain_device_path, 2605 bool recursive) 2606 { 2607 efi_status_t r; 2608 efi_status_t ret = EFI_NOT_FOUND; 2609 struct efi_object *efiobj; 2610 2611 EFI_ENTRY("%p, %p, %p, %d", controller_handle, driver_image_handle, 2612 remain_device_path, recursive); 2613 2614 efiobj = efi_search_obj(controller_handle); 2615 if (!efiobj) { 2616 ret = EFI_INVALID_PARAMETER; 2617 goto out; 2618 } 2619 2620 r = efi_connect_single_controller(controller_handle, 2621 driver_image_handle, 2622 remain_device_path); 2623 if (r == EFI_SUCCESS) 2624 ret = EFI_SUCCESS; 2625 if (recursive) { 2626 struct efi_handler *handler; 2627 struct efi_open_protocol_info_item *item; 2628 2629 list_for_each_entry(handler, &efiobj->protocols, link) { 2630 list_for_each_entry(item, &handler->open_infos, link) { 2631 if (item->info.attributes & 2632 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) { 2633 r = EFI_CALL(efi_connect_controller( 2634 item->info.controller_handle, 2635 driver_image_handle, 2636 remain_device_path, 2637 recursive)); 2638 if (r == EFI_SUCCESS) 2639 ret = EFI_SUCCESS; 2640 } 2641 } 2642 } 2643 } 2644 /* Check for child controller specified by end node */ 2645 if (ret != EFI_SUCCESS && remain_device_path && 2646 remain_device_path->type == DEVICE_PATH_TYPE_END) 2647 ret = EFI_SUCCESS; 2648 out: 2649 return EFI_EXIT(ret); 2650 } 2651 2652 /* 2653 * Get all child controllers associated to a driver. 2654 * The allocated buffer has to be freed with free(). 2655 * 2656 * @efiobj handle of the controller 2657 * @driver_handle handle of the driver 2658 * @number_of_children number of child controllers 2659 * @child_handle_buffer handles of the the child controllers 2660 */ 2661 static efi_status_t efi_get_child_controllers( 2662 struct efi_object *efiobj, 2663 efi_handle_t driver_handle, 2664 efi_uintn_t *number_of_children, 2665 efi_handle_t **child_handle_buffer) 2666 { 2667 struct efi_handler *handler; 2668 struct efi_open_protocol_info_item *item; 2669 efi_uintn_t count = 0, i; 2670 bool duplicate; 2671 2672 /* Count all child controller associations */ 2673 list_for_each_entry(handler, &efiobj->protocols, link) { 2674 list_for_each_entry(item, &handler->open_infos, link) { 2675 if (item->info.agent_handle == driver_handle && 2676 item->info.attributes & 2677 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) 2678 ++count; 2679 } 2680 } 2681 /* 2682 * Create buffer. In case of duplicate child controller assignments 2683 * the buffer will be too large. But that does not harm. 2684 */ 2685 *number_of_children = 0; 2686 *child_handle_buffer = calloc(count, sizeof(efi_handle_t)); 2687 if (!*child_handle_buffer) 2688 return EFI_OUT_OF_RESOURCES; 2689 /* Copy unique child handles */ 2690 list_for_each_entry(handler, &efiobj->protocols, link) { 2691 list_for_each_entry(item, &handler->open_infos, link) { 2692 if (item->info.agent_handle == driver_handle && 2693 item->info.attributes & 2694 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) { 2695 /* Check this is a new child controller */ 2696 duplicate = false; 2697 for (i = 0; i < *number_of_children; ++i) { 2698 if ((*child_handle_buffer)[i] == 2699 item->info.controller_handle) 2700 duplicate = true; 2701 } 2702 /* Copy handle to buffer */ 2703 if (!duplicate) { 2704 i = (*number_of_children)++; 2705 (*child_handle_buffer)[i] = 2706 item->info.controller_handle; 2707 } 2708 } 2709 } 2710 } 2711 return EFI_SUCCESS; 2712 } 2713 2714 /* 2715 * Disconnect a controller from a driver. 2716 * 2717 * This function implements the DisconnectController service. 2718 * See the Unified Extensible Firmware Interface (UEFI) specification 2719 * for details. 2720 * 2721 * @controller_handle handle of the controller 2722 * @driver_image_handle handle of the driver 2723 * @child_handle handle of the child to destroy 2724 * @return status code 2725 */ 2726 static efi_status_t EFIAPI efi_disconnect_controller( 2727 efi_handle_t controller_handle, 2728 efi_handle_t driver_image_handle, 2729 efi_handle_t child_handle) 2730 { 2731 struct efi_driver_binding_protocol *binding_protocol; 2732 efi_handle_t *child_handle_buffer = NULL; 2733 size_t number_of_children = 0; 2734 efi_status_t r; 2735 size_t stop_count = 0; 2736 struct efi_object *efiobj; 2737 2738 EFI_ENTRY("%p, %p, %p", controller_handle, driver_image_handle, 2739 child_handle); 2740 2741 efiobj = efi_search_obj(controller_handle); 2742 if (!efiobj) { 2743 r = EFI_INVALID_PARAMETER; 2744 goto out; 2745 } 2746 2747 if (child_handle && !efi_search_obj(child_handle)) { 2748 r = EFI_INVALID_PARAMETER; 2749 goto out; 2750 } 2751 2752 /* If no driver handle is supplied, disconnect all drivers */ 2753 if (!driver_image_handle) { 2754 r = efi_disconnect_all_drivers(efiobj, NULL, child_handle); 2755 goto out; 2756 } 2757 2758 /* Create list of child handles */ 2759 if (child_handle) { 2760 number_of_children = 1; 2761 child_handle_buffer = &child_handle; 2762 } else { 2763 efi_get_child_controllers(efiobj, 2764 driver_image_handle, 2765 &number_of_children, 2766 &child_handle_buffer); 2767 } 2768 2769 /* Get the driver binding protocol */ 2770 r = EFI_CALL(efi_open_protocol(driver_image_handle, 2771 &efi_guid_driver_binding_protocol, 2772 (void **)&binding_protocol, 2773 driver_image_handle, NULL, 2774 EFI_OPEN_PROTOCOL_GET_PROTOCOL)); 2775 if (r != EFI_SUCCESS) 2776 goto out; 2777 /* Remove the children */ 2778 if (number_of_children) { 2779 r = EFI_CALL(binding_protocol->stop(binding_protocol, 2780 controller_handle, 2781 number_of_children, 2782 child_handle_buffer)); 2783 if (r == EFI_SUCCESS) 2784 ++stop_count; 2785 } 2786 /* Remove the driver */ 2787 if (!child_handle) 2788 r = EFI_CALL(binding_protocol->stop(binding_protocol, 2789 controller_handle, 2790 0, NULL)); 2791 if (r == EFI_SUCCESS) 2792 ++stop_count; 2793 EFI_CALL(efi_close_protocol(driver_image_handle, 2794 &efi_guid_driver_binding_protocol, 2795 driver_image_handle, NULL)); 2796 2797 if (stop_count) 2798 r = EFI_SUCCESS; 2799 else 2800 r = EFI_NOT_FOUND; 2801 out: 2802 if (!child_handle) 2803 free(child_handle_buffer); 2804 return EFI_EXIT(r); 2805 } 2806 2807 static const struct efi_boot_services efi_boot_services = { 2808 .hdr = { 2809 .headersize = sizeof(struct efi_table_hdr), 2810 }, 2811 .raise_tpl = efi_raise_tpl, 2812 .restore_tpl = efi_restore_tpl, 2813 .allocate_pages = efi_allocate_pages_ext, 2814 .free_pages = efi_free_pages_ext, 2815 .get_memory_map = efi_get_memory_map_ext, 2816 .allocate_pool = efi_allocate_pool_ext, 2817 .free_pool = efi_free_pool_ext, 2818 .create_event = efi_create_event_ext, 2819 .set_timer = efi_set_timer_ext, 2820 .wait_for_event = efi_wait_for_event, 2821 .signal_event = efi_signal_event_ext, 2822 .close_event = efi_close_event, 2823 .check_event = efi_check_event, 2824 .install_protocol_interface = efi_install_protocol_interface, 2825 .reinstall_protocol_interface = efi_reinstall_protocol_interface, 2826 .uninstall_protocol_interface = efi_uninstall_protocol_interface, 2827 .handle_protocol = efi_handle_protocol, 2828 .reserved = NULL, 2829 .register_protocol_notify = efi_register_protocol_notify, 2830 .locate_handle = efi_locate_handle_ext, 2831 .locate_device_path = efi_locate_device_path, 2832 .install_configuration_table = efi_install_configuration_table_ext, 2833 .load_image = efi_load_image, 2834 .start_image = efi_start_image, 2835 .exit = efi_exit, 2836 .unload_image = efi_unload_image, 2837 .exit_boot_services = efi_exit_boot_services, 2838 .get_next_monotonic_count = efi_get_next_monotonic_count, 2839 .stall = efi_stall, 2840 .set_watchdog_timer = efi_set_watchdog_timer, 2841 .connect_controller = efi_connect_controller, 2842 .disconnect_controller = efi_disconnect_controller, 2843 .open_protocol = efi_open_protocol, 2844 .close_protocol = efi_close_protocol, 2845 .open_protocol_information = efi_open_protocol_information, 2846 .protocols_per_handle = efi_protocols_per_handle, 2847 .locate_handle_buffer = efi_locate_handle_buffer, 2848 .locate_protocol = efi_locate_protocol, 2849 .install_multiple_protocol_interfaces = efi_install_multiple_protocol_interfaces, 2850 .uninstall_multiple_protocol_interfaces = efi_uninstall_multiple_protocol_interfaces, 2851 .calculate_crc32 = efi_calculate_crc32, 2852 .copy_mem = efi_copy_mem, 2853 .set_mem = efi_set_mem, 2854 }; 2855 2856 2857 static uint16_t __efi_runtime_data firmware_vendor[] = L"Das U-Boot"; 2858 2859 struct efi_system_table __efi_runtime_data systab = { 2860 .hdr = { 2861 .signature = EFI_SYSTEM_TABLE_SIGNATURE, 2862 .revision = 0x20005, /* 2.5 */ 2863 .headersize = sizeof(struct efi_table_hdr), 2864 }, 2865 .fw_vendor = (long)firmware_vendor, 2866 .con_in = (void*)&efi_con_in, 2867 .con_out = (void*)&efi_con_out, 2868 .std_err = (void*)&efi_con_out, 2869 .runtime = (void*)&efi_runtime_services, 2870 .boottime = (void*)&efi_boot_services, 2871 .nr_tables = 0, 2872 .tables = (void*)efi_conf_table, 2873 }; 2874