2005-04-16 15:20:36 -07:00
/******************************************************************************
*
* Module Name : exoparg2 - AML execution - opcodes with 2 arguments
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
2006-01-13 16:22:00 -05:00
* Copyright ( C ) 2000 - 2006 , R . Byron Moore
2005-04-16 15:20:36 -07:00
* 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 <acpi/acparser.h>
# include <acpi/acinterp.h>
# include <acpi/acevents.h>
# include <acpi/amlcode.h>
# define _COMPONENT ACPI_EXECUTER
2005-08-05 00:44:28 -04:00
ACPI_MODULE_NAME ( " exoparg2 " )
2005-04-16 15:20:36 -07:00
/*!
* Naming convention for AML interpreter execution routines .
*
* The routines that begin execution of AML opcodes are named with a common
* convention based upon the number of arguments , the number of target operands ,
* and whether or not a value is returned :
*
* AcpiExOpcode_xA_yT_zR
*
* Where :
*
* xA - ARGUMENTS : The number of arguments ( input operands ) that are
* required for this opcode type ( 1 through 6 args ) .
* yT - TARGETS : The number of targets ( output operands ) that are required
* for this opcode type ( 0 , 1 , or 2 targets ) .
* zR - RETURN VALUE : Indicates whether this opcode type returns a value
* as the function return ( 0 or 1 ) .
*
* The AcpiExOpcode * functions are called via the Dispatcher component with
* fully resolved operands .
! */
/*******************************************************************************
*
* FUNCTION : acpi_ex_opcode_2A_0T_0R
*
* PARAMETERS : walk_state - Current walk state
*
* RETURN : Status
*
* DESCRIPTION : Execute opcode with two arguments , no target , and no return
* value .
*
* ALLOCATION : Deletes both operands
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 00:44:28 -04:00
acpi_status acpi_ex_opcode_2A_0T_0R ( struct acpi_walk_state * walk_state )
2005-04-16 15:20:36 -07:00
{
2005-08-05 00:44:28 -04:00
union acpi_operand_object * * operand = & walk_state - > operands [ 0 ] ;
struct acpi_namespace_node * node ;
u32 value ;
acpi_status status = AE_OK ;
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
ACPI_FUNCTION_TRACE_STR ( " ex_opcode_2A_0T_0R " ,
acpi_ps_get_opcode_name ( walk_state - > opcode ) ) ;
2005-04-16 15:20:36 -07:00
/* Examine the opcode */
switch ( walk_state - > opcode ) {
2005-08-05 00:44:28 -04:00
case AML_NOTIFY_OP : /* Notify (notify_object, notify_value) */
2005-04-16 15:20:36 -07:00
/* The first operand is a namespace node */
2005-08-05 00:44:28 -04:00
node = ( struct acpi_namespace_node * ) operand [ 0 ] ;
2005-04-16 15:20:36 -07:00
/* Second value is the notify value */
value = ( u32 ) operand [ 1 ] - > integer . value ;
2005-04-18 22:49:35 -04:00
/* Are notifies allowed on this object? */
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
if ( ! acpi_ev_is_notify_object ( node ) ) {
2006-01-27 16:43:00 -05:00
ACPI_ERROR ( ( AE_INFO ,
" Unexpected notify object type [%s] " ,
acpi_ut_get_type_name ( node - > type ) ) ) ;
2005-04-16 15:20:36 -07:00
status = AE_AML_OPERAND_TYPE ;
break ;
}
# ifdef ACPI_GPE_NOTIFY_CHECK
/*
* GPE method wake / notify check . Here , we want to ensure that we
* don ' t receive any " device_wake " Notifies from a GPE _Lxx or _Exx
* GPE method during system runtime . If we do , the GPE is marked
* as " wake-only " and disabled .
*
* 1 ) Is the Notify ( ) value = = device_wake ?
* 2 ) Is this a GPE deferred method ? ( An _Lxx or _Exx method )
* 3 ) Did the original GPE happen at system runtime ?
* ( versus during wake )
*
* If all three cases are true , this is a wake - only GPE that should
* be disabled at runtime .
*/
2005-08-05 00:44:28 -04:00
if ( value = = 2 ) { /* device_wake */
status =
acpi_ev_check_for_wake_only_gpe ( walk_state - >
gpe_event_info ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-16 15:20:36 -07:00
/* AE_WAKE_ONLY_GPE only error, means ignore this notify */
2005-08-05 00:44:28 -04:00
return_ACPI_STATUS ( AE_OK )
2005-04-16 15:20:36 -07:00
}
}
# endif
/*
* Dispatch the notify to the appropriate handler
* NOTE : the request is queued for execution after this method
* completes . The notify handlers are NOT invoked synchronously
* from this thread - - because handlers may in turn run other
* control methods .
*/
2005-08-05 00:44:28 -04:00
status = acpi_ev_queue_notify_request ( node , value ) ;
2005-04-16 15:20:36 -07:00
break ;
default :
2006-01-27 16:43:00 -05:00
ACPI_ERROR ( ( AE_INFO , " Unknown AML opcode %X " ,
walk_state - > opcode ) ) ;
2005-04-16 15:20:36 -07:00
status = AE_AML_BAD_OPCODE ;
}
2005-08-05 00:44:28 -04:00
return_ACPI_STATUS ( status ) ;
2005-04-16 15:20:36 -07:00
}
/*******************************************************************************
*
* FUNCTION : acpi_ex_opcode_2A_2T_1R
*
* PARAMETERS : walk_state - Current walk state
*
* RETURN : Status
*
* DESCRIPTION : Execute a dyadic operator ( 2 operands ) with 2 output targets
* and one implicit return value .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 00:44:28 -04:00
acpi_status acpi_ex_opcode_2A_2T_1R ( struct acpi_walk_state * walk_state )
2005-04-16 15:20:36 -07:00
{
2005-08-05 00:44:28 -04:00
union acpi_operand_object * * operand = & walk_state - > operands [ 0 ] ;
union acpi_operand_object * return_desc1 = NULL ;
union acpi_operand_object * return_desc2 = NULL ;
acpi_status status ;
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
ACPI_FUNCTION_TRACE_STR ( " ex_opcode_2A_2T_1R " ,
acpi_ps_get_opcode_name ( walk_state - > opcode ) ) ;
2005-04-16 15:20:36 -07:00
2005-04-18 22:49:35 -04:00
/* Execute the opcode */
2005-04-16 15:20:36 -07:00
switch ( walk_state - > opcode ) {
2005-04-18 22:49:35 -04:00
case AML_DIVIDE_OP :
/* Divide (Dividend, Divisor, remainder_result quotient_result) */
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
return_desc1 =
acpi_ut_create_internal_object ( ACPI_TYPE_INTEGER ) ;
2005-04-16 15:20:36 -07:00
if ( ! return_desc1 ) {
status = AE_NO_MEMORY ;
goto cleanup ;
}
2005-08-05 00:44:28 -04:00
return_desc2 =
acpi_ut_create_internal_object ( ACPI_TYPE_INTEGER ) ;
2005-04-16 15:20:36 -07:00
if ( ! return_desc2 ) {
status = AE_NO_MEMORY ;
goto cleanup ;
}
/* Quotient to return_desc1, remainder to return_desc2 */
2005-08-05 00:44:28 -04:00
status = acpi_ut_divide ( operand [ 0 ] - > integer . value ,
operand [ 1 ] - > integer . value ,
& return_desc1 - > integer . value ,
& return_desc2 - > integer . value ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-16 15:20:36 -07:00
goto cleanup ;
}
break ;
default :
2006-01-27 16:43:00 -05:00
ACPI_ERROR ( ( AE_INFO , " Unknown AML opcode %X " ,
walk_state - > opcode ) ) ;
2005-04-16 15:20:36 -07:00
status = AE_AML_BAD_OPCODE ;
goto cleanup ;
}
/* Store the results to the target reference operands */
2005-08-05 00:44:28 -04:00
status = acpi_ex_store ( return_desc2 , operand [ 2 ] , walk_state ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-16 15:20:36 -07:00
goto cleanup ;
}
2005-08-05 00:44:28 -04:00
status = acpi_ex_store ( return_desc1 , operand [ 3 ] , walk_state ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-16 15:20:36 -07:00
goto cleanup ;
}
/* Return the remainder */
walk_state - > result_obj = return_desc1 ;
2005-08-05 00:44:28 -04:00
cleanup :
2005-04-16 15:20:36 -07:00
/*
* Since the remainder is not returned indirectly , remove a reference to
* it . Only the quotient is returned indirectly .
*/
2005-08-05 00:44:28 -04:00
acpi_ut_remove_reference ( return_desc2 ) ;
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
if ( ACPI_FAILURE ( status ) ) {
2005-04-16 15:20:36 -07:00
/* Delete the return object */
2005-08-05 00:44:28 -04:00
acpi_ut_remove_reference ( return_desc1 ) ;
2005-04-16 15:20:36 -07:00
}
2005-08-05 00:44:28 -04:00
return_ACPI_STATUS ( status ) ;
2005-04-16 15:20:36 -07:00
}
/*******************************************************************************
*
* FUNCTION : acpi_ex_opcode_2A_1T_1R
*
* PARAMETERS : walk_state - Current walk state
*
* RETURN : Status
*
* DESCRIPTION : Execute opcode with two arguments , one target , and a return
* value .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 00:44:28 -04:00
acpi_status acpi_ex_opcode_2A_1T_1R ( struct acpi_walk_state * walk_state )
2005-04-16 15:20:36 -07:00
{
2005-08-05 00:44:28 -04:00
union acpi_operand_object * * operand = & walk_state - > operands [ 0 ] ;
union acpi_operand_object * return_desc = NULL ;
acpi_integer index ;
acpi_status status = AE_OK ;
acpi_size length ;
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
ACPI_FUNCTION_TRACE_STR ( " ex_opcode_2A_1T_1R " ,
acpi_ps_get_opcode_name ( walk_state - > opcode ) ) ;
2005-04-16 15:20:36 -07:00
2005-04-18 22:49:35 -04:00
/* Execute the opcode */
2005-04-16 15:20:36 -07:00
if ( walk_state - > op_info - > flags & AML_MATH ) {
/* All simple math opcodes (add, etc.) */
2005-08-05 00:44:28 -04:00
return_desc = acpi_ut_create_internal_object ( ACPI_TYPE_INTEGER ) ;
2005-04-16 15:20:36 -07:00
if ( ! return_desc ) {
status = AE_NO_MEMORY ;
goto cleanup ;
}
2005-08-05 00:44:28 -04:00
return_desc - > integer . value =
acpi_ex_do_math_op ( walk_state - > opcode ,
operand [ 0 ] - > integer . value ,
operand [ 1 ] - > integer . value ) ;
2005-04-16 15:20:36 -07:00
goto store_result_to_target ;
}
switch ( walk_state - > opcode ) {
2005-08-05 00:44:28 -04:00
case AML_MOD_OP : /* Mod (Dividend, Divisor, remainder_result (ACPI 2.0) */
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
return_desc = acpi_ut_create_internal_object ( ACPI_TYPE_INTEGER ) ;
2005-04-16 15:20:36 -07:00
if ( ! return_desc ) {
status = AE_NO_MEMORY ;
goto cleanup ;
}
/* return_desc will contain the remainder */
2005-08-05 00:44:28 -04:00
status = acpi_ut_divide ( operand [ 0 ] - > integer . value ,
operand [ 1 ] - > integer . value ,
NULL , & return_desc - > integer . value ) ;
2005-04-16 15:20:36 -07:00
break ;
2005-08-05 00:44:28 -04:00
case AML_CONCAT_OP : /* Concatenate (Data1, Data2, Result) */
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
status = acpi_ex_do_concatenate ( operand [ 0 ] , operand [ 1 ] ,
& return_desc , walk_state ) ;
2005-04-16 15:20:36 -07:00
break ;
2005-08-05 00:44:28 -04:00
case AML_TO_STRING_OP : /* to_string (Buffer, Length, Result) (ACPI 2.0) */
2005-04-16 15:20:36 -07:00
/*
* Input object is guaranteed to be a buffer at this point ( it may have
2005-04-18 22:49:35 -04:00
* been converted . ) Copy the raw buffer data to a new object of
* type String .
2005-04-16 15:20:36 -07:00
*/
/*
* Get the length of the new string . It is the smallest of :
* 1 ) Length of the input buffer
* 2 ) Max length as specified in the to_string operator
* 3 ) Length of input buffer up to a zero byte ( null terminator )
*
* NOTE : A length of zero is ok , and will create a zero - length , null
* terminated string .
*/
length = 0 ;
while ( ( length < operand [ 0 ] - > buffer . length ) & &
2005-08-05 00:44:28 -04:00
( length < operand [ 1 ] - > integer . value ) & &
( operand [ 0 ] - > buffer . pointer [ length ] ) ) {
2005-04-16 15:20:36 -07:00
length + + ;
}
/* Allocate a new string object */
2005-08-05 00:44:28 -04:00
return_desc = acpi_ut_create_string_object ( length ) ;
2005-04-16 15:20:36 -07:00
if ( ! return_desc ) {
status = AE_NO_MEMORY ;
goto cleanup ;
}
2005-11-17 13:07:00 -05:00
/*
* Copy the raw buffer data with no transform .
* ( NULL terminated already )
*/
2005-08-05 00:44:28 -04:00
ACPI_MEMCPY ( return_desc - > string . pointer ,
operand [ 0 ] - > buffer . pointer , length ) ;
2005-04-16 15:20:36 -07:00
break ;
2005-04-18 22:49:35 -04:00
case AML_CONCAT_RES_OP :
/* concatenate_res_template (Buffer, Buffer, Result) (ACPI 2.0) */
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
status = acpi_ex_concat_template ( operand [ 0 ] , operand [ 1 ] ,
& return_desc , walk_state ) ;
2005-04-16 15:20:36 -07:00
break ;
2005-08-05 00:44:28 -04:00
case AML_INDEX_OP : /* Index (Source Index Result) */
2005-04-16 15:20:36 -07:00
/* Create the internal return object */
2005-08-05 00:44:28 -04:00
return_desc =
acpi_ut_create_internal_object ( ACPI_TYPE_LOCAL_REFERENCE ) ;
2005-04-16 15:20:36 -07:00
if ( ! return_desc ) {
status = AE_NO_MEMORY ;
goto cleanup ;
}
2005-04-18 22:49:35 -04:00
index = operand [ 1 ] - > integer . value ;
/* At this point, the Source operand is a Package, Buffer, or String */
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
if ( ACPI_GET_OBJECT_TYPE ( operand [ 0 ] ) = = ACPI_TYPE_PACKAGE ) {
2005-04-16 15:20:36 -07:00
/* Object to be indexed is a Package */
if ( index > = operand [ 0 ] - > package . count ) {
2006-01-27 16:43:00 -05:00
ACPI_ERROR ( ( AE_INFO ,
" Index value (%X%8.8X) beyond package end (%X) " ,
ACPI_FORMAT_UINT64 ( index ) ,
operand [ 0 ] - > package . count ) ) ;
2005-04-16 15:20:36 -07:00
status = AE_AML_PACKAGE_LIMIT ;
goto cleanup ;
}
return_desc - > reference . target_type = ACPI_TYPE_PACKAGE ;
2005-08-05 00:44:28 -04:00
return_desc - > reference . object = operand [ 0 ] ;
return_desc - > reference . where =
& operand [ 0 ] - > package . elements [ index ] ;
} else {
2005-04-16 15:20:36 -07:00
/* Object to be indexed is a Buffer/String */
if ( index > = operand [ 0 ] - > buffer . length ) {
2006-01-27 16:43:00 -05:00
ACPI_ERROR ( ( AE_INFO ,
" Index value (%X%8.8X) beyond end of buffer (%X) " ,
ACPI_FORMAT_UINT64 ( index ) ,
operand [ 0 ] - > buffer . length ) ) ;
2005-04-16 15:20:36 -07:00
status = AE_AML_BUFFER_LIMIT ;
goto cleanup ;
}
2005-08-05 00:44:28 -04:00
return_desc - > reference . target_type =
ACPI_TYPE_BUFFER_FIELD ;
return_desc - > reference . object = operand [ 0 ] ;
2005-04-16 15:20:36 -07:00
}
/*
* Add a reference to the target package / buffer / string for the life
* of the index .
*/
2005-08-05 00:44:28 -04:00
acpi_ut_add_reference ( operand [ 0 ] ) ;
2005-04-16 15:20:36 -07:00
/* Complete the Index reference object */
2005-08-05 00:44:28 -04:00
return_desc - > reference . opcode = AML_INDEX_OP ;
return_desc - > reference . offset = ( u32 ) index ;
2005-04-16 15:20:36 -07:00
/* Store the reference to the Target */
2005-08-05 00:44:28 -04:00
status = acpi_ex_store ( return_desc , operand [ 2 ] , walk_state ) ;
2005-04-16 15:20:36 -07:00
/* Return the reference */
walk_state - > result_obj = return_desc ;
goto cleanup ;
default :
2006-01-27 16:43:00 -05:00
ACPI_ERROR ( ( AE_INFO , " Unknown AML opcode %X " ,
walk_state - > opcode ) ) ;
2005-04-16 15:20:36 -07:00
status = AE_AML_BAD_OPCODE ;
break ;
}
2005-08-05 00:44:28 -04:00
store_result_to_target :
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
if ( ACPI_SUCCESS ( status ) ) {
2005-04-16 15:20:36 -07:00
/*
* Store the result of the operation ( which is now in return_desc ) into
* the Target descriptor .
*/
2005-08-05 00:44:28 -04:00
status = acpi_ex_store ( return_desc , operand [ 2 ] , walk_state ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-16 15:20:36 -07:00
goto cleanup ;
}
if ( ! walk_state - > result_obj ) {
walk_state - > result_obj = return_desc ;
}
}
2005-08-05 00:44:28 -04:00
cleanup :
2005-04-16 15:20:36 -07:00
/* Delete return object on error */
2005-08-05 00:44:28 -04:00
if ( ACPI_FAILURE ( status ) ) {
acpi_ut_remove_reference ( return_desc ) ;
2005-04-16 15:20:36 -07:00
}
2005-08-05 00:44:28 -04:00
return_ACPI_STATUS ( status ) ;
2005-04-16 15:20:36 -07:00
}
/*******************************************************************************
*
* FUNCTION : acpi_ex_opcode_2A_0T_1R
*
* PARAMETERS : walk_state - Current walk state
*
* RETURN : Status
*
* DESCRIPTION : Execute opcode with 2 arguments , no target , and a return value
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 00:44:28 -04:00
acpi_status acpi_ex_opcode_2A_0T_1R ( struct acpi_walk_state * walk_state )
2005-04-16 15:20:36 -07:00
{
2005-08-05 00:44:28 -04:00
union acpi_operand_object * * operand = & walk_state - > operands [ 0 ] ;
union acpi_operand_object * return_desc = NULL ;
acpi_status status = AE_OK ;
u8 logical_result = FALSE ;
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
ACPI_FUNCTION_TRACE_STR ( " ex_opcode_2A_0T_1R " ,
acpi_ps_get_opcode_name ( walk_state - > opcode ) ) ;
2005-04-16 15:20:36 -07:00
/* Create the internal return object */
2005-08-05 00:44:28 -04:00
return_desc = acpi_ut_create_internal_object ( ACPI_TYPE_INTEGER ) ;
2005-04-16 15:20:36 -07:00
if ( ! return_desc ) {
status = AE_NO_MEMORY ;
goto cleanup ;
}
2005-04-18 22:49:35 -04:00
/* Execute the Opcode */
if ( walk_state - > op_info - > flags & AML_LOGICAL_NUMERIC ) {
/* logical_op (Operand0, Operand1) */
2005-08-05 00:44:28 -04:00
status = acpi_ex_do_logical_numeric_op ( walk_state - > opcode ,
operand [ 0 ] - > integer .
value ,
operand [ 1 ] - > integer .
value , & logical_result ) ;
2005-04-16 15:20:36 -07:00
goto store_logical_result ;
2005-08-05 00:44:28 -04:00
} else if ( walk_state - > op_info - > flags & AML_LOGICAL ) {
2005-04-18 22:49:35 -04:00
/* logical_op (Operand0, Operand1) */
2005-08-05 00:44:28 -04:00
status = acpi_ex_do_logical_op ( walk_state - > opcode , operand [ 0 ] ,
operand [ 1 ] , & logical_result ) ;
2005-04-16 15:20:36 -07:00
goto store_logical_result ;
}
switch ( walk_state - > opcode ) {
2005-08-05 00:44:28 -04:00
case AML_ACQUIRE_OP : /* Acquire (mutex_object, Timeout) */
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
status =
acpi_ex_acquire_mutex ( operand [ 1 ] , operand [ 0 ] , walk_state ) ;
2005-04-16 15:20:36 -07:00
if ( status = = AE_TIME ) {
2005-08-05 00:44:28 -04:00
logical_result = TRUE ; /* TRUE = Acquire timed out */
2005-04-16 15:20:36 -07:00
status = AE_OK ;
}
break ;
2005-08-05 00:44:28 -04:00
case AML_WAIT_OP : /* Wait (event_object, Timeout) */
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
status = acpi_ex_system_wait_event ( operand [ 1 ] , operand [ 0 ] ) ;
2005-04-16 15:20:36 -07:00
if ( status = = AE_TIME ) {
2005-08-05 00:44:28 -04:00
logical_result = TRUE ; /* TRUE, Wait timed out */
2005-04-16 15:20:36 -07:00
status = AE_OK ;
}
break ;
default :
2006-01-27 16:43:00 -05:00
ACPI_ERROR ( ( AE_INFO , " Unknown AML opcode %X " ,
walk_state - > opcode ) ) ;
2005-04-16 15:20:36 -07:00
status = AE_AML_BAD_OPCODE ;
goto cleanup ;
}
2005-08-05 00:44:28 -04:00
store_logical_result :
2005-04-16 15:20:36 -07:00
/*
* Set return value to according to logical_result . logical TRUE ( all ones )
* Default is FALSE ( zero )
*/
if ( logical_result ) {
return_desc - > integer . value = ACPI_INTEGER_MAX ;
}
walk_state - > result_obj = return_desc ;
2005-08-05 00:44:28 -04:00
cleanup :
2005-04-16 15:20:36 -07:00
/* Delete return object on error */
2005-08-05 00:44:28 -04:00
if ( ACPI_FAILURE ( status ) ) {
acpi_ut_remove_reference ( return_desc ) ;
2005-04-16 15:20:36 -07:00
}
2005-08-05 00:44:28 -04:00
return_ACPI_STATUS ( status ) ;
2005-04-16 15:20:36 -07:00
}