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