ReactOS  0.4.15-dev-3326-ga91f5e8
evregion.c File Reference
#include "acpi.h"
#include "accommon.h"
#include "acevents.h"
#include "acnamesp.h"
#include "acinterp.h"
Include dependency graph for evregion.c:

Go to the source code of this file.

Macros

#define _COMPONENT   ACPI_EVENTS
 

Functions

static void AcpiEvExecuteOrphanRegMethod (ACPI_NAMESPACE_NODE *DeviceNode, ACPI_ADR_SPACE_TYPE SpaceId)
 
static ACPI_STATUS AcpiEvRegRun (ACPI_HANDLE ObjHandle, UINT32 Level, void *Context, void **ReturnValue)
 
ACPI_STATUS AcpiEvInitializeOpRegions (void)
 
ACPI_STATUS AcpiEvAddressSpaceDispatch (ACPI_OPERAND_OBJECT *RegionObj, ACPI_OPERAND_OBJECT *FieldObj, UINT32 Function, UINT32 RegionOffset, UINT32 BitWidth, UINT64 *Value)
 
void AcpiEvDetachRegion (ACPI_OPERAND_OBJECT *RegionObj, BOOLEAN AcpiNsIsLocked)
 
ACPI_STATUS AcpiEvAttachRegion (ACPI_OPERAND_OBJECT *HandlerObj, ACPI_OPERAND_OBJECT *RegionObj, BOOLEAN AcpiNsIsLocked)
 
ACPI_STATUS AcpiEvExecuteRegMethod (ACPI_OPERAND_OBJECT *RegionObj, UINT32 Function)
 
void AcpiEvExecuteRegMethods (ACPI_NAMESPACE_NODE *Node, ACPI_ADR_SPACE_TYPE SpaceId, UINT32 Function)
 

Variables

UINT8 AcpiGbl_DefaultAddressSpaces []
 

Macro Definition Documentation

◆ _COMPONENT

#define _COMPONENT   ACPI_EVENTS

Definition at line 50 of file evregion.c.

Function Documentation

◆ AcpiEvAddressSpaceDispatch()

ACPI_STATUS AcpiEvAddressSpaceDispatch ( ACPI_OPERAND_OBJECT RegionObj,
ACPI_OPERAND_OBJECT FieldObj,
UINT32  Function,
UINT32  RegionOffset,
UINT32  BitWidth,
UINT64 Value 
)

Definition at line 150 of file evregion.c.

157 {
160  ACPI_ADR_SPACE_SETUP RegionSetup;
161  ACPI_OPERAND_OBJECT *HandlerDesc;
162  ACPI_OPERAND_OBJECT *RegionObj2;
163  void *RegionContext = NULL;
165  ACPI_MUTEX ContextMutex;
166  BOOLEAN ContextLocked;
167  ACPI_PHYSICAL_ADDRESS Address;
168 
169 
170  ACPI_FUNCTION_TRACE (EvAddressSpaceDispatch);
171 
172 
173  RegionObj2 = AcpiNsGetSecondaryObject (RegionObj);
174  if (!RegionObj2)
175  {
177  }
178 
179  /* Ensure that there is a handler associated with this region */
180 
181  HandlerDesc = RegionObj->Region.Handler;
182  if (!HandlerDesc)
183  {
185  "No handler for Region [%4.4s] (%p) [%s]",
186  AcpiUtGetNodeName (RegionObj->Region.Node),
187  RegionObj, AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
188 
190  }
191 
192  Context = HandlerDesc->AddressSpace.Context;
193  ContextMutex = HandlerDesc->AddressSpace.ContextMutex;
194  ContextLocked = FALSE;
195 
196  /*
197  * It may be the case that the region has never been initialized.
198  * Some types of regions require special init code
199  */
200  if (!(RegionObj->Region.Flags & AOPOBJ_SETUP_COMPLETE))
201  {
202  /* This region has not been initialized yet, do it */
203 
204  RegionSetup = HandlerDesc->AddressSpace.Setup;
205  if (!RegionSetup)
206  {
207  /* No initialization routine, exit with error */
208 
210  "No init routine for region(%p) [%s]",
211  RegionObj, AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
213  }
214 
215  /*
216  * We must exit the interpreter because the region setup will
217  * potentially execute control methods (for example, the _REG method
218  * for this region)
219  */
221 
222  Status = RegionSetup (RegionObj, ACPI_REGION_ACTIVATE,
223  Context, &RegionContext);
224 
225  /* Re-enter the interpreter */
226 
228 
229  /* Check for failure of the Region Setup */
230 
231  if (ACPI_FAILURE (Status))
232  {
234  "During region initialization: [%s]",
235  AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
237  }
238 
239  /* Region initialization may have been completed by RegionSetup */
240 
241  if (!(RegionObj->Region.Flags & AOPOBJ_SETUP_COMPLETE))
242  {
243  RegionObj->Region.Flags |= AOPOBJ_SETUP_COMPLETE;
244 
245  /*
246  * Save the returned context for use in all accesses to
247  * the handler for this particular region
248  */
249  if (!(RegionObj2->Extra.RegionContext))
250  {
251  RegionObj2->Extra.RegionContext = RegionContext;
252  }
253  }
254  }
255 
256  /* We have everything we need, we can invoke the address space handler */
257 
258  Handler = HandlerDesc->AddressSpace.Handler;
259  Address = (RegionObj->Region.Address + RegionOffset);
260 
262  "Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
263  &RegionObj->Region.Handler->AddressSpace, Handler,
265  AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
266 
267  if (!(HandlerDesc->AddressSpace.HandlerFlags &
269  {
270  /*
271  * For handlers other than the default (supplied) handlers, we must
272  * exit the interpreter because the handler *might* block -- we don't
273  * know what it will do, so we can't hold the lock on the interpreter.
274  */
276  }
277 
278  /*
279  * Special handling for GenericSerialBus and GeneralPurposeIo:
280  * There are three extra parameters that must be passed to the
281  * handler via the context:
282  * 1) Connection buffer, a resource template from Connection() op
283  * 2) Length of the above buffer
284  * 3) Actual access length from the AccessAs() op
285  *
286  * Since we pass these extra parameters via the context, which is
287  * shared between threads, we must lock the context to avoid these
288  * parameters being changed from another thread before the handler
289  * has completed running.
290  *
291  * In addition, for GeneralPurposeIo, the Address and BitWidth fields
292  * are defined as follows:
293  * 1) Address is the pin number index of the field (bit offset from
294  * the previous Connection)
295  * 2) BitWidth is the actual bit length of the field (number of pins)
296  */
297  if ((RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS ||
298  RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GPIO) &&
299  Context &&
300  FieldObj)
301  {
302 
303  Status = AcpiOsAcquireMutex (ContextMutex, ACPI_WAIT_FOREVER);
304  if (ACPI_FAILURE (Status))
305  {
306  goto ReEnterInterpreter;
307  }
308 
309  ContextLocked = TRUE;
310 
311  /* Get the Connection (ResourceTemplate) buffer */
312 
313  Context->Connection = FieldObj->Field.ResourceBuffer;
314  Context->Length = FieldObj->Field.ResourceLength;
315  Context->AccessLength = FieldObj->Field.AccessLength;
316 
317  if (RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GPIO)
318  {
319  Address = FieldObj->Field.PinNumberIndex;
320  BitWidth = FieldObj->Field.BitLength;
321  }
322  }
323 
324  /* Call the handler */
325 
326  Status = Handler (Function, Address, BitWidth, Value, Context,
327  RegionObj2->Extra.RegionContext);
328 
329  if (ContextLocked)
330  {
331  AcpiOsReleaseMutex (ContextMutex);
332  }
333 
334  if (ACPI_FAILURE (Status))
335  {
336  ACPI_EXCEPTION ((AE_INFO, Status, "Returned by Handler for [%s]",
337  AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
338 
339  /*
340  * Special case for an EC timeout. These are seen so frequently
341  * that an additional error message is helpful
342  */
343  if ((RegionObj->Region.SpaceId == ACPI_ADR_SPACE_EC) &&
344  (Status == AE_TIME))
345  {
347  "Timeout from EC hardware or EC device driver"));
348  }
349  }
350 
351 ReEnterInterpreter:
352  if (!(HandlerDesc->AddressSpace.HandlerFlags &
354  {
355  /*
356  * We just returned from a non-default handler, we must re-enter the
357  * interpreter
358  */
360  }
361 
363 }
#define ACPI_EXCEPTION(plist)
Definition: acoutput.h:239
union acpi_operand_object * Handler
Definition: acobject.h:204
ACPI_STATUS(* ACPI_ADR_SPACE_SETUP)(ACPI_HANDLE RegionHandle, UINT32 Function, void *HandlerContext, void **RegionContext)
Definition: actypes.h:1216
ACPI_STATUS(* ACPI_ADR_SPACE_HANDLER)(UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, UINT64 *Value, void *HandlerContext, void *RegionContext)
Definition: actypes.h:1194
_In_ CDROM_SCAN_FOR_SPECIAL_INFO _In_ PCDROM_SCAN_FOR_SPECIAL_HANDLER Function
Definition: cdrom.h:1154
ACPI_NAMESPACE_NODE * Node
Definition: acobject.h:203
ACPI_MUTEX ContextMutex
Definition: acobject.h:416
#define TRUE
Definition: types.h:120
#define ACPI_ADR_SPACE_GPIO
Definition: actypes.h:860
ACPI_STATUS AcpiOsAcquireMutex(ACPI_MUTEX Handle, UINT16 Timeout)
Definition: osl.c:306
ACPI_ADR_SPACE_SETUP Setup
Definition: acobject.h:417
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define AE_TIME
Definition: acexcep.h:125
ACPI_OBJECT_COMMON_HEADER UINT8 SpaceId
Definition: acobject.h:202
#define ACPI_ADDR_HANDLER_DEFAULT_INSTALLED
Definition: acobject.h:425
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
ACPI_OBJECT_EXTRA Extra
Definition: acobject.h:540
const char * AcpiUtGetRegionName(UINT8 SpaceId)
Definition: utdecode.c:125
#define FALSE
Definition: types.h:117
#define AOPOBJ_SETUP_COMPLETE
Definition: acobject.h:99
unsigned char BOOLEAN
#define AE_INFO
Definition: acoutput.h:230
static WCHAR Address[46]
Definition: ping.c:68
#define ACPI_DB_OPREGION
Definition: acoutput.h:167
ACPI_ADR_SPACE_HANDLER Handler
Definition: acobject.h:413
ACPI_OBJECT_REGION Region
Definition: acobject.h:526
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:406
Status
Definition: gdiplustypes.h:24
#define ACPI_ADR_SPACE_EC
Definition: actypes.h:855
#define ACPI_WAIT_FOREVER
Definition: actypes.h:501
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
#define ACPI_ADR_SPACE_GSBUS
Definition: actypes.h:861
#define AE_NOT_EXIST
Definition: acexcep.h:114
ACPI_OBJECT_ADDR_HANDLER AddressSpace
Definition: acobject.h:538
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER Handler
Definition: acpixf.h:668
void AcpiExExitInterpreter(void)
Definition: exutils.c:139
void AcpiExEnterInterpreter(void)
Definition: exutils.c:91
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
#define ACPI_FORMAT_UINT64(i)
Definition: acmacros.h:71
#define NULL
Definition: types.h:112
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO UINT16 ResourceLength
Definition: acobject.h:344
const char * AcpiUtGetNodeName(void *Object)
Definition: utdecode.c:306
struct tagContext Context
Definition: acpixf.h:1034
ACPI_OBJECT_REGION_FIELD Field
Definition: acobject.h:533
ACPI_PHYSICAL_ADDRESS Address
Definition: acobject.h:206
void AcpiOsReleaseMutex(ACPI_MUTEX Handle)
Definition: osl.c:333
#define ACPI_REGION_ACTIVATE
Definition: actypes.h:1222
#define ACPI_MUTEX
Definition: actypes.h:273
void * RegionContext
Definition: acobject.h:482
ACPI_OPERAND_OBJECT * AcpiNsGetSecondaryObject(ACPI_OPERAND_OBJECT *ObjDesc)
Definition: nsobject.c:346

Referenced by AcpiExAccessRegion(), and AcpiExRegionRead().

◆ AcpiEvAttachRegion()

ACPI_STATUS AcpiEvAttachRegion ( ACPI_OPERAND_OBJECT HandlerObj,
ACPI_OPERAND_OBJECT RegionObj,
BOOLEAN  AcpiNsIsLocked 
)

Definition at line 551 of file evregion.c.

555 {
556 
557  ACPI_FUNCTION_TRACE (EvAttachRegion);
558 
559 
560  /* Install the region's handler */
561 
562  if (RegionObj->Region.Handler)
563  {
565  }
566 
568  "Adding Region [%4.4s] %p to address handler %p [%s]\n",
569  AcpiUtGetNodeName (RegionObj->Region.Node),
570  RegionObj, HandlerObj,
571  AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
572 
573  /* Link this region to the front of the handler's list */
574 
575  RegionObj->Region.Next = HandlerObj->AddressSpace.RegionList;
576  HandlerObj->AddressSpace.RegionList = RegionObj;
577  RegionObj->Region.Handler = HandlerObj;
578  AcpiUtAddReference (HandlerObj);
579 
581 }
void AcpiUtAddReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:751
union acpi_operand_object * Handler
Definition: acobject.h:204
union acpi_operand_object * Next
Definition: acobject.h:205
ACPI_NAMESPACE_NODE * Node
Definition: acobject.h:203
union acpi_operand_object * RegionList
Definition: acobject.h:418
ACPI_OBJECT_COMMON_HEADER UINT8 SpaceId
Definition: acobject.h:202
const char * AcpiUtGetRegionName(UINT8 SpaceId)
Definition: utdecode.c:125
#define ACPI_DB_OPREGION
Definition: acoutput.h:167
ACPI_OBJECT_REGION Region
Definition: acobject.h:526
#define AE_ALREADY_EXISTS
Definition: acexcep.h:115
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
ACPI_OBJECT_ADDR_HANDLER AddressSpace
Definition: acobject.h:538
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
const char * AcpiUtGetNodeName(void *Object)
Definition: utdecode.c:306
#define AE_OK
Definition: acexcep.h:97

Referenced by AcpiEvInitializeRegion(), and AcpiEvInstallHandler().

◆ AcpiEvDetachRegion()

void AcpiEvDetachRegion ( ACPI_OPERAND_OBJECT RegionObj,
BOOLEAN  AcpiNsIsLocked 
)

Definition at line 381 of file evregion.c.

384 {
385  ACPI_OPERAND_OBJECT *HandlerObj;
386  ACPI_OPERAND_OBJECT *ObjDesc;
387  ACPI_OPERAND_OBJECT *StartDesc;
388  ACPI_OPERAND_OBJECT **LastObjPtr;
389  ACPI_ADR_SPACE_SETUP RegionSetup;
390  void **RegionContext;
391  ACPI_OPERAND_OBJECT *RegionObj2;
393 
394 
395  ACPI_FUNCTION_TRACE (EvDetachRegion);
396 
397 
398  RegionObj2 = AcpiNsGetSecondaryObject (RegionObj);
399  if (!RegionObj2)
400  {
401  return_VOID;
402  }
403  RegionContext = &RegionObj2->Extra.RegionContext;
404 
405  /* Get the address handler from the region object */
406 
407  HandlerObj = RegionObj->Region.Handler;
408  if (!HandlerObj)
409  {
410  /* This region has no handler, all done */
411 
412  return_VOID;
413  }
414 
415  /* Find this region in the handler's list */
416 
417  ObjDesc = HandlerObj->AddressSpace.RegionList;
418  StartDesc = ObjDesc;
419  LastObjPtr = &HandlerObj->AddressSpace.RegionList;
420 
421  while (ObjDesc)
422  {
423  /* Is this the correct Region? */
424 
425  if (ObjDesc == RegionObj)
426  {
428  "Removing Region %p from address handler %p\n",
429  RegionObj, HandlerObj));
430 
431  /* This is it, remove it from the handler's list */
432 
433  *LastObjPtr = ObjDesc->Region.Next;
434  ObjDesc->Region.Next = NULL; /* Must clear field */
435 
436  if (AcpiNsIsLocked)
437  {
439  if (ACPI_FAILURE (Status))
440  {
441  return_VOID;
442  }
443  }
444 
445  /* Now stop region accesses by executing the _REG method */
446 
448  if (ACPI_FAILURE (Status))
449  {
450  ACPI_EXCEPTION ((AE_INFO, Status, "from region _REG, [%s]",
451  AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
452  }
453 
454  if (AcpiNsIsLocked)
455  {
457  if (ACPI_FAILURE (Status))
458  {
459  return_VOID;
460  }
461  }
462 
463  /*
464  * If the region has been activated, call the setup handler with
465  * the deactivate notification
466  */
467  if (RegionObj->Region.Flags & AOPOBJ_SETUP_COMPLETE)
468  {
469  RegionSetup = HandlerObj->AddressSpace.Setup;
470  Status = RegionSetup (RegionObj, ACPI_REGION_DEACTIVATE,
471  HandlerObj->AddressSpace.Context, RegionContext);
472 
473  /*
474  * RegionContext should have been released by the deactivate
475  * operation. We don't need access to it anymore here.
476  */
477  if (RegionContext)
478  {
479  *RegionContext = NULL;
480  }
481 
482  /* Init routine may fail, Just ignore errors */
483 
484  if (ACPI_FAILURE (Status))
485  {
487  "from region handler - deactivate, [%s]",
488  AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
489  }
490 
491  RegionObj->Region.Flags &= ~(AOPOBJ_SETUP_COMPLETE);
492  }
493 
494  /*
495  * Remove handler reference in the region
496  *
497  * NOTE: this doesn't mean that the region goes away, the region
498  * is just inaccessible as indicated to the _REG method
499  *
500  * If the region is on the handler's list, this must be the
501  * region's handler
502  */
503  RegionObj->Region.Handler = NULL;
504  AcpiUtRemoveReference (HandlerObj);
505 
506  return_VOID;
507  }
508 
509  /* Walk the linked list of handlers */
510 
511  LastObjPtr = &ObjDesc->Region.Next;
512  ObjDesc = ObjDesc->Region.Next;
513 
514  /* Prevent infinite loop if list is corrupted */
515 
516  if (ObjDesc == StartDesc)
517  {
519  "Circular handler list in region object %p",
520  RegionObj));
521  return_VOID;
522  }
523  }
524 
525  /* If we get here, the region was not in the handler's region list */
526 
528  "Cannot remove region %p from address handler %p\n",
529  RegionObj, HandlerObj));
530 
531  return_VOID;
532 }
#define ACPI_EXCEPTION(plist)
Definition: acoutput.h:239
union acpi_operand_object * Handler
Definition: acobject.h:204
union acpi_operand_object * Next
Definition: acobject.h:205
ACPI_STATUS(* ACPI_ADR_SPACE_SETUP)(ACPI_HANDLE RegionHandle, UINT32 Function, void *HandlerContext, void **RegionContext)
Definition: actypes.h:1216
#define ACPI_REG_DISCONNECT
Definition: actypes.h:880
ACPI_ADR_SPACE_SETUP Setup
Definition: acobject.h:417
#define ACPI_REGION_DEACTIVATE
Definition: actypes.h:1223
union acpi_operand_object * RegionList
Definition: acobject.h:418
UINT32 ACPI_STATUS
Definition: actypes.h:460
ACPI_OBJECT_COMMON_HEADER UINT8 SpaceId
Definition: acobject.h:202
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
ACPI_STATUS AcpiUtReleaseMutex(ACPI_MUTEX_HANDLE MutexId)
Definition: utmutex.c:348
ACPI_OBJECT_EXTRA Extra
Definition: acobject.h:540
const char * AcpiUtGetRegionName(UINT8 SpaceId)
Definition: utdecode.c:125
ACPI_STATUS AcpiUtAcquireMutex(ACPI_MUTEX_HANDLE MutexId)
Definition: utmutex.c:256
#define AOPOBJ_SETUP_COMPLETE
Definition: acobject.h:99
#define AE_INFO
Definition: acoutput.h:230
#define ACPI_DB_OPREGION
Definition: acoutput.h:167
ACPI_OBJECT_REGION Region
Definition: acobject.h:526
Status
Definition: gdiplustypes.h:24
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
#define return_VOID
Definition: acoutput.h:495
ACPI_OBJECT_ADDR_HANDLER AddressSpace
Definition: acobject.h:538
ACPI_STATUS AcpiEvExecuteRegMethod(ACPI_OPERAND_OBJECT *RegionObj, UINT32 Function)
Definition: evregion.c:598
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
void AcpiUtRemoveReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:789
#define NULL
Definition: types.h:112
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
void * RegionContext
Definition: acobject.h:482
#define ACPI_MTX_NAMESPACE
Definition: aclocal.h:85
ACPI_OPERAND_OBJECT * AcpiNsGetSecondaryObject(ACPI_OPERAND_OBJECT *ObjDesc)
Definition: nsobject.c:346

