In September 1999 we started writing our own ACPI core software implementation, including an AML execution environment. The implementation was based on Doug Rabson's ACPI disassembler and our ACPI data analyzing tool.
We first wrote a ACPI memory recognition routine to detect and preserve the ACPI tables. We then wrote a process that could run AML methods manually (e.g. suspend and wakeup) based on somewhat incomplete ASL output. This allowed us to enter power state S1 and also to shutdown a machine by pushing the power button.
We also wrote an AML interpreter in user space by merging the namespace functions from our analyzing tool into the ACPI disassembler and adding a memory management module to it. After this was implemented we merged the AML interpreter module into a kernel driver and then we had a basic working version of power management.
While we were working out the bugs in our in-kernel AML interpreter, we noticed that ACPI-CA software from Intel had a suitable license to merge into FreeBSD. As we were preparing to merge our ACPI into the main branch of the FreeBSD source repository we read the ACPI-CA implementation. We then decided to switch to ACPI-CA using glue code that we wrote. The reason we switched was that ACPI-CA is an OS-independent implementation so we can share and benefit from feedback from other groups. While the ACPI-CA implementation is larger, it is also more complete and well documented. So our implementation is no longer in the kernel, but it still remains in user-level tools such as amldb(8) and acpidump(8).