View | Details | Raw Unified | Return to bug 8171 | Differences between
and this patch

Collapse All | Expand All

(-)a/drivers/acpi/events/evmisc.c (-2 / +6 lines)
Lines 196-206 acpi_ev_queue_notify_request(struct acpi_namespace_node * node, Link Here
196
		notify_info->notify.value = (u16) notify_value;
196
		notify_info->notify.value = (u16) notify_value;
197
		notify_info->notify.handler_obj = handler_obj;
197
		notify_info->notify.handler_obj = handler_obj;
198
198
199
		acpi_ex_relinquish_interpreter();
199
		acpi_ex_exit_interpreter();
200
200
201
		acpi_ev_notify_dispatch(notify_info);
201
		acpi_ev_notify_dispatch(notify_info);
202
202
203
		acpi_ex_reacquire_interpreter();
203
		status = acpi_ex_enter_interpreter();
204
		if (ACPI_FAILURE(status)) {
205
			return_ACPI_STATUS(status);
206
		}
207
204
	}
208
	}
205
209
206
	if (!handler_obj) {
210
	if (!handler_obj) {
(-)a/drivers/acpi/events/evregion.c (-4 / +11 lines)
Lines 291-296 acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, Link Here
291
			       u32 bit_width, acpi_integer * value)
291
			       u32 bit_width, acpi_integer * value)
292
{
292
{
293
	acpi_status status;
293
	acpi_status status;
294
	acpi_status status2;
294
	acpi_adr_space_handler handler;
295
	acpi_adr_space_handler handler;
295
	acpi_adr_space_setup region_setup;
296
	acpi_adr_space_setup region_setup;
296
	union acpi_operand_object *handler_desc;
297
	union acpi_operand_object *handler_desc;
Lines 344-350 acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, Link Here
344
		 * setup will potentially execute control methods
345
		 * setup will potentially execute control methods
345
		 * (e.g., _REG method for this region)
346
		 * (e.g., _REG method for this region)
346
		 */
347
		 */
347
		acpi_ex_relinquish_interpreter();
348
		acpi_ex_exit_interpreter();
348
349
349
		status = region_setup(region_obj, ACPI_REGION_ACTIVATE,
350
		status = region_setup(region_obj, ACPI_REGION_ACTIVATE,
350
				      handler_desc->address_space.context,
351
				      handler_desc->address_space.context,
Lines 352-358 acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, Link Here
352
353
353
		/* Re-enter the interpreter */
354
		/* Re-enter the interpreter */
354
355
355
		acpi_ex_reacquire_interpreter();
356
		status2 = acpi_ex_enter_interpreter();
357
		if (ACPI_FAILURE(status2)) {
358
			return_ACPI_STATUS(status2);
359
		}
356
360
357
		/* Check for failure of the Region Setup */
361
		/* Check for failure of the Region Setup */
358
362
Lines 405-411 acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, Link Here
405
		 * exit the interpreter because the handler *might* block -- we don't
409
		 * exit the interpreter because the handler *might* block -- we don't
406
		 * know what it will do, so we can't hold the lock on the intepreter.
410
		 * know what it will do, so we can't hold the lock on the intepreter.
407
		 */
411
		 */
408
		acpi_ex_relinquish_interpreter();
412
		acpi_ex_exit_interpreter();
409
	}
413
	}
410
414
411
	/* Call the handler */
415
	/* Call the handler */
Lines 426-432 acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, Link Here
426
		 * We just returned from a non-default handler, we must re-enter the
430
		 * We just returned from a non-default handler, we must re-enter the
427
		 * interpreter
431
		 * interpreter
428
		 */
432
		 */
429
		acpi_ex_reacquire_interpreter();
433
		status2 = acpi_ex_enter_interpreter();
434
		if (ACPI_FAILURE(status2)) {
435
			return_ACPI_STATUS(status2);
436
		}
430
	}
437
	}
431
438
432
	return_ACPI_STATUS(status);
439
	return_ACPI_STATUS(status);
(-)a/drivers/acpi/events/evxface.c (-2 / +4 lines)
Lines 768-776 acpi_status acpi_acquire_global_lock(u16 timeout, u32 * handle) Link Here
768
		return (AE_BAD_PARAMETER);
768
		return (AE_BAD_PARAMETER);
769
	}
769
	}
770
770
771
	/* Must lock interpreter to prevent race conditions */
771
	status = acpi_ex_enter_interpreter();
772
	if (ACPI_FAILURE(status)) {
773
		return (status);
774
	}
772
775
773
	acpi_ex_enter_interpreter();
774
	status = acpi_ev_acquire_global_lock(timeout);
776
	status = acpi_ev_acquire_global_lock(timeout);
