Changeset View
Changeset View
Standalone View
Standalone View
head/sys/arm64/arm64/cpu_errata.c
Show All 24 Lines | |||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
* SUCH DAMAGE. | * SUCH DAMAGE. | ||||
*/ | */ | ||||
#include "opt_platform.h" | |||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include <sys/param.h> | #include <sys/param.h> | ||||
#include <sys/kernel.h> | #include <sys/kernel.h> | ||||
#include <sys/pcpu.h> | #include <sys/pcpu.h> | ||||
#include <machine/cpu.h> | #include <machine/cpu.h> | ||||
#ifdef DEV_PSCI | |||||
#include <dev/psci/psci.h> | |||||
#endif | |||||
typedef void (cpu_quirk_install)(void); | typedef void (cpu_quirk_install)(void); | ||||
struct cpu_quirks { | struct cpu_quirks { | ||||
cpu_quirk_install *quirk_install; | cpu_quirk_install *quirk_install; | ||||
u_int midr_mask; | u_int midr_mask; | ||||
u_int midr_value; | u_int midr_value; | ||||
}; | }; | ||||
static cpu_quirk_install install_psci_bp_hardening; | static cpu_quirk_install install_psci_bp_hardening; | ||||
static struct cpu_quirks cpu_quirks[] = { | static struct cpu_quirks cpu_quirks[] = { | ||||
{ | |||||
.midr_mask = CPU_IMPL_MASK | CPU_PART_MASK, | |||||
.midr_value = CPU_ID_RAW(CPU_IMPL_ARM, CPU_PART_CORTEX_A57,0,0), | |||||
.quirk_install = install_psci_bp_hardening, | |||||
}, | |||||
{ | |||||
.midr_mask = CPU_IMPL_MASK | CPU_PART_MASK, | |||||
.midr_value = CPU_ID_RAW(CPU_IMPL_ARM, CPU_PART_CORTEX_A72,0,0), | |||||
.quirk_install = install_psci_bp_hardening, | |||||
}, | |||||
{ | |||||
.midr_mask = CPU_IMPL_MASK | CPU_PART_MASK, | |||||
.midr_value = CPU_ID_RAW(CPU_IMPL_ARM, CPU_PART_CORTEX_A73,0,0), | |||||
.quirk_install = install_psci_bp_hardening, | |||||
}, | |||||
{ | |||||
.midr_mask = CPU_IMPL_MASK | CPU_PART_MASK, | |||||
.midr_value = CPU_ID_RAW(CPU_IMPL_ARM, CPU_PART_CORTEX_A75,0,0), | |||||
.quirk_install = install_psci_bp_hardening, | |||||
}, | |||||
}; | }; | ||||
static void | |||||
install_psci_bp_hardening(void) | |||||
{ | |||||
#ifdef DEV_PSCI | |||||
PCPU_SET(bp_harden, psci_get_version); | |||||
#endif | |||||
} | |||||
void | void | ||||
install_cpu_errata(void) | install_cpu_errata(void) | ||||
{ | { | ||||
u_int midr; | u_int midr; | ||||
size_t i; | size_t i; | ||||
midr = get_midr(); | midr = get_midr(); | ||||
for (i = 0; i < nitems(cpu_quirks); i++) { | for (i = 0; i < nitems(cpu_quirks); i++) { | ||||
if ((midr & cpu_quirks[i].midr_mask) == | if ((midr & cpu_quirks[i].midr_mask) == | ||||
cpu_quirks[i].midr_value) { | cpu_quirks[i].midr_value) { | ||||
cpu_quirks[i].quirk_install(); | cpu_quirks[i].quirk_install(); | ||||
} | } | ||||
} | } | ||||
} | } |