linux/drivers/acpi/acpica/pswalk.c
<<
>>
Prefs
   1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
   2/******************************************************************************
   3 *
   4 * Module Name: pswalk - Parser routines to walk parsed op tree(s)
   5 *
   6 * Copyright (C) 2000 - 2018, Intel Corp.
   7 *
   8 *****************************************************************************/
   9
  10#include <acpi/acpi.h>
  11#include "accommon.h"
  12#include "acparser.h"
  13
  14#define _COMPONENT          ACPI_PARSER
  15ACPI_MODULE_NAME("pswalk")
  16
  17/*******************************************************************************
  18 *
  19 * FUNCTION:    acpi_ps_delete_parse_tree
  20 *
  21 * PARAMETERS:  subtree_root        - Root of tree (or subtree) to delete
  22 *
  23 * RETURN:      None
  24 *
  25 * DESCRIPTION: Delete a portion of or an entire parse tree.
  26 *
  27 ******************************************************************************/
  28#include "amlcode.h"
  29void acpi_ps_delete_parse_tree(union acpi_parse_object *subtree_root)
  30{
  31        union acpi_parse_object *op = subtree_root;
  32        union acpi_parse_object *next = NULL;
  33        union acpi_parse_object *parent = NULL;
  34        u32 level = 0;
  35
  36        ACPI_FUNCTION_TRACE_PTR(ps_delete_parse_tree, subtree_root);
  37
  38        ACPI_DEBUG_PRINT((ACPI_DB_PARSE_TREES, " root %p\n", subtree_root));
  39
  40        /* Visit all nodes in the subtree */
  41
  42        while (op) {
  43                if (op != parent) {
  44
  45                        /* This is the descending case */
  46
  47                        if (ACPI_IS_DEBUG_ENABLED
  48                            (ACPI_LV_PARSE_TREES, _COMPONENT)) {
  49
  50                                /* This debug option will print the entire parse tree */
  51
  52                                acpi_os_printf("      %*.s%s %p", (level * 4),
  53                                               " ",
  54                                               acpi_ps_get_opcode_name(op->
  55                                                                       common.
  56                                                                       aml_opcode),
  57                                               op);
  58
  59                                if (op->named.aml_opcode == AML_INT_NAMEPATH_OP) {
  60                                        acpi_os_printf("  %4.4s",
  61                                                       op->common.value.string);
  62                                }
  63                                if (op->named.aml_opcode == AML_STRING_OP) {
  64                                        acpi_os_printf("  %s",
  65                                                       op->common.value.string);
  66                                }
  67                                acpi_os_printf("\n");
  68                        }
  69
  70                        /* Look for an argument or child of the current op */
  71
  72                        next = acpi_ps_get_arg(op, 0);
  73                        if (next) {
  74
  75                                /* Still going downward in tree (Op is not completed yet) */
  76
  77                                op = next;
  78                                level++;
  79                                continue;
  80                        }
  81                }
  82
  83                /* No more children, this Op is complete. */
  84
  85                next = op->common.next;
  86                parent = op->common.parent;
  87
  88                acpi_ps_free_op(op);
  89
  90                /* If we are back to the starting point, the walk is complete. */
  91
  92                if (op == subtree_root) {
  93                        return_VOID;
  94                }
  95
  96                if (next) {
  97                        op = next;
  98                } else {
  99                        level--;
 100                        op = parent;
 101                }
 102        }
 103
 104        return_VOID;
 105}
 106