4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IA-32/x64 AsmDisablePaging64()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "BaseLibInternals.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Disables the 64-bit paging mode on the CPU.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Disables the 64-bit paging mode on the CPU and returns to 32-bit protected
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mode. This function assumes the current execution mode is 64-paging mode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function is only available on x64. After the 64-bit paging mode is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync disabled, control is transferred to the function specified by EntryPoint
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync using the new stack specified by NewStack and passing in the parameters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified by Context1 and Context2. Context1 and Context2 are optional and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync may be 0. The function EntryPoint must never return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the current execution mode is not 64-bit paged mode, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EntryPoint is 0, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If NewStack is 0, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Cs The 16-bit selector to load in the CS before EntryPoint
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is called. The descriptor in the GDT that this selector
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync references must be setup for 32-bit protected mode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EntryPoint The 64-bit virtual address of the function to call with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the new stack after paging is disabled.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Context1 The 64-bit virtual address of the context to pass into
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the EntryPoint function as the first parameter after
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync paging is disabled.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Context2 The 64-bit virtual address of the context to pass into
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the EntryPoint function as the second parameter after
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync paging is disabled.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param NewStack The 64-bit virtual address of the new stack to use for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the EntryPoint function after paging is disabled.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAsmDisablePaging64 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 Cs,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 EntryPoint,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Context1, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Context2, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 NewStack
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (EntryPoint != 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (NewStack != 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalX86DisablePaging64 (Cs, EntryPoint, Context1, Context2, NewStack);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}