Home | History | Annotate | Download | only in X64
      1 #------------------------------------------------------------------------------
      2 #
      3 # Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
      4 # This program and the accompanying materials
      5 # are licensed and made available under the terms and conditions of the BSD License
      6 # which accompanies this distribution.  The full text of the license may be found at
      7 # http://opensource.org/licenses/bsd-license.php.
      8 #
      9 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     10 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     11 #
     12 # Module Name:
     13 #
     14 #   CpuIdEx.S
     15 #
     16 # Abstract:
     17 #
     18 #   AsmCpuidEx function
     19 #
     20 # Notes:
     21 #
     22 #------------------------------------------------------------------------------
     23 
     24 #------------------------------------------------------------------------------
     25 #  UINT32
     26 #  EFIAPI
     27 #  AsmCpuidEx (
     28 #    IN   UINT32  RegisterInEax,
     29 #    IN   UINT32  RegisterInEcx,
     30 #    OUT  UINT32  *RegisterOutEax  OPTIONAL,
     31 #    OUT  UINT32  *RegisterOutEbx  OPTIONAL,
     32 #    OUT  UINT32  *RegisterOutEcx  OPTIONAL,
     33 #    OUT  UINT32  *RegisterOutEdx  OPTIONAL
     34 #    )
     35 #------------------------------------------------------------------------------
     36 ASM_GLOBAL ASM_PFX(AsmCpuidEx)
     37 ASM_PFX(AsmCpuidEx):
     38     push    %rbx
     39     movl    %ecx,%eax
     40     movl    %edx,%ecx
     41     push    %rax                  # save Index on stack
     42     cpuid
     43     mov     0x38(%rsp), %r10
     44     test    %r10, %r10
     45     jz      L1
     46     mov     %ecx,(%r10)
     47 L1:
     48     mov     %r8, %rcx
     49     jrcxz   L2
     50     movl    %eax,(%rcx)
     51 L2:
     52     mov     %r9, %rcx
     53     jrcxz   L3
     54     mov     %ebx, (%rcx)
     55 L3:
     56     mov     0x40(%rsp), %rcx
     57     jrcxz   L4
     58     mov     %edx, (%rcx)
     59 L4:
     60     pop     %rax                  # restore Index to rax as return value
     61     pop     %rbx
     62     ret
     63