Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
eboot.c
Go to the documentation of this file.
1 /* -----------------------------------------------------------------------
2  *
3  * Copyright 2011 Intel Corporation; author Matt Fleming
4  *
5  * This file is part of the Linux kernel, and is made available under
6  * the terms of the GNU General Public License version 2.
7  *
8  * ----------------------------------------------------------------------- */
9 
10 #include <linux/efi.h>
11 #include <asm/efi.h>
12 #include <asm/setup.h>
13 #include <asm/desc.h>
14 
15 #undef memcpy /* Use memcpy from misc.c */
16 
17 #include "eboot.h"
18 
19 static efi_system_table_t *sys_table;
20 
21 static void efi_printk(char *str)
22 {
23  char *s8;
24 
25  for (s8 = str; *s8; s8++) {
27  efi_char16_t ch[2] = { 0 };
28 
29  ch[0] = *s8;
30  out = (struct efi_simple_text_output_protocol *)sys_table->con_out;
31 
32  if (*s8 == '\n') {
33  efi_char16_t nl[2] = { '\r', 0 };
34  efi_call_phys2(out->output_string, out, nl);
35  }
36 
37  efi_call_phys2(out->output_string, out, ch);
38  }
39 }
40 
41 static efi_status_t __get_map(efi_memory_desc_t **map, unsigned long *map_size,
42  unsigned long *desc_size)
43 {
46  unsigned long key;
47  u32 desc_version;
48 
49  *map_size = sizeof(*m) * 32;
50 again:
51  /*
52  * Add an additional efi_memory_desc_t because we're doing an
53  * allocation which may be in a new descriptor region.
54  */
55  *map_size += sizeof(*m);
56  status = efi_call_phys3(sys_table->boottime->allocate_pool,
57  EFI_LOADER_DATA, *map_size, (void **)&m);
58  if (status != EFI_SUCCESS)
59  goto fail;
60 
61  status = efi_call_phys5(sys_table->boottime->get_memory_map, map_size,
62  m, &key, desc_size, &desc_version);
63  if (status == EFI_BUFFER_TOO_SMALL) {
64  efi_call_phys1(sys_table->boottime->free_pool, m);
65  goto again;
66  }
67 
68  if (status != EFI_SUCCESS)
69  efi_call_phys1(sys_table->boottime->free_pool, m);
70 
71 fail:
72  *map = m;
73  return status;
74 }
75 
76 /*
77  * Allocate at the highest possible address that is not above 'max'.
78  */
79 static efi_status_t high_alloc(unsigned long size, unsigned long align,
80  unsigned long *addr, unsigned long max)
81 {
82  unsigned long map_size, desc_size;
85  unsigned long nr_pages;
86  u64 max_addr = 0;
87  int i;
88 
89  status = __get_map(&map, &map_size, &desc_size);
90  if (status != EFI_SUCCESS)
91  goto fail;
92 
93  nr_pages = round_up(size, EFI_PAGE_SIZE) / EFI_PAGE_SIZE;
94 again:
95  for (i = 0; i < map_size / desc_size; i++) {
97  unsigned long m = (unsigned long)map;
98  u64 start, end;
99 
100  desc = (efi_memory_desc_t *)(m + (i * desc_size));
101  if (desc->type != EFI_CONVENTIONAL_MEMORY)
102  continue;
103 
104  if (desc->num_pages < nr_pages)
105  continue;
106 
107  start = desc->phys_addr;
108  end = start + desc->num_pages * (1UL << EFI_PAGE_SHIFT);
109 
110  if ((start + size) > end || (start + size) > max)
111  continue;
112 
113  if (end - size > max)
114  end = max;
115 
116  if (round_down(end - size, align) < start)
117  continue;
118 
119  start = round_down(end - size, align);
120 
121  /*
122  * Don't allocate at 0x0. It will confuse code that
123  * checks pointers against NULL.
124  */
125  if (start == 0x0)
126  continue;
127 
128  if (start > max_addr)
129  max_addr = start;
130  }
131 
132  if (!max_addr)
133  status = EFI_NOT_FOUND;
134  else {
135  status = efi_call_phys4(sys_table->boottime->allocate_pages,
137  nr_pages, &max_addr);
138  if (status != EFI_SUCCESS) {
139  max = max_addr;
140  max_addr = 0;
141  goto again;
142  }
143 
144  *addr = max_addr;
145  }
146 
147 free_pool:
148  efi_call_phys1(sys_table->boottime->free_pool, map);
149 
150 fail:
151  return status;
152 }
153 
154 /*
155  * Allocate at the lowest possible address.
156  */
157 static efi_status_t low_alloc(unsigned long size, unsigned long align,
158  unsigned long *addr)
159 {
160  unsigned long map_size, desc_size;
163  unsigned long nr_pages;
164  int i;
165 
166  status = __get_map(&map, &map_size, &desc_size);
167  if (status != EFI_SUCCESS)
168  goto fail;
169 
170  nr_pages = round_up(size, EFI_PAGE_SIZE) / EFI_PAGE_SIZE;
171  for (i = 0; i < map_size / desc_size; i++) {
172  efi_memory_desc_t *desc;
173  unsigned long m = (unsigned long)map;
174  u64 start, end;
175 
176  desc = (efi_memory_desc_t *)(m + (i * desc_size));
177 
178  if (desc->type != EFI_CONVENTIONAL_MEMORY)
179  continue;
180 
181  if (desc->num_pages < nr_pages)
182  continue;
183 
184  start = desc->phys_addr;
185  end = start + desc->num_pages * (1UL << EFI_PAGE_SHIFT);
186 
187  /*
188  * Don't allocate at 0x0. It will confuse code that
189  * checks pointers against NULL. Skip the first 8
190  * bytes so we start at a nice even number.
191  */
192  if (start == 0x0)
193  start += 8;
194 
195  start = round_up(start, align);
196  if ((start + size) > end)
197  continue;
198 
199  status = efi_call_phys4(sys_table->boottime->allocate_pages,
201  nr_pages, &start);
202  if (status == EFI_SUCCESS) {
203  *addr = start;
204  break;
205  }
206  }
207 
208  if (i == map_size / desc_size)
209  status = EFI_NOT_FOUND;
210 
211 free_pool:
212  efi_call_phys1(sys_table->boottime->free_pool, map);
213 fail:
214  return status;
215 }
216 
217 static void low_free(unsigned long size, unsigned long addr)
218 {
219  unsigned long nr_pages;
220 
221  nr_pages = round_up(size, EFI_PAGE_SIZE) / EFI_PAGE_SIZE;
222  efi_call_phys2(sys_table->boottime->free_pages, addr, size);
223 }
224 
225 static void find_bits(unsigned long mask, u8 *pos, u8 *size)
226 {
227  u8 first, len;
228 
229  first = 0;
230  len = 0;
231 
232  if (mask) {
233  while (!(mask & 0x1)) {
234  mask = mask >> 1;
235  first++;
236  }
237 
238  while (mask & 0x1) {
239  mask = mask >> 1;
240  len++;
241  }
242  }
243 
244  *pos = first;
245  *size = len;
246 }
247 
248 /*
249  * See if we have Graphics Output Protocol
250  */
251 static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto,
252  unsigned long size)
253 {
254  struct efi_graphics_output_protocol *gop, *first_gop;
255  struct efi_pixel_bitmask pixel_info;
256  unsigned long nr_gops;
258  void **gop_handle;
259  u16 width, height;
260  u32 fb_base, fb_size;
261  u32 pixels_per_scan_line;
262  int pixel_format;
263  int i;
264 
265  status = efi_call_phys3(sys_table->boottime->allocate_pool,
266  EFI_LOADER_DATA, size, &gop_handle);
267  if (status != EFI_SUCCESS)
268  return status;
269 
270  status = efi_call_phys5(sys_table->boottime->locate_handle,
271  EFI_LOCATE_BY_PROTOCOL, proto,
272  NULL, &size, gop_handle);
273  if (status != EFI_SUCCESS)
274  goto free_handle;
275 
276  first_gop = NULL;
277 
278  nr_gops = size / sizeof(void *);
279  for (i = 0; i < nr_gops; i++) {
282  bool conout_found = false;
283  void *dummy;
284  void *h = gop_handle[i];
285 
286  status = efi_call_phys3(sys_table->boottime->handle_protocol,
287  h, proto, &gop);
288  if (status != EFI_SUCCESS)
289  continue;
290 
291  status = efi_call_phys3(sys_table->boottime->handle_protocol,
292  h, &conout_proto, &dummy);
293 
294  if (status == EFI_SUCCESS)
295  conout_found = true;
296 
297  status = efi_call_phys4(gop->query_mode, gop,
298  gop->mode->mode, &size, &info);
299  if (status == EFI_SUCCESS && (!first_gop || conout_found)) {
300  /*
301  * Systems that use the UEFI Console Splitter may
302  * provide multiple GOP devices, not all of which are
303  * backed by real hardware. The workaround is to search
304  * for a GOP implementing the ConOut protocol, and if
305  * one isn't found, to just fall back to the first GOP.
306  */
307  width = info->horizontal_resolution;
308  height = info->vertical_resolution;
309  fb_base = gop->mode->frame_buffer_base;
310  fb_size = gop->mode->frame_buffer_size;
311  pixel_format = info->pixel_format;
312  pixel_info = info->pixel_information;
313  pixels_per_scan_line = info->pixels_per_scan_line;
314 
315  /*
316  * Once we've found a GOP supporting ConOut,
317  * don't bother looking any further.
318  */
319  if (conout_found)
320  break;
321 
322  first_gop = gop;
323  }
324  }
325 
326  /* Did we find any GOPs? */
327  if (!first_gop)
328  goto free_handle;
329 
330  /* EFI framebuffer */
332 
333  si->lfb_width = width;
334  si->lfb_height = height;
335  si->lfb_base = fb_base;
336  si->pages = 1;
337 
338  if (pixel_format == PIXEL_RGB_RESERVED_8BIT_PER_COLOR) {
339  si->lfb_depth = 32;
340  si->lfb_linelength = pixels_per_scan_line * 4;
341  si->red_size = 8;
342  si->red_pos = 0;
343  si->green_size = 8;
344  si->green_pos = 8;
345  si->blue_size = 8;
346  si->blue_pos = 16;
347  si->rsvd_size = 8;
348  si->rsvd_pos = 24;
349  } else if (pixel_format == PIXEL_BGR_RESERVED_8BIT_PER_COLOR) {
350  si->lfb_depth = 32;
351  si->lfb_linelength = pixels_per_scan_line * 4;
352  si->red_size = 8;
353  si->red_pos = 16;
354  si->green_size = 8;
355  si->green_pos = 8;
356  si->blue_size = 8;
357  si->blue_pos = 0;
358  si->rsvd_size = 8;
359  si->rsvd_pos = 24;
360  } else if (pixel_format == PIXEL_BIT_MASK) {
361  find_bits(pixel_info.red_mask, &si->red_pos, &si->red_size);
362  find_bits(pixel_info.green_mask, &si->green_pos,
363  &si->green_size);
364  find_bits(pixel_info.blue_mask, &si->blue_pos, &si->blue_size);
365  find_bits(pixel_info.reserved_mask, &si->rsvd_pos,
366  &si->rsvd_size);
367  si->lfb_depth = si->red_size + si->green_size +
368  si->blue_size + si->rsvd_size;
369  si->lfb_linelength = (pixels_per_scan_line * si->lfb_depth) / 8;
370  } else {
371  si->lfb_depth = 4;
372  si->lfb_linelength = si->lfb_width / 2;
373  si->red_size = 0;
374  si->red_pos = 0;
375  si->green_size = 0;
376  si->green_pos = 0;
377  si->blue_size = 0;
378  si->blue_pos = 0;
379  si->rsvd_size = 0;
380  si->rsvd_pos = 0;
381  }
382 
383  si->lfb_size = si->lfb_linelength * si->lfb_height;
384 
386 
387 free_handle:
388  efi_call_phys1(sys_table->boottime->free_pool, gop_handle);
389  return status;
390 }
391 
392 /*
393  * See if we have Universal Graphics Adapter (UGA) protocol
394  */
395 static efi_status_t setup_uga(struct screen_info *si, efi_guid_t *uga_proto,
396  unsigned long size)
397 {
398  struct efi_uga_draw_protocol *uga, *first_uga;
399  unsigned long nr_ugas;
401  u32 width, height;
402  void **uga_handle = NULL;
403  int i;
404 
405  status = efi_call_phys3(sys_table->boottime->allocate_pool,
406  EFI_LOADER_DATA, size, &uga_handle);
407  if (status != EFI_SUCCESS)
408  return status;
409 
410  status = efi_call_phys5(sys_table->boottime->locate_handle,
411  EFI_LOCATE_BY_PROTOCOL, uga_proto,
412  NULL, &size, uga_handle);
413  if (status != EFI_SUCCESS)
414  goto free_handle;
415 
416  first_uga = NULL;
417 
418  nr_ugas = size / sizeof(void *);
419  for (i = 0; i < nr_ugas; i++) {
420  efi_guid_t pciio_proto = EFI_PCI_IO_PROTOCOL_GUID;
421  void *handle = uga_handle[i];
422  u32 w, h, depth, refresh;
423  void *pciio;
424 
425  status = efi_call_phys3(sys_table->boottime->handle_protocol,
426  handle, uga_proto, &uga);
427  if (status != EFI_SUCCESS)
428  continue;
429 
431  handle, &pciio_proto, &pciio);
432 
433  status = efi_call_phys5(uga->get_mode, uga, &w, &h,
434  &depth, &refresh);
435  if (status == EFI_SUCCESS && (!first_uga || pciio)) {
436  width = w;
437  height = h;
438 
439  /*
440  * Once we've found a UGA supporting PCIIO,
441  * don't bother looking any further.
442  */
443  if (pciio)
444  break;
445 
446  first_uga = uga;
447  }
448  }
449 
450  if (!first_uga)
451  goto free_handle;
452 
453  /* EFI framebuffer */
455 
456  si->lfb_depth = 32;
457  si->lfb_width = width;
458  si->lfb_height = height;
459 
460  si->red_size = 8;
461  si->red_pos = 16;
462  si->green_size = 8;
463  si->green_pos = 8;
464  si->blue_size = 8;
465  si->blue_pos = 0;
466  si->rsvd_size = 8;
467  si->rsvd_pos = 24;
468 
469 
470 free_handle:
471  efi_call_phys1(sys_table->boottime->free_pool, uga_handle);
472  return status;
473 }
474 
476 {
478  struct screen_info *si;
479  efi_guid_t uga_proto = EFI_UGA_PROTOCOL_GUID;
481  unsigned long size;
482  void **gop_handle = NULL;
483  void **uga_handle = NULL;
484 
485  si = &boot_params->screen_info;
486  memset(si, 0, sizeof(*si));
487 
488  size = 0;
489  status = efi_call_phys5(sys_table->boottime->locate_handle,
490  EFI_LOCATE_BY_PROTOCOL, &graphics_proto,
491  NULL, &size, gop_handle);
492  if (status == EFI_BUFFER_TOO_SMALL)
493  status = setup_gop(si, &graphics_proto, size);
494 
495  if (status != EFI_SUCCESS) {
496  size = 0;
497  status = efi_call_phys5(sys_table->boottime->locate_handle,
498  EFI_LOCATE_BY_PROTOCOL, &uga_proto,
499  NULL, &size, uga_handle);
500  if (status == EFI_BUFFER_TOO_SMALL)
501  setup_uga(si, &uga_proto, size);
502  }
503 }
504 
505 struct initrd {
508 };
509 
510 /*
511  * Check the cmdline for a LILO-style initrd= arguments.
512  *
513  * We only support loading an initrd from the same filesystem as the
514  * kernel image.
515  */
516 static efi_status_t handle_ramdisks(efi_loaded_image_t *image,
517  struct setup_header *hdr)
518 {
519  struct initrd *initrds;
520  unsigned long initrd_addr;
521  efi_guid_t fs_proto = EFI_FILE_SYSTEM_GUID;
522  u64 initrd_total;
524  efi_file_handle_t *fh;
526  int nr_initrds;
527  char *str;
528  int i, j, k;
529 
530  initrd_addr = 0;
531  initrd_total = 0;
532 
533  str = (char *)(unsigned long)hdr->cmd_line_ptr;
534 
535  j = 0; /* See close_handles */
536 
537  if (!str || !*str)
538  return EFI_SUCCESS;
539 
540  for (nr_initrds = 0; *str; nr_initrds++) {
541  str = strstr(str, "initrd=");
542  if (!str)
543  break;
544 
545  str += 7;
546 
547  /* Skip any leading slashes */
548  while (*str == '/' || *str == '\\')
549  str++;
550 
551  while (*str && *str != ' ' && *str != '\n')
552  str++;
553  }
554 
555  if (!nr_initrds)
556  return EFI_SUCCESS;
557 
558  status = efi_call_phys3(sys_table->boottime->allocate_pool,
560  nr_initrds * sizeof(*initrds),
561  &initrds);
562  if (status != EFI_SUCCESS) {
563  efi_printk("Failed to alloc mem for initrds\n");
564  goto fail;
565  }
566 
567  str = (char *)(unsigned long)hdr->cmd_line_ptr;
568  for (i = 0; i < nr_initrds; i++) {
569  struct initrd *initrd;
572  efi_char16_t filename_16[256];
573  unsigned long info_sz;
574  efi_guid_t info_guid = EFI_FILE_INFO_ID;
575  efi_char16_t *p;
576  u64 file_sz;
577 
578  str = strstr(str, "initrd=");
579  if (!str)
580  break;
581 
582  str += 7;
583 
584  initrd = &initrds[i];
585  p = filename_16;
586 
587  /* Skip any leading slashes */
588  while (*str == '/' || *str == '\\')
589  str++;
590 
591  while (*str && *str != ' ' && *str != '\n') {
592  if ((u8 *)p >= (u8 *)filename_16 + sizeof(filename_16))
593  break;
594 
595  *p++ = *str++;
596  }
597 
598  *p = '\0';
599 
600  /* Only open the volume once. */
601  if (!i) {
602  efi_boot_services_t *boottime;
603 
604  boottime = sys_table->boottime;
605 
606  status = efi_call_phys3(boottime->handle_protocol,
607  image->device_handle, &fs_proto, &io);
608  if (status != EFI_SUCCESS) {
609  efi_printk("Failed to handle fs_proto\n");
610  goto free_initrds;
611  }
612 
613  status = efi_call_phys2(io->open_volume, io, &fh);
614  if (status != EFI_SUCCESS) {
615  efi_printk("Failed to open volume\n");
616  goto free_initrds;
617  }
618  }
619 
620  status = efi_call_phys5(fh->open, fh, &h, filename_16,
621  EFI_FILE_MODE_READ, (u64)0);
622  if (status != EFI_SUCCESS) {
623  efi_printk("Failed to open initrd file\n");
624  goto close_handles;
625  }
626 
627  initrd->handle = h;
628 
629  info_sz = 0;
630  status = efi_call_phys4(h->get_info, h, &info_guid,
631  &info_sz, NULL);
632  if (status != EFI_BUFFER_TOO_SMALL) {
633  efi_printk("Failed to get initrd info size\n");
634  goto close_handles;
635  }
636 
637 grow:
638  status = efi_call_phys3(sys_table->boottime->allocate_pool,
639  EFI_LOADER_DATA, info_sz, &info);
640  if (status != EFI_SUCCESS) {
641  efi_printk("Failed to alloc mem for initrd info\n");
642  goto close_handles;
643  }
644 
645  status = efi_call_phys4(h->get_info, h, &info_guid,
646  &info_sz, info);
647  if (status == EFI_BUFFER_TOO_SMALL) {
648  efi_call_phys1(sys_table->boottime->free_pool, info);
649  goto grow;
650  }
651 
652  file_sz = info->file_size;
653  efi_call_phys1(sys_table->boottime->free_pool, info);
654 
655  if (status != EFI_SUCCESS) {
656  efi_printk("Failed to get initrd info\n");
657  goto close_handles;
658  }
659 
660  initrd->size = file_sz;
661  initrd_total += file_sz;
662  }
663 
664  if (initrd_total) {
665  unsigned long addr;
666 
667  /*
668  * Multiple initrd's need to be at consecutive
669  * addresses in memory, so allocate enough memory for
670  * all the initrd's.
671  */
672  status = high_alloc(initrd_total, 0x1000,
673  &initrd_addr, hdr->initrd_addr_max);
674  if (status != EFI_SUCCESS) {
675  efi_printk("Failed to alloc highmem for initrds\n");
676  goto close_handles;
677  }
678 
679  /* We've run out of free low memory. */
680  if (initrd_addr > hdr->initrd_addr_max) {
681  efi_printk("We've run out of free low memory\n");
682  status = EFI_INVALID_PARAMETER;
683  goto free_initrd_total;
684  }
685 
686  addr = initrd_addr;
687  for (j = 0; j < nr_initrds; j++) {
688  u64 size;
689 
690  size = initrds[j].size;
691  while (size) {
692  u64 chunksize;
693  if (size > EFI_READ_CHUNK_SIZE)
694  chunksize = EFI_READ_CHUNK_SIZE;
695  else
696  chunksize = size;
697  status = efi_call_phys3(fh->read,
698  initrds[j].handle,
699  &chunksize, addr);
700  if (status != EFI_SUCCESS) {
701  efi_printk("Failed to read initrd\n");
702  goto free_initrd_total;
703  }
704  addr += chunksize;
705  size -= chunksize;
706  }
707 
708  efi_call_phys1(fh->close, initrds[j].handle);
709  }
710 
711  }
712 
713  efi_call_phys1(sys_table->boottime->free_pool, initrds);
714 
715  hdr->ramdisk_image = initrd_addr;
716  hdr->ramdisk_size = initrd_total;
717 
718  return status;
719 
720 free_initrd_total:
721  low_free(initrd_total, initrd_addr);
722 
723 close_handles:
724  for (k = j; k < i; k++)
725  efi_call_phys1(fh->close, initrds[k].handle);
726 free_initrds:
727  efi_call_phys1(sys_table->boottime->free_pool, initrds);
728 fail:
729  hdr->ramdisk_image = 0;
730  hdr->ramdisk_size = 0;
731 
732  return status;
733 }
734 
735 /*
736  * Because the x86 boot code expects to be passed a boot_params we
737  * need to create one ourselves (usually the bootloader would create
738  * one for us).
739  */
740 struct boot_params *make_boot_params(void *handle, efi_system_table_t *_table)
741 {
742  struct boot_params *boot_params;
743  struct sys_desc_table *sdt;
744  struct apm_bios_info *bi;
745  struct setup_header *hdr;
746  struct efi_info *efi;
748  void *options;
749  u32 load_options_size;
751  int options_size = 0;
753  unsigned long cmdline;
754  u16 *s2;
755  u8 *s1;
756  int i;
757 
758  sys_table = _table;
759 
760  /* Check if we were booted by the EFI firmware */
761  if (sys_table->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE)
762  return NULL;
763 
764  status = efi_call_phys3(sys_table->boottime->handle_protocol,
765  handle, &proto, (void *)&image);
766  if (status != EFI_SUCCESS) {
767  efi_printk("Failed to get handle for LOADED_IMAGE_PROTOCOL\n");
768  return NULL;
769  }
770 
771  status = low_alloc(0x4000, 1, (unsigned long *)&boot_params);
772  if (status != EFI_SUCCESS) {
773  efi_printk("Failed to alloc lowmem for boot params\n");
774  return NULL;
775  }
776 
777  memset(boot_params, 0x0, 0x4000);
778 
779  hdr = &boot_params->hdr;
780  efi = &boot_params->efi_info;
781  bi = &boot_params->apm_bios_info;
782  sdt = &boot_params->sys_desc_table;
783 
784  /* Copy the second sector to boot_params */
785  memcpy(&hdr->jump, image->image_base + 512, 512);
786 
787  /*
788  * Fill out some of the header fields ourselves because the
789  * EFI firmware loader doesn't load the first sector.
790  */
791  hdr->root_flags = 1;
792  hdr->vid_mode = 0xffff;
793  hdr->boot_flag = 0xAA55;
794 
795  hdr->code32_start = (__u64)(unsigned long)image->image_base;
796 
797  hdr->type_of_loader = 0x21;
798 
799  /* Convert unicode cmdline to ascii */
800  options = image->load_options;
801  load_options_size = image->load_options_size / 2; /* ASCII */
802  cmdline = 0;
803  s2 = (u16 *)options;
804 
805  if (s2) {
806  while (*s2 && *s2 != '\n' && options_size < load_options_size) {
807  s2++;
808  options_size++;
809  }
810 
811  if (options_size) {
812  if (options_size > hdr->cmdline_size)
813  options_size = hdr->cmdline_size;
814 
815  options_size++; /* NUL termination */
816 
817  status = low_alloc(options_size, 1, &cmdline);
818  if (status != EFI_SUCCESS) {
819  efi_printk("Failed to alloc mem for cmdline\n");
820  goto fail;
821  }
822 
823  s1 = (u8 *)(unsigned long)cmdline;
824  s2 = (u16 *)options;
825 
826  for (i = 0; i < options_size - 1; i++)
827  *s1++ = *s2++;
828 
829  *s1 = '\0';
830  }
831  }
832 
833  hdr->cmd_line_ptr = cmdline;
834 
835  hdr->ramdisk_image = 0;
836  hdr->ramdisk_size = 0;
837 
838  /* Clear APM BIOS info */
839  memset(bi, 0, sizeof(*bi));
840 
841  memset(sdt, 0, sizeof(*sdt));
842 
843  status = handle_ramdisks(image, hdr);
844  if (status != EFI_SUCCESS)
845  goto fail2;
846 
847  return boot_params;
848 fail2:
849  if (options_size)
850  low_free(options_size, hdr->cmd_line_ptr);
851 fail:
852  low_free(0x4000, (unsigned long)boot_params);
853  return NULL;
854 }
855 
856 static efi_status_t exit_boot(struct boot_params *boot_params,
857  void *handle)
858 {
859  struct efi_info *efi = &boot_params->efi_info;
860  struct e820entry *e820_map = &boot_params->e820_map[0];
861  struct e820entry *prev = NULL;
862  unsigned long size, key, desc_size, _size;
865  __u32 desc_version;
866  u8 nr_entries;
867  int i;
868 
869  size = sizeof(*mem_map) * 32;
870 
871 again:
872  size += sizeof(*mem_map);
873  _size = size;
874  status = low_alloc(size, 1, (unsigned long *)&mem_map);
875  if (status != EFI_SUCCESS)
876  return status;
877 
878  status = efi_call_phys5(sys_table->boottime->get_memory_map, &size,
879  mem_map, &key, &desc_size, &desc_version);
880  if (status == EFI_BUFFER_TOO_SMALL) {
881  low_free(_size, (unsigned long)mem_map);
882  goto again;
883  }
884 
885  if (status != EFI_SUCCESS)
886  goto free_mem_map;
887 
889  efi->efi_systab = (unsigned long)sys_table;
890  efi->efi_memdesc_size = desc_size;
891  efi->efi_memdesc_version = desc_version;
892  efi->efi_memmap = (unsigned long)mem_map;
893  efi->efi_memmap_size = size;
894 
895 #ifdef CONFIG_X86_64
896  efi->efi_systab_hi = (unsigned long)sys_table >> 32;
897  efi->efi_memmap_hi = (unsigned long)mem_map >> 32;
898 #endif
899 
900  /* Might as well exit boot services now */
901  status = efi_call_phys2(sys_table->boottime->exit_boot_services,
902  handle, key);
903  if (status != EFI_SUCCESS)
904  goto free_mem_map;
905 
906  /* Historic? */
907  boot_params->alt_mem_k = 32 * 1024;
908 
909  /*
910  * Convert the EFI memory map to E820.
911  */
912  nr_entries = 0;
913  for (i = 0; i < size / desc_size; i++) {
915  unsigned int e820_type = 0;
916  unsigned long m = (unsigned long)mem_map;
917 
918  d = (efi_memory_desc_t *)(m + (i * desc_size));
919  switch (d->type) {
920  case EFI_RESERVED_TYPE:
925  case EFI_PAL_CODE:
926  e820_type = E820_RESERVED;
927  break;
928 
929  case EFI_UNUSABLE_MEMORY:
930  e820_type = E820_UNUSABLE;
931  break;
932 
934  e820_type = E820_ACPI;
935  break;
936 
937  case EFI_LOADER_CODE:
938  case EFI_LOADER_DATA:
942  e820_type = E820_RAM;
943  break;
944 
945  case EFI_ACPI_MEMORY_NVS:
946  e820_type = E820_NVS;
947  break;
948 
949  default:
950  continue;
951  }
952 
953  /* Merge adjacent mappings */
954  if (prev && prev->type == e820_type &&
955  (prev->addr + prev->size) == d->phys_addr)
956  prev->size += d->num_pages << 12;
957  else {
958  e820_map->addr = d->phys_addr;
959  e820_map->size = d->num_pages << 12;
960  e820_map->type = e820_type;
961  prev = e820_map++;
962  nr_entries++;
963  }
964  }
965 
966  boot_params->e820_entries = nr_entries;
967 
968  return EFI_SUCCESS;
969 
970 free_mem_map:
971  low_free(_size, (unsigned long)mem_map);
972  return status;
973 }
974 
975 static efi_status_t relocate_kernel(struct setup_header *hdr)
976 {
977  unsigned long start, nr_pages;
979 
980  /*
981  * The EFI firmware loader could have placed the kernel image
982  * anywhere in memory, but the kernel has various restrictions
983  * on the max physical address it can run at. Attempt to move
984  * the kernel to boot_params.pref_address, or as low as
985  * possible.
986  */
987  start = hdr->pref_address;
988  nr_pages = round_up(hdr->init_size, EFI_PAGE_SIZE) / EFI_PAGE_SIZE;
989 
990  status = efi_call_phys4(sys_table->boottime->allocate_pages,
992  nr_pages, &start);
993  if (status != EFI_SUCCESS) {
994  status = low_alloc(hdr->init_size, hdr->kernel_alignment,
995  &start);
996  if (status != EFI_SUCCESS)
997  efi_printk("Failed to alloc mem for kernel\n");
998  }
999 
1000  if (status == EFI_SUCCESS)
1001  memcpy((void *)start, (void *)(unsigned long)hdr->code32_start,
1002  hdr->init_size);
1003 
1004  hdr->pref_address = hdr->code32_start;
1005  hdr->code32_start = (__u32)start;
1006 
1007  return status;
1008 }
1009 
1010 /*
1011  * On success we return a pointer to a boot_params structure, and NULL
1012  * on failure.
1013  */
1014 struct boot_params *efi_main(void *handle, efi_system_table_t *_table,
1015  struct boot_params *boot_params)
1016 {
1017  struct desc_ptr *gdt, *idt;
1019  struct setup_header *hdr = &boot_params->hdr;
1021  struct desc_struct *desc;
1022 
1023  sys_table = _table;
1024 
1025  /* Check if we were booted by the EFI firmware */
1026  if (sys_table->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE)
1027  goto fail;
1028 
1029  setup_graphics(boot_params);
1030 
1031  status = efi_call_phys3(sys_table->boottime->allocate_pool,
1032  EFI_LOADER_DATA, sizeof(*gdt),
1033  (void **)&gdt);
1034  if (status != EFI_SUCCESS) {
1035  efi_printk("Failed to alloc mem for gdt structure\n");
1036  goto fail;
1037  }
1038 
1039  gdt->size = 0x800;
1040  status = low_alloc(gdt->size, 8, (unsigned long *)&gdt->address);
1041  if (status != EFI_SUCCESS) {
1042  efi_printk("Failed to alloc mem for gdt\n");
1043  goto fail;
1044  }
1045 
1046  status = efi_call_phys3(sys_table->boottime->allocate_pool,
1047  EFI_LOADER_DATA, sizeof(*idt),
1048  (void **)&idt);
1049  if (status != EFI_SUCCESS) {
1050  efi_printk("Failed to alloc mem for idt structure\n");
1051  goto fail;
1052  }
1053 
1054  idt->size = 0;
1055  idt->address = 0;
1056 
1057  /*
1058  * If the kernel isn't already loaded at the preferred load
1059  * address, relocate it.
1060  */
1061  if (hdr->pref_address != hdr->code32_start) {
1062  status = relocate_kernel(hdr);
1063 
1064  if (status != EFI_SUCCESS)
1065  goto fail;
1066  }
1067 
1068  status = exit_boot(boot_params, handle);
1069  if (status != EFI_SUCCESS)
1070  goto fail;
1071 
1072  memset((char *)gdt->address, 0x0, gdt->size);
1073  desc = (struct desc_struct *)gdt->address;
1074 
1075  /* The first GDT is a dummy and the second is unused. */
1076  desc += 2;
1077 
1078  desc->limit0 = 0xffff;
1079  desc->base0 = 0x0000;
1080  desc->base1 = 0x0000;
1082  desc->s = DESC_TYPE_CODE_DATA;
1083  desc->dpl = 0;
1084  desc->p = 1;
1085  desc->limit = 0xf;
1086  desc->avl = 0;
1087  desc->l = 0;
1088  desc->d = SEG_OP_SIZE_32BIT;
1089  desc->g = SEG_GRANULARITY_4KB;
1090  desc->base2 = 0x00;
1091 
1092  desc++;
1093  desc->limit0 = 0xffff;
1094  desc->base0 = 0x0000;
1095  desc->base1 = 0x0000;
1097  desc->s = DESC_TYPE_CODE_DATA;
1098  desc->dpl = 0;
1099  desc->p = 1;
1100  desc->limit = 0xf;
1101  desc->avl = 0;
1102  desc->l = 0;
1103  desc->d = SEG_OP_SIZE_32BIT;
1104  desc->g = SEG_GRANULARITY_4KB;
1105  desc->base2 = 0x00;
1106 
1107 #ifdef CONFIG_X86_64
1108  /* Task segment value */
1109  desc++;
1110  desc->limit0 = 0x0000;
1111  desc->base0 = 0x0000;
1112  desc->base1 = 0x0000;
1113  desc->type = SEG_TYPE_TSS;
1114  desc->s = 0;
1115  desc->dpl = 0;
1116  desc->p = 1;
1117  desc->limit = 0x0;
1118  desc->avl = 0;
1119  desc->l = 0;
1120  desc->d = 0;
1121  desc->g = SEG_GRANULARITY_4KB;
1122  desc->base2 = 0x00;
1123 #endif /* CONFIG_X86_64 */
1124 
1125  asm volatile ("lidt %0" : : "m" (*idt));
1126  asm volatile ("lgdt %0" : : "m" (*gdt));
1127 
1128  asm volatile("cli");
1129 
1130  return boot_params;
1131 fail:
1132  return NULL;
1133 }