DevPcBios.cpp revision d3cd4892aaf3a0fb79c295c9afb9626d4d0fd0b5
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * PC BIOS Device.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * Copyright (C) 2006-2008 Oracle Corporation
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * This file is part of VirtualBox Open Source Edition (OSE), as
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * available from http://www.virtualbox.org. This file is free software;
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * you can redistribute it and/or modify it under the terms of the GNU
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * General Public License (GPL) as published by the Free Software
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * Foundation, in version 2 as it comes in the "COPYING" file of the
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami/*******************************************************************************
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami* Header Files *
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami*******************************************************************************/
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami/** @page pg_devbios_cmos_assign CMOS Assignments (BIOS)
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * The BIOS uses a CMOS to store configuration data.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * It is currently used as follows:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami First CMOS bank (offsets 0x00 to 0x7f):
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Floppy drive type:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Hard disk type (old):
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Equipment byte:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Base memory:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Extended memory:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami First IDE HDD:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Second IDE HDD:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Checksum of 0x10-0x2d:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Amount of memory above 16M and below 4GB in 64KB units:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Boot device (BOCHS BIOS specific):
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami First SATA HDD:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Second SATA HDD:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Third SATA HDD:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Fourth SATA HDD:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Number of CPUs:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami RAM above 4G in 64KB units:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Third IDE HDD:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Fourth IDE HDD:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Second CMOS bank (offsets 0x80 to 0xff):
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Reserved for internal use by PXE ROM:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami First net boot device PCI bus/dev/fn:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Second to third net boot devices:
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * @todo Mark which bits are compatible with which BIOSes and
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * which are our own definitions.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami/*******************************************************************************
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami* Structures and Typedefs *
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami*******************************************************************************/
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * The boot device.
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami * PC Bios instance data structure.
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahramitypedef struct DEVPCBIOS
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /** Pointer back to the device instance. */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /** Boot devices (ordered). */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /** RAM size (in bytes). */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /** RAM hole size (in bytes). */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /** Bochs shutdown index. */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /** Floppy device. */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /** Harddisk device. */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /** Sata harddisk device. */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /** LUN of the four harddisks which are emulated as IDE. */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /** Bios message buffer. */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /** Bios message buffer index. */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /** The system BIOS ROM data. */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami /** The size of the system BIOS ROM. */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami /** The name of the BIOS ROM file. */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami /** The LAN boot ROM data. */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami /** The name of the LAN boot ROM file. */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami /** The size of the LAN boot ROM. */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami /** The DMI tables. */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami /** The boot countdown (in seconds). */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /** I/O-APIC enabled? */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /** PXE debug logging enabled? */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami /** PXE boot PCI bus/dev/fn list. */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /** Number of logical CPUs in guest */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami/* Attempt to guess the LCHS disk geometry from the MS-DOS master boot
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * record (partition table). */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahramistatic int biosGuessDiskLCHS(PPDMIBLOCK pBlock, PPDMMEDIAGEOMETRY pLCHSGeometry)
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami uint32_t iEndHead, iEndSector, cLCHSCylinders, cLCHSHeads, cLCHSSectors;
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami rc = pBlock->pfnRead(pBlock, 0, aMBR, sizeof(aMBR));
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami /* Test MBR magic number. */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami /* Figure out the start of a partition table entry. */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami if ((p[12] | p[13] | p[14] | p[15]) && iEndSector & iEndHead)
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /* Assumption: partition terminates on a cylinder boundary. */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami cLCHSCylinders = RT_MIN(1024, pBlock->pfnGetSize(pBlock) / (512 * cLCHSHeads * cLCHSSectors));
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami Log(("%s: LCHS=%d %d %d\n", __FUNCTION__, cLCHSCylinders, cLCHSHeads, cLCHSSectors));
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * Write to CMOS memory.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * This is used by the init complete code.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahramistatic void pcbiosCmosWrite(PPDMDEVINS pDevIns, int off, uint32_t u32Val)
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami int rc = PDMDevHlpCMOSWrite(pDevIns, off, u32Val);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * Read from CMOS memory.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * This is used by the init complete code.
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahramistatic uint8_t pcbiosCmosRead(PPDMDEVINS pDevIns, int off)
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami int rc = PDMDevHlpCMOSRead(pDevIns, off, &u8val);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami/* -=-=-=-=-=-=- based on code from pc.c -=-=-=-=-=-=- */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami * Initializes the CMOS data for one harddisk.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahramistatic void pcbiosCmosInitHardDisk(PPDMDEVINS pDevIns, int offType, int offInfo, PCPDMMEDIAGEOMETRY pLCHSGeometry)
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami Log2(("%s: offInfo=%#x: LCHS=%d/%d/%d\n", __FUNCTION__, offInfo, pLCHSGeometry->cCylinders, pLCHSGeometry->cHeads, pLCHSGeometry->cSectors));
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /* Cylinders low */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, offInfo + 0, RT_MIN(pLCHSGeometry->cCylinders, 1024) & 0xff);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /* Cylinders high */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, offInfo + 1, RT_MIN(pLCHSGeometry->cCylinders, 1024) >> 8);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, offInfo + 2, pLCHSGeometry->cHeads);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /* Landing zone low */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /* Landing zone high */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /* Write precomp low */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami /* Write precomp high */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami /* Sectors */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami pcbiosCmosWrite(pDevIns, offInfo + 7, pLCHSGeometry->cSectors);
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami * Set logical CHS geometry for a hard disk
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami * @returns VBox status code.
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami * @param pBase Base interface for the device.
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami * @param pHardDisk The hard disk.
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami * @param pLCHSGeometry Where to store the geometry settings.
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahramistatic int setLogicalDiskGeometry(PPDMIBASE pBase, PPDMIBLOCKBIOS pHardDisk, PPDMMEDIAGEOMETRY pLCHSGeometry)
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami rc = pHardDisk->pfnGetLCHSGeometry(pHardDisk, &LCHSGeometry);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pBlock = PDMIBASE_QUERY_INTERFACE(pBase, PDMIBLOCK);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /* No LCHS geometry, autodetect and set. */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /* Try if PCHS geometry works, otherwise fall back. */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami rc = pHardDisk->pfnGetPCHSGeometry(pHardDisk, &LCHSGeometry);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami uint64_t cSectors = pBlock->pfnGetSize(pBlock) / 512;
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami LCHSGeometry.cCylinders = RT_MAX(cSectors / 16 / 63, 1);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami LCHSGeometry.cCylinders = RT_MAX(cSectors / 32 / 63, 1);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami LCHSGeometry.cCylinders = RT_MIN(cSectors / 255 / 63, 1024);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami rc = pHardDisk->pfnSetLCHSGeometry(pHardDisk, &LCHSGeometry);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami LogRel(("DevPcBios: ATA failed to update LCHS geometry, read only\n"));
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami LogRel(("DevPcBios: ATA failed to update LCHS geometry, backend refused\n"));
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * Get BIOS boot code from enmBootDevice in order
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * @todo r=bird: This is a rather silly function since the conversion is 1:1.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahramistatic uint8_t getBiosBootCode(PDEVPCBIOS pThis, unsigned iOrder)
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami AssertMsgFailed(("aenmBootDevice[%d]=%d\n", iOrder, pThis->aenmBootDevice[iOrder]));
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * Init complete notification.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * This routine will write information needed by the bios to the CMOS.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * @returns VBOX status code.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * @param pDevIns The device instance.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * @see http://www.brl.ntt.co.jp/people/takehiko/interrupt/CMOS.LST.txt for
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * a description of standard and non-standard CMOS registers.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahramistatic DECLCALLBACK(int) pcbiosInitComplete(PPDMDEVINS pDevIns)
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami PDEVPCBIOS pThis = PDMINS_2_DATA(pDevIns, PDEVPCBIOS);
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami * Memory sizes.
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami /* base memory. */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami u32 = pThis->cbRam > 640 ? 640 : (uint32_t)pThis->cbRam / _1K; /* <-- this test is wrong, but it doesn't matter since we never assign less than 1MB */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, 0x15, u32 & 0xff); /* 15h - Base Memory in K, Low Byte */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, 0x16, u32 >> 8); /* 16h - Base Memory in K, High Byte */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami /* Extended memory, up to 65MB */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami u32 = pThis->cbRam >= 65 * _1M ? 0xffff : ((uint32_t)pThis->cbRam - _1M) / _1K;
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, 0x17, u32 & 0xff); /* 17h - Extended Memory in K, Low Byte */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, 0x18, u32 >> 8); /* 18h - Extended Memory in K, High Byte */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, 0x30, u32 & 0xff); /* 30h - Extended Memory in K, Low Byte */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, 0x31, u32 >> 8); /* 31h - Extended Memory in K, High Byte */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami /* Bochs BIOS specific? Anyway, it's the amount of memory above 16MB
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami and below 4GB (as it can only hold 4GB+16M). We have to chop off the
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami top 2MB or it conflict with what the ACPI tables return. (Should these
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami be adjusted, we still have to chop it at 0xfffc0000 or it'll conflict
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami with the high BIOS mapping.) */
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami uint64_t const offRamHole = _4G - pThis->cbRamHole;
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami u32 = (uint32_t)( (RT_MIN(RT_MIN(pThis->cbRam, offRamHole), UINT32_C(0xffe00000)) - 16U * _1M) / _64K );
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami /* Bochs/VBox BIOS specific way of specifying memory above 4GB in 64KB units.
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami Bochs got these in a different location which we've already used for SATA,
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami it also lacks the last two. */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami c64KBAbove4GB = (pThis->cbRam - offRamHole) / _64K;
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /* Make sure it doesn't hit the limits of the current BIOS code. */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami AssertLogRelMsgReturn((c64KBAbove4GB >> (3 * 8)) < 255, ("%#RX64\n", c64KBAbove4GB), VERR_OUT_OF_RANGE);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, 0x61, c64KBAbove4GB & 0xff);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, 0x62, (c64KBAbove4GB >> 8) & 0xff);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, 0x63, (c64KBAbove4GB >> 16) & 0xff);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, 0x64, (c64KBAbove4GB >> 24) & 0xff);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, 0x65, (c64KBAbove4GB >> 32) & 0xff);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * Number of CPUs.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, 0x60, pThis->cCpus & 0xff);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * Bochs BIOS specifics - boot device.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * We do both new and old (ami-style) settings.
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * See rombios.c line ~7215 (int19_function).
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami uint8_t reg3d = getBiosBootCode(pThis, 0) | (getBiosBootCode(pThis, 1) << 4);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami uint8_t reg38 = /* pcbiosCmosRead(pDevIns, 0x38) | */ getBiosBootCode(pThis, 2) << 4;
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami /* This is an extension. Bochs BIOS normally supports only 3 boot devices. */
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami uint8_t reg3c = getBiosBootCode(pThis, 3) | (pThis->uBootDelay << 4);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * PXE debug option.
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami pcbiosCmosWrite(pDevIns, 0x3f, pThis->u8PXEDebug);
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami * Network boot device list.
5253169e90b276216b53d82f9ba4c56334db5740Ali Bahrami for (i = 0; i < NET_BOOT_DEVS; ++i)
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, 0x82 + i * 2, pThis->au16NetBootDev[i] & 0xff);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami pcbiosCmosWrite(pDevIns, 0x83 + i * 2, pThis->au16NetBootDev[i] >> 8);
75ce41a57ff334bd8fe2cb9ed51eea835892f944Ali Bahrami * Floppy drive type.
u32 = 0;
if (apFDs[0])
default: AssertFailed(); break;
default: AssertFailed(); break;
switch (u32)
if ( apHDs[i]
if (apHDs[i])
&LCHSGeometry);
LogRel(("DevPcBios: ATA LUN#%d LCHS=%u/%u/%u\n", i, LCHSGeometry.cCylinders, LCHSGeometry.cHeads, LCHSGeometry.cSectors));
if ( apHDs[i]
if (apHDs[i])
int offInfo;
&LCHSGeometry);
LogRel(("DevPcBios: SATA LUN#%d LCHS=%u/%u/%u\n", i, LCHSGeometry.cCylinders, LCHSGeometry.cHeads, LCHSGeometry.cSectors));
return VINF_SUCCESS;
static DECLCALLBACK(int) pcbiosIOPortRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb)
return VERR_IOM_IOPORT_UNUSED;
static DECLCALLBACK(int) pcbiosIOPortWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb)
return VERR_INTERNAL_ERROR;
switch (u32)
return VINF_SUCCESS;
return VINF_SUCCESS;
return VINF_SUCCESS;
while (cPages > 0)
int rc;
cPages--;
return VINF_SUCCESS;
static int pcbiosBootFromCfg(PPDMDEVINS pDevIns, PCFGMNODE pCfg, const char *pszParam, DEVPCBIOSBOOT *penmBoot)
char *psz;
pszParam);
return rc;
int rc;
int cb;
static const char * const s_apszBootDevices[] = { "BootDevice0", "BootDevice1", "BootDevice2", "BootDevice3" };
return rc;
static const char * const s_apszSataDisks[] =
{ "SataPrimaryMasterLUN", "SataPrimarySlaveLUN", "SataSecondaryMasterLUN", "SataSecondarySlaveLUN" };
return rc;
return rc;
for (unsigned i = 0; i < NET_BOOT_DEVS; ++i)
return rc;
LogRel(("DevPcBios: Using BIOS ROM '%s' with a size of %#x bytes\n", pThis->pszPcBiosFile, pThis->cbPcBios));
/* Convert the UUID to network byte order. Not entirely straightforward as parts are MSB already... */
return rc;
/* If the DMI table is located at the expected place, patch the DMI table length and the checksum. */
return rc;
return rc;
rc = PDMDevHlpROMRegister(pDevIns, (uint32_t)-(int32_t)cbPcBiosBinary, cbPcBiosBinary, pu8PcBiosBinary, cbPcBiosBinary,
return rc;
LogRel(("DevPcBios: Failed to open LAN boot ROM file '%s', rc=%Rrc!\n", pThis->pszLanBootFile, rc));
LogRel(("DevPcBios: Using LAN ROM '%s' with a size of %#x bytes\n", pThis->pszLanBootFile, cbFileLanBoot));
#ifdef VBOX_WITH_PXE_ROM
if (pu8LanBootBinary)
return VINF_SUCCESS;
sizeof(DEVPCBIOS),
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,