root/arch/arm64/mm/trans_pgd-asm.S
/* 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