1/* SPDX-License-Identifier: GPL-2.0-only */
2
3/*
4 * Copyright (c) 2021, Microsoft Corporation.
5 * Pasha Tatashin <pasha.tatashin@soleen.com>
6 */
7
8#include <linux/linkage.h>
9#include <asm/assembler.h>
10#include <asm/kvm_asm.h>
11
12.macro invalid_vector label
13SYM_CODE_START_LOCAL(\label)
14 .align 7
15 b \label
16SYM_CODE_END(\label)
17.endm
18
19.macro el1_sync_vector
20SYM_CODE_START_LOCAL(el1_sync)
21 .align 7
22 cmp x0, #HVC_SET_VECTORS /* Called from hibernate */
23 b.ne 1f
24 msr vbar_el2, x1
25 mov x0, xzr
26 eret
271: cmp x0, #HVC_SOFT_RESTART /* Called from kexec */
28 b.ne 2f
29 mov x0, x2
30 mov x2, x4
31 mov x4, x1
32 mov x1, x3
33 br x4
342: /* Unexpected argument, set an error */
35 mov_q x0, HVC_STUB_ERR
36 eret
37SYM_CODE_END(el1_sync)
38.endm
39
40SYM_CODE_START(trans_pgd_stub_vectors)
41 invalid_vector hyp_stub_el2t_sync_invalid // Synchronous EL2t
42 invalid_vector hyp_stub_el2t_irq_invalid // IRQ EL2t
43 invalid_vector hyp_stub_el2t_fiq_invalid // FIQ EL2t
44 invalid_vector hyp_stub_el2t_error_invalid // Error EL2t
45
46 invalid_vector hyp_stub_el2h_sync_invalid // Synchronous EL2h
47 invalid_vector hyp_stub_el2h_irq_invalid // IRQ EL2h
48 invalid_vector hyp_stub_el2h_fiq_invalid // FIQ EL2h
49 invalid_vector hyp_stub_el2h_error_invalid // Error EL2h
50
51 el1_sync_vector // Synchronous 64-bit EL1
52 invalid_vector hyp_stub_el1_irq_invalid // IRQ 64-bit EL1
53 invalid_vector hyp_stub_el1_fiq_invalid // FIQ 64-bit EL1
54 invalid_vector hyp_stub_el1_error_invalid // Error 64-bit EL1
55
56 invalid_vector hyp_stub_32b_el1_sync_invalid // Synchronous 32-bit EL1
57 invalid_vector hyp_stub_32b_el1_irq_invalid // IRQ 32-bit EL1
58 invalid_vector hyp_stub_32b_el1_fiq_invalid // FIQ 32-bit EL1
59 invalid_vector hyp_stub_32b_el1_error_invalid // Error 32-bit EL1
60 .align 11
61SYM_INNER_LABEL(__trans_pgd_stub_vectors_end, SYM_L_LOCAL)
62SYM_CODE_END(trans_pgd_stub_vectors)
63
64# Check the trans_pgd_stub_vectors didn't overflow
65.org . - (__trans_pgd_stub_vectors_end - trans_pgd_stub_vectors) + SZ_2K
66

source code of linux/arch/arm64/mm/trans_pgd-asm.S