ReactOS 0.4.16-dev-112-g52265ae
exconfig.c File Reference
#include "acpi.h"
#include "accommon.h"
#include "acinterp.h"
#include "acnamesp.h"
#include "actables.h"
#include "acdispat.h"
#include "acevents.h"
#include "amlcode.h"
Include dependency graph for exconfig.c:

Go to the source code of this file.

Macros

#define _COMPONENT   ACPI_EXECUTER
 

Functions

static ACPI_STATUS AcpiExAddTable (UINT32 TableIndex, ACPI_OPERAND_OBJECT **DdbHandle)
 
static ACPI_STATUS AcpiExRegionRead (ACPI_OPERAND_OBJECT *ObjDesc, UINT32 Length, UINT8 *Buffer)
 
ACPI_STATUS AcpiExLoadTableOp (ACPI_WALK_STATE *WalkState, ACPI_OPERAND_OBJECT **ReturnDesc)
 
ACPI_STATUS AcpiExLoadOp (ACPI_OPERAND_OBJECT *ObjDesc, ACPI_OPERAND_OBJECT *Target, ACPI_WALK_STATE *WalkState)
 
ACPI_STATUS AcpiExUnloadTable (ACPI_OPERAND_OBJECT *DdbHandle)
 

Macro Definition Documentation

◆ _COMPONENT

#define _COMPONENT   ACPI_EXECUTER

Definition at line 54 of file exconfig.c.

Function Documentation

◆ AcpiExAddTable()

static ACPI_STATUS AcpiExAddTable ( UINT32  TableIndex,
ACPI_OPERAND_OBJECT **  DdbHandle 
)
static

Definition at line 87 of file exconfig.c.

90{
91 ACPI_OPERAND_OBJECT *ObjDesc;
92
93
94 ACPI_FUNCTION_TRACE (ExAddTable);
95
96
97 /* Create an object to be the table handle */
98
100 if (!ObjDesc)
101 {
103 }
104
105 /* Init the table handle */
106
107 ObjDesc->Common.Flags |= AOPOBJ_DATA_VALID;
109 ObjDesc->Reference.Value = TableIndex;
110 *DdbHandle = ObjDesc;
112}
#define AE_NO_MEMORY
Definition: acexcep.h:112
#define AE_OK
Definition: acexcep.h:97
@ ACPI_REFCLASS_TABLE
Definition: acobject.h:463
#define AOPOBJ_DATA_VALID
Definition: acobject.h:96
#define return_ACPI_STATUS(s)
Definition: acoutput.h:496
#define ACPI_FUNCTION_TRACE(a)
Definition: acoutput.h:480
#define ACPI_TYPE_LOCAL_REFERENCE
Definition: actypes.h:719
#define AcpiUtCreateInternalObject(t)
Definition: acutils.h:681
ACPI_OBJECT_COMMON_HEADER UINT8 Class
Definition: acobject.h:443
ACPI_OBJECT_REFERENCE Reference
Definition: acobject.h:540
ACPI_OBJECT_COMMON Common
Definition: acobject.h:519

Referenced by AcpiExLoadOp(), and AcpiExLoadTableOp().

◆ AcpiExLoadOp()

ACPI_STATUS AcpiExLoadOp ( ACPI_OPERAND_OBJECT ObjDesc,
ACPI_OPERAND_OBJECT Target,
ACPI_WALK_STATE WalkState 
)

Definition at line 343 of file exconfig.c.

