Changeset 441 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS


Ignore:
Timestamp:
Aug 19, 2012, 10:58:42 AM (12 years ago)
Author:
aitotat@…
google:author:
aitotat@gmail.com
Message:

Changes to XTIDE Universal BIOS:

  • ATA-ID sector is now verified (P-CHS verification for ATA-4 and older + checksum for ATA-5 and later)
Location:
trunk/XTIDE_Universal_BIOS
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/XTIDE_Universal_BIOS/Inc/ATA_ID.inc

    r376 r441  
    2020%ifndef ATA_ID_INC
    2121%define ATA_ID_INC
     22
     23; Maximum valid P-CHS parameters
     24MAX_VALID_PCHS_CYLINDERS            EQU     16383
     25MAX_VALID_PCHS_HEADS                EQU     16
     26MAX_VALID_PCHS_SECTORS_PER_TRACK    EQU     63
     27
    2228
    2329; PIO Minimum Cycle Times (t0)
     
    316322    .strMediaSr resw 206-176    ; 176...205V, Current media serial number
    317323                resw 255-206    ; 206...254R
     324    .wIntegrityWord:
    318325    .bSignature resb 1  ; 255[0-7]X, Signature
    319326    .bChecksum  resb 1  ; 255[8-15]X, Checksum
     
    472479A6_wCFAPower_MASK_mA    EQU 0FFFh   ; Maximum current in mA
    473480
     481; ATA-6 WORD 255, Integrity Word (Signature and Checksum)
     482A6_wIntegrity_SIGNATURE EQU 0A5h
     483
    474484
    475485%endif ; ATA_ID_INC
  • trunk/XTIDE_Universal_BIOS/Src/Initialization/AtaID.asm

    r421 r441  
    2222SECTION .text
    2323
     24;--------------------------------------------------------------------
     25; AtaID_VerifyFromESSI
     26;   Parameters:
     27;       ES:SI:  Ptr to 512-byte ATA information read from the drive
     28;   Returns:
     29;       CF:     Set if failed to verify ATA-ID
     30;               Cleared if ATA-ID verified succesfully
     31;   Corrupts registers:
     32;       AX, BX, CX
     33;--------------------------------------------------------------------
     34AtaID_VerifyFromESSI:
     35    ; We cannot start by reading ATA version since the ID might be
     36    ; corrupted. We start by making sure P-CHS values are valid.
     37    ; If they are, we assume the ATA ID to be valid. Fortunately we can do
     38    ; futher checking for ATA-5 and later since they contain signature and
     39    ; checksum bytes. Those are not available for ATA-4 and older.
     40
     41    ; Verify P-CHS cylinders
     42    mov     bx, ATA1.wCylCnt
     43    mov     cx, MAX_VALID_PCHS_CYLINDERS
     44    call    .CompareCHorSfromOffsetBXtoMaxValueInCX
     45
     46    add     bx, BYTE ATA1.wHeadCnt - ATA1.wCylCnt
     47    mov     cl, MAX_VALID_PCHS_HEADS
     48    call    .CompareCHorSfromOffsetBXtoMaxValueInCX
     49
     50    add     bx, BYTE ATA1.wSPT - ATA1.wHeadCnt
     51    mov     cl, MAX_VALID_PCHS_SECTORS_PER_TRACK
     52    call    .CompareCHorSfromOffsetBXtoMaxValueInCX
     53
     54    ; We now verified P-CHS parameters so we assume ATA ID to be valid
     55    ; for ATA-4 and older. For ATA-5 and later we check signature
     56    ; and checksum.
     57    mov     ax, [es:si+ATA6.wMajorVer]          ; ATA-3 and later have this word
     58    inc     ax
     59    jz      SHORT .AtaIDverifiedSuccessfully    ; FFFFh means no version info available
     60    dec     ax
     61    jz      SHORT .AtaIDverifiedSuccessfully    ; Zero means no version info available
     62    cmp     ax, A6_wMajorVer_ATA5
     63    jb      SHORT .AtaIDverifiedSuccessfully    ; ATA-3 and ATA-4 do not have checksum
     64
     65    ; Check signature byte
     66    cmp     BYTE [es:si+ATA6.bSignature], A6_wIntegrity_SIGNATURE
     67    jne     SHORT .FailedToVerifyAtaID
     68
     69    ; Check checksum byte
     70    mov     cx, ATA6_size
     71    call    Memory_SumCXbytesFromESSItoAL
     72    test    al, al
     73    jnz     SHORT .FailedToVerifyAtaID
     74
     75    ; ATA-ID is now verified to be valid
     76.AtaIDverifiedSuccessfully:
     77    clc
     78    ret
     79
     80;--------------------------------------------------------------------
     81; .CompareCHorSfromOffsetBXtoMaxValueInCX
     82;   Parameters:
     83;       BX:     C, H or S offset to ATA-ID
     84;       CX:     Maximum valid C, H or S value
     85;       ES:SI:  Ptr to 512-byte ATA information read from the drive
     86;   Returns:
     87;       Exits from AtaID_VerifyFromESSI with CF set if invalid value
     88;   Corrupts registers:
     89;       AX
     90;--------------------------------------------------------------------
     91.CompareCHorSfromOffsetBXtoMaxValueInCX:
     92    mov     ax, [es:bx+si]
     93    test    ax, ax
     94    jz      SHORT .InvalidPCHorSinOffsetBX
     95    cmp     ax, cx          ; Compare to max valid value
     96    jbe     SHORT .ValidPCHorSinOffsetBX
     97.InvalidPCHorSinOffsetBX:
     98    add     sp, 2           ; Clear return address for this function
     99.FailedToVerifyAtaID:
     100    stc                     ; Set carry to indicate invalid ATA-ID
     101.ValidPCHorSinOffsetBX:
     102    ret
     103
     104
    24105%ifdef MODULE_ADVANCED_ATA
    25106;--------------------------------------------------------------------
  • trunk/XTIDE_Universal_BIOS/Src/Initialization/DetectDrives.asm

    r397 r441  
    218218;--------------------------------------------------------------------
    219219CreateBiosTablesForHardDisk:
     220    push    bx
     221    call    AtaID_VerifyFromESSI
     222    pop     bx
     223    jc      SHORT DetectDrives_DriveNotFound
    220224    call    CreateDPT_FromAtaInformation
    221225    jc      SHORT DetectDrives_DriveNotFound
Note: See TracChangeset for help on using the changeset viewer.