forked from Bananymous/banan-os
Kernel: Implement AML To{Buffer,Integer,String}Op
This commit is contained in:
parent
17b7e9e772
commit
44d5c8c4b4
|
@ -0,0 +1,92 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <kernel/ACPI/AML/Buffer.h>
|
||||||
|
#include <kernel/ACPI/AML/Integer.h>
|
||||||
|
#include <kernel/ACPI/AML/ParseContext.h>
|
||||||
|
#include <kernel/ACPI/AML/String.h>
|
||||||
|
|
||||||
|
namespace Kernel::ACPI::AML
|
||||||
|
{
|
||||||
|
|
||||||
|
struct Conversion
|
||||||
|
{
|
||||||
|
static ParseResult parse(AML::ParseContext& context)
|
||||||
|
{
|
||||||
|
const auto opcode = static_cast<AML::Byte>(context.aml_data[0]);
|
||||||
|
context.aml_data = context.aml_data.slice(1);
|
||||||
|
|
||||||
|
switch (opcode)
|
||||||
|
{
|
||||||
|
case AML::Byte::ToIntegerOp:
|
||||||
|
case AML::Byte::ToBufferOp:
|
||||||
|
case AML::Byte::ToStringOp:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT_NOT_REACHED();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto data_result = AML::parse_object(context);
|
||||||
|
if (!data_result.success())
|
||||||
|
return ParseResult::Failure;
|
||||||
|
auto data_node = data_result.node();
|
||||||
|
if (!data_node)
|
||||||
|
{
|
||||||
|
AML_ERROR("Conversion {2H} data could not be evaluated", static_cast<uint8_t>(opcode));
|
||||||
|
return ParseResult::Failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (context.aml_data.size() < 1)
|
||||||
|
{
|
||||||
|
AML_ERROR("Conversion {2H} missing target", static_cast<uint8_t>(opcode));
|
||||||
|
return ParseResult::Failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
BAN::RefPtr<AML::Node> target_node;
|
||||||
|
if (context.aml_data[0] == 0x00)
|
||||||
|
context.aml_data = context.aml_data.slice(1);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto target_result = AML::parse_object(context);
|
||||||
|
if (!target_result.success())
|
||||||
|
return ParseResult::Failure;
|
||||||
|
target_node = target_result.node();
|
||||||
|
if (!target_node)
|
||||||
|
{
|
||||||
|
AML_ERROR("Conversion {2H} target invalid", static_cast<uint8_t>(opcode));
|
||||||
|
return ParseResult::Failure;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BAN::RefPtr<AML::Node> converted;
|
||||||
|
switch (opcode)
|
||||||
|
{
|
||||||
|
case AML::Byte::ToBufferOp:
|
||||||
|
converted = data_node->as_buffer();
|
||||||
|
break;
|
||||||
|
case AML::Byte::ToIntegerOp:
|
||||||
|
converted = data_node->as_integer();
|
||||||
|
break;
|
||||||
|
case AML::Byte::ToStringOp:
|
||||||
|
converted = data_node->as_string();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT_NOT_REACHED();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!converted)
|
||||||
|
{
|
||||||
|
AML_ERROR("Conversion {2H} could not convert from node type {}", static_cast<uint8_t>(opcode), static_cast<uint8_t>(data_node->type));
|
||||||
|
return ParseResult::Failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target_node && !target_node->store(converted))
|
||||||
|
{
|
||||||
|
AML_ERROR("Conversion {2H} failed to store converted value", static_cast<uint8_t>(opcode));
|
||||||
|
return ParseResult::Failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ParseResult(converted);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
#include <kernel/ACPI/AML/Alias.h>
|
#include <kernel/ACPI/AML/Alias.h>
|
||||||
#include <kernel/ACPI/AML/Buffer.h>
|
#include <kernel/ACPI/AML/Buffer.h>
|
||||||
#include <kernel/ACPI/AML/Bytes.h>
|
#include <kernel/ACPI/AML/Bytes.h>
|
||||||
|
#include <kernel/ACPI/AML/Conversion.h>
|
||||||
#include <kernel/ACPI/AML/Device.h>
|
#include <kernel/ACPI/AML/Device.h>
|
||||||
#include <kernel/ACPI/AML/Expression.h>
|
#include <kernel/ACPI/AML/Expression.h>
|
||||||
#include <kernel/ACPI/AML/Event.h>
|
#include <kernel/ACPI/AML/Event.h>
|
||||||
|
@ -166,6 +167,10 @@ namespace Kernel::ACPI
|
||||||
case AML::Byte::SubtractOp:
|
case AML::Byte::SubtractOp:
|
||||||
case AML::Byte::XorOp:
|
case AML::Byte::XorOp:
|
||||||
return AML::Expression::parse(context);
|
return AML::Expression::parse(context);
|
||||||
|
case AML::Byte::ToBufferOp:
|
||||||
|
case AML::Byte::ToIntegerOp:
|
||||||
|
case AML::Byte::ToStringOp:
|
||||||
|
return AML::Conversion::parse(context);
|
||||||
case AML::Byte::CreateBitFieldOp:
|
case AML::Byte::CreateBitFieldOp:
|
||||||
case AML::Byte::CreateByteFieldOp:
|
case AML::Byte::CreateByteFieldOp:
|
||||||
case AML::Byte::CreateWordFieldOp:
|
case AML::Byte::CreateWordFieldOp:
|
||||||
|
|
Loading…
Reference in New Issue