347{
348 ACPI_OPERAND_OBJECT *DdbHandle;
349 ACPI_TABLE_HEADER *TableHeader;
351 UINT32 TableIndex;
354
355
356 ACPI_FUNCTION_TRACE (ExLoadOp);
357
358
359 if (Target->Common.DescriptorType == ACPI_DESC_TYPE_NAMED)
360 {
362 }
363 if (Target->Common.Type != ACPI_TYPE_INTEGER)
364 {
365 ACPI_ERROR ((AE_INFO, "Type not integer: %X", Target->Common.Type));
367 }
368
369 Target->Integer.Value = 0;
370
371 /* Source Object can be either an OpRegion or a Buffer/Field */
372
373 switch (ObjDesc->Common.Type)
374 {
375 case ACPI_TYPE_REGION:
376
378 "Load table from Region %p\n", ObjDesc));
379
380 /* Region must be SystemMemory (from ACPI spec) */
381
383 {
385 }
386
387 /*
388 * If the Region Address and Length have not been previously
389 * evaluated, evaluate them now and save the results.
390 */
391 if (!(ObjDesc->Common.Flags & AOPOBJ_DATA_VALID))
392 {
394 if (ACPI_FAILURE (Status))
395 {
397 }
398 }
399
400 /* Get the table header first so we can get the table length */
401
402 TableHeader = ACPI_ALLOCATE (sizeof (ACPI_TABLE_HEADER));
403 if (!TableHeader)
404 {
406 }
407
408 Status = AcpiExRegionRead (ObjDesc, sizeof (ACPI_TABLE_HEADER),
409 ACPI_CAST_PTR (UINT8, TableHeader));
410 Length = TableHeader->Length;
411 ACPI_FREE (TableHeader);
412
413 if (ACPI_FAILURE (Status))
414 {
416 }
417
418 /* Must have at least an ACPI table header */
419
420 if (Length < sizeof (ACPI_TABLE_HEADER))
421 {
423 }
424
425 /*
426 * The original implementation simply mapped the table, with no copy.
427 * However, the memory region is not guaranteed to remain stable and
428 * we must copy the table to a local buffer. For example, the memory
429 * region is corrupted after suspend on some machines. Dynamically
430 * loaded tables are usually small, so this overhead is minimal.
431 *
432 * The latest implementation (5/2009) does not use a mapping at all.
433 * We use the low-level operation region interface to read the table
434 * instead of the obvious optimization of using a direct mapping.
435 * This maintains a consistent use of operation regions across the
436 * entire subsystem. This is important if additional processing must
437 * be performed in the (possibly user-installed) operation region
438 * handler. For example, AcpiExec and ASLTS depend on this.
439 */
440
441 /* Allocate a buffer for the table */
442
444 if (!Table)
445 {
447 }
448
449 /* Read the entire table */
450
451 Status = AcpiExRegionRead (ObjDesc, Length,
453 if (ACPI_FAILURE (Status))
454 {
457 }
458 break;
459
460 case ACPI_TYPE_BUFFER: /* Buffer or resolved RegionField */
461
463 "Load table from Buffer or Field %p\n", ObjDesc));
464
465 /* Must have at least an ACPI table header */
466
467 if (ObjDesc->Buffer.Length < sizeof (ACPI_TABLE_HEADER))
468 {
470 }
471
472 /* Get the actual table length from the table header */
473
474 TableHeader = ACPI_CAST_PTR (
475 ACPI_TABLE_HEADER, ObjDesc->Buffer.Pointer);
476 Length = TableHeader->Length;
477
478 /* Table cannot extend beyond the buffer */
479
480 if (Length > ObjDesc->Buffer.Length)
481 {
483 }
484 if (Length < sizeof (ACPI_TABLE_HEADER))
485 {
487 }
488
489 /*
490 * Copy the table from the buffer because the buffer could be
491 * modified or even deleted in the future
492 */
494 if (!Table)
495 {
497 }
498
499 memcpy (Table, TableHeader, Length);
500 break;
501
502 default:
503
505 }
506
507 /* Install the new table into the local data structures */
508
509 ACPI_INFO (("Dynamic OEM Table Load:"));
514 if (ACPI_FAILURE (Status))
515 {
516 /* Delete allocated table buffer */
517
520 }
521
522 /*
523 * Add the table to the namespace.
524 *
525 * Note: Load the table objects relative to the root of the namespace.
526 * This appears to go against the ACPI specification, but we do it for
527 * compatibility with other ACPI implementations.
528 */
529 Status = AcpiExAddTable (TableIndex, &DdbHandle);
530 if (ACPI_FAILURE (Status))
531 {
533 }
534
535 /* Complete the initialization/resolution of new objects */
536
540
541 /* Remove the reference to DdbHandle created by AcpiExAddTable above */
542
543 AcpiUtRemoveReference (DdbHandle);
544
545 /* Return -1 (non-zero) indicates success */
546
547 Target->Integer.Value = 0xFFFFFFFFFFFFFFFF;
549}
unsigned char UINT8
unsigned int UINT32
#define AE_INVALID_TABLE_LENGTH
Definition: acexcep.h:171
#define ACPI_FAILURE(a)
Definition: acexcep.h:95
#define AE_AML_BUFFER_LIMIT
Definition: acexcep.h:189
#define AE_AML_OPERAND_TYPE
Definition: acexcep.h:182
ACPI_OPERAND_OBJECT * AcpiNsGetAttachedObject(ACPI_NAMESPACE_NODE *Node)
Definition: nsobject.c:308
ACPI_STATUS AcpiNsInitializeObjects(void)
Definition: nsinit.c:92
#define ACPI_DESC_TYPE_NAMED
Definition: acobject.h:577
#define ACPI_DEBUG_PRINT(pl)
Definition: acoutput.h:475
#define ACPI_DB_EXEC
Definition: acoutput.h:165
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
#define AE_INFO
Definition: acoutput.h:230
#define ACPI_INFO(plist)
Definition: acoutput.h:237
ACPI_STATUS AcpiTbInstallAndLoadTable(ACPI_PHYSICAL_ADDRESS Address, UINT8 Flags, ACPI_TABLE_HEADER *Table, BOOLEAN Override, UINT32 *TableIndex)
Definition: tbdata.c:1162
#define ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL
Definition: actbl.h:431
#define ACPI_TYPE_BUFFER
Definition: actypes.h:690
#define ACPI_TYPE_REGION
Definition: actypes.h:697
#define ACPI_FREE(a)
Definition: actypes.h:386
#define ACPI_TYPE_INTEGER
Definition: actypes.h:688
#define ACPI_ADR_SPACE_SYSTEM_MEMORY
Definition: actypes.h:861
UINT32 ACPI_STATUS
Definition: actypes.h:460
#define ACPI_CAST_PTR(t, p)
Definition: actypes.h:544
#define ACPI_PTR_TO_PHYSADDR(i)
Definition: actypes.h:559
#define ACPI_ALLOCATE(a)
Definition: actypes.h:384
void AcpiUtRemoveReference(ACPI_OPERAND_OBJECT *Object)
Definition: utdelete.c:790
#define TRUE
Definition: types.h:120
ACPI_STATUS AcpiDsGetRegionArguments(ACPI_OPERAND_OBJECT *ObjDesc)
Definition: dsargs.c:395
static ACPI_STATUS AcpiExRegionRead(ACPI_OPERAND_OBJECT *ObjDesc, UINT32 Length, UINT8 *Buffer)
Definition: exconfig.c:290
static ACPI_STATUS AcpiExAddTable(UINT32 TableIndex, ACPI_OPERAND_OBJECT **DdbHandle)
Definition: exconfig.c:87
void AcpiExExitInterpreter(void)
Definition: exutils.c:139
void AcpiExEnterInterpreter(void)
Definition: exutils.c:91
Status
Definition: gdiplustypes.h:25
ASMGENDATA Table[]
Definition: genincdata.c:61
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
ACPI_OBJECT_COMMON_HEADER UINT8 SpaceId
Definition: acobject.h:202
UINT32 Length
Definition: actbl.h:109
ACPI_OBJECT_REGION Region
Definition: acobject.h:527
ACPI_OBJECT_BUFFER Buffer
Definition: acobject.h:522
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList

