diff options
author | Damien Zammit <damien@zamaudio.com> | 2021-03-30 16:32:49 +1100 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2021-03-30 17:05:53 +1100 |
commit | 8c64499adadf88715883150ce89bfb5e945d7319 (patch) | |
tree | 5792803a39e8a303e6295e83cda60cb4d21be6fc /libacpica/pswalk.c | |
parent | 65a80c709b4a8c909fa1d7de49e0097611bdc057 (diff) |
acpica: Import codebase from upstream ACPICA
Imported from https://github.com/acpica/acpica
on commit 63db9761a6fac0c501eb1767c16b20cf74278e77
filtered using ./generate/linux/gen-repo.sh
Diffstat (limited to 'libacpica/pswalk.c')
-rw-r--r-- | libacpica/pswalk.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/libacpica/pswalk.c b/libacpica/pswalk.c new file mode 100644 index 00000000..9a02fe18 --- /dev/null +++ b/libacpica/pswalk.c @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 +/****************************************************************************** + * + * Module Name: pswalk - Parser routines to walk parsed op tree(s) + * + * Copyright (C) 2000 - 2021, Intel Corp. + * + *****************************************************************************/ + +#include <acpi/acpi.h> +#include "accommon.h" +#include "acparser.h" + +#define _COMPONENT ACPI_PARSER +ACPI_MODULE_NAME("pswalk") +/******************************************************************************* + * + * FUNCTION: acpi_ps_delete_parse_tree + * + * PARAMETERS: subtree_root - Root of tree (or subtree) to delete + * + * RETURN: None + * + * DESCRIPTION: Delete a portion of or an entire parse tree. + * + ******************************************************************************/ +#include "amlcode.h" +void acpi_ps_delete_parse_tree(union acpi_parse_object *subtree_root) +{ + union acpi_parse_object *op = subtree_root; + union acpi_parse_object *next = NULL; + union acpi_parse_object *parent = NULL; + u32 level = 0; + + ACPI_FUNCTION_TRACE_PTR(ps_delete_parse_tree, subtree_root); + + ACPI_DEBUG_PRINT((ACPI_DB_PARSE_TREES, " root %p\n", subtree_root)); + + /* Visit all nodes in the subtree */ + + while (op) { + if (op != parent) { + + /* This is the descending case */ + + if (ACPI_IS_DEBUG_ENABLED + (ACPI_LV_PARSE_TREES, _COMPONENT)) { + + /* This debug option will print the entire parse tree */ + + acpi_os_printf(" %*.s%s %p", (level * 4), + " ", + acpi_ps_get_opcode_name(op-> + common. + aml_opcode), + op); + + if (op->named.aml_opcode == AML_INT_NAMEPATH_OP) { + acpi_os_printf(" %4.4s", + op->common.value.string); + } + if (op->named.aml_opcode == AML_STRING_OP) { + acpi_os_printf(" %s", + op->common.value.string); + } + acpi_os_printf("\n"); + } + + /* Look for an argument or child of the current op */ + + next = acpi_ps_get_arg(op, 0); + if (next) { + + /* Still going downward in tree (Op is not completed yet) */ + + op = next; + level++; + continue; + } + } + + /* No more children, this Op is complete. */ + + next = op->common.next; + parent = op->common.parent; + + acpi_ps_free_op(op); + + /* If we are back to the starting point, the walk is complete. */ + + if (op == subtree_root) { + return_VOID; + } + + if (next) { + op = next; + } else { + level--; + op = parent; + } + } + + return_VOID; +} |