Referenced by AcpiEvInstallHandler(), and AcpiRemoveAddressSpaceHandler().

◆ AcpiEvExecuteOrphanRegMethod()

static void AcpiEvExecuteOrphanRegMethod ( ACPI_NAMESPACE_NODE DeviceNode,
ACPI_ADR_SPACE_TYPE  SpaceId 
)
static

Definition at line 892 of file evregion.c.

895 {
896  ACPI_HANDLE RegMethod;
897  ACPI_NAMESPACE_NODE *NextNode;
900  ACPI_OBJECT Objects[2];
901 
902 
903  ACPI_FUNCTION_TRACE (EvExecuteOrphanRegMethod);
904 
905 
906  if (!DeviceNode)
907  {
908  return_VOID;
909  }
910 
911  /* Namespace is currently locked, must release */
912 
914 
915  /* Get a handle to a _REG method immediately under the EC device */
916 
918  if (ACPI_FAILURE (Status))
919  {
920  goto Exit; /* There is no _REG method present */
921  }
922 
923  /*
924  * Execute the _REG method only if there is no Operation Region in
925  * this scope with the Embedded Controller space ID. Otherwise, it
926  * will already have been executed. Note, this allows for Regions
927  * with other space IDs to be present; but the code below will then
928  * execute the _REG method with the EmbeddedControl SpaceID argument.
929  */
930  NextNode = AcpiNsGetNextNode (DeviceNode, NULL);
931  while (NextNode)
932  {
933  if ((NextNode->Type == ACPI_TYPE_REGION) &&
934  (NextNode->Object) &&
935  (NextNode->Object->Region.SpaceId == SpaceId))
936  {
937  goto Exit; /* Do not execute the _REG */
938  }
939 
940  NextNode = AcpiNsGetNextNode (DeviceNode, NextNode);
941  }
942 
943  /* Evaluate the _REG(SpaceId,Connect) method */
944 
945  Args.Count = 2;
946  Args.Pointer = Objects;
947  Objects[0].Type = ACPI_TYPE_INTEGER;
948  Objects[0].Integer.Value = SpaceId;
949  Objects[1].Type = ACPI_TYPE_INTEGER;
950  Objects[1].Integer.Value = ACPI_REG_CONNECT;
951 
952  (void) AcpiEvaluateObject (RegMethod, NULL, &Args, NULL);
953 
954 Exit:
955  /* We ignore all errors from above, don't care */
956 
958  return_VOID;
959 }
union acpi_operand_object * Object
Definition: aclocal.h:187
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
#define ACPI_REG_CONNECT
Definition: actypes.h:881
#define ACPI_TYPE_INTEGER
Definition: actypes.h:680
#define METHOD_NAME__REG
Definition: acnames.h:70
UINT32 ACPI_STATUS
Definition: actypes.h:460
ACPI_OBJECT_COMMON_HEADER UINT8 SpaceId
Definition: acobject.h:202
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE ACPI_HANDLE ACPI_HANDLE *OutHandle ACPI_HANDLE *OutHandle void *Context void *Context ACPI_EVENT_HANDLER Handler UINT32 UINT32 ACPI_GPE_HANDLER void *Context UINT32 ACPI_NOTIFY_HANDLER void *Context ACPI_ADR_SPACE_TYPE SpaceId
Definition: acpixf.h:828
ACPI_STATUS AcpiUtReleaseMutex(ACPI_MUTEX_HANDLE MutexId)
Definition: utmutex.c:348
ACPI_STATUS AcpiUtAcquireMutex(ACPI_MUTEX_HANDLE MutexId)
Definition: utmutex.c:256
char ** Args
Definition: acdebug.h:353
ACPI_OBJECT_REGION Region
Definition: acobject.h:526
Status
Definition: gdiplustypes.h:24
static void Exit(void)
Definition: sock.c:1331
ACPI_STATUS AcpiGetHandle(ACPI_HANDLE Parent, ACPI_STRING Pathname, ACPI_HANDLE *RetHandle)
Definition: nsxfname.c:85
Definition: Node.h:9
#define return_VOID
Definition: acoutput.h:495
struct acpi_object::@594 Integer
ACPI_STATUS AcpiEvaluateObject(ACPI_HANDLE Handle, ACPI_STRING Pathname, ACPI_OBJECT_LIST *ExternalParams, ACPI_BUFFER *ReturnBuffer)
Definition: nsxfeval.c:217
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
#define NULL
Definition: types.h:112
#define ACPI_TYPE_REGION
Definition: actypes.h:689
ACPI_NAMESPACE_NODE * AcpiNsGetNextNode(ACPI_NAMESPACE_NODE *Parent, ACPI_NAMESPACE_NODE *Child)
Definition: nswalk.c:72
ACPI_OBJECT_TYPE Type
Definition: actypes.h:961
#define ACPI_MTX_NAMESPACE
Definition: aclocal.h:85

