VirtualBox

Changeset 75229 in vbox for trunk/src/VBox/Devices/PC


Ignore:
Timestamp:
Nov 2, 2018 3:21:49 PM (6 years ago)
Author:
vboxsync
Message:

BIOS: Rearranged INT 15h to better separate 286 and 386+ functionality.

Location:
trunk/src/VBox/Devices/PC/BIOS
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/BIOS/orgs.asm

    r69300 r75229  
    125125extrn           _int15_function:near
    126126extrn           _int15_function_mouse:near
    127 extrn           _int15_function32:near
    128127extrn           _int16_function:near
    129128extrn           _int17_function:near
     
    149148endif
    150149if VBOX_BIOS_CPU ge 80386
     150extrn           _int15_function32:near
    151151extrn           _apic_setup:near
    152152endif
     
    17231723                push    es
    17241724                C_SETUP
    1725                 cmp     ah, 86h
    1726                 je      int15_handler32
     1725if VBOX_BIOS_CPU ge 80386
     1726                ;; int15_function32 exists in 386+ BIOS only, but INT 15h is
     1727                ;; not 386-specific
    17271728                cmp     ah, 0E8h
    17281729                je      int15_handler32
    17291730                cmp     ah, 0d0h
    17301731                je      int15_handler32
     1732endif
    17311733                DO_pusha
    17321734                cmp     ah, 53h         ; APM function?
     
    17381740int15_handler_popa_ret:
    17391741                DO_popa
     1742if VBOX_BIOS_CPU ge 80386
    17401743int15_handler32_ret:
     1744endif
    17411745                pop     es
    17421746                pop     ds
     
    17521756                jmp     int15_handler_popa_ret
    17531757
     1758if VBOX_BIOS_CPU ge 80386
    17541759int15_handler32:
    1755 if VBOX_BIOS_CPU ge 80386
    17561760                ;; need to save/restore 32-bit registers
    17571761                .386
     
    17601764                popad
    17611765                .286
    1762 else
    1763                 DO_pusha
    1764                 call    _int15_function32
    1765                 DO_popa
    1766 endif
    17671766                jmp     int15_handler32_ret
     1767endif
    17681768
    17691769;;
  • trunk/src/VBox/Devices/PC/BIOS/system.c

    r74612 r75229  
    7171#define ACPI_DATA_SIZE    0x00010000L   /** @todo configurable? put elsewhere? */
    7272
    73 #define BX_CPU                  3
    74 
    7573extern  int pmode_IDT;
    7674extern  int rmode_IDT;
     
    324322
    325323    return((oldval & 0x02) != 0);
    326 }
    327 
    328 typedef struct {
    329     uint32_t    start;
    330     uint32_t    xstart;
    331     uint32_t    len;
    332     uint32_t    xlen;
    333     uint32_t    type;
    334 } mem_range_t;
    335 
    336 void set_e820_range(uint16_t ES, uint16_t DI, uint32_t start, uint32_t end,
    337                     uint8_t extra_start, uint8_t extra_end, uint16_t type)
    338 {
    339     mem_range_t __far   *range;
    340 
    341     range = ES :> (mem_range_t *)DI;
    342     range->start  = start;
    343     range->xstart = extra_start;
    344     end -= start;
    345     extra_end -= extra_start;
    346     range->len    = end;
    347     range->xlen   = extra_end;
    348     range->type   = type;
    349324}
    350325
     
    428403    case 0x4f:
    429404        /* keyboard intercept */
    430 #if BX_CPU < 2
     405#if VBOX_BIOS_CPU >= 80286
     406        // nop
     407#else
    431408        SET_AH(UNSUPPORTED_FUNCTION);
    432 #else
    433         // nop
    434409#endif
    435410        SET_CF();
     
    478453        }
    479454
     455    case 0x86:
     456        // Wait for CX:DX microseconds. currently using the
     457        // refresh request port 0x61 bit4, toggling every 15usec
     458        int_enable();
     459        timer_wait(((uint32_t)CX << 16) | DX);
     460        break;
     461
    480462    case 0x88:
    481463        // Get the amount of extended memory (above 1M)
    482 #if BX_CPU < 2
    483         SET_AH(UNSUPPORTED_FUNCTION);
    484         SET_CF();
    485 #else
     464#if VBOX_BIOS_CPU >= 80286
    486465        AX = (inb_cmos(0x31) << 8) | inb_cmos(0x30);
    487466
     
    492471
    493472        CLEAR_CF();
     473#else
     474        SET_AH(UNSUPPORTED_FUNCTION);
     475        SET_CF();
    494476#endif
    495477        break;
     
    588570}
    589571
     572#if VBOX_BIOS_CPU >= 80386
     573
     574typedef struct {
     575    uint32_t    start;
     576    uint32_t    xstart;
     577    uint32_t    len;
     578    uint32_t    xlen;
     579    uint32_t    type;
     580} mem_range_t;
     581
     582void set_e820_range(uint16_t reg_ES, uint16_t reg_DI, uint32_t start, uint32_t end,
     583                    uint8_t extra_start, uint8_t extra_end, uint16_t type)
     584{
     585    mem_range_t __far   *range;
     586
     587    range = reg_ES :> (mem_range_t *)reg_DI;
     588    range->start  = start;
     589    range->xstart = extra_start;
     590    end -= start;
     591    extra_end -= extra_start;
     592    range->len    = end;
     593    range->xlen   = extra_end;
     594    range->type   = type;
     595}
     596
    590597void BIOSCALL int15_function32(sys32_regs_t r)
    591598{
     
    598605
    599606    switch (GET_AH()) {
    600     case 0x86:
    601         // Wait for CX:DX microseconds. currently using the
    602         // refresh request port 0x61 bit4, toggling every 15usec
    603         int_enable();
    604         timer_wait(((uint32_t)CX << 16) | DX);
    605         break;
    606 
    607607    case 0xd0:
    608608        if (GET_AL() != 0x4f)
     
    840840    }
    841841}
     842#endif  /* VBOX_BIOS_CPU >= 80386 */
    842843
    843844#if VBOX_BIOS_CPU >= 80286
     
    930931    CLEAR_CF();
    931932}
    932 #endif
     933#endif  /* VBOX_BIOS_CPU >= 80286 */
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