775
	acpi_ex_exit_interpreter();
777
	acpi_ex_exit_interpreter();
776
778
(-)a/drivers/acpi/executer/excreate.c (-1 / +4 lines)
Lines 583-589 acpi_ex_create_method(u8 * aml_start, Link Here
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 (method_flags & AML_METHOD_SERIALIZED) {
586
	if (acpi_gbl_all_methods_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) {
587
		/*
590
		/*
588
		 * ACPI 1.0: sync_level = 0
591
		 * ACPI 1.0: sync_level = 0
589
		 * ACPI 2.0: sync_level = sync_level in method declaration
592
		 * ACPI 2.0: sync_level = sync_level in method declaration
(-)a/drivers/acpi/executer/exsystem.c (-7 / +23 lines)
Lines 66-71 ACPI_MODULE_NAME("exsystem") Link Here
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;
69
70
70
	ACPI_FUNCTION_TRACE(ex_system_wait_semaphore);
71
	ACPI_FUNCTION_TRACE(ex_system_wait_semaphore);
71
72
Lines 78-84 acpi_status acpi_ex_system_wait_semaphore(acpi_semaphore semaphore, u16 timeout) Link Here
78
79
79
		/* We must wait, so unlock the interpreter */
80
		/* We must wait, so unlock the interpreter */
80
81
81
		acpi_ex_relinquish_interpreter();
82
		acpi_ex_exit_interpreter();
82
83
83
		status = acpi_os_wait_semaphore(semaphore, 1, timeout);
84
		status = acpi_os_wait_semaphore(semaphore, 1, timeout);
84
85
Lines 88-94 acpi_status acpi_ex_system_wait_semaphore(acpi_semaphore semaphore, u16 timeout) Link Here
88
89
89
		/* Reacquire the interpreter */
90
		/* Reacquire the interpreter */
90
91
91
		acpi_ex_reacquire_interpreter();
92
		status2 = acpi_ex_enter_interpreter();
93
		if (ACPI_FAILURE(status2)) {
94
95
			/* Report fatal error, could not acquire interpreter */
96
97
			return_ACPI_STATUS(status2);
98
		}
92
	}
99
	}
93
100
94
	return_ACPI_STATUS(status);
101
	return_ACPI_STATUS(status);
Lines 112-117 acpi_status acpi_ex_system_wait_semaphore(acpi_semaphore semaphore, u16 timeout) Link Here
112
acpi_status acpi_ex_system_wait_mutex(acpi_mutex mutex, u16 timeout)
119
acpi_status acpi_ex_system_wait_mutex(acpi_mutex mutex, u16 timeout)
113
{
120
{
114
	acpi_status status;
121
	acpi_status status;
122
	acpi_status status2;
115
123
116
	ACPI_FUNCTION_TRACE(ex_system_wait_mutex);
124
	ACPI_FUNCTION_TRACE(ex_system_wait_mutex);
117
125
Lines 124-130 acpi_status acpi_ex_system_wait_mutex(acpi_mutex mutex, u16 timeout) Link Here
124
132
125
		/* We must wait, so unlock the interpreter */
133
		/* We must wait, so unlock the interpreter */
126
134
127
		acpi_ex_relinquish_interpreter();
135
		acpi_ex_exit_interpreter();
128
136
129
		status = acpi_os_acquire_mutex(mutex, timeout);
137
		status = acpi_os_acquire_mutex(mutex, timeout);
130
138
Lines 134-140 acpi_status acpi_ex_system_wait_mutex(acpi_mutex mutex, u16 timeout) Link Here
134
142
135
		/* Reacquire the interpreter */
143
		/* Reacquire the interpreter */
136
144
137
		acpi_ex_reacquire_interpreter();
145
		status2 = acpi_ex_enter_interpreter();
146
		if (ACPI_FAILURE(status2)) {
147
148
			/* Report fatal error, could not acquire interpreter */
149
150
			return_ACPI_STATUS(status2);
151
		}
138
	}
152
	}
139
153
140
	return_ACPI_STATUS(status);
154
	return_ACPI_STATUS(status);
Lines 195-212 acpi_status acpi_ex_system_do_stall(u32 how_long) Link Here
195
209
196
acpi_status acpi_ex_system_do_suspend(acpi_integer how_long)
210
acpi_status acpi_ex_system_do_suspend(acpi_integer how_long)
197
{
211
{
212
	acpi_status status;
213
198
	ACPI_FUNCTION_ENTRY();
214
	ACPI_FUNCTION_ENTRY();
199
215
200
	/* Since this thread will sleep, we must release the interpreter */
216
	/* Since this thread will sleep, we must release the interpreter */
201
217
202
	acpi_ex_relinquish_interpreter();
218
	acpi_ex_exit_interpreter();
203
219
204
	acpi_os_sleep(how_long);
220
	acpi_os_sleep(how_long);
205
221
206
	/* And now we must get the interpreter again */
222
	/* And now we must get the interpreter again */
207
223
208
	acpi_ex_reacquire_interpreter();
224
	status = acpi_ex_enter_interpreter();
209
	return (AE_OK);
225
	return (status);
210
}
226
}
211
227
212
/*******************************************************************************
228
/*******************************************************************************
(-)a/drivers/acpi/executer/exutils.c (-84 / +20 lines)
Lines 76-90 static u32 acpi_ex_digits_needed(acpi_integer value, u32 base); Link Here
76
 *
76
 *
77
 * PARAMETERS:  None
77
 * PARAMETERS:  None
78
 *
78
 *
79
 * RETURN:      None
79
 * RETURN:      Status
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. Used in
82
 *              the interpreter region is a fatal system error
83
 *              conjunction with exit_interpreter.
84
 *
83
 *
85
 ******************************************************************************/
84
 ******************************************************************************/
86
85
87
void acpi_ex_enter_interpreter(void)
86
acpi_status acpi_ex_enter_interpreter(void)
88
{
87
{
89
	acpi_status status;
88
	acpi_status status;
90
89
Lines 92-133 void acpi_ex_enter_interpreter(void) Link Here
92
91
93
	status = acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER);
92
	status = acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER);
94
	if (ACPI_FAILURE(status)) {
93
	if (ACPI_FAILURE(status)) {
95
		ACPI_ERROR((AE_INFO,
94
		ACPI_ERROR((AE_INFO, "Could not acquire interpreter mutex"));
96
			    "Could not acquire AML Interpreter mutex"));
97
	}
95
	}
98
96
99
	return_VOID;
97
	return_ACPI_STATUS(status);
100
}
101
102
/*******************************************************************************
103
 *
104
 * FUNCTION:    acpi_ex_reacquire_interpreter
105
 *
106
 * PARAMETERS:  None
107
 *
108
 * RETURN:      None
109
 *
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
}
98
}
132
99
133
/*******************************************************************************
100
/*******************************************************************************
Lines 138-146 void acpi_ex_reacquire_interpreter(void) Link Here
138
 *
105
 *
139
 * RETURN:      None
106
 * RETURN:      None
140
 *
107
 *
141
 * DESCRIPTION: Exit the interpreter execution region. This is the top level
108
 * DESCRIPTION: Exit the interpreter execution region
142
 *              routine used to exit the interpreter when all processing has
109
 *
143
 *              been completed.
110
 * Cases where the interpreter is unlocked:
111
 *      1) Completion of the execution of a control method
112
 *      2) Method blocked on a Sleep() AML opcode
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
144
 *
119
 *
145
 ******************************************************************************/
