Subversion Repositories Kolibri OS

Rev

Rev 1498 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1498 serge 1
/*******************************************************************************
2
 *
3
 * Module Name: nsobject - Utilities for objects attached to namespace
4
 *                         table entries
5
 *
6
 ******************************************************************************/
7
 
8
/******************************************************************************
9
 *
10
 * 1. Copyright Notice
11
 *
2216 Serge 12
 * Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp.
1498 serge 13
 * All rights reserved.
14
 *
15
 * 2. License
16
 *
17
 * 2.1. This is your license from Intel Corp. under its intellectual property
18
 * rights.  You may have additional license terms from the party that provided
19
 * you this software, covering your right to use that party's intellectual
20
 * property rights.
21
 *
22
 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23
 * copy of the source code appearing in this file ("Covered Code") an
24
 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25
 * base code distributed originally by Intel ("Original Intel Code") to copy,
26
 * make derivatives, distribute, use and display any portion of the Covered
27
 * Code in any form, with the right to sublicense such rights; and
28
 *
29
 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30
 * license (with the right to sublicense), under only those claims of Intel
31
 * patents that are infringed by the Original Intel Code, to make, use, sell,
32
 * offer to sell, and import the Covered Code and derivative works thereof
33
 * solely to the minimum extent necessary to exercise the above copyright
34
 * license, and in no event shall the patent license extend to any additions
35
 * to or modifications of the Original Intel Code.  No other license or right
36
 * is granted directly or by implication, estoppel or otherwise;
37
 *
38
 * The above copyright and patent license is granted only if the following
39
 * conditions are met:
40
 *
41
 * 3. Conditions
42
 *
43
 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44
 * Redistribution of source code of any substantial portion of the Covered
45
 * Code or modification with rights to further distribute source must include
46
 * the above Copyright Notice, the above License, this list of Conditions,
47
 * and the following Disclaimer and Export Compliance provision.  In addition,
48
 * Licensee must cause all Covered Code to which Licensee contributes to
49
 * contain a file documenting the changes Licensee made to create that Covered
50
 * Code and the date of any change.  Licensee must include in that file the
51
 * documentation of any changes made by any predecessor Licensee.  Licensee
52
 * must include a prominent statement that the modification is derived,
53
 * directly or indirectly, from Original Intel Code.
54
 *
55
 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56
 * Redistribution of source code of any substantial portion of the Covered
57
 * Code or modification without rights to further distribute source must
58
 * include the following Disclaimer and Export Compliance provision in the
59
 * documentation and/or other materials provided with distribution.  In
60
 * addition, Licensee may not authorize further sublicense of source of any
61
 * portion of the Covered Code, and must include terms to the effect that the
62
 * license from Licensee to its licensee is limited to the intellectual
63
 * property embodied in the software Licensee provides to its licensee, and
64
 * not to intellectual property embodied in modifications its licensee may
65
 * make.
66
 *
67
 * 3.3. Redistribution of Executable. Redistribution in executable form of any
68
 * substantial portion of the Covered Code or modification must reproduce the
69
 * above Copyright Notice, and the following Disclaimer and Export Compliance
70
 * provision in the documentation and/or other materials provided with the
71
 * distribution.
72
 *
73
 * 3.4. Intel retains all right, title, and interest in and to the Original
74
 * Intel Code.
75
 *
76
 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77
 * Intel shall be used in advertising or otherwise to promote the sale, use or
78
 * other dealings in products derived from or relating to the Covered Code
79
 * without prior written authorization from Intel.
80
 *
81
 * 4. Disclaimer and Export Compliance
82
 *
83
 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84
 * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85
 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
86
 * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
87
 * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
88
 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89
 * PARTICULAR PURPOSE.
90
 *
91
 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92
 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93
 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94
 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95
 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96
 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
97
 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98
 * LIMITED REMEDY.
99
 *
100
 * 4.3. Licensee shall not export, either directly or indirectly, any of this
101
 * software or system incorporating such software without first obtaining any
102
 * required license or other approval from the U. S. Department of Commerce or
103
 * any other agency or department of the United States Government.  In the
104
 * event Licensee exports any such software from the United States or
105
 * re-exports any such software from a foreign destination, Licensee shall
106
 * ensure that the distribution and export/re-export of the software is in
107
 * compliance with all laws, regulations, orders, or other restrictions of the
108
 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109
 * any of its subsidiaries will export/re-export any technical data, process,
110
 * software, or service, directly or indirectly, to any country for which the
111
 * United States government or any agency thereof requires an export license,
112
 * other governmental approval, or letter of assurance, without first obtaining
113
 * such license, approval or letter.
114
 *
115
 *****************************************************************************/
