aehandlers.c revision 1.1 1 1.1 jruoho /******************************************************************************
2 1.1 jruoho *
3 1.1 jruoho * Module Name: aehandlers - Various handlers for acpiexec
4 1.1 jruoho *
5 1.1 jruoho *****************************************************************************/
6 1.1 jruoho
7 1.1 jruoho /******************************************************************************
8 1.1 jruoho *
9 1.1 jruoho * 1. Copyright Notice
10 1.1 jruoho *
11 1.1 jruoho * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
12 1.1 jruoho * All rights reserved.
13 1.1 jruoho *
14 1.1 jruoho * 2. License
15 1.1 jruoho *
16 1.1 jruoho * 2.1. This is your license from Intel Corp. under its intellectual property
17 1.1 jruoho * rights. You may have additional license terms from the party that provided
18 1.1 jruoho * you this software, covering your right to use that party's intellectual
19 1.1 jruoho * property rights.
20 1.1 jruoho *
21 1.1 jruoho * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22 1.1 jruoho * copy of the source code appearing in this file ("Covered Code") an
23 1.1 jruoho * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24 1.1 jruoho * base code distributed originally by Intel ("Original Intel Code") to copy,
25 1.1 jruoho * make derivatives, distribute, use and display any portion of the Covered
26 1.1 jruoho * Code in any form, with the right to sublicense such rights; and
27 1.1 jruoho *
28 1.1 jruoho * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29 1.1 jruoho * license (with the right to sublicense), under only those claims of Intel
30 1.1 jruoho * patents that are infringed by the Original Intel Code, to make, use, sell,
31 1.1 jruoho * offer to sell, and import the Covered Code and derivative works thereof
32 1.1 jruoho * solely to the minimum extent necessary to exercise the above copyright
33 1.1 jruoho * license, and in no event shall the patent license extend to any additions
34 1.1 jruoho * to or modifications of the Original Intel Code. No other license or right
35 1.1 jruoho * is granted directly or by implication, estoppel or otherwise;
36 1.1 jruoho *
37 1.1 jruoho * The above copyright and patent license is granted only if the following
38 1.1 jruoho * conditions are met:
39 1.1 jruoho *
40 1.1 jruoho * 3. Conditions
41 1.1 jruoho *
42 1.1 jruoho * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43 1.1 jruoho * Redistribution of source code of any substantial portion of the Covered
44 1.1 jruoho * Code or modification with rights to further distribute source must include
45 1.1 jruoho * the above Copyright Notice, the above License, this list of Conditions,
46 1.1 jruoho * and the following Disclaimer and Export Compliance provision. In addition,
47 1.1 jruoho * Licensee must cause all Covered Code to which Licensee contributes to
48 1.1 jruoho * contain a file documenting the changes Licensee made to create that Covered
49 1.1 jruoho * Code and the date of any change. Licensee must include in that file the
50 1.1 jruoho * documentation of any changes made by any predecessor Licensee. Licensee
51 1.1 jruoho * must include a prominent statement that the modification is derived,
52 1.1 jruoho * directly or indirectly, from Original Intel Code.
53 1.1 jruoho *
54 1.1 jruoho * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55 1.1 jruoho * Redistribution of source code of any substantial portion of the Covered
56 1.1 jruoho * Code or modification without rights to further distribute source must
57 1.1 jruoho * include the following Disclaimer and Export Compliance provision in the
58 1.1 jruoho * documentation and/or other materials provided with distribution. In
59 1.1 jruoho * addition, Licensee may not authorize further sublicense of source of any
60 1.1 jruoho * portion of the Covered Code, and must include terms to the effect that the
61 1.1 jruoho * license from Licensee to its licensee is limited to the intellectual
62 1.1 jruoho * property embodied in the software Licensee provides to its licensee, and
63 1.1 jruoho * not to intellectual property embodied in modifications its licensee may
64 1.1 jruoho * make.
65 1.1 jruoho *
66 1.1 jruoho * 3.3. Redistribution of Executable. Redistribution in executable form of any
67 1.1 jruoho * substantial portion of the Covered Code or modification must reproduce the
68 1.1 jruoho * above Copyright Notice, and the following Disclaimer and Export Compliance
69 1.1 jruoho * provision in the documentation and/or other materials provided with the
70 1.1 jruoho * distribution.
71 1.1 jruoho *
72 1.1 jruoho * 3.4. Intel retains all right, title, and interest in and to the Original
73 1.1 jruoho * Intel Code.
74 1.1 jruoho *
75 1.1 jruoho * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76 1.1 jruoho * Intel shall be used in advertising or otherwise to promote the sale, use or
77 1.1 jruoho * other dealings in products derived from or relating to the Covered Code
78 1.1 jruoho * without prior written authorization from Intel.
79 1.1 jruoho *
80 1.1 jruoho * 4. Disclaimer and Export Compliance
81 1.1 jruoho *
82 1.1 jruoho * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83 1.1 jruoho * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84 1.1 jruoho * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85 1.1 jruoho * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86 1.1 jruoho * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87 1.1 jruoho * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88 1.1 jruoho * PARTICULAR PURPOSE.
89 1.1 jruoho *
90 1.1 jruoho * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91 1.1 jruoho * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92 1.1 jruoho * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93 1.1 jruoho * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94 1.1 jruoho * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95 1.1 jruoho * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96 1.1 jruoho * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97 1.1 jruoho * LIMITED REMEDY.
98 1.1 jruoho *
99 1.1 jruoho * 4.3. Licensee shall not export, either directly or indirectly, any of this
100 1.1 jruoho * software or system incorporating such software without first obtaining any
101 1.1 jruoho * required license or other approval from the U. S. Department of Commerce or
102 1.1 jruoho * any other agency or department of the United States Government. In the
103 1.1 jruoho * event Licensee exports any such software from the United States or
104 1.1 jruoho * re-exports any such software from a foreign destination, Licensee shall
105 1.1 jruoho * ensure that the distribution and export/re-export of the software is in
106 1.1 jruoho * compliance with all laws, regulations, orders, or other restrictions of the
107 1.1 jruoho * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108 1.1 jruoho * any of its subsidiaries will export/re-export any technical data, process,
109 1.1 jruoho * software, or service, directly or indirectly, to any country for which the
110 1.1 jruoho * United States government or any agency thereof requires an export license,
111 1.1 jruoho * other governmental approval, or letter of assurance, without first obtaining
112 1.1 jruoho * such license, approval or letter.
113 1.1 jruoho *
114 1.1 jruoho *****************************************************************************/
115 1.1 jruoho
116 1.1 jruoho #include "aecommon.h"
117 1.1 jruoho
118 1.1 jruoho #define _COMPONENT ACPI_TOOLS
119 1.1 jruoho ACPI_MODULE_NAME ("aehandlers")
120 1.1 jruoho
121 1.1 jruoho /* Local prototypes */
122 1.1 jruoho
123 1.1 jruoho void
124 1.1 jruoho AeNotifyHandler (
125 1.1 jruoho ACPI_HANDLE Device,
126 1.1 jruoho UINT32 Value,
127 1.1 jruoho void *Context);
128 1.1 jruoho
129 1.1 jruoho void
130 1.1 jruoho AeDeviceNotifyHandler (
131 1.1 jruoho ACPI_HANDLE Device,
132 1.1 jruoho UINT32 Value,
133 1.1 jruoho void *Context);
134 1.1 jruoho
135 1.1 jruoho ACPI_STATUS
136 1.1 jruoho AeExceptionHandler (
137 1.1 jruoho ACPI_STATUS AmlStatus,
138 1.1 jruoho ACPI_NAME Name,
139 1.1 jruoho UINT16 Opcode,
140 1.1 jruoho UINT32 AmlOffset,
141 1.1 jruoho void *Context);
142 1.1 jruoho
143 1.1 jruoho ACPI_STATUS
144 1.1 jruoho AeTableHandler (
145 1.1 jruoho UINT32 Event,
146 1.1 jruoho void *Table,
147 1.1 jruoho void *Context);
148 1.1 jruoho
149 1.1 jruoho ACPI_STATUS
150 1.1 jruoho AeRegionInit (
151 1.1 jruoho ACPI_HANDLE RegionHandle,
152 1.1 jruoho UINT32 Function,
153 1.1 jruoho void *HandlerContext,
154 1.1 jruoho void **RegionContext);
155 1.1 jruoho
156 1.1 jruoho void
157 1.1 jruoho AeAttachedDataHandler (
158 1.1 jruoho ACPI_HANDLE Object,
159 1.1 jruoho void *Data);
160 1.1 jruoho
161 1.1 jruoho UINT32 SigintCount = 0;
162 1.1 jruoho AE_DEBUG_REGIONS AeRegions;
163 1.1 jruoho
164 1.1 jruoho
165 1.1 jruoho /******************************************************************************
166 1.1 jruoho *
167 1.1 jruoho * FUNCTION: AeCtrlCHandler
168 1.1 jruoho *
169 1.1 jruoho * PARAMETERS: Sig
170 1.1 jruoho *
171 1.1 jruoho * RETURN: none
172 1.1 jruoho *
173 1.1 jruoho * DESCRIPTION: Control-C handler. Abort running control method if any.
174 1.1 jruoho *
175 1.1 jruoho *****************************************************************************/
176 1.1 jruoho
177 1.1 jruoho void __cdecl
178 1.1 jruoho AeCtrlCHandler (
179 1.1 jruoho int Sig)
180 1.1 jruoho {
181 1.1 jruoho
182 1.1 jruoho signal (SIGINT, SIG_IGN);
183 1.1 jruoho SigintCount++;
184 1.1 jruoho
185 1.1 jruoho AcpiOsPrintf ("Caught a ctrl-c (#%u)\n\n", SigintCount);
186 1.1 jruoho
187 1.1 jruoho if (AcpiGbl_MethodExecuting)
188 1.1 jruoho {
189 1.1 jruoho AcpiGbl_AbortMethod = TRUE;
190 1.1 jruoho signal (SIGINT, AeCtrlCHandler);
191 1.1 jruoho
192 1.1 jruoho if (SigintCount < 10)
193 1.1 jruoho {
194 1.1 jruoho return;
195 1.1 jruoho }
196 1.1 jruoho }
197 1.1 jruoho
198 1.1 jruoho exit (0);
199 1.1 jruoho }
200 1.1 jruoho
201 1.1 jruoho
202 1.1 jruoho /******************************************************************************
203 1.1 jruoho *
204 1.1 jruoho * FUNCTION: AeNotifyHandler
205 1.1 jruoho *
206 1.1 jruoho * PARAMETERS: Standard notify handler parameters
207 1.1 jruoho *
208 1.1 jruoho * RETURN: Status
209 1.1 jruoho *
210 1.1 jruoho * DESCRIPTION: System notify handler for AcpiExec utility. Used by the ASL
211 1.1 jruoho * test suite(s) to communicate errors and other information to
212 1.1 jruoho * this utility via the Notify() operator.
213 1.1 jruoho *
214 1.1 jruoho *****************************************************************************/
215 1.1 jruoho
216 1.1 jruoho void
217 1.1 jruoho AeNotifyHandler (
218 1.1 jruoho ACPI_HANDLE Device,
219 1.1 jruoho UINT32 Value,
220 1.1 jruoho void *Context)
221 1.1 jruoho {
222 1.1 jruoho
223 1.1 jruoho switch (Value)
224 1.1 jruoho {
225 1.1 jruoho #if 0
226 1.1 jruoho case 0:
227 1.1 jruoho printf ("[AcpiExec] Method Error 0x%X: Results not equal\n", Value);
228 1.1 jruoho if (AcpiGbl_DebugFile)
229 1.1 jruoho {
230 1.1 jruoho AcpiOsPrintf ("[AcpiExec] Method Error: Results not equal\n");
231 1.1 jruoho }
232 1.1 jruoho break;
233 1.1 jruoho
234 1.1 jruoho
235 1.1 jruoho case 1:
236 1.1 jruoho printf ("[AcpiExec] Method Error: Incorrect numeric result\n");
237 1.1 jruoho if (AcpiGbl_DebugFile)
238 1.1 jruoho {
239 1.1 jruoho AcpiOsPrintf ("[AcpiExec] Method Error: Incorrect numeric result\n");
240 1.1 jruoho }
241 1.1 jruoho break;
242 1.1 jruoho
243 1.1 jruoho
244 1.1 jruoho case 2:
245 1.1 jruoho printf ("[AcpiExec] Method Error: An operand was overwritten\n");
246 1.1 jruoho if (AcpiGbl_DebugFile)
247 1.1 jruoho {
248 1.1 jruoho AcpiOsPrintf ("[AcpiExec] Method Error: An operand was overwritten\n");
249 1.1 jruoho }
250 1.1 jruoho break;
251 1.1 jruoho
252 1.1 jruoho #endif
253 1.1 jruoho
254 1.1 jruoho default:
255 1.1 jruoho printf ("[AcpiExec] Received a System Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
256 1.1 jruoho AcpiUtGetNodeName (Device), Device, Value,
257 1.1 jruoho AcpiUtGetNotifyName (Value));
258 1.1 jruoho if (AcpiGbl_DebugFile)
259 1.1 jruoho {
260 1.1 jruoho AcpiOsPrintf ("[AcpiExec] Received a system notify, Value 0x%2.2X\n", Value);
261 1.1 jruoho }
262 1.1 jruoho
263 1.1 jruoho (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
264 1.1 jruoho break;
265 1.1 jruoho }
266 1.1 jruoho
267 1.1 jruoho }
268 1.1 jruoho
269 1.1 jruoho
270 1.1 jruoho /******************************************************************************
271 1.1 jruoho *
272 1.1 jruoho * FUNCTION: AeDeviceNotifyHandler
273 1.1 jruoho *
274 1.1 jruoho * PARAMETERS: Standard notify handler parameters
275 1.1 jruoho *
276 1.1 jruoho * RETURN: Status
277 1.1 jruoho *
278 1.1 jruoho * DESCRIPTION: Device notify handler for AcpiExec utility. Used by the ASL
279 1.1 jruoho * test suite(s) to communicate errors and other information to
280 1.1 jruoho * this utility via the Notify() operator.
281 1.1 jruoho *
282 1.1 jruoho *****************************************************************************/
283 1.1 jruoho
284 1.1 jruoho void
285 1.1 jruoho AeDeviceNotifyHandler (
286 1.1 jruoho ACPI_HANDLE Device,
287 1.1 jruoho UINT32 Value,
288 1.1 jruoho void *Context)
289 1.1 jruoho {
290 1.1 jruoho
291 1.1 jruoho printf ("[AcpiExec] Received a Device Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
292 1.1 jruoho AcpiUtGetNodeName (Device), Device, Value,
293 1.1 jruoho AcpiUtGetNotifyName (Value));
294 1.1 jruoho if (AcpiGbl_DebugFile)
295 1.1 jruoho {
296 1.1 jruoho AcpiOsPrintf ("[AcpiExec] Received a device notify, Value 0x%2.2X\n", Value);
297 1.1 jruoho }
298 1.1 jruoho
299 1.1 jruoho (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
300 1.1 jruoho }
301 1.1 jruoho
302 1.1 jruoho
303 1.1 jruoho /******************************************************************************
304 1.1 jruoho *
305 1.1 jruoho * FUNCTION: AeExceptionHandler
306 1.1 jruoho *
307 1.1 jruoho * PARAMETERS: Standard exception handler parameters
308 1.1 jruoho *
309 1.1 jruoho * RETURN: Status
310 1.1 jruoho *
311 1.1 jruoho * DESCRIPTION: System exception handler for AcpiExec utility.
312 1.1 jruoho *
313 1.1 jruoho *****************************************************************************/
314 1.1 jruoho
315 1.1 jruoho ACPI_STATUS
316 1.1 jruoho AeExceptionHandler (
317 1.1 jruoho ACPI_STATUS AmlStatus,
318 1.1 jruoho ACPI_NAME Name,
319 1.1 jruoho UINT16 Opcode,
320 1.1 jruoho UINT32 AmlOffset,
321 1.1 jruoho void *Context)
322 1.1 jruoho {
323 1.1 jruoho ACPI_STATUS NewAmlStatus = AmlStatus;
324 1.1 jruoho ACPI_STATUS Status;
325 1.1 jruoho ACPI_BUFFER ReturnObj;
326 1.1 jruoho ACPI_OBJECT_LIST ArgList;
327 1.1 jruoho ACPI_OBJECT Arg[3];
328 1.1 jruoho const char *Exception;
329 1.1 jruoho
330 1.1 jruoho
331 1.1 jruoho Exception = AcpiFormatException (AmlStatus);
332 1.1 jruoho AcpiOsPrintf ("[AcpiExec] Exception %s during execution ", Exception);
333 1.1 jruoho if (Name)
334 1.1 jruoho {
335 1.1 jruoho AcpiOsPrintf ("of method [%4.4s]", (char *) &Name);
336 1.1 jruoho }
337 1.1 jruoho else
338 1.1 jruoho {
339 1.1 jruoho AcpiOsPrintf ("at module level (table load)");
340 1.1 jruoho }
341 1.1 jruoho AcpiOsPrintf (" Opcode [%s] @%X\n", AcpiPsGetOpcodeName (Opcode), AmlOffset);
342 1.1 jruoho
343 1.1 jruoho /*
344 1.1 jruoho * Invoke the _ERR method if present
345 1.1 jruoho *
346 1.1 jruoho * Setup parameter object
347 1.1 jruoho */
348 1.1 jruoho ArgList.Count = 3;
349 1.1 jruoho ArgList.Pointer = Arg;
350 1.1 jruoho
351 1.1 jruoho Arg[0].Type = ACPI_TYPE_INTEGER;
352 1.1 jruoho Arg[0].Integer.Value = AmlStatus;
353 1.1 jruoho
354 1.1 jruoho Arg[1].Type = ACPI_TYPE_STRING;
355 1.1 jruoho Arg[1].String.Pointer = ACPI_CAST_PTR (char, Exception);
356 1.1 jruoho Arg[1].String.Length = ACPI_STRLEN (Exception);
357 1.1 jruoho
358 1.1 jruoho Arg[2].Type = ACPI_TYPE_INTEGER;
359 1.1 jruoho Arg[2].Integer.Value = ACPI_TO_INTEGER (AcpiOsGetThreadId());
360 1.1 jruoho
361 1.1 jruoho /* Setup return buffer */
362 1.1 jruoho
363 1.1 jruoho ReturnObj.Pointer = NULL;
364 1.1 jruoho ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
365 1.1 jruoho
366 1.1 jruoho Status = AcpiEvaluateObject (NULL, "\\_ERR", &ArgList, &ReturnObj);
367 1.1 jruoho if (ACPI_SUCCESS (Status))
368 1.1 jruoho {
369 1.1 jruoho if (ReturnObj.Pointer)
370 1.1 jruoho {
371 1.1 jruoho /* Override original status */
372 1.1 jruoho
373 1.1 jruoho NewAmlStatus = (ACPI_STATUS)
374 1.1 jruoho ((ACPI_OBJECT *) ReturnObj.Pointer)->Integer.Value;
375 1.1 jruoho
376 1.1 jruoho AcpiOsFree (ReturnObj.Pointer);
377 1.1 jruoho }
378 1.1 jruoho }
379 1.1 jruoho else if (Status != AE_NOT_FOUND)
380 1.1 jruoho {
381 1.1 jruoho AcpiOsPrintf ("[AcpiExec] Could not execute _ERR method, %s\n",
382 1.1 jruoho AcpiFormatException (Status));
383 1.1 jruoho }
384 1.1 jruoho
385 1.1 jruoho /* Global override */
386 1.1 jruoho
387 1.1 jruoho if (AcpiGbl_IgnoreErrors)
388 1.1 jruoho {
389 1.1 jruoho NewAmlStatus = AE_OK;
390 1.1 jruoho }
391 1.1 jruoho
392 1.1 jruoho if (NewAmlStatus != AmlStatus)
393 1.1 jruoho {
394 1.1 jruoho AcpiOsPrintf ("[AcpiExec] Exception override, new status %s\n",
395 1.1 jruoho AcpiFormatException (NewAmlStatus));
396 1.1 jruoho }
397 1.1 jruoho
398 1.1 jruoho return (NewAmlStatus);
399 1.1 jruoho }
400 1.1 jruoho
401 1.1 jruoho
402 1.1 jruoho /******************************************************************************
403 1.1 jruoho *
404 1.1 jruoho * FUNCTION: AeTableHandler
405 1.1 jruoho *
406 1.1 jruoho * PARAMETERS: Table handler
407 1.1 jruoho *
408 1.1 jruoho * RETURN: Status
409 1.1 jruoho *
410 1.1 jruoho * DESCRIPTION: System table handler for AcpiExec utility.
411 1.1 jruoho *
412 1.1 jruoho *****************************************************************************/
413 1.1 jruoho
414 1.1 jruoho char *TableEvents[] =
415 1.1 jruoho {
416 1.1 jruoho "LOAD",
417 1.1 jruoho "UNLOAD",
418 1.1 jruoho "UNKNOWN"
419 1.1 jruoho };
420 1.1 jruoho
421 1.1 jruoho ACPI_STATUS
422 1.1 jruoho AeTableHandler (
423 1.1 jruoho UINT32 Event,
424 1.1 jruoho void *Table,
425 1.1 jruoho void *Context)
426 1.1 jruoho {
427 1.1 jruoho
428 1.1 jruoho if (Event > ACPI_NUM_TABLE_EVENTS)
429 1.1 jruoho {
430 1.1 jruoho Event = ACPI_NUM_TABLE_EVENTS;
431 1.1 jruoho }
432 1.1 jruoho
433 1.1 jruoho /* TBD: could dump entire table header, need a header dump routine */
434 1.1 jruoho
435 1.1 jruoho printf ("[AcpiExec] Table Event %s, [%4.4s] %p\n",
436 1.1 jruoho TableEvents[Event], ((ACPI_TABLE_HEADER *) Table)->Signature, Table);
437 1.1 jruoho return (AE_OK);
438 1.1 jruoho }
439 1.1 jruoho
440 1.1 jruoho
441 1.1 jruoho /******************************************************************************
442 1.1 jruoho *
443 1.1 jruoho * FUNCTION: AeGpeHandler
444 1.1 jruoho *
445 1.1 jruoho * DESCRIPTION: GPE handler for acpiexec
446 1.1 jruoho *
447 1.1 jruoho *****************************************************************************/
448 1.1 jruoho
449 1.1 jruoho UINT32
450 1.1 jruoho AeGpeHandler (
451 1.1 jruoho void *Context)
452 1.1 jruoho {
453 1.1 jruoho AcpiOsPrintf ("Received a GPE at handler\n");
454 1.1 jruoho return (0);
455 1.1 jruoho }
456 1.1 jruoho
457 1.1 jruoho
458 1.1 jruoho /******************************************************************************
459 1.1 jruoho *
460 1.1 jruoho * FUNCTION: AeAttachedDataHandler
461 1.1 jruoho *
462 1.1 jruoho * DESCRIPTION: Handler for deletion of nodes with attached data (attached via
463 1.1 jruoho * AcpiAttachData)
464 1.1 jruoho *
465 1.1 jruoho *****************************************************************************/
466 1.1 jruoho
467 1.1 jruoho void
468 1.1 jruoho AeAttachedDataHandler (
469 1.1 jruoho ACPI_HANDLE Object,
470 1.1 jruoho void *Data)
471 1.1 jruoho {
472 1.1 jruoho ACPI_NAMESPACE_NODE *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Data);
473 1.1 jruoho
474 1.1 jruoho
475 1.1 jruoho AcpiOsPrintf ("Received an attached data deletion on %4.4s\n",
476 1.1 jruoho Node->Name.Ascii);
477 1.1 jruoho }
478 1.1 jruoho
479 1.1 jruoho
480 1.1 jruoho /******************************************************************************
481 1.1 jruoho *
482 1.1 jruoho * FUNCTION: AeRegionInit
483 1.1 jruoho *
484 1.1 jruoho * PARAMETERS: None
485 1.1 jruoho *
486 1.1 jruoho * RETURN: Status
487 1.1 jruoho *
488 1.1 jruoho * DESCRIPTION: Opregion init function.
489 1.1 jruoho *
490 1.1 jruoho *****************************************************************************/
491 1.1 jruoho
492 1.1 jruoho ACPI_STATUS
493 1.1 jruoho AeRegionInit (
494 1.1 jruoho ACPI_HANDLE RegionHandle,
495 1.1 jruoho UINT32 Function,
496 1.1 jruoho void *HandlerContext,
497 1.1 jruoho void **RegionContext)
498 1.1 jruoho {
499 1.1 jruoho /*
500 1.1 jruoho * Real simple, set the RegionContext to the RegionHandle
501 1.1 jruoho */
502 1.1 jruoho *RegionContext = RegionHandle;
503 1.1 jruoho
504 1.1 jruoho return AE_OK;
505 1.1 jruoho }
506 1.1 jruoho
507 1.1 jruoho
508 1.1 jruoho /******************************************************************************
509 1.1 jruoho *
510 1.1 jruoho * FUNCTION: AeInstallHandlers
511 1.1 jruoho *
512 1.1 jruoho * PARAMETERS: None
513 1.1 jruoho *
514 1.1 jruoho * RETURN: Status
515 1.1 jruoho *
516 1.1 jruoho * DESCRIPTION: Install handlers for the AcpiExec utility.
517 1.1 jruoho *
518 1.1 jruoho *****************************************************************************/
519 1.1 jruoho
520 1.1 jruoho ACPI_ADR_SPACE_TYPE SpaceId[] = {0, 1, 2, 3, 4, 5, 6, 7, 0x80};
521 1.1 jruoho #define AEXEC_NUM_REGIONS 9
522 1.1 jruoho
523 1.1 jruoho ACPI_STATUS
524 1.1 jruoho AeInstallHandlers (void)
525 1.1 jruoho {
526 1.1 jruoho ACPI_STATUS Status;
527 1.1 jruoho UINT32 i;
528 1.1 jruoho ACPI_HANDLE Handle;
529 1.1 jruoho
530 1.1 jruoho
531 1.1 jruoho ACPI_FUNCTION_ENTRY ();
532 1.1 jruoho
533 1.1 jruoho
534 1.1 jruoho Status = AcpiInstallTableHandler (AeTableHandler, NULL);
535 1.1 jruoho if (ACPI_FAILURE (Status))
536 1.1 jruoho {
537 1.1 jruoho printf ("Could not install table handler, %s\n",
538 1.1 jruoho AcpiFormatException (Status));
539 1.1 jruoho }
540 1.1 jruoho
541 1.1 jruoho Status = AcpiInstallExceptionHandler (AeExceptionHandler);
542 1.1 jruoho if (ACPI_FAILURE (Status))
543 1.1 jruoho {
544 1.1 jruoho printf ("Could not install exception handler, %s\n",
545 1.1 jruoho AcpiFormatException (Status));
546 1.1 jruoho }
547 1.1 jruoho
548 1.1 jruoho /* Install global notify handler */
549 1.1 jruoho
550 1.1 jruoho Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY,
551 1.1 jruoho AeNotifyHandler, NULL);
552 1.1 jruoho if (ACPI_FAILURE (Status))
553 1.1 jruoho {
554 1.1 jruoho printf ("Could not install a global notify handler, %s\n",
555 1.1 jruoho AcpiFormatException (Status));
556 1.1 jruoho }
557 1.1 jruoho
558 1.1 jruoho Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_DEVICE_NOTIFY,
559 1.1 jruoho AeDeviceNotifyHandler, NULL);
560 1.1 jruoho if (ACPI_FAILURE (Status))
561 1.1 jruoho {
562 1.1 jruoho printf ("Could not install a global notify handler, %s\n",
563 1.1 jruoho AcpiFormatException (Status));
564 1.1 jruoho }
565 1.1 jruoho
566 1.1 jruoho Status = AcpiGetHandle (NULL, "\\_SB", &Handle);
567 1.1 jruoho if (ACPI_SUCCESS (Status))
568 1.1 jruoho {
569 1.1 jruoho Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
570 1.1 jruoho AeNotifyHandler, NULL);
571 1.1 jruoho if (ACPI_FAILURE (Status))
572 1.1 jruoho {
573 1.1 jruoho printf ("Could not install a notify handler, %s\n",
574 1.1 jruoho AcpiFormatException (Status));
575 1.1 jruoho }
576 1.1 jruoho
577 1.1 jruoho Status = AcpiRemoveNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
578 1.1 jruoho AeNotifyHandler);
579 1.1 jruoho if (ACPI_FAILURE (Status))
580 1.1 jruoho {
581 1.1 jruoho printf ("Could not remove a notify handler, %s\n",
582 1.1 jruoho AcpiFormatException (Status));
583 1.1 jruoho }
584 1.1 jruoho
585 1.1 jruoho Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
586 1.1 jruoho AeNotifyHandler, NULL);
587 1.1 jruoho Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
588 1.1 jruoho AeNotifyHandler);
589 1.1 jruoho Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
590 1.1 jruoho AeNotifyHandler, NULL);
591 1.1 jruoho if (ACPI_FAILURE (Status))
592 1.1 jruoho {
593 1.1 jruoho printf ("Could not install a notify handler, %s\n",
594 1.1 jruoho AcpiFormatException (Status));
595 1.1 jruoho }
596 1.1 jruoho
597 1.1 jruoho Status = AcpiAttachData (Handle, AeAttachedDataHandler, Handle);
598 1.1 jruoho Status = AcpiDetachData (Handle, AeAttachedDataHandler);
599 1.1 jruoho Status = AcpiAttachData (Handle, AeAttachedDataHandler, Handle);
600 1.1 jruoho }
601 1.1 jruoho else
602 1.1 jruoho {
603 1.1 jruoho printf ("No _SB_ found, %s\n", AcpiFormatException (Status));
604 1.1 jruoho }
605 1.1 jruoho
606 1.1 jruoho /* Set a handler for all supported operation regions */
607 1.1 jruoho
608 1.1 jruoho for (i = 0; i < AEXEC_NUM_REGIONS; i++)
609 1.1 jruoho {
610 1.1 jruoho Status = AcpiRemoveAddressSpaceHandler (AcpiGbl_RootNode,
611 1.1 jruoho SpaceId[i], AeRegionHandler);
612 1.1 jruoho
613 1.1 jruoho /* Install handler at the root object.
614 1.1 jruoho * TBD: all default handlers should be installed here!
615 1.1 jruoho */
616 1.1 jruoho Status = AcpiInstallAddressSpaceHandler (AcpiGbl_RootNode,
617 1.1 jruoho SpaceId[i], AeRegionHandler, AeRegionInit, NULL);
618 1.1 jruoho if (ACPI_FAILURE (Status))
619 1.1 jruoho {
620 1.1 jruoho ACPI_EXCEPTION ((AE_INFO, Status,
621 1.1 jruoho "Could not install an OpRegion handler for %s space(%u)",
622 1.1 jruoho AcpiUtGetRegionName((UINT8) SpaceId[i]), SpaceId[i]));
623 1.1 jruoho return (Status);
624 1.1 jruoho }
625 1.1 jruoho }
626 1.1 jruoho
627 1.1 jruoho /*
628 1.1 jruoho * Initialize the global Region Handler space
629 1.1 jruoho * MCW 3/23/00
630 1.1 jruoho */
631 1.1 jruoho AeRegions.NumberOfRegions = 0;
632 1.1 jruoho AeRegions.RegionList = NULL;
633 1.1 jruoho
634 1.1 jruoho return Status;
635 1.1 jruoho }
636 1.1 jruoho
637 1.1 jruoho
638 1.1 jruoho /******************************************************************************
639 1.1 jruoho *
640 1.1 jruoho * FUNCTION: AeRegionHandler
641 1.1 jruoho *
642 1.1 jruoho * PARAMETERS: Standard region handler parameters
643 1.1 jruoho *
644 1.1 jruoho * RETURN: Status
645 1.1 jruoho *
646 1.1 jruoho * DESCRIPTION: Test handler - Handles some dummy regions via memory that can
647 1.1 jruoho * be manipulated in Ring 3. Simulates actual reads and writes.
648 1.1 jruoho *
649 1.1 jruoho *****************************************************************************/
650 1.1 jruoho
651 1.1 jruoho ACPI_STATUS
652 1.1 jruoho AeRegionHandler (
653 1.1 jruoho UINT32 Function,
654 1.1 jruoho ACPI_PHYSICAL_ADDRESS Address,
655 1.1 jruoho UINT32 BitWidth,
656 1.1 jruoho UINT64 *Value,
657 1.1 jruoho void *HandlerContext,
658 1.1 jruoho void *RegionContext)
659 1.1 jruoho {
660 1.1 jruoho
661 1.1 jruoho ACPI_OPERAND_OBJECT *RegionObject = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, RegionContext);
662 1.1 jruoho UINT8 *Buffer = ACPI_CAST_PTR (UINT8, Value);
663 1.1 jruoho ACPI_PHYSICAL_ADDRESS BaseAddress;
664 1.1 jruoho ACPI_SIZE Length;
665 1.1 jruoho BOOLEAN BufferExists;
666 1.1 jruoho AE_REGION *RegionElement;
667 1.1 jruoho void *BufferValue;
668 1.1 jruoho ACPI_STATUS Status;
669 1.1 jruoho UINT32 ByteWidth;
670 1.1 jruoho UINT32 i;
671 1.1 jruoho UINT8 SpaceId;
672 1.1 jruoho
673 1.1 jruoho
674 1.1 jruoho ACPI_FUNCTION_NAME (AeRegionHandler);
675 1.1 jruoho
676 1.1 jruoho /*
677 1.1 jruoho * If the object is not a region, simply return
678 1.1 jruoho */
679 1.1 jruoho if (RegionObject->Region.Type != ACPI_TYPE_REGION)
680 1.1 jruoho {
681 1.1 jruoho return AE_OK;
682 1.1 jruoho }
683 1.1 jruoho
684 1.1 jruoho /*
685 1.1 jruoho * Region support can be disabled with the -r option.
686 1.1 jruoho * We use this to support dynamically loaded tables where we pass a valid
687 1.1 jruoho * address to the AML.
688 1.1 jruoho */
689 1.1 jruoho if (AcpiGbl_DbOpt_NoRegionSupport)
690 1.1 jruoho {
691 1.1 jruoho BufferValue = ACPI_TO_POINTER (Address);
692 1.1 jruoho ByteWidth = (BitWidth / 8);
693 1.1 jruoho
694 1.1 jruoho if (BitWidth % 8)
695 1.1 jruoho {
696 1.1 jruoho ByteWidth += 1;
697 1.1 jruoho }
698 1.1 jruoho goto DoFunction;
699 1.1 jruoho }
700 1.1 jruoho
701 1.1 jruoho /*
702 1.1 jruoho * Find the region's address space and length before searching
703 1.1 jruoho * the linked list.
704 1.1 jruoho */
705 1.1 jruoho BaseAddress = RegionObject->Region.Address;
706 1.1 jruoho Length = (ACPI_SIZE) RegionObject->Region.Length;
707 1.1 jruoho SpaceId = RegionObject->Region.SpaceId;
708 1.1 jruoho
709 1.1 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, "Operation Region request on %s at 0x%X\n",
710 1.1 jruoho AcpiUtGetRegionName (RegionObject->Region.SpaceId),
711 1.1 jruoho (UINT32) Address));
712 1.1 jruoho
713 1.1 jruoho switch (SpaceId)
714 1.1 jruoho {
715 1.1 jruoho case ACPI_ADR_SPACE_SYSTEM_IO:
716 1.1 jruoho /*
717 1.1 jruoho * For I/O space, exercise the port validation
718 1.1 jruoho */
719 1.1 jruoho switch (Function & ACPI_IO_MASK)
720 1.1 jruoho {
721 1.1 jruoho case ACPI_READ:
722 1.1 jruoho Status = AcpiHwReadPort (Address, (UINT32 *) Value, BitWidth);
723 1.1 jruoho break;
724 1.1 jruoho
725 1.1 jruoho case ACPI_WRITE:
726 1.1 jruoho Status = AcpiHwWritePort (Address, (UINT32) *Value, BitWidth);
727 1.1 jruoho break;
728 1.1 jruoho
729 1.1 jruoho default:
730 1.1 jruoho Status = AE_BAD_PARAMETER;
731 1.1 jruoho break;
732 1.1 jruoho }
733 1.1 jruoho
734 1.1 jruoho if (ACPI_FAILURE (Status))
735 1.1 jruoho {
736 1.1 jruoho return (Status);
737 1.1 jruoho }
738 1.1 jruoho
739 1.1 jruoho /* Now go ahead and simulate the hardware */
740 1.1 jruoho break;
741 1.1 jruoho
742 1.1 jruoho
743 1.1 jruoho case ACPI_ADR_SPACE_SMBUS:
744 1.1 jruoho
745 1.1 jruoho Length = 0;
746 1.1 jruoho
747 1.1 jruoho switch (Function & ACPI_IO_MASK)
748 1.1 jruoho {
749 1.1 jruoho case ACPI_READ:
750 1.1 jruoho switch (Function >> 16)
751 1.1 jruoho {
752 1.1 jruoho case AML_FIELD_ATTRIB_SMB_QUICK:
753 1.1 jruoho case AML_FIELD_ATTRIB_SMB_SEND_RCV:
754 1.1 jruoho case AML_FIELD_ATTRIB_SMB_BYTE:
755 1.1 jruoho Length = 1;
756 1.1 jruoho break;
757 1.1 jruoho
758 1.1 jruoho case AML_FIELD_ATTRIB_SMB_WORD:
759 1.1 jruoho case AML_FIELD_ATTRIB_SMB_WORD_CALL:
760 1.1 jruoho Length = 2;
761 1.1 jruoho break;
762 1.1 jruoho
763 1.1 jruoho case AML_FIELD_ATTRIB_SMB_BLOCK:
764 1.1 jruoho case AML_FIELD_ATTRIB_SMB_BLOCK_CALL:
765 1.1 jruoho Length = 32;
766 1.1 jruoho break;
767 1.1 jruoho
768 1.1 jruoho default:
769 1.1 jruoho break;
770 1.1 jruoho }
771 1.1 jruoho break;
772 1.1 jruoho
773 1.1 jruoho case ACPI_WRITE:
774 1.1 jruoho switch (Function >> 16)
775 1.1 jruoho {
776 1.1 jruoho case AML_FIELD_ATTRIB_SMB_QUICK:
777 1.1 jruoho case AML_FIELD_ATTRIB_SMB_SEND_RCV:
778 1.1 jruoho case AML_FIELD_ATTRIB_SMB_BYTE:
779 1.1 jruoho case AML_FIELD_ATTRIB_SMB_WORD:
780 1.1 jruoho case AML_FIELD_ATTRIB_SMB_BLOCK:
781 1.1 jruoho Length = 0;
782 1.1 jruoho break;
783 1.1 jruoho
784 1.1 jruoho case AML_FIELD_ATTRIB_SMB_WORD_CALL:
785 1.1 jruoho Length = 2;
786 1.1 jruoho break;
787 1.1 jruoho
788 1.1 jruoho case AML_FIELD_ATTRIB_SMB_BLOCK_CALL:
789 1.1 jruoho Length = 32;
790 1.1 jruoho break;
791 1.1 jruoho
792 1.1 jruoho default:
793 1.1 jruoho break;
794 1.1 jruoho }
795 1.1 jruoho break;
796 1.1 jruoho
797 1.1 jruoho default:
798 1.1 jruoho break;
799 1.1 jruoho }
800 1.1 jruoho
801 1.1 jruoho for (i = 0; i < Length; i++)
802 1.1 jruoho {
803 1.1 jruoho Buffer[i+2] = (UINT8) (0xA0 + i);
804 1.1 jruoho }
805 1.1 jruoho
806 1.1 jruoho Buffer[0] = 0x7A;
807 1.1 jruoho Buffer[1] = (UINT8) Length;
808 1.1 jruoho return (AE_OK);
809 1.1 jruoho
810 1.1 jruoho
811 1.1 jruoho case ACPI_ADR_SPACE_IPMI: /* ACPI 4.0 */
812 1.1 jruoho
813 1.1 jruoho AcpiOsPrintf ("AcpiExec: Received IPMI request: "
814 1.1 jruoho "Address %X BaseAddress %X Length %X Width %X BufferLength %u\n",
815 1.1 jruoho (UINT32) Address, (UINT32) BaseAddress,
816 1.1 jruoho Length, BitWidth, Buffer[1]);
817 1.1 jruoho
818 1.1 jruoho /*
819 1.1 jruoho * Regardless of a READ or WRITE, this handler is passed a 66-byte
820 1.1 jruoho * buffer in which to return the IPMI status/length/data.
821 1.1 jruoho *
822 1.1 jruoho * Return some example data to show use of the bidirectional buffer
823 1.1 jruoho */
824 1.1 jruoho Buffer[0] = 0; /* Status byte */
825 1.1 jruoho Buffer[1] = 64; /* Return buffer data length */
826 1.1 jruoho Buffer[2] = 0; /* Completion code */
827 1.1 jruoho Buffer[3] = 0x34; /* Power measurement */
828 1.1 jruoho Buffer[4] = 0x12; /* Power measurement */
829 1.1 jruoho Buffer[65] = 0xEE; /* last buffer byte */
830 1.1 jruoho return (AE_OK);
831 1.1 jruoho
832 1.1 jruoho default:
833 1.1 jruoho break;
834 1.1 jruoho }
835 1.1 jruoho
836 1.1 jruoho /*
837 1.1 jruoho * Search through the linked list for this region's buffer
838 1.1 jruoho */
839 1.1 jruoho BufferExists = FALSE;
840 1.1 jruoho RegionElement = AeRegions.RegionList;
841 1.1 jruoho
842 1.1 jruoho if (AeRegions.NumberOfRegions)
843 1.1 jruoho {
844 1.1 jruoho while (!BufferExists && RegionElement)
845 1.1 jruoho {
846 1.1 jruoho if (RegionElement->Address == BaseAddress &&
847 1.1 jruoho RegionElement->Length == Length &&
848 1.1 jruoho RegionElement->SpaceId == SpaceId)
849 1.1 jruoho {
850 1.1 jruoho BufferExists = TRUE;
851 1.1 jruoho }
852 1.1 jruoho else
853 1.1 jruoho {
854 1.1 jruoho RegionElement = RegionElement->NextRegion;
855 1.1 jruoho }
856 1.1 jruoho }
857 1.1 jruoho }
858 1.1 jruoho
859 1.1 jruoho /*
860 1.1 jruoho * If the Region buffer does not exist, create it now
861 1.1 jruoho */
862 1.1 jruoho if (!BufferExists)
863 1.1 jruoho {
864 1.1 jruoho /*
865 1.1 jruoho * Do the memory allocations first
866 1.1 jruoho */
867 1.1 jruoho RegionElement = AcpiOsAllocate (sizeof (AE_REGION));
868 1.1 jruoho if (!RegionElement)
869 1.1 jruoho {
870 1.1 jruoho return AE_NO_MEMORY;
871 1.1 jruoho }
872 1.1 jruoho
873 1.1 jruoho RegionElement->Buffer = AcpiOsAllocate (Length);
874 1.1 jruoho if (!RegionElement->Buffer)
875 1.1 jruoho {
876 1.1 jruoho AcpiOsFree (RegionElement);
877 1.1 jruoho return AE_NO_MEMORY;
878 1.1 jruoho }
879 1.1 jruoho
880 1.1 jruoho /* Initialize the region with the default fill value */
881 1.1 jruoho
882 1.1 jruoho ACPI_MEMSET (RegionElement->Buffer, AcpiGbl_RegionFillValue, Length);
883 1.1 jruoho
884 1.1 jruoho RegionElement->Address = BaseAddress;
885 1.1 jruoho RegionElement->Length = Length;
886 1.1 jruoho RegionElement->SpaceId = SpaceId;
887 1.1 jruoho RegionElement->NextRegion = NULL;
888 1.1 jruoho
889 1.1 jruoho /*
890 1.1 jruoho * Increment the number of regions and put this one
891 1.1 jruoho * at the head of the list as it will probably get accessed
892 1.1 jruoho * more often anyway.
893 1.1 jruoho */
894 1.1 jruoho AeRegions.NumberOfRegions += 1;
895 1.1 jruoho
896 1.1 jruoho if (AeRegions.RegionList)
897 1.1 jruoho {
898 1.1 jruoho RegionElement->NextRegion = AeRegions.RegionList;
899 1.1 jruoho }
900 1.1 jruoho
901 1.1 jruoho AeRegions.RegionList = RegionElement;
902 1.1 jruoho }
903 1.1 jruoho
904 1.1 jruoho /*
905 1.1 jruoho * Calculate the size of the memory copy
906 1.1 jruoho */
907 1.1 jruoho ByteWidth = (BitWidth / 8);
908 1.1 jruoho
909 1.1 jruoho if (BitWidth % 8)
910 1.1 jruoho {
911 1.1 jruoho ByteWidth += 1;
912 1.1 jruoho }
913 1.1 jruoho
914 1.1 jruoho /*
915 1.1 jruoho * The buffer exists and is pointed to by RegionElement.
916 1.1 jruoho * We now need to verify the request is valid and perform the operation.
917 1.1 jruoho *
918 1.1 jruoho * NOTE: RegionElement->Length is in bytes, therefore it we compare against
919 1.1 jruoho * ByteWidth (see above)
920 1.1 jruoho */
921 1.1 jruoho if (((UINT64) Address + ByteWidth) >
922 1.1 jruoho ((UINT64)(RegionElement->Address) + RegionElement->Length))
923 1.1 jruoho {
924 1.1 jruoho ACPI_WARNING ((AE_INFO,
925 1.1 jruoho "Request on [%4.4s] is beyond region limit Req-0x%X+0x%X, Base=0x%X, Len-0x%X",
926 1.1 jruoho (RegionObject->Region.Node)->Name.Ascii, (UINT32) Address,
927 1.1 jruoho ByteWidth, (UINT32)(RegionElement->Address),
928 1.1 jruoho RegionElement->Length));
929 1.1 jruoho
930 1.1 jruoho return AE_AML_REGION_LIMIT;
931 1.1 jruoho }
932 1.1 jruoho
933 1.1 jruoho /*
934 1.1 jruoho * Get BufferValue to point to the "address" in the buffer
935 1.1 jruoho */
936 1.1 jruoho BufferValue = ((UINT8 *) RegionElement->Buffer +
937 1.1 jruoho ((UINT64) Address - (UINT64) RegionElement->Address));
938 1.1 jruoho
939 1.1 jruoho DoFunction:
940 1.1 jruoho
941 1.1 jruoho /*
942 1.1 jruoho * Perform a read or write to the buffer space
943 1.1 jruoho */
944 1.1 jruoho switch (Function)
945 1.1 jruoho {
946 1.1 jruoho case ACPI_READ:
947 1.1 jruoho /*
948 1.1 jruoho * Set the pointer Value to whatever is in the buffer
949 1.1 jruoho */
950 1.1 jruoho ACPI_MEMCPY (Value, BufferValue, ByteWidth);
951 1.1 jruoho break;
952 1.1 jruoho
953 1.1 jruoho case ACPI_WRITE:
954 1.1 jruoho /*
955 1.1 jruoho * Write the contents of Value to the buffer
956 1.1 jruoho */
957 1.1 jruoho ACPI_MEMCPY (BufferValue, Value, ByteWidth);
958 1.1 jruoho break;
959 1.1 jruoho
960 1.1 jruoho default:
961 1.1 jruoho return AE_BAD_PARAMETER;
962 1.1 jruoho }
963 1.1 jruoho return AE_OK;
964 1.1 jruoho }
965 1.1 jruoho
966 1.1 jruoho
967