Hello Jordan ! I cloned repository you pointed and run: build -p IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc -a IA32
Build environment: Linux-3.4.33-2.24-desktop-x86_64-with-SuSE-12.2-x86_64 Build start time: 01:39:14, Aug.21 2014 WORKSPACE = /home/mg/sources/jljusten/edk2 ECP_SOURCE = /home/mg/sources/jljusten/edk2/EdkCompatibilityPkg EDK_SOURCE = /home/mg/sources/jljusten/edk2/EdkCompatibilityPkg EFI_SOURCE = /home/mg/sources/jljusten/edk2/EdkCompatibilityPkg EDK_TOOLS_PATH = /home/mg/sources/jljusten/edk2/BaseTools Building ... /home/mg/sources/jljusten/edk2/IntelFrameworkModulePkg/Library/BaseUefiTianoCustomDecompressLib/BaseUefiTianoCustomDecompressLib.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/IntelFrameworkModulePkg/Library/PeiS3Lib/PeiS3Lib.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/IntelFrameworkModulePkg/Library/PeiRecoveryLib/PeiRecoveryLib.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/IntelFrameworkModulePkg/Library/SmmRuntimeDxeReportStatusCodeLibFramework/SmmRuntimeDxeReportStatusCodeLibFramework.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/IntelFrameworkModulePkg/Library/PlatformBdsLibNull/PlatformBdsLibNull.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/IntelFrameworkModulePkg/Library/DxeCapsuleLib/DxeCapsuleLib.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/MdePkg/Library/DxePcdLib/DxePcdLib.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/MdePkg/Library/BaseLib/BaseLib.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/MdePkg/Library/BasePrintLib/BasePrintLib.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf [IA32] Building ... /home/mg/sources/jljusten/edk2/MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLibNull.inf [IA32] /home/mg/sources/jljusten/edk2/Build/IntelFrameworkModuleAll/DEBUG_GCC47/IA32/MdePkg/Library/BaseLib/BaseLib/OUTPUT/Ia32/Thunk16.iii:177: error: segment alignment `0x10' is not power of two make: *** [/home/mg/sources/jljusten/edk2/Build/IntelFrameworkModuleAll/DEBUG_GCC47/IA32/MdePkg/Library/BaseLib/BaseLib/OUTPUT/Ia32/Thunk16.obj] Error 1 My NASM didn't like ALIGN 0x10 statement, but it happy with ALIGN 8. Same error for X64 platform. I will comment on this in next patch. O n Tue, 2014-08-19 at 16:57 -0700, Jordan Justen wrote: > This is a translation of Ia32/Thunk16.asm to NASM. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Jordan Justen <jordan.l.jus...@intel.com> > --- > MdePkg/Library/BaseLib/BaseLib.inf | 2 +- > MdePkg/Library/BaseLib/Ia32/Thunk16.nasm | 278 > +++++++++++++++++++++++++++++++ > 2 files changed, 279 insertions(+), 1 deletion(-) > create mode 100644 MdePkg/Library/BaseLib/Ia32/Thunk16.nasm > > diff --git a/MdePkg/Library/BaseLib/BaseLib.inf > b/MdePkg/Library/BaseLib/BaseLib.inf > index 36246ed..e1697ac 100644 > --- a/MdePkg/Library/BaseLib/BaseLib.inf > +++ b/MdePkg/Library/BaseLib/BaseLib.inf > @@ -251,7 +251,7 @@ > Ia32/DisableCache.asm | INTEL > > Ia32/GccInline.c | GCC > - Ia32/Thunk16.S | GCC > + Ia32/Thunk16.nasm | GCC > Ia32/EnableDisableInterrupts.S | GCC > Ia32/EnablePaging64.S | GCC > Ia32/DisablePaging32.S | GCC > diff --git a/MdePkg/Library/BaseLib/Ia32/Thunk16.nasm > b/MdePkg/Library/BaseLib/Ia32/Thunk16.nasm > new file mode 100644 > index 0000000..c09153a > --- /dev/null > +++ b/MdePkg/Library/BaseLib/Ia32/Thunk16.nasm > @@ -0,0 +1,278 @@ > + > +#include "BaseLibInternals.h" > + > +;------------------------------------------------------------------------------ > +; > +; Copyright (c) 2006 - 2013, 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. > +; > +; Module Name: > +; > +; Thunk.asm > +; > +; Abstract: > +; > +; Real mode thunk > +; > +;------------------------------------------------------------------------------ > + > +global ASM_PFX(m16Size) > +global ASM_PFX(mThunk16Attr) > +global ASM_PFX(m16Gdt) > +global ASM_PFX(m16GdtrBase) > +global ASM_PFX(mTransition) > +global ASM_PFX(m16Start) > + > +struc IA32_REGS > + > + ._EDI: resd 1 > + ._ESI: resd 1 > + ._EBP: resd 1 > + ._ESP: resd 1 > + ._EBX: resd 1 > + ._EDX: resd 1 > + ._ECX: resd 1 > + ._EAX: resd 1 > + ._DS: resw 1 > + ._ES: resw 1 > + ._FS: resw 1 > + ._GS: resw 1 > + ._EFLAGS: resd 1 > + ._EIP: resd 1 > + ._CS: resw 1 > + ._SS: resw 1 > + .size: > + > +endstruc > + > +;; .const > + > +SECTION .data > + > +; > +; These are global constant to convey information to C code. > +; > +ASM_PFX(m16Size) DW InternalAsmThunk16 - m16Start > +ASM_PFX(mThunk16Attr) DW _ThunkAttr - m16Start > +ASM_PFX(m16Gdt) DW _NullSegDesc - m16Start > +ASM_PFX(m16GdtrBase) DW _16GdtrBase - m16Start > +ASM_PFX(mTransition) DW _EntryPoint - m16Start > + > +SECTION .text > + > +ASM_PFX(m16Start): > + > +SavedGdt: > + dw 0 > + dd 0 > + > +;------------------------------------------------------------------------------ > +; _BackFromUserCode() takes control in real mode after 'retf' has been > executed > +; by user code. It will be shadowed to somewhere in memory below 1MB. > +;------------------------------------------------------------------------------ > +_BackFromUserCode: > + ; > + ; The order of saved registers on the stack matches the order they > appears > + ; in IA32_REGS structure. This facilitates wrapper function to extract > them > + ; into that structure. > + ; > + push ss > + push cs > + DB 66h > + call @Base ; push eip > +@Base: > + pushfw ; pushfd actually > + cli ; disable interrupts > + push gs > + push fs > + push es > + push ds > + pushaw ; pushad actually > + DB 66h, 0bah ; mov edx, imm32 > +_ThunkAttr: dd 0 > + test dl, THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 > + jz @1 > + mov eax, 15cd2401h ; mov ax, 2401h & int 15h > + cli ; disable interrupts > + jnc @2 > +@1: > + test dl, THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL > + jz @2 > + in al, 92h > + or al, 2 > + out 92h, al ; deactivate A20M# > +@2: > + xor ax, ax ; xor eax, eax > + mov eax, ss ; mov ax, ss > + DB 67h > + lea bp, [esp + IA32_REGS.size] > + ; > + ; esi's in the following 2 instructions are indeed bp in 16-bit code. > Fact > + ; is "esi" in 32-bit addressing mode has the same encoding of "bp" in 16- > + ; bit addressing mode. > + ; > + mov [esi - IA32_REGS.size + IA32_REGS._ESP], bp > + mov ebx, [esi - IA32_REGS.size + IA32_REGS._EIP] > + shl ax, 4 ; shl eax, 4 > + add bp, ax ; add ebp, eax > + DB 66h, 0b8h ; mov eax, imm32 > +SavedCr4: DD 0 > + mov cr4, eax > + DB 66h > + lgdt [cs:edi + (SavedGdt - @Base)] > + DB 66h, 0b8h ; mov eax, imm32 > +SavedCr0: DD 0 > + mov cr0, eax > + DB 0b8h ; mov ax, imm16 > +SavedSs DW 0 > + mov ss, eax > + DB 66h, 0bch ; mov esp, imm32 > +SavedEsp DD 0 > + DB 66h > + retf ; return to protected mode > + > +_EntryPoint: > + DD _ToUserCode - m16Start > + DW 8h > +_16Idtr: > + DW (1 << 10) - 1 > + DD 0 > +_16Gdtr: > + DW GdtEnd - _NullSegDesc - 1 > +_16GdtrBase: > + DD _NullSegDesc > + > +;------------------------------------------------------------------------------ > +; _ToUserCode() takes control in real mode before passing control to user > code. > +; It will be shadowed to somewhere in memory below 1MB. > +;------------------------------------------------------------------------------ > +_ToUserCode: > + mov edx, ss > + mov ss, ecx ; set new segment selectors > + mov ds, ecx > + mov es, ecx > + mov fs, ecx > + mov gs, ecx > + mov cr0, eax ; real mode starts at next > instruction > + ; which (per SDM) *must* be a far > JMP. > + DB 0eah > +_RealAddr: DW 0, 0 > + > + mov cr4, ebp > + mov ss, esi ; set up 16-bit stack segment > + xchg sp, bx ; set up 16-bit stack pointer > + > +; mov bp, [esp + sizeof(IA32_REGS) > + DB 67h > + mov ebp, [esp + IA32_REGS.size] ; BackFromUserCode address from stack > + > +; mov cs:[bp + (SavedSs - _BackFromUserCode)], dx > + mov [cs:esi + (SavedSs - _BackFromUserCode)], edx > + > +; mov cs:[bp + (SavedEsp - _BackFromUserCode)], ebx > + DB 2eh, 66h, 89h, 9eh > + DW SavedEsp - _BackFromUserCode > + > +; lidt cs:[bp + (_16Idtr - _BackFromUserCode)] > + DB 2eh, 66h, 0fh, 01h, 9eh > + DW _16Idtr - _BackFromUserCode > + > + popaw ; popad actually > + pop ds > + pop es > + pop fs > + pop gs > + popfw ; popfd > + > + DB 66h ; Use 32-bit addressing for "retf" > below > + retf ; transfer control to user code > + > +ALIGN 0x10 > +_NullSegDesc DQ 0 > +_16CsDesc: > + DW -1 > + DW 0 > + DB 0 > + DB 9bh > + DB 8fh ; 16-bit segment, 4GB limit > + DB 0 > +_16DsDesc: > + DW -1 > + DW 0 > + DB 0 > + DB 93h > + DB 8fh ; 16-bit segment, 4GB limit > + DB 0 > +GdtEnd: > + > +;------------------------------------------------------------------------------ > +; IA32_REGISTER_SET * > +; EFIAPI > +; InternalAsmThunk16 ( > +; IN IA32_REGISTER_SET *RegisterSet, > +; IN OUT VOID *Transition > +; ); > +;------------------------------------------------------------------------------ > +global ASM_PFX(InternalAsmThunk16) > +ASM_PFX(InternalAsmThunk16): > + push ebp > + push ebx > + push esi > + push edi > + push ds > + push es > + push fs > + push gs > + mov esi, [esp + 36] ; esi <- RegSet, the 1st parameter > + movzx edx, word [esi + IA32_REGS._SS] > + mov edi, [esi + IA32_REGS._ESP] > + add edi, - (IA32_REGS.size + 4) ; reserve stack space > + mov ebx, edi ; ebx <- stack offset > + imul eax, edx, 16 ; eax <- edx * 16 > + push IA32_REGS.size / 4 > + add edi, eax ; edi <- linear address of 16-bit > stack > + pop ecx > + rep movsd ; copy RegSet > + mov eax, [esp + 40] ; eax <- address of transition code > + mov esi, edx ; esi <- 16-bit stack segment > + lea edx, [eax + (SavedCr0 - m16Start)] > + nop > + mov ecx, eax > + and ecx, 0fh > + shl eax, 12 > + lea ecx, [ecx + (_BackFromUserCode - m16Start)] > + mov ax, cx > + stosd ; [edi] <- return address of user > code > + add eax, _RealAddr + 4 - _BackFromUserCode > + mov [edx + (_RealAddr - SavedCr0)], eax > + sgdt [edx + (SavedGdt - SavedCr0)] > + sidt [esp + 36] ; save IDT stack in argument space > + mov eax, cr0 > + mov [edx], eax ; save CR0 in SavedCr0 > + and eax, 7ffffffeh ; clear PE, PG bits > + mov ebp, cr4 > + mov [edx + (SavedCr4 - SavedCr0)], ebp > + and ebp, ~30h ; clear PAE, PSE bits > + push 10h > + pop ecx ; ecx <- selector for data segments > + lgdt [edx + (_16Gdtr - SavedCr0)] > + pushfd ; Save df/if indeed > + call dword far [edx + (_EntryPoint - SavedCr0)] > + popfd > + lidt [esp + 36] ; restore protected mode IDTR > + lea eax, [ebp - IA32_REGS.size] ; eax <- the address of IA32_REGS > + pop gs > + pop fs > + pop es > + pop ds > + pop edi > + pop esi > + pop ebx > + pop ebp > + ret ------------------------------------------------------------------------------ Slashdot TV. Video for Nerds. Stuff that matters. http://tv.slashdot.org/ _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel