| 
									
										
										
										
											2012-02-09 08:47:17 -08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2012 Linaro Limited. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation; either version 2 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License along | 
					
						
							|  |  |  |  * with this program; if not, write to the Free Software Foundation, Inc., | 
					
						
							|  |  |  |  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef VIRT_H
 | 
					
						
							|  |  |  | #define VIRT_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <asm/ptrace.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Flag indicating that the kernel was not entered in the same mode on every | 
					
						
							|  |  |  |  * CPU.  The zImage loader stashes this value in an SPSR, so we need an | 
					
						
							| 
									
										
										
										
											2012-12-02 17:44:36 +00:00
										 |  |  |  * architecturally defined flag bit here. | 
					
						
							| 
									
										
										
										
											2012-02-09 08:47:17 -08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2012-12-02 17:44:36 +00:00
										 |  |  | #define BOOT_CPU_MODE_MISMATCH	PSR_N_BIT
 | 
					
						
							| 
									
										
										
										
											2012-02-09 08:47:17 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifndef __ASSEMBLY__
 | 
					
						
							| 
									
										
										
										
											2013-07-18 17:20:33 +01:00
										 |  |  | #include <asm/cacheflush.h>
 | 
					
						
							| 
									
										
										
										
											2012-02-09 08:47:17 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_ARM_VIRT_EXT
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * __boot_cpu_mode records what mode the primary CPU was booted in. | 
					
						
							|  |  |  |  * A correctly-implemented bootloader must start all CPUs in the same mode: | 
					
						
							|  |  |  |  * if it fails to do this, the flag BOOT_CPU_MODE_MISMATCH is set to indicate | 
					
						
							|  |  |  |  * that some CPU(s) were booted in a different mode. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This allows the kernel to flag an error when the secondaries have come up. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | extern int __boot_cpu_mode; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-18 17:20:33 +01:00
										 |  |  | static inline void sync_boot_mode(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * As secondaries write to __boot_cpu_mode with caches disabled, we | 
					
						
							|  |  |  | 	 * must flush the corresponding cache entries to ensure the visibility | 
					
						
							|  |  |  | 	 * of their writes. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	sync_cache_r(&__boot_cpu_mode); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-09 08:47:17 -08:00
										 |  |  | void __hyp_set_vectors(unsigned long phys_vector_base); | 
					
						
							|  |  |  | unsigned long __hyp_get_vectors(void); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define __boot_cpu_mode	(SVC_MODE)
 | 
					
						
							| 
									
										
										
										
											2013-07-18 17:20:33 +01:00
										 |  |  | #define sync_boot_mode()
 | 
					
						
							| 
									
										
										
										
											2012-02-09 08:47:17 -08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-17 16:54:28 +00:00
										 |  |  | #ifndef ZIMAGE
 | 
					
						
							|  |  |  | void hyp_mode_check(void); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Reports the availability of HYP mode */ | 
					
						
							|  |  |  | static inline bool is_hyp_mode_available(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return ((__boot_cpu_mode & MODE_MASK) == HYP_MODE && | 
					
						
							|  |  |  | 		!(__boot_cpu_mode & BOOT_CPU_MODE_MISMATCH)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Check if the bootloader has booted CPUs in different modes */ | 
					
						
							|  |  |  | static inline bool is_hyp_mode_mismatched(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return !!(__boot_cpu_mode & BOOT_CPU_MODE_MISMATCH); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-09 08:47:17 -08:00
										 |  |  | #endif /* __ASSEMBLY__ */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* ! VIRT_H */
 |