Branch data Line data Source code
1 : : // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 2 : : /******************************************************************************* 3 : : * 4 : : * Module Name: utstate - state object support procedures 5 : : * 6 : : ******************************************************************************/ 7 : : 8 : : #include <acpi/acpi.h> 9 : : #include "accommon.h" 10 : : 11 : : #define _COMPONENT ACPI_UTILITIES 12 : : ACPI_MODULE_NAME("utstate") 13 : : 14 : : /******************************************************************************* 15 : : * 16 : : * FUNCTION: acpi_ut_push_generic_state 17 : : * 18 : : * PARAMETERS: list_head - Head of the state stack 19 : : * state - State object to push 20 : : * 21 : : * RETURN: None 22 : : * 23 : : * DESCRIPTION: Push a state object onto a state stack 24 : : * 25 : : ******************************************************************************/ 26 : : void 27 : 3504222 : acpi_ut_push_generic_state(union acpi_generic_state **list_head, 28 : : union acpi_generic_state *state) 29 : : { 30 : 3504222 : ACPI_FUNCTION_ENTRY(); 31 : : 32 : : /* Push the state object onto the front of the list (stack) */ 33 : : 34 : 3504222 : state->common.next = *list_head; 35 : 3504222 : *list_head = state; 36 : 3504222 : return; 37 : : } 38 : : 39 : : /******************************************************************************* 40 : : * 41 : : * FUNCTION: acpi_ut_pop_generic_state 42 : : * 43 : : * PARAMETERS: list_head - Head of the state stack 44 : : * 45 : : * RETURN: The popped state object 46 : : * 47 : : * DESCRIPTION: Pop a state object from a state stack 48 : : * 49 : : ******************************************************************************/ 50 : : 51 : 3511741 : union acpi_generic_state *acpi_ut_pop_generic_state(union acpi_generic_state 52 : : **list_head) 53 : : { 54 : 3511741 : union acpi_generic_state *state; 55 : : 56 : 3511741 : ACPI_FUNCTION_ENTRY(); 57 : : 58 : : /* Remove the state object at the head of the list (stack) */ 59 : : 60 : 3511741 : state = *list_head; 61 [ + + ]: 3511741 : if (state) { 62 : : 63 : : /* Update the list head */ 64 : : 65 : 3503438 : *list_head = state->common.next; 66 : : } 67 : : 68 : 3511741 : return (state); 69 : : } 70 : : 71 : : /******************************************************************************* 72 : : * 73 : : * FUNCTION: acpi_ut_create_generic_state 74 : : * 75 : : * PARAMETERS: None 76 : : * 77 : : * RETURN: The new state object. NULL on failure. 78 : : * 79 : : * DESCRIPTION: Create a generic state object. Attempt to obtain one from 80 : : * the global state cache; If none available, create a new one. 81 : : * 82 : : ******************************************************************************/ 83 : : 84 : 3521435 : union acpi_generic_state *acpi_ut_create_generic_state(void) 85 : : { 86 : 3521435 : union acpi_generic_state *state; 87 : : 88 : 3521435 : ACPI_FUNCTION_ENTRY(); 89 : : 90 : 3521435 : state = acpi_os_acquire_object(acpi_gbl_state_cache); 91 [ + - ]: 3521435 : if (state) { 92 : : 93 : : /* Initialize */ 94 : 3521435 : state->common.descriptor_type = ACPI_DESC_TYPE_STATE; 95 : : } 96 : : 97 : 3521435 : return (state); 98 : : } 99 : : 100 : : /******************************************************************************* 101 : : * 102 : : * FUNCTION: acpi_ut_create_thread_state 103 : : * 104 : : * PARAMETERS: None 105 : : * 106 : : * RETURN: New Thread State. NULL on failure 107 : : * 108 : : * DESCRIPTION: Create a "Thread State" - a flavor of the generic state used 109 : : * to track per-thread info during method execution 110 : : * 111 : : ******************************************************************************/ 112 : : 113 : 4175 : struct acpi_thread_state *acpi_ut_create_thread_state(void) 114 : : { 115 : 4175 : union acpi_generic_state *state; 116 : : 117 : 4175 : ACPI_FUNCTION_ENTRY(); 118 : : 119 : : /* Create the generic state object */ 120 : : 121 : 4175 : state = acpi_ut_create_generic_state(); 122 [ + - ]: 4175 : if (!state) { 123 : : return (NULL); 124 : : } 125 : : 126 : : /* Init fields specific to the update struct */ 127 : : 128 : 4175 : state->common.descriptor_type = ACPI_DESC_TYPE_STATE_THREAD; 129 [ - + ]: 4175 : state->thread.thread_id = acpi_os_get_thread_id(); 130 : : 131 : : /* Check for invalid thread ID - zero is very bad, it will break things */ 132 : : 133 [ - + ]: 4175 : if (!state->thread.thread_id) { 134 : 0 : ACPI_ERROR((AE_INFO, "Invalid zero ID from AcpiOsGetThreadId")); 135 : 0 : state->thread.thread_id = (acpi_thread_id) 1; 136 : : } 137 : : 138 : : return ((struct acpi_thread_state *)state); 139 : : } 140 : : 141 : : /******************************************************************************* 142 : : * 143 : : * FUNCTION: acpi_ut_create_update_state 144 : : * 145 : : * PARAMETERS: object - Initial Object to be installed in the state 146 : : * action - Update action to be performed 147 : : * 148 : : * RETURN: New state object, null on failure 149 : : * 150 : : * DESCRIPTION: Create an "Update State" - a flavor of the generic state used 151 : : * to update reference counts and delete complex objects such 152 : : * as packages. 153 : : * 154 : : ******************************************************************************/ 155 : : 156 : 3158528 : union acpi_generic_state *acpi_ut_create_update_state(union acpi_operand_object 157 : : *object, u16 action) 158 : : { 159 : 3158528 : union acpi_generic_state *state; 160 : : 161 : 3158528 : ACPI_FUNCTION_ENTRY(); 162 : : 163 : : /* Create the generic state object */ 164 : : 165 : 3158528 : state = acpi_ut_create_generic_state(); 166 [ + - ]: 3158528 : if (!state) { 167 : : return (NULL); 168 : : } 169 : : 170 : : /* Init fields specific to the update struct */ 171 : : 172 : 3158528 : state->common.descriptor_type = ACPI_DESC_TYPE_STATE_UPDATE; 173 : 3158528 : state->update.object = object; 174 : 3158528 : state->update.value = action; 175 : 3158528 : return (state); 176 : : } 177 : : 178 : : /******************************************************************************* 179 : : * 180 : : * FUNCTION: acpi_ut_create_pkg_state 181 : : * 182 : : * PARAMETERS: object - Initial Object to be installed in the state 183 : : * action - Update action to be performed 184 : : * 185 : : * RETURN: New state object, null on failure 186 : : * 187 : : * DESCRIPTION: Create a "Package State" 188 : : * 189 : : ******************************************************************************/ 190 : : 191 : 8079 : union acpi_generic_state *acpi_ut_create_pkg_state(void *internal_object, 192 : : void *external_object, 193 : : u32 index) 194 : : { 195 : 8079 : union acpi_generic_state *state; 196 : : 197 : 8079 : ACPI_FUNCTION_ENTRY(); 198 : : 199 : : /* Create the generic state object */ 200 : : 201 : 8079 : state = acpi_ut_create_generic_state(); 202 [ + - ]: 8079 : if (!state) { 203 : : return (NULL); 204 : : } 205 : : 206 : : /* Init fields specific to the update struct */ 207 : : 208 : 8079 : state->common.descriptor_type = ACPI_DESC_TYPE_STATE_PACKAGE; 209 : 8079 : state->pkg.source_object = (union acpi_operand_object *)internal_object; 210 : 8079 : state->pkg.dest_object = external_object; 211 : 8079 : state->pkg.index = index; 212 : 8079 : state->pkg.num_packages = 1; 213 : : 214 : 8079 : return (state); 215 : : } 216 : : 217 : : /******************************************************************************* 218 : : * 219 : : * FUNCTION: acpi_ut_create_control_state 220 : : * 221 : : * PARAMETERS: None 222 : : * 223 : : * RETURN: New state object, null on failure 224 : : * 225 : : * DESCRIPTION: Create a "Control State" - a flavor of the generic state used 226 : : * to support nested IF/WHILE constructs in the AML. 227 : : * 228 : : ******************************************************************************/ 229 : : 230 : 18239 : union acpi_generic_state *acpi_ut_create_control_state(void) 231 : : { 232 : 18239 : union acpi_generic_state *state; 233 : : 234 : 18239 : ACPI_FUNCTION_ENTRY(); 235 : : 236 : : /* Create the generic state object */ 237 : : 238 : 18239 : state = acpi_ut_create_generic_state(); 239 [ + - ]: 18239 : if (!state) { 240 : : return (NULL); 241 : : } 242 : : 243 : : /* Init fields specific to the control struct */ 244 : : 245 : 18239 : state->common.descriptor_type = ACPI_DESC_TYPE_STATE_CONTROL; 246 : 18239 : state->common.state = ACPI_CONTROL_CONDITIONAL_EXECUTING; 247 : : 248 : 18239 : return (state); 249 : : } 250 : : 251 : : /******************************************************************************* 252 : : * 253 : : * FUNCTION: acpi_ut_delete_generic_state 254 : : * 255 : : * PARAMETERS: state - The state object to be deleted 256 : : * 257 : : * RETURN: None 258 : : * 259 : : * DESCRIPTION: Release a state object to the state cache. NULL state objects 260 : : * are ignored. 261 : : * 262 : : ******************************************************************************/ 263 : : 264 : 3521659 : void acpi_ut_delete_generic_state(union acpi_generic_state *state) 265 : : { 266 : 3521659 : ACPI_FUNCTION_ENTRY(); 267 : : 268 : : /* Ignore null state */ 269 : : 270 [ + + ]: 3521659 : if (state) { 271 : 3521435 : (void)acpi_os_release_object(acpi_gbl_state_cache, state); 272 : : } 273 : : 274 : 3521659 : return; 275 : : }