On Jul 17, 2013, at 2:06 PM, "Vardhana, Ananda" <[email protected]> 
wrote:

> Thanks Chip I shall do so. Here is what I would do please tell me if this 
> will work. Andrew really speaking I don’t care what the assembly program does 
> all I need is that I transition from executing from a regular C code to pure 
> assembly and back. Please don’t ask me why I want to do that … J

Well I spend time in my day job yelling at vendors that show up with edk2 code 
that does not compile for me due to a compiler specific usage of inline 
assemble, or only writing .asm files, when I need .S files. It is even worse 
when they are doing this for things that already exist in libraries in the 
MdePkg libraries. 

> Thanks
> Ananda
>  
> File 1:
> Junk.c:
> EFI_STATUS
> EFIAPI
> UefiMain (
>   IN EFI_HANDLE        ImageHandle,
>   IN EFI_SYSTEM_TABLE  *SystemTable
>   )
> {
>      RunAsmCode();
> }
> File 2:
> Bunk.asm
>  
>  


Your syntax looks a little different than the rest of the edk2 .asm files: 
https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/MdePkg/Library/BaseLib/X64/LongJump.asm
    .code

;------------------------------------------------------------------------------
; VOID
; EFIAPI
; InternalLongJump (
;   IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,
;   IN      UINTN                     Value
;   );
;------------------------------------------------------------------------------
InternalLongJump    PROC
    mov     rbx, [rcx]
    mov     rsp, [rcx + 8]
    mov     rbp, [rcx + 10h]
    mov     rdi, [rcx + 18h]
    mov     rsi, [rcx + 20h]
    mov     r12, [rcx + 28h]
    mov     r13, [rcx + 30h]
    mov     r14, [rcx + 38h]
    mov     r15, [rcx + 40h]
    ; load non-volatile fp registers
    ldmxcsr [rcx + 50h]
    movdqu  xmm6,  [rcx + 58h]
    movdqu  xmm7,  [rcx + 68h]
    movdqu  xmm8,  [rcx + 78h]
    movdqu  xmm9,  [rcx + 88h]
    movdqu  xmm10, [rcx + 98h]
    movdqu  xmm11, [rcx + 0A8h]
    movdqu  xmm12, [rcx + 0B8h]
    movdqu  xmm13, [rcx + 0C8h]
    movdqu  xmm14, [rcx + 0D8h]
    movdqu  xmm15, [rcx + 0E8h]
    mov     rax, rdx               ; set return value
    jmp     qword ptr [rcx + 48h]
InternalLongJump    ENDP

    END


>     LEAF_ENTRY RunAsmCode, _TEXT$00
>  
>         push    rbx
>         push    rax
>         push    rcx
>         push    rdx
>  

Looks like you don't understand the calling conventions. You should study up on 
them. 
RAX, RCX, RDX, R8, R9, R10, R11 are considered volatile and must be considered 
destroyed on function calls, so there is no reason to save them.
First 4 parameters – RCX, RDX, R8, R9. Others passed on stack.
The registers RBX, RBP, RDI, RSI, R12, R13, R14, and R15 are considered 
nonvolatile and must be saved and restored by a function that uses them.

>         mov     ebx, ecx
>  
>         mov     ecx, 0ffffffffh
>                /* More code will come here */
>         pop     rdx
>         pop     rcx
>         pop     rax
>         pop     rbx
>         ret
>     LEAF_END RunAsmCode, _TEXT$00
>  
>     end
>  

You also need a .S file: 
https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/MdePkg/Library/BaseLib/X64/LongJump.S
 to support all the compilers (Xcode/clang and gcc) that the edk2 supports. 

#------------------------------------------------------------------------------
# VOID
# EFIAPI
# InternalLongJump (
#   IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,
#   IN      UINTN                     Value
#   );
#------------------------------------------------------------------------------
ASM_GLOBAL ASM_PFX(InternalLongJump)
ASM_PFX(InternalLongJump):
    mov     (%rcx), %rbx
    mov     0x8(%rcx), %rsp
    mov     0x10(%rcx), %rbp
    mov     0x18(%rcx), %rdi
    mov     0x20(%rcx), %rsi
    mov     0x28(%rcx), %r12
    mov     0x30(%rcx), %r13
    mov     0x38(%rcx), %r14
    mov     0x40(%rcx), %r15
    # load non-volatile fp registers
    ldmxcsr 0x50(%rcx)
    movdqu  0x58(%rcx), %xmm6
    movdqu  0x68(%rcx), %xmm7
    movdqu  0x78(%rcx), %xmm8
    movdqu  0x88(%rcx), %xmm9
    movdqu  0x98(%rcx), %xmm10
    movdqu  0xA8(%rcx), %xmm11
    movdqu  0xB8(%rcx), %xmm12
    movdqu  0xC8(%rcx), %xmm13
    movdqu  0xD8(%rcx), %xmm14
    movdqu  0xE8(%rcx), %xmm15  
    mov     %rdx, %rax          # set return value
    jmp     *0x48(%rcx)

You then list the .asm/.S files in the INF file. The style of edk2 is to place 
processor specific code in a processor specific directory. 

So you can add an X64 directory to your driver and update the INF file to point 
at the the code.

[Sources.X64]
  X64/Bunk.asm
  X64/Bunk.S

Since VC++ only has a rule for .asm and not .S it compiles the .asm. Since 
GCC/Xcode have rules for .S and not .asm they only compile the .S file. 

Example: 
https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/MdePkg/Library/BaseLib/BaseLib.inf

Thanks,

Andrew Fish


> From: Chip Ueltschey [mailto:[email protected]] 
> Sent: Wednesday, July 17, 2013 1:54 PM
> To: Vardhana, Ananda
> Cc: [email protected]
> Subject: Re: [edk2] How to run assembly code in EFI
>  
> Inline assembly is not supported for 64-bit code.
> You would need to put your assembly code in a separate file.
> -chip
>  
> 
> On Wed, Jul 17, 2013 at 1:29 PM, Vardhana, Ananda <[email protected]> 
> wrote:
> I am new to EFI and have a very simple question. I want to compile this 
> following short program. I am running on a 64 bit machine and the EDKII is 
> also 64 bit. I have tried with _asm and __asm both failed. Might be I have to 
> use () instead of {}? I don’t know. Help pelase
>  
> EFI_STATUS
> EFIAPI
> UefiMain (
>   IN EFI_HANDLE        ImageHandle,
>   IN EFI_SYSTEM_TABLE  *SystemTable
>   )
> {
>  
>         _asm {
>                 push    ebx
>          push    eax
>          push    ecx
>          push    edx
>         /* Other code follows*/
> }
> }
>  
>  
>  
>  
>  
>  
> 
> ------------------------------------------------------------------------------
> See everything from the browser to the database with AppDynamics
> Get end-to-end visibility with application monitoring from AppDynamics
> Isolate bottlenecks and diagnose root cause in seconds.
> Start your free trial of AppDynamics Pro today!
> http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
> 
>  

------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to