Referenced by AcpiExOpcode_1A_1T_1R().

◆ AcpiExLoadTableOp()

ACPI_STATUS AcpiExLoadTableOp ( ACPI_WALK_STATE WalkState,
ACPI_OPERAND_OBJECT **  ReturnDesc 
)

Definition at line 129 of file exconfig.c.

132{
134 ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
135 ACPI_NAMESPACE_NODE *ParentNode;
136 ACPI_NAMESPACE_NODE *StartNode;
137 ACPI_NAMESPACE_NODE *ParameterNode = NULL;
138 ACPI_OPERAND_OBJECT *ReturnObj;
139 ACPI_OPERAND_OBJECT *DdbHandle;
140 UINT32 TableIndex;
141
142
143 ACPI_FUNCTION_TRACE (ExLoadTableOp);
144
145
146 /* Create the return object */
147
148 ReturnObj = AcpiUtCreateIntegerObject ((UINT64) 0);
149 if (!ReturnObj)
150 {
152 }
153
154 *ReturnDesc = ReturnObj;
155
156 /* Find the ACPI table in the RSDT/XSDT */
157
160 Operand[0]->String.Pointer,
161 Operand[1]->String.Pointer,
162 Operand[2]->String.Pointer, &TableIndex);
164 if (ACPI_FAILURE (Status))
165 {
166 if (Status != AE_NOT_FOUND)
167 {
169 }
170
171 /* Table not found, return an Integer=0 and AE_OK */
172
174 }
175
176 /* Default nodes */
177
178 StartNode = WalkState->ScopeInfo->Scope.Node;
179 ParentNode = AcpiGbl_RootNode;
180
181 /* RootPath (optional parameter) */
182
183 if (Operand[3]->String.Length > 0)
184 {
185 /*
186 * Find the node referenced by the RootPathString. This is the
187 * location within the namespace where the table will be loaded.
188 */
189 Status = AcpiNsGetNodeUnlocked (StartNode,
190 Operand[3]->String.Pointer, ACPI_NS_SEARCH_PARENT,
191 &ParentNode);
192 if (ACPI_FAILURE (Status))
193 {
195 }
196 }
197
198 /* ParameterPath (optional parameter) */
199
200 if (Operand[4]->String.Length > 0)
201 {
202 if ((Operand[4]->String.Pointer[0] != AML_ROOT_PREFIX) &&
203 (Operand[4]->String.Pointer[0] != AML_PARENT_PREFIX))
204 {
205 /*
206 * Path is not absolute, so it will be relative to the node
207 * referenced by the RootPathString (or the NS root if omitted)
208 */
209 StartNode = ParentNode;
210 }
211
212 /* Find the node referenced by the ParameterPathString */
213
214 Status = AcpiNsGetNodeUnlocked (StartNode,
215 Operand[4]->String.Pointer, ACPI_NS_SEARCH_PARENT,
216 &ParameterNode);
217 if (ACPI_FAILURE (Status))
218 {
220 }
221 }
222
223 /* Load the table into the namespace */
224
225 ACPI_INFO (("Dynamic OEM Table Load:"));
227 Status = AcpiTbLoadTable (TableIndex, ParentNode);
229 if (ACPI_FAILURE (Status))
230 {
232 }
233
234 Status = AcpiExAddTable (TableIndex, &DdbHandle);
235 if (ACPI_FAILURE (Status))
236 {
238 }
239
240 /* Complete the initialization/resolution of new objects */
241
245
246 /* Parameter Data (optional) */
247
248 if (ParameterNode)
249 {
250 /* Store the parameter data into the optional parameter object */
251
252 Status = AcpiExStore (Operand[5],
253 ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, ParameterNode), WalkState);
254 if (ACPI_FAILURE (Status))
255 {
256 (void) AcpiExUnloadTable (DdbHandle);
257
258 AcpiUtRemoveReference (DdbHandle);
260 }
261 }
262
263 /* Remove the reference to DdbHandle created by AcpiExAddTable above */
264
265 AcpiUtRemoveReference (DdbHandle);
266
267 /* Return -1 (non-zero) indicates success */
268
269 ReturnObj->Integer.Value = 0xFFFFFFFFFFFFFFFF;
271}
unsigned long long UINT64
#define AE_NOT_FOUND
Definition: acexcep.h:113
ACPI_STATUS AcpiNsGetNodeUnlocked(ACPI_NAMESPACE_NODE *PrefixNode, const char *ExternalPathname, UINT32 Flags, ACPI_NAMESPACE_NODE **OutNode)
Definition: nsutils.c:777
#define ACPI_NS_SEARCH_PARENT
Definition: acnamesp.h:63
ACPI_STATUS AcpiTbLoadTable(UINT32 TableIndex, ACPI_NAMESPACE_NODE *ParentNode)
Definition: tbdata.c:1097
ACPI_STATUS AcpiTbFindTable(char *Signature, char *OemId, char *OemTableId, UINT32 *TableIndex)
Definition: tbfind.c:70
ACPI_OPERAND_OBJECT * AcpiUtCreateIntegerObject(UINT64 Value)
Definition: utobject.c:223
#define AML_PARENT_PREFIX
Definition: amlcode.h:70
#define AML_ROOT_PREFIX
Definition: amlcode.h:69
#define NULL
Definition: types.h:112
ACPI_STATUS AcpiExUnloadTable(ACPI_OPERAND_OBJECT *DdbHandle)
Definition: exconfig.c:565
ACPI_STATUS AcpiExStore(ACPI_OPERAND_OBJECT *SourceDesc, ACPI_OPERAND_OBJECT *DestDesc, ACPI_WALK_STATE *WalkState)
Definition: exstore.c:91
ACPI_STATE_COMMON ACPI_NAMESPACE_NODE * Node
Definition: aclocal.h:740
union acpi_operand_object * Operands[ACPI_OBJ_NUM_OPERANDS+1]
Definition: acstruct.h:105
ACPI_GENERIC_STATE * ScopeInfo
Definition: acstruct.h:124
ACPI_SCOPE_STATE Scope
Definition: aclocal.h:825
ACPI_OBJECT_INTEGER Integer
Definition: acobject.h:520
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2433