116
 
117
 
118
#define __NSOBJECT_C__
119
 
120
#include "acpi.h"
121
#include "accommon.h"
122
#include "acnamesp.h"
123
 
124
 
125
#define _COMPONENT          ACPI_NAMESPACE
126
        ACPI_MODULE_NAME    ("nsobject")
127
 
128
 
129
/*******************************************************************************
130
 *
131
 * FUNCTION:    AcpiNsAttachObject
132
 *
133
 * PARAMETERS:  Node                - Parent Node
134
 *              Object              - Object to be attached
135
 *              Type                - Type of object, or ACPI_TYPE_ANY if not
136
 *                                    known
137
 *
138
 * RETURN:      Status
139
 *
140
 * DESCRIPTION: Record the given object as the value associated with the
141
 *              name whose ACPI_HANDLE is passed.  If Object is NULL
142
 *              and Type is ACPI_TYPE_ANY, set the name as having no value.
143
 *              Note: Future may require that the Node->Flags field be passed
144
 *              as a parameter.
145
 *
146
 * MUTEX:       Assumes namespace is locked
147
 *
148
 ******************************************************************************/
149
 
150
ACPI_STATUS
151
AcpiNsAttachObject (
152
    ACPI_NAMESPACE_NODE     *Node,
153
    ACPI_OPERAND_OBJECT     *Object,
154
    ACPI_OBJECT_TYPE        Type)
155
{
156
    ACPI_OPERAND_OBJECT     *ObjDesc;
157
    ACPI_OPERAND_OBJECT     *LastObjDesc;
158
    ACPI_OBJECT_TYPE        ObjectType = ACPI_TYPE_ANY;
159
 
160
 
161
    ACPI_FUNCTION_TRACE (NsAttachObject);
162
 
163
 
164
    /*
165
     * Parameter validation
166
     */
167
    if (!Node)
168
    {
169
        /* Invalid handle */
170
 
171
        ACPI_ERROR ((AE_INFO, "Null NamedObj handle"));
172
        return_ACPI_STATUS (AE_BAD_PARAMETER);
173
    }
174
 
175
    if (!Object && (ACPI_TYPE_ANY != Type))
176
    {
177
        /* Null object */
178
 
179
        ACPI_ERROR ((AE_INFO,
180
            "Null object, but type not ACPI_TYPE_ANY"));
181
        return_ACPI_STATUS (AE_BAD_PARAMETER);
182
    }
183
 
184
    if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
185
    {
186
        /* Not a name handle */
187
 
188
        ACPI_ERROR ((AE_INFO, "Invalid handle %p [%s]",
189
            Node, AcpiUtGetDescriptorName (Node)));
190
        return_ACPI_STATUS (AE_BAD_PARAMETER);
191
    }
192
 
193
    /* Check if this object is already attached */
194
 
195
    if (Node->Object == Object)
196
    {
197
        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
198
            "Obj %p already installed in NameObj %p\n",
199
            Object, Node));
200
 
201
        return_ACPI_STATUS (AE_OK);
202
    }
203
 
204
    /* If null object, we will just install it */
205
 
206
    if (!Object)
207
    {
208
        ObjDesc    = NULL;
209
        ObjectType = ACPI_TYPE_ANY;
210
    }
211
 
212
    /*
213
     * If the source object is a namespace Node with an attached object,
214
     * we will use that (attached) object
215
     */
