Home | History | Annotate | Download | only in efi
      1 /*
      2  * Copyright 2011-2014 Intel Corporation - All Rights Reserved
      3  */
      4 
      5 #include <codepage.h>
      6 #include <core.h>
      7 #include <fs.h>
      8 #include <com32.h>
      9 #include <syslinux/memscan.h>
     10 #include <syslinux/firmware.h>
     11 #include <syslinux/linux.h>
     12 #include <sys/ansi.h>
     13 #include <setjmp.h>
     14 
     15 #include "efi.h"
     16 #include "fio.h"
     17 #include "version.h"
     18 
     19 __export uint16_t PXERetry;
     20 __export char copyright_str[] = "Copyright (C) 2011-" YEAR_STR "\n";
     21 uint8_t SerialNotice = 1;
     22 __export char syslinux_banner[] = "Syslinux " VERSION_STR " (EFI; " DATE_STR ")\n";
     23 char CurrentDirName[CURRENTDIR_MAX];
     24 struct com32_sys_args __com32;
     25 
     26 uint32_t _IdleTimer = 0;
     27 char __lowmem_heap[32];
     28 uint32_t BIOS_timer_next;
     29 uint32_t timer_irq;
     30 __export uint8_t KbdMap[256];
     31 char aux_seg[256];
     32 
     33 static jmp_buf load_error_buf;
     34 
     35 static inline EFI_STATUS
     36 efi_close_protocol(EFI_HANDLE handle, EFI_GUID *guid, EFI_HANDLE agent,
     37 		   EFI_HANDLE controller)
     38 {
     39     return uefi_call_wrapper(BS->CloseProtocol, 4, handle,
     40 			     guid, agent, controller);
     41 }
     42 
     43 struct efi_binding *efi_create_binding(EFI_GUID *bguid, EFI_GUID *pguid)
     44 {
     45     EFI_SERVICE_BINDING *sbp;
     46     struct efi_binding *b;
     47     EFI_STATUS status;
     48     EFI_HANDLE protocol, child, *handles = NULL;
     49     UINTN i, nr_handles = 0;
     50 
     51     b = malloc(sizeof(*b));
     52     if (!b)
     53 	return NULL;
     54 
     55     status = LibLocateHandle(ByProtocol, bguid, NULL, &nr_handles, &handles);
     56     if (status != EFI_SUCCESS)
     57 	goto free_binding;
     58 
     59     for (i = 0; i < nr_handles; i++) {
     60 	status = uefi_call_wrapper(BS->OpenProtocol, 6, handles[i],
     61 				   bguid, (void **)&sbp,
     62 				   image_handle, handles[i],
     63 				   EFI_OPEN_PROTOCOL_GET_PROTOCOL);
     64 	if (status == EFI_SUCCESS)
     65 	    break;
     66 
     67 	uefi_call_wrapper(BS->CloseProtocol, 4, handles[i], bguid,
     68 			  image_handle, handles[i]);
     69     }
     70 
     71     if (i == nr_handles)
     72 	goto free_binding;
     73 
     74     child = NULL;
     75 
     76     status = uefi_call_wrapper(sbp->CreateChild, 2, sbp, (EFI_HANDLE *)&child);
     77     if (status != EFI_SUCCESS)
     78 	goto close_protocol;
     79 
     80     status = uefi_call_wrapper(BS->OpenProtocol, 6, child,
     81 			      pguid, (void **)&protocol,
     82 			      image_handle, sbp,
     83 			      EFI_OPEN_PROTOCOL_GET_PROTOCOL);
     84     if (status != EFI_SUCCESS)
     85 	goto destroy_child;
     86 
     87     b->parent = handles[i];
     88     b->binding = sbp;
     89     b->child = child;
     90     b->this = protocol;
     91 
     92     return b;
     93 
     94 destroy_child:
     95     uefi_call_wrapper(sbp->DestroyChild, 2, sbp, child);
     96 
     97 close_protocol:
     98     uefi_call_wrapper(BS->CloseProtocol, 4, handles[i], bguid,
     99 		      image_handle, handles[i]);
    100 
    101 free_binding:
    102     free(b);
    103     return NULL;
    104 }
    105 
    106 void efi_destroy_binding(struct efi_binding *b, EFI_GUID *guid)
    107 {
    108     efi_close_protocol(b->child, guid, image_handle, b->binding);
    109     uefi_call_wrapper(b->binding->DestroyChild, 2, b->binding, b->child);
    110     efi_close_protocol(b->parent, guid, image_handle, b->parent);
    111 
    112     free(b);
    113 }
    114 
    115 #undef kaboom
    116 void kaboom(void)
    117 {
    118 }
    119 
    120 void printf_init(void)
    121 {
    122 }
    123 
    124 __export void local_boot(uint16_t ax)
    125 {
    126     /*
    127      * Inform the firmware that we failed to execute correctly, which
    128      * will trigger the next entry in the EFI Boot Manager list.
    129      */
    130     longjmp(load_error_buf, 1);
    131 }
    132 
    133 void bios_timer_cleanup(void)
    134 {
    135 }
    136 
    137 char trackbuf[4096];
    138 
    139 void __cdecl core_farcall(uint32_t c, const com32sys_t *a, com32sys_t *b)
    140 {
    141 }
    142 
    143 __export struct firmware *firmware = NULL;
    144 __export void *__syslinux_adv_ptr;
    145 __export size_t __syslinux_adv_size;
    146 char core_xfer_buf[65536];
    147 struct iso_boot_info {
    148 	uint32_t pvd;               /* LBA of primary volume descriptor */
    149 	uint32_t file;              /* LBA of boot file */
    150 	uint32_t length;            /* Length of boot file */
    151 	uint32_t csum;              /* Checksum of boot file */
    152 	uint32_t reserved[10];      /* Currently unused */
    153 } iso_boot_info;
    154 
    155 uint8_t DHCPMagic;
    156 uint32_t RebootTime;
    157 
    158 void pxenv(void)
    159 {
    160 }
    161 
    162 uint16_t BIOS_fbm = 1;
    163 far_ptr_t InitStack;
    164 far_ptr_t PXEEntry;
    165 
    166 void gpxe_unload(void)
    167 {
    168 }
    169 
    170 void do_idle(void)
    171 {
    172 }
    173 
    174 void pxe_int1a(void)
    175 {
    176 }
    177 
    178 uint8_t KeepPXE;
    179 
    180 struct semaphore;
    181 mstime_t sem_down(struct semaphore *sem, mstime_t time)
    182 {
    183 	/* EFI is single threaded */
    184 	return 0;
    185 }
    186 
    187 void sem_up(struct semaphore *sem)
    188 {
    189 	/* EFI is single threaded */
    190 }
    191 
    192 __export volatile uint32_t __ms_timer = 0;
    193 volatile uint32_t __jiffies = 0;
    194 
    195 void efi_write_char(uint8_t ch, uint8_t attribute)
    196 {
    197 	SIMPLE_TEXT_OUTPUT_INTERFACE *out = ST->ConOut;
    198 	uint16_t c[2];
    199 
    200 	uefi_call_wrapper(out->SetAttribute, 2, out, attribute);
    201 
    202 	/* Lookup primary Unicode encoding in the system codepage */
    203 	c[0] = codepage.uni[0][ch];
    204 	c[1] = '\0';
    205 
    206 	uefi_call_wrapper(out->OutputString, 2, out, c);
    207 }
    208 
    209 static void efi_showcursor(const struct term_state *st)
    210 {
    211 	SIMPLE_TEXT_OUTPUT_INTERFACE *out = ST->ConOut;
    212 	bool cursor = st->cursor ? true : false;
    213 
    214 	uefi_call_wrapper(out->EnableCursor, 2, out, cursor);
    215 }
    216 
    217 static void efi_set_cursor(int x, int y, bool visible)
    218 {
    219 	SIMPLE_TEXT_OUTPUT_INTERFACE *out = ST->ConOut;
    220 
    221 	uefi_call_wrapper(out->SetCursorPosition, 3, out, x, y);
    222 }
    223 
    224 static void efi_scroll_up(uint8_t cols, uint8_t rows, uint8_t attribute)
    225 {
    226 	efi_write_char('\n', 0);
    227 	efi_write_char('\r', 0);
    228 }
    229 
    230 static void efi_get_mode(int *cols, int *rows)
    231 {
    232 	SIMPLE_TEXT_OUTPUT_INTERFACE *out = ST->ConOut;
    233 	UINTN c, r;
    234 
    235 	uefi_call_wrapper(out->QueryMode, 4, out, out->Mode->Mode, &c, &r);
    236 	*rows = r;
    237 	*cols = c;
    238 }
    239 
    240 static void efi_erase(int x0, int y0, int x1, int y1, uint8_t attribute)
    241 {
    242 	SIMPLE_TEXT_OUTPUT_INTERFACE *out = ST->ConOut;
    243 	int cols, rows;
    244 
    245 	efi_get_mode(&cols, &rows);
    246 
    247 	/*
    248 	 * The BIOS version of this function has the ability to erase
    249 	 * parts or all of the screen - the UEFI console doesn't
    250 	 * support this so we just set the cursor position unless
    251 	 * we're clearing the whole screen.
    252 	 */
    253 	if (!x0 && y0 == (cols - 1)) {
    254 		/* Really clear the screen */
    255 		uefi_call_wrapper(out->ClearScreen, 1, out);
    256 	} else {
    257 		uefi_call_wrapper(out->SetCursorPosition, 3, out, y1, x1);
    258 	}
    259 }
    260 
    261 static void efi_text_mode(void)
    262 {
    263 }
    264 
    265 static void efi_get_cursor(uint8_t *x, uint8_t *y)
    266 {
    267 	SIMPLE_TEXT_OUTPUT_INTERFACE *out = ST->ConOut;
    268 	*x = out->Mode->CursorColumn;
    269 	*y = out->Mode->CursorRow;
    270 }
    271 
    272 struct output_ops efi_ops = {
    273 	.erase = efi_erase,
    274 	.write_char = efi_write_char,
    275 	.showcursor = efi_showcursor,
    276 	.set_cursor = efi_set_cursor,
    277 	.scroll_up = efi_scroll_up,
    278 	.get_mode = efi_get_mode,
    279 	.text_mode = efi_text_mode,
    280 	.get_cursor = efi_get_cursor,
    281 };
    282 
    283 char SubvolName[2];
    284 static inline EFI_MEMORY_DESCRIPTOR *
    285 get_memory_map(UINTN *nr_entries, UINTN *key, UINTN *desc_sz,
    286 	       uint32_t *desc_ver)
    287 {
    288 	return LibMemoryMap(nr_entries, key, desc_sz, desc_ver);
    289 }
    290 
    291 
    292 int efi_scan_memory(scan_memory_callback_t callback, void *data)
    293 {
    294 	UINTN i, nr_entries, key, desc_sz;
    295 	UINTN buf, bufpos;
    296 	UINT32 desc_ver;
    297 	int rv = 0;
    298 
    299 	buf = (UINTN)get_memory_map(&nr_entries, &key, &desc_sz, &desc_ver);
    300 	if (!buf)
    301 		return -1;
    302 	bufpos = buf;
    303 
    304 	for (i = 0; i < nr_entries; bufpos += desc_sz, i++) {
    305 		EFI_MEMORY_DESCRIPTOR *m;
    306 		UINT64 region_sz;
    307 		enum syslinux_memmap_types type;
    308 
    309 		m = (EFI_MEMORY_DESCRIPTOR *)bufpos;
    310 		region_sz = m->NumberOfPages * EFI_PAGE_SIZE;
    311 
    312 		switch (m->Type) {
    313                 case EfiConventionalMemory:
    314 			type = SMT_FREE;
    315                         break;
    316 		default:
    317 			type = SMT_RESERVED;
    318 			break;
    319 		}
    320 
    321 		rv = callback(data, m->PhysicalStart, region_sz, type);
    322 		if (rv)
    323 			break;
    324 	}
    325 
    326 	FreePool((void *)buf);
    327 	return rv;
    328 }
    329 
    330 static struct syslinux_memscan efi_memscan = {
    331     .func = efi_scan_memory,
    332 };
    333 
    334 extern uint16_t *bios_free_mem;
    335 void efi_init(void)
    336 {
    337 	/* XXX timer */
    338 	*bios_free_mem = 0;
    339 	syslinux_memscan_add(&efi_memscan);
    340 	mem_init();
    341 }
    342 
    343 char efi_getchar(char *hi)
    344 {
    345 	SIMPLE_INPUT_INTERFACE *in = ST->ConIn;
    346 	EFI_INPUT_KEY key;
    347 	EFI_STATUS status;
    348 
    349 	do {
    350 		status = uefi_call_wrapper(in->ReadKeyStroke, 2, in, &key);
    351 	} while (status == EFI_NOT_READY);
    352 
    353 	if (!key.ScanCode)
    354 		return (char)key.UnicodeChar;
    355 
    356 	/*
    357 	 * We currently only handle scan codes that fit in 8 bits.
    358 	 */
    359 	*hi = (char)key.ScanCode;
    360 	return 0;
    361 }
    362 
    363 int efi_pollchar(void)
    364 {
    365 	SIMPLE_INPUT_INTERFACE *in = ST->ConIn;
    366 	EFI_STATUS status;
    367 
    368 	status = WaitForSingleEvent(in->WaitForKey, 1);
    369 	return status != EFI_TIMEOUT;
    370 }
    371 
    372 struct input_ops efi_iops = {
    373 	.getchar = efi_getchar,
    374 	.pollchar = efi_pollchar,
    375 };
    376 
    377 extern void efi_adv_init(void);
    378 extern int efi_adv_write(void);
    379 
    380 struct adv_ops efi_adv_ops = {
    381 	.init = efi_adv_init,
    382 	.write = efi_adv_write,
    383 };
    384 
    385 struct efi_info {
    386 	uint32_t load_signature;
    387 	uint32_t systab;
    388 	uint32_t desc_size;
    389 	uint32_t desc_version;
    390 	uint32_t memmap;
    391 	uint32_t memmap_size;
    392 	uint32_t systab_hi;
    393 	uint32_t memmap_hi;
    394 };
    395 
    396 #define E820MAX	128
    397 #define E820_RAM	1
    398 #define E820_RESERVED	2
    399 #define E820_ACPI	3
    400 #define E820_NVS	4
    401 #define E820_UNUSABLE	5
    402 
    403 #define BOOT_SIGNATURE	0xaa55
    404 #define SYSLINUX_EFILDR	0x30	/* Is this published value? */
    405 #define DEFAULT_TIMER_TICK_DURATION 	500000 /* 500000 == 500000 * 100 * 10^-9 == 50 msec */
    406 #define DEFAULT_MSTIMER_INC		0x32	/* 50 msec */
    407 struct e820_entry {
    408 	uint64_t start;
    409 	uint64_t len;
    410 	uint32_t type;
    411 } __packed;
    412 
    413 struct boot_params {
    414 	struct screen_info screen_info;
    415 	uint8_t _pad[0x1c0 - sizeof(struct screen_info)];
    416 	struct efi_info efi;
    417 	uint8_t _pad2[8];
    418 	uint8_t e820_entries;
    419 	uint8_t _pad3[0x2d0 - 0x1e8 - sizeof(uint8_t)];
    420 	struct e820_entry e820_map[E820MAX];
    421 } __packed;
    422 
    423 /* Allocate boot parameter block aligned to page */
    424 #define BOOT_PARAM_BLKSIZE	EFI_SIZE_TO_PAGES(sizeof(struct boot_params)) * EFI_PAGE_SIZE
    425 
    426 /* Routines in support of efi boot loader were obtained from
    427  * http://git.kernel.org/?p=boot/efilinux/efilinux.git:
    428  * kernel_jump(), handover_jump(),
    429  * emalloc()/efree, alloc_pages/free_pages
    430  * allocate_pool()/free_pool()
    431  * memory_map()
    432  */
    433 extern void kernel_jump(EFI_PHYSICAL_ADDRESS kernel_start,
    434 			       struct boot_params *boot_params);
    435 #if __SIZEOF_POINTER__ == 4
    436 #define EFI_LOAD_SIG	"EL32"
    437 #elif __SIZEOF_POINTER__ == 8
    438 #define EFI_LOAD_SIG	"EL64"
    439 #else
    440 #error "unsupported architecture"
    441 #endif
    442 
    443 struct dt_desc {
    444 	uint16_t limit;
    445 	uint64_t *base;
    446 } __packed;
    447 
    448 struct dt_desc gdt = { 0x800, (uint64_t *)0 };
    449 struct dt_desc idt = { 0, 0 };
    450 
    451 static inline EFI_MEMORY_DESCRIPTOR *
    452 get_mem_desc(unsigned long memmap, UINTN desc_sz, int i)
    453 {
    454 	return (EFI_MEMORY_DESCRIPTOR *)(memmap + (i * desc_sz));
    455 }
    456 
    457 EFI_HANDLE image_handle;
    458 
    459 static inline UINT64 round_up(UINT64 x, UINT64 y)
    460 {
    461 	return (((x - 1) | (y - 1)) + 1);
    462 }
    463 
    464 static inline UINT64 round_down(UINT64 x, UINT64 y)
    465 {
    466 	return (x & ~(y - 1));
    467 }
    468 
    469 static void find_addr(EFI_PHYSICAL_ADDRESS *first,
    470 		      EFI_PHYSICAL_ADDRESS *last,
    471 		      EFI_PHYSICAL_ADDRESS min,
    472 		      EFI_PHYSICAL_ADDRESS max,
    473 		      size_t size, size_t align)
    474 {
    475 	EFI_MEMORY_DESCRIPTOR *map;
    476 	UINT32 desc_ver;
    477 	UINTN i, nr_entries, key, desc_sz;
    478 
    479 	map = get_memory_map(&nr_entries, &key, &desc_sz, &desc_ver);
    480 	if (!map)
    481 		return;
    482 
    483 	for (i = 0; i < nr_entries; i++) {
    484 		EFI_MEMORY_DESCRIPTOR *m;
    485 		EFI_PHYSICAL_ADDRESS best;
    486 		UINT64 start, end;
    487 
    488 		m = get_mem_desc((unsigned long)map, desc_sz, i);
    489 		if (m->Type != EfiConventionalMemory)
    490 			continue;
    491 
    492 		if (m->NumberOfPages < EFI_SIZE_TO_PAGES(size))
    493 			continue;
    494 
    495 		start = m->PhysicalStart;
    496 		end = m->PhysicalStart + (m->NumberOfPages << EFI_PAGE_SHIFT);
    497 		if (first) {
    498 			if (end < min)
    499 				continue;
    500 
    501 			/* What's the best address? */
    502 			if (start < min && min < end)
    503 				best = min;
    504 			else
    505 				best = m->PhysicalStart;
    506 
    507 			start = round_up(best, align);
    508 			if (start > max)
    509 				continue;
    510 
    511 			/* Have we run out of space in this region? */
    512 			if (end < start || (start + size) > end)
    513 				continue;
    514 
    515 			if (start < *first)
    516 				*first = start;
    517 		}
    518 
    519 		if (last) {
    520 			if (start > max)
    521 				continue;
    522 
    523 			/* What's the best address? */
    524 			if (start < max && max < end)
    525 				best = max - size;
    526 			else
    527 				best = end - size;
    528 
    529 			start = round_down(best, align);
    530 			if (start < min || start < m->PhysicalStart)
    531 				continue;
    532 
    533 			if (start > *last)
    534 				*last = start;
    535 		}
    536 	}
    537 
    538 	FreePool(map);
    539 }
    540 
    541 /**
    542  * allocate_pages - Allocate memory pages from the system
    543  * @atype: type of allocation to perform
    544  * @mtype: type of memory to allocate
    545  * @num_pages: number of contiguous 4KB pages to allocate
    546  * @memory: used to return the address of allocated pages
    547  *
    548  * Allocate @num_pages physically contiguous pages from the system
    549  * memory and return a pointer to the base of the allocation in
    550  * @memory if the allocation succeeds. On success, the firmware memory
    551  * map is updated accordingly.
    552  *
    553  * If @atype is AllocateAddress then, on input, @memory specifies the
    554  * address at which to attempt to allocate the memory pages.
    555  */
    556 static inline EFI_STATUS
    557 allocate_pages(EFI_ALLOCATE_TYPE atype, EFI_MEMORY_TYPE mtype,
    558 	       UINTN num_pages, EFI_PHYSICAL_ADDRESS *memory)
    559 {
    560 	return uefi_call_wrapper(BS->AllocatePages, 4, atype,
    561 				 mtype, num_pages, memory);
    562 }
    563 /**
    564  * free_pages - Return memory allocated by allocate_pages() to the firmware
    565  * @memory: physical base address of the page range to be freed
    566  * @num_pages: number of contiguous 4KB pages to free
    567  *
    568  * On success, the firmware memory map is updated accordingly.
    569  */
    570 static inline EFI_STATUS
    571 free_pages(EFI_PHYSICAL_ADDRESS memory, UINTN num_pages)
    572 {
    573 	return uefi_call_wrapper(BS->FreePages, 2, memory, num_pages);
    574 }
    575 
    576 static EFI_STATUS allocate_addr(EFI_PHYSICAL_ADDRESS *addr, size_t size)
    577 {
    578 	UINTN npages = EFI_SIZE_TO_PAGES(size);
    579 
    580 	return uefi_call_wrapper(BS->AllocatePages, 4,
    581 				   AllocateAddress,
    582 				   EfiLoaderData, npages,
    583 				   addr);
    584 }
    585 /**
    586  * allocate_pool - Allocate pool memory
    587  * @type: the type of pool to allocate
    588  * @size: number of bytes to allocate from pool of @type
    589  * @buffer: used to return the address of allocated memory
    590  *
    591  * Allocate memory from pool of @type. If the pool needs more memory
    592  * pages are allocated from EfiConventionalMemory in order to grow the
    593  * pool.
    594  *
    595  * All allocations are eight-byte aligned.
    596  */
    597 static inline EFI_STATUS
    598 allocate_pool(EFI_MEMORY_TYPE type, UINTN size, void **buffer)
    599 {
    600 	return uefi_call_wrapper(BS->AllocatePool, 3, type, size, buffer);
    601 }
    602 
    603 /**
    604  * free_pool - Return pool memory to the system
    605  * @buffer: the buffer to free
    606  *
    607  * Return @buffer to the system. The returned memory is marked as
    608  * EfiConventionalMemory.
    609  */
    610 static inline EFI_STATUS free_pool(void *buffer)
    611 {
    612 	return uefi_call_wrapper(BS->FreePool, 1, buffer);
    613 }
    614 
    615 static void free_addr(EFI_PHYSICAL_ADDRESS addr, size_t size)
    616 {
    617 	UINTN npages = EFI_SIZE_TO_PAGES(size);
    618 
    619 	uefi_call_wrapper(BS->FreePages, 2, addr, npages);
    620 }
    621 
    622 /* cancel the established timer */
    623 static EFI_STATUS cancel_timer(EFI_EVENT ev)
    624 {
    625 	return uefi_call_wrapper(BS->SetTimer, 3, ev, TimerCancel, 0);
    626 }
    627 
    628 /* Check if timer went off and update default timer counter */
    629 void timer_handler(EFI_EVENT ev, VOID *ctx)
    630 {
    631 	__ms_timer += DEFAULT_MSTIMER_INC;
    632 	++__jiffies;
    633 }
    634 
    635 /* Setup a default periodic timer */
    636 static EFI_STATUS setup_default_timer(EFI_EVENT *ev)
    637 {
    638 	EFI_STATUS efi_status;
    639 
    640 	*ev = NULL;
    641 	efi_status = uefi_call_wrapper( BS->CreateEvent, 5, EVT_TIMER|EVT_NOTIFY_SIGNAL, TPL_NOTIFY, (EFI_EVENT_NOTIFY)timer_handler, NULL, ev);
    642 	if (efi_status == EFI_SUCCESS) {
    643 		efi_status = uefi_call_wrapper(BS->SetTimer, 3, *ev, TimerPeriodic, DEFAULT_TIMER_TICK_DURATION);
    644 	}
    645 	return efi_status;
    646 }
    647 
    648 /**
    649  * emalloc - Allocate memory with a strict alignment requirement
    650  * @size: size in bytes of the requested allocation
    651  * @align: the required alignment of the allocation
    652  * @addr: a pointer to the allocated address on success
    653  *
    654  * If we cannot satisfy @align we return 0.
    655  */
    656 EFI_STATUS emalloc(UINTN size, UINTN align, EFI_PHYSICAL_ADDRESS *addr)
    657 {
    658 	UINTN i, nr_entries, map_key, desc_size;
    659 	EFI_MEMORY_DESCRIPTOR *map_buf;
    660 	UINTN d;
    661 	UINT32 desc_version;
    662 	EFI_STATUS err;
    663 	UINTN nr_pages = EFI_SIZE_TO_PAGES(size);
    664 
    665 	map_buf = get_memory_map(&nr_entries, &map_key,
    666 				 &desc_size, &desc_version);
    667 	if (!map_buf)
    668 		goto fail;
    669 
    670 	d = (UINTN)map_buf;
    671 
    672 	for (i = 0; i < nr_entries; i++, d += desc_size) {
    673 		EFI_MEMORY_DESCRIPTOR *desc;
    674 		EFI_PHYSICAL_ADDRESS start, end, aligned;
    675 
    676 		desc = (EFI_MEMORY_DESCRIPTOR *)d;
    677 		if (desc->Type != EfiConventionalMemory)
    678 			continue;
    679 
    680 		if (desc->NumberOfPages < nr_pages)
    681 			continue;
    682 
    683 		start = desc->PhysicalStart;
    684 		end = start + (desc->NumberOfPages << EFI_PAGE_SHIFT);
    685 
    686 		/* Low-memory is super-precious! */
    687 		if (end <= 1 << 20)
    688 			continue;
    689 		if (start < 1 << 20)
    690 			start = (1 << 20);
    691 
    692 		aligned = (start + align -1) & ~(align -1);
    693 
    694 		if ((aligned + size) <= end) {
    695 			err = allocate_pages(AllocateAddress, EfiLoaderData,
    696 					     nr_pages, &aligned);
    697 			if (err == EFI_SUCCESS) {
    698 				*addr = aligned;
    699 				break;
    700 			}
    701 		}
    702 	}
    703 
    704 	if (i == nr_entries)
    705 		err = EFI_OUT_OF_RESOURCES;
    706 
    707 	free_pool(map_buf);
    708 fail:
    709 	return err;
    710 }
    711 /**
    712  * efree - Return memory allocated with emalloc
    713  * @memory: the address of the emalloc() allocation
    714  * @size: the size of the allocation
    715  */
    716 void efree(EFI_PHYSICAL_ADDRESS memory, UINTN size)
    717 {
    718 	UINTN nr_pages = EFI_SIZE_TO_PAGES(size);
    719 
    720 	free_pages(memory, nr_pages);
    721 }
    722 
    723 /*
    724  * Check whether 'buf' contains a PE/COFF header and that the PE/COFF
    725  * file can be executed by this architecture.
    726  */
    727 static bool valid_pecoff_image(char *buf)
    728 {
    729     struct pe_header {
    730 	uint16_t signature;
    731 	uint8_t _pad[0x3a];
    732 	uint32_t offset;
    733     } *pehdr = (struct pe_header *)buf;
    734     struct coff_header {
    735 	uint32_t signature;
    736 	uint16_t machine;
    737     } *chdr;
    738 
    739     if (pehdr->signature != 0x5a4d) {
    740 	dprintf("Invalid MS-DOS header signature\n");
    741 	return false;
    742     }
    743 
    744     if (!pehdr->offset || pehdr->offset > 512) {
    745 	dprintf("Invalid PE header offset\n");
    746 	return false;
    747     }
    748 
    749     chdr = (struct coff_header *)&buf[pehdr->offset];
    750     if (chdr->signature != 0x4550) {
    751 	dprintf("Invalid PE header signature\n");
    752 	return false;
    753     }
    754 
    755 #if defined(__x86_64__)
    756     if (chdr->machine != 0x8664) {
    757 	dprintf("Invalid PE machine field\n");
    758 	return false;
    759     }
    760 #else
    761     if (chdr->machine != 0x14c) {
    762 	dprintf("Invalid PE machine field\n");
    763 	return false;
    764     }
    765 #endif
    766 
    767     return true;
    768 }
    769 
    770 /*
    771  * Boot a Linux kernel using the EFI boot stub handover protocol.
    772  *
    773  * This function will not return to its caller if booting the kernel
    774  * image succeeds. If booting the kernel image fails, a legacy boot
    775  * method should be attempted.
    776  */
    777 static void handover_boot(struct linux_header *hdr, struct boot_params *bp)
    778 {
    779     unsigned long address = hdr->code32_start + hdr->handover_offset;
    780     handover_func_t *func = efi_handover;
    781 
    782     dprintf("Booting kernel using handover protocol\n");
    783 
    784     /*
    785      * Ensure that the kernel is a valid PE32(+) file and that the
    786      * architecture of the file matches this version of Syslinux - we
    787      * can't mix firmware and kernel bitness (e.g. 32-bit kernel on
    788      * 64-bit EFI firmware) using the handover protocol.
    789      */
    790     if (!valid_pecoff_image((char *)hdr))
    791 	return;
    792 
    793     if (hdr->version >= 0x20c) {
    794 	if (hdr->xloadflags & XLF_EFI_HANDOVER_32)
    795 	    func = efi_handover_32;
    796 
    797 	if (hdr->xloadflags & XLF_EFI_HANDOVER_64)
    798 	    func = efi_handover_64;
    799     }
    800 
    801     efi_console_restore();
    802     func(image_handle, ST, bp, address);
    803 }
    804 
    805 static int check_linux_header(struct linux_header *hdr)
    806 {
    807 	if (hdr->version < 0x205)
    808 		hdr->relocatable_kernel = 0;
    809 
    810 	/* FIXME: check boot sector signature */
    811 	if (hdr->boot_flag != BOOT_SIGNATURE) {
    812 		printf("Invalid Boot signature 0x%x, bailing out\n", hdr->boot_flag);
    813 		return -1;
    814 	}
    815 
    816 	return 0;
    817 }
    818 
    819 static char *build_cmdline(char *str)
    820 {
    821 	EFI_PHYSICAL_ADDRESS addr;
    822 	EFI_STATUS status;
    823 	char *cmdline = NULL; /* internal, in efi_physical below 0x3FFFFFFF */
    824 
    825 	/*
    826 	 * The kernel expects cmdline to be allocated pretty low,
    827 	 * Documentation/x86/boot.txt says,
    828 	 *
    829 	 *	"The kernel command line can be located anywhere
    830 	 *	between the end of the setup heap and 0xA0000"
    831 	 */
    832 	addr = 0xA0000;
    833 	status = allocate_pages(AllocateMaxAddress, EfiLoaderData,
    834 			     EFI_SIZE_TO_PAGES(strlen(str) + 1),
    835 			     &addr);
    836 	if (status != EFI_SUCCESS) {
    837 		printf("Failed to allocate memory for kernel command line, bailing out\n");
    838 		return NULL;
    839 	}
    840 	cmdline = (char *)(UINTN)addr;
    841 	memcpy(cmdline, str, strlen(str) + 1);
    842 	return cmdline;
    843 }
    844 
    845 static int build_gdt(void)
    846 {
    847 	EFI_STATUS status;
    848 
    849 	/* Allocate gdt consistent with the alignment for architecture */
    850 	status = emalloc(gdt.limit, __SIZEOF_POINTER__ , (EFI_PHYSICAL_ADDRESS *)&gdt.base);
    851 	if (status != EFI_SUCCESS) {
    852 		printf("Failed to allocate memory for GDT, bailing out\n");
    853 		return -1;
    854 	}
    855 	memset(gdt.base, 0x0, gdt.limit);
    856 
    857 	/*
    858          * 4Gb - (0x100000*0x1000 = 4Gb)
    859          * base address=0
    860          * code read/exec
    861          * granularity=4096, 386 (+5th nibble of limit)
    862          */
    863         gdt.base[2] = 0x00cf9a000000ffff;
    864 
    865         /*
    866          * 4Gb - (0x100000*0x1000 = 4Gb)
    867          * base address=0
    868          * data read/write
    869          * granularity=4096, 386 (+5th nibble of limit)
    870          */
    871         gdt.base[3] = 0x00cf92000000ffff;
    872 
    873         /* Task segment value */
    874         gdt.base[4] = 0x0080890000000000;
    875 
    876 	return 0;
    877 }
    878 
    879 /*
    880  * Callers use ->ramdisk_size to check whether any memory was
    881  * allocated (and therefore needs free'ing). The return value indicates
    882  * hard error conditions, such as failing to alloc memory for the
    883  * ramdisk image. Having no initramfs is not an error.
    884  */
    885 static int handle_ramdisks(struct linux_header *hdr,
    886 			   struct initramfs *initramfs)
    887 {
    888 	EFI_PHYSICAL_ADDRESS last;
    889 	struct initramfs *ip;
    890 	EFI_STATUS status;
    891 	addr_t irf_size;
    892 	addr_t next_addr, len, pad;
    893 
    894 	hdr->ramdisk_image = 0;
    895 	hdr->ramdisk_size = 0;
    896 
    897 	/*
    898 	 * Figure out the size of the initramfs, and where to put it.
    899 	 * We should put it at the highest possible address which is
    900 	 * <= hdr->initrd_addr_max, which fits the entire initramfs.
    901 	 */
    902 	irf_size = initramfs_size(initramfs);	/* Handles initramfs == NULL */
    903 	if (!irf_size)
    904 		return 0;
    905 
    906 	last = 0;
    907 	find_addr(NULL, &last, 0x1000, hdr->initrd_addr_max,
    908 		  irf_size, INITRAMFS_MAX_ALIGN);
    909 	if (last)
    910 		status = allocate_addr(&last, irf_size);
    911 
    912 	if (!last || status != EFI_SUCCESS) {
    913 		printf("Failed to allocate initramfs memory, bailing out\n");
    914 		return -1;
    915 	}
    916 
    917 	hdr->ramdisk_image = (uint32_t)last;
    918 	hdr->ramdisk_size = irf_size;
    919 
    920 	/* Copy initramfs into allocated memory */
    921 	for (ip = initramfs->next; ip->len; ip = ip->next) {
    922 		len = ip->len;
    923 		next_addr = last + len;
    924 
    925 		/*
    926 		 * If this isn't the last entry, extend the
    927 		 * zero-pad region to enforce the alignment of
    928 		 * the next chunk.
    929 		 */
    930 		if (ip->next->len) {
    931 			pad = -next_addr & (ip->next->align - 1);
    932 			len += pad;
    933 			next_addr += pad;
    934 		}
    935 
    936 		if (ip->data_len)
    937 			memcpy((void *)(UINTN)last, ip->data, ip->data_len);
    938 
    939 		if (len > ip->data_len)
    940 			memset((void *)(UINTN)(last + ip->data_len), 0,
    941 			       len - ip->data_len);
    942 
    943 		last = next_addr;
    944 	}
    945 	return 0;
    946 }
    947 
    948 static int exit_boot(struct boot_params *bp)
    949 {
    950 	struct e820_entry *e820buf, *e;
    951 	EFI_MEMORY_DESCRIPTOR *map;
    952 	EFI_STATUS status;
    953 	uint32_t e820_type;
    954 	UINTN i, nr_entries, key, desc_sz;
    955 	UINT32 desc_ver;
    956 
    957 	/* Build efi memory map */
    958 	map = get_memory_map(&nr_entries, &key, &desc_sz, &desc_ver);
    959 	if (!map)
    960 		return -1;
    961 
    962 	bp->efi.memmap = (uint32_t)(unsigned long)map;
    963 	bp->efi.memmap_size = nr_entries * desc_sz;
    964 	bp->efi.systab = (uint32_t)(unsigned long)ST;
    965 	bp->efi.desc_size = desc_sz;
    966 	bp->efi.desc_version = desc_ver;
    967 #if defined(__x86_64__)
    968         bp->efi.systab_hi = ((unsigned long)ST) >> 32;
    969         bp->efi.memmap_hi = ((unsigned long)map) >> 32;
    970 #endif
    971 
    972 
    973 	/*
    974 	 * Even though 'memmap' contains the memory map we provided
    975 	 * previously in efi_scan_memory(), we should recalculate the
    976 	 * e820 map because it will most likely have changed in the
    977 	 * interim.
    978 	 */
    979 	e = e820buf = bp->e820_map;
    980 	for (i = 0; i < nr_entries && i < E820MAX; i++) {
    981 		struct e820_entry *prev = NULL;
    982 
    983 		if (e > e820buf)
    984 			prev = e - 1;
    985 
    986 		map = get_mem_desc(bp->efi.memmap, desc_sz, i);
    987 		e->start = map->PhysicalStart;
    988 		e->len = map->NumberOfPages << EFI_PAGE_SHIFT;
    989 
    990 		switch (map->Type) {
    991 		case EfiReservedMemoryType:
    992                 case EfiRuntimeServicesCode:
    993                 case EfiRuntimeServicesData:
    994                 case EfiMemoryMappedIO:
    995                 case EfiMemoryMappedIOPortSpace:
    996                 case EfiPalCode:
    997                         e820_type = E820_RESERVED;
    998                         break;
    999 
   1000                 case EfiUnusableMemory:
   1001                         e820_type = E820_UNUSABLE;
   1002                         break;
   1003 
   1004                 case EfiACPIReclaimMemory:
   1005                         e820_type = E820_ACPI;
   1006                         break;
   1007 
   1008                 case EfiLoaderCode:
   1009                 case EfiLoaderData:
   1010                 case EfiBootServicesCode:
   1011                 case EfiBootServicesData:
   1012                 case EfiConventionalMemory:
   1013 			e820_type = E820_RAM;
   1014 			break;
   1015 
   1016 		case EfiACPIMemoryNVS:
   1017 			e820_type = E820_NVS;
   1018 			break;
   1019 		default:
   1020 			continue;
   1021 		}
   1022 
   1023 		e->type = e820_type;
   1024 
   1025 		/* Check for adjacent entries we can merge. */
   1026 		if (prev && (prev->start + prev->len) == e->start &&
   1027 		    prev->type == e->type)
   1028 			prev->len += e->len;
   1029 		else
   1030 			e++;
   1031 	}
   1032 
   1033 	bp->e820_entries = e - e820buf;
   1034 
   1035 	status = uefi_call_wrapper(BS->ExitBootServices, 2, image_handle, key);
   1036 	if (status != EFI_SUCCESS) {
   1037 		printf("Failed to exit boot services: 0x%016lx\n", status);
   1038 		FreePool(map);
   1039 		return -1;
   1040 	}
   1041 
   1042 	return 0;
   1043 }
   1044 
   1045 /* efi_boot_linux:
   1046  * Boots the linux kernel using the image and parameters to boot with.
   1047  * The EFI boot loader is reworked taking the cue from
   1048  * http://git.kernel.org/?p=boot/efilinux/efilinux.git on the need to
   1049  * cap key kernel data structures at * 0x3FFFFFFF.
   1050  * The kernel image, kernel command line and boot parameter block are copied
   1051  * into allocated memory areas that honor the address capping requirement
   1052  * prior to kernel handoff.
   1053  *
   1054  * FIXME
   1055  * Can we move this allocation requirement to com32 linux loader in order
   1056  * to avoid double copying kernel image?
   1057  */
   1058 int efi_boot_linux(void *kernel_buf, size_t kernel_size,
   1059 		   struct initramfs *initramfs,
   1060 		   struct setup_data *setup_data,
   1061 		   char *cmdline)
   1062 {
   1063 	struct linux_header *hdr;
   1064 	struct boot_params *bp;
   1065 	EFI_STATUS status;
   1066 	EFI_PHYSICAL_ADDRESS addr, pref_address, kernel_start = 0;
   1067 	UINT64 setup_sz, init_size = 0;
   1068 	char *_cmdline;
   1069 
   1070 	if (check_linux_header(kernel_buf))
   1071 		goto bail;
   1072 
   1073 	/* allocate for boot parameter block */
   1074 	addr = 0x3FFFFFFF;
   1075 	status = allocate_pages(AllocateMaxAddress, EfiLoaderData,
   1076 			     BOOT_PARAM_BLKSIZE, &addr);
   1077 	if (status != EFI_SUCCESS) {
   1078 		printf("Failed to allocate memory for kernel boot parameter block, bailing out\n");
   1079 		goto bail;
   1080 	}
   1081 
   1082 	bp = (struct boot_params *)(UINTN)addr;
   1083 
   1084 	memset((void *)bp, 0x0, BOOT_PARAM_BLKSIZE);
   1085 	/* Copy the first two sectors to boot_params */
   1086 	memcpy((char *)bp, kernel_buf, 2 * 512);
   1087 	hdr = (struct linux_header *)bp;
   1088 
   1089 	setup_sz = (hdr->setup_sects + 1) * 512;
   1090 	if (hdr->version >= 0x20a) {
   1091 		pref_address = hdr->pref_address;
   1092 		init_size = hdr->init_size;
   1093 	} else {
   1094 		pref_address = 0x100000;
   1095 
   1096 		/*
   1097 		 * We need to account for the fact that the kernel
   1098 		 * needs room for decompression, otherwise we could
   1099 		 * end up trashing other chunks of allocated memory.
   1100 		 */
   1101 		init_size = (kernel_size - setup_sz) * 3;
   1102 	}
   1103 	hdr->type_of_loader = SYSLINUX_EFILDR;	/* SYSLINUX boot loader module */
   1104 	_cmdline = build_cmdline(cmdline);
   1105 	if (!_cmdline)
   1106 		goto bail;
   1107 
   1108 	hdr->cmd_line_ptr = (UINT32)(UINTN)_cmdline;
   1109 
   1110 	addr = pref_address;
   1111 	status = allocate_pages(AllocateAddress, EfiLoaderData,
   1112 			     EFI_SIZE_TO_PAGES(init_size), &addr);
   1113 	if (status != EFI_SUCCESS) {
   1114 		/*
   1115 		 * We failed to allocate the preferred address, so
   1116 		 * just allocate some memory and hope for the best.
   1117 		 */
   1118 		if (!hdr->relocatable_kernel) {
   1119 			printf("Cannot relocate kernel, bailing out\n");
   1120 			goto bail;
   1121 		}
   1122 
   1123 		status = emalloc(init_size, hdr->kernel_alignment, &addr);
   1124 		if (status != EFI_SUCCESS) {
   1125 			printf("Failed to allocate memory for kernel image, bailing out\n");
   1126 			goto free_map;
   1127 		}
   1128 	}
   1129 	kernel_start = addr;
   1130 	/* FIXME: we copy the kernel into the physical memory allocated here
   1131 	 * The syslinux kernel image load elsewhere could allocate the EFI memory from here
   1132 	 * prior to copying kernel and save an extra copy
   1133 	 */
   1134 	memcpy((void *)(UINTN)kernel_start, kernel_buf+setup_sz, kernel_size-setup_sz);
   1135 
   1136 	hdr->code32_start = (UINT32)((UINT64)kernel_start);
   1137 
   1138 	dprintf("efi_boot_linux: kernel_start 0x%x kernel_size 0x%x initramfs 0x%x setup_data 0x%x cmdline 0x%x\n",
   1139 	kernel_start, kernel_size, initramfs, setup_data, _cmdline);
   1140 
   1141 	if (handle_ramdisks(hdr, initramfs))
   1142 		goto free_map;
   1143 
   1144 	/* Attempt to use the handover protocol if available */
   1145 	if (hdr->version >= 0x20b && hdr->handover_offset)
   1146 		handover_boot(hdr, bp);
   1147 
   1148 	setup_screen(&bp->screen_info);
   1149 
   1150 	if (build_gdt())
   1151 		goto free_map;
   1152 
   1153 	dprintf("efi_boot_linux: setup_sects %d kernel_size %d\n", hdr->setup_sects, kernel_size);
   1154 
   1155 	efi_console_restore();
   1156 
   1157 	if (exit_boot(bp))
   1158 		goto free_map;
   1159 
   1160 	memcpy(&bp->efi.load_signature, EFI_LOAD_SIG, sizeof(uint32_t));
   1161 
   1162 	asm volatile ("lidt %0" :: "m" (idt));
   1163 	asm volatile ("lgdt %0" :: "m" (gdt));
   1164 
   1165 	kernel_jump(kernel_start, bp);
   1166 
   1167 	/* NOTREACHED */
   1168 
   1169 free_map:
   1170 	if (_cmdline)
   1171 		efree((EFI_PHYSICAL_ADDRESS)(unsigned long)_cmdline,
   1172 		      strlen(_cmdline) + 1);
   1173 
   1174 	if (bp)
   1175 		efree((EFI_PHYSICAL_ADDRESS)(unsigned long)bp,
   1176 		       BOOT_PARAM_BLKSIZE);
   1177 	if (kernel_start) efree(kernel_start, init_size);
   1178 	if (hdr->ramdisk_size)
   1179 		free_addr(hdr->ramdisk_image, hdr->ramdisk_size);
   1180 bail:
   1181 	return -1;
   1182 }
   1183 
   1184 extern struct disk *efi_disk_init(EFI_HANDLE);
   1185 extern void serialcfg(uint16_t *, uint16_t *, uint16_t *);
   1186 
   1187 extern struct vesa_ops efi_vesa_ops;
   1188 
   1189 struct mem_ops efi_mem_ops = {
   1190 	.malloc = efi_malloc,
   1191 	.realloc = efi_realloc,
   1192 	.free = efi_free,
   1193 };
   1194 
   1195 struct firmware efi_fw = {
   1196 	.init = efi_init,
   1197 	.disk_init = efi_disk_init,
   1198 	.o_ops = &efi_ops,
   1199 	.i_ops = &efi_iops,
   1200 	.get_serial_console_info = serialcfg,
   1201 	.adv_ops = &efi_adv_ops,
   1202 	.boot_linux = efi_boot_linux,
   1203 	.vesa = &efi_vesa_ops,
   1204 	.mem = &efi_mem_ops,
   1205 };
   1206 
   1207 static inline void syslinux_register_efi(void)
   1208 {
   1209 	firmware = &efi_fw;
   1210 }
   1211 
   1212 extern void init(void);
   1213 extern const struct fs_ops vfat_fs_ops;
   1214 extern const struct fs_ops pxe_fs_ops;
   1215 
   1216 char free_high_memory[4096];
   1217 
   1218 extern char __bss_start[];
   1219 extern char __bss_end[];
   1220 
   1221 static void efi_setcwd(CHAR16 *dp)
   1222 {
   1223 	CHAR16 *c16;
   1224 	char *c8;
   1225 	int i, j;
   1226 
   1227 	/* Search for the start of the last path component */
   1228 	for (i = StrLen(dp) - 1; i >= 0; i--) {
   1229 		if (dp[i] == '\\' || dp[i] == '/')
   1230 			break;
   1231 	}
   1232 
   1233 	if (i < 0 || i > CURRENTDIR_MAX) {
   1234 		dp = L"\\";
   1235 		i = 1;
   1236 	}
   1237 
   1238 	c8 = CurrentDirName;
   1239 	c16 = dp;
   1240 
   1241 	for (j = 0; j < i; j++) {
   1242 		if (*c16 == '\\') {
   1243 			*c8++ = '/';
   1244 			c16++;
   1245 		} else
   1246 			*c8++ = *c16++;
   1247 	}
   1248 
   1249 	*c8 = '\0';
   1250 }
   1251 
   1252 EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *table)
   1253 {
   1254 	EFI_PXE_BASE_CODE *pxe;
   1255 	EFI_LOADED_IMAGE *info;
   1256 	EFI_STATUS status = EFI_SUCCESS;
   1257 	const struct fs_ops *ops[] = { NULL, NULL };
   1258 	unsigned long len = (unsigned long)__bss_end - (unsigned long)__bss_start;
   1259 	static struct efi_disk_private priv;
   1260 	SIMPLE_INPUT_INTERFACE *in;
   1261 	EFI_INPUT_KEY key;
   1262 	EFI_EVENT timer_ev;
   1263 
   1264 	memset(__bss_start, 0, len);
   1265 	InitializeLib(image, table);
   1266 
   1267 	image_handle = image;
   1268 	syslinux_register_efi();
   1269 
   1270 	efi_console_save();
   1271 	init();
   1272 
   1273 	status = uefi_call_wrapper(BS->HandleProtocol, 3, image,
   1274 				   &LoadedImageProtocol, (void **)&info);
   1275 	if (status != EFI_SUCCESS) {
   1276 		Print(L"Failed to lookup LoadedImageProtocol\n");
   1277 		goto out;
   1278 	}
   1279 
   1280 	status = uefi_call_wrapper(BS->HandleProtocol, 3, info->DeviceHandle,
   1281 				   &PxeBaseCodeProtocol, (void **)&pxe);
   1282 	if (status != EFI_SUCCESS) {
   1283 		/*
   1284 		 * Use device handle to set up the volume root to
   1285 		 * proceed with ADV init.
   1286 		 */
   1287 		if (EFI_ERROR(efi_set_volroot(info->DeviceHandle))) {
   1288 			Print(L"Failed to locate root device to prep for ");
   1289 			Print(L"file operations & ADV initialization\n");
   1290 			goto out;
   1291 		}
   1292 
   1293 		efi_derivative(SYSLINUX_FS_SYSLINUX);
   1294 		ops[0] = &vfat_fs_ops;
   1295 	} else {
   1296 		efi_derivative(SYSLINUX_FS_PXELINUX);
   1297 		ops[0] = &pxe_fs_ops;
   1298 	}
   1299 
   1300 	/* setup timer for boot menu system support */
   1301 	status = setup_default_timer(&timer_ev);
   1302 	if (status != EFI_SUCCESS) {
   1303 		Print(L"Failed to set up EFI timer support, bailing out\n");
   1304 		goto out;
   1305 	}
   1306 
   1307 	/* TODO: once all errors are captured in efi_errno, bail out if necessary */
   1308 
   1309 	priv.dev_handle = info->DeviceHandle;
   1310 
   1311 	/*
   1312 	 * Set the current working directory, which should be the
   1313 	 * directory that syslinux.efi resides in.
   1314 	 */
   1315 	efi_setcwd(DevicePathToStr(info->FilePath));
   1316 
   1317 	fs_init(ops, (void *)&priv);
   1318 
   1319 	/*
   1320 	 * There may be pending user input that wasn't processed by
   1321 	 * whatever application invoked us. Consume and discard that
   1322 	 * data now.
   1323 	 */
   1324 	in = ST->ConIn;
   1325 	do {
   1326 		status = uefi_call_wrapper(in->ReadKeyStroke, 2, in, &key);
   1327 	} while (status != EFI_NOT_READY);
   1328 
   1329 	if (!setjmp(load_error_buf))
   1330 		load_env32(NULL);
   1331 
   1332 	/* load_env32() failed.. cancel timer and bailout */
   1333 	status = cancel_timer(timer_ev);
   1334 	if (status != EFI_SUCCESS)
   1335 		Print(L"Failed to cancel EFI timer: %x\n", status);
   1336 
   1337 	/*
   1338 	 * Tell the firmware that Syslinux failed to load.
   1339 	 */
   1340 	status = EFI_LOAD_ERROR;
   1341 out:
   1342 	efi_console_restore();
   1343 	return status;
   1344 }
   1345