Referenced by AcpiEvExecuteRegMethods().

◆ AcpiEvExecuteRegMethod()

ACPI_STATUS AcpiEvExecuteRegMethod ( ACPI_OPERAND_OBJECT RegionObj,
UINT32  Function 
)

Definition at line 598 of file evregion.c.

601 {
604  ACPI_OPERAND_OBJECT *RegionObj2;
605  const ACPI_NAME *RegNamePtr = ACPI_CAST_PTR (ACPI_NAME, METHOD_NAME__REG);
606  ACPI_NAMESPACE_NODE *MethodNode;
609 
610 
611  ACPI_FUNCTION_TRACE (EvExecuteRegMethod);
612 
613 
614  if (!AcpiGbl_NamespaceInitialized ||
615  RegionObj->Region.Handler == NULL)
616  {
618  }
619 
620  RegionObj2 = AcpiNsGetSecondaryObject (RegionObj);
621  if (!RegionObj2)
622  {
624  }
625 
626  /*
627  * Find any "_REG" method associated with this region definition.
628  * The method should always be updated as this function may be
629  * invoked after a namespace change.
630  */
631  Node = RegionObj->Region.Node->Parent;
633  *RegNamePtr, Node, ACPI_TYPE_METHOD, &MethodNode);
634  if (ACPI_SUCCESS (Status))
635  {
636  /*
637  * The _REG method is optional and there can be only one per
638  * region definition. This will be executed when the handler is
639  * attached or removed.
640  */
641  RegionObj2->Extra.Method_REG = MethodNode;
642  }
643  if (RegionObj2->Extra.Method_REG == NULL)
644  {
646  }
647 
648  /* _REG(DISCONNECT) should be paired with _REG(CONNECT) */
649 
650  if ((Function == ACPI_REG_CONNECT &&
651  RegionObj->Common.Flags & AOPOBJ_REG_CONNECTED) ||
653  !(RegionObj->Common.Flags & AOPOBJ_REG_CONNECTED)))
654  {
656  }
657 
658  /* Allocate and initialize the evaluation information block */
659 
661  if (!Info)
662  {
664  }
665 
666  Info->PrefixNode = RegionObj2->Extra.Method_REG;
667  Info->RelativePathname = NULL;
668  Info->Parameters = Args;
670 
671  /*
672  * The _REG method has two arguments:
673  *
674  * Arg0 - Integer:
675  * Operation region space ID Same value as RegionObj->Region.SpaceId
676  *
677  * Arg1 - Integer:
678  * connection status 1 for connecting the handler, 0 for disconnecting
679  * the handler (Passed as a parameter)
680  */
681  Args[0] = AcpiUtCreateIntegerObject ((UINT64) RegionObj->Region.SpaceId);
682  if (!Args[0])
683  {
685  goto Cleanup1;
686  }
687 
689  if (!Args[1])
690  {
692  goto Cleanup2;
693  }
694 
695  Args[2] = NULL; /* Terminate list */
696 
697  /* Execute the method, no return value */
698 
700  AcpiUtDisplayInitPathname (ACPI_TYPE_METHOD, Info->PrefixNode, NULL));
701 
704 
705  if (ACPI_FAILURE (Status))
706  {
707  goto Cleanup2;
708  }
709 
710  if (Function == ACPI_REG_CONNECT)
711  {
712  RegionObj->Common.Flags |= AOPOBJ_REG_CONNECTED;
713  }
714  else
715  {
716  RegionObj->Common.Flags &= ~AOPOBJ_REG_CONNECTED;
717  }
718 
719 Cleanup2:
721 
722 Cleanup1:
723  ACPI_FREE (Info);
725 }
#define ACPI_FREE(a)
Definition: actypes.h:386
#define ACPI_ALLOCATE_ZEROED(a)
Definition: actypes.h:385
union acpi_operand_object * Handler
Definition: acobject.h:204
#define ACPI_SUCCESS(a)
Definition: acexcep.h:94
_In_ CDROM_SCAN_FOR_SPECIAL_INFO _In_ PCDROM_SCAN_FOR_SPECIAL_HANDLER Function
Definition: cdrom.h:1154
#define AE_NO_MEMORY
Definition: acexcep.h:112
ACPI_NAMESPACE_NODE * Node
Definition: acobject.h:203
#define ACPI_REG_CONNECT
Definition: actypes.h:881
ACPI_STATUS AcpiNsEvaluate(ACPI_EVALUATE_INFO *Info)
Definition: nseval.c:82
#define ACPI_REG_DISCONNECT
Definition: actypes.h:880
#define METHOD_NAME__REG
Definition: acnames.h:70
UINT32 ACPI_STATUS
Definition: actypes.h:460
struct acpi_namespace_node * Parent
Definition: aclocal.h:192
ACPI_OBJECT_COMMON_HEADER UINT8 SpaceId
Definition: acobject.h:202
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:683
#define ACPI_DEBUG_EXEC(a)
Definition: acoutput.h:477
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
ACPI_OBJECT_EXTRA Extra
Definition: acobject.h:540
union node Node
Definition: types.h:1255
char ** Args
Definition: acdebug.h:353
ACPI_OBJECT_REGION Region
Definition: acobject.h:526
Status
Definition: gdiplustypes.h:24
ACPI_STATUS AcpiNsSearchOneScope(UINT32 EntryName, ACPI_NAMESPACE_NODE *Node, ACPI_OBJECT_TYPE Type, ACPI_NAMESPACE_NODE **RetNode)
Definition: nssearch.c:98
#define ACPI_TYPE_METHOD
Definition: actypes.h:687
ACPI_OPERAND_OBJECT * AcpiUtCreateIntegerObject(UINT64 Value)
Definition: utobject.c:223
#define AOPOBJ_REG_CONNECTED
Definition: acobject.h:98
#define AE_NOT_EXIST
Definition: acexcep.h:114
UINT32 ACPI_NAME
Definition: actypes.h:461
ACPI_OBJECT_COMMON_HEADER ACPI_NAMESPACE_NODE * Method_REG
Definition: acobject.h:480
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
ACPI_OBJECT_COMMON Common
Definition: acobject.h:518
void AcpiUtRemoveReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:789
#define NULL
Definition: types.h:112
#define ACPI_IGNORE_RETURN_VALUE
Definition: acstruct.h:231
unsigned long long UINT64
#define ACPI_CAST_PTR(t, p)
Definition: actypes.h:544
#define AE_OK
Definition: acexcep.h:97
ACPI_OPERAND_OBJECT * AcpiNsGetSecondaryObject(ACPI_OPERAND_OBJECT *ObjDesc)
Definition: nsobject.c:346
Definition: dlist.c:348