216
    else if ((ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_NAMED) &&
217
            ((ACPI_NAMESPACE_NODE *) Object)->Object)
218
    {
219
        /*
220
         * Value passed is a name handle and that name has a
221
         * non-null value.  Use that name's value and type.
222
         */
223
        ObjDesc    = ((ACPI_NAMESPACE_NODE *) Object)->Object;
224
        ObjectType = ((ACPI_NAMESPACE_NODE *) Object)->Type;
225
    }
226
 
227
    /*
228
     * Otherwise, we will use the parameter object, but we must type
229
     * it first
230
     */
231
    else
232
    {
233
        ObjDesc = (ACPI_OPERAND_OBJECT  *) Object;
234
 
235
        /* Use the given type */
236
 
237
        ObjectType = Type;
238
    }
239
 
240
    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Installing %p into Node %p [%4.4s]\n",
241
        ObjDesc, Node, AcpiUtGetNodeName (Node)));
242
 
243
    /* Detach an existing attached object if present */
244
 
245
    if (Node->Object)
246
    {
247
        AcpiNsDetachObject (Node);
248
    }
249
 
250
    if (ObjDesc)
251
    {
252
        /*
253
         * Must increment the new value's reference count
254
         * (if it is an internal object)
255
         */
256
        AcpiUtAddReference (ObjDesc);
257
 
258
        /*
259
         * Handle objects with multiple descriptors - walk
260
         * to the end of the descriptor list
261
         */
262
        LastObjDesc = ObjDesc;
263
        while (LastObjDesc->Common.NextObject)
264
        {
265
            LastObjDesc = LastObjDesc->Common.NextObject;
266
        }
267
 
268
        /* Install the object at the front of the object list */
269
 
270
        LastObjDesc->Common.NextObject = Node->Object;
271
    }
272
 
273
    Node->Type     = (UINT8) ObjectType;
274
    Node->Object   = ObjDesc;
275
 
276
    return_ACPI_STATUS (AE_OK);
277
}
278
 
279
 
280
/*******************************************************************************
281
 *
282
 * FUNCTION:    AcpiNsDetachObject
283
 *
284
 * PARAMETERS:  Node           - A Namespace node whose object will be detached
285
 *
286
 * RETURN:      None.
287
 *
288
 * DESCRIPTION: Detach/delete an object associated with a namespace node.
289
 *              if the object is an allocated object, it is freed.
290
 *              Otherwise, the field is simply cleared.
291
 *
292
 ******************************************************************************/
293
 
294
void
295
AcpiNsDetachObject (
296
    ACPI_NAMESPACE_NODE     *Node)
297
{
298
    ACPI_OPERAND_OBJECT     *ObjDesc;
299
 
300
 
301
    ACPI_FUNCTION_TRACE (NsDetachObject);
302
 
303
 
304
    ObjDesc = Node->Object;
305
 
306
    if (!ObjDesc ||
307
        (ObjDesc->Common.Type == ACPI_TYPE_LOCAL_DATA))
308
    {
309
        return_VOID;
310
    }
311
 
312
    if (Node->Flags & ANOBJ_ALLOCATED_BUFFER)
313
    {
314
        /* Free the dynamic aml buffer */
315
 
316
        if (ObjDesc->Common.Type == ACPI_TYPE_METHOD)
317
        {
318
            ACPI_FREE (ObjDesc->Method.AmlStart);
319
        }
320
    }
321
 
322
    /* Clear the entry in all cases */
323
 
324
    Node->Object = NULL;
325
    if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND)
326
    {
327
        Node->Object = ObjDesc->Common.NextObject;
328
        if (Node->Object &&
329
           ((Node->Object)->Common.Type != ACPI_TYPE_LOCAL_DATA))
330
        {
331
            Node->Object = Node->Object->Common.NextObject;
332
        }
333
    }
334
 
335
    /* Reset the node type to untyped */
336
 
337
    Node->Type = ACPI_TYPE_ANY;
338
 
