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 ) ;
2017-04-03 19:37:53 +01:00
void __hyp_reset_vectors ( void ) ;
2012-02-09 08:47:17 -08:00
# 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 ) ;
}
2016-01-02 13:57:18 +00:00
2014-06-09 19:47:09 +01:00
static inline bool is_kernel_in_hyp_mode ( void )
{
return false ;
}
2016-12-01 14:32:05 -05:00
static inline bool has_vhe ( void )
{
return false ;
}
2016-06-30 18:40:41 +01:00
/* The section containing the hypervisor idmap text */
extern char __hyp_idmap_text_start [ ] ;
extern char __hyp_idmap_text_end [ ] ;
2016-01-02 13:57:18 +00:00
/* The section containing the hypervisor text */
extern char __hyp_text_start [ ] ;
extern char __hyp_text_end [ ] ;
2012-02-17 16:54:28 +00:00
# endif
2017-04-03 19:37:47 +01:00
# else
/* Only assembly code should need those */
2017-04-03 19:38:03 +01:00
# define HVC_SET_VECTORS 0
# define HVC_SOFT_RESTART 1
# define HVC_RESET_VECTORS 2
2017-04-03 19:37:52 +01:00
2017-04-03 19:38:03 +01:00
# define HVC_STUB_HCALL_NR 3
2017-04-03 19:37:47 +01:00
2012-02-09 08:47:17 -08:00
# endif /* __ASSEMBLY__ */
2017-04-03 19:37:51 +01:00
# define HVC_STUB_ERR 0xbadca11
2012-02-09 08:47:17 -08:00
# endif /* ! VIRT_H */