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

📄 exmisc.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		new_buf = (char *)return_desc->buffer.pointer;		/* Concatenate the buffers */		ACPI_MEMCPY(new_buf, operand0->buffer.pointer,			    operand0->buffer.length);		ACPI_MEMCPY(new_buf + operand0->buffer.length,			    local_operand1->buffer.pointer,			    local_operand1->buffer.length);		break;	default:		/* Invalid object type, should not happen here */		ACPI_ERROR((AE_INFO, "Invalid object type: %X",			    ACPI_GET_OBJECT_TYPE(operand0)));		status = AE_AML_INTERNAL;		goto cleanup;	}	*actual_return_desc = return_desc;      cleanup:	if (local_operand1 != operand1) {		acpi_ut_remove_reference(local_operand1);	}	return_ACPI_STATUS(status);}/******************************************************************************* * * FUNCTION:    acpi_ex_do_math_op * * PARAMETERS:  Opcode              - AML opcode *              Integer0            - Integer operand #0 *              Integer1            - Integer operand #1 * * RETURN:      Integer result of the operation * * DESCRIPTION: Execute a math AML opcode. The purpose of having all of the *              math functions here is to prevent a lot of pointer dereferencing *              to obtain the operands. * ******************************************************************************/acpi_integeracpi_ex_do_math_op(u16 opcode, acpi_integer integer0, acpi_integer integer1){	ACPI_FUNCTION_ENTRY();	switch (opcode) {	case AML_ADD_OP:	/* Add (Integer0, Integer1, Result) */		return (integer0 + integer1);	case AML_BIT_AND_OP:	/* And (Integer0, Integer1, Result) */		return (integer0 & integer1);	case AML_BIT_NAND_OP:	/* NAnd (Integer0, Integer1, Result) */		return (~(integer0 & integer1));	case AML_BIT_OR_OP:	/* Or (Integer0, Integer1, Result) */		return (integer0 | integer1);	case AML_BIT_NOR_OP:	/* NOr (Integer0, Integer1, Result) */		return (~(integer0 | integer1));	case AML_BIT_XOR_OP:	/* XOr (Integer0, Integer1, Result) */		return (integer0 ^ integer1);	case AML_MULTIPLY_OP:	/* Multiply (Integer0, Integer1, Result) */		return (integer0 * integer1);	case AML_SHIFT_LEFT_OP:	/* shift_left (Operand, shift_count, Result) */		/*		 * We need to check if the shiftcount is larger than the integer bit		 * width since the behavior of this is not well-defined in the C language.		 */		if (integer1 >= acpi_gbl_integer_bit_width) {			return (0);		}		return (integer0 << integer1);	case AML_SHIFT_RIGHT_OP:	/* shift_right (Operand, shift_count, Result) */		/*		 * We need to check if the shiftcount is larger than the integer bit		 * width since the behavior of this is not well-defined in the C language.		 */		if (integer1 >= acpi_gbl_integer_bit_width) {			return (0);		}		return (integer0 >> integer1);	case AML_SUBTRACT_OP:	/* Subtract (Integer0, Integer1, Result) */		return (integer0 - integer1);	default:		return (0);	}}/******************************************************************************* * * FUNCTION:    acpi_ex_do_logical_numeric_op * * PARAMETERS:  Opcode              - AML opcode *              Integer0            - Integer operand #0 *              Integer1            - Integer operand #1 *              logical_result      - TRUE/FALSE result of the operation * * RETURN:      Status * * DESCRIPTION: Execute a logical "Numeric" AML opcode. For these Numeric *              operators (LAnd and LOr), both operands must be integers. * *              Note: cleanest machine code seems to be produced by the code *              below, rather than using statements of the form: *                  Result = (Integer0 && Integer1); * ******************************************************************************/acpi_statusacpi_ex_do_logical_numeric_op(u16 opcode,			      acpi_integer integer0,			      acpi_integer integer1, u8 * logical_result){	acpi_status status = AE_OK;	u8 local_result = FALSE;	ACPI_FUNCTION_TRACE(ex_do_logical_numeric_op);	switch (opcode) {	case AML_LAND_OP:	/* LAnd (Integer0, Integer1) */		if (integer0 && integer1) {			local_result = TRUE;		}		break;	case AML_LOR_OP:	/* LOr (Integer0, Integer1) */		if (integer0 || integer1) {			local_result = TRUE;		}		break;	default:		status = AE_AML_INTERNAL;		break;	}	/* Return the logical result and status */	*logical_result = local_result;	return_ACPI_STATUS(status);}/******************************************************************************* * * FUNCTION:    acpi_ex_do_logical_op * * PARAMETERS:  Opcode              - AML opcode *              Operand0            - operand #0 *              Operand1            - operand #1 *              logical_result      - TRUE/FALSE result of the operation * * RETURN:      Status * * DESCRIPTION: Execute a logical AML opcode. The purpose of having all of the *              functions here is to prevent a lot of pointer dereferencing *              to obtain the operands and to simplify the generation of the *              logical value. For the Numeric operators (LAnd and LOr), both *              operands must be integers. For the other logical operators, *              operands can be any combination of Integer/String/Buffer. The *              first operand determines the type to which the second operand *              will be converted. * *              Note: cleanest machine code seems to be produced by the code *              below, rather than using statements of the form: *                  Result = (Operand0 == Operand1); * ******************************************************************************/acpi_statusacpi_ex_do_logical_op(u16 opcode,		      union acpi_operand_object *operand0,		      union acpi_operand_object *operand1, u8 * logical_result){	union acpi_operand_object *local_operand1 = operand1;	acpi_integer integer0;	acpi_integer integer1;	u32 length0;	u32 length1;	acpi_status status = AE_OK;	u8 local_result = FALSE;	int compare;	ACPI_FUNCTION_TRACE(ex_do_logical_op);	/*	 * Convert the second operand if necessary.  The first operand	 * determines the type of the second operand, (See the Data Types	 * section of the ACPI 3.0+ specification.)  Both object types are	 * guaranteed to be either Integer/String/Buffer by the operand	 * resolution mechanism.	 */	switch (ACPI_GET_OBJECT_TYPE(operand0)) {	case ACPI_TYPE_INTEGER:		status =		    acpi_ex_convert_to_integer(operand1, &local_operand1, 16);		break;	case ACPI_TYPE_STRING:		status = acpi_ex_convert_to_string(operand1, &local_operand1,						   ACPI_IMPLICIT_CONVERT_HEX);		break;	case ACPI_TYPE_BUFFER:		status = acpi_ex_convert_to_buffer(operand1, &local_operand1);		break;	default:		status = AE_AML_INTERNAL;		break;	}	if (ACPI_FAILURE(status)) {		goto cleanup;	}	/*	 * Two cases: 1) Both Integers, 2) Both Strings or Buffers	 */	if (ACPI_GET_OBJECT_TYPE(operand0) == ACPI_TYPE_INTEGER) {		/*		 * 1) Both operands are of type integer		 *    Note: local_operand1 may have changed above		 */		integer0 = operand0->integer.value;		integer1 = local_operand1->integer.value;		switch (opcode) {		case AML_LEQUAL_OP:	/* LEqual (Operand0, Operand1) */			if (integer0 == integer1) {				local_result = TRUE;			}			break;		case AML_LGREATER_OP:	/* LGreater (Operand0, Operand1) */			if (integer0 > integer1) {				local_result = TRUE;			}			break;		case AML_LLESS_OP:	/* LLess (Operand0, Operand1) */			if (integer0 < integer1) {				local_result = TRUE;			}			break;		default:			status = AE_AML_INTERNAL;			break;		}	} else {		/*		 * 2) Both operands are Strings or both are Buffers		 *    Note: Code below takes advantage of common Buffer/String		 *          object fields. local_operand1 may have changed above. Use		 *          memcmp to handle nulls in buffers.		 */		length0 = operand0->buffer.length;		length1 = local_operand1->buffer.length;		/* Lexicographic compare: compare the data bytes */		compare = ACPI_MEMCMP(operand0->buffer.pointer,				      local_operand1->buffer.pointer,				      (length0 > length1) ? length1 : length0);		switch (opcode) {		case AML_LEQUAL_OP:	/* LEqual (Operand0, Operand1) */			/* Length and all bytes must be equal */			if ((length0 == length1) && (compare == 0)) {				/* Length and all bytes match ==> TRUE */				local_result = TRUE;			}			break;		case AML_LGREATER_OP:	/* LGreater (Operand0, Operand1) */			if (compare > 0) {				local_result = TRUE;				goto cleanup;	/* TRUE */			}			if (compare < 0) {				goto cleanup;	/* FALSE */			}			/* Bytes match (to shortest length), compare lengths */			if (length0 > length1) {				local_result = TRUE;			}			break;		case AML_LLESS_OP:	/* LLess (Operand0, Operand1) */			if (compare > 0) {				goto cleanup;	/* FALSE */			}			if (compare < 0) {				local_result = TRUE;				goto cleanup;	/* TRUE */			}			/* Bytes match (to shortest length), compare lengths */			if (length0 < length1) {				local_result = TRUE;			}			break;		default:			status = AE_AML_INTERNAL;			break;		}	}      cleanup:	/* New object was created if implicit conversion performed - delete */	if (local_operand1 != operand1) {		acpi_ut_remove_reference(local_operand1);	}	/* Return the logical result and status */	*logical_result = local_result;	return_ACPI_STATUS(status);}

⌨️ 快捷键说明

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