summaryrefslogtreecommitdiffstats
path: root/arch/arm64/mm/trans_pgd-asm.S
blob: 021c31573bcb60eb1f320373c7264cd28e1812b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/* SPDX-License-Identifier: GPL-2.0-only */

/*
 * Copyright (c) 2021, Microsoft Corporation.
 * Pasha Tatashin <pasha.tatashin@soleen.com>
 */

#include <linux/linkage.h>
#include <asm/assembler.h>
#include <asm/kvm_asm.h>

.macro invalid_vector	label
SYM_CODE_START_LOCAL(\label)
	.align 7
	b	\label
SYM_CODE_END(\label)
.endm

.macro el1_sync_vector
SYM_CODE_START_LOCAL(el1_sync)
	.align 7
	cmp	x0, #HVC_SET_VECTORS	/* Called from hibernate */
	b.ne	1f
	msr	vbar_el2, x1
	mov	x0, xzr
	eret
1:	cmp	x0, #HVC_SOFT_RESTART	/* Called from kexec */
	b.ne	2f
	mov	x0, x2
	mov	x2, x4
	mov	x4, x1
	mov	x1, x3
	br	x4
2:	/* Unexpected argument, set an error */
	mov_q	x0, HVC_STUB_ERR
	eret
SYM_CODE_END(el1_sync)
.endm

SYM_CODE_START(trans_pgd_stub_vectors)
	invalid_vector	hyp_stub_el2t_sync_invalid	// Synchronous EL2t
	invalid_vector	hyp_stub_el2t_irq_invalid	// IRQ EL2t
	invalid_vector	hyp_stub_el2t_fiq_invalid	// FIQ EL2t
	invalid_vector	hyp_stub_el2t_error_invalid	// Error EL2t

	invalid_vector	hyp_stub_el2h_sync_invalid	// Synchronous EL2h
	invalid_vector	hyp_stub_el2h_irq_invalid	// IRQ EL2h
	invalid_vector	hyp_stub_el2h_fiq_invalid	// FIQ EL2h
	invalid_vector	hyp_stub_el2h_error_invalid	// Error EL2h

	el1_sync_vector					// Synchronous 64-bit EL1
	invalid_vector	hyp_stub_el1_irq_invalid	// IRQ 64-bit EL1
	invalid_vector	hyp_stub_el1_fiq_invalid	// FIQ 64-bit EL1
	invalid_vector	hyp_stub_el1_error_invalid	// Error 64-bit EL1

	invalid_vector	hyp_stub_32b_el1_sync_invalid	// Synchronous 32-bit EL1
	invalid_vector	hyp_stub_32b_el1_irq_invalid	// IRQ 32-bit EL1
	invalid_vector	hyp_stub_32b_el1_fiq_invalid	// FIQ 32-bit EL1
	invalid_vector	hyp_stub_32b_el1_error_invalid	// Error 32-bit EL1
	.align 11
SYM_INNER_LABEL(__trans_pgd_stub_vectors_end, SYM_L_LOCAL)
SYM_CODE_END(trans_pgd_stub_vectors)

# Check the trans_pgd_stub_vectors didn't overflow
.org . - (__trans_pgd_stub_vectors_end - trans_pgd_stub_vectors) + SZ_2K