diff --git a/kernel/include/kernel/ACPI/AML/Buffer.h b/kernel/include/kernel/ACPI/AML/Buffer.h index 3bbacb7d..e4a270be 100644 --- a/kernel/include/kernel/ACPI/AML/Buffer.h +++ b/kernel/include/kernel/ACPI/AML/Buffer.h @@ -43,7 +43,7 @@ namespace Kernel::ACPI::AML if (!buffer_size.has_value()) return ParseResult::Failure; - uint32_t actual_buffer_size = BAN::Math::max(buffer_size.value(), buffer_context.aml_data.size()); + uint32_t actual_buffer_size = BAN::Math::max(buffer_size.value(), buffer_context.aml_data.size()); auto buffer = MUST(BAN::RefPtr::create()); MUST(buffer->buffer.resize(actual_buffer_size, 0)); diff --git a/kernel/kernel/ACPI/ACPI.cpp b/kernel/kernel/ACPI/ACPI.cpp index ed760db2..a1a2d41f 100644 --- a/kernel/kernel/ACPI/ACPI.cpp +++ b/kernel/kernel/ACPI/ACPI.cpp @@ -19,10 +19,10 @@ namespace Kernel::ACPI { - static uint32_t* s_global_lock { nullptr }; // https://uefi.org/htmlspecs/ACPI_Spec_6_4_html/05_ACPI_Software_Programming_Model/ACPI_Software_Programming_Model.html#global-lock +#if ARCH(x86_64) asm(R"( .global acpi_acquire_global_lock acpi_acquire_global_lock: @@ -54,6 +54,41 @@ acpi_release_global_lock: ret )"); +#elif ARCH(i686) +asm(R"( +.global acpi_acquire_global_lock +acpi_acquire_global_lock: + movl 4(%esp), %ecx + movl (%ecx), %edx + andl $(~1), %edx + btsl $1, %edx + adcl $0, %edx + + lock cmpxchgl %edx, (%ecx) + jnz acpi_acquire_global_lock + + cmpb $3, %dl + sbbl %eax, %eax + negl %eax + + ret + +.global acpi_release_global_lock +acpi_release_global_lock: + movl 4(%esp), %ecx + movl (%ecx), %eax + movl %eax, %edx + + andl $(~3), %edx + + lock cmpxchgl %edx, (%ecx) + jnz acpi_release_global_lock + + andl $1, %eax + + ret +)"); +#endif // returns true if lock was acquired successfully extern "C" bool acpi_acquire_global_lock(uint32_t* lock);