| /* SPDX-License-Identifier: GPL-2.0-only */ | |
| /* | |
| * EFI entry point. | |
| * | |
| * Copyright (C) 2013, 2014 Red Hat, Inc. | |
| * Author: Mark Salter <msalter@redhat.com> | |
| */ | |
| #include <linux/linkage.h> | |
| #include <linux/init.h> | |
| #include <asm/assembler.h> | |
| __INIT | |
| SYM_CODE_START(efi_enter_kernel) | |
| /* | |
| * efi_pe_entry() will have copied the kernel image if necessary and we | |
| * end up here with device tree address in x1 and the kernel entry | |
| * point stored in x0. Save those values in registers which are | |
| * callee preserved. | |
| */ | |
| ldr w2, =primary_entry_offset | |
| add x19, x0, x2 // relocated Image entrypoint | |
| mov x20, x1 // DTB address | |
| /* | |
| * Clean the copied Image to the PoC, and ensure it is not shadowed by | |
| * stale icache entries from before relocation. | |
| */ | |
| ldr w1, =kernel_size | |
| bl __clean_dcache_area_poc | |
| ic ialluis | |
| /* | |
| * Clean the remainder of this routine to the PoC | |
| * so that we can safely disable the MMU and caches. | |
| */ | |
| adr x0, 0f | |
| ldr w1, 3f | |
| bl __clean_dcache_area_poc | |
| 0: | |
| /* Turn off Dcache and MMU */ | |
| mrs x0, CurrentEL | |
| cmp x0, #CurrentEL_EL2 | |
| b.ne 1f | |
| mrs x0, sctlr_el2 | |
| bic x0, x0, #1 << 0 // clear SCTLR.M | |
| bic x0, x0, #1 << 2 // clear SCTLR.C | |
| pre_disable_mmu_workaround | |
| msr sctlr_el2, x0 | |
| isb | |
| b 2f | |
| 1: | |
| mrs x0, sctlr_el1 | |
| bic x0, x0, #1 << 0 // clear SCTLR.M | |
| bic x0, x0, #1 << 2 // clear SCTLR.C | |
| pre_disable_mmu_workaround | |
| msr sctlr_el1, x0 | |
| isb | |
| 2: | |
| /* Jump to kernel entry point */ | |
| mov x0, x20 | |
| mov x1, xzr | |
| mov x2, xzr | |
| mov x3, xzr | |
| br x19 | |
| SYM_CODE_END(efi_enter_kernel) | |
| 3: .long . - 0b |