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