OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [acpi/] [executer/] [exstorob.c] - Blame information for rev 67

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
 
2
/******************************************************************************
3
 *
4
 * Module Name: exstorob - AML Interpreter object store support, store to object
5
 *
6
 *****************************************************************************/
7
 
8
/*
9
 * Copyright (C) 2000 - 2007, R. Byron Moore
10
 * All rights reserved.
11
 *
12
 * Redistribution and use in source and binary forms, with or without
13
 * modification, are permitted provided that the following conditions
14
 * are met:
15
 * 1. Redistributions of source code must retain the above copyright
16
 *    notice, this list of conditions, and the following disclaimer,
17
 *    without modification.
18
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19
 *    substantially similar to the "NO WARRANTY" disclaimer below
20
 *    ("Disclaimer") and any redistribution must be conditioned upon
21
 *    including a substantially similar Disclaimer requirement for further
22
 *    binary redistribution.
23
 * 3. Neither the names of the above-listed copyright holders nor the names
24
 *    of any contributors may be used to endorse or promote products derived
25
 *    from this software without specific prior written permission.
26
 *
27
 * Alternatively, this software may be distributed under the terms of the
28
 * GNU General Public License ("GPL") version 2 as published by the Free
29
 * Software Foundation.
30
 *
31
 * NO WARRANTY
32
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42
 * POSSIBILITY OF SUCH DAMAGES.
43
 */
44
 
45
#include <acpi/acpi.h>
46
#include <acpi/acinterp.h>
47
 
48
#define _COMPONENT          ACPI_EXECUTER
49
ACPI_MODULE_NAME("exstorob")
50
 
51
/*******************************************************************************
52
 *
53
 * FUNCTION:    acpi_ex_store_buffer_to_buffer
54
 *
55
 * PARAMETERS:  source_desc         - Source object to copy
56
 *              target_desc         - Destination object of the copy
57
 *
58
 * RETURN:      Status
59
 *
60
 * DESCRIPTION: Copy a buffer object to another buffer object.
61
 *
62
 ******************************************************************************/
63
acpi_status
64
acpi_ex_store_buffer_to_buffer(union acpi_operand_object *source_desc,
65
                               union acpi_operand_object *target_desc)
66
{
67
        u32 length;
68
        u8 *buffer;
69
 
70
        ACPI_FUNCTION_TRACE_PTR(ex_store_buffer_to_buffer, source_desc);
71
 
72
        /* We know that source_desc is a buffer by now */
73
 
74
        buffer = ACPI_CAST_PTR(u8, source_desc->buffer.pointer);
75
        length = source_desc->buffer.length;
76
 
77
        /*
78
         * If target is a buffer of length zero or is a static buffer,
79
         * allocate a new buffer of the proper length
80
         */
81
        if ((target_desc->buffer.length == 0) ||
82
            (target_desc->common.flags & AOPOBJ_STATIC_POINTER)) {
83
                target_desc->buffer.pointer = ACPI_ALLOCATE(length);
84
                if (!target_desc->buffer.pointer) {
85
                        return_ACPI_STATUS(AE_NO_MEMORY);
86
                }
87
 
88
                target_desc->buffer.length = length;
89
        }
90
 
91
        /* Copy source buffer to target buffer */
92
 
93
        if (length <= target_desc->buffer.length) {
94
 
95
                /* Clear existing buffer and copy in the new one */
96
 
97
                ACPI_MEMSET(target_desc->buffer.pointer, 0,
98
                            target_desc->buffer.length);
99
                ACPI_MEMCPY(target_desc->buffer.pointer, buffer, length);
100
 
101
#ifdef ACPI_OBSOLETE_BEHAVIOR
102
                /*
103
                 * NOTE: ACPI versions up to 3.0 specified that the buffer must be
104
                 * truncated if the string is smaller than the buffer.  However, "other"
105
                 * implementations of ACPI never did this and thus became the defacto
106
                 * standard. ACPI 3.0_a changes this behavior such that the buffer
107
                 * is no longer truncated.
108
                 */
109
 
110
                /*
111
                 * OBSOLETE BEHAVIOR:
112
                 * If the original source was a string, we must truncate the buffer,
113
                 * according to the ACPI spec.  Integer-to-Buffer and Buffer-to-Buffer
114
                 * copy must not truncate the original buffer.
115
                 */
116
                if (original_src_type == ACPI_TYPE_STRING) {
117
 
118
                        /* Set the new length of the target */
119
 
120
                        target_desc->buffer.length = length;
121
                }
122
#endif
123
        } else {
124
                /* Truncate the source, copy only what will fit */
125
 
126
                ACPI_MEMCPY(target_desc->buffer.pointer, buffer,
127
                            target_desc->buffer.length);
128
 
129
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
130
                                  "Truncating source buffer from %X to %X\n",
131
                                  length, target_desc->buffer.length));
