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 UINTN 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 60 /* Called on every callback entry */ 61 int __efi_entry_check(void) 62 { 63 int ret = entry_count++ == 0; 64 #ifdef CONFIG_ARM 65 assert(efi_gd); 66 app_gd = gd; 67 gd = efi_gd; 68 #endif 69 return ret; 70 } 71 72 /* Called on every callback exit */ 73 int __efi_exit_check(void) 74 { 75 int ret = --entry_count == 0; 76 #ifdef CONFIG_ARM 77 gd = app_gd; 78 #endif 79 return ret; 80 } 81 82 /* Called from do_bootefi_exec() */ 83 void efi_save_gd(void) 84 { 85 #ifdef CONFIG_ARM 86 efi_gd = gd; 87 #endif 88 } 89 90 /* 91 * Special case handler for error/abort that just forces things back 92 * to u-boot world so we can dump out an abort msg, without any care 93 * about returning back to UEFI world. 94 */ 95 void efi_restore_gd(void) 96 { 97 #ifdef CONFIG_ARM 98 /* Only restore if we're already in EFI context */ 99 if (!efi_gd) 100 return; 101 gd = efi_gd; 102 #endif 103 } 104 105 /* 106 * Two spaces per indent level, maxing out at 10.. which ought to be 107 * enough for anyone ;-) 108 */ 109 static const char *indent_string(int level) 110 { 111 const char *indent = " "; 112 const int max = strlen(indent); 113 level = min(max, level * 2); 114 return &indent[max - level]; 115 } 116 117 const char *__efi_nesting(void) 118 { 119 return indent_string(nesting_level); 120 } 121 122 const char *__efi_nesting_inc(void) 123 { 124 return indent_string(nesting_level++); 125 } 126 127 const char *__efi_nesting_dec(void) 128 { 129 return indent_string(--nesting_level); 130 } 131 132 /* 133 * Queue an EFI event. 134 * 135 * This function queues the notification function of the event for future 136 * execution. 137 * 138 * The notification function is called if the task priority level of the 139 * event is higher than the current task priority level. 140 * 141 * For the SignalEvent service see efi_signal_event_ext. 142 * 143 * @event event to signal 144 */ 145 void efi_signal_event(struct efi_event *event) 146 { 147 if (event->notify_function) { 148 event->is_queued = true; 149 /* Check TPL */ 150 if (efi_tpl >= event->notify_tpl) 151 return; 152 EFI_CALL_VOID(event->notify_function(event, 153 event->notify_context)); 154 } 155 event->is_queued = false; 156 } 157 158 /* 159 * Write a debug message for an EPI API service that is not implemented yet. 160 * 161 * @funcname function that is not yet implemented 162 * @return EFI_UNSUPPORTED 163 */ 164 static efi_status_t efi_unsupported(const char *funcname) 165 { 166 debug("EFI: App called into unimplemented function %s\n", funcname); 167 return EFI_EXIT(EFI_UNSUPPORTED); 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(UINTN new_tpl) 181 { 182 UINTN 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(UINTN 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 unsigned long pages, 233 uint64_t *memory) 234 { 235 efi_status_t r; 236 237 EFI_ENTRY("%d, %d, 0x%lx, %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 unsigned long pages) 255 { 256 efi_status_t r; 257 258 EFI_ENTRY("%"PRIx64", 0x%lx", 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 unsigned long *memory_map_size, 280 struct efi_mem_desc *memory_map, 281 unsigned long *map_key, 282 unsigned long *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 unsigned long size, 308 void **buffer) 309 { 310 efi_status_t r; 311 312 EFI_ENTRY("%d, %ld, %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 static efi_status_t efi_create_handle(void **handle) 337 { 338 struct efi_object *obj; 339 efi_status_t r; 340 341 r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, 342 sizeof(struct efi_object), 343 (void **)&obj); 344 if (r != EFI_SUCCESS) 345 return r; 346 memset(obj, 0, sizeof(struct efi_object)); 347 obj->handle = obj; 348 list_add_tail(&obj->link, &efi_obj_list); 349 *handle = obj; 350 return r; 351 } 352 353 /* 354 * Our event capabilities are very limited. Only a small limited 355 * number of events is allowed to coexist. 356 */ 357 static struct efi_event efi_events[16]; 358 359 /* 360 * Create an event. 361 * 362 * This function is used inside U-Boot code to create an event. 363 * 364 * For the API function implementing the CreateEvent service see 365 * efi_create_event_ext. 366 * 367 * @type type of the event to create 368 * @notify_tpl task priority level of the event 369 * @notify_function notification function of the event 370 * @notify_context pointer passed to the notification function 371 * @event created event 372 * @return status code 373 */ 374 efi_status_t efi_create_event(uint32_t type, UINTN notify_tpl, 375 void (EFIAPI *notify_function) ( 376 struct efi_event *event, 377 void *context), 378 void *notify_context, struct efi_event **event) 379 { 380 int i; 381 382 if (event == NULL) 383 return EFI_INVALID_PARAMETER; 384 385 if ((type & EVT_NOTIFY_SIGNAL) && (type & EVT_NOTIFY_WAIT)) 386 return EFI_INVALID_PARAMETER; 387 388 if ((type & (EVT_NOTIFY_SIGNAL|EVT_NOTIFY_WAIT)) && 389 notify_function == NULL) 390 return EFI_INVALID_PARAMETER; 391 392 for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { 393 if (efi_events[i].type) 394 continue; 395 efi_events[i].type = type; 396 efi_events[i].notify_tpl = notify_tpl; 397 efi_events[i].notify_function = notify_function; 398 efi_events[i].notify_context = notify_context; 399 /* Disable timers on bootup */ 400 efi_events[i].trigger_next = -1ULL; 401 efi_events[i].is_queued = false; 402 efi_events[i].is_signaled = false; 403 *event = &efi_events[i]; 404 return EFI_SUCCESS; 405 } 406 return EFI_OUT_OF_RESOURCES; 407 } 408 409 /* 410 * Create an event. 411 * 412 * This function implements the CreateEvent service. 413 * See the Unified Extensible Firmware Interface (UEFI) specification 414 * for details. 415 * 416 * @type type of the event to create 417 * @notify_tpl task priority level of the event 418 * @notify_function notification function of the event 419 * @notify_context pointer passed to the notification function 420 * @event created event 421 * @return status code 422 */ 423 static efi_status_t EFIAPI efi_create_event_ext( 424 uint32_t type, UINTN notify_tpl, 425 void (EFIAPI *notify_function) ( 426 struct efi_event *event, 427 void *context), 428 void *notify_context, struct efi_event **event) 429 { 430 EFI_ENTRY("%d, 0x%zx, %p, %p", type, notify_tpl, notify_function, 431 notify_context); 432 return EFI_EXIT(efi_create_event(type, notify_tpl, notify_function, 433 notify_context, event)); 434 } 435 436 437 /* 438 * Check if a timer event has occurred or a queued notification function should 439 * be called. 440 * 441 * Our timers have to work without interrupts, so we check whenever keyboard 442 * input or disk accesses happen if enough time elapsed for them to fire. 443 */ 444 void efi_timer_check(void) 445 { 446 int i; 447 u64 now = timer_get_us(); 448 449 for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { 450 if (!efi_events[i].type) 451 continue; 452 if (efi_events[i].is_queued) 453 efi_signal_event(&efi_events[i]); 454 if (!(efi_events[i].type & EVT_TIMER) || 455 now < efi_events[i].trigger_next) 456 continue; 457 switch (efi_events[i].trigger_type) { 458 case EFI_TIMER_RELATIVE: 459 efi_events[i].trigger_type = EFI_TIMER_STOP; 460 break; 461 case EFI_TIMER_PERIODIC: 462 efi_events[i].trigger_next += 463 efi_events[i].trigger_time; 464 break; 465 default: 466 continue; 467 } 468 efi_events[i].is_signaled = true; 469 efi_signal_event(&efi_events[i]); 470 } 471 WATCHDOG_RESET(); 472 } 473 474 /* 475 * Set the trigger time for a timer event or stop the event. 476 * 477 * This is the function for internal usage in U-Boot. For the API function 478 * implementing the SetTimer service see efi_set_timer_ext. 479 * 480 * @event event for which the timer is set 481 * @type type of the timer 482 * @trigger_time trigger period in multiples of 100ns 483 * @return status code 484 */ 485 efi_status_t efi_set_timer(struct efi_event *event, enum efi_timer_delay type, 486 uint64_t trigger_time) 487 { 488 int i; 489 490 /* 491 * The parameter defines a multiple of 100ns. 492 * We use multiples of 1000ns. So divide by 10. 493 */ 494 do_div(trigger_time, 10); 495 496 for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { 497 if (event != &efi_events[i]) 498 continue; 499 500 if (!(event->type & EVT_TIMER)) 501 break; 502 switch (type) { 503 case EFI_TIMER_STOP: 504 event->trigger_next = -1ULL; 505 break; 506 case EFI_TIMER_PERIODIC: 507 case EFI_TIMER_RELATIVE: 508 event->trigger_next = 509 timer_get_us() + trigger_time; 510 break; 511 default: 512 return EFI_INVALID_PARAMETER; 513 } 514 event->trigger_type = type; 515 event->trigger_time = trigger_time; 516 event->is_signaled = false; 517 return EFI_SUCCESS; 518 } 519 return EFI_INVALID_PARAMETER; 520 } 521 522 /* 523 * Set the trigger time for a timer event or stop the event. 524 * 525 * This function implements the SetTimer service. 526 * See the Unified Extensible Firmware Interface (UEFI) specification 527 * for details. 528 * 529 * @event event for which the timer is set 530 * @type type of the timer 531 * @trigger_time trigger period in multiples of 100ns 532 * @return status code 533 */ 534 static efi_status_t EFIAPI efi_set_timer_ext(struct efi_event *event, 535 enum efi_timer_delay type, 536 uint64_t trigger_time) 537 { 538 EFI_ENTRY("%p, %d, %"PRIx64, event, type, trigger_time); 539 return EFI_EXIT(efi_set_timer(event, type, trigger_time)); 540 } 541 542 /* 543 * Wait for events to be signaled. 544 * 545 * This function implements the WaitForEvent service. 546 * See the Unified Extensible Firmware Interface (UEFI) specification 547 * for details. 548 * 549 * @num_events number of events to be waited for 550 * @events events to be waited for 551 * @index index of the event that was signaled 552 * @return status code 553 */ 554 static efi_status_t EFIAPI efi_wait_for_event(unsigned long num_events, 555 struct efi_event **event, 556 size_t *index) 557 { 558 int i, j; 559 560 EFI_ENTRY("%ld, %p, %p", num_events, event, index); 561 562 /* Check parameters */ 563 if (!num_events || !event) 564 return EFI_EXIT(EFI_INVALID_PARAMETER); 565 /* Check TPL */ 566 if (efi_tpl != TPL_APPLICATION) 567 return EFI_EXIT(EFI_UNSUPPORTED); 568 for (i = 0; i < num_events; ++i) { 569 for (j = 0; j < ARRAY_SIZE(efi_events); ++j) { 570 if (event[i] == &efi_events[j]) 571 goto known_event; 572 } 573 return EFI_EXIT(EFI_INVALID_PARAMETER); 574 known_event: 575 if (!event[i]->type || event[i]->type & EVT_NOTIFY_SIGNAL) 576 return EFI_EXIT(EFI_INVALID_PARAMETER); 577 if (!event[i]->is_signaled) 578 efi_signal_event(event[i]); 579 } 580 581 /* Wait for signal */ 582 for (;;) { 583 for (i = 0; i < num_events; ++i) { 584 if (event[i]->is_signaled) 585 goto out; 586 } 587 /* Allow events to occur. */ 588 efi_timer_check(); 589 } 590 591 out: 592 /* 593 * Reset the signal which is passed to the caller to allow periodic 594 * events to occur. 595 */ 596 event[i]->is_signaled = false; 597 if (index) 598 *index = i; 599 600 return EFI_EXIT(EFI_SUCCESS); 601 } 602 603 /* 604 * Signal an EFI event. 605 * 606 * This function implements the SignalEvent service. 607 * See the Unified Extensible Firmware Interface (UEFI) specification 608 * for details. 609 * 610 * This functions sets the signaled state of the event and queues the 611 * notification function for execution. 612 * 613 * @event event to signal 614 * @return status code 615 */ 616 static efi_status_t EFIAPI efi_signal_event_ext(struct efi_event *event) 617 { 618 int i; 619 620 EFI_ENTRY("%p", event); 621 for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { 622 if (event != &efi_events[i]) 623 continue; 624 if (event->is_signaled) 625 break; 626 event->is_signaled = true; 627 if (event->type & EVT_NOTIFY_SIGNAL) 628 efi_signal_event(event); 629 break; 630 } 631 return EFI_EXIT(EFI_SUCCESS); 632 } 633 634 /* 635 * Close an EFI event. 636 * 637 * This function implements the CloseEvent service. 638 * See the Unified Extensible Firmware Interface (UEFI) specification 639 * for details. 640 * 641 * @event event to close 642 * @return status code 643 */ 644 static efi_status_t EFIAPI efi_close_event(struct efi_event *event) 645 { 646 int i; 647 648 EFI_ENTRY("%p", event); 649 for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { 650 if (event == &efi_events[i]) { 651 event->type = 0; 652 event->trigger_next = -1ULL; 653 event->is_queued = false; 654 event->is_signaled = false; 655 return EFI_EXIT(EFI_SUCCESS); 656 } 657 } 658 return EFI_EXIT(EFI_INVALID_PARAMETER); 659 } 660 661 /* 662 * Check if an event is signaled. 663 * 664 * This function implements the CheckEvent service. 665 * See the Unified Extensible Firmware Interface (UEFI) specification 666 * for details. 667 * 668 * If an event is not signaled yet the notification function is queued. 669 * 670 * @event event to check 671 * @return status code 672 */ 673 static efi_status_t EFIAPI efi_check_event(struct efi_event *event) 674 { 675 int i; 676 677 EFI_ENTRY("%p", event); 678 efi_timer_check(); 679 for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { 680 if (event != &efi_events[i]) 681 continue; 682 if (!event->type || event->type & EVT_NOTIFY_SIGNAL) 683 break; 684 if (!event->is_signaled) 685 efi_signal_event(event); 686 if (event->is_signaled) 687 return EFI_EXIT(EFI_SUCCESS); 688 return EFI_EXIT(EFI_NOT_READY); 689 } 690 return EFI_EXIT(EFI_INVALID_PARAMETER); 691 } 692 693 /* 694 * Install protocol interface. 695 * 696 * This is the function for internal calls. For the API implementation of the 697 * InstallProtocolInterface service see function 698 * efi_install_protocol_interface_ext. 699 * 700 * @handle handle on which the protocol shall be installed 701 * @protocol GUID of the protocol to be installed 702 * @protocol_interface_type type of the interface to be installed, 703 * always EFI_NATIVE_INTERFACE 704 * @protocol_interface interface of the protocol implementation 705 * @return status code 706 */ 707 static efi_status_t EFIAPI efi_install_protocol_interface(void **handle, 708 const efi_guid_t *protocol, int protocol_interface_type, 709 void *protocol_interface) 710 { 711 struct list_head *lhandle; 712 int i; 713 efi_status_t r; 714 715 if (!handle || !protocol || 716 protocol_interface_type != EFI_NATIVE_INTERFACE) { 717 r = EFI_INVALID_PARAMETER; 718 goto out; 719 } 720 721 /* Create new handle if requested. */ 722 if (!*handle) { 723 r = efi_create_handle(handle); 724 if (r != EFI_SUCCESS) 725 goto out; 726 } 727 /* Find object. */ 728 list_for_each(lhandle, &efi_obj_list) { 729 struct efi_object *efiobj; 730 efiobj = list_entry(lhandle, struct efi_object, link); 731 732 if (efiobj->handle != *handle) 733 continue; 734 /* Check if protocol is already installed on the handle. */ 735 for (i = 0; i < ARRAY_SIZE(efiobj->protocols); i++) { 736 struct efi_handler *handler = &efiobj->protocols[i]; 737 738 if (!handler->guid) 739 continue; 740 if (!guidcmp(handler->guid, protocol)) { 741 r = EFI_INVALID_PARAMETER; 742 goto out; 743 } 744 } 745 /* Install protocol in first empty slot. */ 746 for (i = 0; i < ARRAY_SIZE(efiobj->protocols); i++) { 747 struct efi_handler *handler = &efiobj->protocols[i]; 748 749 if (handler->guid) 750 continue; 751 752 handler->guid = protocol; 753 handler->protocol_interface = protocol_interface; 754 r = EFI_SUCCESS; 755 goto out; 756 } 757 r = EFI_OUT_OF_RESOURCES; 758 goto out; 759 } 760 r = EFI_INVALID_PARAMETER; 761 out: 762 return r; 763 } 764 765 /* 766 * Install protocol interface. 767 * 768 * This function implements the InstallProtocolInterface service. 769 * See the Unified Extensible Firmware Interface (UEFI) specification 770 * for details. 771 * 772 * @handle handle on which the protocol shall be installed 773 * @protocol GUID of the protocol to be installed 774 * @protocol_interface_type type of the interface to be installed, 775 * always EFI_NATIVE_INTERFACE 776 * @protocol_interface interface of the protocol implementation 777 * @return status code 778 */ 779 static efi_status_t EFIAPI efi_install_protocol_interface_ext(void **handle, 780 const efi_guid_t *protocol, int protocol_interface_type, 781 void *protocol_interface) 782 { 783 EFI_ENTRY("%p, %pUl, %d, %p", handle, protocol, protocol_interface_type, 784 protocol_interface); 785 786 return EFI_EXIT(efi_install_protocol_interface(handle, protocol, 787 protocol_interface_type, 788 protocol_interface)); 789 } 790 791 /* 792 * Reinstall protocol interface. 793 * 794 * This function implements the ReinstallProtocolInterface service. 795 * See the Unified Extensible Firmware Interface (UEFI) specification 796 * for details. 797 * 798 * @handle handle on which the protocol shall be 799 * reinstalled 800 * @protocol GUID of the protocol to be installed 801 * @old_interface interface to be removed 802 * @new_interface interface to be installed 803 * @return status code 804 */ 805 static efi_status_t EFIAPI efi_reinstall_protocol_interface(void *handle, 806 const efi_guid_t *protocol, void *old_interface, 807 void *new_interface) 808 { 809 EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, old_interface, 810 new_interface); 811 return EFI_EXIT(EFI_ACCESS_DENIED); 812 } 813 814 /* 815 * Uninstall protocol interface. 816 * 817 * This is the function for internal calls. For the API implementation of the 818 * UninstallProtocolInterface service see function 819 * efi_uninstall_protocol_interface_ext. 820 * 821 * @handle handle from which the protocol shall be removed 822 * @protocol GUID of the protocol to be removed 823 * @protocol_interface interface to be removed 824 * @return status code 825 */ 826 static efi_status_t EFIAPI efi_uninstall_protocol_interface(void *handle, 827 const efi_guid_t *protocol, void *protocol_interface) 828 { 829 struct list_head *lhandle; 830 int i; 831 efi_status_t r = EFI_NOT_FOUND; 832 833 if (!handle || !protocol) { 834 r = EFI_INVALID_PARAMETER; 835 goto out; 836 } 837 838 list_for_each(lhandle, &efi_obj_list) { 839 struct efi_object *efiobj; 840 efiobj = list_entry(lhandle, struct efi_object, link); 841 842 if (efiobj->handle != handle) 843 continue; 844 845 for (i = 0; i < ARRAY_SIZE(efiobj->protocols); i++) { 846 struct efi_handler *handler = &efiobj->protocols[i]; 847 const efi_guid_t *hprotocol = handler->guid; 848 849 if (!hprotocol) 850 continue; 851 if (!guidcmp(hprotocol, protocol)) { 852 if (handler->protocol_interface) { 853 r = EFI_ACCESS_DENIED; 854 } else { 855 handler->guid = 0; 856 r = EFI_SUCCESS; 857 } 858 goto out; 859 } 860 } 861 } 862 863 out: 864 return r; 865 } 866 867 /* 868 * Uninstall protocol interface. 869 * 870 * This function implements the UninstallProtocolInterface service. 871 * See the Unified Extensible Firmware Interface (UEFI) specification 872 * for details. 873 * 874 * @handle handle from which the protocol shall be removed 875 * @protocol GUID of the protocol to be removed 876 * @protocol_interface interface to be removed 877 * @return status code 878 */ 879 static efi_status_t EFIAPI efi_uninstall_protocol_interface_ext(void *handle, 880 const efi_guid_t *protocol, void *protocol_interface) 881 { 882 EFI_ENTRY("%p, %pUl, %p", handle, protocol, protocol_interface); 883 884 return EFI_EXIT(efi_uninstall_protocol_interface(handle, protocol, 885 protocol_interface)); 886 } 887 888 /* 889 * Register an event for notification when a protocol is installed. 890 * 891 * This function implements the RegisterProtocolNotify service. 892 * See the Unified Extensible Firmware Interface (UEFI) specification 893 * for details. 894 * 895 * @protocol GUID of the protocol whose installation shall be 896 * notified 897 * @event event to be signaled upon installation of the protocol 898 * @registration key for retrieving the registration information 899 * @return status code 900 */ 901 static efi_status_t EFIAPI efi_register_protocol_notify( 902 const efi_guid_t *protocol, 903 struct efi_event *event, 904 void **registration) 905 { 906 EFI_ENTRY("%pUl, %p, %p", protocol, event, registration); 907 return EFI_EXIT(EFI_OUT_OF_RESOURCES); 908 } 909 910 /* 911 * Determine if an EFI handle implements a protocol. 912 * 913 * See the documentation of the LocateHandle service in the UEFI specification. 914 * 915 * @search_type selection criterion 916 * @protocol GUID of the protocol 917 * @search_key registration key 918 * @efiobj handle 919 * @return 0 if the handle implements the protocol 920 */ 921 static int efi_search(enum efi_locate_search_type search_type, 922 const efi_guid_t *protocol, void *search_key, 923 struct efi_object *efiobj) 924 { 925 int i; 926 927 switch (search_type) { 928 case all_handles: 929 return 0; 930 case by_register_notify: 931 return -1; 932 case by_protocol: 933 for (i = 0; i < ARRAY_SIZE(efiobj->protocols); i++) { 934 const efi_guid_t *guid = efiobj->protocols[i].guid; 935 if (guid && !guidcmp(guid, protocol)) 936 return 0; 937 } 938 return -1; 939 } 940 941 return -1; 942 } 943 944 /* 945 * Locate handles implementing a protocol. 946 * 947 * This function is meant for U-Boot internal calls. For the API implementation 948 * of the LocateHandle service see efi_locate_handle_ext. 949 * 950 * @search_type selection criterion 951 * @protocol GUID of the protocol 952 * @search_key registration key 953 * @buffer_size size of the buffer to receive the handles in bytes 954 * @buffer buffer to receive the relevant handles 955 * @return status code 956 */ 957 static efi_status_t efi_locate_handle( 958 enum efi_locate_search_type search_type, 959 const efi_guid_t *protocol, void *search_key, 960 unsigned long *buffer_size, efi_handle_t *buffer) 961 { 962 struct list_head *lhandle; 963 unsigned long size = 0; 964 965 /* Count how much space we need */ 966 list_for_each(lhandle, &efi_obj_list) { 967 struct efi_object *efiobj; 968 efiobj = list_entry(lhandle, struct efi_object, link); 969 if (!efi_search(search_type, protocol, search_key, efiobj)) { 970 size += sizeof(void*); 971 } 972 } 973 974 if (*buffer_size < size) { 975 *buffer_size = size; 976 return EFI_BUFFER_TOO_SMALL; 977 } 978 979 *buffer_size = size; 980 if (size == 0) 981 return EFI_NOT_FOUND; 982 983 /* Then fill the array */ 984 list_for_each(lhandle, &efi_obj_list) { 985 struct efi_object *efiobj; 986 efiobj = list_entry(lhandle, struct efi_object, link); 987 if (!efi_search(search_type, protocol, search_key, efiobj)) { 988 *(buffer++) = efiobj->handle; 989 } 990 } 991 992 return EFI_SUCCESS; 993 } 994 995 /* 996 * Locate handles implementing a protocol. 997 * 998 * This function implements the LocateHandle service. 999 * See the Unified Extensible Firmware Interface (UEFI) specification 1000 * for details. 1001 * 1002 * @search_type selection criterion 1003 * @protocol GUID of the protocol 1004 * @search_key registration key 1005 * @buffer_size size of the buffer to receive the handles in bytes 1006 * @buffer buffer to receive the relevant handles 1007 * @return 0 if the handle implements the protocol 1008 */ 1009 static efi_status_t EFIAPI efi_locate_handle_ext( 1010 enum efi_locate_search_type search_type, 1011 const efi_guid_t *protocol, void *search_key, 1012 unsigned long *buffer_size, efi_handle_t *buffer) 1013 { 1014 EFI_ENTRY("%d, %pUl, %p, %p, %p", search_type, protocol, search_key, 1015 buffer_size, buffer); 1016 1017 return EFI_EXIT(efi_locate_handle(search_type, protocol, search_key, 1018 buffer_size, buffer)); 1019 } 1020 1021 /* 1022 * Get the device path and handle of an device implementing a protocol. 1023 * 1024 * This function implements the LocateDevicePath service. 1025 * See the Unified Extensible Firmware Interface (UEFI) specification 1026 * for details. 1027 * 1028 * @protocol GUID of the protocol 1029 * @device_path device path 1030 * @device handle of the device 1031 * @return status code 1032 */ 1033 static efi_status_t EFIAPI efi_locate_device_path( 1034 const efi_guid_t *protocol, 1035 struct efi_device_path **device_path, 1036 efi_handle_t *device) 1037 { 1038 struct efi_object *efiobj; 1039 1040 EFI_ENTRY("%pUl, %p, %p", protocol, device_path, device); 1041 1042 efiobj = efi_dp_find_obj(*device_path, device_path); 1043 if (!efiobj) 1044 return EFI_EXIT(EFI_NOT_FOUND); 1045 1046 *device = efiobj->handle; 1047 1048 return EFI_EXIT(EFI_SUCCESS); 1049 } 1050 1051 /* Collapses configuration table entries, removing index i */ 1052 static void efi_remove_configuration_table(int i) 1053 { 1054 struct efi_configuration_table *this = &efi_conf_table[i]; 1055 struct efi_configuration_table *next = &efi_conf_table[i+1]; 1056 struct efi_configuration_table *end = &efi_conf_table[systab.nr_tables]; 1057 1058 memmove(this, next, (ulong)end - (ulong)next); 1059 systab.nr_tables--; 1060 } 1061 1062 /* 1063 * Adds, updates, or removes a configuration table. 1064 * 1065 * This function is used for internal calls. For the API implementation of the 1066 * InstallConfigurationTable service see efi_install_configuration_table_ext. 1067 * 1068 * @guid GUID of the installed table 1069 * @table table to be installed 1070 * @return status code 1071 */ 1072 efi_status_t efi_install_configuration_table(const efi_guid_t *guid, void *table) 1073 { 1074 int i; 1075 1076 /* Check for guid override */ 1077 for (i = 0; i < systab.nr_tables; i++) { 1078 if (!guidcmp(guid, &efi_conf_table[i].guid)) { 1079 if (table) 1080 efi_conf_table[i].table = table; 1081 else 1082 efi_remove_configuration_table(i); 1083 return EFI_SUCCESS; 1084 } 1085 } 1086 1087 if (!table) 1088 return EFI_NOT_FOUND; 1089 1090 /* No override, check for overflow */ 1091 if (i >= ARRAY_SIZE(efi_conf_table)) 1092 return EFI_OUT_OF_RESOURCES; 1093 1094 /* Add a new entry */ 1095 memcpy(&efi_conf_table[i].guid, guid, sizeof(*guid)); 1096 efi_conf_table[i].table = table; 1097 systab.nr_tables = i + 1; 1098 1099 return EFI_SUCCESS; 1100 } 1101 1102 /* 1103 * Adds, updates, or removes a configuration table. 1104 * 1105 * This function implements the InstallConfigurationTable service. 1106 * See the Unified Extensible Firmware Interface (UEFI) specification 1107 * for details. 1108 * 1109 * @guid GUID of the installed table 1110 * @table table to be installed 1111 * @return status code 1112 */ 1113 static efi_status_t EFIAPI efi_install_configuration_table_ext(efi_guid_t *guid, 1114 void *table) 1115 { 1116 EFI_ENTRY("%pUl, %p", guid, table); 1117 return EFI_EXIT(efi_install_configuration_table(guid, table)); 1118 } 1119 1120 /* 1121 * Initialize a loaded_image_info + loaded_image_info object with correct 1122 * protocols, boot-device, etc. 1123 * 1124 * @info loaded image info to be passed to the entry point of the 1125 * image 1126 * @obj internal object associated with the loaded image 1127 * @device_path device path of the loaded image 1128 * @file_path file path of the loaded image 1129 */ 1130 void efi_setup_loaded_image(struct efi_loaded_image *info, struct efi_object *obj, 1131 struct efi_device_path *device_path, 1132 struct efi_device_path *file_path) 1133 { 1134 obj->handle = info; 1135 1136 /* 1137 * When asking for the device path interface, return 1138 * bootefi_device_path 1139 */ 1140 obj->protocols[0].guid = &efi_guid_device_path; 1141 obj->protocols[0].protocol_interface = device_path; 1142 1143 /* 1144 * When asking for the loaded_image interface, just 1145 * return handle which points to loaded_image_info 1146 */ 1147 obj->protocols[1].guid = &efi_guid_loaded_image; 1148 obj->protocols[1].protocol_interface = info; 1149 1150 obj->protocols[2].guid = &efi_guid_console_control; 1151 obj->protocols[2].protocol_interface = (void *)&efi_console_control; 1152 1153 obj->protocols[3].guid = &efi_guid_device_path_to_text_protocol; 1154 obj->protocols[3].protocol_interface = 1155 (void *)&efi_device_path_to_text; 1156 1157 info->file_path = file_path; 1158 if (device_path) 1159 info->device_handle = efi_dp_find_obj(device_path, NULL); 1160 1161 list_add_tail(&obj->link, &efi_obj_list); 1162 } 1163 1164 /* 1165 * Load an image using a file path. 1166 * 1167 * @file_path the path of the image to load 1168 * @buffer buffer containing the loaded image 1169 * @return status code 1170 */ 1171 efi_status_t efi_load_image_from_path(struct efi_device_path *file_path, 1172 void **buffer) 1173 { 1174 struct efi_file_info *info = NULL; 1175 struct efi_file_handle *f; 1176 static efi_status_t ret; 1177 uint64_t bs; 1178 1179 f = efi_file_from_path(file_path); 1180 if (!f) 1181 return EFI_DEVICE_ERROR; 1182 1183 bs = 0; 1184 EFI_CALL(ret = f->getinfo(f, (efi_guid_t *)&efi_file_info_guid, 1185 &bs, info)); 1186 if (ret == EFI_BUFFER_TOO_SMALL) { 1187 info = malloc(bs); 1188 EFI_CALL(ret = f->getinfo(f, (efi_guid_t *)&efi_file_info_guid, 1189 &bs, info)); 1190 } 1191 if (ret != EFI_SUCCESS) 1192 goto error; 1193 1194 ret = efi_allocate_pool(EFI_LOADER_DATA, info->file_size, buffer); 1195 if (ret) 1196 goto error; 1197 1198 EFI_CALL(ret = f->read(f, &info->file_size, *buffer)); 1199 1200 error: 1201 free(info); 1202 EFI_CALL(f->close(f)); 1203 1204 if (ret != EFI_SUCCESS) { 1205 efi_free_pool(*buffer); 1206 *buffer = NULL; 1207 } 1208 1209 return ret; 1210 } 1211 1212 /* 1213 * Load an EFI image into memory. 1214 * 1215 * This function implements the LoadImage service. 1216 * See the Unified Extensible Firmware Interface (UEFI) specification 1217 * for details. 1218 * 1219 * @boot_policy true for request originating from the boot manager 1220 * @parent_image the calles's image handle 1221 * @file_path the path of the image to load 1222 * @source_buffer memory location from which the image is installed 1223 * @source_size size of the memory area from which the image is 1224 * installed 1225 * @image_handle handle for the newly installed image 1226 * @return status code 1227 */ 1228 static efi_status_t EFIAPI efi_load_image(bool boot_policy, 1229 efi_handle_t parent_image, 1230 struct efi_device_path *file_path, 1231 void *source_buffer, 1232 unsigned long source_size, 1233 efi_handle_t *image_handle) 1234 { 1235 struct efi_loaded_image *info; 1236 struct efi_object *obj; 1237 1238 EFI_ENTRY("%d, %p, %p, %p, %ld, %p", boot_policy, parent_image, 1239 file_path, source_buffer, source_size, image_handle); 1240 1241 info = calloc(1, sizeof(*info)); 1242 obj = calloc(1, sizeof(*obj)); 1243 1244 if (!source_buffer) { 1245 struct efi_device_path *dp, *fp; 1246 efi_status_t ret; 1247 1248 ret = efi_load_image_from_path(file_path, &source_buffer); 1249 if (ret != EFI_SUCCESS) { 1250 free(info); 1251 free(obj); 1252 return EFI_EXIT(ret); 1253 } 1254 1255 /* 1256 * split file_path which contains both the device and 1257 * file parts: 1258 */ 1259 efi_dp_split_file_path(file_path, &dp, &fp); 1260 1261 efi_setup_loaded_image(info, obj, dp, fp); 1262 } else { 1263 /* In this case, file_path is the "device" path, ie. 1264 * something like a HARDWARE_DEVICE:MEMORY_MAPPED 1265 */ 1266 efi_setup_loaded_image(info, obj, file_path, NULL); 1267 } 1268 1269 info->reserved = efi_load_pe(source_buffer, info); 1270 if (!info->reserved) { 1271 free(info); 1272 free(obj); 1273 return EFI_EXIT(EFI_UNSUPPORTED); 1274 } 1275 1276 *image_handle = info; 1277 1278 return EFI_EXIT(EFI_SUCCESS); 1279 } 1280 1281 /* 1282 * Call the entry point of an image. 1283 * 1284 * This function implements the StartImage service. 1285 * See the Unified Extensible Firmware Interface (UEFI) specification 1286 * for details. 1287 * 1288 * @image_handle handle of the image 1289 * @exit_data_size size of the buffer 1290 * @exit_data buffer to receive the exit data of the called image 1291 * @return status code 1292 */ 1293 static efi_status_t EFIAPI efi_start_image(efi_handle_t image_handle, 1294 unsigned long *exit_data_size, 1295 s16 **exit_data) 1296 { 1297 ulong (*entry)(void *image_handle, struct efi_system_table *st); 1298 struct efi_loaded_image *info = image_handle; 1299 1300 EFI_ENTRY("%p, %p, %p", image_handle, exit_data_size, exit_data); 1301 entry = info->reserved; 1302 1303 efi_is_direct_boot = false; 1304 1305 /* call the image! */ 1306 if (setjmp(&info->exit_jmp)) { 1307 /* We returned from the child image */ 1308 return EFI_EXIT(info->exit_status); 1309 } 1310 1311 __efi_nesting_dec(); 1312 __efi_exit_check(); 1313 entry(image_handle, &systab); 1314 __efi_entry_check(); 1315 __efi_nesting_inc(); 1316 1317 /* Should usually never get here */ 1318 return EFI_EXIT(EFI_SUCCESS); 1319 } 1320 1321 /* 1322 * Leave an EFI application or driver. 1323 * 1324 * This function implements the Exit service. 1325 * See the Unified Extensible Firmware Interface (UEFI) specification 1326 * for details. 1327 * 1328 * @image_handle handle of the application or driver that is exiting 1329 * @exit_status status code 1330 * @exit_data_size size of the buffer in bytes 1331 * @exit_data buffer with data describing an error 1332 * @return status code 1333 */ 1334 static efi_status_t EFIAPI efi_exit(efi_handle_t image_handle, 1335 efi_status_t exit_status, unsigned long exit_data_size, 1336 int16_t *exit_data) 1337 { 1338 struct efi_loaded_image *loaded_image_info = (void*)image_handle; 1339 1340 EFI_ENTRY("%p, %ld, %ld, %p", image_handle, exit_status, 1341 exit_data_size, exit_data); 1342 1343 /* Make sure entry/exit counts for EFI world cross-overs match */ 1344 __efi_exit_check(); 1345 1346 /* 1347 * But longjmp out with the U-Boot gd, not the application's, as 1348 * the other end is a setjmp call inside EFI context. 1349 */ 1350 efi_restore_gd(); 1351 1352 loaded_image_info->exit_status = exit_status; 1353 longjmp(&loaded_image_info->exit_jmp, 1); 1354 1355 panic("EFI application exited"); 1356 } 1357 1358 /* 1359 * Find the internal EFI object for a handle. 1360 * 1361 * @handle handle to find 1362 * @return EFI object 1363 */ 1364 static struct efi_object *efi_search_obj(void *handle) 1365 { 1366 struct list_head *lhandle; 1367 1368 list_for_each(lhandle, &efi_obj_list) { 1369 struct efi_object *efiobj; 1370 efiobj = list_entry(lhandle, struct efi_object, link); 1371 if (efiobj->handle == handle) 1372 return efiobj; 1373 } 1374 1375 return NULL; 1376 } 1377 1378 /* 1379 * Unload an EFI image. 1380 * 1381 * This function implements the UnloadImage service. 1382 * See the Unified Extensible Firmware Interface (UEFI) specification 1383 * for details. 1384 * 1385 * @image_handle handle of the image to be unloaded 1386 * @return status code 1387 */ 1388 static efi_status_t EFIAPI efi_unload_image(void *image_handle) 1389 { 1390 struct efi_object *efiobj; 1391 1392 EFI_ENTRY("%p", image_handle); 1393 efiobj = efi_search_obj(image_handle); 1394 if (efiobj) 1395 list_del(&efiobj->link); 1396 1397 return EFI_EXIT(EFI_SUCCESS); 1398 } 1399 1400 /* 1401 * Fix up caches for EFI payloads if necessary. 1402 */ 1403 static void efi_exit_caches(void) 1404 { 1405 #if defined(CONFIG_ARM) && !defined(CONFIG_ARM64) 1406 /* 1407 * Grub on 32bit ARM needs to have caches disabled before jumping into 1408 * a zImage, but does not know of all cache layers. Give it a hand. 1409 */ 1410 if (efi_is_direct_boot) 1411 cleanup_before_linux(); 1412 #endif 1413 } 1414 1415 /* 1416 * Stop boot services. 1417 * 1418 * This function implements the ExitBootServices service. 1419 * See the Unified Extensible Firmware Interface (UEFI) specification 1420 * for details. 1421 * 1422 * @image_handle handle of the loaded image 1423 * @map_key key of the memory map 1424 * @return status code 1425 */ 1426 static efi_status_t EFIAPI efi_exit_boot_services(void *image_handle, 1427 unsigned long map_key) 1428 { 1429 int i; 1430 1431 EFI_ENTRY("%p, %ld", image_handle, map_key); 1432 1433 /* Notify that ExitBootServices is invoked. */ 1434 for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { 1435 if (efi_events[i].type != EVT_SIGNAL_EXIT_BOOT_SERVICES) 1436 continue; 1437 efi_signal_event(&efi_events[i]); 1438 } 1439 /* Make sure that notification functions are not called anymore */ 1440 efi_tpl = TPL_HIGH_LEVEL; 1441 1442 /* XXX Should persist EFI variables here */ 1443 1444 board_quiesce_devices(); 1445 1446 /* Fix up caches for EFI payloads if necessary */ 1447 efi_exit_caches(); 1448 1449 /* This stops all lingering devices */ 1450 bootm_disable_interrupts(); 1451 1452 /* Give the payload some time to boot */ 1453 WATCHDOG_RESET(); 1454 1455 return EFI_EXIT(EFI_SUCCESS); 1456 } 1457 1458 /* 1459 * Get next value of the counter. 1460 * 1461 * This function implements the NextMonotonicCount service. 1462 * See the Unified Extensible Firmware Interface (UEFI) specification 1463 * for details. 1464 * 1465 * @count returned value of the counter 1466 * @return status code 1467 */ 1468 static efi_status_t EFIAPI efi_get_next_monotonic_count(uint64_t *count) 1469 { 1470 static uint64_t mono = 0; 1471 EFI_ENTRY("%p", count); 1472 *count = mono++; 1473 return EFI_EXIT(EFI_SUCCESS); 1474 } 1475 1476 /* 1477 * Sleep. 1478 * 1479 * This function implements the Stall sercive. 1480 * See the Unified Extensible Firmware Interface (UEFI) specification 1481 * for details. 1482 * 1483 * @microseconds period to sleep in microseconds 1484 * @return status code 1485 */ 1486 static efi_status_t EFIAPI efi_stall(unsigned long microseconds) 1487 { 1488 EFI_ENTRY("%ld", microseconds); 1489 udelay(microseconds); 1490 return EFI_EXIT(EFI_SUCCESS); 1491 } 1492 1493 /* 1494 * Reset the watchdog timer. 1495 * 1496 * This function implements the WatchdogTimer service. 1497 * See the Unified Extensible Firmware Interface (UEFI) specification 1498 * for details. 1499 * 1500 * @timeout seconds before reset by watchdog 1501 * @watchdog_code code to be logged when resetting 1502 * @data_size size of buffer in bytes 1503 * @watchdog_data buffer with data describing the reset reason 1504 * @return status code 1505 */ 1506 static efi_status_t EFIAPI efi_set_watchdog_timer(unsigned long timeout, 1507 uint64_t watchdog_code, 1508 unsigned long data_size, 1509 uint16_t *watchdog_data) 1510 { 1511 EFI_ENTRY("%ld, 0x%"PRIx64", %ld, %p", timeout, watchdog_code, 1512 data_size, watchdog_data); 1513 return efi_unsupported(__func__); 1514 } 1515 1516 /* 1517 * Connect a controller to a driver. 1518 * 1519 * This function implements the ConnectController service. 1520 * See the Unified Extensible Firmware Interface (UEFI) specification 1521 * for details. 1522 * 1523 * @controller_handle handle of the controller 1524 * @driver_image_handle handle of the driver 1525 * @remain_device_path device path of a child controller 1526 * @recursive true to connect all child controllers 1527 * @return status code 1528 */ 1529 static efi_status_t EFIAPI efi_connect_controller( 1530 efi_handle_t controller_handle, 1531 efi_handle_t *driver_image_handle, 1532 struct efi_device_path *remain_device_path, 1533 bool recursive) 1534 { 1535 EFI_ENTRY("%p, %p, %p, %d", controller_handle, driver_image_handle, 1536 remain_device_path, recursive); 1537 return EFI_EXIT(EFI_NOT_FOUND); 1538 } 1539 1540 /* 1541 * Disconnect a controller from a driver. 1542 * 1543 * This function implements the DisconnectController service. 1544 * See the Unified Extensible Firmware Interface (UEFI) specification 1545 * for details. 1546 * 1547 * @controller_handle handle of the controller 1548 * @driver_image_handle handle of the driver 1549 * @child_handle handle of the child to destroy 1550 * @return status code 1551 */ 1552 static efi_status_t EFIAPI efi_disconnect_controller(void *controller_handle, 1553 void *driver_image_handle, 1554 void *child_handle) 1555 { 1556 EFI_ENTRY("%p, %p, %p", controller_handle, driver_image_handle, 1557 child_handle); 1558 return EFI_EXIT(EFI_INVALID_PARAMETER); 1559 } 1560 1561 /* 1562 * Close a protocol. 1563 * 1564 * This function implements the CloseProtocol service. 1565 * See the Unified Extensible Firmware Interface (UEFI) specification 1566 * for details. 1567 * 1568 * @handle handle on which the protocol shall be closed 1569 * @protocol GUID of the protocol to close 1570 * @agent_handle handle of the driver 1571 * @controller_handle handle of the controller 1572 * @return status code 1573 */ 1574 static efi_status_t EFIAPI efi_close_protocol(void *handle, 1575 const efi_guid_t *protocol, 1576 void *agent_handle, 1577 void *controller_handle) 1578 { 1579 EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, agent_handle, 1580 controller_handle); 1581 return EFI_EXIT(EFI_NOT_FOUND); 1582 } 1583 1584 /* 1585 * Provide information about then open status of a protocol on a handle 1586 * 1587 * This function implements the OpenProtocolInformation service. 1588 * See the Unified Extensible Firmware Interface (UEFI) specification 1589 * for details. 1590 * 1591 * @handle handle for which the information shall be retrieved 1592 * @protocol GUID of the protocol 1593 * @entry_buffer buffer to receive the open protocol information 1594 * @entry_count number of entries available in the buffer 1595 * @return status code 1596 */ 1597 static efi_status_t EFIAPI efi_open_protocol_information(efi_handle_t handle, 1598 const efi_guid_t *protocol, 1599 struct efi_open_protocol_info_entry **entry_buffer, 1600 unsigned long *entry_count) 1601 { 1602 EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, entry_buffer, 1603 entry_count); 1604 return EFI_EXIT(EFI_NOT_FOUND); 1605 } 1606 1607 /* 1608 * Get protocols installed on a handle. 1609 * 1610 * This function implements the ProtocolsPerHandleService. 1611 * See the Unified Extensible Firmware Interface (UEFI) specification 1612 * for details. 1613 * 1614 * @handle handle for which the information is retrieved 1615 * @protocol_buffer buffer with protocol GUIDs 1616 * @protocol_buffer_count number of entries in the buffer 1617 * @return status code 1618 */ 1619 static efi_status_t EFIAPI efi_protocols_per_handle(void *handle, 1620 efi_guid_t ***protocol_buffer, 1621 unsigned long *protocol_buffer_count) 1622 { 1623 unsigned long buffer_size; 1624 struct efi_object *efiobj; 1625 unsigned long i, j; 1626 struct list_head *lhandle; 1627 efi_status_t r; 1628 1629 EFI_ENTRY("%p, %p, %p", handle, protocol_buffer, 1630 protocol_buffer_count); 1631 1632 if (!handle || !protocol_buffer || !protocol_buffer_count) 1633 return EFI_EXIT(EFI_INVALID_PARAMETER); 1634 1635 *protocol_buffer = NULL; 1636 *protocol_buffer_count = 0; 1637 list_for_each(lhandle, &efi_obj_list) { 1638 efiobj = list_entry(lhandle, struct efi_object, link); 1639 1640 if (efiobj->handle != handle) 1641 continue; 1642 1643 /* Count protocols */ 1644 for (i = 0; i < ARRAY_SIZE(efiobj->protocols); i++) { 1645 if (efiobj->protocols[i].guid) 1646 ++*protocol_buffer_count; 1647 } 1648 /* Copy guids */ 1649 if (*protocol_buffer_count) { 1650 buffer_size = sizeof(efi_guid_t *) * 1651 *protocol_buffer_count; 1652 r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, 1653 buffer_size, 1654 (void **)protocol_buffer); 1655 if (r != EFI_SUCCESS) 1656 return EFI_EXIT(r); 1657 j = 0; 1658 for (i = 0; i < ARRAY_SIZE(efiobj->protocols); ++i) { 1659 if (efiobj->protocols[i].guid) { 1660 (*protocol_buffer)[j] = (void *) 1661 efiobj->protocols[i].guid; 1662 ++j; 1663 } 1664 } 1665 } 1666 break; 1667 } 1668 1669 return EFI_EXIT(EFI_SUCCESS); 1670 } 1671 1672 /* 1673 * Locate handles implementing a protocol. 1674 * 1675 * This function implements the LocateHandleBuffer service. 1676 * See the Unified Extensible Firmware Interface (UEFI) specification 1677 * for details. 1678 * 1679 * @search_type selection criterion 1680 * @protocol GUID of the protocol 1681 * @search_key registration key 1682 * @no_handles number of returned handles 1683 * @buffer buffer with the returned handles 1684 * @return status code 1685 */ 1686 static efi_status_t EFIAPI efi_locate_handle_buffer( 1687 enum efi_locate_search_type search_type, 1688 const efi_guid_t *protocol, void *search_key, 1689 unsigned long *no_handles, efi_handle_t **buffer) 1690 { 1691 efi_status_t r; 1692 unsigned long buffer_size = 0; 1693 1694 EFI_ENTRY("%d, %pUl, %p, %p, %p", search_type, protocol, search_key, 1695 no_handles, buffer); 1696 1697 if (!no_handles || !buffer) { 1698 r = EFI_INVALID_PARAMETER; 1699 goto out; 1700 } 1701 *no_handles = 0; 1702 *buffer = NULL; 1703 r = efi_locate_handle(search_type, protocol, search_key, &buffer_size, 1704 *buffer); 1705 if (r != EFI_BUFFER_TOO_SMALL) 1706 goto out; 1707 r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size, 1708 (void **)buffer); 1709 if (r != EFI_SUCCESS) 1710 goto out; 1711 r = efi_locate_handle(search_type, protocol, search_key, &buffer_size, 1712 *buffer); 1713 if (r == EFI_SUCCESS) 1714 *no_handles = buffer_size / sizeof(void *); 1715 out: 1716 return EFI_EXIT(r); 1717 } 1718 1719 /* 1720 * Find an interface implementing a protocol. 1721 * 1722 * This function implements the LocateProtocol service. 1723 * See the Unified Extensible Firmware Interface (UEFI) specification 1724 * for details. 1725 * 1726 * @protocol GUID of the protocol 1727 * @registration registration key passed to the notification function 1728 * @protocol_interface interface implementing the protocol 1729 * @return status code 1730 */ 1731 static efi_status_t EFIAPI efi_locate_protocol(const efi_guid_t *protocol, 1732 void *registration, 1733 void **protocol_interface) 1734 { 1735 struct list_head *lhandle; 1736 int i; 1737 1738 EFI_ENTRY("%pUl, %p, %p", protocol, registration, protocol_interface); 1739 1740 if (!protocol || !protocol_interface) 1741 return EFI_EXIT(EFI_INVALID_PARAMETER); 1742 1743 EFI_PRINT_GUID("protocol", protocol); 1744 1745 list_for_each(lhandle, &efi_obj_list) { 1746 struct efi_object *efiobj; 1747 1748 efiobj = list_entry(lhandle, struct efi_object, link); 1749 for (i = 0; i < ARRAY_SIZE(efiobj->protocols); i++) { 1750 struct efi_handler *handler = &efiobj->protocols[i]; 1751 1752 if (!handler->guid) 1753 continue; 1754 if (!guidcmp(handler->guid, protocol)) { 1755 *protocol_interface = 1756 handler->protocol_interface; 1757 return EFI_EXIT(EFI_SUCCESS); 1758 } 1759 } 1760 } 1761 *protocol_interface = NULL; 1762 1763 return EFI_EXIT(EFI_NOT_FOUND); 1764 } 1765 1766 /* 1767 * Install multiple protocol interfaces. 1768 * 1769 * This function implements the MultipleProtocolInterfaces service. 1770 * See the Unified Extensible Firmware Interface (UEFI) specification 1771 * for details. 1772 * 1773 * @handle handle on which the protocol interfaces shall be installed 1774 * @... NULL terminated argument list with pairs of protocol GUIDS and 1775 * interfaces 1776 * @return status code 1777 */ 1778 static efi_status_t EFIAPI efi_install_multiple_protocol_interfaces( 1779 void **handle, ...) 1780 { 1781 EFI_ENTRY("%p", handle); 1782 1783 va_list argptr; 1784 const efi_guid_t *protocol; 1785 void *protocol_interface; 1786 efi_status_t r = EFI_SUCCESS; 1787 int i = 0; 1788 1789 if (!handle) 1790 return EFI_EXIT(EFI_INVALID_PARAMETER); 1791 1792 va_start(argptr, handle); 1793 for (;;) { 1794 protocol = va_arg(argptr, efi_guid_t*); 1795 if (!protocol) 1796 break; 1797 protocol_interface = va_arg(argptr, void*); 1798 r = efi_install_protocol_interface(handle, protocol, 1799 EFI_NATIVE_INTERFACE, 1800 protocol_interface); 1801 if (r != EFI_SUCCESS) 1802 break; 1803 i++; 1804 } 1805 va_end(argptr); 1806 if (r == EFI_SUCCESS) 1807 return EFI_EXIT(r); 1808 1809 /* If an error occured undo all changes. */ 1810 va_start(argptr, handle); 1811 for (; i; --i) { 1812 protocol = va_arg(argptr, efi_guid_t*); 1813 protocol_interface = va_arg(argptr, void*); 1814 efi_uninstall_protocol_interface(handle, protocol, 1815 protocol_interface); 1816 } 1817 va_end(argptr); 1818 1819 return EFI_EXIT(r); 1820 } 1821 1822 /* 1823 * Uninstall multiple protocol interfaces. 1824 * 1825 * This function implements the UninstallMultipleProtocolInterfaces service. 1826 * See the Unified Extensible Firmware Interface (UEFI) specification 1827 * for details. 1828 * 1829 * @handle handle from which the protocol interfaces shall be removed 1830 * @... NULL terminated argument list with pairs of protocol GUIDS and 1831 * interfaces 1832 * @return status code 1833 */ 1834 static efi_status_t EFIAPI efi_uninstall_multiple_protocol_interfaces( 1835 void *handle, ...) 1836 { 1837 EFI_ENTRY("%p", handle); 1838 return EFI_EXIT(EFI_INVALID_PARAMETER); 1839 } 1840 1841 /* 1842 * Calculate cyclic redundancy code. 1843 * 1844 * This function implements the CalculateCrc32 service. 1845 * See the Unified Extensible Firmware Interface (UEFI) specification 1846 * for details. 1847 * 1848 * @data buffer with data 1849 * @data_size size of buffer in bytes 1850 * @crc32_p cyclic redundancy code 1851 * @return status code 1852 */ 1853 static efi_status_t EFIAPI efi_calculate_crc32(void *data, 1854 unsigned long data_size, 1855 uint32_t *crc32_p) 1856 { 1857 EFI_ENTRY("%p, %ld", data, data_size); 1858 *crc32_p = crc32(0, data, data_size); 1859 return EFI_EXIT(EFI_SUCCESS); 1860 } 1861 1862 /* 1863 * Copy memory. 1864 * 1865 * This function implements the CopyMem service. 1866 * See the Unified Extensible Firmware Interface (UEFI) specification 1867 * for details. 1868 * 1869 * @destination destination of the copy operation 1870 * @source source of the copy operation 1871 * @length number of bytes to copy 1872 */ 1873 static void EFIAPI efi_copy_mem(void *destination, const void *source, 1874 size_t length) 1875 { 1876 EFI_ENTRY("%p, %p, %ld", destination, source, (unsigned long)length); 1877 memcpy(destination, source, length); 1878 EFI_EXIT(EFI_SUCCESS); 1879 } 1880 1881 /* 1882 * Fill memory with a byte value. 1883 * 1884 * This function implements the SetMem service. 1885 * See the Unified Extensible Firmware Interface (UEFI) specification 1886 * for details. 1887 * 1888 * @buffer buffer to fill 1889 * @size size of buffer in bytes 1890 * @value byte to copy to the buffer 1891 */ 1892 static void EFIAPI efi_set_mem(void *buffer, size_t size, uint8_t value) 1893 { 1894 EFI_ENTRY("%p, %ld, 0x%x", buffer, (unsigned long)size, value); 1895 memset(buffer, value, size); 1896 EFI_EXIT(EFI_SUCCESS); 1897 } 1898 1899 /* 1900 * Open protocol interface on a handle. 1901 * 1902 * This function implements the OpenProtocol interface. 1903 * See the Unified Extensible Firmware Interface (UEFI) specification 1904 * for details. 1905 * 1906 * @handle handle on which the protocol shall be opened 1907 * @protocol GUID of the protocol 1908 * @protocol_interface interface implementing the protocol 1909 * @agent_handle handle of the driver 1910 * @controller_handle handle of the controller 1911 * @attributes attributes indicating how to open the protocol 1912 * @return status code 1913 */ 1914 static efi_status_t EFIAPI efi_open_protocol( 1915 void *handle, const efi_guid_t *protocol, 1916 void **protocol_interface, void *agent_handle, 1917 void *controller_handle, uint32_t attributes) 1918 { 1919 struct list_head *lhandle; 1920 int i; 1921 efi_status_t r = EFI_INVALID_PARAMETER; 1922 1923 EFI_ENTRY("%p, %pUl, %p, %p, %p, 0x%x", handle, protocol, 1924 protocol_interface, agent_handle, controller_handle, 1925 attributes); 1926 1927 if (!handle || !protocol || 1928 (!protocol_interface && attributes != 1929 EFI_OPEN_PROTOCOL_TEST_PROTOCOL)) { 1930 goto out; 1931 } 1932 1933 EFI_PRINT_GUID("protocol", protocol); 1934 1935 switch (attributes) { 1936 case EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL: 1937 case EFI_OPEN_PROTOCOL_GET_PROTOCOL: 1938 case EFI_OPEN_PROTOCOL_TEST_PROTOCOL: 1939 break; 1940 case EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER: 1941 if (controller_handle == handle) 1942 goto out; 1943 case EFI_OPEN_PROTOCOL_BY_DRIVER: 1944 case EFI_OPEN_PROTOCOL_BY_DRIVER | EFI_OPEN_PROTOCOL_EXCLUSIVE: 1945 if (controller_handle == NULL) 1946 goto out; 1947 case EFI_OPEN_PROTOCOL_EXCLUSIVE: 1948 if (agent_handle == NULL) 1949 goto out; 1950 break; 1951 default: 1952 goto out; 1953 } 1954 1955 list_for_each(lhandle, &efi_obj_list) { 1956 struct efi_object *efiobj; 1957 efiobj = list_entry(lhandle, struct efi_object, link); 1958 1959 if (efiobj->handle != handle) 1960 continue; 1961 1962 for (i = 0; i < ARRAY_SIZE(efiobj->protocols); i++) { 1963 struct efi_handler *handler = &efiobj->protocols[i]; 1964 const efi_guid_t *hprotocol = handler->guid; 1965 if (!hprotocol) 1966 continue; 1967 if (!guidcmp(hprotocol, protocol)) { 1968 if (attributes != 1969 EFI_OPEN_PROTOCOL_TEST_PROTOCOL) { 1970 *protocol_interface = 1971 handler->protocol_interface; 1972 } 1973 r = EFI_SUCCESS; 1974 goto out; 1975 } 1976 } 1977 goto unsupported; 1978 } 1979 1980 unsupported: 1981 r = EFI_UNSUPPORTED; 1982 out: 1983 return EFI_EXIT(r); 1984 } 1985 1986 /* 1987 * Get interface of a protocol on a handle. 1988 * 1989 * This function implements the HandleProtocol service. 1990 * See the Unified Extensible Firmware Interface (UEFI) specification 1991 * for details. 1992 * 1993 * @handle handle on which the protocol shall be opened 1994 * @protocol GUID of the protocol 1995 * @protocol_interface interface implementing the protocol 1996 * @return status code 1997 */ 1998 static efi_status_t EFIAPI efi_handle_protocol(void *handle, 1999 const efi_guid_t *protocol, 2000 void **protocol_interface) 2001 { 2002 return efi_open_protocol(handle, protocol, protocol_interface, NULL, 2003 NULL, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL); 2004 } 2005 2006 static const struct efi_boot_services efi_boot_services = { 2007 .hdr = { 2008 .headersize = sizeof(struct efi_table_hdr), 2009 }, 2010 .raise_tpl = efi_raise_tpl, 2011 .restore_tpl = efi_restore_tpl, 2012 .allocate_pages = efi_allocate_pages_ext, 2013 .free_pages = efi_free_pages_ext, 2014 .get_memory_map = efi_get_memory_map_ext, 2015 .allocate_pool = efi_allocate_pool_ext, 2016 .free_pool = efi_free_pool_ext, 2017 .create_event = efi_create_event_ext, 2018 .set_timer = efi_set_timer_ext, 2019 .wait_for_event = efi_wait_for_event, 2020 .signal_event = efi_signal_event_ext, 2021 .close_event = efi_close_event, 2022 .check_event = efi_check_event, 2023 .install_protocol_interface = efi_install_protocol_interface_ext, 2024 .reinstall_protocol_interface = efi_reinstall_protocol_interface, 2025 .uninstall_protocol_interface = efi_uninstall_protocol_interface_ext, 2026 .handle_protocol = efi_handle_protocol, 2027 .reserved = NULL, 2028 .register_protocol_notify = efi_register_protocol_notify, 2029 .locate_handle = efi_locate_handle_ext, 2030 .locate_device_path = efi_locate_device_path, 2031 .install_configuration_table = efi_install_configuration_table_ext, 2032 .load_image = efi_load_image, 2033 .start_image = efi_start_image, 2034 .exit = efi_exit, 2035 .unload_image = efi_unload_image, 2036 .exit_boot_services = efi_exit_boot_services, 2037 .get_next_monotonic_count = efi_get_next_monotonic_count, 2038 .stall = efi_stall, 2039 .set_watchdog_timer = efi_set_watchdog_timer, 2040 .connect_controller = efi_connect_controller, 2041 .disconnect_controller = efi_disconnect_controller, 2042 .open_protocol = efi_open_protocol, 2043 .close_protocol = efi_close_protocol, 2044 .open_protocol_information = efi_open_protocol_information, 2045 .protocols_per_handle = efi_protocols_per_handle, 2046 .locate_handle_buffer = efi_locate_handle_buffer, 2047 .locate_protocol = efi_locate_protocol, 2048 .install_multiple_protocol_interfaces = efi_install_multiple_protocol_interfaces, 2049 .uninstall_multiple_protocol_interfaces = efi_uninstall_multiple_protocol_interfaces, 2050 .calculate_crc32 = efi_calculate_crc32, 2051 .copy_mem = efi_copy_mem, 2052 .set_mem = efi_set_mem, 2053 }; 2054 2055 2056 static uint16_t __efi_runtime_data firmware_vendor[] = 2057 { 'D','a','s',' ','U','-','b','o','o','t',0 }; 2058 2059 struct efi_system_table __efi_runtime_data systab = { 2060 .hdr = { 2061 .signature = EFI_SYSTEM_TABLE_SIGNATURE, 2062 .revision = 0x20005, /* 2.5 */ 2063 .headersize = sizeof(struct efi_table_hdr), 2064 }, 2065 .fw_vendor = (long)firmware_vendor, 2066 .con_in = (void*)&efi_con_in, 2067 .con_out = (void*)&efi_con_out, 2068 .std_err = (void*)&efi_con_out, 2069 .runtime = (void*)&efi_runtime_services, 2070 .boottime = (void*)&efi_boot_services, 2071 .nr_tables = 0, 2072 .tables = (void*)efi_conf_table, 2073 }; 2074