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

📄 nsutils.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************** * * Module Name: nsutils - Utilities for accessing ACPI namespace, accessing *                        parents and siblings and Scope manipulation *              $Revision: 74 $ * *****************************************************************************//* *  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 "acnamesp.h"#include "acinterp.h"#include "amlcode.h"#include "actables.h"#define _COMPONENT          NAMESPACE	 MODULE_NAME         ("nsutils")/**************************************************************************** * * FUNCTION:    Acpi_ns_valid_root_prefix * * PARAMETERS:  Prefix          - Character to be checked * * RETURN:      TRUE if a valid prefix * * DESCRIPTION: Check if a character is a valid ACPI Root prefix * ***************************************************************************/u8acpi_ns_valid_root_prefix (	NATIVE_CHAR             prefix){	return ((u8) (prefix == '\\'));}/**************************************************************************** * * FUNCTION:    Acpi_ns_valid_path_separator * * PARAMETERS:  Sep              - Character to be checked * * RETURN:      TRUE if a valid path separator * * DESCRIPTION: Check if a character is a valid ACPI path separator * ***************************************************************************/u8acpi_ns_valid_path_separator (	NATIVE_CHAR             sep){	return ((u8) (sep == '.'));}/**************************************************************************** * * FUNCTION:    Acpi_ns_get_type * * PARAMETERS:  Handle              - Parent Node to be examined * * RETURN:      Type field from Node whose handle is passed * ***************************************************************************/OBJECT_TYPE_INTERNALacpi_ns_get_type (	ACPI_HANDLE             handle){	if (!handle) {		REPORT_WARNING (("Ns_get_type: Null handle\n"));		return (ACPI_TYPE_ANY);	}	return (((ACPI_NAMESPACE_NODE *) handle)->type);}/**************************************************************************** * * FUNCTION:    Acpi_ns_local * * PARAMETERS:  Type            - A namespace object type * * RETURN:      LOCAL if names must be found locally in objects of the *              passed type, 0 if enclosing scopes should be searched * ***************************************************************************/u32acpi_ns_local (	OBJECT_TYPE_INTERNAL    type){	if (!acpi_cm_valid_object_type (type)) {		/* Type code out of range  */		REPORT_WARNING (("Ns_local: Invalid Object Type\n"));		return (NSP_NORMAL);	}	return ((u32) acpi_gbl_ns_properties[type] & NSP_LOCAL);}/**************************************************************************** * * FUNCTION:    Acpi_ns_internalize_name * * PARAMETERS:  *External_name            - External representation of name *              **Converted Name        - Where to return the resulting *                                        internal represention of the name * * RETURN:      Status * * DESCRIPTION: Convert an external representation (e.g. "\_PR_.CPU0") *              to internal form (e.g. 5c 2f 02 5f 50 52 5f 43 50 55 30) * ****************************************************************************/ACPI_STATUSacpi_ns_internalize_name (	NATIVE_CHAR             *external_name,	NATIVE_CHAR             **converted_name){	NATIVE_CHAR             *result = NULL;	NATIVE_CHAR             *internal_name;	u32                     num_segments = 0;	u8                      fully_qualified = FALSE;	u32                     i;	u32                     num_carats = 0;	if ((!external_name)     ||		(*external_name == 0) ||		(!converted_name))	{		return (AE_BAD_PARAMETER);	}	/*	 * For the internal name, the required length is 4 bytes	 * per segment, plus 1 each for Root_prefix, Multi_name_prefix_op,	 * segment count, trailing null (which is not really needed,	 * but no there's harm in putting it there)	 *	 * strlen() + 1 covers the first Name_seg, which has no	 * path separator	 */	if (acpi_ns_valid_root_prefix (external_name[0])) {		fully_qualified = TRUE;		external_name++;	}	else {		/*		 * Handle Carat prefixes		 */		while (*external_name == '^') {			num_carats++;			external_name++;		}	}	/*	 * Determine the number of ACPI name "segments" by counting	 * the number of path separators within the string.  Start	 * with one segment since the segment count is (# separators)	 * + 1, and zero separators is ok.	 */	if (*external_name) {		num_segments = 1;		for (i = 0; external_name[i]; i++) {			if (acpi_ns_valid_path_separator (external_name[i])) {				num_segments++;			}		}	}	/* We need a segment to store the internal version of the name */	internal_name = acpi_cm_callocate ((ACPI_NAME_SIZE * num_segments) + 4 + num_carats);	if (!internal_name) {		return (AE_NO_MEMORY);	}	/* Setup the correct prefixes, counts, and pointers */	if (fully_qualified) {		internal_name[0] = '\\';		if (num_segments <= 1) {			result = &internal_name[1];		}		else if (num_segments == 2) {			internal_name[1] = AML_DUAL_NAME_PREFIX;			result = &internal_name[2];		}		else {			internal_name[1] = AML_MULTI_NAME_PREFIX_OP;			internal_name[2] = (char) num_segments;			result = &internal_name[3];		}	}	else {		/*		 * Not fully qualified.		 * Handle Carats first, then append the name segments		 */		i = 0;		if (num_carats) {			for (i = 0; i < num_carats; i++) {				internal_name[i] = '^';			}		}		if (num_segments == 1) {			result = &internal_name[i];		}		else if (num_segments == 2) {			internal_name[i] = AML_DUAL_NAME_PREFIX;			result = &internal_name[i+1];		}		else {			internal_name[i] = AML_MULTI_NAME_PREFIX_OP;			internal_name[i+1] = (char) num_segments;			result = &internal_name[i+2];		}	}	/* Build the name (minus path separators) */	for (; num_segments; num_segments--) {		for (i = 0; i < ACPI_NAME_SIZE; i++) {			if (acpi_ns_valid_path_separator (*external_name) ||			   (*external_name == 0))			{				/*				 * Pad the segment with underscore(s) if				 * segment is short				 */				result[i] = '_';			}			else {				/* Convert s8 to uppercase and save it */				result[i] = (char) TOUPPER (*external_name);				external_name++;			}		}		/* Now we must have a path separator, or the pathname is bad */		if (!acpi_ns_valid_path_separator (*external_name) &&			(*external_name != 0))		{			acpi_cm_free (internal_name);			return (AE_BAD_PARAMETER);		}		/* Move on the next segment */		external_name++;		result += ACPI_NAME_SIZE;	}	/* Return the completed name */	/* Terminate the string! */	*result = 0;	*converted_name = internal_name;	return (AE_OK);}/**************************************************************************** * * FUNCTION:    Acpi_ns_externalize_name * * PARAMETERS:  *Internal_name         - Internal representation of name *              **Converted_name       - Where to return the resulting *                                        external representation of name * * RETURN:      Status * * DESCRIPTION: Convert internal name (e.g. 5c 2f 02 5f 50 52 5f 43 50 55 30) *              to its external form (e.g. "\_PR_.CPU0") * ****************************************************************************/ACPI_STATUSacpi_ns_externalize_name (	u32                     internal_name_length,	char                    *internal_name,	u32                     *converted_name_length,	char                    **converted_name){	u32                     prefix_length = 0;	u32                     names_index = 0;	u32                     names_count = 0;	u32                     i = 0;	u32                     j = 0;	if (!internal_name_length   ||		!internal_name          ||		!converted_name_length  ||		!converted_name)	{		return (AE_BAD_PARAMETER);	}	/*	 * Check for a prefix (one '\' | one or more '^').	 */	switch (internal_name[0])	{	case '\\':		prefix_length = 1;		break;	case '^':		for (i = 0; i < internal_name_length; i++) {			if (internal_name[i] != '^') {				prefix_length = i + 1;			}		}		if (i == internal_name_length) {			prefix_length = i;		}		break;	}	/*	 * Check for object names.  Note that there could be 0-255 of these	 * 4-byte elements.	 */	if (prefix_length < internal_name_length) {		switch (internal_name[prefix_length])		{		/* <count> 4-byte names */		case AML_MULTI_NAME_PREFIX_OP:			names_index = prefix_length + 2;			names_count = (u32) internal_name[prefix_length + 1];			break;		/* two 4-byte names */		case AML_DUAL_NAME_PREFIX:			names_index = prefix_length + 1;			names_count = 2;			break;		/* Null_name */		case 0:			names_index = 0;			names_count = 0;			break;

⌨️ 快捷键说明

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