VirtualBox

Changeset 45669 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Apr 22, 2013 3:37:42 PM (12 years ago)
Author:
vboxsync
Message:

BIOS: add int15 function 0xd04f

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

Legend:

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

    r44107 r45669  
    15521552                cmp     ah, 0E8h
    15531553                je      int15_handler32
     1554                cmp     ah, 0d0h
     1555                je      int15_handler32
    15541556                pusha
    15551557                cmp     ah, 53h         ; APM function?
  • trunk/src/VBox/Devices/PC/BIOS/system.c

    r44528 r45669  
    192192    "retf"                  \
    193193    parm [ax] modify nomemory aborts;
    194    
     194
    195195// @todo: This method is silly. The RTC should be programmed to fire an interrupt
    196196// instead of hogging the CPU with inaccurate code.
     
    224224{
    225225    uint8_t     oldval;
    226    
     226
    227227    // Use PS/2 System Control port A to set A20 enable
    228    
     228
    229229    // get current setting first
    230230    oldval = inb(0x92);
    231    
     231
    232232    // change A20 status
    233233    if (val)
     
    235235    else
    236236        outb(0x92, oldval & 0xfd);
    237    
     237
    238238    return((oldval & 0x02) != 0);
    239239}
     
    276276#define ECX     r.gr.u.r32.ecx
    277277#define EDX     r.gr.u.r32.edx
     278#define ESI     r.gr.u.r32.esi
     279#define EDI     r.gr.u.r32.edi
    278280#define ES      r.es
    279281
     
    386388            SET_AL(GET_AL() - 1);
    387389        }
    388        
     390
    389391        break;
    390392        }
     
    397399        // +++ should probably have descriptor checks
    398400        // +++ should have exception handlers
    399        
     401
    400402        // turn off interrupts
    401403        int_disable();    //@todo: aren't they disabled already?
    402        
     404
    403405        prev_a20_enable = set_enable_a20(1); // enable A20 line
    404        
     406
    405407        // 128K max of transfer on 386+ ???
    406408        // source == destination ???
    407        
     409
    408410        // ES:SI points to descriptor table
    409411        // offset   use     initially  comments
     
    415417        // 20..27   CS      zeros      filled in by BIOS
    416418        // 28..2f   SS      zeros      filled in by BIOS
    417        
     419
    418420        //es:si
    419421        //eeee0
    420422        //0ssss
    421423        //-----
    422        
     424
    423425        // check for access rights of source & dest here
    424        
     426
    425427        // Initialize GDT descriptor
    426428        base15_00 = (ES << 4) + SI;
     
    433435        write_byte(ES, SI+0x08+5, 0x93);     // access
    434436        write_word(ES, SI+0x08+6, 0x0000);   // base 31:24/reserved/limit 19:16
    435        
     437
    436438        // Initialize CS descriptor
    437439        write_word(ES, SI+0x20+0, 0xffff);// limit 15:00 = normal 64K limit
     
    440442        write_byte(ES, SI+0x20+5, 0x9b);  // access
    441443        write_word(ES, SI+0x20+6, 0x0000);// base 31:24/reserved/limit 19:16
    442        
     444
    443445        // Initialize SS descriptor
    444446        ss = read_ss();
     
    450452        write_byte(ES, SI+0x28+5, 0x93);     // access
    451453        write_word(ES, SI+0x28+6, 0x0000);   // base 31:24/reserved/limit 19:16
    452        
     454
    453455        pm_stack_save(CX, ES, SI);
    454456        pm_enter();
     
    456458        pm_exit();
    457459        pm_stack_restore();
    458        
     460
    459461        set_enable_a20(prev_a20_enable);
    460        
     462
    461463        // turn interrupts back on
    462464        int_enable();
    463        
     465
    464466        SET_AH(0);
    465467        CLEAR_CF();
     
    473475#else
    474476        AX = (inb_cmos(0x31) << 8) | inb_cmos(0x30);
    475        
     477
    476478        // According to Ralf Brown's interrupt the limit should be 15M,
    477479        // but real machines mostly return max. 63M.
    478480        if(AX > 0xffc0)
    479481            AX = 0xffc0;
    480        
     482
    481483        CLEAR_CF();
    482484#endif
     
    488490        // BH/BL contains starting interrupt numbers for PIC0/PIC1
    489491        // This subfunction does not return!
    490        
     492
    491493        // turn off interrupts
    492494        int_disable();  //@todo: aren't they off already?
    493        
     495
    494496        set_enable_a20(1); // enable A20 line; we're supposed to fail if that fails
    495        
     497
    496498        // Initialize CS descriptor for BIOS
    497499        write_word(ES, SI+0x38+0, 0xffff);// limit 15:00 = normal 64K limit
     
    592594        timer_wait(DX, CX);
    593595        break;
    594    
     596
     597    case 0xd0:
     598        if (GET_AL() != 0x4f)
     599            goto int15_unimplemented;
     600        if (EBX == 0x50524f43 && ECX == 0x4d4f4445 && ESI == 0 && EDI == 0)
     601        {
     602            CLEAR_CF();
     603            ESI = EBX;
     604            EDI = ECX;
     605            EAX = 0x49413332;
     606        }
     607        else
     608            goto int15_unimplemented;
     609        break;
     610
    595611    case 0xe8:
    596612        switch(GET_AL()) {
     
    766782            // do we have any reason to fail here ?
    767783            CLEAR_CF();
    768            
     784
    769785            // my real system sets ax and bx to 0
    770786            // this is confirmed by Ralph Brown list
     
    773789            // regs.u.r16.ax = 0;
    774790            // regs.u.r16.bx = 0;
    775            
     791
    776792            // Get the amount of extended memory (above 1M)
    777793            CX = (inb_cmos(0x31) << 8) | inb_cmos(0x30);
    778            
     794
    779795            // limit to 15M
    780796            if(CX > 0x3c00)
    781797                CX = 0x3c00;
    782            
     798
    783799            // Get the amount of extended memory above 16M in 64k blocks
    784800            DX = (inb_cmos(0x35) << 8) | inb_cmos(0x34);
    785            
     801
    786802            // Set configured memory equal to extended memory
    787803            AX = CX;
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