Merge from vendor branch OPENSSH:
[dragonfly.git] / sys / contrib / dev / acpica-unix-20050309 / interpreter / executer / exsystem.c
1
2 /******************************************************************************
3  *
4  * Module Name: exsystem - Interface to OS services
5  *              $Revision: 82 $
6  *
7  *****************************************************************************/
8
9 /******************************************************************************
10  *
11  * 1. Copyright Notice
12  *
13  * Some or all of this work - Copyright (c) 1999 - 2005, Intel Corp.
14  * All rights reserved.
15  *
16  * 2. License
17  *
18  * 2.1. This is your license from Intel Corp. under its intellectual property
19  * rights.  You may have additional license terms from the party that provided
20  * you this software, covering your right to use that party's intellectual
21  * property rights.
22  *
23  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
24  * copy of the source code appearing in this file ("Covered Code") an
25  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
26  * base code distributed originally by Intel ("Original Intel Code") to copy,
27  * make derivatives, distribute, use and display any portion of the Covered
28  * Code in any form, with the right to sublicense such rights; and
29  *
30  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
31  * license (with the right to sublicense), under only those claims of Intel
32  * patents that are infringed by the Original Intel Code, to make, use, sell,
33  * offer to sell, and import the Covered Code and derivative works thereof
34  * solely to the minimum extent necessary to exercise the above copyright
35  * license, and in no event shall the patent license extend to any additions
36  * to or modifications of the Original Intel Code.  No other license or right
37  * is granted directly or by implication, estoppel or otherwise;
38  *
39  * The above copyright and patent license is granted only if the following
40  * conditions are met:
41  *
42  * 3. Conditions
43  *
44  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
45  * Redistribution of source code of any substantial portion of the Covered
46  * Code or modification with rights to further distribute source must include
47  * the above Copyright Notice, the above License, this list of Conditions,
48  * and the following Disclaimer and Export Compliance provision.  In addition,
49  * Licensee must cause all Covered Code to which Licensee contributes to
50  * contain a file documenting the changes Licensee made to create that Covered
51  * Code and the date of any change.  Licensee must include in that file the
52  * documentation of any changes made by any predecessor Licensee.  Licensee
53  * must include a prominent statement that the modification is derived,
54  * directly or indirectly, from Original Intel Code.
55  *
56  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
57  * Redistribution of source code of any substantial portion of the Covered
58  * Code or modification without rights to further distribute source must
59  * include the following Disclaimer and Export Compliance provision in the
60  * documentation and/or other materials provided with distribution.  In
61  * addition, Licensee may not authorize further sublicense of source of any
62  * portion of the Covered Code, and must include terms to the effect that the
63  * license from Licensee to its licensee is limited to the intellectual
64  * property embodied in the software Licensee provides to its licensee, and
65  * not to intellectual property embodied in modifications its licensee may
66  * make.
67  *
68  * 3.3. Redistribution of Executable. Redistribution in executable form of any
69  * substantial portion of the Covered Code or modification must reproduce the
70  * above Copyright Notice, and the following Disclaimer and Export Compliance
71  * provision in the documentation and/or other materials provided with the
72  * distribution.
73  *
74  * 3.4. Intel retains all right, title, and interest in and to the Original
75  * Intel Code.
76  *
77  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
78  * Intel shall be used in advertising or otherwise to promote the sale, use or
79  * other dealings in products derived from or relating to the Covered Code
80  * without prior written authorization from Intel.
81  *
82  * 4. Disclaimer and Export Compliance
83  *
84  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
85  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
86  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
87  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
88  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
89  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
90  * PARTICULAR PURPOSE.
91  *
92  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
93  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
94  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
95  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
96  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
97  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
98  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
99  * LIMITED REMEDY.
100  *
101  * 4.3. Licensee shall not export, either directly or indirectly, any of this
102  * software or system incorporating such software without first obtaining any
103  * required license or other approval from the U. S. Department of Commerce or
104  * any other agency or department of the United States Government.  In the
105  * event Licensee exports any such software from the United States or
106  * re-exports any such software from a foreign destination, Licensee shall
107  * ensure that the distribution and export/re-export of the software is in
108  * compliance with all laws, regulations, orders, or other restrictions of the
109  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
110  * any of its subsidiaries will export/re-export any technical data, process,
111  * software, or service, directly or indirectly, to any country for which the
112  * United States government or any agency thereof requires an export license,
113  * other governmental approval, or letter of assurance, without first obtaining
114  * such license, approval or letter.
115  *
116  *****************************************************************************/
117
118 #define __EXSYSTEM_C__
119
120 #include "acpi.h"
121 #include "acinterp.h"
122 #include "acevents.h"
123
124 #define _COMPONENT          ACPI_EXECUTER
125         ACPI_MODULE_NAME    ("exsystem")
126
127
128 /*******************************************************************************
129  *
130  * FUNCTION:    AcpiExSystemWaitSemaphore
131  *
132  * PARAMETERS:  Semaphore           - OSD semaphore to wait on
133  *              Timeout             - Max time to wait
134  *
135  * RETURN:      Status
136  *
137  * DESCRIPTION: Implements a semaphore wait with a check to see if the
138  *              semaphore is available immediately.  If it is not, the
139  *              interpreter is released.
140  *
141  ******************************************************************************/
142
143 ACPI_STATUS
144 AcpiExSystemWaitSemaphore (
145     ACPI_HANDLE             Semaphore,
146     UINT16                  Timeout)
147 {
148     ACPI_STATUS             Status;
149     ACPI_STATUS             Status2;
150
151
152     ACPI_FUNCTION_TRACE ("ExSystemWaitSemaphore");
153
154
155     Status = AcpiOsWaitSemaphore (Semaphore, 1, 0);
156     if (ACPI_SUCCESS (Status))
157     {
158         return_ACPI_STATUS (Status);
159     }
160
161     if (Status == AE_TIME)
162     {
163         /* We must wait, so unlock the interpreter */
164
165         AcpiExExitInterpreter ();
166
167         Status = AcpiOsWaitSemaphore (Semaphore, 1, Timeout);
168
169         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*** Thread awake after blocking, %s\n",
170             AcpiFormatException (Status)));
171
172         /* Reacquire the interpreter */
173
174         Status2 = AcpiExEnterInterpreter ();
175         if (ACPI_FAILURE (Status2))
176         {
177             /* Report fatal error, could not acquire interpreter */
178
179             return_ACPI_STATUS (Status2);
180         }
181     }
182
183     return_ACPI_STATUS (Status);
184 }
185
186
187 /*******************************************************************************
188  *
189  * FUNCTION:    AcpiExSystemDoStall
190  *
191  * PARAMETERS:  HowLong             - The amount of time to stall,
192  *                                    in microseconds
193  *
194  * RETURN:      Status
195  *
196  * DESCRIPTION: Suspend running thread for specified amount of time.
197  *              Note: ACPI specification requires that Stall() does not
198  *              relinquish the processor, and delays longer than 100 usec
199  *              should use Sleep() instead.  We allow stalls up to 255 usec
200  *              for compatibility with other interpreters and existing BIOSs.
201  *
202  ******************************************************************************/
203
204 ACPI_STATUS
205 AcpiExSystemDoStall (
206     UINT32                  HowLong)
207 {
208     ACPI_STATUS             Status = AE_OK;
209
210
211     ACPI_FUNCTION_ENTRY ();
212
213
214     if (HowLong > 255) /* 255 microseconds */
215     {
216         /*
217          * Longer than 255 usec, this is an error
218          *
219          * (ACPI specifies 100 usec as max, but this gives some slack in
220          * order to support existing BIOSs)
221          */
222         ACPI_REPORT_ERROR (("Stall: Time parameter is too large (%d)\n", HowLong));
223         Status = AE_AML_OPERAND_VALUE;
224     }
225     else
226     {
227         AcpiOsStall (HowLong);
228     }
229
230     return (Status);
231 }
232
233
234 /*******************************************************************************
235  *
236  * FUNCTION:    AcpiExSystemDoSuspend
237  *
238  * PARAMETERS:  HowLong             - The amount of time to suspend,
239  *                                    in milliseconds
240  *
241  * RETURN:      None
242  *
243  * DESCRIPTION: Suspend running thread for specified amount of time.
244  *
245  ******************************************************************************/
246
247 ACPI_STATUS
248 AcpiExSystemDoSuspend (
249     ACPI_INTEGER            HowLong)
250 {
251     ACPI_STATUS             Status;
252
253
254     ACPI_FUNCTION_ENTRY ();
255
256
257     /* Since this thread will sleep, we must release the interpreter */
258
259     AcpiExExitInterpreter ();
260
261     AcpiOsSleep (HowLong);
262
263     /* And now we must get the interpreter again */
264
265     Status = AcpiExEnterInterpreter ();
266     return (Status);
267 }
268
269
270 /*******************************************************************************
271  *
272  * FUNCTION:    AcpiExSystemAcquireMutex
273  *
274  * PARAMETERS:  *TimeDesc           - The 'time to delay' object descriptor
275  *              *ObjDesc            - The object descriptor for this op
276  *
277  * RETURN:      Status
278  *
279  * DESCRIPTION: Provides an access point to perform synchronization operations
280  *              within the AML.  This function will cause a lock to be generated
281  *              for the Mutex pointed to by ObjDesc.
282  *
283  ******************************************************************************/
284
285 ACPI_STATUS
286 AcpiExSystemAcquireMutex (
287     ACPI_OPERAND_OBJECT     *TimeDesc,
288     ACPI_OPERAND_OBJECT     *ObjDesc)
289 {
290     ACPI_STATUS             Status = AE_OK;
291
292
293     ACPI_FUNCTION_TRACE_PTR ("ExSystemAcquireMutex", ObjDesc);
294
295
296     if (!ObjDesc)
297     {
298         return_ACPI_STATUS (AE_BAD_PARAMETER);
299     }
300
301     /*
302      * Support for the _GL_ Mutex object -- go get the global lock
303      */
304     if (ObjDesc->Mutex.Semaphore == AcpiGbl_GlobalLockSemaphore)
305     {
306         Status = AcpiEvAcquireGlobalLock ((UINT16) TimeDesc->Integer.Value);
307         return_ACPI_STATUS (Status);
308     }
309
310     Status = AcpiExSystemWaitSemaphore (ObjDesc->Mutex.Semaphore,
311                                          (UINT16) TimeDesc->Integer.Value);
312     return_ACPI_STATUS (Status);
313 }
314
315
316 /*******************************************************************************
317  *
318  * FUNCTION:    AcpiExSystemReleaseMutex
319  *
320  * PARAMETERS:  *ObjDesc            - The object descriptor for this op
321  *
322  * RETURN:      Status
323  *
324  * DESCRIPTION: Provides an access point to perform synchronization operations
325  *              within the AML.  This operation is a request to release a
326  *              previously acquired Mutex.  If the Mutex variable is set then
327  *              it will be decremented.
328  *
329  ******************************************************************************/
330
331 ACPI_STATUS
332 AcpiExSystemReleaseMutex (
333     ACPI_OPERAND_OBJECT     *ObjDesc)
334 {
335     ACPI_STATUS             Status = AE_OK;
336
337
338     ACPI_FUNCTION_TRACE ("ExSystemReleaseMutex");
339
340
341     if (!ObjDesc)
342     {
343         return_ACPI_STATUS (AE_BAD_PARAMETER);
344     }
345
346     /*
347      * Support for the _GL_ Mutex object -- release the global lock
348      */
349     if (ObjDesc->Mutex.Semaphore == AcpiGbl_GlobalLockSemaphore)
350     {
351         Status = AcpiEvReleaseGlobalLock ();
352         return_ACPI_STATUS (Status);
353     }
354
355     Status = AcpiOsSignalSemaphore (ObjDesc->Mutex.Semaphore, 1);
356     return_ACPI_STATUS (Status);
357 }
358
359
360 /*******************************************************************************
361  *
362  * FUNCTION:    AcpiExSystemSignalEvent
363  *
364  * PARAMETERS:  *ObjDesc            - The object descriptor for this op
365  *
366  * RETURN:      AE_OK
367  *
368  * DESCRIPTION: Provides an access point to perform synchronization operations
369  *              within the AML.
370  *
371  ******************************************************************************/
372
373 ACPI_STATUS
374 AcpiExSystemSignalEvent (
375     ACPI_OPERAND_OBJECT     *ObjDesc)
376 {
377     ACPI_STATUS             Status = AE_OK;
378
379
380     ACPI_FUNCTION_TRACE ("ExSystemSignalEvent");
381
382
383     if (ObjDesc)
384     {
385         Status = AcpiOsSignalSemaphore (ObjDesc->Event.Semaphore, 1);
386     }
387
388     return_ACPI_STATUS (Status);
389 }
390
391
392 /*******************************************************************************
393  *
394  * FUNCTION:    AcpiExSystemWaitEvent
395  *
396  * PARAMETERS:  *TimeDesc           - The 'time to delay' object descriptor
397  *              *ObjDesc            - The object descriptor for this op
398  *
399  * RETURN:      Status
400  *
401  * DESCRIPTION: Provides an access point to perform synchronization operations
402  *              within the AML.  This operation is a request to wait for an
403  *              event.
404  *
405  ******************************************************************************/
406
407 ACPI_STATUS
408 AcpiExSystemWaitEvent (
409     ACPI_OPERAND_OBJECT     *TimeDesc,
410     ACPI_OPERAND_OBJECT     *ObjDesc)
411 {
412     ACPI_STATUS             Status = AE_OK;
413
414
415     ACPI_FUNCTION_TRACE ("ExSystemWaitEvent");
416
417
418     if (ObjDesc)
419     {
420         Status = AcpiExSystemWaitSemaphore (ObjDesc->Event.Semaphore,
421                                              (UINT16) TimeDesc->Integer.Value);
422     }
423
424     return_ACPI_STATUS (Status);
425 }
426
427
428 /*******************************************************************************
429  *
430  * FUNCTION:    AcpiExSystemResetEvent
431  *
432  * PARAMETERS:  *ObjDesc            - The object descriptor for this op
433  *
434  * RETURN:      Status
435  *
436  * DESCRIPTION: Reset an event to a known state.
437  *
438  ******************************************************************************/
439
440 ACPI_STATUS
441 AcpiExSystemResetEvent (
442     ACPI_OPERAND_OBJECT     *ObjDesc)
443 {
444     ACPI_STATUS             Status = AE_OK;
445     void                    *TempSemaphore;
446
447
448     ACPI_FUNCTION_ENTRY ();
449
450
451     /*
452      * We are going to simply delete the existing semaphore and
453      * create a new one!
454      */
455     Status = AcpiOsCreateSemaphore (ACPI_NO_UNIT_LIMIT, 0, &TempSemaphore);
456     if (ACPI_SUCCESS (Status))
457     {
458         (void) AcpiOsDeleteSemaphore (ObjDesc->Event.Semaphore);
459         ObjDesc->Event.Semaphore = TempSemaphore;
460     }
461
462     return (Status);
463 }
464