Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6595 serge 1
/*******************************************************************************
2
 *
3
 * Module Name: utstate - state object support procedures
4
 *
5
 ******************************************************************************/
6
 
7
/*
8
 * Copyright (C) 2000 - 2015, Intel Corp.
9
 * All rights reserved.
10
 *
11
 * Redistribution and use in source and binary forms, with or without
12
 * modification, are permitted provided that the following conditions
13
 * are met:
14
 * 1. Redistributions of source code must retain the above copyright
15
 *    notice, this list of conditions, and the following disclaimer,
16
 *    without modification.
17
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18
 *    substantially similar to the "NO WARRANTY" disclaimer below
19
 *    ("Disclaimer") and any redistribution must be conditioned upon
20
 *    including a substantially similar Disclaimer requirement for further
21
 *    binary redistribution.
22
 * 3. Neither the names of the above-listed copyright holders nor the names
23
 *    of any contributors may be used to endorse or promote products derived
24
 *    from this software without specific prior written permission.
25
 *
26
 * Alternatively, this software may be distributed under the terms of the
27
 * GNU General Public License ("GPL") version 2 as published by the Free
28
 * Software Foundation.
29
 *
30
 * NO WARRANTY
31
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41
 * POSSIBILITY OF SUCH DAMAGES.
42
 */
43
 
44
#include 
45
#include "accommon.h"
46
 
47
#define _COMPONENT          ACPI_UTILITIES
48
ACPI_MODULE_NAME("utstate")
49
 
50
/*******************************************************************************
51
 *
52
 * FUNCTION:    acpi_ut_push_generic_state
53
 *
54
 * PARAMETERS:  list_head           - Head of the state stack
55
 *              state               - State object to push
56
 *
57
 * RETURN:      None
58
 *
59
 * DESCRIPTION: Push a state object onto a state stack
60
 *
61
 ******************************************************************************/
62
void
63
acpi_ut_push_generic_state(union acpi_generic_state **list_head,
64
			   union acpi_generic_state *state)
65
{
66
	ACPI_FUNCTION_ENTRY();
67
 
68
	/* Push the state object onto the front of the list (stack) */
69
 
70
	state->common.next = *list_head;
71
	*list_head = state;
72
	return;
73
}
74
 
75
/*******************************************************************************
76
 *
77
 * FUNCTION:    acpi_ut_pop_generic_state
78
 *
79
 * PARAMETERS:  list_head           - Head of the state stack
80
 *
81
 * RETURN:      The popped state object
82
 *
83
 * DESCRIPTION: Pop a state object from a state stack
84
 *
85
 ******************************************************************************/
86
 
87
union acpi_generic_state *acpi_ut_pop_generic_state(union acpi_generic_state
88
						    **list_head)
89
{
90
	union acpi_generic_state *state;
91
 
92
	ACPI_FUNCTION_ENTRY();
93
 
94
	/* Remove the state object at the head of the list (stack) */
95
 
96
	state = *list_head;
97
	if (state) {
98
 
99
		/* Update the list head */
100
 
101
		*list_head = state->common.next;
102
	}
103
 
104
	return (state);
105
}
106
 
107
/*******************************************************************************
108
 *
109
 * FUNCTION:    acpi_ut_create_generic_state
110
 *
111
 * PARAMETERS:  None
112
 *
113
 * RETURN:      The new state object. NULL on failure.
114
 *
115
 * DESCRIPTION: Create a generic state object. Attempt to obtain one from
116
 *              the global state cache;  If none available, create a new one.
117
 *
118
 ******************************************************************************/
119
 
120
union acpi_generic_state *acpi_ut_create_generic_state(void)
121
{
122
	union acpi_generic_state *state;
123
 
124
	ACPI_FUNCTION_ENTRY();
125
 
126
	state = acpi_os_acquire_object(acpi_gbl_state_cache);
127
	if (state) {
128
 
129
		/* Initialize */
130
		state->common.descriptor_type = ACPI_DESC_TYPE_STATE;
131
	}
132
 
133
	return (state);
134
}
135
 
136
/*******************************************************************************
137
 *
138
 * FUNCTION:    acpi_ut_create_thread_state
139
 *
140
 * PARAMETERS:  None
141
 *
142
 * RETURN:      New Thread State. NULL on failure
143
 *
144
 * DESCRIPTION: Create a "Thread State" - a flavor of the generic state used
145
 *              to track per-thread info during method execution
146
 *
147
 ******************************************************************************/
148
 