339
    ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Node %p [%4.4s] Object %p\n",
340
        Node, AcpiUtGetNodeName (Node), ObjDesc));
341
 
342
    /* Remove one reference on the object (and all subobjects) */
343
 
344
    AcpiUtRemoveReference (ObjDesc);
345
    return_VOID;
346
}
347
 
348
 
349
/*******************************************************************************
350
 *
351
 * FUNCTION:    AcpiNsGetAttachedObject
352
 *
353
 * PARAMETERS:  Node             - Namespace node
354
 *
355
 * RETURN:      Current value of the object field from the Node whose
356
 *              handle is passed
357
 *
358
 * DESCRIPTION: Obtain the object attached to a namespace node.
359
 *
360
 ******************************************************************************/
361
 
362
ACPI_OPERAND_OBJECT *
363
AcpiNsGetAttachedObject (
364
    ACPI_NAMESPACE_NODE     *Node)
365
{
366
    ACPI_FUNCTION_TRACE_PTR (NsGetAttachedObject, Node);
367
 
368
 
369
    if (!Node)
370
    {
371
        ACPI_WARNING ((AE_INFO, "Null Node ptr"));
372
        return_PTR (NULL);
373
    }
374
 
375
    if (!Node->Object ||
376
            ((ACPI_GET_DESCRIPTOR_TYPE (Node->Object) != ACPI_DESC_TYPE_OPERAND) &&
377
             (ACPI_GET_DESCRIPTOR_TYPE (Node->Object) != ACPI_DESC_TYPE_NAMED))  ||
378
        ((Node->Object)->Common.Type == ACPI_TYPE_LOCAL_DATA))
379
    {
380
        return_PTR (NULL);
381
    }
382
 
383
    return_PTR (Node->Object);
384
}
385
 
386
 
387
/*******************************************************************************
388
 *
389
 * FUNCTION:    AcpiNsGetSecondaryObject
390
 *
391
 * PARAMETERS:  Node             - Namespace node
392
 *
393
 * RETURN:      Current value of the object field from the Node whose
394
 *              handle is passed.
395
 *
396
 * DESCRIPTION: Obtain a secondary object associated with a namespace node.
397
 *
398
 ******************************************************************************/
399
 
400
ACPI_OPERAND_OBJECT *
401
AcpiNsGetSecondaryObject (
402
    ACPI_OPERAND_OBJECT     *ObjDesc)
403
{
404
    ACPI_FUNCTION_TRACE_PTR (NsGetSecondaryObject, ObjDesc);
405
 
406
 
407
    if ((!ObjDesc)                                     ||
408
        (ObjDesc->Common.Type== ACPI_TYPE_LOCAL_DATA)  ||
409
        (!ObjDesc->Common.NextObject)                  ||
410
        ((ObjDesc->Common.NextObject)->Common.Type == ACPI_TYPE_LOCAL_DATA))
411
    {
412
        return_PTR (NULL);
413
    }
414
 
415
    return_PTR (ObjDesc->Common.NextObject);
416
}
417
 
418
 
419
/*******************************************************************************
420
 *
421
 * FUNCTION:    AcpiNsAttachData
422
 *
423
 * PARAMETERS:  Node            - Namespace node
424
 *              Handler         - Handler to be associated with the data
425
 *              Data            - Data to be attached
426
 *
427
 * RETURN:      Status
428
 *
429
 * DESCRIPTION: Low-level attach data.  Create and attach a Data object.
430
 *
431
 ******************************************************************************/
432
 
433
ACPI_STATUS
434
AcpiNsAttachData (
435
    ACPI_NAMESPACE_NODE     *Node,
436
    ACPI_OBJECT_HANDLER     Handler,
437
    void                    *Data)
