162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci/* 462306a36Sopenharmony_ci * Copyright (c) 2021, Microsoft Corporation. 562306a36Sopenharmony_ci * Pasha Tatashin <pasha.tatashin@soleen.com> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/linkage.h> 962306a36Sopenharmony_ci#include <asm/assembler.h> 1062306a36Sopenharmony_ci#include <asm/kvm_asm.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci.macro invalid_vector label 1362306a36Sopenharmony_ciSYM_CODE_START_LOCAL(\label) 1462306a36Sopenharmony_ci .align 7 1562306a36Sopenharmony_ci b \label 1662306a36Sopenharmony_ciSYM_CODE_END(\label) 1762306a36Sopenharmony_ci.endm 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci.macro el1_sync_vector 2062306a36Sopenharmony_ciSYM_CODE_START_LOCAL(el1_sync) 2162306a36Sopenharmony_ci .align 7 2262306a36Sopenharmony_ci cmp x0, #HVC_SET_VECTORS /* Called from hibernate */ 2362306a36Sopenharmony_ci b.ne 1f 2462306a36Sopenharmony_ci msr vbar_el2, x1 2562306a36Sopenharmony_ci mov x0, xzr 2662306a36Sopenharmony_ci eret 2762306a36Sopenharmony_ci1: cmp x0, #HVC_SOFT_RESTART /* Called from kexec */ 2862306a36Sopenharmony_ci b.ne 2f 2962306a36Sopenharmony_ci mov x0, x2 3062306a36Sopenharmony_ci mov x2, x4 3162306a36Sopenharmony_ci mov x4, x1 3262306a36Sopenharmony_ci mov x1, x3 3362306a36Sopenharmony_ci br x4 3462306a36Sopenharmony_ci2: /* Unexpected argument, set an error */ 3562306a36Sopenharmony_ci mov_q x0, HVC_STUB_ERR 3662306a36Sopenharmony_ci eret 3762306a36Sopenharmony_ciSYM_CODE_END(el1_sync) 3862306a36Sopenharmony_ci.endm 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ciSYM_CODE_START(trans_pgd_stub_vectors) 4162306a36Sopenharmony_ci invalid_vector hyp_stub_el2t_sync_invalid // Synchronous EL2t 4262306a36Sopenharmony_ci invalid_vector hyp_stub_el2t_irq_invalid // IRQ EL2t 4362306a36Sopenharmony_ci invalid_vector hyp_stub_el2t_fiq_invalid // FIQ EL2t 4462306a36Sopenharmony_ci invalid_vector hyp_stub_el2t_error_invalid // Error EL2t 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci invalid_vector hyp_stub_el2h_sync_invalid // Synchronous EL2h 4762306a36Sopenharmony_ci invalid_vector hyp_stub_el2h_irq_invalid // IRQ EL2h 4862306a36Sopenharmony_ci invalid_vector hyp_stub_el2h_fiq_invalid // FIQ EL2h 4962306a36Sopenharmony_ci invalid_vector hyp_stub_el2h_error_invalid // Error EL2h 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci el1_sync_vector // Synchronous 64-bit EL1 5262306a36Sopenharmony_ci invalid_vector hyp_stub_el1_irq_invalid // IRQ 64-bit EL1 5362306a36Sopenharmony_ci invalid_vector hyp_stub_el1_fiq_invalid // FIQ 64-bit EL1 5462306a36Sopenharmony_ci invalid_vector hyp_stub_el1_error_invalid // Error 64-bit EL1 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci invalid_vector hyp_stub_32b_el1_sync_invalid // Synchronous 32-bit EL1 5762306a36Sopenharmony_ci invalid_vector hyp_stub_32b_el1_irq_invalid // IRQ 32-bit EL1 5862306a36Sopenharmony_ci invalid_vector hyp_stub_32b_el1_fiq_invalid // FIQ 32-bit EL1 5962306a36Sopenharmony_ci invalid_vector hyp_stub_32b_el1_error_invalid // Error 32-bit EL1 6062306a36Sopenharmony_ci .align 11 6162306a36Sopenharmony_ciSYM_INNER_LABEL(__trans_pgd_stub_vectors_end, SYM_L_LOCAL) 6262306a36Sopenharmony_ciSYM_CODE_END(trans_pgd_stub_vectors) 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci# Check the trans_pgd_stub_vectors didn't overflow 6562306a36Sopenharmony_ci.org . - (__trans_pgd_stub_vectors_end - trans_pgd_stub_vectors) + SZ_2K 66