Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
acpi
acpica
nsparse.c
Go to the documentation of this file.
1
/******************************************************************************
2
*
3
* Module Name: nsparse - namespace interface to AML parser
4
*
5
*****************************************************************************/
6
7
/*
8
* Copyright (C) 2000 - 2012, Intel Corp.
9
* All rights reserved.
10
*
11
* Redistribution and use in source and binary forms, with or without
12
* modification, are permitted provided that the following conditions
13
* are met:
14
* 1. Redistributions of source code must retain the above copyright
15
* notice, this list of conditions, and the following disclaimer,
16
* without modification.
17
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
18
* substantially similar to the "NO WARRANTY" disclaimer below
19
* ("Disclaimer") and any redistribution must be conditioned upon
20
* including a substantially similar Disclaimer requirement for further
21
* binary redistribution.
22
* 3. Neither the names of the above-listed copyright holders nor the names
23
* of any contributors may be used to endorse or promote products derived
24
* from this software without specific prior written permission.
25
*
26
* Alternatively, this software may be distributed under the terms of the
27
* GNU General Public License ("GPL") version 2 as published by the Free
28
* Software Foundation.
29
*
30
* NO WARRANTY
31
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41
* POSSIBILITY OF SUCH DAMAGES.
42
*/
43
44
#include <
acpi/acpi.h
>
45
#include "
accommon.h
"
46
#include "
acnamesp.h
"
47
#include "
acparser.h
"
48
#include "
acdispat.h
"
49
#include "
actables.h
"
50
51
#define _COMPONENT ACPI_NAMESPACE
52
ACPI_MODULE_NAME
(
"nsparse"
)
53
54
/*******************************************************************************
55
*
56
* FUNCTION: ns_one_complete_parse
57
*
58
* PARAMETERS: pass_number - 1 or 2
59
* table_desc - The table to be parsed.
60
*
61
* RETURN: Status
62
*
63
* DESCRIPTION: Perform one complete parse of an ACPI/AML table.
64
*
65
******************************************************************************/
66
acpi_status
67
acpi_ns_one_complete_parse
(
u32
pass_number,
68
u32
table_index,
69
struct
acpi_namespace_node
*start_node)
70
{
71
union
acpi_parse_object
*parse_root;
72
acpi_status
status
;
73
u32
aml_length;
74
u8
*aml_start;
75
struct
acpi_walk_state
*walk_state;
76
struct
acpi_table_header
*
table
;
77
acpi_owner_id
owner_id
;
78
79
ACPI_FUNCTION_TRACE
(ns_one_complete_parse);
80
81
status =
acpi_tb_get_owner_id
(table_index, &owner_id);
82
if
(
ACPI_FAILURE
(status)) {
83
return_ACPI_STATUS
(status);
84
}
85
86
/* Create and init a Root Node */
87
88
parse_root =
acpi_ps_create_scope_op
();
89
if
(!parse_root) {
90
return_ACPI_STATUS
(
AE_NO_MEMORY
);
91
}
92
93
/* Create and initialize a new walk state */
94
95
walk_state =
acpi_ds_create_walk_state
(owner_id,
NULL
,
NULL
,
NULL
);
96
if
(!walk_state) {
97
acpi_ps_free_op
(parse_root);
98
return_ACPI_STATUS
(
AE_NO_MEMORY
);
99
}
100
101
status =
acpi_get_table_by_index
(table_index, &table);
102
if
(
ACPI_FAILURE
(status)) {
103
acpi_ds_delete_walk_state
(walk_state);
104
acpi_ps_free_op
(parse_root);
105
return_ACPI_STATUS
(status);
106
}
107
108
/* Table must consist of at least a complete header */
109
110
if
(table->
length
<
sizeof
(
struct
acpi_table_header
)) {
111
status =
AE_BAD_HEADER
;
112
}
else
{
113
aml_start = (
u8
*) table +
sizeof
(
struct
acpi_table_header
);
114
aml_length = table->
length
-
sizeof
(
struct
acpi_table_header
);
115
status =
acpi_ds_init_aml_walk
(walk_state, parse_root,
NULL
,
116
aml_start, aml_length,
NULL
,
117
(
u8
) pass_number);
118
}
119
120
if
(
ACPI_FAILURE
(status)) {
121
acpi_ds_delete_walk_state
(walk_state);
122
goto
cleanup;
123
}
124
125
/* start_node is the default location to load the table */
126
127
if
(start_node && start_node !=
acpi_gbl_root_node
) {
128
status =
129
acpi_ds_scope_stack_push
(start_node,
ACPI_TYPE_METHOD
,
130
walk_state);
131
if
(
ACPI_FAILURE
(status)) {
132
acpi_ds_delete_walk_state
(walk_state);
133
goto
cleanup;
134
}
135
}
136
137
/* Parse the AML */
138
139
ACPI_DEBUG_PRINT
((
ACPI_DB_PARSE
,
"*PARSE* pass %u parse\n"
,
140
pass_number));
141
status =
acpi_ps_parse_aml
(walk_state);
142
143
cleanup:
144
acpi_ps_delete_parse_tree
(parse_root);
145
return_ACPI_STATUS
(status);
146
}
147
148
/*******************************************************************************
149
*
150
* FUNCTION: acpi_ns_parse_table
151
*
152
* PARAMETERS: table_desc - An ACPI table descriptor for table to parse
153
* start_node - Where to enter the table into the namespace
154
*
155
* RETURN: Status
156
*
157
* DESCRIPTION: Parse AML within an ACPI table and return a tree of ops
158
*
159
******************************************************************************/
160
161
acpi_status
162
acpi_ns_parse_table
(
u32
table_index,
struct
acpi_namespace_node
*start_node)
163
{
164
acpi_status
status
;
165
166
ACPI_FUNCTION_TRACE
(ns_parse_table);
167
168
/*
169
* AML Parse, pass 1
170
*
171
* In this pass, we load most of the namespace. Control methods
172
* are not parsed until later. A parse tree is not created. Instead,
173
* each Parser Op subtree is deleted when it is finished. This saves
174
* a great deal of memory, and allows a small cache of parse objects
175
* to service the entire parse. The second pass of the parse then
176
* performs another complete parse of the AML.
177
*/
178
ACPI_DEBUG_PRINT
((
ACPI_DB_PARSE
,
"**** Start pass 1\n"
));
179
status =
acpi_ns_one_complete_parse
(
ACPI_IMODE_LOAD_PASS1
,
180
table_index, start_node);
181
if
(
ACPI_FAILURE
(status)) {
182
return_ACPI_STATUS
(status);
183
}
184
185
/*
186
* AML Parse, pass 2
187
*
188
* In this pass, we resolve forward references and other things
189
* that could not be completed during the first pass.
190
* Another complete parse of the AML is performed, but the
191
* overhead of this is compensated for by the fact that the
192
* parse objects are all cached.
193
*/
194
ACPI_DEBUG_PRINT
((
ACPI_DB_PARSE
,
"**** Start pass 2\n"
));
195
status =
acpi_ns_one_complete_parse
(
ACPI_IMODE_LOAD_PASS2
,
196
table_index, start_node);
197
if
(
ACPI_FAILURE
(status)) {
198
return_ACPI_STATUS
(status);
199
}
200
201
return_ACPI_STATUS
(status);
202
}
Generated on Thu Jan 10 2013 13:23:32 for Linux Kernel by
1.8.2