PatchworkOS  2ca1c69
A non-POSIX operating system.
Loading...
Searching...
No Matches
resources.c
Go to the documentation of this file.
3
4#include <modules/acpi/acpi.h>
6
7#include <kernel/log/log.h>
8#include <kernel/log/panic.h>
10#include <kernel/utils/ref.h>
18#include <modules/acpi/tables.h>
19
20#include <errno.h>
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24
26{
27 if (device == NULL)
28 {
29 errno = EINVAL;
30 return NULL;
31 }
32
33 aml_object_t* crs = aml_namespace_find_child(NULL, device, AML_NAME('_', 'C', 'R', 'S'));
34 if (crs == NULL)
35 {
36 errno = ENOENT;
37 return NULL;
38 }
39 DEREF_DEFER(crs);
40
41 aml_object_t* crsResult = aml_evaluate(NULL, crs, AML_BUFFER);
42 if (crsResult == NULL)
43 {
44 return NULL;
45 }
46 DEREF_DEFER(crsResult);
47
48 if (crsResult->type != AML_BUFFER)
49 {
50 errno = EILSEQ;
51 return NULL;
52 }
53
54 acpi_resources_t* resources = malloc(sizeof(acpi_resources_t) + crsResult->buffer.length);
55 if (resources == NULL)
56 {
57 errno = ENOMEM;
58 return NULL;
59 }
60
61 resources->length = crsResult->buffer.length;
62 memcpy_s(resources->data, crsResult->buffer.length, crsResult->buffer.content, crsResult->buffer.length);
63
64 bool endTagFound = false;
65 acpi_resource_t* resource;
66 ACPI_RESOURCES_FOR_EACH(resource, resources)
67 {
68 if (endTagFound)
69 {
70 goto error;
71 }
72
73 acpi_item_name_t itemName = ACPI_RESOURCE_ITEM_NAME(resource);
74 uint64_t size = ACPI_RESOURCE_SIZE(resource);
75
76 switch (itemName)
77 {
79 {
80 if (size != sizeof(acpi_irq_descriptor_t) &&
81 size != sizeof(acpi_irq_descriptor_t) + 1) // The last byte is optional
82 {
83 goto error;
84 }
85 }
86 break;
88 {
89 if (size != sizeof(acpi_io_port_descriptor_t))
90 {
91 goto error;
92 }
93 }
94 break;
96 endTagFound = true;
97 break;
98 default:
99 break;
100 }
101 }
102
103 if (!endTagFound)
104 {
105 LOG_ERR("device '%s' _CRS missing end tag\n", AML_NAME_TO_STRING(device->name));
106 goto error;
107 }
108
109 return resources;
110error:
111 free(resources);
112 errno = EILSEQ;
113 return NULL;
114}
115
117{
118 free(resources);
119}
#define LOG_ERR(format,...)
Definition log.h:108
#define DEREF_DEFER(ptr)
RAII-style cleanup for scoped references.
Definition ref.h:54
#define ENOENT
No such file or directory.
Definition errno.h:42
#define EINVAL
Invalid argument.
Definition errno.h:142
#define ENOMEM
Out of memory.
Definition errno.h:92
#define errno
Error number variable.
Definition errno.h:27
#define EILSEQ
Illegal byte sequence.
Definition errno.h:447
#define NULL
Pointer error value.
Definition NULL.h:23
aml_object_t * aml_evaluate(aml_state_t *state, aml_object_t *object, aml_type_t targetTypes)
Evaluate an AML object.
Definition evaluate.c:8
#define AML_NAME_TO_STRING(name)
Macro to convert an aml_name_t to a stack allocated string.
Definition namespace.h:129
#define AML_NAME(a, b, c, d)
Macro to create an aml_name_t from 4 characters.
Definition namespace.h:112
aml_object_t * aml_namespace_find_child(aml_overlay_t *overlay, aml_object_t *parent, aml_name_t name)
Find a child object directly under a parent object in the namespace heirarchy.
Definition namespace.c:154
@ AML_BUFFER
Definition object.h:61
#define ACPI_RESOURCES_FOR_EACH(resource, resources)
Helper macro to iterate over all resource descriptors in an ACPI resources structure.
Definition resources.h:268
void acpi_resources_free(acpi_resources_t *resources)
Free an ACPI resources structure.
Definition resources.c:116
#define ACPI_RESOURCE_ITEM_NAME(resource)
Helper macro to get the generic item name of a resource descriptor.
Definition resources.h:243
#define ACPI_RESOURCE_SIZE(resource)
Helper macro to get the size of a resource descriptor.
Definition resources.h:254
acpi_resources_t * acpi_resources_current(aml_object_t *device)
Get the current ACPI resource settings for a device.
Definition resources.c:25
acpi_item_name_t
Generic ACPI resource item names.
Definition resources.h:225
@ ACPI_ITEM_NAME_IRQ
Definition resources.h:226
@ ACPI_ITEM_NAME_END_TAG
Definition resources.h:228
@ ACPI_ITEM_NAME_IO_PORT
Definition resources.h:227
errno_t memcpy_s(void *_RESTRICT s1, rsize_t s1max, const void *_RESTRICT s2, rsize_t n)
Definition memcpy_s.c:9
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
_PUBLIC void * malloc(size_t size)
Definition malloc.c:5
_PUBLIC void free(void *ptr)
Definition free.c:11
ACPI IO port resource descriptor.
Definition resources.h:145
ACPI IRQ resource descriptor.
Definition resources.h:79
Generic ACPI resource descriptor.
Definition resources.h:210
ACPI resources structure.
Definition resources.h:198
uint64_t length
Definition resources.h:199
uint8_t data[]
Definition resources.h:200
uint64_t length
Definition object.h:216
uint8_t * content
Definition object.h:215
ACPI object.
Definition object.h:447
aml_buffer_t buffer
Definition object.h:453