diff options
author | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
---|---|---|
committer | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
commit | b7c51c9cf4864df6aabb99a1ae843becd577237c (patch) | |
tree | eebe9b0d0ca03062955223097e57da84dd618b9a /Core/CPU/IPF/IpfCpuCore.s | |
download | zprj-b7c51c9cf4864df6aabb99a1ae843becd577237c.tar.xz |
Diffstat (limited to 'Core/CPU/IPF/IpfCpuCore.s')
-rw-r--r-- | Core/CPU/IPF/IpfCpuCore.s | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/Core/CPU/IPF/IpfCpuCore.s b/Core/CPU/IPF/IpfCpuCore.s new file mode 100644 index 0000000..d3b7c62 --- /dev/null +++ b/Core/CPU/IPF/IpfCpuCore.s @@ -0,0 +1,196 @@ +//++ +// Copyright (c) 2004, Intel Corporation +// 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. +// +// Module Name: +// +// IpfCpuCore.s +// +// Abstract: +// IPF Specific assembly routines +// +//-- + +.file "IpfCpuCore.s" + +#include "IpfMacro.i" +#include "IpfCpuCore.i" + +//---------------------------------------------------------------------------------- +// This module supports terminating CAR (Cache As RAM) stage. It copies all the +// CAR data into real RAM and then makes a stack switch. + +// EFI_STATUS +// SwitchCoreStacks ( +// IN VOID *EntryPoint, +// IN UINTN CopySize, +// IN VOID *OldBase, +// IN VOID *NewBase +// IN UINTN NewSP, OPTIONAL +// IN UINTN NewBSP OPTIONAL +// ) +// EFI_STATUS +// SwitchCoreStacks ( +// IN VOID *EntryPointForContinuationFunction, +// IN UINTN StartupDescriptor, +// IN VOID PEICorePointer, +// IN UINTN NewSP +// ) +//---------------------------------------------------------------------------------- +PROCEDURE_ENTRY (SwitchCoreStacks) + + NESTED_SETUP (4,2,0,0) + + // first save all stack registers in GPRs. + mov r13 = in0;; // this is a pointer to the PLABEL of the continuation function. + ld8 r16 = [r13],8;; // r16 = address of continuation function from the PLABEL + ld8 gp = [r13];; // gp = gp of continuation function from the PLABEL + mov b1 = r16;; + + // save the parameters in r5, r6. these 2 seemed to be preserved across PAL calls + mov r5 = in1;; // this is the parameter1 to pass to the continuation function + mov r6 = in2;; // this is the parameter2 to pass to the continuation function + dep r6=0,r6,63,1;; // zero the bit 63. + + mov r8 = in3;; // new stack pointer. + + // r8 has the sp, this is 128K stack size, from this we will reserve 16K for the bspstore + movl r15 = PEI_BSP_STORE_SIZE;; + sub r8 = r8, r15;; + add r15 = (GuardBand),r8;; // some little buffer, now r15 will be our bspstore + + // save the bspstore value to r4, save sp value to r7 + mov r4 = r15 + mov r7 = r8 + mov r16 = r8;; // will be the new sp in uncache mode + + + alloc r11=0,0,0,0;; // Set 0-size frame + flushrs;; + + mov r21 = RSC_KERNEL_DISABLED;; // for rse disable + mov ar.rsc = r21;; // turn off RSE + + add sp = r0, r16 // transfer to the EFI stack + mov ar.bspstore = r15 // switch to EFI BSP + invala // change of ar.bspstore needs invala. + + mov r19 = RSC_KERNEL_LAZ;; // RSC enabled, Lazy mode + mov ar.rsc = r19;; // turn rse on, in kernel mode + +//----------------------------------------------------------------------------------- +// Save here the meaningful stuff for next few lines and then make the PAL call. +// Make PAL call to terminate the CAR status. + // AVL: do this only for recovery check call... + + mov r28=ar.k3;; + dep r2 = r28,r0,0,8;; // Extract Function bits from GR20. + cmp.eq p6,p7 = RecoveryFn,r2;; // Is it Recovery check + (p7) br.sptk.few DoneCARTermination; // if not, don't terminate car.. + +TerminateCAR:: + + mov r28 = ip;; + add r28 = (DoneCARTerminationPALCall - TerminateCAR),r28;; + mov b0 = r28 + + mov r8 = ar.k5;; + mov b6 = r8 + mov r28 = 0x208 + + mov r29 = r0 + mov r30 = r0 + mov r31 = r0 + mov r8 = r0;; + br.sptk.few b6;; // Call PAL-A call. + +DoneCARTerminationPALCall:: + +// don't check error in soft sdv, it is always returning -1 for this call for some reason +#if SOFT_SDV +#else +ReturnToPEIMain:: + cmp.eq p6,p7 = r8,r0;; + // + // dead loop if the PAL call failed, we have the CAR on but the stack is now pointing to memory + // + (p7) br.sptk.few ReturnToPEIMain;; + // + // PAL call successed,now the stack are in memory so come into cache mode + // instead of uncache mode + // + + alloc r11=0,0,0,0;; // Set 0-size frame + flushrs;; + + mov r21 = RSC_KERNEL_DISABLED;; // for rse disable + mov ar.rsc = r21;; // turn off RSE + + dep r6 = 0,r6,63,1 // zero the bit 63 + dep r7 = 0,r7,63,1 // zero the bit 63 + dep r4 = 0,r4,63,1;; // zero the bit 63 + add sp = r0, r7 // transfer to the EFI stack in cache mode + mov ar.bspstore = r4 // switch to EFI BSP + invala // change of ar.bspstore needs invala. + + mov r19 = RSC_KERNEL_LAZ;; // RSC enabled, Lazy mode + mov ar.rsc = r19;; // turn rse on, in kernel mode + +#endif + +DoneCARTermination:: + + // allocate a stack frame: + alloc r11=0,2,2,0 ;; // alloc outs going to ensuing DXE IPL service + // on the new stack + mov out0 = r5;; + mov out1 = r6;; + + mov r16 = b1;; + mov b6 = r16;; + br.call.sptk.few b0=b6;; // Call the continuation function + + NESTED_RETURN + +PROCEDURE_EXIT(SwitchCoreStacks) +//----------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------- +//++ +// GetHandOffStatus +// +// This routine is called by all processors simultaneously, to get some hand-off +// status that has been captured by IPF dispatcher and recorded in kernel registers. +// +// Arguments : +// +// On Entry : None. +// +// Return Value: Lid, R20Status. +// +//-- +//---------------------------------------------------------------------------------- +PROCEDURE_ENTRY (GetHandOffStatus) + + NESTED_SETUP (0,2+0,0,0) + + mov r8 = ar.k6 // Health Status (Self test params) + mov r9 = ar.k4 // LID bits + mov r10 = ar.k3;; // SAL_E entry state + #if (PI_SPECIFICATION_VERSION < 0x00010000) + mov r11 = ar.k7 // Return address to PAL + #else + mov r11 = ar.k1 // Return address to PAL + #endif + + NESTED_RETURN +PROCEDURE_EXIT (GetHandOffStatus) +//---------------------------------------------------------------------------------- + + |