438
{
439
    ACPI_OPERAND_OBJECT     *PrevObjDesc;
440
    ACPI_OPERAND_OBJECT     *ObjDesc;
441
    ACPI_OPERAND_OBJECT     *DataDesc;
442
 
443
 
444
    /* We only allow one attachment per handler */
445
 
446
    PrevObjDesc = NULL;
447
    ObjDesc = Node->Object;
448
    while (ObjDesc)
449
    {
450
        if ((ObjDesc->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
451
            (ObjDesc->Data.Handler == Handler))
452
        {
453
            return (AE_ALREADY_EXISTS);
454
        }
455
 
456
        PrevObjDesc = ObjDesc;
457
        ObjDesc = ObjDesc->Common.NextObject;
458
    }
459
 
460
    /* Create an internal object for the data */
461
 
462
    DataDesc = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_DATA);
463
    if (!DataDesc)
464
    {
465
        return (AE_NO_MEMORY);
466
    }
467
 
468
    DataDesc->Data.Handler = Handler;
469
    DataDesc->Data.Pointer = Data;
470
 
471
    /* Install the data object */
472
 
473
    if (PrevObjDesc)
474
    {
475
        PrevObjDesc->Common.NextObject = DataDesc;
476
    }
477
    else
478
    {
479
        Node->Object = DataDesc;
480
    }
481
 
482
    return (AE_OK);
483
}
484
 
485
 
486
/*******************************************************************************
487
 *
488
 * FUNCTION:    AcpiNsDetachData
489
 *
490
 * PARAMETERS:  Node            - Namespace node
491
 *              Handler         - Handler associated with the data
492
 *
493
 * RETURN:      Status
494
 *
495
 * DESCRIPTION: Low-level detach data.  Delete the data node, but the caller
496
 *              is responsible for the actual data.
497
 *
498
 ******************************************************************************/
499
 
500
ACPI_STATUS
501
AcpiNsDetachData (
502
    ACPI_NAMESPACE_NODE     *Node,
503
    ACPI_OBJECT_HANDLER     Handler)
504
{
505
    ACPI_OPERAND_OBJECT     *ObjDesc;
506
    ACPI_OPERAND_OBJECT     *PrevObjDesc;
507
 
508
 
509
    PrevObjDesc = NULL;
510
    ObjDesc = Node->Object;
511
    while (ObjDesc)
512
    {
513
        if ((ObjDesc->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
514
            (ObjDesc->Data.Handler == Handler))
515
        {
516
            if (PrevObjDesc)
517
            {
518
                PrevObjDesc->Common.NextObject = ObjDesc->Common.NextObject;
519
            }
520
            else
521
            {
522
                Node->Object = ObjDesc->Common.NextObject;
523
            }
524
 
525
            AcpiUtRemoveReference (ObjDesc);
526
            return (AE_OK);
527
        }
528
 
529
        PrevObjDesc = ObjDesc;
530
        ObjDesc = ObjDesc->Common.NextObject;
531
    }
532
 
533
    return (AE_NOT_FOUND);
534
}
535
 
536
 
537
/*******************************************************************************
538
 *
539
 * FUNCTION:    AcpiNsGetAttachedData
540
 *
541
 * PARAMETERS:  Node            - Namespace node
542
 *              Handler         - Handler associated with the data
543
 *              Data            - Where the data is returned
544
 *
545
 * RETURN:      Status
546
 *
547
 * DESCRIPTION: Low level interface to obtain data previously associated with
548
 *              a namespace node.
549
 *
550
 ******************************************************************************/
551
 
552
ACPI_STATUS
553
AcpiNsGetAttachedData (
554
    ACPI_NAMESPACE_NODE     *Node,
555
    ACPI_OBJECT_HANDLER     Handler,
556
    void                    **Data)
557
{
558
    ACPI_OPERAND_OBJECT     *ObjDesc;
559
 
560
 
561
    ObjDesc = Node->Object;
562
    while (ObjDesc)
563
    {
564
        if ((ObjDesc->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
565
            (ObjDesc->Data.Handler == Handler))
566
        {
567
            *Data = ObjDesc->Data.Pointer;
568
            return (AE_OK);
569
        }
570
 
571
        ObjDesc = ObjDesc->Common.NextObject;
572
    }
573
 
574
    return (AE_NOT_FOUND);
575
}
576