Changeset 2855 for trunk/kLdr/kLdr.c


Ignore:
Timestamp:
Nov 4, 2006, 3:30:19 AM (19 years ago)
Author:
bird
Message:

More code.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/kLdr.c

    r2853 r2855  
    136136}
    137137
     138
     139/**
     140 * Compares arch+cpu some code was generated for with a arch+cpu for executing it
     141 * to see if it'll work out fine or not.
     142 *
     143 * @returns 0 if the code is compatible with the cpu.
     144 * @returns KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE if the arch+cpu isn't compatible with the code.
     145 * @param   enmCodeArch The architecture the code was generated for.
     146 * @param   enmCodeCpu  The cpu the code was generated for.
     147 * @param   enmArch     The architecture to run it on.
     148 * @param   enmCpu      The cpu to run it on.
     149 */
     150int kLdrCompareCpus(KLDRARCH enmCodeArch, KLDRCPU enmCodeCpu, KLDRARCH enmArch, KLDRCPU enmCpu)
     151{
     152    /*
     153     * Compare arch and cpu.
     154     */
     155    if (enmCodeArch != enmArch)
     156        return KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE;
     157
     158    /* exact match is nice. */
     159    if (enmCodeCpu == enmCpu)
     160        return 0;
     161    switch (enmArch)
     162    {
     163        case KLDRARCH_X86_16:
     164            if (enmCpu < KLDRCPU_FIRST_X86_16 || enmCpu > KLDRCPU_LAST_X86_16)
     165                return KLDR_ERR_INVALID_PARAMETER;
     166
     167            /* intel? */
     168            if (enmCodeCpu <= KLDRCPU_CORE2_16)
     169            {
     170                /* also intel? */
     171                if (enmCpu <= KLDRCPU_CORE2_16)
     172                    return enmCodeCpu <= enmCpu ? 0 : KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE;
     173                switch (enmCpu)
     174                {
     175                    case KLDRCPU_K6_16:
     176                        return enmCodeCpu <= KLDRCPU_I586 ? 0 : KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE;
     177                    case KLDRCPU_K7_16:
     178                    case KLDRCPU_K8_16:
     179                    default:
     180                        return enmCodeCpu <= KLDRCPU_I686 ? 0 : KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE;
     181                }
     182            }
     183            /* amd */
     184            return enmCpu >= KLDRCPU_K6_16 && enmCpu <= KLDRCPU_K8_16
     185                    ? 0 : KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE;
     186
     187        case KLDRARCH_X86_32:
     188            if (enmCpu < KLDRCPU_FIRST_X86_32 || enmCpu > KLDRCPU_LAST_X86_32)
     189                return KLDR_ERR_INVALID_PARAMETER;
     190
     191            /* blend? */
     192            if (enmCodeCpu == KLDRCPU_X86_32_BLEND)
     193                return 0;
     194
     195            /* intel? */
     196            if (enmCodeCpu <= KLDRCPU_CORE2_32)
     197            {
     198                /* also intel? */
     199                if (enmCpu <= KLDRCPU_CORE2_32)
     200                    return enmCodeCpu <= enmCpu ? 0 : KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE;
     201                switch (enmCpu)
     202                {
     203                    case KLDRCPU_K6:
     204                        return enmCodeCpu <= KLDRCPU_I586 ? 0 : KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE;
     205                    case KLDRCPU_K7:
     206                    case KLDRCPU_K8_32:
     207                    default:
     208                        return enmCodeCpu <= KLDRCPU_I686 ? 0 : KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE;
     209                }
     210            }
     211            /* amd */
     212            return enmCpu >= KLDRCPU_K6 && enmCpu <= KLDRCPU_K8_32
     213                    ? 0 : KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE;
     214
     215        case KLDRARCH_AMD64:
     216            if (enmCpu < KLDRCPU_FIRST_AMD64 || enmCpu > KLDRCPU_LAST_AMD64)
     217                return KLDR_ERR_INVALID_PARAMETER;
     218
     219            /* blend? */
     220            if (enmCodeCpu == KLDRCPU_AMD64_BLEND)
     221                return 0;
     222            /* this is simple for now. */
     223            return KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE;
     224
     225        default:
     226            break;
     227    }
     228    return KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE;
     229}
     230
     231
     232/**
     233 * Gets the arch+cpu of the calling cpu.
     234 *
     235 * @param   penmArch    Where to store the cpu architecture.
     236 * @param   penmCpu     Where to store the cpu brand/model.
     237 */
     238void kLdrGetArchCpu(PKLDRARCH penmArch, PKLDRCPU penmCpu)
     239{
     240#if defined(__x86_64__) || defined(_M_X64) || defined(__AMD64__) || defined(_M_AMD64)
     241    *penmArch = KLDRARCH_AMD64;
     242    *penmCpu = KLDRCPU_AMD64_BLEND; ///@todo check it using cpu.
     243
     244#elif defined(__i386__) || defined(_M_IX86)
     245    *penmArch = KLDRARCH_X86_32;
     246    *penmCpu = KLDRCPU_X86_32_BLEND; ///@todo check it using cpu.
     247
     248#else
     249# error "Port me"
     250#endif
     251}
Note: See TracChangeset for help on using the changeset viewer.