PatchworkOS
Loading...
Searching...
No Matches
exception.c
Go to the documentation of this file.
2
3#include <kernel/log/log.h>
5
6#include <stddef.h>
7#include <stdlib.h>
8#include <string.h>
9
10typedef struct
11{
13 const char* name;
15
17 {AML_ERROR, "AE_AML_ERROR"},
18 {AML_PARSE, "AE_AML_PARSE"},
19 {AML_BAD_OPCODE, "AE_AML_BAD_OPCODE"},
20 {AML_NO_OPERAND, "AE_AML_NO_OPERAND"},
21 {AML_OPERAND_TYPE, "AE_AML_OPERAND_TYPE"},
22 {AML_OPERAND_VALUE, "AE_AML_OPERAND_VALUE"},
23 {AML_UNINITIALIZED_LOCAL, "AE_AML_UNINITIALIZED_LOCAL"},
24 {AML_UNINITIALIZED_ARG, "AE_AML_UNINITIALIZED_ARG"},
25 {AML_UNINITIALIZED_ELEMENT, "AE_AML_UNINITIALIZED_ELEMENT"},
26 {AML_NUMERIC_OVERFLOW, "AE_AML_NUMERIC_OVERFLOW"},
27 {AML_REGION_LIMIT, "AE_AML_REGION_LIMIT"},
28 {AML_BUFFER_LIMIT, "AE_AML_BUFFER_LIMIT"},
29 {AML_PACKAGE_LIMIT, "AE_AML_PACKAGE_LIMIT"},
30 {AML_DIVIDE_BY_ZERO, "AE_AML_DIVIDE_BY_ZERO"},
31 {AML_BAD_NAME, "AE_AML_BAD_NAME"},
32 {AML_NAME_NOT_FOUND, "AE_AML_NAME_NOT_FOUND"},
33 {AML_INTERNAL, "AE_AML_INTERNAL"},
34 {AML_INVALID_SPACE_ID, "AE_AML_INVALID_SPACE_ID"},
35 {AML_STRING_LIMIT, "AE_AML_STRING_LIMIT"},
36 {AML_NO_RETURN_VALUE, "AE_AML_NO_RETURN_VALUE"},
37 {AML_METHOD_LIMIT, "AE_AML_METHOD_LIMIT"},
38 {AML_NOT_OWNER, "AE_AML_NOT_OWNER"},
39 {AML_MUTEX_ORDER, "AE_AML_MUTEX_ORDER"},
40 {AML_MUTEX_NOT_ACQUIRED, "AE_AML_MUTEX_NOT_ACQUIRED"},
41 {AML_INVALID_RESOURCE_TYPE, "AE_AML_INVALID_RESOURCE_TYPE"},
42 {AML_INVALID_INDEX, "AE_AML_INVALID_INDEX"},
43 {AML_REGISTER_LIMIT, "AE_AML_REGISTER_LIMIT"},
44 {AML_NO_WHILE, "AE_AML_NO_WHILE"},
45 {AML_ALIGNMENT, "AE_AML_ALIGNMENT"},
46 {AML_NO_RESOURCE_END_TAG, "AE_AML_NO_RESOURCE_END_TAG"},
47 {AML_BAD_RESOURCE_VALUE, "AE_AML_BAD_RESOURCE_VALUE"},
48 {AML_CIRCULAR_REFERENCE, "AE_AML_CIRCULAR_REFERENCE"},
49};
50
53
55{
56 for (uint64_t i = 0; i < sizeof(exceptionTable) / sizeof(exceptionTable[0]); i++)
57 {
58 if (exceptionTable[i].code == code)
59 {
60 return exceptionTable[i].name;
61 }
62 }
63 return "AE_AML_UNKNOWN_EXCEPTION";
64}
65
67{
68 for (uint64_t i = 0; i < handlerCount; i++)
69 {
70 if (handlers[i] == handler)
71 {
72 errno = EEXIST;
73 return ERR;
74 }
75 }
76
78 if (newHandlers == NULL)
79 {
80 return ERR;
81 }
82
83 for (uint64_t i = 0; i < handlerCount; i++)
84 {
85 newHandlers[i] = handlers[i];
86 }
87 newHandlers[handlerCount] = handler;
89
90 if (handlers != NULL)
91 {
93 }
94 handlers = newHandlers;
95
96 return 0;
97}
98
100{
101 if (handlers == NULL || handlerCount == 0)
102 {
103 return;
104 }
105
106 uint64_t index = handlerCount;
107 for (uint64_t i = 0; i < handlerCount; i++)
108 {
109 if (handlers[i] == handler)
110 {
111 index = i;
112 break;
113 }
114 }
115
116 if (index == handlerCount)
117 {
118 return;
119 }
120
121 // Perhaps slightly inefficient, but whatever.
122 memmove(&handlers[index], &handlers[index + 1], sizeof(aml_exception_handler_t) * (handlerCount - index - 1));
123 handlerCount--;
124
125 if (handlerCount == 0)
126 {
127 free(handlers);
128 handlers = NULL;
129 return;
130 }
131}
132
133void aml_exception_raise(aml_state_t* state, aml_exception_t code, const char* function)
134{
135#ifdef TESTING
136 LOG_WARN("AML EXCEPTION '%s' (0x%x) in '%s()'. (Probably intentional)\n", aml_exception_to_string(code), code,
137 function);
138#else
139 LOG_WARN("AML EXCEPTION '%s' (0x%x) in '%s()'\n", aml_exception_to_string(code), code, function);
140#endif
141
142 for (uint64_t i = 0; i < handlerCount; i++)
143 {
144 handlers[i](state, code);
145 }
146}
static uint64_t handlerCount
Definition exception.c:52
static const aml_exception_info_t exceptionTable[]
Definition exception.c:16
static aml_exception_handler_t * handlers
Definition exception.c:51
void(* aml_exception_handler_t)(aml_state_t *state, aml_exception_t code)
AML exception handler function type.
Definition exception.h:68
void aml_exception_raise(aml_state_t *state, aml_exception_t code, const char *function)
Raises an AML exception.
Definition exception.c:133
const char * aml_exception_to_string(aml_exception_t code)
Converts an AML exception code to a string.
Definition exception.c:54
void aml_exception_unregister(aml_exception_handler_t handler)
Unregisters an AML exception handler.
Definition exception.c:99
uint64_t aml_exception_register(aml_exception_handler_t handler)
Registers an AML exception handler.
Definition exception.c:66
aml_exception_t
AML exception codes.
Definition exception.h:29
@ AML_BAD_NAME
Definition exception.h:44
@ AML_DIVIDE_BY_ZERO
Definition exception.h:43
@ AML_METHOD_LIMIT
Definition exception.h:50
@ AML_STRING_LIMIT
Definition exception.h:48
@ AML_UNINITIALIZED_ARG
Definition exception.h:37
@ AML_UNINITIALIZED_ELEMENT
Definition exception.h:38
@ AML_CIRCULAR_REFERENCE
Definition exception.h:61
@ AML_REGISTER_LIMIT
Definition exception.h:56
@ AML_NUMERIC_OVERFLOW
Definition exception.h:39
@ AML_NAME_NOT_FOUND
Definition exception.h:45
@ AML_INTERNAL
Definition exception.h:46
@ AML_INVALID_INDEX
Definition exception.h:55
@ AML_REGION_LIMIT
Definition exception.h:40
@ AML_PARSE
Definition exception.h:31
@ AML_OPERAND_VALUE
Definition exception.h:35
@ AML_ERROR
Definition exception.h:30
@ AML_PACKAGE_LIMIT
Definition exception.h:42
@ AML_ALIGNMENT
Definition exception.h:58
@ AML_MUTEX_NOT_ACQUIRED
Definition exception.h:53
@ AML_BAD_OPCODE
Definition exception.h:32
@ AML_OPERAND_TYPE
Definition exception.h:34
@ AML_NO_WHILE
Definition exception.h:57
@ AML_NO_OPERAND
Definition exception.h:33
@ AML_NOT_OWNER
Definition exception.h:51
@ AML_UNINITIALIZED_LOCAL
Definition exception.h:36
@ AML_BAD_RESOURCE_VALUE
Definition exception.h:60
@ AML_NO_RETURN_VALUE
Definition exception.h:49
@ AML_MUTEX_ORDER
Definition exception.h:52
@ AML_INVALID_SPACE_ID
Definition exception.h:47
@ AML_BUFFER_LIMIT
Definition exception.h:41
@ AML_INVALID_RESOURCE_TYPE
Definition exception.h:54
@ AML_NO_RESOURCE_END_TAG
Definition exception.h:59
#define LOG_WARN(format,...)
Definition log.h:88
#define EEXIST
File exists.
Definition errno.h:117
#define errno
Error number variable.
Definition errno.h:27
#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
_PUBLIC void * malloc(size_t size)
Definition malloc.c:5
_PUBLIC void free(void *ptr)
Definition free.c:11
_PUBLIC void * memmove(void *_RESTRICT s1, const void *_RESTRICT s2, size_t n)
const char * name
Definition exception.c:13
aml_exception_t code
Definition exception.c:12
AML State.
Definition state.h:25