HOWTO: Update You HP BIOS From Linux

Linux users consistently get the short end of the stick when it comes to BIOS updates. Oftentimes dmesg will show us that something is wrong in the BIOS and we have no way to fix it. This is especially infuriating when you have a laptop with no CDROM drive and it doesn’t like to boot off usb because of… a bug in the BIOS. This is the HP 6730b laptop with the 00D BIOS. It’s a disaster of a monumental scale. It’s a nice laptop when it works, but oftentimes with fedora or suse (or any other distro which uses the intel driver rather than vesa) the screen “flickers” and the laptop runs like junk until you CTRL+ALT+F2 it and back again a few times. The dmesg log will be filled with errors about intel_iommu and the kernel will report a crash.

Officially the problem is a buggy BIOS, what’s actually happening is the iommu register is being mapped to ‘0’ rather than any actual address. This means the CPU has it, the BIOS maps it incorrectly and then tells the OS to use ‘0’ as the address in memory. If the kernel didn’t do sanity checking your box would crash. As it stands it simply causes an interrupt (the screen flashing) and then it’s caught.

HP’s site is amazingly bad and offers up three options – Bootable CD, USB and floppy. The laptop won’t USB boot, because of the 00D BIOS. The laptop doesn’t have a floppy drive, and who does anymore? The laptop will boot off a CD, but this requires you to actually find a CD. I tried a DVD and booktyped it as a CD just for grins and it didn’t work. How are we supposed to update this crap? Install windows?

The workaround: If you don’t want to do this, the cheap workaround is to turn off “virtualization technology” in the BIOS and set intel_iommu=0 in the grub.conf. You will lose access to virtualization accelleration. It will still cause kernel problems, but it will happen much less frequently. This also fixes the problem with sleeping unless the box had the problem when it started up.

The fix: Ready to take the plunge? Get yourself an HP account first. Registration is free.

Install syslinux. In fedora, this is yum install syslinux and it puts in in /usr/share/syslinux. I would also install the perl stuff if you plan on doing a lot of servers with this. If HP continues this sort of crap for servers that they did with laptops, plan on doing this – a lot.

Grab sp50750. There’s actually an F17 BIOS, but it only affects Windows 7 and appears to have driver updates also.  If you want that one instead, use sp51317. As of right now the sp51317 download link doesn’t work, I believe they pulled it.

At this point I used wine to unpack the executable and I used rar to dump out ROM.CAB. Grab the ROM.BIN file and tuck it somewhere safe.

Grab sp50751. This is the F16 BIOS but this is for a different laptop. Do not apply this BIOS to your laptop. You have been warned. I didn’t try to apply the BIOS from that link to this laptop.

When you unpack that one, you will notice an ISO directory. You want to go in to that directory and mount the ROM.ISO – mount -o loop rom.iso tmp will mount the iso to a tmp directory. Create tmp first if it doesn’t exist.

Inside of your tmp directory (which is really the iso), you will see a /boot directory. Inside of that directory is a release.img file. Now we’re getting somewhere! You can run file release.img and see that it’s actually a floppy disk. Sweet! Copy this floppy image out of the ISO.

Mount up the floppy image. mount -o loop release.img tmp will do it, just like the CD. The difference is we can read and write to the floppy image while we can’t do that to a CD image. Doing an ls into our floppy image shows a 68PDD.BIN file, which is the BIOS. How am I so sure? It’s the only BIN file in there. Copy your ROM.BIN file we extracted earlier over the 68PDD.BIN file. Hit yes to overwrite it and then unmount the image.

WHAT DO WE DO WITH IT?

We can boot from it!

Copy release.img and /usr/share/syslinux/memdisk to /boot.

Edit /boot/grub/menu.lst and add the following:

title Floppy Disk Image
root (hd0,0)
kernel /memdisk
initrd /release.img

Reboot and select “Floppy Disk Image” from the grub menu, and it will boot into freeDOS and flash F16 to your laptop! Next time you boot you’ll have the new BIOS after it does some tests.

Proof?

[    0.000000] WARNING: at drivers/pci/dmar.c:633 warn_invalid_dmar+0x7d/0x8d()
[    0.000000] Hardware name: HP Compaq 6730b (SERIAL NUMBER)
[    0.000000] Your BIOS is broken; DMAR reported at address 0!
[    0.000000] BIOS vendor: Hewlett-Packard; Ver: 68PDD Ver. F.16; Product Version: F.16

New F16 bugs! Good thing HP fixes them all!

Advertisements

9 thoughts on “HOWTO: Update You HP BIOS From Linux

  1. Pingback: Blog of Alexander Mamchenkov » HP Laptop BIOS upgrade from Linux

  2. I have to say that is an good article and i am currently trying to update my bios the same way but i am running into difficulty with the RELEASE.IMG file? for some reason fedora is saying that it is an unknown file type? i cannot open it at all to change the bin file?

    i have access to a windows laptop also and i have managed to open the .IMG file within power iso and converted the .bin file and then transfered the .img file back to to /boot along with memtest and then made all the neccesry entries in the menu.lst in the grub folder but it still will not boot?

    where am i going wrong? is there extra software required to recognise a .img file?

  3. I never got SP51317 (the windows 7) BIOS to work. It doesn’t matter because the fixes are all in the F16 BIOS.

    The IMG file is a floppy disk image. This is not an ISO. If you converted it, you probably ruined it since it needs the DOS bootable flag on it for FAT16.

    Once you copy the image file out of the mounted ISO, you can mount it like anything else. Your problem appears to be that you’re either not using the command line or you’re not copying it out of the ISO.

  4. Thanks, used your instructions to upgrade the BIOS of an 8710w, with a few workarounds:

    1] rompaq.exe (EROMPAQ.exe) is only compatible with certain hardware, so the one from sp50751 did not work: error as follows:
    “this version of rompaq is designed for newer machines”
    “bad or missing command interpreter: erompaq.exe /?”

    2] It seems ROMPaq’s (and the associated ISOs) are no longer distributed or maintained. To workaround the error in the first point I had to download older firmware for the 8710w, since newer firmware only ships the windows executable (HPQFlash) and not ROMPaq… and rom.iso was empty.

    To fix: get release.img from sp50751 (as you said), replace its contents with everything in the “Rompaq” folder of the old 8710w bios, and extract rom.bin from rom.cab of the newer bios. Also the new ROMPAQ.exe has the BIOS name hardcoded, so rename the rom.bin file appropriately.

    The point is these instructions are only valid while working rompaqs are still available…

    Anyway thanks for the lifesaver

  5. Oh how frustrating. These excellent notes got me so close… I am trying to use the same technique to upgrade to sp60493 [http://ftp.hp.com/pub/softpaq/sp60001-60500/sp60493.exe]. However, my new .BIN is 4589312 bytes, compared to the existing 68PDD.BIN file within release.img which is 2097152 bytes, and so the new .BIN is too large to fit on the floppy. If anyone has got any advice on how to work around this, I’d be very grateful to hear it.

  6. You can also create, or run if you have one handy, a Hiren Boot CD(or USB stick) and boot the mini-xp environment and simply run the executable for the bios update. Worked like a champ, no problem.

    • no i didnt work like a charm. booted to mini, then tried the update and got some retarded wmi error about admin priv error i guess…

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s