| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Extensible Firmware Interface | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Based on Extensible Firmware Interface Specification version 1.0 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 1999 VA Linux Systems | 
					
						
							|  |  |  |  * Copyright (C) 1999 Walt Drummond <drummond@valinux.com> | 
					
						
							|  |  |  |  * Copyright (C) 1999-2002 Hewlett-Packard Co. | 
					
						
							|  |  |  |  *	David Mosberger-Tang <davidm@hpl.hp.com> | 
					
						
							|  |  |  |  *	Stephane Eranian <eranian@hpl.hp.com> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * All EFI Runtime Services are not implemented yet as EFI only | 
					
						
							|  |  |  |  * supports physical mode addressing on SoftSDV. This is to be fixed | 
					
						
							|  |  |  |  * in a future version.  --drummond 1999-07-20 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Implemented EFI runtime services and virtual mode calls.  --davidm | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Goutham Rao: <goutham.rao@intel.com> | 
					
						
							|  |  |  |  *	Skip non-WB memory and ignore empty memory ranges. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/kernel.h>
 | 
					
						
							|  |  |  | #include <linux/types.h>
 | 
					
						
							|  |  |  | #include <linux/ioport.h>
 | 
					
						
							|  |  |  | #include <linux/efi.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <asm/io.h>
 | 
					
						
							| 
									
										
										
										
											2011-05-27 14:46:07 -04:00
										 |  |  | #include <asm/desc.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #include <asm/page.h>
 | 
					
						
							|  |  |  | #include <asm/pgtable.h>
 | 
					
						
							|  |  |  | #include <asm/tlbflush.h>
 | 
					
						
							| 
									
										
										
										
											2008-02-13 13:26:39 -08:00
										 |  |  | #include <asm/efi.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * To make EFI call EFI runtime service in physical addressing mode we need | 
					
						
							|  |  |  |  * prelog/epilog before/after the invocation to disable interrupt, to | 
					
						
							|  |  |  |  * claim EFI runtime service handler exclusively and to duplicate a memory in | 
					
						
							|  |  |  |  * low memory space say 0 - 3G. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static unsigned long efi_rt_eflags; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-31 17:25:08 +01:00
										 |  |  | void efi_sync_low_kernel_mappings(void) {} | 
					
						
							| 
									
										
										
										
											2014-01-18 12:48:15 +01:00
										 |  |  | void __init efi_dump_pagetable(void) {} | 
					
						
							| 
									
										
										
										
											2014-01-18 12:48:17 +01:00
										 |  |  | int efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | void efi_cleanup_page_tables(unsigned long pa_memmap, unsigned num_pages) {} | 
					
						
							| 
									
										
										
										
											2013-10-31 17:25:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | void __init efi_map_region(efi_memory_desc_t *md) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	old_map_region(md); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-20 18:02:14 +08:00
										 |  |  | void __init efi_map_region_fixed(efi_memory_desc_t *md) {} | 
					
						
							| 
									
										
										
										
											2013-12-20 18:02:19 +08:00
										 |  |  | void __init parse_efi_setup(u64 phys_addr, u32 data_len) {} | 
					
						
							| 
									
										
										
										
											2013-12-20 18:02:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-30 13:32:11 +01:00
										 |  |  | void efi_call_phys_prelog(void) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-01-30 13:31:12 +01:00
										 |  |  | 	struct desc_ptr gdt_descr; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	local_irq_save(efi_rt_eflags); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-08 12:10:50 +00:00
										 |  |  | 	load_cr3(initial_page_table); | 
					
						
							| 
									
										
										
										
											2008-01-30 13:32:11 +01:00
										 |  |  | 	__flush_tlb_all(); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-02 19:27:11 +02:00
										 |  |  | 	gdt_descr.address = __pa(get_cpu_gdt_table(0)); | 
					
						
							|  |  |  | 	gdt_descr.size = GDT_SIZE - 1; | 
					
						
							|  |  |  | 	load_gdt(&gdt_descr); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-30 13:32:11 +01:00
										 |  |  | void efi_call_phys_epilog(void) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-01-30 13:31:12 +01:00
										 |  |  | 	struct desc_ptr gdt_descr; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-02 19:27:11 +02:00
										 |  |  | 	gdt_descr.address = (unsigned long)get_cpu_gdt_table(0); | 
					
						
							|  |  |  | 	gdt_descr.size = GDT_SIZE - 1; | 
					
						
							|  |  |  | 	load_gdt(&gdt_descr); | 
					
						
							| 
									
										
										
										
											2006-02-24 13:04:14 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-08 12:10:50 +00:00
										 |  |  | 	load_cr3(swapper_pg_dir); | 
					
						
							| 
									
										
										
										
											2008-01-30 13:32:11 +01:00
										 |  |  | 	__flush_tlb_all(); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	local_irq_restore(efi_rt_eflags); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-14 08:24:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | void __init efi_runtime_mkexec(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (__supported_pte_mask & _PAGE_NX) | 
					
						
							|  |  |  | 		runtime_code_page_mkexec(); | 
					
						
							|  |  |  | } |