Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
0002 /******************************************************************************
0003  *
0004  * Module Name: dswscope - Scope stack manipulation
0005  *
0006  * Copyright (C) 2000 - 2022, Intel Corp.
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  * FUNCTION:    acpi_ds_scope_stack_clear
0020  *
0021  * PARAMETERS:  walk_state      - Current state
0022  *
0023  * RETURN:      None
0024  *
0025  * DESCRIPTION: Pop (and free) everything on the scope stack except the
0026  *              root scope object (which remains at the stack top.)
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         /* Pop a scope off the stack */
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  * FUNCTION:    acpi_ds_scope_stack_push
0054  *
0055  * PARAMETERS:  node            - Name to be made current
0056  *              type            - Type of frame being pushed
0057  *              walk_state      - Current state
0058  *
0059  * RETURN:      Status
0060  *
0061  * DESCRIPTION: Push the current scope on the scope stack, and make the
0062  *              passed Node current.
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         /* Invalid scope   */
0079 
0080         ACPI_ERROR((AE_INFO, "Null scope parameter"));
0081         return_ACPI_STATUS(AE_BAD_PARAMETER);
0082     }
0083 
0084     /* Make sure object type is valid */
0085 
0086     if (!acpi_ut_valid_object_type(type)) {
0087         ACPI_WARNING((AE_INFO, "Invalid object type: 0x%X", type));
0088     }
0089 
0090     /* Allocate a new scope object */
0091 
0092     scope_info = acpi_ut_create_generic_state();
0093     if (!scope_info) {
0094         return_ACPI_STATUS(AE_NO_MEMORY);
0095     }
0096 
0097     /* Init new scope object */
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     /* Push new scope object onto stack */
0127 
0128     acpi_ut_push_generic_state(&walk_state->scope_info, scope_info);
0129     return_ACPI_STATUS(AE_OK);
0130 }
0131 
0132 /****************************************************************************
0133  *
0134  * FUNCTION:    acpi_ds_scope_stack_pop
0135  *
0136  * PARAMETERS:  walk_state      - Current state
0137  *
0138  * RETURN:      Status
0139  *
0140  * DESCRIPTION: Pop the scope stack once.
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      * Pop scope info object off the stack.
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 }