120
 ******************************************************************************/
146
121
Lines 152-197 void acpi_ex_exit_interpreter(void) Link Here
152
127
153
	status = acpi_ut_release_mutex(ACPI_MTX_INTERPRETER);
128
	status = acpi_ut_release_mutex(ACPI_MTX_INTERPRETER);
154
	if (ACPI_FAILURE(status)) {
129
	if (ACPI_FAILURE(status)) {
155
		ACPI_ERROR((AE_INFO,
130
		ACPI_ERROR((AE_INFO, "Could not release interpreter mutex"));
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();
195
	}
131
	}
196
132
197
	return_VOID;
133
	return_VOID;
Lines 205-212 void acpi_ex_relinquish_interpreter(void) Link Here
205
 *
141
 *
206
 * RETURN:      none
142
 * RETURN:      none
207
 *
143
 *
208
 * DESCRIPTION: Truncate an ACPI Integer to 32 bits if the execution mode is
144
 * DESCRIPTION: Truncate a number to 32-bits if the currently executing method
209
 *              32-bit, as determined by the revision of the DSDT.
145
 *              belongs to a 32-bit ACPI table.
210
 *
146
 *
211
 ******************************************************************************/
147
 ******************************************************************************/
212
148
(-)a/drivers/acpi/namespace/nseval.c (-2 / +9 lines)
Lines 154-160 acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info) Link Here
154
		 * Execute the method via the interpreter. The interpreter is locked
154
		 * Execute the method via the interpreter. The interpreter is locked
155
		 * here before calling into the AML parser
155
		 * here before calling into the AML parser
156
		 */
156
		 */
157
		acpi_ex_enter_interpreter();
157
		status = acpi_ex_enter_interpreter();
158
		if (ACPI_FAILURE(status)) {
159
			return_ACPI_STATUS(status);
160
		}
161
158
		status = acpi_ps_execute_method(info);
162
		status = acpi_ps_execute_method(info);
159
		acpi_ex_exit_interpreter();
163
		acpi_ex_exit_interpreter();
160
	} else {
164
	} else {
Lines 178-184 acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info) Link Here
178
		 * resolution, we must lock it because we could access an opregion.
