Changeset 92280 in vbox for trunk/src/VBox/Devices/PC
- Timestamp:
- Nov 9, 2021 8:56:57 AM (3 years ago)
- svn:sync-xref-src-repo-rev:
- 148125
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/BIOS/system.c
r92279 r92280 592 592 } mem_range_t; 593 593 594 void set_e820_range(uint16_t reg_ES, uint16_t reg_DI, uint32_t start, uint32_t end, uint8_t type)594 static void set_e820_range_len(uint16_t reg_ES, uint16_t reg_DI, uint32_t start, uint32_t len, uint8_t type) 595 595 { 596 596 mem_range_t __far *fpRange = reg_ES :> (mem_range_t *)reg_DI; 597 597 fpRange->start = start; 598 fpRange->len = end - start;598 fpRange->len = len; 599 599 fpRange->type = type; 600 600 fpRange->xlen = 0; … … 602 602 } 603 603 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 606 static 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) 605 607 { 606 608 mem_range_t __far *fpRange = reg_ES :> (mem_range_t *)reg_DI; … … 638 640 uint16_t c64k_above_4G_low; 639 641 uint16_t c64k_above_4G_high; 642 #ifdef BIOS_WITH_MCFG_E820 640 643 uint32_t mcfgStart, mcfgSize; 644 #endif 641 645 642 646 /** @todo r=bird: I think we can do the first bit here in 16-bit, then decide … … 670 674 /* 0x65 can be used if we need to go beyond 255 TiB */ 671 675 672 mcfgStart = 0; /// @todo implement mcfg reporting 676 #ifdef BIOS_WITH_MCFG_E820 /** @todo Actually implement the mcfg reporting. */ 677 mcfgStart = 0; 673 678 mcfgSize = 0; 674 675 switch (BX)679 #endif 680 switch (BX) 676 681 { 677 682 case 0: 678 set_e820_range (ES, DI, 0x0000000L, 0x0009fc00L, 1);683 set_e820_range_end(ES, DI, 0x0000000L, 0x0009fc00L, 1); 679 684 EBX = 1; 680 685 break; 681 686 case 1: 682 set_e820_range (ES, DI, 0x0009fc00L, 0x000a0000L, 2);687 set_e820_range_end(ES, DI, 0x0009fc00L, 0x000a0000L, 2); 683 688 EBX = 2; 684 689 break; … … 695 700 * a single reserved range from 0xd0000 to 0xffffff. 696 701 * 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); 698 703 EBX = 3; 699 704 break; 700 705 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); 703 707 EBX = 4; 704 708 break; 705 709 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 709 711 EBX = 5; 710 712 break; 711 713 case 5: 712 set_e820_range (ES, DI, 0xfec00000, 0xfec00000 +0x1000, 2); // I/O APIC714 set_e820_range_len(ES, DI, 0xfec00000, 0x1000, 2); // I/O APIC 713 715 EBX = 6; 714 716 break; 715 717 case 6: 716 set_e820_range (ES, DI, 0xfee00000, 0xfee00000 +0x1000, 2); // Local APIC718 set_e820_range_len(ES, DI, 0xfee00000, 0x1000, 2); // Local APIC 717 719 EBX = 7; 718 720 break; 719 721 case 7: 720 722 /* 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 724 725 if (mcfgStart != 0) 725 726 EBX = 8; 726 else if (c64k_above_4G_low || c64k_above_4G_high)727 EBX = 9;728 727 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 734 729 if (c64k_above_4G_low || c64k_above_4G_high) 735 730 EBX = 9; … … 737 732 EBX = 0; 738 733 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 739 744 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. */ 745 746 if (c64k_above_4G_low || c64k_above_4G_high) 746 747 {
Note:
See TracChangeset
for help on using the changeset viewer.