0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <acpi/acpi.h>
0011 #include "accommon.h"
0012 #include "acdispat.h"
0013
0014 #define _COMPONENT ACPI_DISPATCHER
0015 ACPI_MODULE_NAME("dswscope")
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 void acpi_ds_scope_stack_clear(struct acpi_walk_state *walk_state)
0030 {
0031 union acpi_generic_state *scope_info;
0032
0033 ACPI_FUNCTION_NAME(ds_scope_stack_clear);
0034
0035 while (walk_state->scope_info) {
0036
0037
0038
0039 scope_info = walk_state->scope_info;
0040 walk_state->scope_info = scope_info->scope.next;
0041
0042 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
0043 "Popped object type (%s)\n",
0044 acpi_ut_get_type_name(scope_info->common.
0045 value)));
0046
0047 acpi_ut_delete_generic_state(scope_info);
0048 }
0049 }
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066 acpi_status
0067 acpi_ds_scope_stack_push(struct acpi_namespace_node *node,
0068 acpi_object_type type,
0069 struct acpi_walk_state *walk_state)
0070 {
0071 union acpi_generic_state *scope_info;
0072 union acpi_generic_state *old_scope_info;
0073
0074 ACPI_FUNCTION_TRACE(ds_scope_stack_push);
0075
0076 if (!node) {
0077
0078
0079
0080 ACPI_ERROR((AE_INFO, "Null scope parameter"));
0081 return_ACPI_STATUS(AE_BAD_PARAMETER);
0082 }
0083
0084
0085
0086 if (!acpi_ut_valid_object_type(type)) {
0087 ACPI_WARNING((AE_INFO, "Invalid object type: 0x%X", type));
0088 }
0089
0090
0091
0092 scope_info = acpi_ut_create_generic_state();
0093 if (!scope_info) {
0094 return_ACPI_STATUS(AE_NO_MEMORY);
0095 }
0096
0097
0098
0099 scope_info->common.descriptor_type = ACPI_DESC_TYPE_STATE_WSCOPE;
0100 scope_info->scope.node = node;
0101 scope_info->common.value = (u16) type;
0102
0103 walk_state->scope_depth++;
0104
0105 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
0106 "[%.2d] Pushed scope ",
0107 (u32) walk_state->scope_depth));
0108
0109 old_scope_info = walk_state->scope_info;
0110 if (old_scope_info) {
0111 ACPI_DEBUG_PRINT_RAW((ACPI_DB_EXEC,
0112 "[%4.4s] (%s)",
0113 acpi_ut_get_node_name(old_scope_info->
0114 scope.node),
0115 acpi_ut_get_type_name(old_scope_info->
0116 common.value)));
0117 } else {
0118 ACPI_DEBUG_PRINT_RAW((ACPI_DB_EXEC, ACPI_NAMESPACE_ROOT));
0119 }
0120
0121 ACPI_DEBUG_PRINT_RAW((ACPI_DB_EXEC,
0122 ", New scope -> [%4.4s] (%s)\n",
0123 acpi_ut_get_node_name(scope_info->scope.node),
0124 acpi_ut_get_type_name(scope_info->common.value)));
0125
0126
0127
0128 acpi_ut_push_generic_state(&walk_state->scope_info, scope_info);
0129 return_ACPI_STATUS(AE_OK);
0130 }
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144 acpi_status acpi_ds_scope_stack_pop(struct acpi_walk_state *walk_state)
0145 {
0146 union acpi_generic_state *scope_info;
0147 union acpi_generic_state *new_scope_info;
0148
0149 ACPI_FUNCTION_TRACE(ds_scope_stack_pop);
0150
0151
0152
0153
0154 scope_info = acpi_ut_pop_generic_state(&walk_state->scope_info);
0155 if (!scope_info) {
0156 return_ACPI_STATUS(AE_STACK_UNDERFLOW);
0157 }
0158
0159 walk_state->scope_depth--;
0160
0161 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
0162 "[%.2d] Popped scope [%4.4s] (%s), New scope -> ",
0163 (u32) walk_state->scope_depth,
0164 acpi_ut_get_node_name(scope_info->scope.node),
0165 acpi_ut_get_type_name(scope_info->common.value)));
0166
0167 new_scope_info = walk_state->scope_info;
0168 if (new_scope_info) {
0169 ACPI_DEBUG_PRINT_RAW((ACPI_DB_EXEC, "[%4.4s] (%s)\n",
0170 acpi_ut_get_node_name(new_scope_info->
0171 scope.node),
0172 acpi_ut_get_type_name(new_scope_info->
0173 common.value)));
0174 } else {
0175 ACPI_DEBUG_PRINT_RAW((ACPI_DB_EXEC, "%s\n",
0176 ACPI_NAMESPACE_ROOT));
0177 }
0178
0179 acpi_ut_delete_generic_state(scope_info);
0180 return_ACPI_STATUS(AE_OK);
0181 }