On 27/12/2013 20:42, Tarl Neustaedter wrote:
On 2013-Dec-27, 14:10 , Nick Couchman wrote:
First, thanks to everyone who has worked to get OpenBIOS up to its current functional level over the past couple of years. I'm using Solaris 9 on OpenBIOS with pretty good success these days, which is awesome.
I do have a question about Qemu, OpenBIOS, and the Solaris hostid. It seems that, currently, when booting Solaris with Qemu, the host ID is set to "80000000." As far as I can tell, this isn't near correct
- according to all of the documentation I've read, the host ID should
be calculated based on the machine type, and some portion of the MAC address. This may be the wrong forum in which to ask this, but I'm wondering if someone could shed light on why it shows up that way, and if there's a way in OpenBIOS via the PROM/NVRAM data to set the host ID to something a little bit closer to normal?
The HOSTID used to have embedded knowledge about the system type and other details. As of (I recall) Sun4u, the hostid is 0x8000.0000 plus a serial number. Openbios should pick a number other than "0" for the serial number :-)
[On 32bits SparcStations] The Host ID is made of the machine type and the serial number. the serial number is identical to three bytes of the Ethernet MAC address, shown as decimal during boot. All that stuff is written into the NVRAM
For example, on a SparcStation 20 : MAC Address = 08:00:20:74:FB:DA Host ID = 7274FBDA (72 is the machine type of the SS20) Serial number = #7666650 = 0x74FBDA
(And the barcode on the NVRAM chip is also "74FBDA" )
On a SparcStation5, the machine type is 0x80, everything else is identical.
Maybe this small patch for QEMU could help : ------------------------------------------------------------------------ diff --git a/include/hw/nvram/openbios_firmware_abi.h b/include/hw/nvram/openbios_firmware_abi.h index 5e6e5d4..492c8d5 100644 --- a/include/hw/nvram/openbios_firmware_abi.h +++ b/include/hw/nvram/openbios_firmware_abi.h @@ -62,6 +62,8 @@ Sun_init_header(struct Sun_nvram *header, const uint8_t *macaddr, int machine_id header->type = 1; header->machine_id = machine_id & 0xff; memcpy(&header->macaddr, macaddr, 6); + memcpy(&header->hostid , &macaddr[3],3); + /* Calculate checksum */ tmp = 0; tmpptr = (uint8_t *)header; ------------------------------------------------------------------------