From aebacb6b6a71142588ec72241f5528a7e61ef001 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 1 Apr 2025 22:57:54 +0300 Subject: [PATCH] Kernel: Bypass PS2 detection if scancode set is forced --- kernel/kernel/Input/PS2/Controller.cpp | 19 ++++++++++++++----- kernel/kernel/kernel.cpp | 11 ++++++++--- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/kernel/kernel/Input/PS2/Controller.cpp b/kernel/kernel/Input/PS2/Controller.cpp index 7f34fc87..107c1bd5 100644 --- a/kernel/kernel/Input/PS2/Controller.cpp +++ b/kernel/kernel/Input/PS2/Controller.cpp @@ -240,12 +240,21 @@ namespace Kernel::Input BAN::ErrorOr PS2Controller::initialize_impl(uint8_t scancode_set) { - // Determine if the PS/2 Controller Exists - auto* fadt = static_cast(ACPI::ACPI::get().get_header("FACP"_sv, 0)); - if (fadt && fadt->revision > 1 && !(fadt->iapc_boot_arch & (1 << 1))) + constexpr size_t iapc_flag_off = offsetof(ACPI::FADT, iapc_boot_arch); + constexpr size_t iapc_flag_end = iapc_flag_off + sizeof(ACPI::FADT::iapc_boot_arch); + + // If user provided scan code set, skip FADT detection + if (scancode_set == 0xFF) + scancode_set = 0; + else if (scancode_set == 0) { - dwarnln_if(DEBUG_PS2, "No PS/2 available"); - return BAN::Error::from_errno(ENODEV); + // Determine if the PS/2 Controller Exists + auto* fadt = static_cast(ACPI::ACPI::get().get_header("FACP"_sv, 0)); + if (fadt && fadt->revision >= 3 && fadt->length >= iapc_flag_end && !(fadt->iapc_boot_arch & (1 << 1))) + { + dwarnln_if(DEBUG_PS2, "No PS/2 available"); + return BAN::Error::from_errno(ENODEV); + } } // Disable Devices diff --git a/kernel/kernel/kernel.cpp b/kernel/kernel/kernel.cpp index 6563e645..b75a7409 100644 --- a/kernel/kernel/kernel.cpp +++ b/kernel/kernel/kernel.cpp @@ -91,9 +91,14 @@ static void parse_command_line() g_disable_debug = true; else if (argument.starts_with("ps2=")) { - if (argument.size() != 5 || !isdigit(argument[4])) - dprintln("Invalid ps2= command line argument format '{}'", argument); - cmdline.ps2_override = argument[4] - '0'; + if (argument == "ps2=auto"_sv) + cmdline.ps2_override = 0xFF; + else + { + if (argument.size() != 5 || !isdigit(argument[4])) + dprintln("Invalid ps2= command line argument format '{}'", argument); + cmdline.ps2_override = argument[4] - '0'; + } } else if (argument.size() > 5 && argument.substring(0, 5) == "root=") cmdline.root = argument.substring(5);