1f45af90b0195eb9712609d3af91d523edc371115qhuang#/** @file
2f45af90b0195eb9712609d3af91d523edc371115qhuang#
3f45af90b0195eb9712609d3af91d523edc371115qhuang#    Low level IA32 specific EBC support routines.
4f45af90b0195eb9712609d3af91d523edc371115qhuang#
5fa97cbf4ef6f4fd2dc0312c09b6b5003780facb8jyao#  Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
6e5eed7d3641d71d7ea539e5379ea9c6a5cd97004hhtian#  This program and the accompanying materials
7f45af90b0195eb9712609d3af91d523edc371115qhuang#  are licensed and made available under the terms and conditions of the BSD License
8f45af90b0195eb9712609d3af91d523edc371115qhuang#  which accompanies this distribution.  The full text of the license may be found at
9f45af90b0195eb9712609d3af91d523edc371115qhuang#  http://opensource.org/licenses/bsd-license.php
10f45af90b0195eb9712609d3af91d523edc371115qhuang#
11f45af90b0195eb9712609d3af91d523edc371115qhuang#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12f45af90b0195eb9712609d3af91d523edc371115qhuang#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13f45af90b0195eb9712609d3af91d523edc371115qhuang#
147b414b4ed6ccdefce8e167ecc7d67ad64118eb94vanjeff#**/
157b414b4ed6ccdefce8e167ecc7d67ad64118eb94vanjeff
16132f41f0a92082775d931067089a63ca50367225xliASM_GLOBAL ASM_PFX(CopyMem)
177102b199613eaef6d28e89f72783e35f15cf6b8cjyaoASM_GLOBAL ASM_PFX(EbcInterpret)
187102b199613eaef6d28e89f72783e35f15cf6b8cjyaoASM_GLOBAL ASM_PFX(ExecuteEbcImageEntryPoint)
1953c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang
20132f41f0a92082775d931067089a63ca50367225xliASM_GLOBAL ASM_PFX(EbcLLCALLEXNative)
2153c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuangASM_PFX(EbcLLCALLEXNative):
2253c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         push   %ebp
2353c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         push   %ebx
2453c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         mov    %esp,%ebp
2553c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         mov    0xc(%esp),%ecx
2653c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         mov    0x14(%esp),%eax
2753c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         mov    0x10(%esp),%edx
2853c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         sub    %edx,%eax
2953c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         sub    %eax,%esp
3053c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         mov    %esp,%ebx
3153c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         push   %ecx
3253c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         push   %eax
3353c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         push   %edx
3453c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         push   %ebx
3553c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         call   ASM_PFX(CopyMem)
3653c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         pop    %eax
3753c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         pop    %eax
3853c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         pop    %eax
3953c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         pop    %ecx
4053c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         call   *%ecx
4153c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         mov    %ebp,%esp
4253c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         mov    %ebp,%esp
4353c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         pop    %ebx
4453c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang         pop    %ebp
457b414b4ed6ccdefce8e167ecc7d67ad64118eb94vanjeff         ret
4653c71d097b13311e2bd8dda6ae54b5766a1c7d6dqhuang
477102b199613eaef6d28e89f72783e35f15cf6b8cjyaoASM_GLOBAL ASM_PFX(EbcLLEbcInterpret)
487102b199613eaef6d28e89f72783e35f15cf6b8cjyaoASM_PFX(EbcLLEbcInterpret):
497102b199613eaef6d28e89f72783e35f15cf6b8cjyao    # Construct new stack
507102b199613eaef6d28e89f72783e35f15cf6b8cjyao    push %ebp
517102b199613eaef6d28e89f72783e35f15cf6b8cjyao    mov  %esp, %ebp
527102b199613eaef6d28e89f72783e35f15cf6b8cjyao    push %esi
537102b199613eaef6d28e89f72783e35f15cf6b8cjyao    push %edi
547102b199613eaef6d28e89f72783e35f15cf6b8cjyao    sub  $0x40, %esp
557102b199613eaef6d28e89f72783e35f15cf6b8cjyao    push %eax
567102b199613eaef6d28e89f72783e35f15cf6b8cjyao    mov  %ebp, %esi
577102b199613eaef6d28e89f72783e35f15cf6b8cjyao    add  $0x8, %esi
587102b199613eaef6d28e89f72783e35f15cf6b8cjyao    mov  %esp, %edi
597102b199613eaef6d28e89f72783e35f15cf6b8cjyao    add  $0x4, %edi
607102b199613eaef6d28e89f72783e35f15cf6b8cjyao    mov  $0x10, %ecx
617102b199613eaef6d28e89f72783e35f15cf6b8cjyao    rep  movsd
627102b199613eaef6d28e89f72783e35f15cf6b8cjyao
637102b199613eaef6d28e89f72783e35f15cf6b8cjyao    # call C-code
647102b199613eaef6d28e89f72783e35f15cf6b8cjyao    call ASM_PFX(EbcInterpret)
657102b199613eaef6d28e89f72783e35f15cf6b8cjyao    add  $0x44, %esp
667102b199613eaef6d28e89f72783e35f15cf6b8cjyao    pop  %edi
677102b199613eaef6d28e89f72783e35f15cf6b8cjyao    pop  %esi
687102b199613eaef6d28e89f72783e35f15cf6b8cjyao    pop  %ebp
697102b199613eaef6d28e89f72783e35f15cf6b8cjyao    ret
707102b199613eaef6d28e89f72783e35f15cf6b8cjyao
717102b199613eaef6d28e89f72783e35f15cf6b8cjyaoASM_GLOBAL ASM_PFX(EbcLLExecuteEbcImageEntryPoint)
727102b199613eaef6d28e89f72783e35f15cf6b8cjyaoASM_PFX(EbcLLExecuteEbcImageEntryPoint):
737102b199613eaef6d28e89f72783e35f15cf6b8cjyao    # Construct new stack
747102b199613eaef6d28e89f72783e35f15cf6b8cjyao    mov  %eax, -0xC(%esp)
757102b199613eaef6d28e89f72783e35f15cf6b8cjyao    mov  0x4(%esp), %eax
767102b199613eaef6d28e89f72783e35f15cf6b8cjyao    mov  %eax, -0x8(%esp)
777102b199613eaef6d28e89f72783e35f15cf6b8cjyao    mov  0x8(%esp), %eax
787102b199613eaef6d28e89f72783e35f15cf6b8cjyao    mov  %eax, -0x4(%esp)
797102b199613eaef6d28e89f72783e35f15cf6b8cjyao    # call C-code
807102b199613eaef6d28e89f72783e35f15cf6b8cjyao    sub  $0xC, %esp
817102b199613eaef6d28e89f72783e35f15cf6b8cjyao    call ASM_PFX(ExecuteEbcImageEntryPoint)
827102b199613eaef6d28e89f72783e35f15cf6b8cjyao    add  $0xC, %esp
837102b199613eaef6d28e89f72783e35f15cf6b8cjyao    ret
84