exstore.c revision 67754
167754Smsmith
267754Smsmith/******************************************************************************
367754Smsmith *
467754Smsmith * Module Name: amstore - AML Interpreter object store support
567754Smsmith *              $Revision: 116 $
667754Smsmith *
767754Smsmith *****************************************************************************/
867754Smsmith
967754Smsmith/******************************************************************************
1067754Smsmith *
1167754Smsmith * 1. Copyright Notice
1267754Smsmith *
1367754Smsmith * Some or all of this work - Copyright (c) 1999, Intel Corp.  All rights
1467754Smsmith * reserved.
1567754Smsmith *
1667754Smsmith * 2. License
1767754Smsmith *
1867754Smsmith * 2.1. This is your license from Intel Corp. under its intellectual property
1967754Smsmith * rights.  You may have additional license terms from the party that provided
2067754Smsmith * you this software, covering your right to use that party's intellectual
2167754Smsmith * property rights.
2267754Smsmith *
2367754Smsmith * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
2467754Smsmith * copy of the source code appearing in this file ("Covered Code") an
2567754Smsmith * irrevocable, perpetual, worldwide license under Intel's copyrights in the
2667754Smsmith * base code distributed originally by Intel ("Original Intel Code") to copy,
2767754Smsmith * make derivatives, distribute, use and display any portion of the Covered
2867754Smsmith * Code in any form, with the right to sublicense such rights; and
2967754Smsmith *
3067754Smsmith * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
3167754Smsmith * license (with the right to sublicense), under only those claims of Intel
3267754Smsmith * patents that are infringed by the Original Intel Code, to make, use, sell,
3367754Smsmith * offer to sell, and import the Covered Code and derivative works thereof
3467754Smsmith * solely to the minimum extent necessary to exercise the above copyright
3567754Smsmith * license, and in no event shall the patent license extend to any additions
3667754Smsmith * to or modifications of the Original Intel Code.  No other license or right
3767754Smsmith * is granted directly or by implication, estoppel or otherwise;
3867754Smsmith *
3967754Smsmith * The above copyright and patent license is granted only if the following
4067754Smsmith * conditions are met:
4167754Smsmith *
4267754Smsmith * 3. Conditions
4367754Smsmith *
4467754Smsmith * 3.1. Redistribution of Source with Rights to Further Distribute Source.
4567754Smsmith * Redistribution of source code of any substantial portion of the Covered
4667754Smsmith * Code or modification with rights to further distribute source must include
4767754Smsmith * the above Copyright Notice, the above License, this list of Conditions,
4867754Smsmith * and the following Disclaimer and Export Compliance provision.  In addition,
4967754Smsmith * Licensee must cause all Covered Code to which Licensee contributes to
5067754Smsmith * contain a file documenting the changes Licensee made to create that Covered
5167754Smsmith * Code and the date of any change.  Licensee must include in that file the
5267754Smsmith * documentation of any changes made by any predecessor Licensee.  Licensee
5367754Smsmith * must include a prominent statement that the modification is derived,
5467754Smsmith * directly or indirectly, from Original Intel Code.
5567754Smsmith *
5667754Smsmith * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
5767754Smsmith * Redistribution of source code of any substantial portion of the Covered
5867754Smsmith * Code or modification without rights to further distribute source must
5967754Smsmith * include the following Disclaimer and Export Compliance provision in the
6067754Smsmith * documentation and/or other materials provided with distribution.  In
6167754Smsmith * addition, Licensee may not authorize further sublicense of source of any
6267754Smsmith * portion of the Covered Code, and must include terms to the effect that the
6367754Smsmith * license from Licensee to its licensee is limited to the intellectual
6467754Smsmith * property embodied in the software Licensee provides to its licensee, and
6567754Smsmith * not to intellectual property embodied in modifications its licensee may
6667754Smsmith * make.
6767754Smsmith *
6867754Smsmith * 3.3. Redistribution of Executable. Redistribution in executable form of any
6967754Smsmith * substantial portion of the Covered Code or modification must reproduce the
7067754Smsmith * above Copyright Notice, and the following Disclaimer and Export Compliance
7167754Smsmith * provision in the documentation and/or other materials provided with the
7267754Smsmith * distribution.
7367754Smsmith *
7467754Smsmith * 3.4. Intel retains all right, title, and interest in and to the Original
7567754Smsmith * Intel Code.
7667754Smsmith *
7767754Smsmith * 3.5. Neither the name Intel nor any other trademark owned or controlled by
7867754Smsmith * Intel shall be used in advertising or otherwise to promote the sale, use or
7967754Smsmith * other dealings in products derived from or relating to the Covered Code
8067754Smsmith * without prior written authorization from Intel.
8167754Smsmith *
8267754Smsmith * 4. Disclaimer and Export Compliance
8367754Smsmith *
8467754Smsmith * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
8567754Smsmith * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
8667754Smsmith * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
8767754Smsmith * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
8867754Smsmith * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
8967754Smsmith * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
9067754Smsmith * PARTICULAR PURPOSE.
9167754Smsmith *
9267754Smsmith * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
9367754Smsmith * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
9467754Smsmith * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
9567754Smsmith * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
9667754Smsmith * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
9767754Smsmith * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
9867754Smsmith * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
9967754Smsmith * LIMITED REMEDY.
10067754Smsmith *
10167754Smsmith * 4.3. Licensee shall not export, either directly or indirectly, any of this
10267754Smsmith * software or system incorporating such software without first obtaining any
10367754Smsmith * required license or other approval from the U. S. Department of Commerce or
10467754Smsmith * any other agency or department of the United States Government.  In the
10567754Smsmith * event Licensee exports any such software from the United States or
10667754Smsmith * re-exports any such software from a foreign destination, Licensee shall
10767754Smsmith * ensure that the distribution and export/re-export of the software is in
10867754Smsmith * compliance with all laws, regulations, orders, or other restrictions of the
10967754Smsmith * U.S. Export Administration Regulations. Licensee agrees that neither it nor
11067754Smsmith * any of its subsidiaries will export/re-export any technical data, process,
11167754Smsmith * software, or service, directly or indirectly, to any country for which the
11267754Smsmith * United States government or any agency thereof requires an export license,
11367754Smsmith * other governmental approval, or letter of assurance, without first obtaining
11467754Smsmith * such license, approval or letter.
11567754Smsmith *
11667754Smsmith *****************************************************************************/
11767754Smsmith
11867754Smsmith#define __AMSTORE_C__
11967754Smsmith
12067754Smsmith#include "acpi.h"
12167754Smsmith#include "acparser.h"
12267754Smsmith#include "acdispat.h"
12367754Smsmith#include "acinterp.h"
12467754Smsmith#include "amlcode.h"
12567754Smsmith#include "acnamesp.h"
12667754Smsmith#include "actables.h"
12767754Smsmith
12867754Smsmith
12967754Smsmith#define _COMPONENT          INTERPRETER
13067754Smsmith        MODULE_NAME         ("amstore")
13167754Smsmith
13267754Smsmith
13367754Smsmith/*******************************************************************************
13467754Smsmith *
13567754Smsmith * FUNCTION:    AcpiAmlExecStore
13667754Smsmith *
13767754Smsmith * PARAMETERS:  *ValDesc            - Value to be stored
13867754Smsmith *              *DestDesc           - Where to store it 0 Must be (ACPI_HANDLE)
13967754Smsmith *                                    or an ACPI_OPERAND_OBJECT  of type
14067754Smsmith *                                    Reference; if the latter the descriptor
14167754Smsmith *                                    will be either reused or deleted.
14267754Smsmith *
14367754Smsmith * RETURN:      Status
14467754Smsmith *
14567754Smsmith * DESCRIPTION: Store the value described by ValDesc into the location
14667754Smsmith *              described by DestDesc.  Called by various interpreter
14767754Smsmith *              functions to store the result of an operation into
14867754Smsmith *              the destination operand.
14967754Smsmith *
15067754Smsmith ******************************************************************************/
15167754Smsmith
15267754SmsmithACPI_STATUS
15367754SmsmithAcpiAmlExecStore (
15467754Smsmith    ACPI_OPERAND_OBJECT     *ValDesc,
15567754Smsmith    ACPI_OPERAND_OBJECT     *DestDesc,
15667754Smsmith    ACPI_WALK_STATE         *WalkState)
15767754Smsmith{
15867754Smsmith    ACPI_STATUS             Status = AE_OK;
15967754Smsmith    ACPI_OPERAND_OBJECT     *DeleteDestDesc = NULL;
16067754Smsmith    ACPI_OPERAND_OBJECT     *TmpDesc;
16167754Smsmith    ACPI_NAMESPACE_NODE     *Node = NULL;
16267754Smsmith    UINT8                   Value = 0;
16367754Smsmith    UINT32                  Length;
16467754Smsmith    UINT32                  i;
16567754Smsmith
16667754Smsmith
16767754Smsmith    FUNCTION_TRACE ("AmlExecStore");
16867754Smsmith
16967754Smsmith    DEBUG_PRINT (ACPI_INFO, ("entered AcpiAmlExecStore: Val=%p, Dest=%p\n",
17067754Smsmith                    ValDesc, DestDesc));
17167754Smsmith
17267754Smsmith
17367754Smsmith    /* Validate parameters */
17467754Smsmith
17567754Smsmith    if (!ValDesc || !DestDesc)
17667754Smsmith    {
17767754Smsmith        DEBUG_PRINT (ACPI_ERROR,
17867754Smsmith            ("AmlExecStore: Internal error - null pointer\n"));
17967754Smsmith        return_ACPI_STATUS (AE_AML_NO_OPERAND);
18067754Smsmith    }
18167754Smsmith
18267754Smsmith    /* Examine the datatype of the DestDesc */
18367754Smsmith
18467754Smsmith    if (VALID_DESCRIPTOR_TYPE (DestDesc, ACPI_DESC_TYPE_NAMED))
18567754Smsmith    {
18667754Smsmith        /* Dest is an ACPI_HANDLE, create a new object */
18767754Smsmith
18867754Smsmith        Node = (ACPI_NAMESPACE_NODE *) DestDesc;
18967754Smsmith        DestDesc = AcpiCmCreateInternalObject (INTERNAL_TYPE_REFERENCE);
19067754Smsmith        if (!DestDesc)
19167754Smsmith        {
19267754Smsmith            /* Allocation failure  */
19367754Smsmith
19467754Smsmith            return_ACPI_STATUS (AE_NO_MEMORY);
19567754Smsmith        }
19667754Smsmith
19767754Smsmith        /* Build a new Reference wrapper around the handle */
19867754Smsmith
19967754Smsmith        DestDesc->Reference.OpCode = AML_NAME_OP;
20067754Smsmith        DestDesc->Reference.Object = Node;
20167754Smsmith    }
20267754Smsmith
20367754Smsmith    else
20467754Smsmith    {
20567754Smsmith        DEBUG_PRINT (ACPI_INFO,
20667754Smsmith            ("AmlExecStore: Dest is object (not handle) - may be deleted!\n"));
20767754Smsmith    }
20867754Smsmith
20967754Smsmith    /* Destination object must be of type Reference */
21067754Smsmith
21167754Smsmith    if (DestDesc->Common.Type != INTERNAL_TYPE_REFERENCE)
21267754Smsmith    {
21367754Smsmith        /* Destination is not an Reference */
21467754Smsmith
21567754Smsmith        DEBUG_PRINT (ACPI_ERROR,
21667754Smsmith            ("AmlExecStore: Destination is not an Reference [%p]\n", DestDesc));
21767754Smsmith
21867754Smsmith        DUMP_STACK_ENTRY (ValDesc);
21967754Smsmith        DUMP_STACK_ENTRY (DestDesc);
22067754Smsmith        DUMP_OPERANDS (&DestDesc, IMODE_EXECUTE, "AmlExecStore",
22167754Smsmith                        2, "target not Reference");
22267754Smsmith
22367754Smsmith        return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
22467754Smsmith    }
22567754Smsmith
22667754Smsmith    /* Examine the Reference opcode */
22767754Smsmith
22867754Smsmith    switch (DestDesc->Reference.OpCode)
22967754Smsmith    {
23067754Smsmith
23167754Smsmith    case AML_NAME_OP:
23267754Smsmith
23367754Smsmith        /*
23467754Smsmith         *  Storing into a Name
23567754Smsmith         */
23667754Smsmith        DeleteDestDesc = DestDesc;
23767754Smsmith        Status = AcpiAmlStoreObjectToNode (ValDesc, DestDesc->Reference.Object,
23867754Smsmith                        WalkState);
23967754Smsmith
24067754Smsmith        break;  /* Case NameOp */
24167754Smsmith
24267754Smsmith
24367754Smsmith    case AML_INDEX_OP:
24467754Smsmith
24567754Smsmith        DeleteDestDesc = DestDesc;
24667754Smsmith
24767754Smsmith        /*
24867754Smsmith         * Valid source value and destination reference pointer.
24967754Smsmith         *
25067754Smsmith         * ACPI Specification 1.0B section 15.2.3.4.2.13:
25167754Smsmith         * Destination should point to either a buffer or a package
25267754Smsmith         */
25367754Smsmith
25467754Smsmith        /*
25567754Smsmith         * Actually, storing to a package is not so simple.  The source must be
25667754Smsmith         * evaluated and converted to the type of the destination and then the
25767754Smsmith         * source is copied into the destination - we can't just point to the
25867754Smsmith         * source object.
25967754Smsmith         */
26067754Smsmith        if (DestDesc->Reference.TargetType == ACPI_TYPE_PACKAGE)
26167754Smsmith        {
26267754Smsmith            /*
26367754Smsmith             * The object at *(DestDesc->Reference.Where) is the
26467754Smsmith             *  element within the package that is to be modified.
26567754Smsmith             */
26667754Smsmith            TmpDesc = *(DestDesc->Reference.Where);
26767754Smsmith            if (TmpDesc)
26867754Smsmith            {
26967754Smsmith                /*
27067754Smsmith                 * If the Destination element is a package, we will delete
27167754Smsmith                 *  that object and construct a new one.
27267754Smsmith                 *
27367754Smsmith                 * TBD: [Investigate] Should both the src and dest be required
27467754Smsmith                 *      to be packages?
27567754Smsmith                 *       && (ValDesc->Common.Type == ACPI_TYPE_PACKAGE)
27667754Smsmith                 */
27767754Smsmith                if (TmpDesc->Common.Type == ACPI_TYPE_PACKAGE)
27867754Smsmith                {
27967754Smsmith                    /*
28067754Smsmith                     * Take away the reference for being part of a package and
28167754Smsmith                     * delete
28267754Smsmith                     */
28367754Smsmith                    AcpiCmRemoveReference (TmpDesc);
28467754Smsmith                    AcpiCmRemoveReference (TmpDesc);
28567754Smsmith
28667754Smsmith                    TmpDesc = NULL;
28767754Smsmith                }
28867754Smsmith            }
28967754Smsmith
29067754Smsmith            if (!TmpDesc)
29167754Smsmith            {
29267754Smsmith                /*
29367754Smsmith                 * If the TmpDesc is NULL, that means an uninitialized package
29467754Smsmith                 * has been used as a destination, therefore, we must create
29567754Smsmith                 * the destination element to match the type of the source
29667754Smsmith                 * element NOTE: ValDesc can be of any type.
29767754Smsmith                 */
29867754Smsmith                TmpDesc = AcpiCmCreateInternalObject (ValDesc->Common.Type);
29967754Smsmith                if (!TmpDesc)
30067754Smsmith                {
30167754Smsmith                    Status = AE_NO_MEMORY;
30267754Smsmith                    goto Cleanup;
30367754Smsmith                }
30467754Smsmith
30567754Smsmith                /*
30667754Smsmith                 * If the source is a package, copy the source to the new dest
30767754Smsmith                 */
30867754Smsmith                if (ACPI_TYPE_PACKAGE == TmpDesc->Common.Type)
30967754Smsmith                {
31067754Smsmith                    Status = AcpiAmlBuildCopyInternalPackageObject (
31167754Smsmith                                ValDesc, TmpDesc, WalkState);
31267754Smsmith                    if (ACPI_FAILURE (Status))
31367754Smsmith                    {
31467754Smsmith                        AcpiCmRemoveReference (TmpDesc);
31567754Smsmith                        TmpDesc = NULL;
31667754Smsmith                        goto Cleanup;
31767754Smsmith                    }
31867754Smsmith                }
31967754Smsmith
32067754Smsmith                /*
32167754Smsmith                 * Install the new descriptor into the package and add a
32267754Smsmith                 * reference to the newly created descriptor for now being
32367754Smsmith                 * part of the parent package
32467754Smsmith                 */
32567754Smsmith
32667754Smsmith                *(DestDesc->Reference.Where) = TmpDesc;
32767754Smsmith                AcpiCmAddReference (TmpDesc);
32867754Smsmith            }
32967754Smsmith
33067754Smsmith            if (ACPI_TYPE_PACKAGE != TmpDesc->Common.Type)
33167754Smsmith            {
33267754Smsmith                /*
33367754Smsmith                 * The destination element is not a package, so we need to
33467754Smsmith                 * convert the contents of the source (ValDesc) and copy into
33567754Smsmith                 * the destination (TmpDesc)
33667754Smsmith                 */
33767754Smsmith                Status = AcpiAmlStoreObjectToObject (ValDesc, TmpDesc,
33867754Smsmith                                                        WalkState);
33967754Smsmith                if (ACPI_FAILURE (Status))
34067754Smsmith                {
34167754Smsmith                    /*
34267754Smsmith                     * An error occurrered when copying the internal object
34367754Smsmith                     * so delete the reference.
34467754Smsmith                     */
34567754Smsmith                    DEBUG_PRINT (ACPI_ERROR,
34667754Smsmith                        ("AmlExecStore/Index: Unable to copy the internal object\n"));
34767754Smsmith                    Status = AE_AML_OPERAND_TYPE;
34867754Smsmith                }
34967754Smsmith            }
35067754Smsmith
35167754Smsmith            break;
35267754Smsmith        }
35367754Smsmith
35467754Smsmith        /*
35567754Smsmith         * Check that the destination is a Buffer Field type
35667754Smsmith         */
35767754Smsmith        if (DestDesc->Reference.TargetType != ACPI_TYPE_BUFFER_FIELD)
35867754Smsmith        {
35967754Smsmith            Status = AE_AML_OPERAND_TYPE;
36067754Smsmith            break;
36167754Smsmith        }
36267754Smsmith
36367754Smsmith        /*
36467754Smsmith         * Storing into a buffer at a location defined by an Index.
36567754Smsmith         *
36667754Smsmith         * Each 8-bit element of the source object is written to the
36767754Smsmith         * 8-bit Buffer Field of the Index destination object.
36867754Smsmith         */
36967754Smsmith
37067754Smsmith        /*
37167754Smsmith         * Set the TmpDesc to the destination object and type check.
37267754Smsmith         */
37367754Smsmith        TmpDesc = DestDesc->Reference.Object;
37467754Smsmith
37567754Smsmith        if (TmpDesc->Common.Type != ACPI_TYPE_BUFFER)
37667754Smsmith        {
37767754Smsmith            Status = AE_AML_OPERAND_TYPE;
37867754Smsmith            break;
37967754Smsmith        }
38067754Smsmith
38167754Smsmith        /*
38267754Smsmith         * The assignment of the individual elements will be slightly
38367754Smsmith         * different for each source type.
38467754Smsmith         */
38567754Smsmith
38667754Smsmith        switch (ValDesc->Common.Type)
38767754Smsmith        {
38867754Smsmith        /*
38967754Smsmith         * If the type is Integer, the Length is 4.
39067754Smsmith         * This loop to assign each of the elements is somewhat
39167754Smsmith         *  backward because of the Big Endian-ness of IA-64
39267754Smsmith         */
39367754Smsmith        case ACPI_TYPE_NUMBER:
39467754Smsmith            Length = 4;
39567754Smsmith            for (i = Length; i != 0; i--)
39667754Smsmith            {
39767754Smsmith                Value = (UINT8)(ValDesc->Number.Value >> (MUL_8 (i - 1)));
39867754Smsmith                TmpDesc->Buffer.Pointer[DestDesc->Reference.Offset] = Value;
39967754Smsmith            }
40067754Smsmith            break;
40167754Smsmith
40267754Smsmith        /*
40367754Smsmith         * If the type is Buffer, the Length is in the structure.
40467754Smsmith         * Just loop through the elements and assign each one in turn.
40567754Smsmith         */
40667754Smsmith        case ACPI_TYPE_BUFFER:
40767754Smsmith            Length = ValDesc->Buffer.Length;
40867754Smsmith            for (i = 0; i < Length; i++)
40967754Smsmith            {
41067754Smsmith                Value = *(ValDesc->Buffer.Pointer + i);
41167754Smsmith                TmpDesc->Buffer.Pointer[DestDesc->Reference.Offset] = Value;
41267754Smsmith            }
41367754Smsmith            break;
41467754Smsmith
41567754Smsmith        /*
41667754Smsmith         * If the type is String, the Length is in the structure.
41767754Smsmith         * Just loop through the elements and assign each one in turn.
41867754Smsmith         */
41967754Smsmith        case ACPI_TYPE_STRING:
42067754Smsmith            Length = ValDesc->String.Length;
42167754Smsmith            for (i = 0; i < Length; i++)
42267754Smsmith            {
42367754Smsmith                Value = *(ValDesc->String.Pointer + i);
42467754Smsmith                TmpDesc->Buffer.Pointer[DestDesc->Reference.Offset] = Value;
42567754Smsmith            }
42667754Smsmith            break;
42767754Smsmith
42867754Smsmith        /*
42967754Smsmith         * If source is not a valid type so return an error.
43067754Smsmith         */
43167754Smsmith        default:
43267754Smsmith            DEBUG_PRINT (ACPI_ERROR,
43367754Smsmith                ("AmlExecStore/Index: Source must be Number/Buffer/String type, not 0x%x\n",
43467754Smsmith                ValDesc->Common.Type));
43567754Smsmith            Status = AE_AML_OPERAND_TYPE;
43667754Smsmith            break;
43767754Smsmith        }
43867754Smsmith
43967754Smsmith        /*
44067754Smsmith         * If we had an error, break out of this case statement.
44167754Smsmith         */
44267754Smsmith        if (ACPI_FAILURE (Status))
44367754Smsmith        {
44467754Smsmith            break;
44567754Smsmith        }
44667754Smsmith
44767754Smsmith        /*
44867754Smsmith         * Set the return pointer
44967754Smsmith         */
45067754Smsmith        DestDesc = TmpDesc;
45167754Smsmith
45267754Smsmith        break;
45367754Smsmith
45467754Smsmith    case AML_ZERO_OP:
45567754Smsmith    case AML_ONE_OP:
45667754Smsmith    case AML_ONES_OP:
45767754Smsmith
45867754Smsmith        /*
45967754Smsmith         * Storing to a constant is a no-op -- see ACPI Specification
46067754Smsmith         * Delete the result descriptor.
46167754Smsmith         */
46267754Smsmith
46367754Smsmith        DeleteDestDesc = DestDesc;
46467754Smsmith        break;
46567754Smsmith
46667754Smsmith
46767754Smsmith    case AML_LOCAL_OP:
46867754Smsmith
46967754Smsmith        Status = AcpiDsMethodDataSetValue (MTH_TYPE_LOCAL,
47067754Smsmith                        (DestDesc->Reference.Offset), ValDesc, WalkState);
47167754Smsmith        DeleteDestDesc = DestDesc;
47267754Smsmith        break;
47367754Smsmith
47467754Smsmith
47567754Smsmith    case AML_ARG_OP:
47667754Smsmith
47767754Smsmith        Status = AcpiDsMethodDataSetValue (MTH_TYPE_ARG,
47867754Smsmith                        (DestDesc->Reference.Offset), ValDesc, WalkState);
47967754Smsmith        DeleteDestDesc = DestDesc;
48067754Smsmith        break;
48167754Smsmith
48267754Smsmith
48367754Smsmith    case AML_DEBUG_OP:
48467754Smsmith
48567754Smsmith        /*
48667754Smsmith         * Storing to the Debug object causes the value stored to be
48767754Smsmith         * displayed and otherwise has no effect -- see ACPI Specification
48867754Smsmith         */
48967754Smsmith        DEBUG_PRINT (ACPI_INFO, ("**** Write to Debug Object: ****: \n"));
49067754Smsmith        if (ValDesc->Common.Type == ACPI_TYPE_STRING)
49167754Smsmith        {
49267754Smsmith            DEBUG_PRINT (ACPI_INFO, ("%s\n", ValDesc->String.Pointer));
49367754Smsmith        }
49467754Smsmith        else
49567754Smsmith        {
49667754Smsmith            DUMP_STACK_ENTRY (ValDesc);
49767754Smsmith        }
49867754Smsmith
49967754Smsmith        DeleteDestDesc = DestDesc;
50067754Smsmith        break;
50167754Smsmith
50267754Smsmith
50367754Smsmith    default:
50467754Smsmith
50567754Smsmith        DEBUG_PRINT (ACPI_ERROR,
50667754Smsmith            ("AmlExecStore: Internal error - Unknown Reference subtype %02x\n",
50767754Smsmith            DestDesc->Reference.OpCode));
50867754Smsmith
50967754Smsmith        /* TBD: [Restructure] use object dump routine !! */
51067754Smsmith
51167754Smsmith        DUMP_BUFFER (DestDesc, sizeof (ACPI_OPERAND_OBJECT));
51267754Smsmith
51367754Smsmith        DeleteDestDesc = DestDesc;
51467754Smsmith        Status = AE_AML_INTERNAL;
51567754Smsmith
51667754Smsmith    }   /* switch(DestDesc->Reference.OpCode) */
51767754Smsmith
51867754Smsmith
51967754SmsmithCleanup:
52067754Smsmith
52167754Smsmith    /* Cleanup and exit*/
52267754Smsmith
52367754Smsmith    if (DeleteDestDesc)
52467754Smsmith    {
52567754Smsmith        AcpiCmRemoveReference (DeleteDestDesc);
52667754Smsmith    }
52767754Smsmith
52867754Smsmith    return_ACPI_STATUS (Status);
52967754Smsmith}
53067754Smsmith
53167754Smsmith
532