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