summaryrefslogtreecommitdiff
path: root/MdePkg/Library/BaseLib/Ia32/DisablePaging32.c
blob: d462c01ff398ab8268bd6840a523c997c5e4b643 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/** @file
  AsmDisablePaging32 function.

  Copyright (c) 2006 - 2007, Intel Corporation<BR>
  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.

**/

//
// Include common header file for this module.
//
#include <BaseLibInternals.h>

#if _MSC_EXTENSIONS

__declspec (naked)
VOID
EFIAPI
InternalX86DisablePaging32 (
  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
  IN      VOID                      *Context1,    OPTIONAL
  IN      VOID                      *Context2,    OPTIONAL
  IN      VOID                      *NewStack
  )
{
  _asm {
    push    ebp
    mov     ebp, esp
    mov     ebx, EntryPoint
    mov     ecx, Context1
    mov     edx, Context2
    pushfd
    pop     edi                         // save EFLAGS to edi
    cli
    mov     eax, cr0
    btr     eax, 31
    mov     esp, NewStack
    mov     cr0, eax
    push    edi
    popfd                               // restore EFLAGS from edi
    push    edx
    push    ecx
    call    ebx
    jmp     $                           // EntryPoint() should not return
  }
}

#endif