forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.9 KiB
65 lines
1.9 KiB
/* 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
|
|
|