mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 04:01:48 -04:00
Merge branch 'acpica' into linux-next
* acpica: (22 commits) ACPI: Set length even for TYPE_END_TAG acpi resource ACPICA: Update version to 20130214 ACPICA: Object repair: Allow 0-length packages for variable-length packages ACPICA: Disassembler: Add warnings for unresolved control methods ACPICA: Return object repair: Add resource template repairs ACPICA: Return object repair: Add string-to-unicode conversion ACPICA: Split object conversion functions to a new file ACPICA: Add mechanism for early object repairs on a per-name basis ACPICA: Remove trailing comma in enum declarations ACPICA: Add exception descriptions to exception info table ACPICA: Add macros to exception code definitions ACPICA: Regression fix: reinstate safe exit macros ACPICA: Update for ACPI 5 hardware-reduced feature ACPICA: Add parens within macros around parameter names ACPICA: Add macros to access pointer to next object in the descriptor list ACPICA: Update error/debug messages for fixed events ACPICA: Fix a long-standing bug in local cache ACPICA: iASL/Disassembler: Add support for MTMR table ACPICA: iASL/Disassembler: Add support for VRTC table ACPICA: Update RASF table definition ...
This commit is contained in:
commit
6912897d75
39 changed files with 1235 additions and 618 deletions
|
|
@ -83,6 +83,7 @@ acpi-$(ACPI_FUTURE_USAGE) += hwtimer.o
|
|||
acpi-y += \
|
||||
nsaccess.o \
|
||||
nsalloc.o \
|
||||
nsconvert.o \
|
||||
nsdump.o \
|
||||
nseval.o \
|
||||
nsinit.o \
|
||||
|
|
|
|||
|
|
@ -413,10 +413,12 @@ ACPI_EXTERN u8 acpi_gbl_db_output_flags;
|
|||
|
||||
#ifdef ACPI_DISASSEMBLER
|
||||
|
||||
u8 ACPI_INIT_GLOBAL(acpi_gbl_ignore_noop_operator, FALSE);
|
||||
ACPI_EXTERN u8 ACPI_INIT_GLOBAL(acpi_gbl_ignore_noop_operator, FALSE);
|
||||
|
||||
ACPI_EXTERN u8 acpi_gbl_db_opt_disasm;
|
||||
ACPI_EXTERN u8 acpi_gbl_db_opt_verbose;
|
||||
ACPI_EXTERN u8 acpi_gbl_num_external_methods;
|
||||
ACPI_EXTERN u32 acpi_gbl_resolved_external_methods;
|
||||
ACPI_EXTERN struct acpi_external_list *acpi_gbl_external_list;
|
||||
ACPI_EXTERN struct acpi_external_file *acpi_gbl_external_file_list;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -363,6 +363,7 @@ struct acpi_predefined_data {
|
|||
union acpi_operand_object *parent_package;
|
||||
struct acpi_namespace_node *node;
|
||||
u32 flags;
|
||||
u32 return_btype;
|
||||
u8 node_flags;
|
||||
};
|
||||
|
||||
|
|
@ -371,6 +372,20 @@ struct acpi_predefined_data {
|
|||
#define ACPI_OBJECT_REPAIRED 1
|
||||
#define ACPI_OBJECT_WRAPPED 2
|
||||
|
||||
/* Return object auto-repair info */
|
||||
|
||||
typedef acpi_status(*acpi_object_converter) (union acpi_operand_object
|
||||
*original_object,
|
||||
union acpi_operand_object
|
||||
**converted_object);
|
||||
|
||||
struct acpi_simple_repair_info {
|
||||
char name[ACPI_NAME_SIZE];
|
||||
u32 unexpected_btypes;
|
||||
u32 package_index;
|
||||
acpi_object_converter object_converter;
|
||||
};
|
||||
|
||||
/*
|
||||
* Bitmapped return value types
|
||||
* Note: the actual data types must be contiguous, a loop in nspredef.c
|
||||
|
|
@ -1037,6 +1052,7 @@ struct acpi_external_list {
|
|||
u16 length;
|
||||
u8 type;
|
||||
u8 flags;
|
||||
u8 resolved;
|
||||
};
|
||||
|
||||
/* Values for Flags field above */
|
||||
|
|
|
|||
|
|
@ -322,10 +322,12 @@
|
|||
* where a pointer to an object of type union acpi_operand_object can also
|
||||
* appear. This macro is used to distinguish them.
|
||||
*
|
||||
* The "Descriptor" field is the first field in both structures.
|
||||
* The "DescriptorType" field is the second field in both structures.
|
||||
*/
|
||||
#define ACPI_GET_DESCRIPTOR_PTR(d) (((union acpi_descriptor *)(void *)(d))->common.common_pointer)
|
||||
#define ACPI_SET_DESCRIPTOR_PTR(d, p) (((union acpi_descriptor *)(void *)(d))->common.common_pointer = (p))
|
||||
#define ACPI_GET_DESCRIPTOR_TYPE(d) (((union acpi_descriptor *)(void *)(d))->common.descriptor_type)
|
||||
#define ACPI_SET_DESCRIPTOR_TYPE(d, t) (((union acpi_descriptor *)(void *)(d))->common.descriptor_type = t)
|
||||
#define ACPI_SET_DESCRIPTOR_TYPE(d, t) (((union acpi_descriptor *)(void *)(d))->common.descriptor_type = (t))
|
||||
|
||||
/*
|
||||
* Macros for the master AML opcode table
|
||||
|
|
|
|||
|
|
@ -166,6 +166,29 @@ void acpi_ns_delete_children(struct acpi_namespace_node *parent);
|
|||
|
||||
int acpi_ns_compare_names(char *name1, char *name2);
|
||||
|
||||
/*
|
||||
* nsconvert - Dynamic object conversion routines
|
||||
*/
|
||||
acpi_status
|
||||
acpi_ns_convert_to_integer(union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **return_object);
|
||||
|
||||
acpi_status
|
||||
acpi_ns_convert_to_string(union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **return_object);
|
||||
|
||||
acpi_status
|
||||
acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **return_object);
|
||||
|
||||
acpi_status
|
||||
acpi_ns_convert_to_unicode(union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **return_object);
|
||||
|
||||
acpi_status
|
||||
acpi_ns_convert_to_resource(union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **return_object);
|
||||
|
||||
/*
|
||||
* nsdump - Namespace dump/print utilities
|
||||
*/
|
||||
|
|
@ -289,7 +312,7 @@ acpi_ns_get_attached_data(struct acpi_namespace_node *node,
|
|||
* predefined methods/objects
|
||||
*/
|
||||
acpi_status
|
||||
acpi_ns_repair_object(struct acpi_predefined_data *data,
|
||||
acpi_ns_simple_repair(struct acpi_predefined_data *data,
|
||||
u32 expected_btypes,
|
||||
u32 package_index,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
|
|
|
|||
|
|
@ -483,7 +483,8 @@ acpi_ut_short_divide(u64 in_dividend,
|
|||
/*
|
||||
* utmisc
|
||||
*/
|
||||
const char *acpi_ut_validate_exception(acpi_status status);
|
||||
const struct acpi_exception_info *acpi_ut_validate_exception(acpi_status
|
||||
status);
|
||||
|
||||
u8 acpi_ut_is_pci_root_bridge(char *id);
|
||||
|
||||
|
|
|
|||
|
|
@ -178,7 +178,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
|
|||
|
||||
if (!op) {
|
||||
ACPI_ERROR((AE_INFO, "Null Op"));
|
||||
return_VALUE(TRUE);
|
||||
return_UINT8(TRUE);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -210,7 +210,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
|
|||
"At Method level, result of [%s] not used\n",
|
||||
acpi_ps_get_opcode_name(op->common.
|
||||
aml_opcode)));
|
||||
return_VALUE(FALSE);
|
||||
return_UINT8(FALSE);
|
||||
}
|
||||
|
||||
/* Get info on the parent. The root_op is AML_SCOPE */
|
||||
|
|
@ -219,7 +219,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
|
|||
acpi_ps_get_opcode_info(op->common.parent->common.aml_opcode);
|
||||
if (parent_info->class == AML_CLASS_UNKNOWN) {
|
||||
ACPI_ERROR((AE_INFO, "Unknown parent opcode Op=%p", op));
|
||||
return_VALUE(FALSE);
|
||||
return_UINT8(FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -307,7 +307,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
|
|||
acpi_ps_get_opcode_name(op->common.parent->common.
|
||||
aml_opcode), op));
|
||||
|
||||
return_VALUE(TRUE);
|
||||
return_UINT8(TRUE);
|
||||
|
||||
result_not_used:
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
|
||||
|
|
@ -316,7 +316,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
|
|||
acpi_ps_get_opcode_name(op->common.parent->common.
|
||||
aml_opcode), op));
|
||||
|
||||
return_VALUE(FALSE);
|
||||
return_UINT8(FALSE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
|
|||
|
|
@ -257,6 +257,8 @@ u32 acpi_ev_fixed_event_detect(void)
|
|||
*
|
||||
* DESCRIPTION: Clears the status bit for the requested event, calls the
|
||||
* handler that previously registered for the event.
|
||||
* NOTE: If there is no handler for the event, the event is
|
||||
* disabled to prevent futher interrupts.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
|
@ -271,17 +273,17 @@ static u32 acpi_ev_fixed_event_dispatch(u32 event)
|
|||
status_register_id, ACPI_CLEAR_STATUS);
|
||||
|
||||
/*
|
||||
* Make sure we've got a handler. If not, report an error. The event is
|
||||
* disabled to prevent further interrupts.
|
||||
* Make sure that a handler exists. If not, report an error
|
||||
* and disable the event to prevent further interrupts.
|
||||
*/
|
||||
if (NULL == acpi_gbl_fixed_event_handlers[event].handler) {
|
||||
if (!acpi_gbl_fixed_event_handlers[event].handler) {
|
||||
(void)acpi_write_bit_register(acpi_gbl_fixed_event_info[event].
|
||||
enable_register_id,
|
||||
ACPI_DISABLE_EVENT);
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"No installed handler for fixed event [0x%08X]",
|
||||
event));
|
||||
"No installed handler for fixed event - %s (%u), disabling",
|
||||
acpi_ut_get_event_name(event), event));
|
||||
|
||||
return (ACPI_INTERRUPT_NOT_HANDLED);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -707,7 +707,7 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device,
|
|||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"Unable to clear GPE%02X", gpe_number));
|
||||
return_VALUE(ACPI_INTERRUPT_NOT_HANDLED);
|
||||
return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -724,7 +724,7 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device,
|
|||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"Unable to disable GPE%02X", gpe_number));
|
||||
return_VALUE(ACPI_INTERRUPT_NOT_HANDLED);
|
||||
return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -784,7 +784,7 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device,
|
|||
break;
|
||||
}
|
||||
|
||||
return_VALUE(ACPI_INTERRUPT_HANDLED);
|
||||
return_UINT32(ACPI_INTERRUPT_HANDLED);
|
||||
}
|
||||
|
||||
#endif /* !ACPI_REDUCED_HARDWARE */
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ static u32 ACPI_SYSTEM_XFACE acpi_ev_sci_xrupt_handler(void *context)
|
|||
*/
|
||||
interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list);
|
||||
|
||||
return_VALUE(interrupt_handled);
|
||||
return_UINT32(interrupt_handled);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
@ -120,7 +120,7 @@ u32 ACPI_SYSTEM_XFACE acpi_ev_gpe_xrupt_handler(void *context)
|
|||
|
||||
interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list);
|
||||
|
||||
return_VALUE(interrupt_handled);
|
||||
return_UINT32(interrupt_handled);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
|
|
|||
|
|
@ -467,9 +467,9 @@ acpi_install_fixed_event_handler(u32 event,
|
|||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Don't allow two handlers. */
|
||||
/* Do not allow multiple handlers */
|
||||
|
||||
if (NULL != acpi_gbl_fixed_event_handlers[event].handler) {
|
||||
if (acpi_gbl_fixed_event_handlers[event].handler) {
|
||||
status = AE_ALREADY_EXISTS;
|
||||
goto cleanup;
|
||||
}
|
||||
|
|
@ -483,8 +483,9 @@ acpi_install_fixed_event_handler(u32 event,
|
|||
if (ACPI_SUCCESS(status))
|
||||
status = acpi_enable_event(event, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_WARNING((AE_INFO, "Could not enable fixed event 0x%X",
|
||||
event));
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"Could not enable fixed event - %s (%u)",
|
||||
acpi_ut_get_event_name(event), event));
|
||||
|
||||
/* Remove the handler */
|
||||
|
||||
|
|
@ -492,7 +493,8 @@ acpi_install_fixed_event_handler(u32 event,
|
|||
acpi_gbl_fixed_event_handlers[event].context = NULL;
|
||||
} else {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Enabled fixed event %X, Handler=%p\n", event,
|
||||
"Enabled fixed event %s (%X), Handler=%p\n",
|
||||
acpi_ut_get_event_name(event), event,
|
||||
handler));
|
||||
}
|
||||
|
||||
|
|
@ -544,11 +546,12 @@ acpi_remove_fixed_event_handler(u32 event, acpi_event_handler handler)
|
|||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"Could not write to fixed event enable register 0x%X",
|
||||
event));
|
||||
"Could not disable fixed event - %s (%u)",
|
||||
acpi_ut_get_event_name(event), event));
|
||||
} else {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Disabled fixed event %X\n",
|
||||
event));
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Disabled fixed event - %s (%X)\n",
|
||||
acpi_ut_get_event_name(event), event));
|
||||
}
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
||||
|
|
|
|||
|
|
@ -74,6 +74,12 @@ acpi_status acpi_enable(void)
|
|||
return_ACPI_STATUS(AE_NO_ACPI_TABLES);
|
||||
}
|
||||
|
||||
/* If the Hardware Reduced flag is set, machine is always in acpi mode */
|
||||
|
||||
if (acpi_gbl_reduced_hardware) {
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/* Check current mode */
|
||||
|
||||
if (acpi_hw_get_mode() == ACPI_SYS_MODE_ACPI) {
|
||||
|
|
@ -126,6 +132,12 @@ acpi_status acpi_disable(void)
|
|||
|
||||
ACPI_FUNCTION_TRACE(acpi_disable);
|
||||
|
||||
/* If the Hardware Reduced flag is set, machine is always in acpi mode */
|
||||
|
||||
if (acpi_gbl_reduced_hardware) {
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
if (acpi_hw_get_mode() == ACPI_SYS_MODE_LEGACY) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INIT,
|
||||
"System is already in legacy (non-ACPI) mode\n"));
|
||||
|
|
|
|||
|
|
@ -276,7 +276,7 @@ acpi_ex_decode_field_access(union acpi_operand_object *obj_desc,
|
|||
/* Invalid field access type */
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Unknown field access type 0x%X", access));
|
||||
return_VALUE(0);
|
||||
return_UINT32(0);
|
||||
}
|
||||
|
||||
if (obj_desc->common.type == ACPI_TYPE_BUFFER_FIELD) {
|
||||
|
|
@ -289,7 +289,7 @@ acpi_ex_decode_field_access(union acpi_operand_object *obj_desc,
|
|||
}
|
||||
|
||||
*return_byte_alignment = byte_alignment;
|
||||
return_VALUE(bit_length);
|
||||
return_UINT32(bit_length);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
|
|||
|
|
@ -340,7 +340,7 @@ static u32 acpi_ex_digits_needed(u64 value, u32 base)
|
|||
/* u64 is unsigned, so we don't worry about a '-' prefix */
|
||||
|
||||
if (value == 0) {
|
||||
return_VALUE(1);
|
||||
return_UINT32(1);
|
||||
}
|
||||
|
||||
current_value = value;
|
||||
|
|
@ -354,7 +354,7 @@ static u32 acpi_ex_digits_needed(u64 value, u32 base)
|
|||
num_digits++;
|
||||
}
|
||||
|
||||
return_VALUE(num_digits);
|
||||
return_UINT32(num_digits);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
|
|||
|
|
@ -66,6 +66,12 @@ acpi_status acpi_hw_set_mode(u32 mode)
|
|||
|
||||
ACPI_FUNCTION_TRACE(hw_set_mode);
|
||||
|
||||
/* If the Hardware Reduced flag is set, machine is always in acpi mode */
|
||||
|
||||
if (acpi_gbl_reduced_hardware) {
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
* ACPI 2.0 clarified that if SMI_CMD in FADT is zero,
|
||||
* system does not support mode transition.
|
||||
|
|
@ -146,23 +152,29 @@ u32 acpi_hw_get_mode(void)
|
|||
|
||||
ACPI_FUNCTION_TRACE(hw_get_mode);
|
||||
|
||||
/* If the Hardware Reduced flag is set, machine is always in acpi mode */
|
||||
|
||||
if (acpi_gbl_reduced_hardware) {
|
||||
return_UINT32(ACPI_SYS_MODE_ACPI);
|
||||
}
|
||||
|
||||
/*
|
||||
* ACPI 2.0 clarified that if SMI_CMD in FADT is zero,
|
||||
* system does not support mode transition.
|
||||
*/
|
||||
if (!acpi_gbl_FADT.smi_command) {
|
||||
return_VALUE(ACPI_SYS_MODE_ACPI);
|
||||
return_UINT32(ACPI_SYS_MODE_ACPI);
|
||||
}
|
||||
|
||||
status = acpi_read_bit_register(ACPI_BITREG_SCI_ENABLE, &value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_VALUE(ACPI_SYS_MODE_LEGACY);
|
||||
return_UINT32(ACPI_SYS_MODE_LEGACY);
|
||||
}
|
||||
|
||||
if (value) {
|
||||
return_VALUE(ACPI_SYS_MODE_ACPI);
|
||||
return_UINT32(ACPI_SYS_MODE_ACPI);
|
||||
} else {
|
||||
return_VALUE(ACPI_SYS_MODE_LEGACY);
|
||||
return_UINT32(ACPI_SYS_MODE_LEGACY);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
443
drivers/acpi/acpica/nsconvert.c
Normal file
443
drivers/acpi/acpica/nsconvert.c
Normal file
|
|
@ -0,0 +1,443 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Module Name: nsconvert - Object conversions for objects returned by
|
||||
* predefined methods
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2013, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acinterp.h"
|
||||
#include "acpredef.h"
|
||||
#include "amlresrc.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsconvert")
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_convert_to_integer
|
||||
*
|
||||
* PARAMETERS: original_object - Object to be converted
|
||||
* return_object - Where the new converted object is returned
|
||||
*
|
||||
* RETURN: Status. AE_OK if conversion was successful.
|
||||
*
|
||||
* DESCRIPTION: Attempt to convert a String/Buffer object to an Integer.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status
|
||||
acpi_ns_convert_to_integer(union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **return_object)
|
||||
{
|
||||
union acpi_operand_object *new_object;
|
||||
acpi_status status;
|
||||
u64 value = 0;
|
||||
u32 i;
|
||||
|
||||
switch (original_object->common.type) {
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
/* String-to-Integer conversion */
|
||||
|
||||
status = acpi_ut_strtoul64(original_object->string.pointer,
|
||||
ACPI_ANY_BASE, &value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
/* Buffer-to-Integer conversion. Max buffer size is 64 bits. */
|
||||
|
||||
if (original_object->buffer.length > 8) {
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
/* Extract each buffer byte to create the integer */
|
||||
|
||||
for (i = 0; i < original_object->buffer.length; i++) {
|
||||
value |=
|
||||
((u64)original_object->buffer.
|
||||
pointer[i] << (i * 8));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
new_object = acpi_ut_create_integer_object(value);
|
||||
if (!new_object) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
*return_object = new_object;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_convert_to_string
|
||||
*
|
||||
* PARAMETERS: original_object - Object to be converted
|
||||
* return_object - Where the new converted object is returned
|
||||
*
|
||||
* RETURN: Status. AE_OK if conversion was successful.
|
||||
*
|
||||
* DESCRIPTION: Attempt to convert a Integer/Buffer object to a String.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ns_convert_to_string(union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **return_object)
|
||||
{
|
||||
union acpi_operand_object *new_object;
|
||||
acpi_size length;
|
||||
acpi_status status;
|
||||
|
||||
switch (original_object->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
/*
|
||||
* Integer-to-String conversion. Commonly, convert
|
||||
* an integer of value 0 to a NULL string. The last element of
|
||||
* _BIF and _BIX packages occasionally need this fix.
|
||||
*/
|
||||
if (original_object->integer.value == 0) {
|
||||
|
||||
/* Allocate a new NULL string object */
|
||||
|
||||
new_object = acpi_ut_create_string_object(0);
|
||||
if (!new_object) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
} else {
|
||||
status =
|
||||
acpi_ex_convert_to_string(original_object,
|
||||
&new_object,
|
||||
ACPI_IMPLICIT_CONVERT_HEX);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
/*
|
||||
* Buffer-to-String conversion. Use a to_string
|
||||
* conversion, no transform performed on the buffer data. The best
|
||||
* example of this is the _BIF method, where the string data from
|
||||
* the battery is often (incorrectly) returned as buffer object(s).
|
||||
*/
|
||||
length = 0;
|
||||
while ((length < original_object->buffer.length) &&
|
||||
(original_object->buffer.pointer[length])) {
|
||||
length++;
|
||||
}
|
||||
|
||||
/* Allocate a new string object */
|
||||
|
||||
new_object = acpi_ut_create_string_object(length);
|
||||
if (!new_object) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy the raw buffer data with no transform. String is already NULL
|
||||
* terminated at Length+1.
|
||||
*/
|
||||
ACPI_MEMCPY(new_object->string.pointer,
|
||||
original_object->buffer.pointer, length);
|
||||
break;
|
||||
|
||||
default:
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
*return_object = new_object;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_convert_to_buffer
|
||||
*
|
||||
* PARAMETERS: original_object - Object to be converted
|
||||
* return_object - Where the new converted object is returned
|
||||
*
|
||||
* RETURN: Status. AE_OK if conversion was successful.
|
||||
*
|
||||
* DESCRIPTION: Attempt to convert a Integer/String/Package object to a Buffer.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **return_object)
|
||||
{
|
||||
union acpi_operand_object *new_object;
|
||||
acpi_status status;
|
||||
union acpi_operand_object **elements;
|
||||
u32 *dword_buffer;
|
||||
u32 count;
|
||||
u32 i;
|
||||
|
||||
switch (original_object->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
/*
|
||||
* Integer-to-Buffer conversion.
|
||||
* Convert the Integer to a packed-byte buffer. _MAT and other
|
||||
* objects need this sometimes, if a read has been performed on a
|
||||
* Field object that is less than or equal to the global integer
|
||||
* size (32 or 64 bits).
|
||||
*/
|
||||
status =
|
||||
acpi_ex_convert_to_buffer(original_object, &new_object);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
/* String-to-Buffer conversion. Simple data copy */
|
||||
|
||||
new_object =
|
||||
acpi_ut_create_buffer_object(original_object->string.
|
||||
length);
|
||||
if (!new_object) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
ACPI_MEMCPY(new_object->buffer.pointer,
|
||||
original_object->string.pointer,
|
||||
original_object->string.length);
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_PACKAGE:
|
||||
/*
|
||||
* This case is often seen for predefined names that must return a
|
||||
* Buffer object with multiple DWORD integers within. For example,
|
||||
* _FDE and _GTM. The Package can be converted to a Buffer.
|
||||
*/
|
||||
|
||||
/* All elements of the Package must be integers */
|
||||
|
||||
elements = original_object->package.elements;
|
||||
count = original_object->package.count;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if ((!*elements) ||
|
||||
((*elements)->common.type != ACPI_TYPE_INTEGER)) {
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
elements++;
|
||||
}
|
||||
|
||||
/* Create the new buffer object to replace the Package */
|
||||
|
||||
new_object = acpi_ut_create_buffer_object(ACPI_MUL_4(count));
|
||||
if (!new_object) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/* Copy the package elements (integers) to the buffer as DWORDs */
|
||||
|
||||
elements = original_object->package.elements;
|
||||
dword_buffer = ACPI_CAST_PTR(u32, new_object->buffer.pointer);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
*dword_buffer = (u32)(*elements)->integer.value;
|
||||
dword_buffer++;
|
||||
elements++;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
*return_object = new_object;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_convert_to_unicode
|
||||
*
|
||||
* PARAMETERS: original_object - ASCII String Object to be converted
|
||||
* return_object - Where the new converted object is returned
|
||||
*
|
||||
* RETURN: Status. AE_OK if conversion was successful.
|
||||
*
|
||||
* DESCRIPTION: Attempt to convert a String object to a Unicode string Buffer.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ns_convert_to_unicode(union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **return_object)
|
||||
{
|
||||
union acpi_operand_object *new_object;
|
||||
char *ascii_string;
|
||||
u16 *unicode_buffer;
|
||||
u32 unicode_length;
|
||||
u32 i;
|
||||
|
||||
if (!original_object) {
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/* If a Buffer was returned, it must be at least two bytes long */
|
||||
|
||||
if (original_object->common.type == ACPI_TYPE_BUFFER) {
|
||||
if (original_object->buffer.length < 2) {
|
||||
return (AE_AML_OPERAND_VALUE);
|
||||
}
|
||||
|
||||
*return_object = NULL;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
* The original object is an ASCII string. Convert this string to
|
||||
* a unicode buffer.
|
||||
*/
|
||||
ascii_string = original_object->string.pointer;
|
||||
unicode_length = (original_object->string.length * 2) + 2;
|
||||
|
||||
/* Create a new buffer object for the Unicode data */
|
||||
|
||||
new_object = acpi_ut_create_buffer_object(unicode_length);
|
||||
if (!new_object) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
unicode_buffer = ACPI_CAST_PTR(u16, new_object->buffer.pointer);
|
||||
|
||||
/* Convert ASCII to Unicode */
|
||||
|
||||
for (i = 0; i < original_object->string.length; i++) {
|
||||
unicode_buffer[i] = (u16)ascii_string[i];
|
||||
}
|
||||
|
||||
*return_object = new_object;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_convert_to_resource
|
||||
*
|
||||
* PARAMETERS: original_object - Object to be converted
|
||||
* return_object - Where the new converted object is returned
|
||||
*
|
||||
* RETURN: Status. AE_OK if conversion was successful
|
||||
*
|
||||
* DESCRIPTION: Attempt to convert a Integer object to a resource_template
|
||||
* Buffer.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ns_convert_to_resource(union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **return_object)
|
||||
{
|
||||
union acpi_operand_object *new_object;
|
||||
u8 *buffer;
|
||||
|
||||
/*
|
||||
* We can fix the following cases for an expected resource template:
|
||||
* 1. No return value (interpreter slack mode is disabled)
|
||||
* 2. A "Return (Zero)" statement
|
||||
* 3. A "Return empty buffer" statement
|
||||
*
|
||||
* We will return a buffer containing a single end_tag
|
||||
* resource descriptor.
|
||||
*/
|
||||
if (original_object) {
|
||||
switch (original_object->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
/* We can only repair an Integer==0 */
|
||||
|
||||
if (original_object->integer.value) {
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
if (original_object->buffer.length) {
|
||||
|
||||
/* Additional checks can be added in the future */
|
||||
|
||||
*return_object = NULL;
|
||||
return (AE_OK);
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
default:
|
||||
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
}
|
||||
|
||||
/* Create the new buffer object for the resource descriptor */
|
||||
|
||||
new_object = acpi_ut_create_buffer_object(2);
|
||||
if (!new_object) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
buffer = ACPI_CAST_PTR(u8, new_object->buffer.pointer);
|
||||
|
||||
/* Initialize the Buffer with a single end_tag descriptor */
|
||||
|
||||
buffer[0] = (ACPI_RESOURCE_NAME_END_TAG | ASL_RDESC_END_TAG_SIZE);
|
||||
buffer[1] = 0x00;
|
||||
|
||||
*return_object = new_object;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
|
@ -78,6 +78,8 @@ acpi_ns_check_reference(struct acpi_predefined_data *data,
|
|||
|
||||
static void acpi_ns_get_expected_types(char *buffer, u32 expected_btypes);
|
||||
|
||||
static u32 acpi_ns_get_bitmapped_type(union acpi_operand_object *return_object);
|
||||
|
||||
/*
|
||||
* Names for the types that can be returned by the predefined objects.
|
||||
* Used for warning messages. Must be in the same order as the ACPI_RTYPEs
|
||||
|
|
@ -112,7 +114,6 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
|||
acpi_status return_status,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
acpi_status status = AE_OK;
|
||||
const union acpi_predefined_info *predefined;
|
||||
char *pathname;
|
||||
|
|
@ -151,25 +152,6 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
/*
|
||||
* If there is no return value, check if we require a return value for
|
||||
* this predefined name. Either one return value is expected, or none,
|
||||
* for both methods and other objects.
|
||||
*
|
||||
* Exit now if there is no return object. Warning if one was expected.
|
||||
*/
|
||||
if (!return_object) {
|
||||
if ((predefined->info.expected_btypes) &&
|
||||
(!(predefined->info.expected_btypes & ACPI_RTYPE_NONE))) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"Missing expected return value"));
|
||||
|
||||
status = AE_AML_NO_RETURN_VALUE;
|
||||
}
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return value validation and possible repair.
|
||||
*
|
||||
|
|
@ -410,28 +392,12 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data,
|
|||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
acpi_status status = AE_OK;
|
||||
u32 return_btype;
|
||||
char type_buffer[48]; /* Room for 5 types */
|
||||
|
||||
/*
|
||||
* If we get a NULL return_object here, it is a NULL package element.
|
||||
* Since all extraneous NULL package elements were removed earlier by a
|
||||
* call to acpi_ns_remove_null_elements, this is an unexpected NULL element.
|
||||
* We will attempt to repair it.
|
||||
*/
|
||||
if (!return_object) {
|
||||
status = acpi_ns_repair_null_element(data, expected_btypes,
|
||||
package_index,
|
||||
return_object_ptr);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
return (AE_OK); /* Repair was successful */
|
||||
}
|
||||
goto type_error_exit;
|
||||
}
|
||||
|
||||
/* A Namespace node should not get here, but make sure */
|
||||
|
||||
if (ACPI_GET_DESCRIPTOR_TYPE(return_object) == ACPI_DESC_TYPE_NAMED) {
|
||||
if (return_object &&
|
||||
ACPI_GET_DESCRIPTOR_TYPE(return_object) == ACPI_DESC_TYPE_NAMED) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
"Invalid return type - Found a Namespace node [%4.4s] type %s",
|
||||
return_object->node.name.ascii,
|
||||
|
|
@ -448,53 +414,25 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data,
|
|||
* from all of the predefined names (including elements of returned
|
||||
* packages)
|
||||
*/
|
||||
switch (return_object->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
return_btype = ACPI_RTYPE_INTEGER;
|
||||
break;
|
||||
data->return_btype = acpi_ns_get_bitmapped_type(return_object);
|
||||
if (data->return_btype == ACPI_RTYPE_ANY) {
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
return_btype = ACPI_RTYPE_BUFFER;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
return_btype = ACPI_RTYPE_STRING;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_PACKAGE:
|
||||
return_btype = ACPI_RTYPE_PACKAGE;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_LOCAL_REFERENCE:
|
||||
return_btype = ACPI_RTYPE_REFERENCE;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Not one of the supported objects, must be incorrect */
|
||||
|
||||
goto type_error_exit;
|
||||
}
|
||||
|
||||
/* Is the object one of the expected types? */
|
||||
|
||||
if (return_btype & expected_btypes) {
|
||||
|
||||
/* For reference objects, check that the reference type is correct */
|
||||
|
||||
if (return_object->common.type == ACPI_TYPE_LOCAL_REFERENCE) {
|
||||
status = acpi_ns_check_reference(data, return_object);
|
||||
}
|
||||
/* For reference objects, check that the reference type is correct */
|
||||
|
||||
if ((data->return_btype & expected_btypes) == ACPI_RTYPE_REFERENCE) {
|
||||
status = acpi_ns_check_reference(data, return_object);
|
||||
return (status);
|
||||
}
|
||||
|
||||
/* Type mismatch -- attempt repair of the returned object */
|
||||
/* Attempt simple repair of the returned object if necessary */
|
||||
|
||||
status = acpi_ns_repair_object(data, expected_btypes,
|
||||
status = acpi_ns_simple_repair(data, expected_btypes,
|
||||
package_index, return_object_ptr);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
return (AE_OK); /* Repair was successful */
|
||||
}
|
||||
return (status);
|
||||
|
||||
type_error_exit:
|
||||
|
||||
|
|
@ -556,6 +494,61 @@ acpi_ns_check_reference(struct acpi_predefined_data *data,
|
|||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_get_bitmapped_type
|
||||
*
|
||||
* PARAMETERS: return_object - Object returned from method/obj evaluation
|
||||
*
|
||||
* RETURN: Object return type. ACPI_RTYPE_ANY indicates that the object
|
||||
* type is not supported. ACPI_RTYPE_NONE indicates that no
|
||||
* object was returned (return_object is NULL).
|
||||
*
|
||||
* DESCRIPTION: Convert object type into a bitmapped object return type.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static u32 acpi_ns_get_bitmapped_type(union acpi_operand_object *return_object)
|
||||
{
|
||||
u32 return_btype;
|
||||
|
||||
if (!return_object) {
|
||||
return (ACPI_RTYPE_NONE);
|
||||
}
|
||||
|
||||
/* Map acpi_object_type to internal bitmapped type */
|
||||
|
||||
switch (return_object->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
return_btype = ACPI_RTYPE_INTEGER;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
return_btype = ACPI_RTYPE_BUFFER;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
return_btype = ACPI_RTYPE_STRING;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_PACKAGE:
|
||||
return_btype = ACPI_RTYPE_PACKAGE;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_LOCAL_REFERENCE:
|
||||
return_btype = ACPI_RTYPE_REFERENCE;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Not one of the supported objects, must be incorrect */
|
||||
|
||||
return_btype = ACPI_RTYPE_ANY;
|
||||
break;
|
||||
}
|
||||
|
||||
return (return_btype);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_get_expected_types
|
||||
|
|
|
|||
|
|
@ -112,9 +112,15 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
elements = return_object->package.elements;
|
||||
count = return_object->package.count;
|
||||
|
||||
/* The package must have at least one element, else invalid */
|
||||
|
||||
/*
|
||||
* Most packages must have at least one element. The only exception
|
||||
* is the variable-length package (ACPI_PTYPE1_VAR).
|
||||
*/
|
||||
if (!count) {
|
||||
if (package->ret_info.type == ACPI_PTYPE1_VAR) {
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
"Return Package has no elements (empty)"));
|
||||
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@
|
|||
#include "acnamesp.h"
|
||||
#include "acinterp.h"
|
||||
#include "acpredef.h"
|
||||
#include "amlresrc.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsrepair")
|
||||
|
|
@ -71,6 +72,11 @@ ACPI_MODULE_NAME("nsrepair")
|
|||
* Buffer -> String
|
||||
* Buffer -> Package of Integers
|
||||
* Package -> Package of one Package
|
||||
*
|
||||
* Additional conversions that are available:
|
||||
* Convert a null return or zero return value to an end_tag descriptor
|
||||
* Convert an ASCII string to a Unicode buffer
|
||||
*
|
||||
* An incorrect standalone object is wrapped with required outer package
|
||||
*
|
||||
* Additional possible repairs:
|
||||
|
|
@ -78,21 +84,51 @@ ACPI_MODULE_NAME("nsrepair")
|
|||
*
|
||||
******************************************************************************/
|
||||
/* Local prototypes */
|
||||
static acpi_status
|
||||
acpi_ns_convert_to_integer(union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **return_object);
|
||||
static const struct acpi_simple_repair_info *acpi_ns_match_simple_repair(struct
|
||||
acpi_namespace_node
|
||||
*node,
|
||||
u32
|
||||
return_btype,
|
||||
u32
|
||||
package_index);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_convert_to_string(union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **return_object);
|
||||
/*
|
||||
* Special but simple repairs for some names.
|
||||
*
|
||||
* 2nd argument: Unexpected types that can be repaired
|
||||
*/
|
||||
static const struct acpi_simple_repair_info acpi_object_repair_info[] = {
|
||||
/* Resource descriptor conversions */
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **return_object);
|
||||
{"_CRS",
|
||||
ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING | ACPI_RTYPE_BUFFER |
|
||||
ACPI_RTYPE_NONE,
|
||||
ACPI_NOT_PACKAGE_ELEMENT,
|
||||
acpi_ns_convert_to_resource},
|
||||
{"_DMA",
|
||||
ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING | ACPI_RTYPE_BUFFER |
|
||||
ACPI_RTYPE_NONE,
|
||||
ACPI_NOT_PACKAGE_ELEMENT,
|
||||
acpi_ns_convert_to_resource},
|
||||
{"_PRS",
|
||||
ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING | ACPI_RTYPE_BUFFER |
|
||||
ACPI_RTYPE_NONE,
|
||||
ACPI_NOT_PACKAGE_ELEMENT,
|
||||
acpi_ns_convert_to_resource},
|
||||
|
||||
/* Unicode conversions */
|
||||
|
||||
{"_MLS", ACPI_RTYPE_STRING, 1,
|
||||
acpi_ns_convert_to_unicode},
|
||||
{"_STR", ACPI_RTYPE_STRING | ACPI_RTYPE_BUFFER,
|
||||
ACPI_NOT_PACKAGE_ELEMENT,
|
||||
acpi_ns_convert_to_unicode},
|
||||
{{0, 0, 0, 0}, 0, 0, NULL} /* Table terminator */
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_repair_object
|
||||
* FUNCTION: acpi_ns_simple_repair
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* expected_btypes - Object types expected
|
||||
|
|
@ -110,16 +146,54 @@ acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
|
|||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ns_repair_object(struct acpi_predefined_data *data,
|
||||
acpi_ns_simple_repair(struct acpi_predefined_data *data,
|
||||
u32 expected_btypes,
|
||||
u32 package_index,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
union acpi_operand_object *new_object;
|
||||
union acpi_operand_object *new_object = NULL;
|
||||
acpi_status status;
|
||||
const struct acpi_simple_repair_info *predefined;
|
||||
|
||||
ACPI_FUNCTION_NAME(ns_repair_object);
|
||||
ACPI_FUNCTION_NAME(ns_simple_repair);
|
||||
|
||||
/*
|
||||
* Special repairs for certain names that are in the repair table.
|
||||
* Check if this name is in the list of repairable names.
|
||||
*/
|
||||
predefined = acpi_ns_match_simple_repair(data->node,
|
||||
data->return_btype,
|
||||
package_index);
|
||||
if (predefined) {
|
||||
if (!return_object) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"Missing expected return value"));
|
||||
}
|
||||
|
||||
status =
|
||||
predefined->object_converter(return_object, &new_object);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
||||
/* A fatal error occurred during a conversion */
|
||||
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"During return object analysis"));
|
||||
return (status);
|
||||
}
|
||||
if (new_object) {
|
||||
goto object_repaired;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Do not perform simple object repair unless the return type is not
|
||||
* expected.
|
||||
*/
|
||||
if (data->return_btype & expected_btypes) {
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
* At this point, we know that the type of the returned object was not
|
||||
|
|
@ -127,6 +201,24 @@ acpi_ns_repair_object(struct acpi_predefined_data *data,
|
|||
* repair the object by converting it to one of the expected object
|
||||
* types for this predefined name.
|
||||
*/
|
||||
|
||||
/*
|
||||
* If there is no return value, check if we require a return value for
|
||||
* this predefined name. Either one return value is expected, or none,
|
||||
* for both methods and other objects.
|
||||
*
|
||||
* Exit now if there is no return object. Warning if one was expected.
|
||||
*/
|
||||
if (!return_object) {
|
||||
if (expected_btypes && (!(expected_btypes & ACPI_RTYPE_NONE))) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"Missing expected return value"));
|
||||
|
||||
return (AE_AML_NO_RETURN_VALUE);
|
||||
}
|
||||
}
|
||||
|
||||
if (expected_btypes & ACPI_RTYPE_INTEGER) {
|
||||
status = acpi_ns_convert_to_integer(return_object, &new_object);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
|
|
@ -216,254 +308,51 @@ acpi_ns_repair_object(struct acpi_predefined_data *data,
|
|||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_convert_to_integer
|
||||
* FUNCTION: acpi_ns_match_simple_repair
|
||||
*
|
||||
* PARAMETERS: original_object - Object to be converted
|
||||
* return_object - Where the new converted object is returned
|
||||
* PARAMETERS: node - Namespace node for the method/object
|
||||
* return_btype - Object type that was returned
|
||||
* package_index - Index of object within parent package (if
|
||||
* applicable - ACPI_NOT_PACKAGE_ELEMENT
|
||||
* otherwise)
|
||||
*
|
||||
* RETURN: Status. AE_OK if conversion was successful.
|
||||
* RETURN: Pointer to entry in repair table. NULL indicates not found.
|
||||
*
|
||||
* DESCRIPTION: Attempt to convert a String/Buffer object to an Integer.
|
||||
* DESCRIPTION: Check an object name against the repairable object list.
|
||||
*
|
||||
******************************************************************************/
|
||||
*****************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_convert_to_integer(union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **return_object)
|
||||
static const struct acpi_simple_repair_info *acpi_ns_match_simple_repair(struct
|
||||
acpi_namespace_node
|
||||
*node,
|
||||
u32
|
||||
return_btype,
|
||||
u32
|
||||
package_index)
|
||||
{
|
||||
union acpi_operand_object *new_object;
|
||||
acpi_status status;
|
||||
u64 value = 0;
|
||||
u32 i;
|
||||
const struct acpi_simple_repair_info *this_name;
|
||||
|
||||
switch (original_object->common.type) {
|
||||
case ACPI_TYPE_STRING:
|
||||
/* Search info table for a repairable predefined method/object name */
|
||||
|
||||
/* String-to-Integer conversion */
|
||||
this_name = acpi_object_repair_info;
|
||||
while (this_name->object_converter) {
|
||||
if (ACPI_COMPARE_NAME(node->name.ascii, this_name->name)) {
|
||||
|
||||
status = acpi_ut_strtoul64(original_object->string.pointer,
|
||||
ACPI_ANY_BASE, &value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
break;
|
||||
/* Check if we can actually repair this name/type combination */
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
/* Buffer-to-Integer conversion. Max buffer size is 64 bits. */
|
||||
|
||||
if (original_object->buffer.length > 8) {
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
/* Extract each buffer byte to create the integer */
|
||||
|
||||
for (i = 0; i < original_object->buffer.length; i++) {
|
||||
value |=
|
||||
((u64) original_object->buffer.
|
||||
pointer[i] << (i * 8));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
new_object = acpi_ut_create_integer_object(value);
|
||||
if (!new_object) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
*return_object = new_object;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_convert_to_string
|
||||
*
|
||||
* PARAMETERS: original_object - Object to be converted
|
||||
* return_object - Where the new converted object is returned
|
||||
*
|
||||
* RETURN: Status. AE_OK if conversion was successful.
|
||||
*
|
||||
* DESCRIPTION: Attempt to convert a Integer/Buffer object to a String.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_convert_to_string(union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **return_object)
|
||||
{
|
||||
union acpi_operand_object *new_object;
|
||||
acpi_size length;
|
||||
acpi_status status;
|
||||
|
||||
switch (original_object->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
/*
|
||||
* Integer-to-String conversion. Commonly, convert
|
||||
* an integer of value 0 to a NULL string. The last element of
|
||||
* _BIF and _BIX packages occasionally need this fix.
|
||||
*/
|
||||
if (original_object->integer.value == 0) {
|
||||
|
||||
/* Allocate a new NULL string object */
|
||||
|
||||
new_object = acpi_ut_create_string_object(0);
|
||||
if (!new_object) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
} else {
|
||||
status =
|
||||
acpi_ex_convert_to_string(original_object,
|
||||
&new_object,
|
||||
ACPI_IMPLICIT_CONVERT_HEX);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
if ((return_btype & this_name->unexpected_btypes) &&
|
||||
(package_index == this_name->package_index)) {
|
||||
return (this_name);
|
||||
}
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
/*
|
||||
* Buffer-to-String conversion. Use a to_string
|
||||
* conversion, no transform performed on the buffer data. The best
|
||||
* example of this is the _BIF method, where the string data from
|
||||
* the battery is often (incorrectly) returned as buffer object(s).
|
||||
*/
|
||||
length = 0;
|
||||
while ((length < original_object->buffer.length) &&
|
||||
(original_object->buffer.pointer[length])) {
|
||||
length++;
|
||||
}
|
||||
|
||||
/* Allocate a new string object */
|
||||
|
||||
new_object = acpi_ut_create_string_object(length);
|
||||
if (!new_object) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy the raw buffer data with no transform. String is already NULL
|
||||
* terminated at Length+1.
|
||||
*/
|
||||
ACPI_MEMCPY(new_object->string.pointer,
|
||||
original_object->buffer.pointer, length);
|
||||
break;
|
||||
|
||||
default:
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
this_name++;
|
||||
}
|
||||
|
||||
*return_object = new_object;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_convert_to_buffer
|
||||
*
|
||||
* PARAMETERS: original_object - Object to be converted
|
||||
* return_object - Where the new converted object is returned
|
||||
*
|
||||
* RETURN: Status. AE_OK if conversion was successful.
|
||||
*
|
||||
* DESCRIPTION: Attempt to convert a Integer/String/Package object to a Buffer.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **return_object)
|
||||
{
|
||||
union acpi_operand_object *new_object;
|
||||
acpi_status status;
|
||||
union acpi_operand_object **elements;
|
||||
u32 *dword_buffer;
|
||||
u32 count;
|
||||
u32 i;
|
||||
|
||||
switch (original_object->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
/*
|
||||
* Integer-to-Buffer conversion.
|
||||
* Convert the Integer to a packed-byte buffer. _MAT and other
|
||||
* objects need this sometimes, if a read has been performed on a
|
||||
* Field object that is less than or equal to the global integer
|
||||
* size (32 or 64 bits).
|
||||
*/
|
||||
status =
|
||||
acpi_ex_convert_to_buffer(original_object, &new_object);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
/* String-to-Buffer conversion. Simple data copy */
|
||||
|
||||
new_object =
|
||||
acpi_ut_create_buffer_object(original_object->string.
|
||||
length);
|
||||
if (!new_object) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
ACPI_MEMCPY(new_object->buffer.pointer,
|
||||
original_object->string.pointer,
|
||||
original_object->string.length);
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_PACKAGE:
|
||||
/*
|
||||
* This case is often seen for predefined names that must return a
|
||||
* Buffer object with multiple DWORD integers within. For example,
|
||||
* _FDE and _GTM. The Package can be converted to a Buffer.
|
||||
*/
|
||||
|
||||
/* All elements of the Package must be integers */
|
||||
|
||||
elements = original_object->package.elements;
|
||||
count = original_object->package.count;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if ((!*elements) ||
|
||||
((*elements)->common.type != ACPI_TYPE_INTEGER)) {
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
elements++;
|
||||
}
|
||||
|
||||
/* Create the new buffer object to replace the Package */
|
||||
|
||||
new_object = acpi_ut_create_buffer_object(ACPI_MUL_4(count));
|
||||
if (!new_object) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/* Copy the package elements (integers) to the buffer as DWORDs */
|
||||
|
||||
elements = original_object->package.elements;
|
||||
dword_buffer = ACPI_CAST_PTR(u32, new_object->buffer.pointer);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
*dword_buffer = (u32) (*elements)->integer.value;
|
||||
dword_buffer++;
|
||||
elements++;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
*return_object = new_object;
|
||||
return (AE_OK);
|
||||
return (NULL); /* Name was not found in the repair table */
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
|
|||
|
|
@ -66,9 +66,9 @@ typedef struct acpi_repair_info {
|
|||
|
||||
/* Local prototypes */
|
||||
|
||||
static const struct acpi_repair_info *acpi_ns_match_repairable_name(struct
|
||||
acpi_namespace_node
|
||||
*node);
|
||||
static const struct acpi_repair_info *acpi_ns_match_complex_repair(struct
|
||||
acpi_namespace_node
|
||||
*node);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_ALR(struct acpi_predefined_data *data,
|
||||
|
|
@ -175,7 +175,7 @@ acpi_ns_complex_repairs(struct acpi_predefined_data *data,
|
|||
|
||||
/* Check if this name is in the list of repairable names */
|
||||
|
||||
predefined = acpi_ns_match_repairable_name(node);
|
||||
predefined = acpi_ns_match_complex_repair(node);
|
||||
if (!predefined) {
|
||||
return (validate_status);
|
||||
}
|
||||
|
|
@ -186,7 +186,7 @@ acpi_ns_complex_repairs(struct acpi_predefined_data *data,
|
|||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_match_repairable_name
|
||||
* FUNCTION: acpi_ns_match_complex_repair
|
||||
*
|
||||
* PARAMETERS: node - Namespace node for the method/object
|
||||
*
|
||||
|
|
@ -196,9 +196,9 @@ acpi_ns_complex_repairs(struct acpi_predefined_data *data,
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
static const struct acpi_repair_info *acpi_ns_match_repairable_name(struct
|
||||
acpi_namespace_node
|
||||
*node)
|
||||
static const struct acpi_repair_info *acpi_ns_match_complex_repair(struct
|
||||
acpi_namespace_node
|
||||
*node)
|
||||
{
|
||||
const struct acpi_repair_info *this_name;
|
||||
|
||||
|
|
|
|||
|
|
@ -112,10 +112,10 @@ acpi_object_type acpi_ns_get_type(struct acpi_namespace_node * node)
|
|||
|
||||
if (!node) {
|
||||
ACPI_WARNING((AE_INFO, "Null Node parameter"));
|
||||
return_VALUE(ACPI_TYPE_ANY);
|
||||
return_UINT8(ACPI_TYPE_ANY);
|
||||
}
|
||||
|
||||
return_VALUE(node->type);
|
||||
return_UINT8(node->type);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
@ -140,10 +140,10 @@ u32 acpi_ns_local(acpi_object_type type)
|
|||
/* Type code out of range */
|
||||
|
||||
ACPI_WARNING((AE_INFO, "Invalid Object Type 0x%X", type));
|
||||
return_VALUE(ACPI_NS_NORMAL);
|
||||
return_UINT32(ACPI_NS_NORMAL);
|
||||
}
|
||||
|
||||
return_VALUE(acpi_gbl_ns_properties[type] & ACPI_NS_LOCAL);
|
||||
return_UINT32(acpi_gbl_ns_properties[type] & ACPI_NS_LOCAL);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ acpi_ps_get_next_package_length(struct acpi_parse_state *parser_state)
|
|||
/* Byte 0 is a special case, either bits [0:3] or [0:5] are used */
|
||||
|
||||
package_length |= (aml[0] & byte_zero_mask);
|
||||
return_VALUE(package_length);
|
||||
return_UINT32(package_length);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
|
|||
|
|
@ -202,6 +202,12 @@ acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed)
|
|||
return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
|
||||
}
|
||||
|
||||
/* Sanity check the length. It must not be zero, or we loop forever */
|
||||
|
||||
if (!resource->length) {
|
||||
return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH);
|
||||
}
|
||||
|
||||
/* Get the base size of the (external stream) resource descriptor */
|
||||
|
||||
total_size = acpi_gbl_aml_resource_sizes[resource->type];
|
||||
|
|
|
|||
|
|
@ -385,6 +385,14 @@ void acpi_rs_dump_resource_list(struct acpi_resource *resource_list)
|
|||
return;
|
||||
}
|
||||
|
||||
/* Sanity check the length. It must not be zero, or we loop forever */
|
||||
|
||||
if (!resource_list->length) {
|
||||
acpi_os_printf
|
||||
("Invalid zero length descriptor in resource list\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Dump the resource descriptor */
|
||||
|
||||
if (type == ACPI_RESOURCE_TYPE_SERIAL_BUS) {
|
||||
|
|
|
|||
|
|
@ -178,6 +178,14 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource,
|
|||
return_ACPI_STATUS(AE_BAD_DATA);
|
||||
}
|
||||
|
||||
/* Sanity check the length. It must not be zero, or we loop forever */
|
||||
|
||||
if (!resource->length) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Invalid zero length descriptor in resource list\n"));
|
||||
return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH);
|
||||
}
|
||||
|
||||
/* Perform the conversion */
|
||||
|
||||
if (resource->type == ACPI_RESOURCE_TYPE_SERIAL_BUS) {
|
||||
|
|
|
|||
|
|
@ -563,13 +563,19 @@ acpi_walk_resource_buffer(struct acpi_buffer * buffer,
|
|||
|
||||
while (resource < resource_end) {
|
||||
|
||||
/* Sanity check the resource */
|
||||
/* Sanity check the resource type */
|
||||
|
||||
if (resource->type > ACPI_RESOURCE_TYPE_MAX) {
|
||||
status = AE_AML_INVALID_RESOURCE_TYPE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Sanity check the length. It must not be zero, or we loop forever */
|
||||
|
||||
if (!resource->length) {
|
||||
return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH);
|
||||
}
|
||||
|
||||
/* Invoke the user function, abort on any error returned */
|
||||
|
||||
status = user_function(resource, context);
|
||||
|
|
|
|||
|
|
@ -214,7 +214,7 @@ acpi_ut_check_address_range(acpi_adr_space_type space_id,
|
|||
|
||||
if ((space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY) &&
|
||||
(space_id != ACPI_ADR_SPACE_SYSTEM_IO)) {
|
||||
return_VALUE(0);
|
||||
return_UINT32(0);
|
||||
}
|
||||
|
||||
range_info = acpi_gbl_address_range_list[space_id];
|
||||
|
|
@ -256,7 +256,7 @@ acpi_ut_check_address_range(acpi_adr_space_type space_id,
|
|||
range_info = range_info->next;
|
||||
}
|
||||
|
||||
return_VALUE(overlap_count);
|
||||
return_UINT32(overlap_count);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
|
|||
|
|
@ -85,7 +85,6 @@ acpi_os_create_cache(char *cache_name,
|
|||
/* Populate the cache object and return it */
|
||||
|
||||
ACPI_MEMSET(cache, 0, sizeof(struct acpi_memory_list));
|
||||
cache->link_offset = 8;
|
||||
cache->list_name = cache_name;
|
||||
cache->object_size = object_size;
|
||||
cache->max_depth = max_depth;
|
||||
|
|
@ -108,7 +107,7 @@ acpi_os_create_cache(char *cache_name,
|
|||
|
||||
acpi_status acpi_os_purge_cache(struct acpi_memory_list * cache)
|
||||
{
|
||||
char *next;
|
||||
void *next;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
|
@ -128,10 +127,7 @@ acpi_status acpi_os_purge_cache(struct acpi_memory_list * cache)
|
|||
|
||||
/* Delete and unlink one cached state object */
|
||||
|
||||
next = *(ACPI_CAST_INDIRECT_PTR(char,
|
||||
&(((char *)cache->
|
||||
list_head)[cache->
|
||||
link_offset])));
|
||||
next = ACPI_GET_DESCRIPTOR_PTR(cache->list_head);
|
||||
ACPI_FREE(cache->list_head);
|
||||
|
||||
cache->list_head = next;
|
||||
|
|
@ -221,10 +217,7 @@ acpi_os_release_object(struct acpi_memory_list * cache, void *object)
|
|||
|
||||
/* Put the object at the head of the cache list */
|
||||
|
||||
*(ACPI_CAST_INDIRECT_PTR(char,
|
||||
&(((char *)object)[cache->
|
||||
link_offset]))) =
|
||||
cache->list_head;
|
||||
ACPI_SET_DESCRIPTOR_PTR(object, cache->list_head);
|
||||
cache->list_head = object;
|
||||
cache->current_depth++;
|
||||
|
||||
|
|
@ -272,10 +265,7 @@ void *acpi_os_acquire_object(struct acpi_memory_list *cache)
|
|||
/* There is an object available, use it */
|
||||
|
||||
object = cache->list_head;
|
||||
cache->list_head = *(ACPI_CAST_INDIRECT_PTR(char,
|
||||
&(((char *)
|
||||
object)[cache->
|
||||
link_offset])));
|
||||
cache->list_head = ACPI_GET_DESCRIPTOR_PTR(object);
|
||||
|
||||
cache->current_depth--;
|
||||
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ ACPI_MODULE_NAME("utexcep")
|
|||
******************************************************************************/
|
||||
const char *acpi_format_exception(acpi_status status)
|
||||
{
|
||||
const char *exception = NULL;
|
||||
const struct acpi_exception_info *exception;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
|
|
@ -76,10 +76,10 @@ const char *acpi_format_exception(acpi_status status)
|
|||
ACPI_ERROR((AE_INFO,
|
||||
"Unknown exception code: 0x%8.8X", status));
|
||||
|
||||
exception = "UNKNOWN_STATUS_CODE";
|
||||
return ("UNKNOWN_STATUS_CODE");
|
||||
}
|
||||
|
||||
return (ACPI_CAST_PTR(const char, exception));
|
||||
return (exception->name);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_format_exception)
|
||||
|
|
@ -97,10 +97,10 @@ ACPI_EXPORT_SYMBOL(acpi_format_exception)
|
|||
* an ASCII string.
|
||||
*
|
||||
******************************************************************************/
|
||||
const char *acpi_ut_validate_exception(acpi_status status)
|
||||
const struct acpi_exception_info *acpi_ut_validate_exception(acpi_status status)
|
||||
{
|
||||
u32 sub_status;
|
||||
const char *exception = NULL;
|
||||
const struct acpi_exception_info *exception = NULL;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
|
|
@ -113,35 +113,35 @@ const char *acpi_ut_validate_exception(acpi_status status)
|
|||
case AE_CODE_ENVIRONMENTAL:
|
||||
|
||||
if (sub_status <= AE_CODE_ENV_MAX) {
|
||||
exception = acpi_gbl_exception_names_env[sub_status];
|
||||
exception = &acpi_gbl_exception_names_env[sub_status];
|
||||
}
|
||||
break;
|
||||
|
||||
case AE_CODE_PROGRAMMER:
|
||||
|
||||
if (sub_status <= AE_CODE_PGM_MAX) {
|
||||
exception = acpi_gbl_exception_names_pgm[sub_status];
|
||||
exception = &acpi_gbl_exception_names_pgm[sub_status];
|
||||
}
|
||||
break;
|
||||
|
||||
case AE_CODE_ACPI_TABLES:
|
||||
|
||||
if (sub_status <= AE_CODE_TBL_MAX) {
|
||||
exception = acpi_gbl_exception_names_tbl[sub_status];
|
||||
exception = &acpi_gbl_exception_names_tbl[sub_status];
|
||||
}
|
||||
break;
|
||||
|
||||
case AE_CODE_AML:
|
||||
|
||||
if (sub_status <= AE_CODE_AML_MAX) {
|
||||
exception = acpi_gbl_exception_names_aml[sub_status];
|
||||
exception = &acpi_gbl_exception_names_aml[sub_status];
|
||||
}
|
||||
break;
|
||||
|
||||
case AE_CODE_CONTROL:
|
||||
|
||||
if (sub_status <= AE_CODE_CTRL_MAX) {
|
||||
exception = acpi_gbl_exception_names_ctrl[sub_status];
|
||||
exception = &acpi_gbl_exception_names_ctrl[sub_status];
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -149,5 +149,9 @@ const char *acpi_ut_validate_exception(acpi_status status)
|
|||
break;
|
||||
}
|
||||
|
||||
return (ACPI_CAST_PTR(const char, exception));
|
||||
if (!exception || !exception->name) {
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
return (exception);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -359,6 +359,8 @@ acpi_status acpi_ut_init_globals(void)
|
|||
|
||||
#ifdef ACPI_DISASSEMBLER
|
||||
acpi_gbl_external_list = NULL;
|
||||
acpi_gbl_num_external_methods = 0;
|
||||
acpi_gbl_resolved_external_methods = 0;
|
||||
#endif
|
||||
|
||||
#ifdef ACPI_DEBUG_OUTPUT
|
||||
|
|
|
|||
|
|
@ -354,6 +354,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
|
|||
|
||||
}
|
||||
resource->end.type = ACPI_RESOURCE_TYPE_END_TAG;
|
||||
resource->end.length = sizeof(struct acpi_resource);
|
||||
|
||||
/* Attempt to set the resource */
|
||||
status = acpi_set_current_resources(link->device->handle, &buffer);
|
||||
|
|
|
|||
Loading…
Reference in a new issue