xref: /openbmc/linux/arch/arm64/mm/trans_pgd-asm.S (revision 08eae0ef)
1788bfdd9SPasha Tatashin/* SPDX-License-Identifier: GPL-2.0-only */
2788bfdd9SPasha Tatashin
3788bfdd9SPasha Tatashin/*
4788bfdd9SPasha Tatashin * Copyright (c) 2021, Microsoft Corporation.
5788bfdd9SPasha Tatashin * Pasha Tatashin <pasha.tatashin@soleen.com>
6788bfdd9SPasha Tatashin */
7788bfdd9SPasha Tatashin
8788bfdd9SPasha Tatashin#include <linux/linkage.h>
9788bfdd9SPasha Tatashin#include <asm/assembler.h>
10788bfdd9SPasha Tatashin#include <asm/kvm_asm.h>
11788bfdd9SPasha Tatashin
12788bfdd9SPasha Tatashin.macro invalid_vector	label
13788bfdd9SPasha TatashinSYM_CODE_START_LOCAL(\label)
14788bfdd9SPasha Tatashin	.align 7
15788bfdd9SPasha Tatashin	b	\label
16788bfdd9SPasha TatashinSYM_CODE_END(\label)
17788bfdd9SPasha Tatashin.endm
18788bfdd9SPasha Tatashin
19788bfdd9SPasha Tatashin.macro el1_sync_vector
20788bfdd9SPasha TatashinSYM_CODE_START_LOCAL(el1_sync)
21788bfdd9SPasha Tatashin	.align 7
22788bfdd9SPasha Tatashin	cmp	x0, #HVC_SET_VECTORS	/* Called from hibernate */
23788bfdd9SPasha Tatashin	b.ne	1f
24788bfdd9SPasha Tatashin	msr	vbar_el2, x1
25788bfdd9SPasha Tatashin	mov	x0, xzr
26788bfdd9SPasha Tatashin	eret
27*08eae0efSPasha Tatashin1:	cmp	x0, #HVC_SOFT_RESTART	/* Called from kexec */
28*08eae0efSPasha Tatashin	b.ne	2f
29*08eae0efSPasha Tatashin	mov	x0, x2
30*08eae0efSPasha Tatashin	mov	x2, x4
31*08eae0efSPasha Tatashin	mov	x4, x1
32*08eae0efSPasha Tatashin	mov	x1, x3
33*08eae0efSPasha Tatashin	br	x4
34*08eae0efSPasha Tatashin2:	/* Unexpected argument, set an error */
35788bfdd9SPasha Tatashin	mov_q	x0, HVC_STUB_ERR
36788bfdd9SPasha Tatashin	eret
37788bfdd9SPasha TatashinSYM_CODE_END(el1_sync)
38788bfdd9SPasha Tatashin.endm
39788bfdd9SPasha Tatashin
40788bfdd9SPasha TatashinSYM_CODE_START(trans_pgd_stub_vectors)
41788bfdd9SPasha Tatashin	invalid_vector	hyp_stub_el2t_sync_invalid	// Synchronous EL2t
42788bfdd9SPasha Tatashin	invalid_vector	hyp_stub_el2t_irq_invalid	// IRQ EL2t
43788bfdd9SPasha Tatashin	invalid_vector	hyp_stub_el2t_fiq_invalid	// FIQ EL2t
44788bfdd9SPasha Tatashin	invalid_vector	hyp_stub_el2t_error_invalid	// Error EL2t
45788bfdd9SPasha Tatashin
46788bfdd9SPasha Tatashin	invalid_vector	hyp_stub_el2h_sync_invalid	// Synchronous EL2h
47788bfdd9SPasha Tatashin	invalid_vector	hyp_stub_el2h_irq_invalid	// IRQ EL2h
48788bfdd9SPasha Tatashin	invalid_vector	hyp_stub_el2h_fiq_invalid	// FIQ EL2h
49788bfdd9SPasha Tatashin	invalid_vector	hyp_stub_el2h_error_invalid	// Error EL2h
50788bfdd9SPasha Tatashin
51788bfdd9SPasha Tatashin	el1_sync_vector					// Synchronous 64-bit EL1
52788bfdd9SPasha Tatashin	invalid_vector	hyp_stub_el1_irq_invalid	// IRQ 64-bit EL1
53788bfdd9SPasha Tatashin	invalid_vector	hyp_stub_el1_fiq_invalid	// FIQ 64-bit EL1
54788bfdd9SPasha Tatashin	invalid_vector	hyp_stub_el1_error_invalid	// Error 64-bit EL1
55788bfdd9SPasha Tatashin
56788bfdd9SPasha Tatashin	invalid_vector	hyp_stub_32b_el1_sync_invalid	// Synchronous 32-bit EL1
57788bfdd9SPasha Tatashin	invalid_vector	hyp_stub_32b_el1_irq_invalid	// IRQ 32-bit EL1
58788bfdd9SPasha Tatashin	invalid_vector	hyp_stub_32b_el1_fiq_invalid	// FIQ 32-bit EL1
59788bfdd9SPasha Tatashin	invalid_vector	hyp_stub_32b_el1_error_invalid	// Error 32-bit EL1
60788bfdd9SPasha Tatashin	.align 11
61788bfdd9SPasha TatashinSYM_INNER_LABEL(__trans_pgd_stub_vectors_end, SYM_L_LOCAL)
62788bfdd9SPasha TatashinSYM_CODE_END(trans_pgd_stub_vectors)
63788bfdd9SPasha Tatashin
64788bfdd9SPasha Tatashin# Check the trans_pgd_stub_vectors didn't overflow
65788bfdd9SPasha Tatashin.org . - (__trans_pgd_stub_vectors_end - trans_pgd_stub_vectors) + SZ_2K
66