diff options
Diffstat (limited to 'drivers/acpi/executer/exoparg3.c')
-rw-r--r-- | drivers/acpi/executer/exoparg3.c | 272 |
1 files changed, 0 insertions, 272 deletions
diff --git a/drivers/acpi/executer/exoparg3.c b/drivers/acpi/executer/exoparg3.c deleted file mode 100644 index 9cb4197681af..000000000000 --- a/drivers/acpi/executer/exoparg3.c +++ /dev/null | |||
@@ -1,272 +0,0 @@ | |||
1 | |||
2 | /****************************************************************************** | ||
3 | * | ||
4 | * Module Name: exoparg3 - AML execution - opcodes with 3 arguments | ||
5 | * | ||
6 | *****************************************************************************/ | ||
7 | |||
8 | /* | ||
9 | * Copyright (C) 2000 - 2008, Intel Corp. | ||
10 | * All rights reserved. | ||
11 | * | ||
12 | * Redistribution and use in source and binary forms, with or without | ||
13 | * modification, are permitted provided that the following conditions | ||
14 | * are met: | ||
15 | * 1. Redistributions of source code must retain the above copyright | ||
16 | * notice, this list of conditions, and the following disclaimer, | ||
17 | * without modification. | ||
18 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
19 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
20 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
21 | * including a substantially similar Disclaimer requirement for further | ||
22 | * binary redistribution. | ||
23 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
24 | * of any contributors may be used to endorse or promote products derived | ||
25 | * from this software without specific prior written permission. | ||
26 | * | ||
27 | * Alternatively, this software may be distributed under the terms of the | ||
28 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
29 | * Software Foundation. | ||
30 | * | ||
31 | * NO WARRANTY | ||
32 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
33 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
34 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
35 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
36 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
37 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
38 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
39 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
40 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
41 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
42 | * POSSIBILITY OF SUCH DAMAGES. | ||
43 | */ | ||
44 | |||
45 | #include <acpi/acpi.h> | ||
46 | #include <acpi/acinterp.h> | ||
47 | #include <acpi/acparser.h> | ||
48 | #include <acpi/amlcode.h> | ||
49 | |||
50 | #define _COMPONENT ACPI_EXECUTER | ||
51 | ACPI_MODULE_NAME("exoparg3") | ||
52 | |||
53 | /*! | ||
54 | * Naming convention for AML interpreter execution routines. | ||
55 | * | ||
56 | * The routines that begin execution of AML opcodes are named with a common | ||
57 | * convention based upon the number of arguments, the number of target operands, | ||
58 | * and whether or not a value is returned: | ||
59 | * | ||
60 | * AcpiExOpcode_xA_yT_zR | ||
61 | * | ||
62 | * Where: | ||
63 | * | ||
64 | * xA - ARGUMENTS: The number of arguments (input operands) that are | ||
65 | * required for this opcode type (1 through 6 args). | ||
66 | * yT - TARGETS: The number of targets (output operands) that are required | ||
67 | * for this opcode type (0, 1, or 2 targets). | ||
68 | * zR - RETURN VALUE: Indicates whether this opcode type returns a value | ||
69 | * as the function return (0 or 1). | ||
70 | * | ||
71 | * The AcpiExOpcode* functions are called via the Dispatcher component with | ||
72 | * fully resolved operands. | ||
73 | !*/ | ||
74 | /******************************************************************************* | ||
75 | * | ||
76 | * FUNCTION: acpi_ex_opcode_3A_0T_0R | ||
77 | * | ||
78 | * PARAMETERS: walk_state - Current walk state | ||
79 | * | ||
80 | * RETURN: Status | ||
81 | * | ||
82 | * DESCRIPTION: Execute Triadic operator (3 operands) | ||
83 | * | ||
84 | ******************************************************************************/ | ||
85 | acpi_status acpi_ex_opcode_3A_0T_0R(struct acpi_walk_state *walk_state) | ||
86 | { | ||
87 | union acpi_operand_object **operand = &walk_state->operands[0]; | ||
88 | struct acpi_signal_fatal_info *fatal; | ||
89 | acpi_status status = AE_OK; | ||
90 | |||
91 | ACPI_FUNCTION_TRACE_STR(ex_opcode_3A_0T_0R, | ||
92 | acpi_ps_get_opcode_name(walk_state->opcode)); | ||
93 | |||
94 | switch (walk_state->opcode) { | ||
95 | case AML_FATAL_OP: /* Fatal (fatal_type fatal_code fatal_arg) */ | ||
96 | |||
97 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
98 | "FatalOp: Type %X Code %X Arg %X <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n", | ||
99 | (u32) operand[0]->integer.value, | ||
100 | (u32) operand[1]->integer.value, | ||
101 | (u32) operand[2]->integer.value)); | ||
102 | |||
103 | fatal = ACPI_ALLOCATE(sizeof(struct acpi_signal_fatal_info)); | ||
104 | if (fatal) { | ||
105 | fatal->type = (u32) operand[0]->integer.value; | ||
106 | fatal->code = (u32) operand[1]->integer.value; | ||
107 | fatal->argument = (u32) operand[2]->integer.value; | ||
108 | } | ||
109 | |||
110 | /* Always signal the OS! */ | ||
111 | |||
112 | status = acpi_os_signal(ACPI_SIGNAL_FATAL, fatal); | ||
113 | |||
114 | /* Might return while OS is shutting down, just continue */ | ||
115 | |||
116 | ACPI_FREE(fatal); | ||
117 | break; | ||
118 | |||
119 | default: | ||
120 | |||
121 | ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", | ||
122 | walk_state->opcode)); | ||
123 | status = AE_AML_BAD_OPCODE; | ||
124 | goto cleanup; | ||
125 | } | ||
126 | |||
127 | cleanup: | ||
128 | |||
129 | return_ACPI_STATUS(status); | ||
130 | } | ||
131 | |||
132 | /******************************************************************************* | ||
133 | * | ||
134 | * FUNCTION: acpi_ex_opcode_3A_1T_1R | ||
135 | * | ||
136 | * PARAMETERS: walk_state - Current walk state | ||
137 | * | ||
138 | * RETURN: Status | ||
139 | * | ||
140 | * DESCRIPTION: Execute Triadic operator (3 operands) | ||
141 | * | ||
142 | ******************************************************************************/ | ||
143 | |||
144 | acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state) | ||
145 | { | ||
146 | union acpi_operand_object **operand = &walk_state->operands[0]; | ||
147 | union acpi_operand_object *return_desc = NULL; | ||
148 | char *buffer = NULL; | ||
149 | acpi_status status = AE_OK; | ||
150 | acpi_integer index; | ||
151 | acpi_size length; | ||
152 | |||
153 | ACPI_FUNCTION_TRACE_STR(ex_opcode_3A_1T_1R, | ||
154 | acpi_ps_get_opcode_name(walk_state->opcode)); | ||
155 | |||
156 | switch (walk_state->opcode) { | ||
157 | case AML_MID_OP: /* Mid (Source[0], Index[1], Length[2], Result[3]) */ | ||
158 | |||
159 | /* | ||
160 | * Create the return object. The Source operand is guaranteed to be | ||
161 | * either a String or a Buffer, so just use its type. | ||
162 | */ | ||
163 | return_desc = | ||
164 | acpi_ut_create_internal_object(ACPI_GET_OBJECT_TYPE | ||
165 | (operand[0])); | ||
166 | if (!return_desc) { | ||
167 | status = AE_NO_MEMORY; | ||
168 | goto cleanup; | ||
169 | } | ||
170 | |||
171 | /* Get the Integer values from the objects */ | ||
172 | |||
173 | index = operand[1]->integer.value; | ||
174 | length = (acpi_size) operand[2]->integer.value; | ||
175 | |||
176 | /* | ||
177 | * If the index is beyond the length of the String/Buffer, or if the | ||
178 | * requested length is zero, return a zero-length String/Buffer | ||
179 | */ | ||
180 | if (index >= operand[0]->string.length) { | ||
181 | length = 0; | ||
182 | } | ||
183 | |||
184 | /* Truncate request if larger than the actual String/Buffer */ | ||
185 | |||
186 | else if ((index + length) > operand[0]->string.length) { | ||
187 | length = (acpi_size) operand[0]->string.length - | ||
188 | (acpi_size) index; | ||
189 | } | ||
190 | |||
191 | /* Strings always have a sub-pointer, not so for buffers */ | ||
192 | |||
193 | switch (ACPI_GET_OBJECT_TYPE(operand[0])) { | ||
194 | case ACPI_TYPE_STRING: | ||
195 | |||
196 | /* Always allocate a new buffer for the String */ | ||
197 | |||
198 | buffer = ACPI_ALLOCATE_ZEROED((acpi_size) length + 1); | ||
199 | if (!buffer) { | ||
200 | status = AE_NO_MEMORY; | ||
201 | goto cleanup; | ||
202 | } | ||
203 | break; | ||
204 | |||
205 | case ACPI_TYPE_BUFFER: | ||
206 | |||
207 | /* If the requested length is zero, don't allocate a buffer */ | ||
208 | |||
209 | if (length > 0) { | ||
210 | |||
211 | /* Allocate a new buffer for the Buffer */ | ||
212 | |||
213 | buffer = ACPI_ALLOCATE_ZEROED(length); | ||
214 | if (!buffer) { | ||
215 | status = AE_NO_MEMORY; | ||
216 | goto cleanup; | ||
217 | } | ||
218 | } | ||
219 | break; | ||
220 | |||
221 | default: /* Should not happen */ | ||
222 | |||
223 | status = AE_AML_OPERAND_TYPE; | ||
224 | goto cleanup; | ||
225 | } | ||
226 | |||
227 | if (buffer) { | ||
228 | |||
229 | /* We have a buffer, copy the portion requested */ | ||
230 | |||
231 | ACPI_MEMCPY(buffer, operand[0]->string.pointer + index, | ||
232 | length); | ||
233 | } | ||
234 | |||
235 | /* Set the length of the new String/Buffer */ | ||
236 | |||
237 | return_desc->string.pointer = buffer; | ||
238 | return_desc->string.length = (u32) length; | ||
239 | |||
240 | /* Mark buffer initialized */ | ||
241 | |||
242 | return_desc->buffer.flags |= AOPOBJ_DATA_VALID; | ||
243 | break; | ||
244 | |||
245 | default: | ||
246 | |||
247 | ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", | ||
248 | walk_state->opcode)); | ||
249 | status = AE_AML_BAD_OPCODE; | ||
250 | goto cleanup; | ||
251 | } | ||
252 | |||
253 | /* Store the result in the target */ | ||
254 | |||
255 | status = acpi_ex_store(return_desc, operand[3], walk_state); | ||
256 | |||
257 | cleanup: | ||
258 | |||
259 | /* Delete return object on error */ | ||
260 | |||
261 | if (ACPI_FAILURE(status) || walk_state->result_obj) { | ||
262 | acpi_ut_remove_reference(return_desc); | ||
263 | walk_state->result_obj = NULL; | ||
264 | } | ||
265 | |||
266 | /* Set the return object and exit */ | ||
267 | |||
268 | else { | ||
269 | walk_state->result_obj = return_desc; | ||
270 | } | ||
271 | return_ACPI_STATUS(status); | ||
272 | } | ||