PatchworkOS
Loading...
Searching...
No Matches
buffer_field.c
Go to the documentation of this file.
2
3#include <sys/math.h>
4
5#include <errno.h>
6
7#define AML_BUFFER_FIELD_TEMP_SIZE 256
8
10{
11 if (bufferField == NULL || out == NULL)
12 {
13 errno = EINVAL;
14 return ERR;
15 }
16
17 uint64_t byteSize = (bufferField->bitSize + 7) / 8;
18 if (byteSize > aml_integer_byte_size())
19 {
20 if (aml_buffer_set_empty(out, byteSize) == ERR)
21 {
22 return ERR;
23 }
24 }
25 else
26 {
27 if (aml_integer_set(out, 0) == ERR)
28 {
29 return ERR;
30 }
31 }
32
33 uint64_t i = 0;
34 while (1)
35 {
36 uint64_t remainingBits = bufferField->bitSize - i;
37 if (remainingBits == 0)
38 {
39 break;
40 }
41
43 uint64_t bitsToRead = MIN(remainingBits, AML_BUFFER_FIELD_TEMP_SIZE * 8);
44 if (aml_object_get_bits_at(bufferField->target, bufferField->bitOffset + i, bitsToRead, temp) == ERR)
45 {
47 return ERR;
48 }
49
50 if (aml_object_set_bits_at(out, i, bitsToRead, temp) == ERR)
51 {
53 return ERR;
54 }
55
56 i += bitsToRead;
57 }
58
59 return 0;
60}
61
63{
64 if (bufferField == NULL || in == NULL)
65 {
66 errno = EINVAL;
67 return ERR;
68 }
69
70 aml_type_t inType = in->type;
71 if (inType != AML_BUFFER && inType != AML_INTEGER)
72 {
73 errno = EINVAL;
74 return ERR;
75 }
76
77 uint64_t i = 0;
78 while (1)
79 {
80 uint64_t remainingBits = bufferField->bitSize - i;
81 if (remainingBits == 0)
82 {
83 break;
84 }
85
87 uint64_t bitsToWrite = MIN(remainingBits, AML_BUFFER_FIELD_TEMP_SIZE * 8);
88 if (aml_object_get_bits_at(in, i, bitsToWrite, temp) == ERR)
89 {
90 return ERR;
91 }
92
93 if (aml_object_set_bits_at(bufferField->target, bufferField->bitOffset + i, bitsToWrite, temp) == ERR)
94 {
95 return ERR;
96 }
97
98 i += bitsToWrite;
99 }
100
101 return 0;
102}
#define AML_BUFFER_FIELD_TEMP_SIZE
Definition buffer_field.c:7
uint64_t aml_buffer_field_load(aml_buffer_field_obj_t *bufferField, aml_object_t *out)
Read the value stored in a BufferField and store it in the out object.
Definition buffer_field.c:9
uint64_t aml_buffer_field_store(aml_buffer_field_obj_t *bufferField, aml_object_t *in)
Write a value to a BufferField.
uint8_t aml_integer_byte_size(void) PURE_FUNC
Get the byte size of an AML integer.
Definition integer.c:22
aml_type_t
ACPI data types.
Definition object.h:57
uint64_t aml_integer_set(aml_object_t *object, aml_integer_t value)
Set a object as an integer with the given value and bit width.
Definition object.c:708
uint64_t aml_object_set_bits_at(aml_object_t *object, aml_bit_size_t bitOffset, aml_bit_size_t bitSize, uint8_t *in)
Store bits into a object at the specified bit offset and size.
Definition object.c:338
uint64_t aml_buffer_set_empty(aml_object_t *object, uint64_t length)
Set a object as an empty buffer with the given length.
Definition object.c:487
void aml_object_clear(aml_object_t *object)
Clear the data of a object, setting its type to AML_UNINITIALIZED.
Definition object.c:87
uint64_t aml_object_get_bits_at(aml_object_t *object, aml_bit_size_t bitOffset, aml_bit_size_t bitSize, uint8_t *out)
Retrieve bits from a object at the specified bit offset and size.
Definition object.c:399
@ AML_INTEGER
Definition object.h:65
@ AML_BUFFER
Definition object.h:59
#define EINVAL
Invalid argument.
Definition errno.h:142
#define errno
Error number variable.
Definition errno.h:27
#define MIN(x, y)
Definition math.h:16
#define NULL
Pointer error value.
Definition NULL.h:23
#define ERR
Integer error value.
Definition ERR.h:17
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
__UINT8_TYPE__ uint8_t
Definition stdint.h:11
Data for a buffer field object.
Definition object.h:223
aml_object_t * target
Definition object.h:225
aml_bit_size_t bitSize
Definition object.h:227
aml_bit_size_t bitOffset
Definition object.h:226
ACPI object.
Definition object.h:425