| // | |
| // Copyright (c) 2011-2013, ARM Limited. All rights reserved. | |
| // | |
| // This program and the accompanying materials | |
| // are licensed and made available under the terms and conditions of the BSD License | |
| // which accompanies this distribution. The full text of the license may be found at | |
| // http://opensource.org/licenses/bsd-license.php | |
| // | |
| // THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| // | |
| // | |
| /* Secondary core pens for AArch64 Linux booting. | |
| This code it placed in Linux kernel memory and marked reserved. UEFI ensures | |
| that the secondary cores get to this pen and the kernel can then start the | |
| cores from here. | |
| NOTE: This code must be self-contained. | |
| */ | |
| #include <Library/ArmLib.h> | |
| .text | |
| .align 3 | |
| GCC_ASM_EXPORT(SecondariesPenStart) | |
| ASM_GLOBAL SecondariesPenEnd | |
| ASM_PFX(SecondariesPenStart): | |
| // Registers x0-x3 are reserved for future use and should be set to zero. | |
| mov x0, xzr | |
| mov x1, xzr | |
| mov x2, xzr | |
| mov x3, xzr | |
| // Get core position. Taken from ArmPlatformGetCorePosition(). | |
| // Assumes max 4 cores per cluster. | |
| mrs x4, mpidr_el1 // Get MPCore register. | |
| and x5, x4, #ARM_CORE_MASK // Get core number. | |
| and x4, x4, #ARM_CLUSTER_MASK // Get cluster number. | |
| add x4, x5, x4, LSR #6 // Add scaled cluster number to core number. | |
| lsl x4, x4, 3 // Get mailbox offset for this core. | |
| ldr x5, AsmMailboxbase // Get mailbox addr relative to pc (36 bytes ahead). | |
| add x4, x4, x5 // Add core mailbox offset to base of mailbox. | |
| 1: ldr x5, [x4] // Load value from mailbox. | |
| cmp xzr, x5 // Has the mailbox been set? | |
| b.ne 2f // If so break out of loop. | |
| wfe // If not, wait a bit. | |
| b 1b // Wait over, check if mailbox set again. | |
| 2: br x5 // Jump to mailbox value. | |
| .align 3 // Make sure the variable below is 8 byte aligned. | |
| .global AsmMailboxbase | |
| AsmMailboxbase: .xword 0xdeaddeadbeefbeef | |
| SecondariesPenEnd: |