182
		 * resolution, we must lock it because we could access an opregion.
179
		 * The opregion access code assumes that the interpreter is locked.
183
		 * The opregion access code assumes that the interpreter is locked.
180
		 */
184
		 */
181
		acpi_ex_enter_interpreter();
185
		status = acpi_ex_enter_interpreter();
186
		if (ACPI_FAILURE(status)) {
187
			return_ACPI_STATUS(status);
188
		}
182
189
183
		/* Function has a strange interface */
190
		/* Function has a strange interface */
184
191
(-)a/drivers/acpi/namespace/nsinit.c (-2 / +5 lines)
Lines 214-220 acpi_ns_init_one_object(acpi_handle obj_handle, Link Here
214
			u32 level, void *context, void **return_value)
214
			u32 level, void *context, void **return_value)
215
{
215
{
216
	acpi_object_type type;
216
	acpi_object_type type;
217
	acpi_status status = AE_OK;
217
	acpi_status status;
218
	struct acpi_init_walk_info *info =
218
	struct acpi_init_walk_info *info =
219
	    (struct acpi_init_walk_info *)context;
219
	    (struct acpi_init_walk_info *)context;
220
	struct acpi_namespace_node *node =
220
	struct acpi_namespace_node *node =
Lines 268-274 acpi_ns_init_one_object(acpi_handle obj_handle, Link Here
268
	/*
268
	/*
269
	 * Must lock the interpreter before executing AML code
269
	 * Must lock the interpreter before executing AML code
270
	 */
270
	 */
271
	acpi_ex_enter_interpreter();
271
	status = acpi_ex_enter_interpreter();
272
	if (ACPI_FAILURE(status)) {
273
		return (status);
274
	}
272
275
273
	/*
276
	/*
274
	 * Each of these types can contain executable AML code within the
277
	 * Each of these types can contain executable AML code within the
(-)a/drivers/acpi/namespace/nsxfeval.c (-4 / +7 lines)
Lines 170-175 acpi_evaluate_object(acpi_handle handle, Link Here
170
		     struct acpi_buffer *return_buffer)
170
		     struct acpi_buffer *return_buffer)
171
{
171
{
172
	acpi_status status;
172
	acpi_status status;
173
	acpi_status status2;
173
	struct acpi_evaluate_info *info;
174
	struct acpi_evaluate_info *info;
174
	acpi_size buffer_space_needed;
175
	acpi_size buffer_space_needed;
175
	u32 i;
176
	u32 i;
Lines 328-339 acpi_evaluate_object(acpi_handle handle, Link Here
328
		 * Delete the internal return object. NOTE: Interpreter must be
329
		 * Delete the internal return object. NOTE: Interpreter must be
329
		 * locked to avoid race condition.
330
		 * locked to avoid race condition.
330
		 */
331
		 */
331
		acpi_ex_enter_interpreter();
332
		status2 = acpi_ex_enter_interpreter();
333
		if (ACPI_SUCCESS(status2)) {
332
334
333
		/* Remove one reference on the return object (should delete it) */
335
			/* Remove one reference on the return object (should delete it) */
334
336
335
		acpi_ut_remove_reference(info->return_object);
337
			acpi_ut_remove_reference(info->return_object);
336
		acpi_ex_exit_interpreter();
338
			acpi_ex_exit_interpreter();
339
		}
337
	}
340
	}
338
341
339
      cleanup:
342
      cleanup:
(-)a/include/acpi/acinterp.h (-5 / +1 lines)
Lines 446-459 acpi_ex_copy_integer_to_buffer_field(union acpi_operand_object *source_desc, Link Here
446
/*
446
/*
447
 * exutils - interpreter/scanner utilities
447
 * exutils - interpreter/scanner utilities
448
 */
448
 */
449
void acpi_ex_enter_interpreter(void);
449
acpi_status acpi_ex_enter_interpreter(void);
450
450
451
void acpi_ex_exit_interpreter(void);
451
void acpi_ex_exit_interpreter(void);
452
452
453
void acpi_ex_reacquire_interpreter(void);
454
455
void acpi_ex_relinquish_interpreter(void);
456
457
void acpi_ex_truncate_for32bit_table(union acpi_operand_object *obj_desc);
453
void acpi_ex_truncate_for32bit_table(union acpi_operand_object *obj_desc);
458
454
459
u8 acpi_ex_acquire_global_lock(u32 rule);
455
u8 acpi_ex_acquire_global_lock(u32 rule);

Return to bug 8171