132
        }
133
 
134
        /* Copy flags */
135
 
136
        target_desc->buffer.flags = source_desc->buffer.flags;
137
        target_desc->common.flags &= ~AOPOBJ_STATIC_POINTER;
138
        return_ACPI_STATUS(AE_OK);
139
}
140
 
141
/*******************************************************************************
142
 *
143
 * FUNCTION:    acpi_ex_store_string_to_string
144
 *
145
 * PARAMETERS:  source_desc         - Source object to copy
146
 *              target_desc         - Destination object of the copy
147
 *
148
 * RETURN:      Status
149
 *
150
 * DESCRIPTION: Copy a String object to another String object
151
 *
152
 ******************************************************************************/
153
 
154
acpi_status
155
acpi_ex_store_string_to_string(union acpi_operand_object *source_desc,
156
                               union acpi_operand_object *target_desc)
157
{
158
        u32 length;
159
        u8 *buffer;
160
 
161
        ACPI_FUNCTION_TRACE_PTR(ex_store_string_to_string, source_desc);
162
 
163
        /* We know that source_desc is a string by now */
164
 
165
        buffer = ACPI_CAST_PTR(u8, source_desc->string.pointer);
166
        length = source_desc->string.length;
167
 
168
        /*
169
         * Replace existing string value if it will fit and the string
170
         * pointer is not a static pointer (part of an ACPI table)
171
         */
172
        if ((length < target_desc->string.length) &&
173
            (!(target_desc->common.flags & AOPOBJ_STATIC_POINTER))) {
174
                /*
175
                 * String will fit in existing non-static buffer.
176
                 * Clear old string and copy in the new one
177
                 */
178
                ACPI_MEMSET(target_desc->string.pointer, 0,
179
                            (acpi_size) target_desc->string.length + 1);
180
                ACPI_MEMCPY(target_desc->string.pointer, buffer, length);
181
        } else {
182
                /*
183
                 * Free the current buffer, then allocate a new buffer
184
                 * large enough to hold the value
185
                 */
186
                if (target_desc->string.pointer &&
187
                    (!(target_desc->common.flags & AOPOBJ_STATIC_POINTER))) {
188
 
189
                        /* Only free if not a pointer into the DSDT */
190
 
191
                        ACPI_FREE(target_desc->string.pointer);
192
                }
193
 
194
                target_desc->string.pointer = ACPI_ALLOCATE_ZEROED((acpi_size)
195
                                                                   length + 1);
196
                if (!target_desc->string.pointer) {
197
                        return_ACPI_STATUS(AE_NO_MEMORY);
198
                }
199
 
200
                target_desc->common.flags &= ~AOPOBJ_STATIC_POINTER;
201
                ACPI_MEMCPY(target_desc->string.pointer, buffer, length);
202
        }
203
 
204
        /* Set the new target length */
205
 
206
        target_desc->string.length = length;
207
        return_ACPI_STATUS(AE_OK);
208
}

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.