forked from Bananymous/banan-os
				
			Kernel: Implement dummy AML NotifyOp
This commit is contained in:
		
							parent
							
								
									da0c45b7ee
								
							
						
					
					
						commit
						aefb33efff
					
				|  | @ -0,0 +1,66 @@ | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <kernel/ACPI/AML/Device.h> | ||||||
|  | #include <kernel/ACPI/AML/ParseContext.h> | ||||||
|  | #include <kernel/ACPI/AML/Processor.h> | ||||||
|  | #include <kernel/ACPI/AML/ThermalZone.h> | ||||||
|  | 
 | ||||||
|  | namespace Kernel::ACPI::AML | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | 	struct Notify | ||||||
|  | 	{ | ||||||
|  | 		static ParseResult parse(ParseContext& context) | ||||||
|  | 		{ | ||||||
|  | 			ASSERT(context.aml_data.size() >= 1); | ||||||
|  | 			ASSERT(static_cast<Byte>(context.aml_data[0]) == Byte::NotifyOp); | ||||||
|  | 			context.aml_data = context.aml_data.slice(1); | ||||||
|  | 
 | ||||||
|  | 			auto object_result = AML::parse_object(context); | ||||||
|  | 			if (!object_result.success()) | ||||||
|  | 				return ParseResult::Failure; | ||||||
|  | 			auto object = object_result.node(); | ||||||
|  | 			if (!object) | ||||||
|  | 			{ | ||||||
|  | 				AML_ERROR("Notify object is null"); | ||||||
|  | 				return ParseResult::Failure; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			auto value_result = AML::parse_object(context); | ||||||
|  | 			if (!value_result.success()) | ||||||
|  | 				return ParseResult::Failure; | ||||||
|  | 			auto value = value_result.node() ? value_result.node()->as_integer() : BAN::Optional<uint64_t>(); | ||||||
|  | 			if (!value.has_value()) | ||||||
|  | 			{ | ||||||
|  | 				AML_ERROR("Notify value is not an integer"); | ||||||
|  | 				return ParseResult::Failure; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			BAN::StringView object_type_sv; | ||||||
|  | 			BAN::StringView object_name_sv; | ||||||
|  | 			switch (object->type) | ||||||
|  | 			{ | ||||||
|  | 				case AML::Node::Type::Device: | ||||||
|  | 					object_type_sv = "Device"sv; | ||||||
|  | 					object_name_sv = static_cast<AML::Device*>(object.ptr())->name.sv(); | ||||||
|  | 					break; | ||||||
|  | 				case AML::Node::Type::Processor: | ||||||
|  | 					object_type_sv = "Processor"sv; | ||||||
|  | 					object_name_sv = static_cast<AML::Processor*>(object.ptr())->name.sv(); | ||||||
|  | 					break; | ||||||
|  | 				case AML::Node::Type::ThermalZone: | ||||||
|  | 					object_type_sv = "ThermalZone"sv; | ||||||
|  | 					object_name_sv = static_cast<AML::ThermalZone*>(object.ptr())->name.sv(); | ||||||
|  | 					break; | ||||||
|  | 				default: | ||||||
|  | 					object_type_sv = "Unknown"sv; | ||||||
|  | 					object_name_sv = "????"sv; | ||||||
|  | 					break; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			AML_TODO("Notify: {} {}: {2H}", object_type_sv, object_name_sv, value.value()); | ||||||
|  | 			return ParseResult::Success; | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -10,6 +10,7 @@ | ||||||
| #include <kernel/ACPI/AML/Mutex.h> | #include <kernel/ACPI/AML/Mutex.h> | ||||||
| #include <kernel/ACPI/AML/Names.h> | #include <kernel/ACPI/AML/Names.h> | ||||||
| #include <kernel/ACPI/AML/Node.h> | #include <kernel/ACPI/AML/Node.h> | ||||||
|  | #include <kernel/ACPI/AML/Notify.h> | ||||||
| #include <kernel/ACPI/AML/Package.h> | #include <kernel/ACPI/AML/Package.h> | ||||||
| #include <kernel/ACPI/AML/ParseContext.h> | #include <kernel/ACPI/AML/ParseContext.h> | ||||||
| #include <kernel/ACPI/AML/PowerResource.h> | #include <kernel/ACPI/AML/PowerResource.h> | ||||||
|  | @ -173,6 +174,11 @@ namespace Kernel::ACPI | ||||||
| 				return AML::Reference::parse(context); | 				return AML::Reference::parse(context); | ||||||
| 			case AML::Byte::IndexOp: | 			case AML::Byte::IndexOp: | ||||||
| 				return AML::Index::parse(context); | 				return AML::Index::parse(context); | ||||||
|  | 			case AML::Byte::NotifyOp: | ||||||
|  | 				return AML::Notify::parse(context); | ||||||
|  | 			case AML::Byte::NoopOp: | ||||||
|  | 				context.aml_data = context.aml_data.slice(1); | ||||||
|  | 				return ParseResult::Success; | ||||||
| 			case AML::Byte::ReturnOp: | 			case AML::Byte::ReturnOp: | ||||||
| 			{ | 			{ | ||||||
| 				context.aml_data = context.aml_data.slice(1); | 				context.aml_data = context.aml_data.slice(1); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue