VirtualBox

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


Ignore:
Timestamp:
Nov 9, 2021 8:56:57 AM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
148125
Message:

BIOS: Save a few more bytes in the INT 15 / E820h code; disabled the non-functioning MCFG reporting.

File:
1 edited

Legend:

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

    r92279 r92280  
    592592} mem_range_t;
    593593
    594 void set_e820_range(uint16_t reg_ES, uint16_t reg_DI, uint32_t start, uint32_t end, uint8_t type)
     594static void set_e820_range_len(uint16_t reg_ES, uint16_t reg_DI, uint32_t start, uint32_t len, uint8_t type)
    595595{
    596596    mem_range_t __far *fpRange = reg_ES :> (mem_range_t *)reg_DI;
    597597    fpRange->start  = start;
    598     fpRange->len    = end - start;
     598    fpRange->len    = len;
    599599    fpRange->type   = type;
    600600    fpRange->xlen   = 0;
     
    602602}
    603603
    604 void set_e820_range_above_4g(uint16_t reg_ES, uint16_t reg_DI, uint16_t c64k_above_4G_low, uint16_t c64k_above_4G_high)
     604#define set_e820_range_end(reg_ES, reg_DI, start, end, type) set_e820_range_len(reg_ES, reg_DI, start, end - start, type)
     605
     606static void set_e820_range_above_4g(uint16_t reg_ES, uint16_t reg_DI, uint16_t c64k_above_4G_low, uint16_t c64k_above_4G_high)
    605607{
    606608    mem_range_t __far *fpRange = reg_ES :> (mem_range_t *)reg_DI;
     
    638640                uint16_t c64k_above_4G_low;
    639641                uint16_t c64k_above_4G_high;
     642#ifdef BIOS_WITH_MCFG_E820
    640643                uint32_t mcfgStart, mcfgSize;
     644#endif
    641645
    642646                /** @todo r=bird: I think we can do the first bit here in 16-bit, then decide
     
    670674                /* 0x65 can be used if we need to go beyond 255 TiB */
    671675
    672                 mcfgStart = 0; /// @todo implement mcfg reporting
     676#ifdef BIOS_WITH_MCFG_E820 /** @todo Actually implement the mcfg reporting. */
     677                mcfgStart = 0;
    673678                mcfgSize  = 0;
    674 
    675                 switch(BX)
     679#endif
     680                switch (BX)
    676681                {
    677682                    case 0:
    678                         set_e820_range(ES, DI, 0x0000000L, 0x0009fc00L, 1);
     683                        set_e820_range_end(ES, DI, 0x0000000L, 0x0009fc00L, 1);
    679684                        EBX = 1;
    680685                        break;
    681686                    case 1:
    682                         set_e820_range(ES, DI, 0x0009fc00L, 0x000a0000L, 2);
     687                        set_e820_range_end(ES, DI, 0x0009fc00L, 0x000a0000L, 2);
    683688                        EBX = 2;
    684689                        break;
     
    695700                         * a single reserved range from 0xd0000 to 0xffffff.
    696701                         * A 128K area starting from 0xd0000 works. */
    697                         set_e820_range(ES, DI, 0x000f0000L, 0x00100000L, 2);
     702                        set_e820_range_end(ES, DI, 0x000f0000L, 0x00100000L, 2);
    698703                        EBX = 3;
    699704                        break;
    700705                    case 3:
    701                         set_e820_range(ES, DI, 0x00100000L,
    702                                        extended_memory_size - ACPI_DATA_SIZE, 1);
     706                        set_e820_range_end(ES, DI, 0x00100000L, extended_memory_size - ACPI_DATA_SIZE, 1);
    703707                        EBX = 4;
    704708                        break;
    705709                    case 4:
    706                         set_e820_range(ES, DI,
    707                                        extended_memory_size - ACPI_DATA_SIZE,
    708                                        extended_memory_size, 3); // ACPI RAM
     710                        set_e820_range_len(ES, DI, extended_memory_size - ACPI_DATA_SIZE, ACPI_DATA_SIZE, 3); // ACPI RAM
    709711                        EBX = 5;
    710712                        break;
    711713                    case 5:
    712                         set_e820_range(ES, DI, 0xfec00000, 0xfec00000 + 0x1000, 2); // I/O APIC
     714                        set_e820_range_len(ES, DI, 0xfec00000, 0x1000, 2); // I/O APIC
    713715                        EBX = 6;
    714716                        break;
    715717                    case 6:
    716                         set_e820_range(ES, DI, 0xfee00000, 0xfee00000 + 0x1000, 2); // Local APIC
     718                        set_e820_range_len(ES, DI, 0xfee00000, 0x1000, 2); // Local APIC
    717719                        EBX = 7;
    718720                        break;
    719721                    case 7:
    720722                        /* 256KB BIOS area at the end of 4 GB */
    721                         /* We don't set the end to 1GB here and rely on the 32-bit
    722                            unsigned wrap around effect (0-0xfffc0000L). */
    723                         set_e820_range(ES, DI, 0xfffc0000L, 0x00000000L, 2);
     723                        set_e820_range_len(ES, DI, 0xfffc0000L, 0x40000, 2);
     724#ifdef BIOS_WITH_MCFG_E820
    724725                        if (mcfgStart != 0)
    725726                            EBX = 8;
    726                         else if (c64k_above_4G_low || c64k_above_4G_high)
    727                             EBX = 9;
    728727                        else
    729                             EBX = 0;
    730                         break;
    731                      case 8:
    732                         /* PCI MMIO config space (MCFG) */
    733                         set_e820_range(ES, DI, mcfgStart, mcfgStart + mcfgSize, 2);
     728#endif
    734729                        if (c64k_above_4G_low || c64k_above_4G_high)
    735730                            EBX = 9;
     
    737732                            EBX = 0;
    738733                        break;
     734#ifdef BIOS_WITH_MCFG_E820
     735                     case 8:
     736                        /* PCI MMIO config space (MCFG) */
     737                        set_e820_range_len(ES, DI, mcfgStart, mcfgSize, 2);
     738                        if (c64k_above_4G_low || c64k_above_4G_high)
     739                            EBX = 9;
     740                        else
     741                            EBX = 0;
     742                        break;
     743#endif
    739744                    case 9:
    740                         /* Mapping of memory above 4 GB if present.
    741                            Note1: set_e820_range needs do no borrowing in the
    742                                   subtraction because of the nice numbers.
    743                            Note2* works only up to 1TB because of uint8_t for
    744                                   the upper bits!*/
     745                        /* Mapping of memory above 4 GB if present. */
    745746                        if (c64k_above_4G_low || c64k_above_4G_high)
    746747                        {
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