Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
misc:acpi_patch [2025/04/26 01:13] rqmmisc:acpi_patch [2025/04/29 00:10] (current) rqm
Line 6: Line 6:
 Booting the stock installer or kernel will cause the boot procedure to hang quite early on, usually after identifying the hard disks: Booting the stock installer or kernel will cause the boot procedure to hang quite early on, usually after identifying the hard disks:
  
-INSERT PHOTO+{{ :misc:acpi-bug-macbook-12-1.jpg?direct&640 |}}
  
 As @brynet@bsd.network pointed out, it is caused by "some kind of regression that triggers a weird ACPI firmware bug on this machine."  As @brynet@bsd.network pointed out, it is caused by "some kind of regression that triggers a weird ACPI firmware bug on this machine." 
Line 48: Line 48:
   * If going the "Custom installer" route, [[https://www.openbsd.org/faq/faq4.html#MkInsMedia|OpenBSD FAQ - Creating Install Media ]]   * If going the "Custom installer" route, [[https://www.openbsd.org/faq/faq4.html#MkInsMedia|OpenBSD FAQ - Creating Install Media ]]
  
-=== The Slow Boot Way ===+=== I. The Slow Boot Way ===
 Waiting out the slow boot times is probably a little bit easier, and it doesn't require you to have another working OpenBSD install that you can use to compile a custom kernel and create a custom installer image. Waiting out the slow boot times is probably a little bit easier, and it doesn't require you to have another working OpenBSD install that you can use to compile a custom kernel and create a custom installer image.
  
Line 89: Line 89:
  
 == 4. Compiling == == 4. Compiling ==
 +Follow the ''release(8)'' man page closely here. 
 +As root, first, change directories to the appropriate directory in ''/sys''. Make sure you are in the right folder because ''/usr/src/sys'' follows the same directory structure, but if you compile from there, you won't get the right results. This was a lesson learned //The Hard Way//™. So to be on the safe side do exactly as the manpage says, and run:
 +<code>
 +$ doas -s
 +# cd /sys/arch/amd64/compile/GENERIC.MP
 +</code>
 +
 +Then proceed as the manual suggests, with root privileges - otherwise "make install" will fail. This is another lesson learned //The Hard Way//™. 
 +<code>
 +# make obj
 +# make config
 +# make && make install
 +</code>
 +
 +After you reboot, the new kernel should be the one in use. It will be easy to tell whether the patch worked, because if your system boots "normally", it worked, if you are back at waiting for 2+ hours at "sd0", it failed and you need to check over whether you did everything correctly.
 +
 +
 +
 +----
 +FIXME FIXME FIXME
 +PLEASE DISREGARD BELOW FOR THE TIME BEING, IT IS A WIP AND KNOWN TO BE INCORRECT.
 +FIXME FIXME FIXME
 +----
 +
 +=== II. The Custom Installer Way ===
 +
 +Creating a custom installer requires you to have another amd64 machine running OpenBSD. You will be able to build the kernel at the version your OpenBSD machine is already on. You need to make sure you are fetching the appropriate version of the sources, like above. 
 +
 +The procedure, in short, involves building the custom GENERIC.MP image as well as a custom RAMDISK, but WITHOUT running ''make install'' at the end. Then you create a ''vnode'' device out of the downloaded ''installXX.img'', mount it, then overwrite the installer's {bsd,bsd.mp,bsd.rd} files with the ones you created.
 +
 +== 0. Preliminaries ==
 +
 +You will also need a copy of ''installXX.img'' and a flash drive. (Some Macs cannot boot off an SD card so best to stick with USB flash drives).
 +
 +If you are on ''-current'' then you need to make sure that the installer you download corresponds to the snapshot you are on. To see what version exactly you are on, run:
 +<code>
 +$ sysctl kern.version
 +kern.version=OpenBSD 7.7-current (GENERIC.MP) #0: Wed Apr 23 20:21:10 BST 2025
 +    [..snip..]
 +</code>
 +
 +Note the date; in the above example, it's **"Apr 23 2025"**, so you need the installXX.img from that same snapshot - as it's on **7.7-current** it will be ''install77.img''.
 +
 +A good place to get previous snapshots is on ''ftp://ftp.hostserver.de/archive/'', choosing the ''YYYY-MM-DD-HHSS'' format directory that corresponds to the date of your ''kern.version'' date; so in this example, the file needed would be at:
 +
 +''%%https://ftp.hostserver.de/archive/%%**2025-04-23-0105**/snapshots/amd64/**install77.img**''
 +
 +==== Upgrading your system after patching ====
 +Should a new release come out, unless there's a rewrite of ''acpi.c'', you will need to re-patch your kernel upon upgrade.
 +
 +On your working, normally booting system, you need to patch in place like with "The Slow Boot Way" above.
 +
 +First, you need to **follow the "anoncvs" tutorial on the OpenBSD website and upgrade the source tree.**
 +
 +When updating it will skip "acpi.c" because you have manually changed the file locally. Overwrite the local changes by running:
 +<code>
 +# cd /usr/src/sys/dev/acpi/
 +# cvs update -C acpi.c
 +</code>
 +
 +This will then move your own version of ''acpi.c'' to a hidden backup file, something like ''.#acpi.c.1.444'' or similar, keep a note of the command output. Run a diff on the freshly fetched acpi.c and the one you had:
 +<code>
 +# diff acpi.c .#acpi.c.1.444
 +</code>
 +
 +If the only two lines that differ are the ones you commented out with the above patch, just ''mv'' back ''.#acpi.c*'' to ''acpi.c'' because there were no changes. If the output of ''diff'' is more substantial, you might need to edit out the two lines by hand again; if they  still exist, and give us a shout so we can also update this tutorial.
 +
 +=== Download the upgrade ===
 +Fetch the release you are upgrading to, but without rebooting and installing automatically. 
 +
 +On ''-current'' this will be:
 +<code>
 +# sysupgrade -ns
 +</code> 
 +
 +On ''-stable'' this will be:
 +<code>
 +# sysupgrade -n
 +</code>
 +
 +Sysupgrade will download the new files for the download, you will find then under ''/home/_sysupgrade''.
 +
 +=== Make and install the Ramdisk ===
 +To build ''bsd.rd'', follow the instructions for building as above, but instead of ''GENERIC.MP'' you need to build build ''RAMDISK''.
 +<code>
 +$ doas -s
 +# cd /sys/arch/amd64/compile/RAMDISK
 +# make obj
 +# make config
 +# make
 +[...eventually...]
 +ctfstrip -S -o bsd bsd.gdb
 +# install -bp /sys/arch/amd64/compile/RAMDISK/obj/bsd /bsd.hax
 +</code>
 +
 +This will give you a "bsd.hax" ramdisk that you can boot to on next reboot. But don't just reboot yet.
 +
 +=== Make and install the patched kernel again ===
 +
 +Before rebooting, you need to re-compile ''bsd.mp'' and put it ''/home/_sysupgrade'':
 +
 +<code>
 +$ doas -s
 +# cd /sys/arch/amd64/compile/GENERIC.MP
 +# make obj
 +# make config
 +# make
 +[...eventually...]
 +ctfstrip -S -o bsd bsd.gdb
 +# install -bp /sys/arch/amd64/compile/GENERIC.MP/obj/bsd /home/_sysupgrade/bsd.mp
 +</code>
 +
 +Reboot... Done!