linux/arch/x86/platform/efi/efi_32.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Extensible Firmware Interface
   4 *
   5 * Based on Extensible Firmware Interface Specification version 1.0
   6 *
   7 * Copyright (C) 1999 VA Linux Systems
   8 * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
   9 * Copyright (C) 1999-2002 Hewlett-Packard Co.
  10 *      David Mosberger-Tang <davidm@hpl.hp.com>
  11 *      Stephane Eranian <eranian@hpl.hp.com>
  12 *
  13 * All EFI Runtime Services are not implemented yet as EFI only
  14 * supports physical mode addressing on SoftSDV. This is to be fixed
  15 * in a future version.  --drummond 1999-07-20
  16 *
  17 * Implemented EFI runtime services and virtual mode calls.  --davidm
  18 *
  19 * Goutham Rao: <goutham.rao@intel.com>
  20 *      Skip non-WB memory and ignore empty memory ranges.
  21 */
  22
  23#include <linux/kernel.h>
  24#include <linux/types.h>
  25#include <linux/ioport.h>
  26#include <linux/efi.h>
  27
  28#include <asm/io.h>
  29#include <asm/desc.h>
  30#include <asm/page.h>
  31#include <asm/pgtable.h>
  32#include <asm/tlbflush.h>
  33#include <asm/efi.h>
  34
  35/*
  36 * To make EFI call EFI runtime service in physical addressing mode we need
  37 * prolog/epilog before/after the invocation to claim the EFI runtime service
  38 * handler exclusively and to duplicate a memory mapping in low memory space,
  39 * say 0 - 3G.
  40 */
  41
  42int __init efi_alloc_page_tables(void)
  43{
  44        return 0;
  45}
  46
  47void efi_sync_low_kernel_mappings(void) {}
  48
  49void __init efi_dump_pagetable(void)
  50{
  51#ifdef CONFIG_EFI_PGT_DUMP
  52        ptdump_walk_pgd_level(NULL, swapper_pg_dir);
  53#endif
  54}
  55
  56int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages)
  57{
  58        return 0;
  59}
  60
  61void __init efi_map_region(efi_memory_desc_t *md)
  62{
  63        old_map_region(md);
  64}
  65
  66void __init efi_map_region_fixed(efi_memory_desc_t *md) {}
  67void __init parse_efi_setup(u64 phys_addr, u32 data_len) {}
  68
  69pgd_t * __init efi_call_phys_prolog(void)
  70{
  71        struct desc_ptr gdt_descr;
  72        pgd_t *save_pgd;
  73
  74        /* Current pgd is swapper_pg_dir, we'll restore it later: */
  75        save_pgd = swapper_pg_dir;
  76        load_cr3(initial_page_table);
  77        __flush_tlb_all();
  78
  79        gdt_descr.address = get_cpu_gdt_paddr(0);
  80        gdt_descr.size = GDT_SIZE - 1;
  81        load_gdt(&gdt_descr);
  82
  83        return save_pgd;
  84}
  85
  86void __init efi_call_phys_epilog(pgd_t *save_pgd)
  87{
  88        load_fixmap_gdt(0);
  89        load_cr3(save_pgd);
  90        __flush_tlb_all();
  91}
  92
  93void __init efi_runtime_update_mappings(void)
  94{
  95        if (__supported_pte_mask & _PAGE_NX)
  96                runtime_code_page_mkexec();
  97}
  98