diff options
-rw-r--r-- | Kernel/ACPI/Initialize.cpp | 66 | ||||
-rw-r--r-- | Kernel/ACPI/Initialize.h | 35 | ||||
-rw-r--r-- | Kernel/Makefile | 1 | ||||
-rw-r--r-- | Kernel/init.cpp | 28 |
4 files changed, 104 insertions, 26 deletions
diff --git a/Kernel/ACPI/Initialize.cpp b/Kernel/ACPI/Initialize.cpp new file mode 100644 index 0000000000..76a93d707e --- /dev/null +++ b/Kernel/ACPI/Initialize.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il> + * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <Kernel/ACPI/ACPIDynamicParser.h> +#include <Kernel/CommandLine.h> + +namespace Kernel { +namespace ACPI { + +enum class FeatureLevel { + Enabled, + Limited, + Disabled, +}; + +static FeatureLevel determine_feature_level() +{ + auto value = kernel_command_line().lookup("acpi").value_or("on"); + if (value == "limited") + return FeatureLevel::Limited; + if (value == "off") + return FeatureLevel::Disabled; + return FeatureLevel::Enabled; +} + +void initialize() +{ + switch (determine_feature_level()) { + case FeatureLevel::Enabled: + ACPI::DynamicParser::initialize_without_rsdp(); + break; + case FeatureLevel::Limited: + ACPI::StaticParser::initialize_without_rsdp(); + break; + case FeatureLevel::Disabled: + ACPI::Parser::initialize_limited(); + break; + } +} + +} +} diff --git a/Kernel/ACPI/Initialize.h b/Kernel/ACPI/Initialize.h new file mode 100644 index 0000000000..f7d8b158d9 --- /dev/null +++ b/Kernel/ACPI/Initialize.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +namespace Kernel { +namespace ACPI { + +void initialize(); + +} +} diff --git a/Kernel/Makefile b/Kernel/Makefile index 357f0dc97a..110b35d006 100644 --- a/Kernel/Makefile +++ b/Kernel/Makefile @@ -125,6 +125,7 @@ OBJS = \ ACPI/ACPIStaticParser.o \ ACPI/ACPIDynamicParser.o \ ACPI/DMIDecoder.o \ + ACPI/Initialize.o \ ACPI/MultiProcessorParser.o \ WaitQueue.o \ init.o diff --git a/Kernel/init.cpp b/Kernel/init.cpp index e29f2f3aa5..824eed5213 100644 --- a/Kernel/init.cpp +++ b/Kernel/init.cpp @@ -28,6 +28,7 @@ #include <Kernel/ACPI/ACPIDynamicParser.h> #include <Kernel/ACPI/ACPIStaticParser.h> #include <Kernel/ACPI/DMIDecoder.h> +#include <Kernel/ACPI/Initialize.h> #include <Kernel/ACPI/MultiProcessorParser.h> #include <Kernel/Arch/i386/CPU.h> #include <Kernel/CMOS.h> @@ -85,7 +86,6 @@ namespace Kernel { [[noreturn]] static void init_stage2(); static void setup_serial_debug(); -static void setup_acpi(); static void setup_interrupts(); static void setup_time_management(); @@ -123,7 +123,7 @@ extern "C" [[noreturn]] void init() (*ctor)(); setup_interrupts(); - setup_acpi(); + ACPI::initialize(); new VFS; new KeyboardDevice; @@ -362,30 +362,6 @@ extern "C" int __cxa_atexit(void (*)(void*), void*, void*) return 0; } -void setup_acpi() -{ - if (!kernel_command_line().contains("acpi")) { - ACPI::DynamicParser::initialize_without_rsdp(); - return; - } - - auto acpi = kernel_command_line().get("acpi"); - if (acpi == "off") { - ACPI::Parser::initialize_limited(); - return; - } - if (acpi == "on") { - ACPI::DynamicParser::initialize_without_rsdp(); - return; - } - if (acpi == "limited") { - ACPI::StaticParser::initialize_without_rsdp(); - return; - } - klog() << "acpi boot argmuent has an invalid value."; - hang(); -} - void setup_interrupts() { InterruptManagement::initialize(); |