VirtualBox

Ignore:
Timestamp:
Apr 7, 2016 2:57:15 AM (9 years ago)
Author:
vboxsync
Message:

bs3kit: 286 detection fixes ++.

Location:
trunk/src/VBox/ValidationKit/bootsectors/bs3kit
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-bootsector.asm

    r60319 r60365  
    88
    99;
    10 ; Copyright (C) 2007-2015 Oracle Corporation
     10; Copyright (C) 2007-2016 Oracle Corporation
    1111;
    1212; This file is part of VirtualBox Open Source Edition (OSE), as
     
    4949
    5050BITS 16
     51CPU 8086
    5152start:
    5253        jmp short bs3InitCode
     
    106107        mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.rax], ax
    107108        mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.rsp], sp
    108         mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.rbp], bp
    109109        mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.ss], ss
    110110        mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.ds], ds
    111         mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.es], es
    112111
    113112        ; set up the segment reisters and stack.
    114113        mov     ax, 0
    115114        mov     ds, ax
    116         mov     es, ax
    117115        mov     ss, ax
    118116        mov     sp, BS3_ADDR_STACK
     117
     118        ; Save more registers, without needing cs prefix.
     119        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rcx], cx
     120        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rdi], di
     121        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.es], es
     122        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rbp], bp
     123
     124        ; Load es and setup bp frame.
     125        mov     es, ax
    119126        mov     bp, sp
    120127        mov     [bp], ax                ; clear the first 8 bytes (terminates the ebp chain)
     
    129136        ; Clear the register area.
    130137        ;
    131         push    cx
    132         push    di
    133138        mov     di, BS3_ADDR_REG_SAVE
    134139        mov     cx, BS3REGCTX_size/2
    135140        cld
    136141        rep stosw
    137         pop     di
    138         pop     cx
    139142
    140143        ;
     
    148151
    149152        ; 2. On a 286 you cannot popf IOPL and NT from real mode.
    150         or      ah, (X86_EFL_IOPL | X86_EFL_NT) >> 8
     153.detect_286_or_386plus:
     154CPU 286
     155        mov     ah, (X86_EFL_IOPL | X86_EFL_NT) >> 8
    151156        push    ax
    152157        popf
    153158        pushf
     159        cmp     ah, [bp - 3]
    154160        pop     ax
    155         test    ah, (X86_EFL_IOPL | X86_EFL_NT) >> 8
    156         jz      .is_80286
    157         ; 386 or later.
    158 
     161        je      .is_386plus
     162.is_80286:
     163CPU 286
     164        smsw    [BS3_ADDR_REG_SAVE + BS3REGCTX.cr0]
     165.pre_80286:
     166CPU 8086
     167        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rbx], bx
     168        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rdx], dx
     169        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rsi], si
     170        jmp     .do_load
    159171
    160172        ; Save 386 registers. We can now skip the CS prefix as DS is flat.
     173CPU 386
     174.is_386plus:
    161175        shr     eax, 16
    162176        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rax+2], ax
     
    167181        shr     eax, 16
    168182        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rbp+2], ax
     183        shr     edi, 16
     184        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rdi+2], di
     185        shr     ecx, 16
     186        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rcx+2], cx
    169187        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.fs], fs
    170188        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.gs], gs
    171189        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rbx], ebx
    172         mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rcx], ecx
    173190        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rdx], edx
    174191        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rsi], esi
    175         mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rdi], edi
    176192        mov     eax, cr2
    177193        mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.cr2], eax
     
    186202        ; Pentium/486+: CR4 requires VME/CPUID, so we need to detect that before accessing it.
    187203        mov     [cs:BS3_ADDR_REG_SAVE + BS3REGCTX.cr4], eax
    188         popf
     204        popf                            ; (restores IOPL+NT)
    189205        pushfd
    190206        pop     eax
     
    205221        and     eax, ~(X86_CR0_NW | X86_CR0_CD | X86_CR0_AM)
    206222        mov     cr0, eax
    207         jmp     .do_load
    208 
    209 .is_80286:
    210         smsw    [BS3_ADDR_REG_SAVE + BS3REGCTX.cr0]
    211 .pre_80286:
    212         mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rbx], bx
    213         mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rcx], cx
    214         mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rdx], dx
    215         mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rsi], si
    216         mov     [BS3_ADDR_REG_SAVE + BS3REGCTX.rdi], di
    217223
    218224        ; Load all the code.
     
    220226        mov     [g_bBootDrv], dl
    221227        call    bs3InitLoadImage
     228%if 0
     229        mov     al, '='
     230        call bs3PrintChrInAl
     231%endif
    222232
    223233        ;
     
    230240Bs3Panic:
    231241        cli
    232         ;hlt
    233242        jmp     Bs3Panic
     243
     244
     245;; For debug and error handling.
     246; @uses ax
     247bs3PrintHexInAl:
     248CPU 286
     249        push    ax
     250        shr     al, 4
     251        call    bs3PrintHexDigitInAl
     252        pop     ax
     253bs3PrintHexDigitInAl:
     254        and     al, 0fh
     255        cmp     al, 10
     256        jb      .decimal
     257        add     al, 'a' - '0' - 10
     258.decimal:
     259        add     al, '0'
     260bs3PrintChrInAl:
     261        push    bx
     262        mov     ah, 0eh
     263        mov     bx, 0ff00h
     264        int     10h
     265        pop     bx
     266        ret
    234267
    235268
     
    251284        push    dx
    252285%define bMaxSector      byte [bp - 06h]
    253         push    0
     286        xor     ax, ax
     287        push    ax
    254288%define bMaxHead        byte [bp - 08h]
    255         push    0
     289        push    ax
    256290%define bMaxCylinder    byte [bp - 0ah]
    257         push    0
     291        push    ax
    258292
    259293        ;
     
    277311        xor     dh, dh                  ; dh/head=0
    278312.the_load_loop:
     313%if 0
     314        mov al, 'c'
     315        call bs3PrintChrInAl
     316        mov al, ch
     317        call bs3PrintHexInAl
     318        mov al, 's'
     319        call bs3PrintChrInAl
     320        mov al, cl
     321        call bs3PrintHexInAl
     322        mov al, 'h'
     323        call bs3PrintChrInAl
     324        mov al, dh
     325        call bs3PrintHexInAl
     326        mov al, ';'
     327        call bs3PrintChrInAl
     328%endif
    279329        xor     bx, bx
    280330        mov     es, di                  ; es:bx -> buffer
     
    300350        dec     si
    301351        jnz     .the_load_loop
     352%if 0
     353        mov     al, 'D'
     354        call bs3PrintChrInAl
     355%endif
    302356
    303357        add     sp, 3*2
    304358        pop     dx
    305359        pop     es
    306         leave
     360        pop     bp
    307361        ret
    308362
     
    311365        ;
    312366.failure:
    313         pusha
     367        push    ax
    314368
    315369        ; print message
     
    317371.failure_next_char:
    318372        lodsb
    319         mov     ah, 0eh
    320         mov     bx, 0ff00h
    321         int     10h
     373        call    bs3PrintChrInAl
    322374        cmp     si, .s_szErrMsgEnd
    323375        jb      .failure_next_char
    324376
    325377        ; panic
    326         popa
     378        pop     ax
     379%if 1
     380        mov     al, ah
     381        push    bs3PrintHexInAl
     382%endif
    327383        call    Bs3Panic
    328384.s_szErrMsg:
    329         db 13, 10, 'read error!'
     385        db 13, 10, 'rd err! '
    330386.s_szErrMsgEnd:
    331387;ENDPROC bs3InitLoadImage - don't want the padding.
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-CpuDetect.asm

    r60335 r60365  
    4646        push    xBP
    4747        mov     xBP, xSP
     48        pushf
    4849        push    xCX
    4950        push    xDX
    5051        push    xBX
    51         pushf
    5252
    5353%ifndef TMPL_CMN_PAGING
     
    114114        ; of a 80387 or later co-processor (a 80287+80386 => ET=0).  486 and
    115115        ; later should be hardcoding this to 1, according to the documentation
    116         ; (need to test on 486SX).  The 286 should never have it set.
     116        ; (need to test on 486SX).  The initial idea here then would be to
     117        ; assume 386+ if ET=1.
     118        ;
     119        ; However, it turns out the 286 I've got here has bits 4 thru 15 all
     120        ; set.  This is very nice though, because only bits 4 and 5 are defined
     121        ; on later CPUs and the remainder MBZ.  So, check whether any of the MBZ
     122        ; bits are set, if so, then it's 286.
    117123        ;
    118124        smsw    ax
    119         test    ax, X86_CR0_ET
    120         jnz     .386plus
    121  %ifndef TMPL_RM                        ; remove once 286plus_protmode is implemented (relevant in DOS context).
    122         test    ax, X86_CR0_PE
    123         jnz     .286plus_protmode       ;; @todo The test below doesn't work in prot mode, I think...
    124  %endif
     125        test    ax, ~(X86_CR0_PE | X86_CR0_MP | X86_CR0_EM | X86_CR0_TS | X86_CR0_ET | X86_CR0_NE)
     126        jnz     .is_286
    125127
    126128        ;
     
    138140        ; observed a 386SX here.
    139141        ;
    140         cli                             ; Disable interrupts to be on the safe side.
    141         mov     ax, [xBP - xCB]
    142         or      ax, X86_EFL_IOPL | X86_EFL_NT
     142        test    al, X86_CR0_PE          ; This flag test doesn't work in protected mode, ...
     143        jnz     .386plus                ; ... so ASSUME 386plus if in PE for now.
     144
     145        pushf                           ; Save a copy of the original flags for restoring IF.
     146        pushf
     147        pop     ax
     148        xor     ax, X86_EFL_IOPL | X86_EFL_NT   ; Try modify IOPL and NT.
     149        and     ax, ~X86_EFL_IF                 ; Try clear IF.
    143150        push    ax                      ; Load modified flags.
    144151        popf
    145152        pushf                           ; Get actual flags.
    146         pop     ax
    147         test    ax, X86_EFL_IOPL | X86_EFL_NT
    148         jnz     .386plus                ; If any of the flags are set, we're on 386+.
     153        pop     dx
     154        popf                            ; Restore IF, IOPL and NT.
     155        cmp     ax, dx
     156        je      .386plus                ; If any of the flags are set, we're on 386+.
    149157
    150158        ; While we could in theory be in v8086 mode at this point and be fooled
    151159        ; by a flaky POPF implementation, we assume this isn't the case in our
    152160        ; execution environment.
     161
     162.is_286:
    153163        mov     ax, BS3CPU_80286
    154164        jmp     .return
    155 %endif
     165%endif ; !TMPL_CMN_PAGING
    156166
    157167CPU 386
     
    278288        ; Epilogue.
    279289        ;
    280         popf
    281290        pop     xBX
    282291        pop     xDX
    283292        pop     xCX
     293        popf
    284294        pop     xBP
    285295        ret
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette