⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dswload.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************** * * Module Name: dswload - Dispatcher namespace load callbacks *              $Revision: 24 $ * *****************************************************************************//* *  Copyright (C) 2000 R. Byron Moore * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include "acpi.h"#include "acparser.h"#include "amlcode.h"#include "acdispat.h"#include "acinterp.h"#include "acnamesp.h"#include "acevents.h"#define _COMPONENT          DISPATCHER	 MODULE_NAME         ("dswload")/***************************************************************************** * * FUNCTION:    Acpi_ds_load1_begin_op * * PARAMETERS:  Walk_state      - Current state of the parse tree walk *              Op              - Op that has been just been reached in the *                                walk;  Arguments have not been evaluated yet. * * RETURN:      Status * * DESCRIPTION: Descending callback used during the loading of ACPI tables. * ****************************************************************************/ACPI_STATUSacpi_ds_load1_begin_op (	u16                     opcode,	ACPI_PARSE_OBJECT       *op,	ACPI_WALK_STATE         *walk_state,	ACPI_PARSE_OBJECT       **out_op){	ACPI_NAMESPACE_NODE     *node;	ACPI_STATUS             status;	OBJECT_TYPE_INTERNAL    data_type;	NATIVE_CHAR             *path;	/* We are only interested in opcodes that have an associated name */	if (!acpi_ps_is_named_op (opcode)) {		*out_op = op;		return (AE_OK);	}	/* Check if this object has already been installed in the namespace */	if (op && op->node) {		*out_op = op;		return (AE_OK);	}	path = acpi_ps_get_next_namestring (walk_state->parser_state);	/* Map the raw opcode into an internal object type */	data_type = acpi_ds_map_named_opcode_to_data_type (opcode);	/*	 * Enter the named type into the internal namespace.  We enter the name	 * as we go downward in the parse tree.  Any necessary subobjects that involve	 * arguments to the opcode must be created as we go back up the parse tree later.	 */	status = acpi_ns_lookup (walk_state->scope_info, path,			 data_type, IMODE_LOAD_PASS1,			 NS_NO_UPSEARCH, walk_state, &(node));	if (ACPI_FAILURE (status)) {		return (status);	}	if (!op) {		/* Create a new op */		op = acpi_ps_alloc_op (opcode);		if (!op) {			return (AE_NO_MEMORY);		}	}	/* Initialize */	((ACPI_PARSE2_OBJECT *)op)->name = node->name;	/*	 * Put the Node in the "op" object that the parser uses, so we	 * can get it again quickly when this scope is closed	 */	op->node = node;	acpi_ps_append_arg (acpi_ps_get_parent_scope (walk_state->parser_state), op);	*out_op = op;	return (status);}/***************************************************************************** * * FUNCTION:    Acpi_ds_load1_end_op * * PARAMETERS:  Walk_state      - Current state of the parse tree walk *              Op              - Op that has been just been completed in the *                                walk;  Arguments have now been evaluated. * * RETURN:      Status * * DESCRIPTION: Ascending callback used during the loading of the namespace, *              both control methods and everything else. * ****************************************************************************/ACPI_STATUSacpi_ds_load1_end_op (	ACPI_WALK_STATE         *walk_state,	ACPI_PARSE_OBJECT       *op){	OBJECT_TYPE_INTERNAL    data_type;	/* We are only interested in opcodes that have an associated name */	if (!acpi_ps_is_named_op (op->opcode)) {		return (AE_OK);	}	/* Get the type to determine if we should pop the scope */	data_type = acpi_ds_map_named_opcode_to_data_type (op->opcode);	if (op->opcode == AML_NAME_OP) {		/* For Name opcode, check the argument */		if (op->value.arg) {			data_type = acpi_ds_map_opcode_to_data_type (					  (op->value.arg)->opcode, NULL);			((ACPI_NAMESPACE_NODE *)op->node)->type =					  (u8) data_type;		}	}	/* Pop the scope stack */	if (acpi_ns_opens_scope (data_type)) {		acpi_ds_scope_stack_pop (walk_state);	}	return (AE_OK);}/***************************************************************************** * * FUNCTION:    Acpi_ds_load2_begin_op * * PARAMETERS:  Walk_state      - Current state of the parse tree walk *              Op              - Op that has been just been reached in the *                                walk;  Arguments have not been evaluated yet. * * RETURN:      Status * * DESCRIPTION: Descending callback used during the loading of ACPI tables. * ****************************************************************************/ACPI_STATUSacpi_ds_load2_begin_op (	u16                     opcode,	ACPI_PARSE_OBJECT       *op,	ACPI_WALK_STATE         *walk_state,	ACPI_PARSE_OBJECT       **out_op){	ACPI_NAMESPACE_NODE     *node;	ACPI_STATUS             status;	OBJECT_TYPE_INTERNAL    data_type;	NATIVE_CHAR             *buffer_ptr;	void                    *original = NULL;	/* We only care about Namespace opcodes here */	if (!acpi_ps_is_namespace_op (opcode) &&		opcode != AML_NAMEPATH_OP)	{		return (AE_OK);	}	/* Temp! same code as in psparse */	if (!acpi_ps_is_named_op (opcode)) {		return (AE_OK);	}	if (op) {		/*		 * Get the name we are going to enter or lookup in the namespace		 */		if (opcode == AML_NAMEPATH_OP) {			/* For Namepath op, get the path string */			buffer_ptr = op->value.string;			if (!buffer_ptr) {				/* No name, just exit */				return (AE_OK);			}		}		else {			/* Get name from the op */			buffer_ptr = (NATIVE_CHAR *) &((ACPI_PARSE2_OBJECT *)op)->name;		}	}	else {		buffer_ptr = acpi_ps_get_next_namestring (walk_state->parser_state);	}	/* Map the raw opcode into an internal object type */	data_type = acpi_ds_map_named_opcode_to_data_type (opcode);	if (opcode == AML_DEF_FIELD_OP      ||		opcode == AML_BANK_FIELD_OP     ||		opcode == AML_INDEX_FIELD_OP)	{		node = NULL;		status = AE_OK;	}	else if (opcode == AML_NAMEPATH_OP) {		/*		 * The Name_path is an object reference to an existing object. Don't enter the		 * name into the namespace, but look it up for use later		 */		status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr,				 data_type, IMODE_EXECUTE,				 NS_SEARCH_PARENT, walk_state,				 &(node));	}	else {		if (op && op->node) {			original = op->node;			node = op->node;			if (acpi_ns_opens_scope (data_type)) {				status = acpi_ds_scope_stack_push (node,						   data_type,						   walk_state);				if (ACPI_FAILURE (status)) {					return (status);				}			}			return (AE_OK);		}		/*		 * Enter the named type into the internal namespace.  We enter the name		 * as we go downward in the parse tree.  Any necessary subobjects that involve		 * arguments to the opcode must be created as we go back up the parse tree later.		 */		status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr,				 data_type, IMODE_EXECUTE,				 NS_NO_UPSEARCH, walk_state,				 &(node));	}	if (ACPI_SUCCESS (status)) {		if (!op) {			/* Create a new op */			op = acpi_ps_alloc_op (opcode);			if (!op) {				return (AE_NO_MEMORY);			}			/* Initialize */			((ACPI_PARSE2_OBJECT *)op)->name = node->name;			*out_op = op;		}		/*		 * Put the Node in the "op" object that the parser uses, so we		 * can get it again quickly when this scope is closed		 */		op->node = node;	}	return (status);}/***************************************************************************** * * FUNCTION:    Acpi_ds_load2_end_op * * PARAMETERS:  Walk_state      - Current state of the parse tree walk

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -