Changeset 34426 in vbox for trunk/src/VBox/Devices/PC
- Timestamp:
- Nov 26, 2010 8:34:43 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 68197
- Location:
- trunk/src/VBox/Devices/PC
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/BIOS/rombios.c
r33656 r34426 4645 4645 } 4646 4646 4647 Bit32u readBiosVar(varNum) 4648 Bit16u varNum; 4649 { 4650 int iPort = 0x402; 4651 Bit32u result = 0; 4652 4653 outw(iPort, varNum); 4654 result = (inb(iPort) << 24) | (inb(iPort) << 16) | 4655 (inb(iPort) << 8) | (inb(iPort) << 0); 4656 BX_INFO("var %d is %x\n", varNum, result); 4657 return result; 4658 } 4659 4647 4660 void 4648 4661 int15_function32(regs, ES, DS, FLAGS) … … 4654 4667 Bit16u CX,DX; 4655 4668 Bit8u extra_highbits_memory_size=0; 4669 Bit32u mcfgStart, mcfgSize; 4656 4670 4657 4671 BX_DEBUG_INT15("int15 AX=%04x\n",regs.u.r16.ax); … … 4746 4760 extra_highbits_memory_size = inb_cmos(0x5d); 4747 4761 #endif /* !VBOX */ 4762 4763 mcfgStart = readBiosVar(1); 4764 mcfgSize = readBiosVar(2); 4748 4765 4749 4766 switch(regs.u.r16.bx) … … 4812 4829 set_e820_range(ES, regs.u.r16.di, 4813 4830 0xfffc0000L, 0x00000000L, 0, 0, 2); 4814 /* Temporary disabled MCFG code */ 4815 #if 0 4816 regs.u.r32.ebx = 6; 4831 if (mcfgStart > 0) 4832 regs.u.r32.ebx = 6; 4833 else 4834 { 4835 if (extra_highbits_memory_size || extra_lowbits_memory_size) 4836 regs.u.r32.ebx = 7; 4837 else 4838 regs.u.r32.ebx = 0; 4839 } 4817 4840 break; 4818 4841 case 6: 4819 /* PCI MMIO config space */4842 /* PCI MMIO config space (MCFG) */ 4820 4843 set_e820_range(ES, regs.u.r16.di, 4821 0xd0000000L, 0xe0000000L, 0, 0, 2); 4844 mcfgStart, mcfgSize, 0, 0, 2); 4845 4822 4846 if (extra_highbits_memory_size || extra_lowbits_memory_size) 4823 4847 regs.u.r32.ebx = 7; … … 4826 4850 break; 4827 4851 case 7: 4828 #else4829 if (extra_highbits_memory_size || extra_lowbits_memory_size)4830 regs.u.r32.ebx = 6;4831 else4832 regs.u.r32.ebx = 0;4833 break;4834 case 6:4835 #endif4836 4852 #ifdef VBOX /* Don't succeeded if no memory above 4 GB. */ 4837 4853 /* Mapping of memory above 4 GB if present. -
trunk/src/VBox/Devices/PC/DevPcBios.cpp
r34317 r34426 178 178 /** Number of logical CPUs in guest */ 179 179 uint16_t cCpus; 180 uint32_t u32McfgBase; 181 uint32_t cbMcfgLength; 182 uint16_t iVarNum; 183 uint16_t iVarPos; 180 184 } DEVPCBIOS, *PDEVPCBIOS; 181 185 … … 232 236 Assert(u32Val < 256); 233 237 234 #if 1235 238 int rc = PDMDevHlpCMOSWrite(pDevIns, off, u32Val); 236 239 AssertRC(rc); 237 #else238 PVM pVM = PDMDevHlpGetVM(pDevIns);239 IOMIOPortWrite(pVM, 0x70, off, 1);240 IOMIOPortWrite(pVM, 0x71, u32Val, 1);241 IOMIOPortWrite(pVM, 0x70, 0, 1);242 #endif243 240 } 244 241 … … 641 638 } 642 639 640 static uint8_t pcbiosReadVar(PDEVPCBIOS pThis) 641 { 642 uint32_t u32Val = 0, u32Size = 4; 643 switch (pThis->iVarNum) 644 { 645 case 1: 646 u32Val = pThis->u32McfgBase; 647 u32Size = 4; 648 break; 649 case 2: 650 u32Val = pThis->cbMcfgLength; 651 u32Size = 4; 652 break; 653 default: 654 AssertMsgFailed(("Unknown variable: %d\n", pThis->iVarNum)); 655 } 656 uint32_t iPos = pThis->iVarPos++; 657 if (pThis->iVarPos >= u32Size) 658 pThis->iVarPos = 0; 659 660 Log(("Read pos %d of var %d: %x\n", 661 iPos, pThis->iVarNum, (u32Val >> (iPos*8)) & 0xff)); 662 663 return (u32Val >> (iPos*8)) & 0xff; 664 } 643 665 644 666 /** … … 655 677 static DECLCALLBACK(int) pcbiosIOPortRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb) 656 678 { 657 NOREF(pDevIns); 658 NOREF(pvUser); 659 NOREF(Port); 660 NOREF(pu32); 661 NOREF(cb); 679 if (cb == 1 && Port == 0x402) 680 { 681 PDEVPCBIOS pThis = PDMINS_2_DATA(pDevIns, PDEVPCBIOS); 682 uint8_t u8Val = pcbiosReadVar(pThis); 683 *(uint8_t*)pu32 = u8Val; 684 return VINF_SUCCESS; 685 } 686 662 687 return VERR_IOM_IOPORT_UNUSED; 663 688 } … … 725 750 pThis->szMsg[++pThis->iMsg] = '\0'; 726 751 } 752 return VINF_SUCCESS; 753 } 754 755 if (cb == 2 && Port == 0x402) 756 { 757 PDEVPCBIOS pThis = PDMINS_2_DATA(pDevIns, PDEVPCBIOS); 758 pThis->iVarNum = u32; 759 pThis->iVarPos = 0; 727 760 return VINF_SUCCESS; 728 761 } … … 941 974 "IOAPIC\0" 942 975 "NumCPUs\0" 976 "McfgBase\0" 977 "McfgLength\0" 943 978 "DmiBIOSVendor\0" 944 979 "DmiBIOSVersion\0" … … 986 1021 return PDMDEV_SET_ERROR(pDevIns, rc, 987 1022 N_("Configuration error: Querying \"NumCPUs\" as integer failed")); 1023 1024 rc = CFGMR3QueryU32Def(pCfg, "McfgBase", &pThis->u32McfgBase, 0); 1025 if (RT_FAILURE(rc)) 1026 return PDMDEV_SET_ERROR(pDevIns, rc, 1027 N_("Configuration error: Querying \"\" as integer failed")); 1028 rc = CFGMR3QueryU32Def(pCfg, "McfgLength", &pThis->cbMcfgLength, 0); 1029 if (RT_FAILURE(rc)) 1030 return PDMDEV_SET_ERROR(pDevIns, rc, 1031 N_("Configuration error: Querying \"McfgLength\" as integer failed")); 1032 988 1033 989 1034 LogRel(("[SMP] BIOS with %u CPUs\n", pThis->cCpus));
Note:
See TracChangeset
for help on using the changeset viewer.