| ;; @file | |
| ; This is the assembly code for transferring to control to OS S3 waking vector | |
| ; for IA32 platform | |
| ; | |
| ; Copyright (c) 2006, Intel Corporation. All rights reserved.<BR> | |
| ; | |
| ; 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. | |
| ; | |
| ;; | |
| SECTION .text | |
| global ASM_PFX(AsmFixAddress16) | |
| global ASM_PFX(AsmJmpAddr32) | |
| ;----------------------------------------- | |
| ;VOID | |
| ;AsmTransferControl ( | |
| ; IN UINT32 S3WakingVector, | |
| ; IN UINT32 AcpiLowMemoryBase | |
| ; ); | |
| ;----------------------------------------- | |
| global ASM_PFX(AsmTransferControl) | |
| ASM_PFX(AsmTransferControl): | |
| ; S3WakingVector :DWORD | |
| ; AcpiLowMemoryBase :DWORD | |
| push ebp | |
| mov ebp, esp | |
| lea eax, [.0] | |
| push 0x28 ; CS | |
| push eax | |
| mov ecx, [ebp + 8] | |
| shrd ebx, ecx, 20 | |
| and ecx, 0xf | |
| mov bx, cx | |
| mov [@jmp_addr + 1], ebx | |
| retf | |
| BITS 16 | |
| .0: | |
| mov ax, 0x30 | |
| o32 mov ds, eax | |
| o32 mov es, eax | |
| o32 mov fs, eax | |
| o32 mov gs, eax | |
| o32 mov ss, eax | |
| mov eax, cr0 ; Get control register 0 | |
| and eax, 0x0fffffffe ; Clear PE bit (bit #0) | |
| mov cr0, eax ; Activate real mode | |
| @jmp_addr: | |
| jmp 0x0:0x0 | |
| global ASM_PFX(AsmTransferControl32) | |
| ASM_PFX(AsmTransferControl32): | |
| jmp ASM_PFX(AsmTransferControl) | |
| ; dummy | |
| global ASM_PFX(AsmTransferControl16) | |
| ASM_PFX(AsmTransferControl16): | |
| ASM_PFX(AsmFixAddress16): DD 0 | |
| ASM_PFX(AsmJmpAddr32): DD 0 | |