1 /* 2 * x86_64 specific EFI support functions 3 * Based on Extensible Firmware Interface Specification version 1.0 4 * 5 * Copyright (C) 2005-2008 Intel Co. 6 * Fenghua Yu <fenghua.yu@intel.com> 7 * Bibo Mao <bibo.mao@intel.com> 8 * Chandramouli Narayanan <mouli@linux.intel.com> 9 * Huang Ying <ying.huang@intel.com> 10 * 11 * Code to convert EFI to E820 map has been implemented in elilo bootloader 12 * based on a EFI patch by Edgar Hucek. Based on the E820 map, the page table 13 * is setup appropriately for EFI runtime code. 14 * - mouli 06/14/2007. 15 * 16 */ 17 18 #define pr_fmt(fmt) "efi: " fmt 19 20 #include <linux/kernel.h> 21 #include <linux/init.h> 22 #include <linux/mm.h> 23 #include <linux/types.h> 24 #include <linux/spinlock.h> 25 #include <linux/bootmem.h> 26 #include <linux/ioport.h> 27 #include <linux/init.h> 28 #include <linux/mc146818rtc.h> 29 #include <linux/efi.h> 30 #include <linux/uaccess.h> 31 #include <linux/io.h> 32 #include <linux/reboot.h> 33 #include <linux/slab.h> 34 35 #include <asm/setup.h> 36 #include <asm/page.h> 37 #include <asm/e820.h> 38 #include <asm/pgtable.h> 39 #include <asm/tlbflush.h> 40 #include <asm/proto.h> 41 #include <asm/efi.h> 42 #include <asm/cacheflush.h> 43 #include <asm/fixmap.h> 44 #include <asm/realmode.h> 45 #include <asm/time.h> 46 #include <asm/pgalloc.h> 47 48 /* 49 * We allocate runtime services regions bottom-up, starting from -4G, i.e. 50 * 0xffff_ffff_0000_0000 and limit EFI VA mapping space to 64G. 51 */ 52 static u64 efi_va = EFI_VA_START; 53 54 struct efi_scratch efi_scratch; 55 56 static void __init early_code_mapping_set_exec(int executable) 57 { 58 efi_memory_desc_t *md; 59 60 if (!(__supported_pte_mask & _PAGE_NX)) 61 return; 62 63 /* Make EFI service code area executable */ 64 for_each_efi_memory_desc(md) { 65 if (md->type == EFI_RUNTIME_SERVICES_CODE || 66 md->type == EFI_BOOT_SERVICES_CODE) 67 efi_set_executable(md, executable); 68 } 69 } 70 71 pgd_t * __init efi_call_phys_prolog(void) 72 { 73 unsigned long vaddress; 74 pgd_t *save_pgd; 75 76 int pgd; 77 int n_pgds; 78 79 if (!efi_enabled(EFI_OLD_MEMMAP)) { 80 save_pgd = (pgd_t *)read_cr3(); 81 write_cr3((unsigned long)efi_scratch.efi_pgt); 82 goto out; 83 } 84 85 early_code_mapping_set_exec(1); 86 87 n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT), PGDIR_SIZE); 88 save_pgd = kmalloc(n_pgds * sizeof(pgd_t), GFP_KERNEL); 89 90 for (pgd = 0; pgd < n_pgds; pgd++) { 91 save_pgd[pgd] = *pgd_offset_k(pgd * PGDIR_SIZE); 92 vaddress = (unsigned long)__va(pgd * PGDIR_SIZE); 93 set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), *pgd_offset_k(vaddress)); 94 } 95 out: 96 __flush_tlb_all(); 97 98 return save_pgd; 99 } 100 101 void __init efi_call_phys_epilog(pgd_t *save_pgd) 102 { 103 /* 104 * After the lock is released, the original page table is restored. 105 */ 106 int pgd_idx; 107 int nr_pgds; 108 109 if (!efi_enabled(EFI_OLD_MEMMAP)) { 110 write_cr3((unsigned long)save_pgd); 111 __flush_tlb_all(); 112 return; 113 } 114 115 nr_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT) , PGDIR_SIZE); 116 117 for (pgd_idx = 0; pgd_idx < nr_pgds; pgd_idx++) 118 set_pgd(pgd_offset_k(pgd_idx * PGDIR_SIZE), save_pgd[pgd_idx]); 119 120 kfree(save_pgd); 121 122 __flush_tlb_all(); 123 early_code_mapping_set_exec(0); 124 } 125 126 static pgd_t *efi_pgd; 127 128 /* 129 * We need our own copy of the higher levels of the page tables 130 * because we want to avoid inserting EFI region mappings (EFI_VA_END 131 * to EFI_VA_START) into the standard kernel page tables. Everything 132 * else can be shared, see efi_sync_low_kernel_mappings(). 133 */ 134 int __init efi_alloc_page_tables(void) 135 { 136 pgd_t *pgd; 137 pud_t *pud; 138 gfp_t gfp_mask; 139 140 if (efi_enabled(EFI_OLD_MEMMAP)) 141 return 0; 142 143 gfp_mask = GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO; 144 efi_pgd = (pgd_t *)__get_free_page(gfp_mask); 145 if (!efi_pgd) 146 return -ENOMEM; 147 148 pgd = efi_pgd + pgd_index(EFI_VA_END); 149 150 pud = pud_alloc_one(NULL, 0); 151 if (!pud) { 152 free_page((unsigned long)efi_pgd); 153 return -ENOMEM; 154 } 155 156 pgd_populate(NULL, pgd, pud); 157 158 return 0; 159 } 160 161 /* 162 * Add low kernel mappings for passing arguments to EFI functions. 163 */ 164 void efi_sync_low_kernel_mappings(void) 165 { 166 unsigned num_entries; 167 pgd_t *pgd_k, *pgd_efi; 168 pud_t *pud_k, *pud_efi; 169 170 if (efi_enabled(EFI_OLD_MEMMAP)) 171 return; 172 173 /* 174 * We can share all PGD entries apart from the one entry that 175 * covers the EFI runtime mapping space. 176 * 177 * Make sure the EFI runtime region mappings are guaranteed to 178 * only span a single PGD entry and that the entry also maps 179 * other important kernel regions. 180 */ 181 BUILD_BUG_ON(pgd_index(EFI_VA_END) != pgd_index(MODULES_END)); 182 BUILD_BUG_ON((EFI_VA_START & PGDIR_MASK) != 183 (EFI_VA_END & PGDIR_MASK)); 184 185 pgd_efi = efi_pgd + pgd_index(PAGE_OFFSET); 186 pgd_k = pgd_offset_k(PAGE_OFFSET); 187 188 num_entries = pgd_index(EFI_VA_END) - pgd_index(PAGE_OFFSET); 189 memcpy(pgd_efi, pgd_k, sizeof(pgd_t) * num_entries); 190 191 /* 192 * We share all the PUD entries apart from those that map the 193 * EFI regions. Copy around them. 194 */ 195 BUILD_BUG_ON((EFI_VA_START & ~PUD_MASK) != 0); 196 BUILD_BUG_ON((EFI_VA_END & ~PUD_MASK) != 0); 197 198 pgd_efi = efi_pgd + pgd_index(EFI_VA_END); 199 pud_efi = pud_offset(pgd_efi, 0); 200 201 pgd_k = pgd_offset_k(EFI_VA_END); 202 pud_k = pud_offset(pgd_k, 0); 203 204 num_entries = pud_index(EFI_VA_END); 205 memcpy(pud_efi, pud_k, sizeof(pud_t) * num_entries); 206 207 pud_efi = pud_offset(pgd_efi, EFI_VA_START); 208 pud_k = pud_offset(pgd_k, EFI_VA_START); 209 210 num_entries = PTRS_PER_PUD - pud_index(EFI_VA_START); 211 memcpy(pud_efi, pud_k, sizeof(pud_t) * num_entries); 212 } 213 214 int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages) 215 { 216 unsigned long pfn, text; 217 efi_memory_desc_t *md; 218 struct page *page; 219 unsigned npages; 220 pgd_t *pgd; 221 222 if (efi_enabled(EFI_OLD_MEMMAP)) 223 return 0; 224 225 efi_scratch.efi_pgt = (pgd_t *)__pa(efi_pgd); 226 pgd = efi_pgd; 227 228 /* 229 * It can happen that the physical address of new_memmap lands in memory 230 * which is not mapped in the EFI page table. Therefore we need to go 231 * and ident-map those pages containing the map before calling 232 * phys_efi_set_virtual_address_map(). 233 */ 234 pfn = pa_memmap >> PAGE_SHIFT; 235 if (kernel_map_pages_in_pgd(pgd, pfn, pa_memmap, num_pages, _PAGE_NX | _PAGE_RW)) { 236 pr_err("Error ident-mapping new memmap (0x%lx)!\n", pa_memmap); 237 return 1; 238 } 239 240 efi_scratch.use_pgd = true; 241 242 /* 243 * When making calls to the firmware everything needs to be 1:1 244 * mapped and addressable with 32-bit pointers. Map the kernel 245 * text and allocate a new stack because we can't rely on the 246 * stack pointer being < 4GB. 247 */ 248 if (!IS_ENABLED(CONFIG_EFI_MIXED) || efi_is_native()) 249 return 0; 250 251 /* 252 * Map all of RAM so that we can access arguments in the 1:1 253 * mapping when making EFI runtime calls. 254 */ 255 for_each_efi_memory_desc(md) { 256 if (md->type != EFI_CONVENTIONAL_MEMORY && 257 md->type != EFI_LOADER_DATA && 258 md->type != EFI_LOADER_CODE) 259 continue; 260 261 pfn = md->phys_addr >> PAGE_SHIFT; 262 npages = md->num_pages; 263 264 if (kernel_map_pages_in_pgd(pgd, pfn, md->phys_addr, npages, _PAGE_RW)) { 265 pr_err("Failed to map 1:1 memory\n"); 266 return 1; 267 } 268 } 269 270 page = alloc_page(GFP_KERNEL|__GFP_DMA32); 271 if (!page) 272 panic("Unable to allocate EFI runtime stack < 4GB\n"); 273 274 efi_scratch.phys_stack = virt_to_phys(page_address(page)); 275 efi_scratch.phys_stack += PAGE_SIZE; /* stack grows down */ 276 277 npages = (_etext - _text) >> PAGE_SHIFT; 278 text = __pa(_text); 279 pfn = text >> PAGE_SHIFT; 280 281 if (kernel_map_pages_in_pgd(pgd, pfn, text, npages, _PAGE_RW)) { 282 pr_err("Failed to map kernel text 1:1\n"); 283 return 1; 284 } 285 286 return 0; 287 } 288 289 static void __init __map_region(efi_memory_desc_t *md, u64 va) 290 { 291 unsigned long flags = _PAGE_RW; 292 unsigned long pfn; 293 pgd_t *pgd = efi_pgd; 294 295 if (!(md->attribute & EFI_MEMORY_WB)) 296 flags |= _PAGE_PCD; 297 298 pfn = md->phys_addr >> PAGE_SHIFT; 299 if (kernel_map_pages_in_pgd(pgd, pfn, va, md->num_pages, flags)) 300 pr_warn("Error mapping PA 0x%llx -> VA 0x%llx!\n", 301 md->phys_addr, va); 302 } 303 304 void __init efi_map_region(efi_memory_desc_t *md) 305 { 306 unsigned long size = md->num_pages << PAGE_SHIFT; 307 u64 pa = md->phys_addr; 308 309 if (efi_enabled(EFI_OLD_MEMMAP)) 310 return old_map_region(md); 311 312 /* 313 * Make sure the 1:1 mappings are present as a catch-all for b0rked 314 * firmware which doesn't update all internal pointers after switching 315 * to virtual mode and would otherwise crap on us. 316 */ 317 __map_region(md, md->phys_addr); 318 319 /* 320 * Enforce the 1:1 mapping as the default virtual address when 321 * booting in EFI mixed mode, because even though we may be 322 * running a 64-bit kernel, the firmware may only be 32-bit. 323 */ 324 if (!efi_is_native () && IS_ENABLED(CONFIG_EFI_MIXED)) { 325 md->virt_addr = md->phys_addr; 326 return; 327 } 328 329 efi_va -= size; 330 331 /* Is PA 2M-aligned? */ 332 if (!(pa & (PMD_SIZE - 1))) { 333 efi_va &= PMD_MASK; 334 } else { 335 u64 pa_offset = pa & (PMD_SIZE - 1); 336 u64 prev_va = efi_va; 337 338 /* get us the same offset within this 2M page */ 339 efi_va = (efi_va & PMD_MASK) + pa_offset; 340 341 if (efi_va > prev_va) 342 efi_va -= PMD_SIZE; 343 } 344 345 if (efi_va < EFI_VA_END) { 346 pr_warn(FW_WARN "VA address range overflow!\n"); 347 return; 348 } 349 350 /* Do the VA map */ 351 __map_region(md, efi_va); 352 md->virt_addr = efi_va; 353 } 354 355 /* 356 * kexec kernel will use efi_map_region_fixed to map efi runtime memory ranges. 357 * md->virt_addr is the original virtual address which had been mapped in kexec 358 * 1st kernel. 359 */ 360 void __init efi_map_region_fixed(efi_memory_desc_t *md) 361 { 362 __map_region(md, md->virt_addr); 363 } 364 365 void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size, 366 u32 type, u64 attribute) 367 { 368 unsigned long last_map_pfn; 369 370 if (type == EFI_MEMORY_MAPPED_IO) 371 return ioremap(phys_addr, size); 372 373 last_map_pfn = init_memory_mapping(phys_addr, phys_addr + size); 374 if ((last_map_pfn << PAGE_SHIFT) < phys_addr + size) { 375 unsigned long top = last_map_pfn << PAGE_SHIFT; 376 efi_ioremap(top, size - (top - phys_addr), type, attribute); 377 } 378 379 if (!(attribute & EFI_MEMORY_WB)) 380 efi_memory_uc((u64)(unsigned long)__va(phys_addr), size); 381 382 return (void __iomem *)__va(phys_addr); 383 } 384 385 void __init parse_efi_setup(u64 phys_addr, u32 data_len) 386 { 387 efi_setup = phys_addr + sizeof(struct setup_data); 388 } 389 390 void __init efi_runtime_update_mappings(void) 391 { 392 unsigned long pfn; 393 pgd_t *pgd = efi_pgd; 394 efi_memory_desc_t *md; 395 396 if (efi_enabled(EFI_OLD_MEMMAP)) { 397 if (__supported_pte_mask & _PAGE_NX) 398 runtime_code_page_mkexec(); 399 return; 400 } 401 402 if (!efi_enabled(EFI_NX_PE_DATA)) 403 return; 404 405 for_each_efi_memory_desc(md) { 406 unsigned long pf = 0; 407 408 if (!(md->attribute & EFI_MEMORY_RUNTIME)) 409 continue; 410 411 if (!(md->attribute & EFI_MEMORY_WB)) 412 pf |= _PAGE_PCD; 413 414 if ((md->attribute & EFI_MEMORY_XP) || 415 (md->type == EFI_RUNTIME_SERVICES_DATA)) 416 pf |= _PAGE_NX; 417 418 if (!(md->attribute & EFI_MEMORY_RO) && 419 (md->type != EFI_RUNTIME_SERVICES_CODE)) 420 pf |= _PAGE_RW; 421 422 /* Update the 1:1 mapping */ 423 pfn = md->phys_addr >> PAGE_SHIFT; 424 if (kernel_map_pages_in_pgd(pgd, pfn, md->phys_addr, md->num_pages, pf)) 425 pr_warn("Error mapping PA 0x%llx -> VA 0x%llx!\n", 426 md->phys_addr, md->virt_addr); 427 428 if (kernel_map_pages_in_pgd(pgd, pfn, md->virt_addr, md->num_pages, pf)) 429 pr_warn("Error mapping PA 0x%llx -> VA 0x%llx!\n", 430 md->phys_addr, md->virt_addr); 431 } 432 } 433 434 void __init efi_dump_pagetable(void) 435 { 436 #ifdef CONFIG_EFI_PGT_DUMP 437 ptdump_walk_pgd_level(NULL, efi_pgd); 438 #endif 439 } 440 441 #ifdef CONFIG_EFI_MIXED 442 extern efi_status_t efi64_thunk(u32, ...); 443 444 #define runtime_service32(func) \ 445 ({ \ 446 u32 table = (u32)(unsigned long)efi.systab; \ 447 u32 *rt, *___f; \ 448 \ 449 rt = (u32 *)(table + offsetof(efi_system_table_32_t, runtime)); \ 450 ___f = (u32 *)(*rt + offsetof(efi_runtime_services_32_t, func)); \ 451 *___f; \ 452 }) 453 454 /* 455 * Switch to the EFI page tables early so that we can access the 1:1 456 * runtime services mappings which are not mapped in any other page 457 * tables. This function must be called before runtime_service32(). 458 * 459 * Also, disable interrupts because the IDT points to 64-bit handlers, 460 * which aren't going to function correctly when we switch to 32-bit. 461 */ 462 #define efi_thunk(f, ...) \ 463 ({ \ 464 efi_status_t __s; \ 465 unsigned long __flags; \ 466 u32 __func; \ 467 \ 468 local_irq_save(__flags); \ 469 arch_efi_call_virt_setup(); \ 470 \ 471 __func = runtime_service32(f); \ 472 __s = efi64_thunk(__func, __VA_ARGS__); \ 473 \ 474 arch_efi_call_virt_teardown(); \ 475 local_irq_restore(__flags); \ 476 \ 477 __s; \ 478 }) 479 480 efi_status_t efi_thunk_set_virtual_address_map( 481 void *phys_set_virtual_address_map, 482 unsigned long memory_map_size, 483 unsigned long descriptor_size, 484 u32 descriptor_version, 485 efi_memory_desc_t *virtual_map) 486 { 487 efi_status_t status; 488 unsigned long flags; 489 u32 func; 490 491 efi_sync_low_kernel_mappings(); 492 local_irq_save(flags); 493 494 efi_scratch.prev_cr3 = read_cr3(); 495 write_cr3((unsigned long)efi_scratch.efi_pgt); 496 __flush_tlb_all(); 497 498 func = (u32)(unsigned long)phys_set_virtual_address_map; 499 status = efi64_thunk(func, memory_map_size, descriptor_size, 500 descriptor_version, virtual_map); 501 502 write_cr3(efi_scratch.prev_cr3); 503 __flush_tlb_all(); 504 local_irq_restore(flags); 505 506 return status; 507 } 508 509 static efi_status_t efi_thunk_get_time(efi_time_t *tm, efi_time_cap_t *tc) 510 { 511 efi_status_t status; 512 u32 phys_tm, phys_tc; 513 514 spin_lock(&rtc_lock); 515 516 phys_tm = virt_to_phys(tm); 517 phys_tc = virt_to_phys(tc); 518 519 status = efi_thunk(get_time, phys_tm, phys_tc); 520 521 spin_unlock(&rtc_lock); 522 523 return status; 524 } 525 526 static efi_status_t efi_thunk_set_time(efi_time_t *tm) 527 { 528 efi_status_t status; 529 u32 phys_tm; 530 531 spin_lock(&rtc_lock); 532 533 phys_tm = virt_to_phys(tm); 534 535 status = efi_thunk(set_time, phys_tm); 536 537 spin_unlock(&rtc_lock); 538 539 return status; 540 } 541 542 static efi_status_t 543 efi_thunk_get_wakeup_time(efi_bool_t *enabled, efi_bool_t *pending, 544 efi_time_t *tm) 545 { 546 efi_status_t status; 547 u32 phys_enabled, phys_pending, phys_tm; 548 549 spin_lock(&rtc_lock); 550 551 phys_enabled = virt_to_phys(enabled); 552 phys_pending = virt_to_phys(pending); 553 phys_tm = virt_to_phys(tm); 554 555 status = efi_thunk(get_wakeup_time, phys_enabled, 556 phys_pending, phys_tm); 557 558 spin_unlock(&rtc_lock); 559 560 return status; 561 } 562 563 static efi_status_t 564 efi_thunk_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm) 565 { 566 efi_status_t status; 567 u32 phys_tm; 568 569 spin_lock(&rtc_lock); 570 571 phys_tm = virt_to_phys(tm); 572 573 status = efi_thunk(set_wakeup_time, enabled, phys_tm); 574 575 spin_unlock(&rtc_lock); 576 577 return status; 578 } 579 580 581 static efi_status_t 582 efi_thunk_get_variable(efi_char16_t *name, efi_guid_t *vendor, 583 u32 *attr, unsigned long *data_size, void *data) 584 { 585 efi_status_t status; 586 u32 phys_name, phys_vendor, phys_attr; 587 u32 phys_data_size, phys_data; 588 589 phys_data_size = virt_to_phys(data_size); 590 phys_vendor = virt_to_phys(vendor); 591 phys_name = virt_to_phys(name); 592 phys_attr = virt_to_phys(attr); 593 phys_data = virt_to_phys(data); 594 595 status = efi_thunk(get_variable, phys_name, phys_vendor, 596 phys_attr, phys_data_size, phys_data); 597 598 return status; 599 } 600 601 static efi_status_t 602 efi_thunk_set_variable(efi_char16_t *name, efi_guid_t *vendor, 603 u32 attr, unsigned long data_size, void *data) 604 { 605 u32 phys_name, phys_vendor, phys_data; 606 efi_status_t status; 607 608 phys_name = virt_to_phys(name); 609 phys_vendor = virt_to_phys(vendor); 610 phys_data = virt_to_phys(data); 611 612 /* If data_size is > sizeof(u32) we've got problems */ 613 status = efi_thunk(set_variable, phys_name, phys_vendor, 614 attr, data_size, phys_data); 615 616 return status; 617 } 618 619 static efi_status_t 620 efi_thunk_get_next_variable(unsigned long *name_size, 621 efi_char16_t *name, 622 efi_guid_t *vendor) 623 { 624 efi_status_t status; 625 u32 phys_name_size, phys_name, phys_vendor; 626 627 phys_name_size = virt_to_phys(name_size); 628 phys_vendor = virt_to_phys(vendor); 629 phys_name = virt_to_phys(name); 630 631 status = efi_thunk(get_next_variable, phys_name_size, 632 phys_name, phys_vendor); 633 634 return status; 635 } 636 637 static efi_status_t 638 efi_thunk_get_next_high_mono_count(u32 *count) 639 { 640 efi_status_t status; 641 u32 phys_count; 642 643 phys_count = virt_to_phys(count); 644 status = efi_thunk(get_next_high_mono_count, phys_count); 645 646 return status; 647 } 648 649 static void 650 efi_thunk_reset_system(int reset_type, efi_status_t status, 651 unsigned long data_size, efi_char16_t *data) 652 { 653 u32 phys_data; 654 655 phys_data = virt_to_phys(data); 656 657 efi_thunk(reset_system, reset_type, status, data_size, phys_data); 658 } 659 660 static efi_status_t 661 efi_thunk_update_capsule(efi_capsule_header_t **capsules, 662 unsigned long count, unsigned long sg_list) 663 { 664 /* 665 * To properly support this function we would need to repackage 666 * 'capsules' because the firmware doesn't understand 64-bit 667 * pointers. 668 */ 669 return EFI_UNSUPPORTED; 670 } 671 672 static efi_status_t 673 efi_thunk_query_variable_info(u32 attr, u64 *storage_space, 674 u64 *remaining_space, 675 u64 *max_variable_size) 676 { 677 efi_status_t status; 678 u32 phys_storage, phys_remaining, phys_max; 679 680 if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION) 681 return EFI_UNSUPPORTED; 682 683 phys_storage = virt_to_phys(storage_space); 684 phys_remaining = virt_to_phys(remaining_space); 685 phys_max = virt_to_phys(max_variable_size); 686 687 status = efi_thunk(query_variable_info, attr, phys_storage, 688 phys_remaining, phys_max); 689 690 return status; 691 } 692 693 static efi_status_t 694 efi_thunk_query_capsule_caps(efi_capsule_header_t **capsules, 695 unsigned long count, u64 *max_size, 696 int *reset_type) 697 { 698 /* 699 * To properly support this function we would need to repackage 700 * 'capsules' because the firmware doesn't understand 64-bit 701 * pointers. 702 */ 703 return EFI_UNSUPPORTED; 704 } 705 706 void efi_thunk_runtime_setup(void) 707 { 708 efi.get_time = efi_thunk_get_time; 709 efi.set_time = efi_thunk_set_time; 710 efi.get_wakeup_time = efi_thunk_get_wakeup_time; 711 efi.set_wakeup_time = efi_thunk_set_wakeup_time; 712 efi.get_variable = efi_thunk_get_variable; 713 efi.get_next_variable = efi_thunk_get_next_variable; 714 efi.set_variable = efi_thunk_set_variable; 715 efi.get_next_high_mono_count = efi_thunk_get_next_high_mono_count; 716 efi.reset_system = efi_thunk_reset_system; 717 efi.query_variable_info = efi_thunk_query_variable_info; 718 efi.update_capsule = efi_thunk_update_capsule; 719 efi.query_capsule_caps = efi_thunk_query_capsule_caps; 720 } 721 #endif /* CONFIG_EFI_MIXED */ 722