diff options
| author | Len Brown <len.brown@intel.com> | 2007-05-10 02:49:21 -0400 | 
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2007-05-10 02:49:21 -0400 | 
| commit | 3dd6786f55219f87fd33e153669600d715ca9270 (patch) | |
| tree | 305f8389a93bf86df79f4cf8fb0050b1d6008939 /drivers/acpi/executer | |
| parent | f697b677620d04d8c77841745727de85f7e948b1 (diff) | |
| parent | 88db5e1489f23876a226f5393fd978ddc09dc5f9 (diff) | |
Pull bugzilla-8385 into release branch
Diffstat (limited to 'drivers/acpi/executer')
| -rw-r--r-- | drivers/acpi/executer/excreate.c | 5 | ||||
| -rw-r--r-- | drivers/acpi/executer/exdump.c | 2 | ||||
| -rw-r--r-- | drivers/acpi/executer/exmutex.c | 36 | ||||
| -rw-r--r-- | drivers/acpi/executer/exsystem.c | 30 | ||||
| -rw-r--r-- | drivers/acpi/executer/exutils.c | 104 | 
5 files changed, 113 insertions, 64 deletions
| diff --git a/drivers/acpi/executer/excreate.c b/drivers/acpi/executer/excreate.c index ae97812681a3..7c38528a7e83 100644 --- a/drivers/acpi/executer/excreate.c +++ b/drivers/acpi/executer/excreate.c | |||
| @@ -583,10 +583,7 @@ acpi_ex_create_method(u8 * aml_start, | |||
| 583 | * Get the sync_level. If method is serialized, a mutex will be | 583 | * Get the sync_level. If method is serialized, a mutex will be | 
| 584 | * created for this method when it is parsed. | 584 | * created for this method when it is parsed. | 
| 585 | */ | 585 | */ | 
| 586 | if (acpi_gbl_all_methods_serialized) { | 586 | if (method_flags & AML_METHOD_SERIALIZED) { | 
| 587 | obj_desc->method.sync_level = 0; | ||
| 588 | obj_desc->method.method_flags |= AML_METHOD_SERIALIZED; | ||
| 589 | } else if (method_flags & AML_METHOD_SERIALIZED) { | ||
| 590 | /* | 587 | /* | 
| 591 | * ACPI 1.0: sync_level = 0 | 588 | * ACPI 1.0: sync_level = 0 | 
| 592 | * ACPI 2.0: sync_level = sync_level in method declaration | 589 | * ACPI 2.0: sync_level = sync_level in method declaration | 
| diff --git a/drivers/acpi/executer/exdump.c b/drivers/acpi/executer/exdump.c index 1a73c14df2c5..68d283fd60e7 100644 --- a/drivers/acpi/executer/exdump.c +++ b/drivers/acpi/executer/exdump.c | |||
| @@ -134,7 +134,7 @@ static struct acpi_exdump_info acpi_ex_dump_method[8] = { | |||
| 134 | static struct acpi_exdump_info acpi_ex_dump_mutex[5] = { | 134 | static struct acpi_exdump_info acpi_ex_dump_mutex[5] = { | 
| 135 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_mutex), NULL}, | 135 | {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_mutex), NULL}, | 
| 136 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(mutex.sync_level), "Sync Level"}, | 136 | {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(mutex.sync_level), "Sync Level"}, | 
| 137 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.owner_thread_id), "Owner Thread"}, | 137 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.owner_thread), "Owner Thread"}, | 
| 138 | {ACPI_EXD_UINT16, ACPI_EXD_OFFSET(mutex.acquisition_depth), | 138 | {ACPI_EXD_UINT16, ACPI_EXD_OFFSET(mutex.acquisition_depth), | 
| 139 | "Acquire Depth"}, | 139 | "Acquire Depth"}, | 
| 140 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.os_mutex), "OsMutex"} | 140 | {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.os_mutex), "OsMutex"} | 
| diff --git a/drivers/acpi/executer/exmutex.c b/drivers/acpi/executer/exmutex.c index 4eb883bda6ae..5101bad5baf8 100644 --- a/drivers/acpi/executer/exmutex.c +++ b/drivers/acpi/executer/exmutex.c | |||
| @@ -66,9 +66,10 @@ acpi_ex_link_mutex(union acpi_operand_object *obj_desc, | |||
| 66 | * | 66 | * | 
| 67 | ******************************************************************************/ | 67 | ******************************************************************************/ | 
| 68 | 68 | ||
| 69 | void acpi_ex_unlink_mutex(union acpi_operand_object *obj_desc, | 69 | void acpi_ex_unlink_mutex(union acpi_operand_object *obj_desc) | 
| 70 | struct acpi_thread_state *thread) | ||
| 71 | { | 70 | { | 
| 71 | struct acpi_thread_state *thread = obj_desc->mutex.owner_thread; | ||
| 72 | |||
| 72 | if (!thread) { | 73 | if (!thread) { | 
| 73 | return; | 74 | return; | 
| 74 | } | 75 | } | 
| @@ -173,13 +174,16 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc, | |||
| 173 | 174 | ||
| 174 | /* Support for multiple acquires by the owning thread */ | 175 | /* Support for multiple acquires by the owning thread */ | 
| 175 | 176 | ||
| 176 | if (obj_desc->mutex.owner_thread_id == acpi_os_get_thread_id()) { | 177 | if (obj_desc->mutex.owner_thread) { | 
| 177 | /* | 178 | if (obj_desc->mutex.owner_thread->thread_id == | 
| 178 | * The mutex is already owned by this thread, just increment the | 179 | walk_state->thread->thread_id) { | 
| 179 | * acquisition depth | 180 | /* | 
| 180 | */ | 181 | * The mutex is already owned by this thread, just increment the | 
| 181 | obj_desc->mutex.acquisition_depth++; | 182 | * acquisition depth | 
| 182 | return_ACPI_STATUS(AE_OK); | 183 | */ | 
| 184 | obj_desc->mutex.acquisition_depth++; | ||
| 185 | return_ACPI_STATUS(AE_OK); | ||
| 186 | } | ||
| 183 | } | 187 | } | 
| 184 | 188 | ||
| 185 | /* Acquire the mutex, wait if necessary. Special case for Global Lock */ | 189 | /* Acquire the mutex, wait if necessary. Special case for Global Lock */ | 
| @@ -202,7 +206,7 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc, | |||
| 202 | 206 | ||
| 203 | /* Have the mutex: update mutex and walk info and save the sync_level */ | 207 | /* Have the mutex: update mutex and walk info and save the sync_level */ | 
| 204 | 208 | ||
| 205 | obj_desc->mutex.owner_thread_id = acpi_os_get_thread_id(); | 209 | obj_desc->mutex.owner_thread = walk_state->thread; | 
| 206 | obj_desc->mutex.acquisition_depth = 1; | 210 | obj_desc->mutex.acquisition_depth = 1; | 
| 207 | obj_desc->mutex.original_sync_level = | 211 | obj_desc->mutex.original_sync_level = | 
| 208 | walk_state->thread->current_sync_level; | 212 | walk_state->thread->current_sync_level; | 
| @@ -242,7 +246,7 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc, | |||
| 242 | 246 | ||
| 243 | /* The mutex must have been previously acquired in order to release it */ | 247 | /* The mutex must have been previously acquired in order to release it */ | 
| 244 | 248 | ||
| 245 | if (!obj_desc->mutex.owner_thread_id) { | 249 | if (!obj_desc->mutex.owner_thread) { | 
| 246 | ACPI_ERROR((AE_INFO, | 250 | ACPI_ERROR((AE_INFO, | 
| 247 | "Cannot release Mutex [%4.4s], not acquired", | 251 | "Cannot release Mutex [%4.4s], not acquired", | 
| 248 | acpi_ut_get_node_name(obj_desc->mutex.node))); | 252 | acpi_ut_get_node_name(obj_desc->mutex.node))); | 
| @@ -262,14 +266,14 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc, | |||
| 262 | * The Mutex is owned, but this thread must be the owner. | 266 | * The Mutex is owned, but this thread must be the owner. | 
| 263 | * Special case for Global Lock, any thread can release | 267 | * Special case for Global Lock, any thread can release | 
| 264 | */ | 268 | */ | 
| 265 | if ((obj_desc->mutex.owner_thread_id != | 269 | if ((obj_desc->mutex.owner_thread->thread_id != | 
| 266 | walk_state->thread->thread_id) | 270 | walk_state->thread->thread_id) | 
| 267 | && (obj_desc->mutex.os_mutex != acpi_gbl_global_lock_mutex)) { | 271 | && (obj_desc->mutex.os_mutex != acpi_gbl_global_lock_mutex)) { | 
| 268 | ACPI_ERROR((AE_INFO, | 272 | ACPI_ERROR((AE_INFO, | 
| 269 | "Thread %lX cannot release Mutex [%4.4s] acquired by thread %lX", | 273 | "Thread %lX cannot release Mutex [%4.4s] acquired by thread %lX", | 
| 270 | (unsigned long)walk_state->thread->thread_id, | 274 | (unsigned long)walk_state->thread->thread_id, | 
| 271 | acpi_ut_get_node_name(obj_desc->mutex.node), | 275 | acpi_ut_get_node_name(obj_desc->mutex.node), | 
| 272 | (unsigned long)obj_desc->mutex.owner_thread_id)); | 276 | (unsigned long)obj_desc->mutex.owner_thread->thread_id)); | 
| 273 | return_ACPI_STATUS(AE_AML_NOT_OWNER); | 277 | return_ACPI_STATUS(AE_AML_NOT_OWNER); | 
| 274 | } | 278 | } | 
| 275 | 279 | ||
| @@ -296,7 +300,7 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc, | |||
| 296 | 300 | ||
| 297 | /* Unlink the mutex from the owner's list */ | 301 | /* Unlink the mutex from the owner's list */ | 
| 298 | 302 | ||
| 299 | acpi_ex_unlink_mutex(obj_desc, walk_state->thread); | 303 | acpi_ex_unlink_mutex(obj_desc); | 
| 300 | 304 | ||
| 301 | /* Release the mutex, special case for Global Lock */ | 305 | /* Release the mutex, special case for Global Lock */ | 
| 302 | 306 | ||
| @@ -308,7 +312,7 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc, | |||
| 308 | 312 | ||
| 309 | /* Update the mutex and restore sync_level */ | 313 | /* Update the mutex and restore sync_level */ | 
| 310 | 314 | ||
| 311 | obj_desc->mutex.owner_thread_id = ACPI_MUTEX_NOT_ACQUIRED; | 315 | obj_desc->mutex.owner_thread = NULL; | 
| 312 | walk_state->thread->current_sync_level = | 316 | walk_state->thread->current_sync_level = | 
| 313 | obj_desc->mutex.original_sync_level; | 317 | obj_desc->mutex.original_sync_level; | 
| 314 | 318 | ||
| @@ -363,7 +367,7 @@ void acpi_ex_release_all_mutexes(struct acpi_thread_state *thread) | |||
| 363 | 367 | ||
| 364 | /* Mark mutex unowned */ | 368 | /* Mark mutex unowned */ | 
| 365 | 369 | ||
| 366 | obj_desc->mutex.owner_thread_id = ACPI_MUTEX_NOT_ACQUIRED; | 370 | obj_desc->mutex.owner_thread = NULL; | 
| 367 | 371 | ||
| 368 | /* Update Thread sync_level (Last mutex is the important one) */ | 372 | /* Update Thread sync_level (Last mutex is the important one) */ | 
| 369 | 373 | ||
| diff --git a/drivers/acpi/executer/exsystem.c b/drivers/acpi/executer/exsystem.c index b2edf620ba89..9460baff3032 100644 --- a/drivers/acpi/executer/exsystem.c +++ b/drivers/acpi/executer/exsystem.c | |||
| @@ -66,7 +66,6 @@ ACPI_MODULE_NAME("exsystem") | |||
| 66 | acpi_status acpi_ex_system_wait_semaphore(acpi_semaphore semaphore, u16 timeout) | 66 | acpi_status acpi_ex_system_wait_semaphore(acpi_semaphore semaphore, u16 timeout) | 
| 67 | { | 67 | { | 
| 68 | acpi_status status; | 68 | acpi_status status; | 
| 69 | acpi_status status2; | ||
| 70 | 69 | ||
| 71 | ACPI_FUNCTION_TRACE(ex_system_wait_semaphore); | 70 | ACPI_FUNCTION_TRACE(ex_system_wait_semaphore); | 
| 72 | 71 | ||
| @@ -79,7 +78,7 @@ acpi_status acpi_ex_system_wait_semaphore(acpi_semaphore semaphore, u16 timeout) | |||
| 79 | 78 | ||
| 80 | /* We must wait, so unlock the interpreter */ | 79 | /* We must wait, so unlock the interpreter */ | 
| 81 | 80 | ||
| 82 | acpi_ex_exit_interpreter(); | 81 | acpi_ex_relinquish_interpreter(); | 
| 83 | 82 | ||
| 84 | status = acpi_os_wait_semaphore(semaphore, 1, timeout); | 83 | status = acpi_os_wait_semaphore(semaphore, 1, timeout); | 
| 85 | 84 | ||
| @@ -89,13 +88,7 @@ acpi_status acpi_ex_system_wait_semaphore(acpi_semaphore semaphore, u16 timeout) | |||
| 89 | 88 | ||
| 90 | /* Reacquire the interpreter */ | 89 | /* Reacquire the interpreter */ | 
| 91 | 90 | ||
| 92 | status2 = acpi_ex_enter_interpreter(); | 91 | acpi_ex_reacquire_interpreter(); | 
| 93 | if (ACPI_FAILURE(status2)) { | ||
| 94 | |||
| 95 | /* Report fatal error, could not acquire interpreter */ | ||
| 96 | |||
| 97 | return_ACPI_STATUS(status2); | ||
| 98 | } | ||
| 99 | } | 92 | } | 
| 100 | 93 | ||
| 101 | return_ACPI_STATUS(status); | 94 | return_ACPI_STATUS(status); | 
| @@ -119,7 +112,6 @@ acpi_status acpi_ex_system_wait_semaphore(acpi_semaphore semaphore, u16 timeout) | |||
| 119 | acpi_status acpi_ex_system_wait_mutex(acpi_mutex mutex, u16 timeout) | 112 | acpi_status acpi_ex_system_wait_mutex(acpi_mutex mutex, u16 timeout) | 
| 120 | { | 113 | { | 
| 121 | acpi_status status; | 114 | acpi_status status; | 
| 122 | acpi_status status2; | ||
| 123 | 115 | ||
| 124 | ACPI_FUNCTION_TRACE(ex_system_wait_mutex); | 116 | ACPI_FUNCTION_TRACE(ex_system_wait_mutex); | 
| 125 | 117 | ||
| @@ -132,7 +124,7 @@ acpi_status acpi_ex_system_wait_mutex(acpi_mutex mutex, u16 timeout) | |||
| 132 | 124 | ||
| 133 | /* We must wait, so unlock the interpreter */ | 125 | /* We must wait, so unlock the interpreter */ | 
| 134 | 126 | ||
| 135 | acpi_ex_exit_interpreter(); | 127 | acpi_ex_relinquish_interpreter(); | 
| 136 | 128 | ||
| 137 | status = acpi_os_acquire_mutex(mutex, timeout); | 129 | status = acpi_os_acquire_mutex(mutex, timeout); | 
| 138 | 130 | ||
| @@ -142,13 +134,7 @@ acpi_status acpi_ex_system_wait_mutex(acpi_mutex mutex, u16 timeout) | |||
| 142 | 134 | ||
| 143 | /* Reacquire the interpreter */ | 135 | /* Reacquire the interpreter */ | 
| 144 | 136 | ||
| 145 | status2 = acpi_ex_enter_interpreter(); | 137 | acpi_ex_reacquire_interpreter(); | 
| 146 | if (ACPI_FAILURE(status2)) { | ||
| 147 | |||
| 148 | /* Report fatal error, could not acquire interpreter */ | ||
| 149 | |||
| 150 | return_ACPI_STATUS(status2); | ||
| 151 | } | ||
| 152 | } | 138 | } | 
| 153 | 139 | ||
| 154 | return_ACPI_STATUS(status); | 140 | return_ACPI_STATUS(status); | 
| @@ -209,20 +195,18 @@ acpi_status acpi_ex_system_do_stall(u32 how_long) | |||
| 209 | 195 | ||
| 210 | acpi_status acpi_ex_system_do_suspend(acpi_integer how_long) | 196 | acpi_status acpi_ex_system_do_suspend(acpi_integer how_long) | 
| 211 | { | 197 | { | 
| 212 | acpi_status status; | ||
| 213 | |||
| 214 | ACPI_FUNCTION_ENTRY(); | 198 | ACPI_FUNCTION_ENTRY(); | 
| 215 | 199 | ||
| 216 | /* Since this thread will sleep, we must release the interpreter */ | 200 | /* Since this thread will sleep, we must release the interpreter */ | 
| 217 | 201 | ||
| 218 | acpi_ex_exit_interpreter(); | 202 | acpi_ex_relinquish_interpreter(); | 
| 219 | 203 | ||
| 220 | acpi_os_sleep(how_long); | 204 | acpi_os_sleep(how_long); | 
| 221 | 205 | ||
| 222 | /* And now we must get the interpreter again */ | 206 | /* And now we must get the interpreter again */ | 
| 223 | 207 | ||
| 224 | status = acpi_ex_enter_interpreter(); | 208 | acpi_ex_reacquire_interpreter(); | 
| 225 | return (status); | 209 | return (AE_OK); | 
| 226 | } | 210 | } | 
| 227 | 211 | ||
| 228 | /******************************************************************************* | 212 | /******************************************************************************* | 
| diff --git a/drivers/acpi/executer/exutils.c b/drivers/acpi/executer/exutils.c index aea461f3a48c..6b0aeccbb69b 100644 --- a/drivers/acpi/executer/exutils.c +++ b/drivers/acpi/executer/exutils.c | |||
| @@ -76,14 +76,15 @@ static u32 acpi_ex_digits_needed(acpi_integer value, u32 base); | |||
| 76 | * | 76 | * | 
| 77 | * PARAMETERS: None | 77 | * PARAMETERS: None | 
| 78 | * | 78 | * | 
| 79 | * RETURN: Status | 79 | * RETURN: None | 
| 80 | * | 80 | * | 
| 81 | * DESCRIPTION: Enter the interpreter execution region. Failure to enter | 81 | * DESCRIPTION: Enter the interpreter execution region. Failure to enter | 
| 82 | * the interpreter region is a fatal system error | 82 | * the interpreter region is a fatal system error. Used in | 
| 83 | * conjunction with exit_interpreter. | ||
| 83 | * | 84 | * | 
| 84 | ******************************************************************************/ | 85 | ******************************************************************************/ | 
| 85 | 86 | ||
| 86 | acpi_status acpi_ex_enter_interpreter(void) | 87 | void acpi_ex_enter_interpreter(void) | 
| 87 | { | 88 | { | 
| 88 | acpi_status status; | 89 | acpi_status status; | 
| 89 | 90 | ||
| @@ -91,31 +92,55 @@ acpi_status acpi_ex_enter_interpreter(void) | |||
| 91 | 92 | ||
| 92 | status = acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER); | 93 | status = acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER); | 
| 93 | if (ACPI_FAILURE(status)) { | 94 | if (ACPI_FAILURE(status)) { | 
| 94 | ACPI_ERROR((AE_INFO, "Could not acquire interpreter mutex")); | 95 | ACPI_ERROR((AE_INFO, | 
| 96 | "Could not acquire AML Interpreter mutex")); | ||
| 95 | } | 97 | } | 
| 96 | 98 | ||
| 97 | return_ACPI_STATUS(status); | 99 | return_VOID; | 
| 98 | } | 100 | } | 
| 99 | 101 | ||
| 100 | /******************************************************************************* | 102 | /******************************************************************************* | 
| 101 | * | 103 | * | 
| 102 | * FUNCTION: acpi_ex_exit_interpreter | 104 | * FUNCTION: acpi_ex_reacquire_interpreter | 
| 103 | * | 105 | * | 
| 104 | * PARAMETERS: None | 106 | * PARAMETERS: None | 
| 105 | * | 107 | * | 
| 106 | * RETURN: None | 108 | * RETURN: None | 
| 107 | * | 109 | * | 
| 108 | * DESCRIPTION: Exit the interpreter execution region | 110 | * DESCRIPTION: Reacquire the interpreter execution region from within the | 
| 111 | * interpreter code. Failure to enter the interpreter region is a | ||
| 112 | * fatal system error. Used in conjuction with | ||
| 113 | * relinquish_interpreter | ||
| 114 | * | ||
| 115 | ******************************************************************************/ | ||
| 116 | |||
| 117 | void acpi_ex_reacquire_interpreter(void) | ||
| 118 | { | ||
| 119 | ACPI_FUNCTION_TRACE(ex_reacquire_interpreter); | ||
| 120 | |||
| 121 | /* | ||
| 122 | * If the global serialized flag is set, do not release the interpreter, | ||
| 123 | * since it was not actually released by acpi_ex_relinquish_interpreter. | ||
| 124 | * This forces the interpreter to be single threaded. | ||
| 125 | */ | ||
| 126 | if (!acpi_gbl_all_methods_serialized) { | ||
| 127 | acpi_ex_enter_interpreter(); | ||
| 128 | } | ||
| 129 | |||
| 130 | return_VOID; | ||
| 131 | } | ||
| 132 | |||
| 133 | /******************************************************************************* | ||
| 134 | * | ||
| 135 | * FUNCTION: acpi_ex_exit_interpreter | ||
| 136 | * | ||
| 137 | * PARAMETERS: None | ||
| 138 | * | ||
| 139 | * RETURN: None | ||
| 109 | * | 140 | * | 
| 110 | * Cases where the interpreter is unlocked: | 141 | * DESCRIPTION: Exit the interpreter execution region. This is the top level | 
| 111 | * 1) Completion of the execution of a control method | 142 | * routine used to exit the interpreter when all processing has | 
| 112 | * 2) Method blocked on a Sleep() AML opcode | 143 | * been completed. | 
| 113 | * 3) Method blocked on an Acquire() AML opcode | ||
| 114 | * 4) Method blocked on a Wait() AML opcode | ||
| 115 | * 5) Method blocked to acquire the global lock | ||
| 116 | * 6) Method blocked to execute a serialized control method that is | ||
| 117 | * already executing | ||
| 118 | * 7) About to invoke a user-installed opregion handler | ||
| 119 | * | 144 | * | 
| 120 | ******************************************************************************/ | 145 | ******************************************************************************/ | 
| 121 | 146 | ||
| @@ -127,7 +152,46 @@ void acpi_ex_exit_interpreter(void) | |||
| 127 | 152 | ||
| 128 | status = acpi_ut_release_mutex(ACPI_MTX_INTERPRETER); | 153 | status = acpi_ut_release_mutex(ACPI_MTX_INTERPRETER); | 
| 129 | if (ACPI_FAILURE(status)) { | 154 | if (ACPI_FAILURE(status)) { | 
| 130 | ACPI_ERROR((AE_INFO, "Could not release interpreter mutex")); | 155 | ACPI_ERROR((AE_INFO, | 
| 156 | "Could not release AML Interpreter mutex")); | ||
| 157 | } | ||
| 158 | |||
| 159 | return_VOID; | ||
| 160 | } | ||
| 161 | |||
| 162 | /******************************************************************************* | ||
| 163 | * | ||
| 164 | * FUNCTION: acpi_ex_relinquish_interpreter | ||
| 165 | * | ||
| 166 | * PARAMETERS: None | ||
| 167 | * | ||
| 168 | * RETURN: None | ||
| 169 | * | ||
| 170 | * DESCRIPTION: Exit the interpreter execution region, from within the | ||
| 171 | * interpreter - before attempting an operation that will possibly | ||
| 172 | * block the running thread. | ||
| 173 | * | ||
| 174 | * Cases where the interpreter is unlocked internally | ||
| 175 | * 1) Method to be blocked on a Sleep() AML opcode | ||
| 176 | * 2) Method to be blocked on an Acquire() AML opcode | ||
| 177 | * 3) Method to be blocked on a Wait() AML opcode | ||
| 178 | * 4) Method to be blocked to acquire the global lock | ||
| 179 | * 5) Method to be blocked waiting to execute a serialized control method | ||
| 180 | * that is currently executing | ||
| 181 | * 6) About to invoke a user-installed opregion handler | ||
| 182 | * | ||
| 183 | ******************************************************************************/ | ||
| 184 | |||
| 185 | void acpi_ex_relinquish_interpreter(void) | ||
| 186 | { | ||
| 187 | ACPI_FUNCTION_TRACE(ex_relinquish_interpreter); | ||
| 188 | |||
| 189 | /* | ||
| 190 | * If the global serialized flag is set, do not release the interpreter. | ||
| 191 | * This forces the interpreter to be single threaded. | ||
| 192 | */ | ||
| 193 | if (!acpi_gbl_all_methods_serialized) { | ||
| 194 | acpi_ex_exit_interpreter(); | ||
| 131 | } | 195 | } | 
| 132 | 196 | ||
| 133 | return_VOID; | 197 | return_VOID; | 
| @@ -141,8 +205,8 @@ void acpi_ex_exit_interpreter(void) | |||
| 141 | * | 205 | * | 
| 142 | * RETURN: none | 206 | * RETURN: none | 
| 143 | * | 207 | * | 
| 144 | * DESCRIPTION: Truncate a number to 32-bits if the currently executing method | 208 | * DESCRIPTION: Truncate an ACPI Integer to 32 bits if the execution mode is | 
| 145 | * belongs to a 32-bit ACPI table. | 209 | * 32-bit, as determined by the revision of the DSDT. | 
| 146 | * | 210 | * | 
| 147 | ******************************************************************************/ | 211 | ******************************************************************************/ | 
| 148 | 212 | ||
