mirror of
https://github.com/torvalds/linux.git
synced 2024-12-24 20:01:55 +00:00
caab277b1d
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms of the gnu general public license version 2 as published by the free software foundation 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 see http www gnu org licenses extracted by the scancode license scanner the SPDX license identifier GPL-2.0-only has been chosen to replace the boilerplate/reference in 503 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Alexios Zavras <alexios.zavras@intel.com> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Enrico Weigelt <info@metux.net> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190602204653.811534538@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
97 lines
2.5 KiB
C
97 lines
2.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2012 ARM Ltd.
|
|
* Author: Marc Zyngier <marc.zyngier@arm.com>
|
|
*/
|
|
|
|
#ifndef __ASM__VIRT_H
|
|
#define __ASM__VIRT_H
|
|
|
|
/*
|
|
* The arm64 hcall implementation uses x0 to specify the hcall
|
|
* number. A value less than HVC_STUB_HCALL_NR indicates a special
|
|
* hcall, such as set vector. Any other value is handled in a
|
|
* hypervisor specific way.
|
|
*
|
|
* The hypercall is allowed to clobber any of the caller-saved
|
|
* registers (x0-x18), so it is advisable to use it through the
|
|
* indirection of a function call (as implemented in hyp-stub.S).
|
|
*/
|
|
|
|
/*
|
|
* HVC_SET_VECTORS - Set the value of the vbar_el2 register.
|
|
*
|
|
* @x1: Physical address of the new vector table.
|
|
*/
|
|
#define HVC_SET_VECTORS 0
|
|
|
|
/*
|
|
* HVC_SOFT_RESTART - CPU soft reset, used by the cpu_soft_restart routine.
|
|
*/
|
|
#define HVC_SOFT_RESTART 1
|
|
|
|
/*
|
|
* HVC_RESET_VECTORS - Restore the vectors to the original HYP stubs
|
|
*/
|
|
#define HVC_RESET_VECTORS 2
|
|
|
|
/* Max number of HYP stub hypercalls */
|
|
#define HVC_STUB_HCALL_NR 3
|
|
|
|
/* Error returned when an invalid stub number is passed into x0 */
|
|
#define HVC_STUB_ERR 0xbadca11
|
|
|
|
#define BOOT_CPU_MODE_EL1 (0xe11)
|
|
#define BOOT_CPU_MODE_EL2 (0xe12)
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#include <asm/ptrace.h>
|
|
#include <asm/sections.h>
|
|
#include <asm/sysreg.h>
|
|
#include <asm/cpufeature.h>
|
|
|
|
/*
|
|
* __boot_cpu_mode records what mode CPUs were booted in.
|
|
* A correctly-implemented bootloader must start all CPUs in the same mode:
|
|
* In this case, both 32bit halves of __boot_cpu_mode will contain the
|
|
* same value (either 0 if booted in EL1, BOOT_CPU_MODE_EL2 if booted in EL2).
|
|
*
|
|
* Should the bootloader fail to do this, the two values will be different.
|
|
* This allows the kernel to flag an error when the secondaries have come up.
|
|
*/
|
|
extern u32 __boot_cpu_mode[2];
|
|
|
|
void __hyp_set_vectors(phys_addr_t phys_vector_base);
|
|
void __hyp_reset_vectors(void);
|
|
|
|
/* Reports the availability of HYP mode */
|
|
static inline bool is_hyp_mode_available(void)
|
|
{
|
|
return (__boot_cpu_mode[0] == BOOT_CPU_MODE_EL2 &&
|
|
__boot_cpu_mode[1] == BOOT_CPU_MODE_EL2);
|
|
}
|
|
|
|
/* Check if the bootloader has booted CPUs in different modes */
|
|
static inline bool is_hyp_mode_mismatched(void)
|
|
{
|
|
return __boot_cpu_mode[0] != __boot_cpu_mode[1];
|
|
}
|
|
|
|
static inline bool is_kernel_in_hyp_mode(void)
|
|
{
|
|
return read_sysreg(CurrentEL) == CurrentEL_EL2;
|
|
}
|
|
|
|
static inline bool has_vhe(void)
|
|
{
|
|
if (cpus_have_const_cap(ARM64_HAS_VIRT_HOST_EXTN))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#endif /* ! __ASM__VIRT_H */
|