Description of Problem: When specifying the "reboot=bios" option the code that switches to real-mode and jumps to the BIOS vector contains a bug that causes some platforms to hang repeatedly. This bug has been present since at since least 2.2.x kernel. This problem exists in both Hampton, Pensacola and prior versions at least to 7.0. Version-Release number of selected component (if applicable): How Reproducible: On a PE6400 running 7.2 it happens most every time. On some tests it showed more frequently after booting then running vi on any file and then typing `reboot`. Steps to Reproduce: 1. Boot PE6400 on 7.2 with "reboot=bios" as kernel param. 2. login as root, vi any file. 3. type `reboot` Actual Results: System will shutdown orderly and then hang not continuing to the BIOS post screens. Expected Results: System will reboot normally and one will see the BIOS screens. Additional Information: A patch has been submitted to the lkml and was accepted by the orignal author of the routine at fault(Jamie Lokier).
Created attachment 56286 [details] INVD cache patch for reboot=bios
The patch simply changes the hand assembled code instruction INVD to WBINVD. INVD invalidates the CPU cache and since the routine was just previously copied in can still exists only in the cache. INVD at this time then cause the routine to be lost and it just executes the "garbage" left in RAM. WBINVD insures that the routine is written to RAM before invalidating the cache, insuring that the jump to the BIOS reset vector takes place.
This will be included in the first Pensacola errata kernel, and is included already in 2.4.19-ac. This needs to get pushed to Marcelo for 2.4.x, and to Linus for 2.5.x.
Closing since it is fixed.