Referenced by AcpiExOpcode_6A_0T_1R().

◆ AcpiExRegionRead()

static ACPI_STATUS AcpiExRegionRead ( ACPI_OPERAND_OBJECT ObjDesc,
UINT32  Length,
UINT8 Buffer 
)
static

Definition at line 290 of file exconfig.c.

294{
297 UINT32 RegionOffset = 0;
298 UINT32 i;
299
300
301 /* Bytewise reads */
302
303 for (i = 0; i < Length; i++)
304 {
306 RegionOffset, 8, &Value);
307 if (ACPI_FAILURE (Status))
308 {
309 return (Status);
310 }
311
312 *Buffer = (UINT8) Value;
313 Buffer++;
314 RegionOffset++;
315 }
316
317 return (AE_OK);
318}
#define ACPI_READ
Definition: actypes.h:751
Definition: bufpool.h:45
ACPI_STATUS AcpiEvAddressSpaceDispatch(ACPI_OPERAND_OBJECT *RegionObj, ACPI_OPERAND_OBJECT *FieldObj, UINT32 Function, UINT32 RegionOffset, UINT32 BitWidth, UINT64 *Value)
Definition: evregion.c:150
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
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413

Referenced by AcpiExLoadOp().

◆ AcpiExUnloadTable()

ACPI_STATUS AcpiExUnloadTable ( ACPI_OPERAND_OBJECT DdbHandle)

