VirtualBox

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


Ignore:
Timestamp:
Sep 8, 2008 3:41:38 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
36221
Message:

Support for more than 4G RAM in guest, may not really work, but shouldn't break
regular configs. UI still doesn't allow setting more than 3.5G of RAM,
could someone with powerful enough machine check if it really works and let me
know, so that I can enable it in UI?

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

Legend:

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

    r11982 r12233  
    45484548
    45494549
    4550 void set_e820_range(ES, DI, start, end, type)
     4550void set_e820_range(ES, DI, start, end, extra_start, extra_end, type)
    45514551     Bit16u ES;
    45524552     Bit16u DI;
    45534553     Bit32u start;
    45544554     Bit32u end;
     4555     Bit8u  extra_start;
     4556     Bit8u  extra_end;
    45554557     Bit16u type;
    45564558{
     
    45584560    write_word(ES, DI+2, start >> 16);
    45594561    write_word(ES, DI+4, 0x00);
     4562    write_word(ES, DI+4, extra_start);
    45604563    write_word(ES, DI+6, 0x00);
    45614564
    45624565    end -= start;
     4566    extra_end -= extra_start;
    45634567    write_word(ES, DI+8, end);
    45644568    write_word(ES, DI+10, end >> 16);
     
    45674571        write_word(ES, DI+12, 0x0001);
    45684572    else
    4569         write_word(ES, DI+12, 0x0000);
     4573        // XXX: nike - is it really correct? see QEMU BIOS patch
     4574        write_word(ES, DI+12, extra_end);
    45704575#else /* !VBOX */
    45714576    write_word(ES, DI+12, 0x0000);
     
    45834588{
    45844589  Bit32u  extended_memory_size=0; // 64bits long
     4590  Bit32u  extra_lowbits_memory_size=0;
    45854591  Bit16u  CX,DX;
     4592  Bit8u   extra_highbits_memory_size=0;
    45864593
    45874594BX_DEBUG_INT15("int15 AX=%04x\n",regs.u.r16.ax);
     
    46574664                }
    46584665
     4666                extra_lowbits_memory_size = inb_cmos(0x61);
     4667                extra_lowbits_memory_size <<= 8;
     4668                extra_lowbits_memory_size |= inb_cmos(0x62);
     4669                extra_lowbits_memory_size *= 64;
     4670                extra_lowbits_memory_size *= 1024;
     4671                extra_highbits_memory_size = inb_cmos(0x63);
     4672
    46594673                switch(regs.u.r16.bx)
    46604674                {
    46614675                    case 0:
    46624676                        set_e820_range(ES, regs.u.r16.di,
    4663                                        0x0000000L, 0x0009fc00L, 1);
     4677                                       0x0000000L, 0x0009fc00L, 0, 0, 1);
    46644678                        regs.u.r32.ebx = 1;
    46654679                        regs.u.r32.eax = 0x534D4150;
     
    46704684                    case 1:
    46714685                        set_e820_range(ES, regs.u.r16.di,
    4672                                        0x0009fc00L, 0x000a0000L, 2);
     4686                                       0x0009fc00L, 0x000a0000L, 0, 0, 2);
    46734687                        regs.u.r32.ebx = 2;
    46744688                        regs.u.r32.eax = 0x534D4150;
     
    46884702                         * A 128K area starting from 0xd0000 works. */
    46894703                        set_e820_range(ES, regs.u.r16.di,
    4690                                        0x000f0000L, 0x00100000L, 2);
     4704                                       0x000f0000L, 0x00100000L, 0, 0, 2);
    46914705#else /* !VBOX */
    46924706                        set_e820_range(ES, regs.u.r16.di,
    4693                                        0x000e8000L, 0x00100000L, 2);
     4707                                       0x000e8000L, 0x00100000L, 0, 0, 2);
    46944708#endif /* !VBOX */
    46954709                        regs.u.r32.ebx = 3;
     
    47024716                        set_e820_range(ES, regs.u.r16.di,
    47034717                                       0x00100000L,
    4704                                        extended_memory_size - ACPI_DATA_SIZE, 1);
     4718                                       extended_memory_size - ACPI_DATA_SIZE ,0, 0, 1);
    47054719                        regs.u.r32.ebx = 4;
    47064720                        regs.u.r32.eax = 0x534D4150;
     
    47124726                        set_e820_range(ES, regs.u.r16.di,
    47134727                                       extended_memory_size - ACPI_DATA_SIZE,
    4714                                        extended_memory_size, 3); // ACPI RAM
     4728                                       extended_memory_size, 0, 0, 3); // ACPI RAM
    47154729                        regs.u.r32.ebx = 5;
    47164730                        regs.u.r32.eax = 0x534D4150;
     
    47224736                        /* 256KB BIOS area at the end of 4 GB */
    47234737                        set_e820_range(ES, regs.u.r16.di,
    4724                                        0xfffc0000L, 0x00000000L, 2);
     4738                                       0xfffc0000L, 0x00000000L, 0, 0, 2);
     4739                        if (extra_highbits_memory_size || extra_lowbits_memory_size)
     4740                            regs.u.r32.ebx = 6;
     4741                        else
     4742                            regs.u.r32.ebx = 0;
     4743                        regs.u.r32.eax = 0x534D4150;
     4744                        regs.u.r32.ecx = 0x14;
     4745                        CLEAR_CF();
     4746                        return;
     4747                    case 6:
     4748                        /* Maping of memory above 4 GB */
     4749                        set_e820_range(ES, regs.u.r16.di,
     4750                                       0x00000000L, extra_lowbits_memory_size,
     4751                                       1, extra_highbits_memory_size + 1, 1);
    47254752                        regs.u.r32.ebx = 0;
    47264753                        regs.u.r32.eax = 0x534D4150;
  • trunk/src/VBox/Devices/PC/DevPcBios.cpp

    r12095 r12233  
    154154    /** PXE debug logging enabled? */
    155155    uint8_t        u8PXEDebug;
     156    /** Number of logical CPUs in guest */
     157    uint16_t       u16numCPUs;
    156158} DEVPCBIOS, *PDEVPCBIOS;
    157159
     
    500502     * Memory sizes.
    501503     */
     504    uint64_t ramInK = pThis->cbRam / _1K;
     505    uint64_t above4GInK, below4GInK;
     506    if (ramInK > 0xe0000000)
     507    {
     508        above4GInK = ramInK - 0xe0000000;
     509        below4GInK = 0xe0000000;
     510    }
     511    else
     512    {
     513        above4GInK = 0;
     514        below4GInK = ramInK;
     515    }
     516
     517
    502518    /* base memory. */
    503     u32 = pThis->cbRam > 640 ? 640 : (uint32_t)pThis->cbRam / _1K;
     519    u32 = below4GInK > 640 ? 640 : (uint32_t)below4GInK;
    504520    pcbiosCmosWrite(pDevIns, 0x15, u32 & 0xff);                                 /* 15h - Base Memory in K, Low Byte */
    505521    pcbiosCmosWrite(pDevIns, 0x16, u32 >> 8);                                   /* 16h - Base Memory in K, High Byte */
    506522
    507523    /* Extended memory, up to 65MB */
    508     u32 = pThis->cbRam >= 65 * _1M ? 0xffff : ((uint32_t)pThis->cbRam - _1M) / _1K;
     524    u32 = below4GInK >= 65 * _1K ? 0xffff : ((uint32_t)below4GInK - _1K);
    509525    pcbiosCmosWrite(pDevIns, 0x17, u32 & 0xff);                                 /* 17h - Extended Memory in K, Low Byte */
    510526    pcbiosCmosWrite(pDevIns, 0x18, u32 >> 8);                                   /* 18h - Extended Memory in K, High Byte */
     
    513529
    514530    /* Bochs BIOS specific? Anyway, it's the amount of memory above 16MB */
    515     if (pThis->cbRam > 16 * _1M)
    516     {
    517         u32 = (uint32_t)( (pThis->cbRam - 16 * _1M) / _64K );
     531    if (below4GInK > 16 * _1K)
     532    {
     533        u32 = (uint32_t)( (below4GInK - 16 * _1K) / 64 );
    518534        u32 = RT_MIN(u32, 0xffff);
    519535    }
     
    522538    pcbiosCmosWrite(pDevIns, 0x34, u32 & 0xff);
    523539    pcbiosCmosWrite(pDevIns, 0x35, u32 >> 8);
     540
     541    /* RAM above 4G */
     542    pcbiosCmosWrite(pDevIns, 0x61, above4GInK >> 16);
     543    pcbiosCmosWrite(pDevIns, 0x62, above4GInK >> 24);
     544    pcbiosCmosWrite(pDevIns, 0x63, above4GInK >> 32);
     545
     546    /*
     547     * Number of CPUs.
     548     */
     549    pcbiosCmosWrite(pDevIns, 0x60, pThis->u16numCPUs & 0xff);
    524550
    525551    /*
Note: See TracChangeset for help on using the changeset viewer.

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