utmisc.c

来自「linux 内核源代码」· C语言 代码 · 共 1,081 行 · 第 1/2 页

C
1,081
字号
	/* Get the full pathname to the node */	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;	status = acpi_ns_handle_to_pathname(obj_handle, &buffer);	if (ACPI_FAILURE(status)) {		return;	}	/* Print what we're doing */	switch (type) {	case ACPI_TYPE_METHOD:		acpi_os_printf("Executing  ");		break;	default:		acpi_os_printf("Initializing ");		break;	}	/* Print the object type and pathname */	acpi_os_printf("%-12s %s",		       acpi_ut_get_type_name(type), (char *)buffer.pointer);	/* Extra path is used to append names like _STA, _INI, etc. */	if (path) {		acpi_os_printf(".%s", path);	}	acpi_os_printf("\n");	ACPI_FREE(buffer.pointer);}#endif/******************************************************************************* * * FUNCTION:    acpi_ut_valid_acpi_char * * PARAMETERS:  Char            - The character to be examined *              Position        - Byte position (0-3) * * RETURN:      TRUE if the character is valid, FALSE otherwise * * DESCRIPTION: Check for a valid ACPI character. Must be one of: *              1) Upper case alpha *              2) numeric *              3) underscore * *              We allow a '!' as the last character because of the ASF! table * ******************************************************************************/u8 acpi_ut_valid_acpi_char(char character, acpi_native_uint position){	if (!((character >= 'A' && character <= 'Z') ||	      (character >= '0' && character <= '9') || (character == '_'))) {		/* Allow a '!' in the last position */		if (character == '!' && position == 3) {			return (TRUE);		}		return (FALSE);	}	return (TRUE);}/******************************************************************************* * * FUNCTION:    acpi_ut_valid_acpi_name * * PARAMETERS:  Name            - The name to be examined * * RETURN:      TRUE if the name is valid, FALSE otherwise * * DESCRIPTION: Check for a valid ACPI name.  Each character must be one of: *              1) Upper case alpha *              2) numeric *              3) underscore * ******************************************************************************/u8 acpi_ut_valid_acpi_name(u32 name){	acpi_native_uint i;	ACPI_FUNCTION_ENTRY();	for (i = 0; i < ACPI_NAME_SIZE; i++) {		if (!acpi_ut_valid_acpi_char		    ((ACPI_CAST_PTR(char, &name))[i], i)) {			return (FALSE);		}	}	return (TRUE);}/******************************************************************************* * * FUNCTION:    acpi_ut_repair_name * * PARAMETERS:  Name            - The ACPI name to be repaired * * RETURN:      Repaired version of the name * * DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and *              return the new name. * ******************************************************************************/acpi_name acpi_ut_repair_name(char *name){	acpi_native_uint i;	char new_name[ACPI_NAME_SIZE];	for (i = 0; i < ACPI_NAME_SIZE; i++) {		new_name[i] = name[i];		/*		 * Replace a bad character with something printable, yet technically		 * still invalid. This prevents any collisions with existing "good"		 * names in the namespace.		 */		if (!acpi_ut_valid_acpi_char(name[i], i)) {			new_name[i] = '*';		}	}	return (*(u32 *) new_name);}/******************************************************************************* * * FUNCTION:    acpi_ut_strtoul64 * * PARAMETERS:  String          - Null terminated string *              Base            - Radix of the string: 16 or ACPI_ANY_BASE; *                                ACPI_ANY_BASE means 'in behalf of to_integer' *              ret_integer     - Where the converted integer is returned * * RETURN:      Status and Converted value * * DESCRIPTION: Convert a string into an unsigned value. Performs either a *              32-bit or 64-bit conversion, depending on the current mode *              of the interpreter. *              NOTE: Does not support Octal strings, not needed. * ******************************************************************************/acpi_statusacpi_ut_strtoul64(char *string, u32 base, acpi_integer * ret_integer){	u32 this_digit = 0;	acpi_integer return_value = 0;	acpi_integer quotient;	acpi_integer dividend;	u32 to_integer_op = (base == ACPI_ANY_BASE);	u32 mode32 = (acpi_gbl_integer_byte_width == 4);	u8 valid_digits = 0;	u8 sign_of0x = 0;	u8 term = 0;	ACPI_FUNCTION_TRACE_STR(ut_stroul64, string);	switch (base) {	case ACPI_ANY_BASE:	case 16:		break;	default:		/* Invalid Base */		return_ACPI_STATUS(AE_BAD_PARAMETER);	}	if (!string) {		goto error_exit;	}	/* Skip over any white space in the buffer */	while ((*string) && (ACPI_IS_SPACE(*string) || *string == '\t')) {		string++;	}	if (to_integer_op) {		/*		 * Base equal to ACPI_ANY_BASE means 'to_integer operation case'.		 * We need to determine if it is decimal or hexadecimal.		 */		if ((*string == '0') && (ACPI_TOLOWER(*(string + 1)) == 'x')) {			sign_of0x = 1;			base = 16;			/* Skip over the leading '0x' */			string += 2;		} else {			base = 10;		}	}	/* Any string left? Check that '0x' is not followed by white space. */	if (!(*string) || ACPI_IS_SPACE(*string) || *string == '\t') {		if (to_integer_op) {			goto error_exit;		} else {			goto all_done;		}	}	/*	 * Perform a 32-bit or 64-bit conversion, depending upon the current	 * execution mode of the interpreter	 */	dividend = (mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX;	/* Main loop: convert the string to a 32- or 64-bit integer */	while (*string) {		if (ACPI_IS_DIGIT(*string)) {			/* Convert ASCII 0-9 to Decimal value */			this_digit = ((u8) * string) - '0';		} else if (base == 10) {			/* Digit is out of range; possible in to_integer case only */			term = 1;		} else {			this_digit = (u8) ACPI_TOUPPER(*string);			if (ACPI_IS_XDIGIT((char)this_digit)) {				/* Convert ASCII Hex char to value */				this_digit = this_digit - 'A' + 10;			} else {				term = 1;			}		}		if (term) {			if (to_integer_op) {				goto error_exit;			} else {				break;			}		} else if ((valid_digits == 0) && (this_digit == 0)			   && !sign_of0x) {			/* Skip zeros */			string++;			continue;		}		valid_digits++;		if (sign_of0x && ((valid_digits > 16)				  || ((valid_digits > 8) && mode32))) {			/*			 * This is to_integer operation case.			 * No any restrictions for string-to-integer conversion,			 * see ACPI spec.			 */			goto error_exit;		}		/* Divide the digit into the correct position */		(void)		    acpi_ut_short_divide((dividend - (acpi_integer) this_digit),					 base, &quotient, NULL);		if (return_value > quotient) {			if (to_integer_op) {				goto error_exit;			} else {				break;			}		}		return_value *= base;		return_value += this_digit;		string++;	}	/* All done, normal exit */      all_done:	ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n",			  ACPI_FORMAT_UINT64(return_value)));	*ret_integer = return_value;	return_ACPI_STATUS(AE_OK);      error_exit:	/* Base was set/validated above */	if (base == 10) {		return_ACPI_STATUS(AE_BAD_DECIMAL_CONSTANT);	} else {		return_ACPI_STATUS(AE_BAD_HEX_CONSTANT);	}}/******************************************************************************* * * FUNCTION:    acpi_ut_create_update_state_and_push * * PARAMETERS:  Object          - Object to be added to the new state *              Action          - Increment/Decrement *              state_list      - List the state will be added to * * RETURN:      Status * * DESCRIPTION: Create a new state and push it * ******************************************************************************/acpi_statusacpi_ut_create_update_state_and_push(union acpi_operand_object *object,				     u16 action,				     union acpi_generic_state **state_list){	union acpi_generic_state *state;	ACPI_FUNCTION_ENTRY();	/* Ignore null objects; these are expected */	if (!object) {		return (AE_OK);	}	state = acpi_ut_create_update_state(object, action);	if (!state) {		return (AE_NO_MEMORY);	}	acpi_ut_push_generic_state(state_list, state);	return (AE_OK);}/******************************************************************************* * * FUNCTION:    acpi_ut_walk_package_tree * * PARAMETERS:  source_object       - The package to walk *              target_object       - Target object (if package is being copied) *              walk_callback       - Called once for each package element *              Context             - Passed to the callback function * * RETURN:      Status * * DESCRIPTION: Walk through a package * ******************************************************************************/acpi_statusacpi_ut_walk_package_tree(union acpi_operand_object * source_object,			  void *target_object,			  acpi_pkg_callback walk_callback, void *context){	acpi_status status = AE_OK;	union acpi_generic_state *state_list = NULL;	union acpi_generic_state *state;	u32 this_index;	union acpi_operand_object *this_source_obj;	ACPI_FUNCTION_TRACE(ut_walk_package_tree);	state = acpi_ut_create_pkg_state(source_object, target_object, 0);	if (!state) {		return_ACPI_STATUS(AE_NO_MEMORY);	}	while (state) {		/* Get one element of the package */		this_index = state->pkg.index;		this_source_obj = (union acpi_operand_object *)		    state->pkg.source_object->package.elements[this_index];		/*		 * Check for:		 * 1) An uninitialized package element.  It is completely		 *    legal to declare a package and leave it uninitialized		 * 2) Not an internal object - can be a namespace node instead		 * 3) Any type other than a package.  Packages are handled in else		 *    case below.		 */		if ((!this_source_obj) ||		    (ACPI_GET_DESCRIPTOR_TYPE(this_source_obj) !=		     ACPI_DESC_TYPE_OPERAND)		    || (ACPI_GET_OBJECT_TYPE(this_source_obj) !=			ACPI_TYPE_PACKAGE)) {			status =			    walk_callback(ACPI_COPY_TYPE_SIMPLE,					  this_source_obj, state, context);			if (ACPI_FAILURE(status)) {				return_ACPI_STATUS(status);			}			state->pkg.index++;			while (state->pkg.index >=			       state->pkg.source_object->package.count) {				/*				 * We've handled all of the objects at this level,  This means				 * that we have just completed a package.  That package may				 * have contained one or more packages itself.				 *				 * Delete this state and pop the previous state (package).				 */				acpi_ut_delete_generic_state(state);				state = acpi_ut_pop_generic_state(&state_list);				/* Finished when there are no more states */				if (!state) {					/*					 * We have handled all of the objects in the top level					 * package just add the length of the package objects					 * and exit					 */					return_ACPI_STATUS(AE_OK);				}				/*				 * Go back up a level and move the index past the just				 * completed package object.				 */				state->pkg.index++;			}		} else {			/* This is a subobject of type package */			status =			    walk_callback(ACPI_COPY_TYPE_PACKAGE,					  this_source_obj, state, context);			if (ACPI_FAILURE(status)) {				return_ACPI_STATUS(status);			}			/*			 * Push the current state and create a new one			 * The callback above returned a new target package object.			 */			acpi_ut_push_generic_state(&state_list, state);			state = acpi_ut_create_pkg_state(this_source_obj,							 state->pkg.							 this_target_obj, 0);			if (!state) {				return_ACPI_STATUS(AE_NO_MEMORY);			}		}	}	/* We should never get here */	return_ACPI_STATUS(AE_AML_INTERNAL);}/******************************************************************************* * * FUNCTION:    acpi_ut_error, acpi_ut_warning, acpi_ut_info * * PARAMETERS:  module_name         - Caller's module name (for error output) *              line_number         - Caller's line number (for error output) *              Format              - Printf format string + additional args * * RETURN:      None * * DESCRIPTION: Print message with module/line/version info * ******************************************************************************/void ACPI_INTERNAL_VAR_XFACEacpi_ut_error(char *module_name, u32 line_number, char *format, ...){	va_list args;	acpi_os_printf("ACPI Error (%s-%04d): ", module_name, line_number);	va_start(args, format);	acpi_os_vprintf(format, args);	acpi_os_printf(" [%X]\n", ACPI_CA_VERSION);}void ACPI_INTERNAL_VAR_XFACEacpi_ut_exception(char *module_name,		  u32 line_number, acpi_status status, char *format, ...){	va_list args;	acpi_os_printf("ACPI Exception (%s-%04d): %s, ", module_name,		       line_number, acpi_format_exception(status));	va_start(args, format);	acpi_os_vprintf(format, args);	acpi_os_printf(" [%X]\n", ACPI_CA_VERSION);}EXPORT_SYMBOL(acpi_ut_exception);void ACPI_INTERNAL_VAR_XFACEacpi_ut_warning(char *module_name, u32 line_number, char *format, ...){	va_list args;	acpi_os_printf("ACPI Warning (%s-%04d): ", module_name, line_number);	va_start(args, format);	acpi_os_vprintf(format, args);	acpi_os_printf(" [%X]\n", ACPI_CA_VERSION);}void ACPI_INTERNAL_VAR_XFACEacpi_ut_info(char *module_name, u32 line_number, char *format, ...){	va_list args;	/*	 * Removed module_name, line_number, and acpica version, not needed	 * for info output	 */	acpi_os_printf("ACPI: ");	va_start(args, format);	acpi_os_vprintf(format, args);	acpi_os_printf("\n");}

⌨️ 快捷键说明

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