exstore.c revision 238381
167754Smsmith/******************************************************************************
267754Smsmith *
377424Smsmith * Module Name: exstore - AML Interpreter object store support
467754Smsmith *
567754Smsmith *****************************************************************************/
667754Smsmith
7217365Sjkim/*
8229989Sjkim * Copyright (C) 2000 - 2012, Intel Corp.
970243Smsmith * All rights reserved.
1067754Smsmith *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
2567754Smsmith *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
2967754Smsmith *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
4367754Smsmith
4477424Smsmith#define __EXSTORE_C__
4567754Smsmith
46193341Sjkim#include <contrib/dev/acpica/include/acpi.h>
47193341Sjkim#include <contrib/dev/acpica/include/accommon.h>
48193341Sjkim#include <contrib/dev/acpica/include/acdispat.h>
49193341Sjkim#include <contrib/dev/acpica/include/acinterp.h>
50193341Sjkim#include <contrib/dev/acpica/include/amlcode.h>
51193341Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
5267754Smsmith
5367754Smsmith
5477424Smsmith#define _COMPONENT          ACPI_EXECUTER
5591116Smsmith        ACPI_MODULE_NAME    ("exstore")
5667754Smsmith
57151937Sjkim/* Local prototypes */
5867754Smsmith
59151937Sjkimstatic ACPI_STATUS
60151937SjkimAcpiExStoreObjectToIndex (
61151937Sjkim    ACPI_OPERAND_OBJECT     *ValDesc,
62151937Sjkim    ACPI_OPERAND_OBJECT     *DestDesc,
63151937Sjkim    ACPI_WALK_STATE         *WalkState);
64151937Sjkim
65151937Sjkim
6667754Smsmith/*******************************************************************************
6767754Smsmith *
6877424Smsmith * FUNCTION:    AcpiExStore
6967754Smsmith *
7085756Smsmith * PARAMETERS:  *SourceDesc         - Value to be stored
71238381Sjkim *              *DestDesc           - Where to store it. Must be an NS node
72238381Sjkim *                                    or ACPI_OPERAND_OBJECT of type
7387031Smsmith *                                    Reference;
7487031Smsmith *              WalkState           - Current walk state
7567754Smsmith *
7667754Smsmith * RETURN:      Status
7767754Smsmith *
7885756Smsmith * DESCRIPTION: Store the value described by SourceDesc into the location
79238381Sjkim *              described by DestDesc. Called by various interpreter
8067754Smsmith *              functions to store the result of an operation into
8191116Smsmith *              the destination operand -- not just simply the actual "Store"
8287031Smsmith *              ASL operator.
8367754Smsmith *
8467754Smsmith ******************************************************************************/
8567754Smsmith
8667754SmsmithACPI_STATUS
8777424SmsmithAcpiExStore (
8885756Smsmith    ACPI_OPERAND_OBJECT     *SourceDesc,
8967754Smsmith    ACPI_OPERAND_OBJECT     *DestDesc,
9067754Smsmith    ACPI_WALK_STATE         *WalkState)
9167754Smsmith{
9267754Smsmith    ACPI_STATUS             Status = AE_OK;
9371867Smsmith    ACPI_OPERAND_OBJECT     *RefDesc = DestDesc;
9467754Smsmith
9567754Smsmith
96167802Sjkim    ACPI_FUNCTION_TRACE_PTR (ExStore, DestDesc);
9767754Smsmith
9867754Smsmith
9967754Smsmith    /* Validate parameters */
10067754Smsmith
10185756Smsmith    if (!SourceDesc || !DestDesc)
10267754Smsmith    {
103167802Sjkim        ACPI_ERROR ((AE_INFO, "Null parameter"));
10467754Smsmith        return_ACPI_STATUS (AE_AML_NO_OPERAND);
10567754Smsmith    }
10667754Smsmith
10771867Smsmith    /* DestDesc can be either a namespace node or an ACPI object */
10867754Smsmith
10991116Smsmith    if (ACPI_GET_DESCRIPTOR_TYPE (DestDesc) == ACPI_DESC_TYPE_NAMED)
11067754Smsmith    {
11177424Smsmith        /*
11271867Smsmith         * Dest is a namespace node,
113107325Siwasaki         * Storing an object into a Named node.
11471867Smsmith         */
11585756Smsmith        Status = AcpiExStoreObjectToNode (SourceDesc,
116128212Snjl                    (ACPI_NAMESPACE_NODE *) DestDesc, WalkState,
117128212Snjl                    ACPI_IMPLICIT_CONVERSION);
11867754Smsmith
11971867Smsmith        return_ACPI_STATUS (Status);
12067754Smsmith    }
12167754Smsmith
12299679Siwasaki    /* Destination object must be a Reference or a Constant object */
12367754Smsmith
124193267Sjkim    switch (DestDesc->Common.Type)
125102550Siwasaki    {
126107325Siwasaki    case ACPI_TYPE_LOCAL_REFERENCE:
12799679Siwasaki        break;
12899679Siwasaki
12999679Siwasaki    case ACPI_TYPE_INTEGER:
13099679Siwasaki
13199679Siwasaki        /* Allow stores to Constants -- a Noop as per ACPI spec */
13299679Siwasaki
13399679Siwasaki        if (DestDesc->Common.Flags & AOPOBJ_AML_CONSTANT)
13499679Siwasaki        {
13599679Siwasaki            return_ACPI_STATUS (AE_OK);
13699679Siwasaki        }
13799679Siwasaki
138104470Siwasaki        /*lint -fallthrough */
13999679Siwasaki
14099679Siwasaki    default:
14199679Siwasaki
142126372Snjl        /* Destination is not a Reference object */
14367754Smsmith
144167802Sjkim        ACPI_ERROR ((AE_INFO,
145167802Sjkim            "Target is not a Reference or Constant object - %s [%p]",
146138287Smarks            AcpiUtGetObjectTypeName (DestDesc), DestDesc));
14767754Smsmith
14867754Smsmith        return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
14967754Smsmith    }
15067754Smsmith
15177424Smsmith    /*
152193267Sjkim     * Examine the Reference class. These cases are handled:
15371867Smsmith     *
15471867Smsmith     * 1) Store to Name (Change the object associated with a name)
15571867Smsmith     * 2) Store to an indexed area of a Buffer or Package
15671867Smsmith     * 3) Store to a Method Local or Arg
15771867Smsmith     * 4) Store to the debug object
15871867Smsmith     */
159193267Sjkim    switch (RefDesc->Reference.Class)
16067754Smsmith    {
161193267Sjkim    case ACPI_REFCLASS_REFOF:
16267754Smsmith
16371867Smsmith        /* Storing an object into a Name "container" */
16471867Smsmith
165151937Sjkim        Status = AcpiExStoreObjectToNode (SourceDesc,
166151937Sjkim                    RefDesc->Reference.Object,
167151937Sjkim                    WalkState, ACPI_IMPLICIT_CONVERSION);
16871867Smsmith        break;
16967754Smsmith
17067754Smsmith
171193267Sjkim    case ACPI_REFCLASS_INDEX:
17267754Smsmith
17371867Smsmith        /* Storing to an Index (pointer into a packager or buffer) */
17467754Smsmith
17585756Smsmith        Status = AcpiExStoreObjectToIndex (SourceDesc, RefDesc, WalkState);
17671867Smsmith        break;
17771867Smsmith
17871867Smsmith
179193267Sjkim    case ACPI_REFCLASS_LOCAL:
180193267Sjkim    case ACPI_REFCLASS_ARG:
18171867Smsmith
18277424Smsmith        /* Store to a method local/arg  */
18371867Smsmith
184193267Sjkim        Status = AcpiDsStoreObjectToLocal (RefDesc->Reference.Class,
185193267Sjkim                    RefDesc->Reference.Value, SourceDesc, WalkState);
18671867Smsmith        break;
18771867Smsmith
18871867Smsmith
189193267Sjkim    case ACPI_REFCLASS_DEBUG:
19071867Smsmith
19167754Smsmith        /*
19271867Smsmith         * Storing to the Debug object causes the value stored to be
19371867Smsmith         * displayed and otherwise has no effect -- see ACPI Specification
19467754Smsmith         */
195138287Smarks        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
196138287Smarks            "**** Write to Debug Object: Object %p %s ****:\n\n",
197138287Smarks            SourceDesc, AcpiUtGetObjectTypeName (SourceDesc)));
19877424Smsmith
199204773Sjkim        ACPI_DEBUG_OBJECT (SourceDesc, 0, 0);
20071867Smsmith        break;
20171867Smsmith
20271867Smsmith
20371867Smsmith    default:
20471867Smsmith
205204773Sjkim        ACPI_ERROR ((AE_INFO, "Unknown Reference Class 0x%2.2X",
206193267Sjkim            RefDesc->Reference.Class));
207193267Sjkim        ACPI_DUMP_ENTRY (RefDesc, ACPI_LV_INFO);
20871867Smsmith
20971867Smsmith        Status = AE_AML_INTERNAL;
21071867Smsmith        break;
21199679Siwasaki    }
21271867Smsmith
21371867Smsmith    return_ACPI_STATUS (Status);
21471867Smsmith}
21571867Smsmith
21671867Smsmith
21771867Smsmith/*******************************************************************************
21871867Smsmith *
21977424Smsmith * FUNCTION:    AcpiExStoreObjectToIndex
22071867Smsmith *
22187031Smsmith * PARAMETERS:  *SourceDesc             - Value to be stored
22287031Smsmith *              *DestDesc               - Named object to receive the value
22387031Smsmith *              WalkState               - Current walk state
22471867Smsmith *
22571867Smsmith * RETURN:      Status
22671867Smsmith *
22787031Smsmith * DESCRIPTION: Store the object to indexed Buffer or Package element
22871867Smsmith *
22971867Smsmith ******************************************************************************/
23071867Smsmith
231151937Sjkimstatic ACPI_STATUS
23277424SmsmithAcpiExStoreObjectToIndex (
23385756Smsmith    ACPI_OPERAND_OBJECT     *SourceDesc,
23491116Smsmith    ACPI_OPERAND_OBJECT     *IndexDesc,
23571867Smsmith    ACPI_WALK_STATE         *WalkState)
23671867Smsmith{
23771867Smsmith    ACPI_STATUS             Status = AE_OK;
23871867Smsmith    ACPI_OPERAND_OBJECT     *ObjDesc;
23991116Smsmith    ACPI_OPERAND_OBJECT     *NewDesc;
24071867Smsmith    UINT8                   Value = 0;
241126372Snjl    UINT32                  i;
24271867Smsmith
24371867Smsmith
244167802Sjkim    ACPI_FUNCTION_TRACE (ExStoreObjectToIndex);
24571867Smsmith
24671867Smsmith
24771867Smsmith    /*
24871867Smsmith     * Destination must be a reference pointer, and
24971867Smsmith     * must point to either a buffer or a package
25071867Smsmith     */
25191116Smsmith    switch (IndexDesc->Reference.TargetType)
25271867Smsmith    {
25371867Smsmith    case ACPI_TYPE_PACKAGE:
25471867Smsmith        /*
255138287Smarks         * Storing to a package element. Copy the object and replace
256138287Smarks         * any existing object with the new object. No implicit
257138287Smarks         * conversion is performed.
258138287Smarks         *
25991116Smsmith         * The object at *(IndexDesc->Reference.Where) is the
26091116Smsmith         * element within the package that is to be modified.
261126372Snjl         * The parent package object is at IndexDesc->Reference.Object
26291116Smsmith         */
26391116Smsmith        ObjDesc = *(IndexDesc->Reference.Where);
26485756Smsmith
265193267Sjkim        if (SourceDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE &&
266193267Sjkim            SourceDesc->Reference.Class == ACPI_REFCLASS_TABLE)
26791116Smsmith        {
268193267Sjkim            /* This is a DDBHandle, just add a reference to it */
269193267Sjkim
270193267Sjkim            AcpiUtAddReference (SourceDesc);
271193267Sjkim            NewDesc = SourceDesc;
27291116Smsmith        }
273193267Sjkim        else
274193267Sjkim        {
275193267Sjkim            /* Normal object, copy it */
27667754Smsmith
277193267Sjkim            Status = AcpiUtCopyIobjectToIobject (SourceDesc, &NewDesc, WalkState);
278193267Sjkim            if (ACPI_FAILURE (Status))
279193267Sjkim            {
280193267Sjkim                return_ACPI_STATUS (Status);
281193267Sjkim            }
282193267Sjkim        }
283193267Sjkim
284138287Smarks        if (ObjDesc)
28591116Smsmith        {
286138287Smarks            /* Decrement reference count by the ref count of the parent package */
287104470Siwasaki
288151937Sjkim            for (i = 0;
289151937Sjkim                 i < ((ACPI_OPERAND_OBJECT *)
290151937Sjkim                        IndexDesc->Reference.Object)->Common.ReferenceCount;
291151937Sjkim                 i++)
292104470Siwasaki            {
293138287Smarks                AcpiUtRemoveReference (ObjDesc);
294104470Siwasaki            }
295138287Smarks        }
296151937Sjkim
297138287Smarks        *(IndexDesc->Reference.Where) = NewDesc;
298126372Snjl
299151937Sjkim        /* Increment ref count by the ref count of the parent package-1 */
300126372Snjl
301151937Sjkim        for (i = 1;
302151937Sjkim             i < ((ACPI_OPERAND_OBJECT *)
303151937Sjkim                    IndexDesc->Reference.Object)->Common.ReferenceCount;
304151937Sjkim             i++)
305138287Smarks        {
306138287Smarks            AcpiUtAddReference (NewDesc);
30767754Smsmith        }
308151937Sjkim
30971867Smsmith        break;
31067754Smsmith
31167754Smsmith
31271867Smsmith    case ACPI_TYPE_BUFFER_FIELD:
31377424Smsmith
31467754Smsmith        /*
315138287Smarks         * Store into a Buffer or String (not actually a real BufferField)
316138287Smarks         * at a location defined by an Index.
31767754Smsmith         *
31887031Smsmith         * The first 8-bit element of the source object is written to the
31987031Smsmith         * 8-bit Buffer location defined by the Index destination object,
32087031Smsmith         * according to the ACPI 2.0 specification.
32167754Smsmith         */
32267754Smsmith
32367754Smsmith        /*
324138287Smarks         * Make sure the target is a Buffer or String. An error should
325138287Smarks         * not happen here, since the ReferenceObject was constructed
326138287Smarks         * by the INDEX_OP code.
32767754Smsmith         */
32891116Smsmith        ObjDesc = IndexDesc->Reference.Object;
329193267Sjkim        if ((ObjDesc->Common.Type != ACPI_TYPE_BUFFER) &&
330193267Sjkim            (ObjDesc->Common.Type != ACPI_TYPE_STRING))
33167754Smsmith        {
33271867Smsmith            return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
33367754Smsmith        }
33467754Smsmith
33567754Smsmith        /*
33667754Smsmith         * The assignment of the individual elements will be slightly
33767754Smsmith         * different for each source type.
33867754Smsmith         */
339193267Sjkim        switch (SourceDesc->Common.Type)
34067754Smsmith        {
34171867Smsmith        case ACPI_TYPE_INTEGER:
34287031Smsmith
34387031Smsmith            /* Use the least-significant byte of the integer */
34487031Smsmith
34587031Smsmith            Value = (UINT8) (SourceDesc->Integer.Value);
34667754Smsmith            break;
34767754Smsmith
34887031Smsmith        case ACPI_TYPE_BUFFER:
349138287Smarks        case ACPI_TYPE_STRING:
35077424Smsmith
351138287Smarks            /* Note: Takes advantage of common string/buffer fields */
352138287Smarks
35387031Smsmith            Value = SourceDesc->Buffer.Pointer[0];
35467754Smsmith            break;
35567754Smsmith
35667754Smsmith        default:
35777424Smsmith
35887031Smsmith            /* All other types are invalid */
35977424Smsmith
360167802Sjkim            ACPI_ERROR ((AE_INFO,
361167802Sjkim                "Source must be Integer/Buffer/String type, not %s",
36299679Siwasaki                AcpiUtGetObjectTypeName (SourceDesc)));
36387031Smsmith            return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
36467754Smsmith        }
36587031Smsmith
36687031Smsmith        /* Store the source value into the target buffer byte */
36787031Smsmith
368193267Sjkim        ObjDesc->Buffer.Pointer[IndexDesc->Reference.Value] = Value;
36971867Smsmith        break;
37067754Smsmith
37167754Smsmith
37271867Smsmith    default:
373167802Sjkim        ACPI_ERROR ((AE_INFO,
374167802Sjkim            "Target is not a Package or BufferField"));
37571867Smsmith        Status = AE_AML_OPERAND_TYPE;
37667754Smsmith        break;
37771867Smsmith    }
37867754Smsmith
37971867Smsmith    return_ACPI_STATUS (Status);
38071867Smsmith}
38167754Smsmith
38267754Smsmith
38371867Smsmith/*******************************************************************************
38471867Smsmith *
38577424Smsmith * FUNCTION:    AcpiExStoreObjectToNode
38671867Smsmith *
38787031Smsmith * PARAMETERS:  SourceDesc              - Value to be stored
38887031Smsmith *              Node                    - Named object to receive the value
38987031Smsmith *              WalkState               - Current walk state
390128212Snjl *              ImplicitConversion      - Perform implicit conversion (yes/no)
39171867Smsmith *
39271867Smsmith * RETURN:      Status
39371867Smsmith *
39471867Smsmith * DESCRIPTION: Store the object to the named object.
39571867Smsmith *
39671867Smsmith *              The Assignment of an object to a named object is handled here
39787031Smsmith *              The value passed in will replace the current value (if any)
39871867Smsmith *              with the input value.
39971867Smsmith *
40071867Smsmith *              When storing into an object the data is converted to the
40171867Smsmith *              target object type then stored in the object.  This means
40271867Smsmith *              that the target object type (for an initialized target) will
40371867Smsmith *              not be changed by a store operation.
40471867Smsmith *
40587031Smsmith *              Assumes parameters are already validated.
40671867Smsmith *
40771867Smsmith ******************************************************************************/
40867754Smsmith
40971867SmsmithACPI_STATUS
41077424SmsmithAcpiExStoreObjectToNode (
41171867Smsmith    ACPI_OPERAND_OBJECT     *SourceDesc,
41271867Smsmith    ACPI_NAMESPACE_NODE     *Node,
413128212Snjl    ACPI_WALK_STATE         *WalkState,
414128212Snjl    UINT8                   ImplicitConversion)
41571867Smsmith{
41671867Smsmith    ACPI_STATUS             Status = AE_OK;
41771867Smsmith    ACPI_OPERAND_OBJECT     *TargetDesc;
41891116Smsmith    ACPI_OPERAND_OBJECT     *NewDesc;
41991116Smsmith    ACPI_OBJECT_TYPE        TargetType;
42067754Smsmith
42171867Smsmith
422167802Sjkim    ACPI_FUNCTION_TRACE_PTR (ExStoreObjectToNode, SourceDesc);
42371867Smsmith
42483174Smsmith
425151937Sjkim    /* Get current type of the node, and object attached to Node */
426151937Sjkim
42771867Smsmith    TargetType = AcpiNsGetType (Node);
42871867Smsmith    TargetDesc = AcpiNsGetAttachedObject (Node);
42971867Smsmith
43099146Siwasaki    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Storing %p(%s) into node %p(%s)\n",
43199679Siwasaki        SourceDesc, AcpiUtGetObjectTypeName (SourceDesc),
43291116Smsmith              Node, AcpiUtGetTypeName (TargetType)));
43371867Smsmith
43471867Smsmith    /*
43571867Smsmith     * Resolve the source object to an actual value
43677424Smsmith     * (If it is a reference object)
43771867Smsmith     */
43877424Smsmith    Status = AcpiExResolveObject (&SourceDesc, TargetType, WalkState);
43971867Smsmith    if (ACPI_FAILURE (Status))
44071867Smsmith    {
44171867Smsmith        return_ACPI_STATUS (Status);
44271867Smsmith    }
44371867Smsmith
444128212Snjl    /* If no implicit conversion, drop into the default case below */
445128212Snjl
446193267Sjkim    if ((!ImplicitConversion) ||
447193267Sjkim          ((WalkState->Opcode == AML_COPY_OP) &&
448193267Sjkim           (TargetType != ACPI_TYPE_LOCAL_REGION_FIELD) &&
449193267Sjkim           (TargetType != ACPI_TYPE_LOCAL_BANK_FIELD) &&
450193267Sjkim           (TargetType != ACPI_TYPE_LOCAL_INDEX_FIELD)))
451128212Snjl    {
452193267Sjkim        /*
453193267Sjkim         * Force execution of default (no implicit conversion). Note:
454193267Sjkim         * CopyObject does not perform an implicit conversion, as per the ACPI
455193267Sjkim         * spec -- except in case of region/bank/index fields -- because these
456193267Sjkim         * objects must retain their original type permanently.
457193267Sjkim         */
458128212Snjl        TargetType = ACPI_TYPE_ANY;
459128212Snjl    }
460128212Snjl
461151937Sjkim    /* Do the actual store operation */
462151937Sjkim
46371867Smsmith    switch (TargetType)
46471867Smsmith    {
46577424Smsmith    case ACPI_TYPE_BUFFER_FIELD:
466107325Siwasaki    case ACPI_TYPE_LOCAL_REGION_FIELD:
467107325Siwasaki    case ACPI_TYPE_LOCAL_BANK_FIELD:
468107325Siwasaki    case ACPI_TYPE_LOCAL_INDEX_FIELD:
46971867Smsmith
470151937Sjkim        /* For fields, copy the source data to the target field. */
471151937Sjkim
472151937Sjkim        Status = AcpiExWriteDataToField (SourceDesc, TargetDesc,
473151937Sjkim                    &WalkState->ResultObj);
47467754Smsmith        break;
47567754Smsmith
47667754Smsmith
47771867Smsmith    case ACPI_TYPE_INTEGER:
47871867Smsmith    case ACPI_TYPE_STRING:
47971867Smsmith    case ACPI_TYPE_BUFFER:
48067754Smsmith
48177424Smsmith        /*
48271867Smsmith         * These target types are all of type Integer/String/Buffer, and
48371867Smsmith         * therefore support implicit conversion before the store.
48477424Smsmith         *
48577424Smsmith         * Copy and/or convert the source object to a new target object
48667754Smsmith         */
487151937Sjkim        Status = AcpiExStoreObjectToObject (SourceDesc, TargetDesc,
488151937Sjkim                    &NewDesc, WalkState);
48971867Smsmith        if (ACPI_FAILURE (Status))
49067754Smsmith        {
49171867Smsmith            return_ACPI_STATUS (Status);
49267754Smsmith        }
49367754Smsmith
49491116Smsmith        if (NewDesc != TargetDesc)
49591116Smsmith        {
49691116Smsmith            /*
49791116Smsmith             * Store the new NewDesc as the new value of the Name, and set
49891116Smsmith             * the Name's type to that of the value being stored in it.
49991116Smsmith             * SourceDesc reference count is incremented by AttachObject.
500104470Siwasaki             *
501104470Siwasaki             * Note: This may change the type of the node if an explicit store
502104470Siwasaki             * has been performed such that the node/object type has been
503104470Siwasaki             * changed.
50491116Smsmith             */
505104470Siwasaki            Status = AcpiNsAttachObject (Node, NewDesc, NewDesc->Common.Type);
50685756Smsmith
50799146Siwasaki            ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
50891116Smsmith                "Store %s into %s via Convert/Attach\n",
50999679Siwasaki                AcpiUtGetObjectTypeName (SourceDesc),
51099679Siwasaki                AcpiUtGetObjectTypeName (NewDesc)));
51191116Smsmith        }
51267754Smsmith        break;
51367754Smsmith
51477424Smsmith
51567754Smsmith    default:
51667754Smsmith
51799146Siwasaki        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
518151937Sjkim            "Storing %s (%p) directly into node (%p) with no implicit conversion\n",
51999679Siwasaki            AcpiUtGetObjectTypeName (SourceDesc), SourceDesc, Node));
52084491Smsmith
52171867Smsmith        /* No conversions for all other types.  Just attach the source object */
52267754Smsmith
523151937Sjkim        Status = AcpiNsAttachObject (Node, SourceDesc,
524193267Sjkim                    SourceDesc->Common.Type);
52571867Smsmith        break;
52671867Smsmith    }
52767754Smsmith
52871867Smsmith    return_ACPI_STATUS (Status);
52971867Smsmith}
53067754Smsmith
53167754Smsmith
532