- if (!(acpi_ctx->fadt.boot_arch & IAPC_ARCH_8042)) {
- kprintf(KERROR "No PS/2 controller detected.\n");
- // FUTURE: Some alternative fallback on this? Check PCI bus for USB controller instead?
- return;
+ if (acpi_ctx->fadt.header.rev > 1) {
+ /*
+ * 只有当前ACPI版本大于1时,我们才使用FADT的IAPC_BOOT_ARCH去判断8042是否存在。
+ * 这是一个坑,在ACPI v1中,这个字段是reserved!而这及至APCI v2才出现。
+ * 需要注意:Bochs 和 QEMU 使用的是ACPI v1,而非 v2 (virtualbox好像是v4)
+ *
+ * 请看Bochs的bios源码(QEMU的BIOS其实是照抄bochs的,所以也是一个德行。。):
+ * https://bochs.sourceforge.io/cgi-bin/lxr/source/bios/rombios32.c#L1314
+ */
+ if (!(acpi_ctx->fadt.boot_arch & IAPC_ARCH_8042)) {
+ kprintf(KERROR "No PS/2 controller detected.\n");
+ // FUTURE: Some alternative fallback on this? Check PCI bus for USB controller instead?
+ return;
+ }
+ }
+ else {
+ kprintf(KWARN "Outdated FADT used, assuming 8042 always exist.\n");