From 8eb572d038dbad4f066240fe6402603dd6e214dc Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sat, 22 Aug 2026 22:00:23 +0300 Subject: [PATCH] Kernel: Add reads/write to System CMOS to AML --- kernel/kernel/ACPI/AML/OpRegion.cpp | 35 +++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/kernel/kernel/ACPI/AML/OpRegion.cpp b/kernel/kernel/ACPI/AML/OpRegion.cpp index 17431936..152753cf 100644 --- a/kernel/kernel/ACPI/AML/OpRegion.cpp +++ b/kernel/kernel/ACPI/AML/OpRegion.cpp @@ -494,8 +494,23 @@ namespace Kernel::ACPI::AML return TRY(embedded_controller->read_byte(offset)); } - case GAS::AddressSpaceID::SMBus: case GAS::AddressSpaceID::SystemCMOS: + if (byte_offset >= 64) + { + dwarnln("CMOS read from offset 0x{H}", byte_offset); + return BAN::Error::from_errno(ENOTSUP); + } + switch (access_size) + { + case 1: + IO::outb(0x70, offset); + return IO::inb(0x71); + default: + dwarnln("{} byte read from CMOS offset {2H}", access_size, byte_offset); + return BAN::Error::from_errno(EINVAL); + } + ASSERT_NOT_REACHED(); + case GAS::AddressSpaceID::SMBus: case GAS::AddressSpaceID::PCIBarTarget: case GAS::AddressSpaceID::IPMI: case GAS::AddressSpaceID::GeneralPurposeIO: @@ -581,8 +596,24 @@ namespace Kernel::ACPI::AML TRY(embedded_controller->write_byte(offset, value)); return {}; } - case GAS::AddressSpaceID::SMBus: case GAS::AddressSpaceID::SystemCMOS: + if (byte_offset >= 64) + { + dwarnln("CMOS write to offset 0x{H}", byte_offset); + return BAN::Error::from_errno(ENOTSUP); + } + switch (access_size) + { + case 1: + IO::outb(0x70, offset); + IO::outb(0x71, value); + break; + default: + dwarnln("{} byte write to CMOS offset {2H}", access_size, byte_offset); + return BAN::Error::from_errno(EINVAL); + } + return {}; + case GAS::AddressSpaceID::SMBus: case GAS::AddressSpaceID::PCIBarTarget: case GAS::AddressSpaceID::IPMI: case GAS::AddressSpaceID::GeneralPurposeIO: