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

📄 psargs.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
					/* Change arg into a METHOD CALL and attach name to it */					acpi_ps_init_op (arg, AML_METHODCALL_OP);					name_op->value.name = path;					/* Point METHODCALL/NAME to the METHOD Node */					name_op->node = method_node;					acpi_ps_append_arg (arg, name_op);					if (!(ACPI_OPERAND_OBJECT  *) method_node->object) {						return;					}					*arg_count = ((ACPI_OPERAND_OBJECT *) method_node->object)->method.param_count;				}				return;			}			/*			 * Else this is normal named object reference.			 * Just init the NAMEPATH object with the pathname.			 * (See code below)			 */		}	}	/*	 * Either we didn't find the object in the namespace, or the object is	 * something other than a control method.  Just initialize the Op with the	 * pathname.	 */	acpi_ps_init_op (arg, AML_NAMEPATH_OP);	arg->value.name = path;	return;}#endif/******************************************************************************* * * FUNCTION:    Acpi_ps_get_next_simple_arg * * PARAMETERS:  Parser_state        - Current parser state object *              Arg_type            - The argument type (AML_*_ARG) *              Arg                 - Where the argument is returned * * RETURN:      None * * DESCRIPTION: Get the next simple argument (constant, string, or namestring) * ******************************************************************************/voidacpi_ps_get_next_simple_arg (	ACPI_PARSE_STATE        *parser_state,	u32                     arg_type,	ACPI_PARSE_OBJECT       *arg){	switch (arg_type)	{	case ARGP_BYTEDATA:		acpi_ps_init_op (arg, AML_BYTE_OP);		arg->value.integer = (u32) GET8 (parser_state->aml);		parser_state->aml++;		break;	case ARGP_WORDDATA:		acpi_ps_init_op (arg, AML_WORD_OP);		/* Get 2 bytes from the AML stream */		MOVE_UNALIGNED16_TO_32 (&arg->value.integer, parser_state->aml);		parser_state->aml += 2;		break;	case ARGP_DWORDDATA:		acpi_ps_init_op (arg, AML_DWORD_OP);		/* Get 4 bytes from the AML stream */		MOVE_UNALIGNED32_TO_32 (&arg->value.integer, parser_state->aml);		parser_state->aml += 4;		break;	case ARGP_CHARLIST:		acpi_ps_init_op (arg, AML_STRING_OP);		arg->value.string = (char*) parser_state->aml;		while (GET8 (parser_state->aml) != '\0') {			parser_state->aml++;		}		parser_state->aml++;		break;	case ARGP_NAME:	case ARGP_NAMESTRING:		acpi_ps_init_op (arg, AML_NAMEPATH_OP);		arg->value.name = acpi_ps_get_next_namestring (parser_state);		break;	}	return;}/******************************************************************************* * * FUNCTION:    Acpi_ps_get_next_field * * PARAMETERS:  Parser_state        - Current parser state object * * RETURN:      A newly allocated FIELD op * * DESCRIPTION: Get next field (Named_field, Reserved_field, or Access_field) * ******************************************************************************/ACPI_PARSE_OBJECT *acpi_ps_get_next_field (	ACPI_PARSE_STATE        *parser_state){	ACPI_PTRDIFF            aml_offset = parser_state->aml -			 parser_state->aml_start;	ACPI_PARSE_OBJECT       *field;	u16                     opcode;	u32                     name;	/* determine field type */	switch (GET8 (parser_state->aml))	{	default:		opcode = AML_NAMEDFIELD_OP;		break;	case 0x00:		opcode = AML_RESERVEDFIELD_OP;		parser_state->aml++;		break;	case 0x01:		opcode = AML_ACCESSFIELD_OP;		parser_state->aml++;		break;	}	/* Allocate a new field op */	field = acpi_ps_alloc_op (opcode);	if (field) {		field->aml_offset = aml_offset;		/* Decode the field type */		switch (opcode)		{		case AML_NAMEDFIELD_OP:			/* Get the 4-character name */			MOVE_UNALIGNED32_TO_32 (&name, parser_state->aml);			acpi_ps_set_name (field, name);			parser_state->aml += 4;			/* Get the length which is encoded as a package length */			field->value.size = acpi_ps_get_next_package_length (parser_state);			break;		case AML_RESERVEDFIELD_OP:			/* Get the length which is encoded as a package length */			field->value.size = acpi_ps_get_next_package_length (parser_state);			break;		case AML_ACCESSFIELD_OP:			/* Get Access_type and Access_atrib and merge into the field Op */			field->value.integer = ((GET8 (parser_state->aml) << 8) |					  GET8 (parser_state->aml));			parser_state->aml += 2;			break;		}	}	return (field);}/******************************************************************************* * * FUNCTION:    Acpi_ps_get_next_arg * * PARAMETERS:  Parser_state        - Current parser state object *              Arg_type            - The argument type (AML_*_ARG) *              Arg_count           - If the argument points to a control method *                                    the method's argument is returned here. * * RETURN:      An op object containing the next argument. * * DESCRIPTION: Get next argument (including complex list arguments that require *              pushing the parser stack) * ******************************************************************************/ACPI_PARSE_OBJECT *acpi_ps_get_next_arg (	ACPI_PARSE_STATE        *parser_state,	u32                     arg_type,	u32                     *arg_count){	ACPI_PARSE_OBJECT       *arg = NULL;	ACPI_PARSE_OBJECT       *prev = NULL;	ACPI_PARSE_OBJECT       *field;	u32                     subop;	switch (arg_type)	{	case ARGP_BYTEDATA:	case ARGP_WORDDATA:	case ARGP_DWORDDATA:	case ARGP_CHARLIST:	case ARGP_NAME:	case ARGP_NAMESTRING:		/* constants, strings, and namestrings are all the same size */		arg = acpi_ps_alloc_op (AML_BYTE_OP);		if (arg) {			acpi_ps_get_next_simple_arg (parser_state, arg_type, arg);		}		break;	case ARGP_PKGLENGTH:		/* package length, nothing returned */		parser_state->pkg_end = acpi_ps_get_next_package_end (parser_state);		break;	case ARGP_FIELDLIST:		if (parser_state->aml < parser_state->pkg_end) {			/* non-empty list */			while (parser_state->aml < parser_state->pkg_end) {				field = acpi_ps_get_next_field (parser_state);				if (!field) {					break;				}				if (prev) {					prev->next = field;				}				else {					arg = field;				}				prev = field;			}			/* skip to End of byte data */			parser_state->aml = parser_state->pkg_end;		}		break;	case ARGP_BYTELIST:		if (parser_state->aml < parser_state->pkg_end) {			/* non-empty list */			arg = acpi_ps_alloc_op (AML_BYTELIST_OP);			if (arg) {				/* fill in bytelist data */				arg->value.size = (parser_state->pkg_end - parser_state->aml);				((ACPI_PARSE2_OBJECT *) arg)->data = parser_state->aml;			}			/* skip to End of byte data */			parser_state->aml = parser_state->pkg_end;		}		break;	case ARGP_TARGET:	case ARGP_SUPERNAME:		{			subop = acpi_ps_peek_opcode (parser_state);			if (subop == 0              ||				acpi_ps_is_leading_char (subop) ||				acpi_ps_is_prefix_char (subop))			{				/* Null_name or Name_string */				arg = acpi_ps_alloc_op (AML_NAMEPATH_OP);				if (arg) {					acpi_ps_get_next_namepath (parser_state, arg, arg_count, 0);				}			}			else {				/* single complex argument, nothing returned */				*arg_count = 1;			}		}		break;	case ARGP_DATAOBJ:	case ARGP_TERMARG:		/* single complex argument, nothing returned */		*arg_count = 1;		break;	case ARGP_DATAOBJLIST:	case ARGP_TERMLIST:	case ARGP_OBJLIST:		if (parser_state->aml < parser_state->pkg_end) {			/* non-empty list of variable arguments, nothing returned */			*arg_count = ACPI_VAR_ARGS;		}		break;	}	return (arg);}

⌨️ 快捷键说明

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