Referenced by AcpiEvDetachRegion(), AcpiEvInitializeRegion(), and AcpiEvRegRun().

◆ AcpiEvExecuteRegMethods()

void AcpiEvExecuteRegMethods ( ACPI_NAMESPACE_NODE Node,
ACPI_ADR_SPACE_TYPE  SpaceId,
UINT32  Function 
)

Definition at line 744 of file evregion.c.

748 {
750 
751 
752  ACPI_FUNCTION_TRACE (EvExecuteRegMethods);
753 
754  /*
755  * These address spaces do not need a call to _REG, since the ACPI
756  * specification defines them as: "must always be accessible". Since
757  * they never change state (never become unavailable), no need to ever
758  * call _REG on them. Also, a DataTable is not a "real" address space,
759  * so do not call _REG. September 2018.
760  */
764  {
765  return_VOID;
766  }
767 
768  Info.SpaceId = SpaceId;
769  Info.Function = Function;
770  Info.RegRunCount = 0;
771 
773  " Running _REG methods for SpaceId %s\n",
774  AcpiUtGetRegionName (Info.SpaceId)));
775 
776  /*
777  * Run all _REG methods for all Operation Regions for this space ID. This
778  * is a separate walk in order to handle any interdependencies between
779  * regions and _REG methods. (i.e. handlers must be installed for all
780  * regions of this Space ID before we can run any _REG methods)
781  */
784 
785  /*
786  * Special case for EC and GPIO: handle "orphan" _REG methods with
787  * no region.
788  */
790  {
792  }
793 
795  " Executed %u _REG methods for SpaceId %s\n",
796  Info.RegRunCount, AcpiUtGetRegionName (Info.SpaceId)));
797 
798  return_VOID;
799 }
#define ACPI_DEBUG_PRINT_RAW(pl)
Definition: acoutput.h:476
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
_In_ CDROM_SCAN_FOR_SPECIAL_INFO _In_ PCDROM_SCAN_FOR_SPECIAL_HANDLER Function
Definition: cdrom.h:1154
#define ACPI_NS_WALK_UNLOCK
Definition: acnamesp.h:77
#define ACPI_ADR_SPACE_GPIO
Definition: actypes.h:860
#define ACPI_ADR_SPACE_DATA_TABLE
Definition: actypes.h:875
ACPI_STATUS AcpiNsWalkNamespace(ACPI_OBJECT_TYPE Type, ACPI_HANDLE StartObject, UINT32 MaxDepth, UINT32 Flags, ACPI_WALK_CALLBACK DescendingCallback, ACPI_WALK_CALLBACK AscendingCallback, void *Context, void **ReturnValue)
Definition: nswalk.c:190
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:683
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE ACPI_HANDLE ACPI_HANDLE *OutHandle ACPI_HANDLE *OutHandle void *Context void *Context ACPI_EVENT_HANDLER Handler UINT32 UINT32 ACPI_GPE_HANDLER void *Context UINT32 ACPI_NOTIFY_HANDLER void *Context ACPI_ADR_SPACE_TYPE SpaceId
Definition: acpixf.h:828
#define ACPI_ADR_SPACE_SYSTEM_IO
Definition: actypes.h:853
const char * AcpiUtGetRegionName(UINT8 SpaceId)
Definition: utdecode.c:125
static ACPI_STATUS AcpiEvRegRun(ACPI_HANDLE ObjHandle, UINT32 Level, void *Context, void **ReturnValue)
Definition: evregion.c:813
#define ACPI_ADR_SPACE_EC
Definition: actypes.h:855
#define ACPI_UINT32_MAX
Definition: actypes.h:66
#define return_VOID
Definition: acoutput.h:495
static void AcpiEvExecuteOrphanRegMethod(ACPI_NAMESPACE_NODE *DeviceNode, ACPI_ADR_SPACE_TYPE SpaceId)
Definition: evregion.c:892
#define ACPI_TYPE_ANY
Definition: actypes.h:679
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
#define ACPI_DB_NAMES
Definition: acoutput.h:166
#define NULL
Definition: types.h:112
#define ACPI_ADR_SPACE_SYSTEM_MEMORY
Definition: actypes.h:852
Definition: dlist.c:348