149
struct acpi_thread_state *acpi_ut_create_thread_state(void)
150
{
151
	union acpi_generic_state *state;
152
 
153
	ACPI_FUNCTION_ENTRY();
154
 
155
	/* Create the generic state object */
156
 
157
	state = acpi_ut_create_generic_state();
158
	if (!state) {
159
		return (NULL);
160
	}
161
 
162
	/* Init fields specific to the update struct */
163
 
164
	state->common.descriptor_type = ACPI_DESC_TYPE_STATE_THREAD;
165
	state->thread.thread_id = acpi_os_get_thread_id();
166
 
167
	/* Check for invalid thread ID - zero is very bad, it will break things */
168
 
169
	if (!state->thread.thread_id) {
170
		ACPI_ERROR((AE_INFO, "Invalid zero ID from AcpiOsGetThreadId"));
171
		state->thread.thread_id = (acpi_thread_id) 1;
172
	}
173
 
174
	return ((struct acpi_thread_state *)state);
175
}
176
 
177
/*******************************************************************************
178
 *
179
 * FUNCTION:    acpi_ut_create_update_state
180
 *
181
 * PARAMETERS:  object          - Initial Object to be installed in the state
182
 *              action          - Update action to be performed
183
 *
184
 * RETURN:      New state object, null on failure
185
 *
186
 * DESCRIPTION: Create an "Update State" - a flavor of the generic state used
187
 *              to update reference counts and delete complex objects such
188
 *              as packages.
189
 *
190
 ******************************************************************************/
191
 
192
union acpi_generic_state *acpi_ut_create_update_state(union acpi_operand_object
193
						      *object, u16 action)
194
{
195
	union acpi_generic_state *state;
196
 
197
	ACPI_FUNCTION_ENTRY();
198
 
199
	/* Create the generic state object */
200
 
201
	state = acpi_ut_create_generic_state();
202
	if (!state) {
203
		return (NULL);
204
	}
205
 
206
	/* Init fields specific to the update struct */
207
 
208
	state->common.descriptor_type = ACPI_DESC_TYPE_STATE_UPDATE;
209
	state->update.object = object;
210
	state->update.value = action;
211
	return (state);
212
}
213
 
214
/*******************************************************************************
215
 *
216
 * FUNCTION:    acpi_ut_create_pkg_state
217
 *
218
 * PARAMETERS:  object          - Initial Object to be installed in the state
219
 *              action          - Update action to be performed
220
 *
221
 * RETURN:      New state object, null on failure
222
 *
223
 * DESCRIPTION: Create a "Package State"
224
 *
225
 ******************************************************************************/
226
 
227
union acpi_generic_state *acpi_ut_create_pkg_state(void *internal_object,
228
						   void *external_object,
229
						   u16 index)
230
{
231
	union acpi_generic_state *state;
232
 
233
	ACPI_FUNCTION_ENTRY();
234
 
235
	/* Create the generic state object */
236
 
237
	state = acpi_ut_create_generic_state();
238
	if (!state) {
239
		return (NULL);
240
	}
241
 
242
	/* Init fields specific to the update struct */
243
 
244
	state->common.descriptor_type = ACPI_DESC_TYPE_STATE_PACKAGE;
245
	state->pkg.source_object = (union acpi_operand_object *)internal_object;
246
	state->pkg.dest_object = external_object;
247
	state->pkg.index = index;
248
	state->pkg.num_packages = 1;
249
	return (state);
250
}
251
 
252
/*******************************************************************************
253
 *
254
 * FUNCTION:    acpi_ut_create_control_state
255
 *
256
 * PARAMETERS:  None
257
 *
258
 * RETURN:      New state object, null on failure
259
 *
260
 * DESCRIPTION: Create a "Control State" - a flavor of the generic state used
261
 *              to support nested IF/WHILE constructs in the AML.
262
 *
263
 ******************************************************************************/
264
 
265
union acpi_generic_state *acpi_ut_create_control_state(void)
266
{
267
	union acpi_generic_state *state;
268
 
269
	ACPI_FUNCTION_ENTRY();
270
 
271
	/* Create the generic state object */
272
 
273
	state = acpi_ut_create_generic_state();
274
	if (!state) {
275
		return (NULL);
276
	}
277
 
278
	/* Init fields specific to the control struct */
279
 
280
	state->common.descriptor_type = ACPI_DESC_TYPE_STATE_CONTROL;
281
	state->common.state = ACPI_CONTROL_CONDITIONAL_EXECUTING;
282
	return (state);
283
}
284
 
285
/*******************************************************************************
286
 *
287
 * FUNCTION:    acpi_ut_delete_generic_state
288
 *
289
 * PARAMETERS:  state               - The state object to be deleted
290
 *
291
 * RETURN:      None
292
 *
293
 * DESCRIPTION: Release a state object to the state cache. NULL state objects
294
 *              are ignored.
295
 *
296
 ******************************************************************************/
297
 
298
void acpi_ut_delete_generic_state(union acpi_generic_state *state)
299
{
300
	ACPI_FUNCTION_ENTRY();
301
 
302
	/* Ignore null state */
303
 
304
	if (state) {
305
		(void)acpi_os_release_object(acpi_gbl_state_cache, state);
306
	}
307
	return;
308
}