⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _cpuinfo.asm

📁 gumstiz u-boot loader in linux
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;****************************************************************************;*;*                  SciTech OS Portability Manager Library;*;*  ========================================================================;*;*    The contents of this file are subject to the SciTech MGL Public;*    License Version 1.0 (the "License"); you may not use this file;*    except in compliance with the License. You may obtain a copy of;*    the License at http://www.scitechsoft.com/mgl-license.txt;*;*    Software distributed under the License is distributed on an;*    "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or;*    implied. See the License for the specific language governing;*    rights and limitations under the License.;*;*    The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.;*;*    The Initial Developer of the Original Code is SciTech Software, Inc.;*    All Rights Reserved.;*;*  ========================================================================;*;* Language:    NASM or TASM Assembler;* Environment: Intel 32 bit Protected Mode.;*;* Description: Code to determine the Intel processor type.;*;****************************************************************************        IDEALinclude "scitech.mac"header      _cpuinfobegdataseg  _cpuinfo                ; Start of data segmentcache_id    db  "01234567890123456"intel_id    db  "GenuineIntel"      ; Intel vendor IDcyrix_id    db  "CyrixInstead"      ; Cyrix vendor IDamd_id      db  "AuthenticAMD"      ; AMD vendor IDidt_id      db  "CentaurHauls"      ; IDT vendor IDCPU_IDT     EQU 01000h              ; Flag for IDT processorsCPU_Cyrix   EQU 02000h              ; Flag for Cyrix processorsCPU_AMD     EQU 04000h              ; Flag for AMD processorsCPU_Intel   EQU 08000h              ; Flag for Intel processorsenddataseg  _cpuinfobegcodeseg  _cpuinfo                ; Start of code segmentifdef   USE_NASM%macro mCPU_ID 0db  00Fh,0A2h%endmacroelseMACRO   mCPU_IDdb  00Fh,0A2hENDMendififdef   USE_NASM%macro mRDTSC 0db  00Fh,031h%endmacroelseMACRO   mRDTSCdb  00Fh,031hENDMendif;----------------------------------------------------------------------------; bool _CPU_check80386(void);----------------------------------------------------------------------------; Determines if we have an i386 processor.;----------------------------------------------------------------------------cprocstart  _CPU_check80386        enter_c        xor     edx,edx             ; EDX = 0, not an 80386        mov     bx, spifdef   USE_NASM        and     sp, ~3else        and     sp, not 3endif        pushfd                      ; Push original EFLAGS        pop     eax                 ; Get original EFLAGS        mov     ecx, eax            ; Save original EFLAGS        xor     eax, 40000h         ; Flip AC bit in EFLAGS        push    eax                 ; Save new EFLAGS value on                                    ;   stack        popfd                       ; Replace current EFLAGS value        pushfd                      ; Get new EFLAGS        pop     eax                 ; Store new EFLAGS in EAX        xor     eax, ecx            ; Can't toggle AC bit,                                    ;   processor=80386        jnz     @@Done              ; Jump if not an 80386 processor        inc     edx                 ; We have an 80386@@Done: push    ecx        popfd        mov     sp, bx        mov     eax, edx        leave_c        retcprocend;----------------------------------------------------------------------------; bool _CPU_check80486(void);----------------------------------------------------------------------------; Determines if we have an i486 processor.;----------------------------------------------------------------------------cprocstart  _CPU_check80486        enter_c; Distinguish between the i486 and Pentium by the ability to set the ID flag; in the EFLAGS register. If the ID flag is set, then we can use the CPUID; instruction to determine the final version of the chip. Otherwise we; simply have an 80486.; Distinguish between the i486 and Pentium by the ability to set the ID flag; in the EFLAGS register. If the ID flag is set, then we can use the CPUID; instruction to determine the final version of the chip. Otherwise we; simply have an 80486.        pushfd                      ; Get original EFLAGS        pop     eax        mov     ecx, eax        xor     eax, 200000h        ; Flip ID bit in EFLAGS        push    eax                 ; Save new EFLAGS value on stack        popfd                       ; Replace current EFLAGS value        pushfd                      ; Get new EFLAGS        pop     eax                 ; Store new EFLAGS in EAX        xor     eax, ecx            ; Can not toggle ID bit,        jnz     @@1                 ; Processor=80486        mov     eax,1               ; We dont have a Pentium        jmp     @@Done@@1:    mov     eax,0               ; We have Pentium or later@@Done: leave_c        retcprocend;----------------------------------------------------------------------------; bool _CPU_checkClone(void);----------------------------------------------------------------------------; Checks if the i386 or i486 processor is a clone or genuine Intel.;----------------------------------------------------------------------------cprocstart  _CPU_checkClone        enter_c        mov     ax,5555h            ; Check to make sure this is a 32-bit processor        xor     dx,dx        mov     cx,2h        div     cx                  ; Perform Division        clc        jnz     @@NoClone        jmp     @@Clone@@NoClone:        stc@@Clone:        pushfd        pop     eax                 ; Get the flags        and     eax,1        xor     eax,1               ; EAX=0 is probably Intel, EAX=1 is a Clone        leave_c        retcprocend;----------------------------------------------------------------------------; bool _CPU_haveCPUID(void);----------------------------------------------------------------------------; Determines if we have support for the CPUID instruction.;----------------------------------------------------------------------------cprocstart  _CPU_haveCPUID        enter_cifdef flatmodel        pushfd                      ; Get original EFLAGS        pop     eax        mov     ecx, eax        xor     eax, 200000h        ; Flip ID bit in EFLAGS        push    eax                 ; Save new EFLAGS value on stack        popfd                       ; Replace current EFLAGS value        pushfd                      ; Get new EFLAGS        pop     eax                 ; Store new EFLAGS in EAX        xor     eax, ecx            ; Can not toggle ID bit,        jnz     @@1                 ; Processor=80486        mov     eax,0               ; We dont have CPUID support        jmp     @@Done@@1:    mov     eax,1               ; We have CPUID supportelse        mov     eax,0               ; CPUID requires 32-bit pmodeendif@@Done: leave_c        retcprocend;----------------------------------------------------------------------------; uint _CPU_checkCPUID(void);----------------------------------------------------------------------------; Determines the CPU type using the CPUID instruction.;----------------------------------------------------------------------------cprocstart  _CPU_checkCPUID        enter_c        xor     eax, eax            ; Set up for CPUID instruction        mCPU_ID                     ; Get and save vendor ID        cmp     eax, 1              ; Make sure 1 is valid input for CPUID        jl      @@Fail              ; We dont have the CPUID instruction        xor     eax,eax             ; Assume vendor is unknown; Check for GenuineIntel processors        LEA_L   esi,intel_id        cmp     [DWORD esi], ebx        jne     @@NotIntel        cmp     [DWORD esi+4], edx        jne     @@NotIntel        cmp     [DWORD esi+8], ecx        jne     @@NotIntel        mov     eax,CPU_Intel       ; Flag that we have GenuineIntel        jmp     @@FoundVendor; Check for CyrixInstead processors@@NotIntel:        LEA_L   esi,cyrix_id        cmp     [DWORD esi], ebx        jne     @@NotCyrix        cmp     [DWORD esi+4], edx        jne     @@NotCyrix        cmp     [DWORD esi+8], ecx        jne     @@NotCyrix        mov     eax,CPU_Cyrix       ; Flag that we have CyrixInstead        jmp     @@FoundVendor; Check for AuthenticAMD processors@@NotCyrix:        LEA_L   esi,amd_id        cmp     [DWORD esi], ebx        jne     @@NotAMD        cmp     [DWORD esi+4], edx        jne     @@NotAMD        cmp     [DWORD esi+8], ecx        jne     @@NotAMD        mov     eax,CPU_AMD         ; Flag that we have AuthenticAMD        jmp     @@FoundVendor; Check for CentaurHauls processors@@NotAMD:        LEA_L   esi,idt_id        cmp     [DWORD esi], ebx        jne     @@NotIDT        cmp     [DWORD esi+4], edx        jne     @@NotIDT        cmp     [DWORD esi+8], ecx        jne     @@NotIDT        mov     eax,CPU_IDT         ; Flag that we have AuthenticIDT        jmp     @@FoundVendor@@NotIDT:@@FoundVendor:        push    eax        xor     eax, eax        inc     eax        mCPU_ID                     ; Get family/model/stepping/features        and     eax, 0F00h        shr     eax, 8              ; Isolate family        and     eax, 0Fh        pop     ecx        or      eax,ecx             ; Combine in the clone flag@@Done: leave_c        ret@@Fail: xor     eax,eax        jmp     @@Donecprocend;----------------------------------------------------------------------------; uint _CPU_getCPUIDModel(void);----------------------------------------------------------------------------; Determines the CPU type using the CPUID instruction.;----------------------------------------------------------------------------cprocstart  _CPU_getCPUIDModel

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -