~ubuntu-branches/ubuntu/karmic/linux-ports/karmic

« back to all changes in this revision

Viewing changes to drivers/acpi/acpica/exstorob.c

  • Committer: Bazaar Package Importer
  • Author(s): Luke Yelavich, Luke Yelavich, Michael Casadevall, Tim Gardner, Upstream Kernel Changes
  • Date: 2009-05-06 18:18:55 UTC
  • Revision ID: james.westby@ubuntu.com-20090506181855-t00baeevpnvd9o7a
Tags: 2.6.30-1.1
[ Luke Yelavich ]
* initial release for karmic
* SAUCE: rebase-ports - adjust for the karmic ports kernel
* SAUCE: rebase-ports - also remove abi dirs/files on rebase
* Update configs after rebase against mainline Jaunty tree
* [Config] Disable CONFIG_BLK_DEV_UB and CONFIG_USB_LIBUSUAL as per
  mainline jaunty
* forward-port patch to drbd for powerpc compilation
* [Config] disable CONFIG_LENOVO_SL_LAPTOP for i386 due to FTBFS
* add .o files found in arch/powerpc/lib to all powerpc kernel header
  packages
* [Config] enable CONFIG_DRM_I915_KMS for i386 as per karmic mainline

[ Michael Casadevall ]

* Disable kgdb on sparc64
* [sparc] [Config] Disable GPIO LEDS
* [ia64] Rename -ia64-generic to -ia64 in line with other architectures
* Correct kernel image path for sparc builds
* [hppa] Fix HPPA config files to build modules for all udebian

Rebase on top of karmic mainline 2.6.30-1.1

[ Tim Gardner ]

* [Config] armel: disable staging drivers, fixes FTBS
* [Config] armel imx51: Disable CONFIG_MTD_NAND_MXC, fixes FTBS

[ Upstream Kernel Changes ]

* mpt2sas: Change reset_type enum to avoid namespace collision.
  Submitted upstream.

* Initial release after rebasing against v2.6.30-rc3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
/******************************************************************************
 
3
 *
 
4
 * Module Name: exstorob - AML Interpreter object store support, store to object
 
5
 *
 
6
 *****************************************************************************/
 
7
 
 
8
/*
 
9
 * Copyright (C) 2000 - 2008, Intel Corp.
 
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 "accommon.h"
 
47
#include "acinterp.h"
 
48
 
 
49
#define _COMPONENT          ACPI_EXECUTER
 
50
ACPI_MODULE_NAME("exstorob")
 
51
 
 
52
/*******************************************************************************
 
53
 *
 
54
 * FUNCTION:    acpi_ex_store_buffer_to_buffer
 
55
 *
 
56
 * PARAMETERS:  source_desc         - Source object to copy
 
57
 *              target_desc         - Destination object of the copy
 
58
 *
 
59
 * RETURN:      Status
 
60
 *
 
61
 * DESCRIPTION: Copy a buffer object to another buffer object.
 
62
 *
 
63
 ******************************************************************************/
 
64
acpi_status
 
65
acpi_ex_store_buffer_to_buffer(union acpi_operand_object *source_desc,
 
66
                               union acpi_operand_object *target_desc)
 
67
{
 
68
        u32 length;
 
69
        u8 *buffer;
 
70
 
 
71
        ACPI_FUNCTION_TRACE_PTR(ex_store_buffer_to_buffer, source_desc);
 
72
 
 
73
        /* We know that source_desc is a buffer by now */
 
74
 
 
75
        buffer = ACPI_CAST_PTR(u8, source_desc->buffer.pointer);
 
76
        length = source_desc->buffer.length;
 
77
 
 
78
        /*
 
79
         * If target is a buffer of length zero or is a static buffer,
 
80
         * allocate a new buffer of the proper length
 
81
         */
 
82
        if ((target_desc->buffer.length == 0) ||
 
83
            (target_desc->common.flags & AOPOBJ_STATIC_POINTER)) {
 
84
                target_desc->buffer.pointer = ACPI_ALLOCATE(length);
 
85
                if (!target_desc->buffer.pointer) {
 
86
                        return_ACPI_STATUS(AE_NO_MEMORY);
 
87
                }
 
88
 
 
89
                target_desc->buffer.length = length;
 
90
        }
 
91
 
 
92
        /* Copy source buffer to target buffer */
 
93
 
 
94
        if (length <= target_desc->buffer.length) {
 
95
 
 
96
                /* Clear existing buffer and copy in the new one */
 
97
 
 
98
                ACPI_MEMSET(target_desc->buffer.pointer, 0,
 
99
                            target_desc->buffer.length);
 
100
                ACPI_MEMCPY(target_desc->buffer.pointer, buffer, length);
 
101
 
 
102
#ifdef ACPI_OBSOLETE_BEHAVIOR
 
103
                /*
 
104
                 * NOTE: ACPI versions up to 3.0 specified that the buffer must be
 
105
                 * truncated if the string is smaller than the buffer.  However, "other"
 
106
                 * implementations of ACPI never did this and thus became the defacto
 
107
                 * standard. ACPI 3.0_a changes this behavior such that the buffer
 
108
                 * is no longer truncated.
 
109
                 */
 
110
 
 
111
                /*
 
112
                 * OBSOLETE BEHAVIOR:
 
113
                 * If the original source was a string, we must truncate the buffer,
 
114
                 * according to the ACPI spec.  Integer-to-Buffer and Buffer-to-Buffer
 
115
                 * copy must not truncate the original buffer.
 
116
                 */
 
117
                if (original_src_type == ACPI_TYPE_STRING) {
 
118
 
 
119
                        /* Set the new length of the target */
 
120
 
 
121
                        target_desc->buffer.length = length;
 
122
                }
 
123
#endif
 
124
        } else {
 
125
                /* Truncate the source, copy only what will fit */
 
126
 
 
127
                ACPI_MEMCPY(target_desc->buffer.pointer, buffer,
 
128
                            target_desc->buffer.length);
 
129
 
 
130
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 
131
                                  "Truncating source buffer from %X to %X\n",
 
132
                                  length, target_desc->buffer.length));
 
133
        }
 
134
 
 
135
        /* Copy flags */
 
136
 
 
137
        target_desc->buffer.flags = source_desc->buffer.flags;
 
138
        target_desc->common.flags &= ~AOPOBJ_STATIC_POINTER;
 
139
        return_ACPI_STATUS(AE_OK);
 
140
}
 
141
 
 
142
/*******************************************************************************
 
143
 *
 
144
 * FUNCTION:    acpi_ex_store_string_to_string
 
145
 *
 
146
 * PARAMETERS:  source_desc         - Source object to copy
 
147
 *              target_desc         - Destination object of the copy
 
148
 *
 
149
 * RETURN:      Status
 
150
 *
 
151
 * DESCRIPTION: Copy a String object to another String object
 
152
 *
 
153
 ******************************************************************************/
 
154
 
 
155
acpi_status
 
156
acpi_ex_store_string_to_string(union acpi_operand_object *source_desc,
 
157
                               union acpi_operand_object *target_desc)
 
158
{
 
159
        u32 length;
 
160
        u8 *buffer;
 
161
 
 
162
        ACPI_FUNCTION_TRACE_PTR(ex_store_string_to_string, source_desc);
 
163
 
 
164
        /* We know that source_desc is a string by now */
 
165
 
 
166
        buffer = ACPI_CAST_PTR(u8, source_desc->string.pointer);
 
167
        length = source_desc->string.length;
 
168
 
 
169
        /*
 
170
         * Replace existing string value if it will fit and the string
 
171
         * pointer is not a static pointer (part of an ACPI table)
 
172
         */
 
173
        if ((length < target_desc->string.length) &&
 
174
            (!(target_desc->common.flags & AOPOBJ_STATIC_POINTER))) {
 
175
                /*
 
176
                 * String will fit in existing non-static buffer.
 
177
                 * Clear old string and copy in the new one
 
178
                 */
 
179
                ACPI_MEMSET(target_desc->string.pointer, 0,
 
180
                            (acpi_size) target_desc->string.length + 1);
 
181
                ACPI_MEMCPY(target_desc->string.pointer, buffer, length);
 
182
        } else {
 
183
                /*
 
184
                 * Free the current buffer, then allocate a new buffer
 
185
                 * large enough to hold the value
 
186
                 */
 
187
                if (target_desc->string.pointer &&
 
188
                    (!(target_desc->common.flags & AOPOBJ_STATIC_POINTER))) {
 
189
 
 
190
                        /* Only free if not a pointer into the DSDT */
 
191
 
 
192
                        ACPI_FREE(target_desc->string.pointer);
 
193
                }
 
194
 
 
195
                target_desc->string.pointer = ACPI_ALLOCATE_ZEROED((acpi_size)
 
196
                                                                   length + 1);
 
197
                if (!target_desc->string.pointer) {
 
198
                        return_ACPI_STATUS(AE_NO_MEMORY);
 
199
                }
 
200
 
 
201
                target_desc->common.flags &= ~AOPOBJ_STATIC_POINTER;
 
202
                ACPI_MEMCPY(target_desc->string.pointer, buffer, length);
 
203
        }
 
204
 
 
205
        /* Set the new target length */
 
206
 
 
207
        target_desc->string.length = length;
 
208
        return_ACPI_STATUS(AE_OK);
 
209
}