Linux 6.7-rc7
[linux-modified.git] / arch / arm64 / mm / trans_pgd-asm.S
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
13 SYM_CODE_START_LOCAL(\label)
14         .align 7
15         b       \label
16 SYM_CODE_END(\label)
17 .endm
18
19 .macro el1_sync_vector
20 SYM_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
27 1:      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
34 2:      /* Unexpected argument, set an error */
35         mov_q   x0, HVC_STUB_ERR
36         eret
37 SYM_CODE_END(el1_sync)
38 .endm
39
40 SYM_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
61 SYM_INNER_LABEL(__trans_pgd_stub_vectors_end, SYM_L_LOCAL)
62 SYM_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