On Thu, Jan 17, 2013 at 3:17 AM, Konstantin Filatov
<kfila...@parallels.com> wrote:
> Hello,
>
> this patch for CpuDxe has been developed further, so now I send an
> actual version of it. I still think it will useful for all you.
>
> Best regards,
> Konstantin Filatov
>
> Really this is a patch set, and I didn't merge it into a large patch
> applicable to the actual edk2-source. I have a reason for it. In this
> way this patch set will easier to understand, and it will scrutinized
> surely before a commit.

I think you should include your Contributed-under/Signed-off-by for
all versions of your series.

Given that you have so many patches in your series, you might consider
placing them in a fork of:
https://github.com/tianocore/edk2

Which toolchains, architectures and VM environments have you tested this with?

Thanks for your work on this!

-Jordan

> The beginning of this patch set.
>
> fixed SetCodeSelector
>
> --- CpuDxe/X64/CpuAsm.S
> +++ CpuDxe/X64/CpuAsm.S
> @@ -51,13 +51,13 @@ ASM_PFX(InitializeExternalVectorTablePtr):
>   
> #------------------------------------------------------------------------------
>   ASM_GLOBAL ASM_PFX(SetCodeSelector)
>   ASM_PFX(SetCodeSelector):
> -    subq    $0x10, %rsp
> +    subq    $0x14, %rsp
>       leaq    L_setCodeSelectorLongJump(%rip), %rax
>       movq    %rax, (%rsp)
> -    movw    %cx, 4(%rsp)
> -    .byte   0xFF, 0x2C, 0x24     # jmp (%rsp) note:fword jmp
> +    movw    %cx, 8(%rsp)
> +    .byte   0x48, 0xFF, 0x2C, 0x24     # REX.W jmp (%rsp) note:fword jmp
>   L_setCodeSelectorLongJump:
> -    addq    $0x10, %rsp
> +    addq    $0x14, %rsp
>       ret
>
>   
> #------------------------------------------------------------------------------
> --
>
> fixed a bug in CpuDxe in EFI
> IA32_DESCRIPTOR can have 64bit field Base regardless the name.
>
> --- CpuDxe/CpuDxe.c
> +++ CpuDxe/CpuDxe.c
> @@ -1192,7 +1192,7 @@ InitInterruptDescriptorTable (
>     //
>     IdtPtrAlignmentBuffer = AllocatePool (sizeof (*IdtPtr) + 16);
>     IdtPtr = ALIGN_POINTER (IdtPtrAlignmentBuffer, 16);
> -  IdtPtr->Base = (UINT32)(((UINTN)(VOID*) gIdtTable) & (BASE_4GB-1));
> +  IdtPtr->Base = (UINTN)(VOID*) gIdtTable;
>     IdtPtr->Limit = (UINT16) (sizeof (gIdtTable) - 1);
>
>     AsmWriteIdtr (IdtPtr);
> --
> --- CpuDxe/CpuGdt.c
> +++ CpuDxe/CpuGdt.c
> @@ -194,7 +194,7 @@ InitGlobalDescriptorTable (
>     //
>     // Write GDT register
>     //
> -  gdtPtr.Base = (UINT32)(UINTN)(VOID*) gdt;
> +  gdtPtr.Base = (UINTN)(VOID*) gdt;
>     gdtPtr.Limit = (UINT16) (sizeof (GdtTemplate) - 1);
>     AsmWriteGdtr (&gdtPtr);
>
> --
>
> refactoring RestoreInterrupt...() in EFI
>
> --- CpuDxe/CpuDxe.c
> +++ CpuDxe/CpuDxe.c
> @@ -1110,13 +1110,9 @@ RestoreInterruptDescriptorTableHandlerAddress (
>     IN UINTN       Index
>     )
>   {
> -  if (Index < mOrigIdtEntryCount) {
> -    gIdtTable[Index].Bits.OffsetLow   =
> mOrigIdtEntry[Index].Bits.OffsetLow;
> -    gIdtTable[Index].Bits.OffsetHigh  =
> mOrigIdtEntry[Index].Bits.OffsetHigh;
> -#if defined (MDE_CPU_X64)
> -    gIdtTable[Index].Bits.OffsetUpper =
> mOrigIdtEntry[Index].Bits.OffsetUpper;
> -#endif
> -  }
> +  if (Index >= mOrigIdtEntryCount)
> +    return;
> +  CopyMem(gIdtTable + Index, mOrigIdtEntry + Index,
> sizeof(gIdtTable[Index]));
>   }
>
>   /**
> --
>
> Fixed setting exception routines vector in EFI for on x64.
>
> --- CpuDxe/X64/CpuAsm.S
> +++ CpuDxe/X64/CpuAsm.S
> @@ -38,8 +38,8 @@ ExternalVectorTablePtr:
>
>   ASM_GLOBAL ASM_PFX(InitializeExternalVectorTablePtr)
>   ASM_PFX(InitializeExternalVectorTablePtr):
> -    lea     ExternalVectorTablePtr(%rip), %rax # save vector number
> -    mov     %rcx, (%rax)
> +    leaq    ExternalVectorTablePtr(%rip), %rax # save vector number
> +    movq    %rcx, (%rax)
>       ret
>
>
> @@ -249,7 +249,7 @@ CommonInterruptEntry_al_0000:
>   #; call into exception handler
>       movq    8(%rbp), %rcx
>       leaq    ExternalVectorTablePtr(%rip), %rax
> -    movl    (%eax), %eax
> +    movq    (%rax), %rax
>       movq    (%rax,%rcx,8), %rax
>       orq     %rax, %rax                        # NULL?
>
> --
>
> ported patch "fixed SetCodeSel() in EFI for x64"
> to MASM to allow build of EFI on Win32.
>
> --- CpuDxe/X64/CpuAsm.asm
> +++ CpuDxe/X64/CpuAsm.asm
> @@ -44,13 +44,19 @@ InitializeExternalVectorTablePtr ENDP
>   ;   );
>   
> ;------------------------------------------------------------------------------
>   SetCodeSelector PROC PUBLIC
> -    sub     rsp, 0x10
> +    sub     rsp, 0x14
>       lea     rax, setCodeSelectorLongJump
>       mov     [rsp], rax
> -    mov     [rsp+4], cx
> +    mov     [rsp+8], cx
> +    ;* I'm not sure how to encode this. We need to jmp [esp], where in
> esp there is
> +    ;* w16(selector):q64(address).
> +    ;* in gcc version this is encoded as 48 ff 2c 24 [ rex.W ljmpq
> *(%esp) ]
> +    ;* but in VC jmp qword ptr [rsp] generates code ff 24 24 [ jmpq
> *(%esp) ]
> +    ;* so I've just inserted db 0x48 to emit REX.W and get original 48
> ff 2c 24
> +    db 0x48 ; emit REX.W
>       jmp     fword ptr [rsp]
>   setCodeSelectorLongJump:
> -    add     rsp, 0x10
> +    add     rsp, 0x14
>       ret
>   SetCodeSelector ENDP
>
> --
>
> On AMD x64 JMP FAR cannot use 64-bit offset (see 24594, p. 137) and so
> cannot jump to code which is out of 32-bit space. Using IRETQ fixes this
> limitation.
>
> --- CpuDxe/X64/CpuAsm.S
> +++ CpuDxe/X64/CpuAsm.S
> @@ -51,13 +51,20 @@ ASM_PFX(InitializeExternalVectorTablePtr):
>   
> #------------------------------------------------------------------------------
>   ASM_GLOBAL ASM_PFX(SetCodeSelector)
>   ASM_PFX(SetCodeSelector):
> -    subq    $0x14, %rsp
> -    leaq    L_setCodeSelectorLongJump(%rip), %rax
> -    movq    %rax, (%rsp)
> -    movw    %cx, 8(%rsp)
> -    .byte   0x48, 0xFF, 0x2C, 0x24     # REX.W jmp (%rsp) note:fword jmp
> +    movq    %ss, %rax
> +    pushq   %rax
> +    movq    %rsp, %rax
> +    addq    $8, %rax
> +    pushq   %rax
> +    leaq    L_setCodeSelectorLongJump(%rip), %rax
> +    andq    $0xffff, %rcx
> +    pushfq
> +    pushq   %rcx
> +    pushq   %rax
> +    # iretq is used, because this method of changing 32-bit code
> selector to 64-bit
> +    # will work correctly on both Intel and AMD.
> +    iretq
>   L_setCodeSelectorLongJump:
> -    addq    $0x14, %rsp
>       ret
>
>   
> #------------------------------------------------------------------------------
> --
>
> --- CpuDxe/X64/CpuAsm.asm
> +++ CpuDxe/X64/CpuAsm.asm
> @@ -44,19 +44,20 @@ InitializeExternalVectorTablePtr ENDP
>   ;   );
>   
> ;------------------------------------------------------------------------------
>   SetCodeSelector PROC PUBLIC
> -    sub     rsp, 0x14
> +    mov     rax, ss
> +    push    rax
> +    mov     rax, rsp
> +    add     rax, 8
> +    push    rax
>       lea     rax, setCodeSelectorLongJump
> -    mov     [rsp], rax
> -    mov     [rsp+8], cx
> -    ;* I'm not sure how to encode this. We need to jmp [esp], where in
> esp there is
> -    ;* w16(selector):q64(address).
> -    ;* in gcc version this is encoded as 48 ff 2c 24 [ rex.W ljmpq
> *(%esp) ]
> -    ;* but in VC jmp qword ptr [rsp] generates code ff 24 24 [ jmpq
> *(%esp) ]
> -    ;* so I've just inserted db 0x48 to emit REX.W and get original 48
> ff 2c 24
> -    db 0x48 ; emit REX.W
> -    jmp     fword ptr [rsp]
> +    and     rcx, 0xffff
> +    pushfq
> +    push    rcx
> +    push    rax
> +    ; iretq is used, because this method of changing 32-bit code
> selector to 64-bit
> +    ; will work correctly on both Intel and AMD.
> +    iretq
>   setCodeSelectorLongJump:
> -    add     rsp, 0x14
>       ret
>   SetCodeSelector ENDP
>
> --
>
> The end of this patch set.
>
> On 11/14/2012 02:40 PM, Konstantin Filatov wrote:
>> Hello,
>>
>> In order to make the upper memory usable, it has to be "tested". This
>> patch works for me and seems useful for TianoCore.
>>
>> This patch resolves a problem of 4gb limit.
>>
>> Best regards,
>> Konstantin Filatov
>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Konstantin Filatov <kfila...@parallels.com>
>>
>> Index: UefiCpuPkg/CpuDxe/X64/CpuAsm.S
>> ===================================================================
>> --- UefiCpuPkg/CpuDxe/X64/CpuAsm.S    (revision 13937)
>> +++ UefiCpuPkg/CpuDxe/X64/CpuAsm.S    (working copy)
>> @@ -45,13 +45,13 @@
>>  
>> #------------------------------------------------------------------------------
>>
>>  ASM_GLOBAL ASM_PFX(SetCodeSelector)
>>  ASM_PFX(SetCodeSelector):
>> -    subq    $0x10, %rsp
>> +    subq    $0x14, %rsp
>>      leaq    L_setCodeSelectorLongJump(%rip), %rax
>>      movq    %rax, (%rsp)
>> -    movw    %cx, 4(%rsp)
>> -    .byte   0xFF, 0x2C, 0x24     # jmp (%rsp) note:fword jmp
>> +    movw    %cx, 8(%rsp)
>> +    .byte   0x48, 0xFF, 0x2C, 0x24     # REX.W jmp (%rsp) note:fword jmp
>>  L_setCodeSelectorLongJump:
>> -    addq    $0x10, %rsp
>> +    addq    $0x14, %rsp
>>      ret
>>
>>  
>> #------------------------------------------------------------------------------
>>
>> Index: UefiCpuPkg/CpuDxe/CpuGdt.c
>> ===================================================================
>> --- UefiCpuPkg/CpuDxe/CpuGdt.c    (revision 13937)
>> +++ UefiCpuPkg/CpuDxe/CpuGdt.c    (working copy)
>> @@ -187,7 +187,7 @@
>>    //
>>    // Write GDT register
>>    //
>> -  gdtPtr.Base = (UINT32)(UINTN)(VOID*) gdt;
>> +  gdtPtr.Base = (UINTN)(VOID*) gdt;
>>    gdtPtr.Limit = (UINT16) (sizeof (GdtTemplate) - 1);
>>    AsmWriteGdtr (&gdtPtr);
>>
>> Index: UefiCpuPkg/CpuDxe/CpuDxe.c
>> ===================================================================
>> --- UefiCpuPkg/CpuDxe/CpuDxe.c    (revision 13937)
>> +++ UefiCpuPkg/CpuDxe/CpuDxe.c    (working copy)
>> @@ -1184,7 +1184,7 @@
>>    //
>>    IdtPtrAlignmentBuffer = AllocatePool (sizeof (*IdtPtr) + 16);
>>    IdtPtr = ALIGN_POINTER (IdtPtrAlignmentBuffer, 16);
>> -  IdtPtr->Base = (UINT32)(((UINTN)(VOID*) gIdtTable) & (BASE_4GB-1));
>> +  IdtPtr->Base = (UINTN)(VOID*) gIdtTable;
>>    IdtPtr->Limit = (UINT16) (sizeof (gIdtTable) - 1);
>>
>>    AsmWriteIdtr (IdtPtr);
>> Index: OvmfPkg/PlatformPei/MemDetect.c
>> ===================================================================
>> --- OvmfPkg/PlatformPei/MemDetect.c    (revision 13937)
>> +++ OvmfPkg/PlatformPei/MemDetect.c    (working copy)
>> @@ -136,7 +136,7 @@
>>    MtrrSetMemoryAttribute (0, BASE_512KB + BASE_128KB, CacheWriteBack);
>>
>>    if (UpperMemorySize != 0) {
>> -    AddUntestedMemoryBaseSizeHob (BASE_4GB, UpperMemorySize);
>> +    AddMemoryBaseSizeHob (BASE_4GB, UpperMemorySize);
>>
>>      MtrrSetMemoryAttribute (BASE_4GB, UpperMemorySize, CacheWriteBack);
>>    }
>>
>
>
> ------------------------------------------------------------------------------
> Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
> MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
> with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
> MVPs and experts. ON SALE this month only -- learn more at:
> http://p.sf.net/sfu/learnmore_122712
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------------------------------------------------------
Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
MVPs and experts. ON SALE this month only -- learn more at:
http://p.sf.net/sfu/learnnow-d2d
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to