Definition at line 565 of file exconfig.c.

567{
569 ACPI_OPERAND_OBJECT *TableDesc = DdbHandle;
570 UINT32 TableIndex;
571
572
573 ACPI_FUNCTION_TRACE (ExUnloadTable);
574
575
576 /*
577 * Temporarily emit a warning so that the ASL for the machine can be
578 * hopefully obtained. This is to say that the Unload() operator is
579 * extremely rare if not completely unused.
580 */
582 "Received request to unload an ACPI table"));
583
584 /*
585 * May 2018: Unload is no longer supported for the following reasons:
586 * 1) A correct implementation on some hosts may not be possible.
587 * 2) Other ACPI implementations do not correctly/fully support it.
588 * 3) It requires host device driver support which does not exist.
589 * (To properly support namespace unload out from underneath.)
590 * 4) This AML operator has never been seen in the field.
591 */
593 "AML Unload operator is not supported"));
594
595 /*
596 * Validate the handle
597 * Although the handle is partially validated in AcpiExReconfiguration()
598 * when it calls AcpiExResolveOperands(), the handle is more completely
599 * validated here.
600 *
601 * Handle must be a valid operand object of type reference. Also, the
602 * DdbHandle must still be marked valid (table has not been previously
603 * unloaded)
604 */
605 if ((!DdbHandle) ||
607 (DdbHandle->Common.Type != ACPI_TYPE_LOCAL_REFERENCE) ||
608 (!(DdbHandle->Common.Flags & AOPOBJ_DATA_VALID)))
609 {
611 }
612
613 /* Get the table index from the DdbHandle */
614
615 TableIndex = TableDesc->Reference.Value;
616
617 /*
618 * Release the interpreter lock so that the table lock won't have
619 * strict order requirement against it.
620 */
622 Status = AcpiTbUnloadTable (TableIndex);
624
625 /*
626 * Invalidate the handle. We do this because the handle may be stored
627 * in a named object and may not be actually deleted until much later.
628 */
629 if (ACPI_SUCCESS (Status))
630 {
631 DdbHandle->Common.Flags &= ~AOPOBJ_DATA_VALID;
632 }
634}
#define AE_NOT_IMPLEMENTED
Definition: acexcep.h:122
#define ACPI_SUCCESS(a)
Definition: acexcep.h:94
#define ACPI_GET_DESCRIPTOR_TYPE(d)
Definition: acmacros.h:414
#define ACPI_DESC_TYPE_OPERAND
Definition: acobject.h:576
#define ACPI_EXCEPTION(plist)
Definition: acoutput.h:239
#define ACPI_WARNING(plist)
Definition: acoutput.h:238
ACPI_STATUS AcpiTbUnloadTable(UINT32 TableIndex)
Definition: tbdata.c:1206

Referenced by AcpiExLoadTableOp(), and AcpiExOpcode_1A_0T_0R().