VirtualBox

Ignore:
Timestamp:
Mar 8, 2009 1:12:25 PM (16 years ago)
Author:
vboxsync
Message:

DevPcBios.cpp,rombios.c: 4GB changes, synced the 0E820 code with current bochs code.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/BIOS/rombios.c

    r16537 r17545  
    22692269#define ATA_TYPE_ATA      0x02
    22702270#define ATA_TYPE_ATAPI    0x03
     2271#ifdef VBOX
    22712272#define ATA_TYPE_SCSI     0x04 // SCSI disk
     2273#endif
    22722274
    22732275#define ATA_DEVICE_NONE  0x00
     
    42254227
    42264228      break;
    4227 #endif
     4229#endif /* VBOX */
    42284230
    42294231    case 0x90:
     
    45974599    write_word(ES, DI, start);
    45984600    write_word(ES, DI+2, start >> 16);
    4599     write_word(ES, DI+4, 0x00); /** @todo r=bird: why write it twice? */
    46004601    write_word(ES, DI+4, extra_start);
    46014602    write_word(ES, DI+6, 0x00);
     
    46054606    write_word(ES, DI+8, end);
    46064607    write_word(ES, DI+10, end >> 16);
    4607 #ifdef VBOX
    4608     if (end == 0)
    4609         write_word(ES, DI+12, 0x0001);
    4610     else
    4611         /** @todo XXX: nike - is it really correct? see QEMU BIOS patch */
    4612         write_word(ES, DI+12, extra_end);
    4613 #else /* !VBOX */
    4614     write_word(ES, DI+12, 0x0000);
    4615 #endif /* !VBOX */
     4608    write_word(ES, DI+12, extra_end);
    46164609    write_word(ES, DI+14, 0x0000);
    46174610
     
    46264619{
    46274620  Bit32u  extended_memory_size=0; // 64bits long
    4628 #ifdef VBOX_WITH_MORE_THAN_4GB
    46294621  Bit32u  extra_lowbits_memory_size=0;
    4630 #endif
    46314622  Bit16u  CX,DX;
    4632 #ifdef VBOX_WITH_MORE_THAN_4GB
    46334623  Bit8u   extra_highbits_memory_size=0;
    4634 #endif
    46354624
    46364625BX_DEBUG_INT15("int15 AX=%04x\n",regs.u.r16.ax);
     
    46924681                extended_memory_size |= inb_cmos(0x34);
    46934682                extended_memory_size *= 64;
     4683#ifndef VBOX /* The following excludes 0xf0000000 thru 0xffffffff. Trust DevPcBios.cpp to get this right. */
    46944684                // greater than EFF00000???
    46954685                if(extended_memory_size > 0x3bc000) {
    46964686                    extended_memory_size = 0x3bc000; // everything after this is reserved memory until we get to 0x100000000
    46974687                }
     4688#endif /* !VBOX */
    46984689                extended_memory_size *= 1024;
    46994690                extended_memory_size += (16L * 1024 * 1024);
     
    47044695                    extended_memory_size |= inb_cmos(0x30);
    47054696                    extended_memory_size *= 1024;
     4697                    extended_memory_size += (1L * 1024 * 1024);
    47064698                }
    47074699
    4708 #ifdef VBOX_WITH_MORE_THAN_4GB /* bird: later (btw. this ain't making sense complixity wise, unless its a AMI/AWARD/PHOENIX interface) */
    4709                 extra_lowbits_memory_size = inb_cmos(0x61);
     4700#ifdef VBOX     /* We've already used the CMOS entries for SATA.
     4701                   BTW. This is the amount of memory above 4GB measured in 64KB units. */
     4702                extra_lowbits_memory_size = inb_cmos(0x62);
    47104703                extra_lowbits_memory_size <<= 8;
    4711                 extra_lowbits_memory_size |= inb_cmos(0x62);
     4704                extra_lowbits_memory_size |= inb_cmos(0x61);
     4705                extra_lowbits_memory_size <<= 16;
     4706                extra_highbits_memory_size = inb_cmos(0x63);
     4707                /* 0x64 and 0x65 can be used if we need to dig 1 TB or more at a later point. */
     4708#else
     4709                extra_lowbits_memory_size = inb_cmos(0x5c);
     4710                extra_lowbits_memory_size <<= 8;
     4711                extra_lowbits_memory_size |= inb_cmos(0x5b);
    47124712                extra_lowbits_memory_size *= 64;
    47134713                extra_lowbits_memory_size *= 1024;
    4714                 extra_highbits_memory_size = inb_cmos(0x63);
    4715 #endif
     4714                extra_highbits_memory_size = inb_cmos(0x5d);
     4715#endif /* !VBOX */
    47164716
    47174717                switch(regs.u.r16.bx)
     
    47194719                    case 0:
    47204720                        set_e820_range(ES, regs.u.r16.di,
     4721#ifndef VBOX /** @todo Upstream sugggests the following, needs checking. (see next as well) */
     4722                                       0x0000000L, 0x0009f000L, 0, 0, 1);
     4723#else
    47214724                                       0x0000000L, 0x0009fc00L, 0, 0, 1);
     4725#endif
    47224726                        regs.u.r32.ebx = 1;
    4723                         regs.u.r32.eax = 0x534D4150;
    4724                         regs.u.r32.ecx = 0x14;
    4725                         CLEAR_CF();
    4726                         return;
    47274727                        break;
    47284728                    case 1:
    47294729                        set_e820_range(ES, regs.u.r16.di,
     4730#ifndef VBOX /** @todo Upstream sugggests the following, needs checking. (see next as well) */
     4731                                       0x0009f000L, 0x000a0000L, 0, 0, 2);
     4732#else
    47304733                                       0x0009fc00L, 0x000a0000L, 0, 0, 2);
     4734#endif
    47314735                        regs.u.r32.ebx = 2;
    4732                         regs.u.r32.eax = 0x534D4150;
    4733                         regs.u.r32.ecx = 0x14;
    4734                         CLEAR_CF();
    4735                         return;
    47364736                        break;
    47374737                    case 2:
     
    47524752#endif /* !VBOX */
    47534753                        regs.u.r32.ebx = 3;
    4754                         regs.u.r32.eax = 0x534D4150;
    4755                         regs.u.r32.ecx = 0x14;
    4756                         CLEAR_CF();
    4757                         return;
    47584754                        break;
    47594755                    case 3:
     4756#if BX_ROMBIOS32 || defined(VBOX)
    47604757                        set_e820_range(ES, regs.u.r16.di,
    47614758                                       0x00100000L,
    47624759                                       extended_memory_size - ACPI_DATA_SIZE, 0, 0, 1);
    47634760                        regs.u.r32.ebx = 4;
    4764                         regs.u.r32.eax = 0x534D4150;
    4765                         regs.u.r32.ecx = 0x14;
    4766                         CLEAR_CF();
    4767                         return;
     4761#else
     4762                        set_e820_range(ES, regs.u.r16.di,
     4763                                       0x00100000L,
     4764                                       extended_memory_size, 1);
     4765                        regs.u.r32.ebx = 5;
     4766#endif
    47684767                        break;
    47694768                    case 4:
     
    47724771                                       extended_memory_size, 0, 0, 3); // ACPI RAM
    47734772                        regs.u.r32.ebx = 5;
    4774                         regs.u.r32.eax = 0x534D4150;
    4775                         regs.u.r32.ecx = 0x14;
    4776                         CLEAR_CF();
    4777                         return;
    47784773                        break;
    47794774                    case 5:
    47804775                        /* 256KB BIOS area at the end of 4 GB */
     4776#ifdef VBOX
     4777                        /* We don't set the end to 1GB here and rely on the 32-bit
     4778                           unsigned wrap around effect (0-0xfffc0000L). */
     4779#endif
    47814780                        set_e820_range(ES, regs.u.r16.di,
    47824781                                       0xfffc0000L, 0x00000000L, 0, 0, 2);
    4783 #ifdef VBOX_WITH_MORE_THAN_4GB
    47844782                        if (extra_highbits_memory_size || extra_lowbits_memory_size)
    47854783                            regs.u.r32.ebx = 6;
    47864784                        else
    4787 #endif
    47884785                            regs.u.r32.ebx = 0;
    4789                         regs.u.r32.eax = 0x534D4150;
    4790                         regs.u.r32.ecx = 0x14;
    4791                         CLEAR_CF();
    4792                         return;
    4793 #ifdef VBOX_WITH_MORE_THAN_4GB
     4786                        break;
    47944787                    case 6:
    4795                         /* Mapping of memory above 4 GB */
    4796                         set_e820_range(ES, regs.u.r16.di,
    4797                                        0x00000000L, extra_lowbits_memory_size,
    4798                                        1, extra_highbits_memory_size + 1, 1);
     4788#ifdef VBOX /* Don't succeeded if no memory above 4 GB.  */
     4789                        /* Mapping of memory above 4 GB if present.
     4790                           Note: set_e820_range needs do no borrowing in the
     4791                                 subtraction because of the nice numbers. */
     4792                        if (extra_highbits_memory_size || extra_lowbits_memory_size)
     4793                        {
     4794                            set_e820_range(ES, regs.u.r16.di,
     4795                                           0x00000000L, extra_lowbits_memory_size,
     4796                                           1 /*GB*/, extra_highbits_memory_size + 1 /*GB*/, 1);
     4797                            regs.u.r32.ebx = 0;
     4798                            break;
     4799                        }
     4800                        /* fall thru */
     4801#else  /* !VBOX */
     4802                        /* Maping of memory above 4 GB */
     4803                        set_e820_range(ES, regs.u.r16.di, 0x00000000L,
     4804                        extra_lowbits_memory_size, 1, extra_highbits_memory_size
     4805                                       + 1, 1);
    47994806                        regs.u.r32.ebx = 0;
    4800                         regs.u.r32.eax = 0x534D4150;
    4801                         regs.u.r32.ecx = 0x14;
    4802                         CLEAR_CF();
    4803                         return;
    4804 #endif
     4807                        break;
     4808#endif /* !VBOX */
    48054809                    default:  /* AX=E820, DX=534D4150, BX unrecognized */
    48064810                        goto int15_unimplemented;
    48074811                        break;
    48084812                }
     4813                regs.u.r32.eax = 0x534D4150;
     4814                regs.u.r32.ecx = 0x14;
     4815                CLEAR_CF();
    48094816            } else {
    48104817              // if DX != 0x534D4150)
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