Referenced by AcpiEvInitializeOpRegions(), and AcpiInstallAddressSpaceHandler().

◆ AcpiEvInitializeOpRegions()

ACPI_STATUS AcpiEvInitializeOpRegions ( void  )

Definition at line 86 of file evregion.c.

88 {
90  UINT32 i;
91 
92 
93  ACPI_FUNCTION_TRACE (EvInitializeOpRegions);
94 
95 
97  if (ACPI_FAILURE (Status))
98  {
100  }
101 
102  /* Run the _REG methods for OpRegions in each default address space */
103 
104  for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++)
105  {
106  /*
107  * Make sure the installed handler is the DEFAULT handler. If not the
108  * default, the _REG methods will have already been run (when the
109  * handler was installed)
110  */
111  if (AcpiEvHasDefaultHandler (AcpiGbl_RootNode,
113  {
114  AcpiEvExecuteRegMethods (AcpiGbl_RootNode,
116  }
117  }
118 
121 }
#define ACPI_NUM_DEFAULT_SPACES
Definition: acconfig.h:202
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
#define ACPI_REG_CONNECT
Definition: actypes.h:881
UINT8 AcpiGbl_DefaultAddressSpaces[]
Definition: evhandler.c:66
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
ACPI_STATUS AcpiUtReleaseMutex(ACPI_MUTEX_HANDLE MutexId)
Definition: utmutex.c:348
ACPI_STATUS AcpiUtAcquireMutex(ACPI_MUTEX_HANDLE MutexId)
Definition: utmutex.c:256
unsigned int UINT32
Status
Definition: gdiplustypes.h:24
void AcpiEvExecuteRegMethods(ACPI_NAMESPACE_NODE *Node, ACPI_ADR_SPACE_TYPE SpaceId, UINT32 Function)
Definition: evregion.c:744
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
#define ACPI_MTX_NAMESPACE
Definition: aclocal.h:85
BOOLEAN AcpiEvHasDefaultHandler(ACPI_NAMESPACE_NODE *Node, ACPI_ADR_SPACE_TYPE SpaceId)
Definition: evhandler.c:166

Referenced by AcpiNsInitializeDevices().

◆ AcpiEvRegRun()

static ACPI_STATUS AcpiEvRegRun ( ACPI_HANDLE  ObjHandle,
UINT32  Level,
void Context,
void **  ReturnValue 
)
static

Definition at line 813 of file evregion.c.

818 {
819  ACPI_OPERAND_OBJECT *ObjDesc;
823 
824 
826 
827  /* Convert and validate the device handle */
828 
829  Node = AcpiNsValidateHandle (ObjHandle);
830  if (!Node)
831  {
832  return (AE_BAD_PARAMETER);
833  }
834 
835  /*
836  * We only care about regions and objects that are allowed to have
837  * address space handlers
838  */
839  if ((Node->Type != ACPI_TYPE_REGION) &&
840  (Node != AcpiGbl_RootNode))
841  {
842  return (AE_OK);
843  }
844 
845  /* Check for an existing internal object */
846 
847  ObjDesc = AcpiNsGetAttachedObject (Node);
848  if (!ObjDesc)
849  {
850  /* No object, just exit */
851 
852  return (AE_OK);
853  }
854 
855  /* Object is a Region */
856 
857  if (ObjDesc->Region.SpaceId != Info->SpaceId)
858  {
859  /* This region is for a different address space, just ignore it */
860 
861  return (AE_OK);
862  }
863 
864  Info->RegRunCount++;
865  Status = AcpiEvExecuteRegMethod (ObjDesc, Info->Function);
866  return (Status);
867 }
#define AE_BAD_PARAMETER
Definition: acexcep.h:151
UINT32 ACPI_STATUS
Definition: actypes.h:460
ACPI_OBJECT_COMMON_HEADER UINT8 SpaceId
Definition: acobject.h:202
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:683
union node Node
Definition: types.h:1255
ACPI_OBJECT_REGION Region
Definition: acobject.h:526
Status
Definition: gdiplustypes.h:24
ACPI_OPERAND_OBJECT * AcpiNsGetAttachedObject(ACPI_NAMESPACE_NODE *Node)
Definition: nsobject.c:308
ACPI_STATUS AcpiEvExecuteRegMethod(ACPI_OPERAND_OBJECT *RegionObj, UINT32 Function)
Definition: evregion.c:598
#define ACPI_TYPE_REGION
Definition: actypes.h:689
ACPI_NAMESPACE_NODE * AcpiNsValidateHandle(ACPI_HANDLE Handle)
Definition: nsutils.c:655
#define ACPI_CAST_PTR(t, p)
Definition: actypes.h:544
#define AE_OK
Definition: acexcep.h:97
Definition: dlist.c:348

Referenced by AcpiEvExecuteRegMethods().

Variable Documentation

◆ AcpiGbl_DefaultAddressSpaces

UINT8 AcpiGbl_DefaultAddressSpaces[]

Definition at line 66 of file evhandler.c.

Referenced by AcpiEvInitializeOpRegions(), and AcpiEvInstallRegionHandlers().