Hi David,
The THunk16.S is wrong again.
1. I see you excluded .byte 66 and this leads to wrong codes:
see dissassembled output:
———————
0000003a 16 push ss
^
│0000003b 0e push cs
│0000003c e80000 call 0x3f
▒
│0000003f 0000 add [bx+si], al
▒
│00000041 9c pushf
▒
│00000042 fa cli
▒
│00000043 0fa8 push gs
▒
│00000045 0fa0 push fs
▒
│00000047 06 push es
▒
│00000048 1e push ds
—————————
call 0x3f followed by two zero bytes.
Previous codes have prefix 66 here.
2. this change also wrong
- movl $0x15cd2401, %eax # mov ax, 2401h & int 15h
+ movw $0x2401, %ax
+ int $0x15
it produces
00000053 7409 jz 0x5e
▒
│00000055 66b80124cd15 mov eax, 15cd2401
▒
│0000005b fa cli
▒
│0000005c 730b jnc 0x69
▒
│0000005e f6c204 test dl, 0x4
▒
instead of int 15
Compiled by gcc-4.8.1
Dissassembled by ht (http://hte.sf.net). It switchable to code16 and code32
depending on what part we look.
Revise, please, the sources
Sergey.
On 29 нояб. 2013 г., at 20:14, David Woodhouse <dw...@infradead.org> wrote:
> Again.
>
> Properly this time.
>
> In r12889 we attempted to clean this up, but we missed a vital part of
> it, so it was reverted in r12898.
>
> What we missed was the fact that much of this is 16-bit code, and the
> assembler didn't *know* that — it thought it was compiling 32-bit code
> and we had even gone out of our way to entertain that fiction, for
> example writing:
> mov %edx, %cs:0xffffffc5(%esi)
> when we really meant:
> mov %dx, %cs:(SavedSs - L_Base)(%bp)
>
> Note that even the *registers* are different here. The address really is
> based on %bp, not %esi. We only said %esi to trick the assembler.
>
> If we're lying to the assembler about the context and it doesn't even
> know whether operands are 32-bit or 16-bit, how on earth did we expect
> it to calculate offsets correctly for us? Of *course* it went wrong!
>
> So this brings back the fixes from r12889, and also fixes up the 16-bit
> code to be sane again. Doing a direct comparison of the output I see
> some minor changes, mostly because the compiler can't output 8-bit
> relocations in x86_32 ELF, so even if an offset does fit in 8 bits, the
> assembler will use a 16-bit offset instead. So we get minor differences
> in the output such as:
>
> - ab: 8d 46 0c lea 0xc(%bp),%ax
> + ab: 8d 86 0d 00 lea 0xd(%bp),%ax
>
> but those really are harmless — at least they are now that we aren't
> hard-coding addresses and breaking because code moves around by a single
> byte!
>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: David Woodhouse <david.woodho...@intel.com>
> ---
> MdePkg/Library/BaseLib/Ia32/Thunk16.S | 121 ++++++++++++++++++++--------------
> 1 file changed, 71 insertions(+), 50 deletions(-)
>
> diff --git a/MdePkg/Library/BaseLib/Ia32/Thunk16.S
> b/MdePkg/Library/BaseLib/Ia32/Thunk16.S
> index 8356c5a..331ea16 100644
> --- a/MdePkg/Library/BaseLib/Ia32/Thunk16.S
> +++ b/MdePkg/Library/BaseLib/Ia32/Thunk16.S
> @@ -24,6 +24,28 @@
> ASM_GLOBAL ASM_PFX(m16Start), ASM_PFX(m16Size), ASM_PFX(mThunk16Attr),
> ASM_PFX(m16Gdt), ASM_PFX(m16GdtrBase), ASM_PFX(mTransition)
> ASM_GLOBAL ASM_PFX(InternalAsmThunk16)
>
> +# define the structure of IA32_REGS
> +.set _EDI, 0 #size 4
> +.set _ESI, 4 #size 4
> +.set _EBP, 8 #size 4
> +.set _ESP, 12 #size 4
> +.set _EBX, 16 #size 4
> +.set _EDX, 20 #size 4
> +.set _ECX, 24 #size 4
> +.set _EAX, 28 #size 4
> +.set _DS, 32 #size 2
> +.set _ES, 34 #size 2
> +.set _FS, 36 #size 2
> +.set _GS, 38 #size 2
> +.set _EFLAGS, 40 #size 4
> +.set _EIP, 44 #size 4
> +.set _CS, 48 #size 2
> +.set _SS, 50 #size 2
> +.set IA32_REGS_SIZE, 52
> +
> + .text
> + .code16
> +
> ASM_PFX(m16Start):
>
> SavedGdt: .space 6
> @@ -31,21 +53,22 @@ SavedGdt: .space 6
> ASM_PFX(BackFromUserCode):
> push %ss
> push %cs
> - .byte 0x66
> - call L_Base1 # push eip
> +
> + calll L_Base1 # push eip
> L_Base1:
> - pushfw # pushfd actually
> + pushfl
> cli # disable interrupts
> push %gs
> push %fs
> push %es
> push %ds
> - pushaw # pushad actually
> + pushal
> .byte 0x66, 0xba # mov edx, imm32
> ASM_PFX(ThunkAttr): .space 4
> testb $THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15, %dl
> jz 1f
> - movl $0x15cd2401, %eax # mov ax, 2401h & int 15h
> + movw $0x2401, %ax
> + int $0x15
> cli # disable interrupts
> jnc 2f
> 1:
> @@ -55,27 +78,26 @@ ASM_PFX(ThunkAttr): .space 4
> orb $2, %al
> outb %al, $0x92 # deactivate A20M#
> 2:
> - xorw %ax, %ax # xor eax, eax
> - movl %ss, %eax # mov ax, ss
> - .byte 0x67, 0x66, 0x8d, 0x6c, 0x24, 0x34, 0x66
> - mov %ebp, 0xffffffd8(%esi)
> - mov 0xfffffff8(%esi), %ebx
> - shlw $4, %ax # shl eax, 4
> - addw %ax, %bp # add ebp, eax
> - .byte 0x66, 0xb8 # mov eax, imm32
> + xorl %eax, %eax
> + movw %ss, %ax
> + leal IA32_REGS_SIZE(%esp), %ebp
> + mov %ebp, (_ESP - IA32_REGS_SIZE)(%bp)
> + mov (_EIP - IA32_REGS_SIZE)(%bp), %bx
> + shll $4, %eax
> + addl %eax, %ebp
> + .byte 0x66, 0xb8 # mov eax, imm32
> SavedCr4: .space 4
> movl %eax, %cr4
> - lgdtw %cs:0xfffffff2(%edi)
> - .byte 0x66, 0xb8 # mov eax, imm32
> + lgdtl %cs:(SavedGdt - L_Base1)(%bx)
> + .byte 0x66, 0xb8 # mov eax, imm32
> SavedCr0: .space 4
> movl %eax, %cr0
> .byte 0xb8 # mov ax, imm16
> SavedSs: .space 2
> movl %eax, %ss
> - .byte 0x66, 0xbc # mov esp, imm32
> + .byte 0x66, 0xbc # mov esp, imm32
> SavedEsp: .space 4
> - .byte 0x66
> - lret # return to protected mode
> + lretl # return to protected mode
>
> _EntryPoint: .long ASM_PFX(ToUserCode) - ASM_PFX(m16Start)
> .word 0x8
> @@ -85,37 +107,35 @@ _16Gdtr: .word GdtEnd - _NullSegDesc - 1
> _16GdtrBase: .long _NullSegDesc
>
> ASM_PFX(ToUserCode):
> - movl %ss, %edx
> - movl %ecx, %ss # set new segment selectors
> - movl %ecx, %ds
> - movl %ecx, %es
> - movl %ecx, %fs
> - movl %ecx, %gs
> + movw %ss, %dx
> + movw %cx, %ss # set new segment selectors
> + movw %cx, %ds
> + movw %cx, %es
> + movw %cx, %fs
> + movw %cx, %gs
> movl %eax, %cr0
> movl %ebp, %cr4 # real mode starts at next instruction
> - movl %esi, %ss # set up 16-bit stack segment
> - xchgw %bx, %sp # set up 16-bit stack pointer
> - .byte 0x66
> - call L_Base # push eip
> + movw %si, %ss # set up 16-bit stack segment
> + xchgl %ebx, %esp # set up 16-bit stack pointer
> + calll L_Base # push eip
> L_Base:
> - popw %bp # ebp <- offset L_Base
> - .byte 0x67; # address size override
> - push 54(%esp)
> - lea 0xc(%esi), %eax
> - push %eax
> + popl %ebp # ebp <- offset L_Base
> + push (IA32_REGS_SIZE + 2)(%esp)
> + lea (L_RealMode - L_Base)(%bp), %ax
> + push %ax
> lret
>
> L_RealMode:
> - mov %edx, %cs:0xffffffc5(%esi)
> - mov %bx, %cs:0xffffffcb(%esi)
> - lidtw %cs:0xffffffd7(%esi)
> - popaw # popad actually
> + mov %dx, %cs:(SavedSs - L_Base)(%bp)
> + mov %ebx, %cs:(SavedEsp - L_Base)(%bp)
> + lidtl %cs:(_16Idtr - L_Base)(%bp)
> + popal
> pop %ds
> pop %es
> pop %fs
> pop %gs
> - popfw # popfd
> - lretw # transfer control to user code
> + popfl
> + lretl # transfer control to user code
>
> _NullSegDesc: .quad 0
> _16CsDesc:
> @@ -134,6 +154,7 @@ _16DsDesc:
> .byte 0
> GdtEnd:
>
> + .code32
> #
> # @param RegSet The pointer to a IA32_DWORD_REGS structure
> # @param Transition The pointer to the transition code
> @@ -149,41 +170,41 @@ ASM_PFX(InternalAsmThunk16):
> push %fs
> push %gs
> movl 36(%esp), %esi # esi <- RegSet
> - movzwl 0x32(%esi), %edx
> - mov 0xc(%esi), %edi
> - add $0xffffffc8, %edi
> + movzwl _SS(%esi), %edx
> + mov _ESP(%esi), %edi
> + add $(-(IA32_REGS_SIZE + 4)), %edi
> movl %edi, %ebx # ebx <- stack offset
> imul $0x10, %edx, %eax
> - push $0xd
> + push $(IA32_REGS_SIZE / 4)
> addl %eax, %edi # edi <- linear address of 16-bit
> stack
> pop %ecx
> rep
> movsl # copy RegSet
> movl 40(%esp), %eax # eax <- address of transition code
> movl %edx, %esi # esi <- 16-bit stack segment
> - lea 0x61(%eax), %edx
> + lea (SavedCr0 - ASM_PFX(m16Start))(%eax), %edx
> movl %eax, %ecx
> andl $0xf, %ecx
> shll $12, %eax
> - lea 0x6(%ecx), %ecx
> + lea (ASM_PFX(BackFromUserCode) - ASM_PFX(m16Start))(%ecx), %ecx
> movw %cx, %ax
> stosl # [edi] <- return address of user code
> - sgdtl 0xffffff9f(%edx)
> + sgdtl (SavedGdt - SavedCr0)(%edx)
> sidtl 0x24(%esp)
> movl %cr0, %eax
> movl %eax, (%edx) # save CR0 in SavedCr0
> andl $0x7ffffffe, %eax # clear PE, PG bits
> movl %cr4, %ebp
> - mov %ebp, 0xfffffff1(%edx)
> + mov %ebp, (SavedCr4 - SavedCr0)(%edx)
> andl $0xffffffcf, %ebp # clear PAE, PSE bits
> pushl $0x10
> pop %ecx # ecx <- selector for data segments
> - lgdtl 0x20(%edx)
> + lgdtl (_16Gdtr - SavedCr0)(%edx)
> pushfl
> - lcall *0x14(%edx)
> + lcall *(_EntryPoint - SavedCr0)(%edx)
> popfl
> lidtl 0x24(%esp)
> - lea 0xffffffcc(%ebp), %eax
> + lea -IA32_REGS_SIZE(%ebp), %eax
> pop %gs
> pop %fs
> pop %es
> --
> 1.8.3.1
>
>
> --
> David Woodhouse Open Source Technology Centre
> david.woodho...@intel.com Intel Corporation
> ------------------------------------------------------------------------------
> Rapidly troubleshoot problems before they affect your business. Most IT
> organizations don't have a clear picture of how application performance
> affects their revenue. With AppDynamics, you get 100% visibility into your
> Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
> http://pubads.g.doubleclick.net/gampad/clk?id=84349351&iu=/4140/ostg.clktrk_______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
------------------------------------------------------------------------------
Managing the Performance of Cloud-Based Applications
Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
Read the Whitepaper.
http://pubads.g.doubleclick.net/gampad/clk?id=121051231&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel