⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbexec.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
    /* Do the actual method execution */    AcpiOsPrintf ("\n");    AcpiGbl_MethodExecuting = TRUE;    Status = AcpiEvaluateObject (Node, NULL, NULL, &ReturnObj);    AcpiOsPrintf ("[%4.4s] returned %s\n", AcpiUtGetNodeName (Node),            AcpiFormatException (Status));    AcpiGbl_MethodExecuting = FALSE;    return (AE_OK);}/******************************************************************************* * * FUNCTION:    AcpiDbExecute * * PARAMETERS:  Name                - Name of method to execute *              Args                - Parameters to the method *              Flags               - single step/no single step * * RETURN:      None * * DESCRIPTION: Execute a control method.  Name is relative to the current *              scope. * ******************************************************************************/voidAcpiDbExecute (    char                    *Name,    char                    **Args,    UINT32                  Flags){    ACPI_STATUS             Status;    ACPI_BUFFER             ReturnObj;    char                    *NameString;#ifdef ACPI_DEBUG_OUTPUT    UINT32                  PreviousAllocations;    UINT32                  Allocations;    /* Memory allocation tracking */    PreviousAllocations = AcpiDbGetOutstandingAllocations ();#endif    if (*Name == '*')    {        (void) AcpiWalkNamespace (ACPI_TYPE_METHOD, ACPI_ROOT_OBJECT,                    ACPI_UINT32_MAX, AcpiDbExecutionWalk, NULL, NULL);        return;    }    else    {        NameString = ACPI_ALLOCATE (ACPI_STRLEN (Name) + 1);        if (!NameString)        {            return;        }        ACPI_MEMSET (&AcpiGbl_DbMethodInfo, 0, sizeof (ACPI_DB_METHOD_INFO));        ACPI_STRCPY (NameString, Name);        AcpiUtStrupr (NameString);        AcpiGbl_DbMethodInfo.Name = NameString;        AcpiGbl_DbMethodInfo.Args = Args;        AcpiGbl_DbMethodInfo.Flags = Flags;        ReturnObj.Pointer = NULL;        ReturnObj.Length = ACPI_ALLOCATE_BUFFER;        AcpiDbExecuteSetup (&AcpiGbl_DbMethodInfo);        Status = AcpiDbExecuteMethod (&AcpiGbl_DbMethodInfo, &ReturnObj);        ACPI_FREE (NameString);    }    /*     * Allow any handlers in separate threads to complete.     * (Such as Notify handlers invoked from AML executed above).     */    AcpiOsSleep ((ACPI_INTEGER) 10);#ifdef ACPI_DEBUG_OUTPUT    /* Memory allocation tracking */    Allocations = AcpiDbGetOutstandingAllocations () - PreviousAllocations;    AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);    if (Allocations > 0)    {        AcpiOsPrintf ("Outstanding: 0x%X allocations after execution\n",                        Allocations);    }#endif    if (ACPI_FAILURE (Status))    {        AcpiOsPrintf ("Execution of %s failed with status %s\n",            AcpiGbl_DbMethodInfo.Pathname, AcpiFormatException (Status));    }    else    {        /* Display a return object, if any */        if (ReturnObj.Length)        {            AcpiOsPrintf ("Execution of %s returned object %p Buflen %X\n",                AcpiGbl_DbMethodInfo.Pathname, ReturnObj.Pointer,                (UINT32) ReturnObj.Length);            AcpiDbDumpExternalObject (ReturnObj.Pointer, 1);        }        else        {            AcpiOsPrintf ("No return object from execution of %s\n",                AcpiGbl_DbMethodInfo.Pathname);        }    }    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);}/******************************************************************************* * * FUNCTION:    AcpiDbMethodThread * * PARAMETERS:  Context             - Execution info segment * * RETURN:      None * * DESCRIPTION: Debugger execute thread.  Waits for a command line, then *              simply dispatches it. * ******************************************************************************/static void ACPI_SYSTEM_XFACEAcpiDbMethodThread (    void                    *Context){    ACPI_STATUS             Status;    ACPI_DB_METHOD_INFO     *Info = Context;    UINT32                  i;    UINT8                   Allow;    ACPI_BUFFER             ReturnObj;    if (Info->InitArgs)    {        AcpiDbUInt32ToHexString (Info->NumCreated, Info->IndexOfThreadStr);        AcpiDbUInt32ToHexString (AcpiOsGetThreadId (), Info->IdOfThreadStr);    }    if (Info->Threads && (Info->NumCreated < Info->NumThreads))    {        Info->Threads[Info->NumCreated++] = AcpiOsGetThreadId();    }    for (i = 0; i < Info->NumLoops; i++)    {        Status = AcpiDbExecuteMethod (Info, &ReturnObj);        if (ACPI_FAILURE (Status))        {            AcpiOsPrintf ("%s During execution of %s at iteration %X\n",                AcpiFormatException (Status), Info->Pathname, i);            if (Status == AE_ABORT_METHOD)            {                break;            }        }#if 0        if ((i % 100) == 0)        {            AcpiOsPrintf ("%d executions, Thread 0x%x\n", i, AcpiOsGetThreadId ());        }        if (ReturnObj.Length)        {            AcpiOsPrintf ("Execution of %s returned object %p Buflen %X\n",                Info->Pathname, ReturnObj.Pointer, (UINT32) ReturnObj.Length);            AcpiDbDumpExternalObject (ReturnObj.Pointer, 1);        }#endif    }    /* Signal our completion */    Allow = 0;    (void) AcpiOsWaitSemaphore (Info->ThreadCompleteGate, 1, ACPI_WAIT_FOREVER);    Info->NumCompleted++;    if (Info->NumCompleted == Info->NumThreads)    {        /* Do signal for main thread once only */        Allow = 1;    }    (void) AcpiOsSignalSemaphore (Info->ThreadCompleteGate, 1);    if (Allow)    {        Status = AcpiOsSignalSemaphore (Info->MainThreadGate, 1);        if (ACPI_FAILURE (Status))        {            AcpiOsPrintf ("Could not signal debugger thread sync semaphore, %s\n",                AcpiFormatException (Status));        }    }}/******************************************************************************* * * FUNCTION:    AcpiDbCreateExecutionThreads * * PARAMETERS:  NumThreadsArg           - Number of threads to create *              NumLoopsArg             - Loop count for the thread(s) *              MethodNameArg           - Control method to execute * * RETURN:      None * * DESCRIPTION: Create threads to execute method(s) * ******************************************************************************/voidAcpiDbCreateExecutionThreads (    char                    *NumThreadsArg,    char                    *NumLoopsArg,    char                    *MethodNameArg){    ACPI_STATUS             Status;    UINT32                  NumThreads;    UINT32                  NumLoops;    UINT32                  i;    UINT32                  Size;    ACPI_MUTEX              MainThreadGate;    ACPI_MUTEX              ThreadCompleteGate;    /* Get the arguments */    NumThreads = ACPI_STRTOUL (NumThreadsArg, NULL, 0);    NumLoops   = ACPI_STRTOUL (NumLoopsArg, NULL, 0);    if (!NumThreads || !NumLoops)    {        AcpiOsPrintf ("Bad argument: Threads %X, Loops %X\n",            NumThreads, NumLoops);        return;    }    /*     * Create the semaphore for synchronization of     * the created threads with the main thread.     */    Status = AcpiOsCreateSemaphore (1, 0, &MainThreadGate);    if (ACPI_FAILURE (Status))    {        AcpiOsPrintf ("Could not create semaphore for synchronization with the main thread, %s\n",            AcpiFormatException (Status));        return;    }    /*     * Create the semaphore for synchronization     * between the created threads.     */    Status = AcpiOsCreateSemaphore (1, 1, &ThreadCompleteGate);    if (ACPI_FAILURE (Status))    {        AcpiOsPrintf ("Could not create semaphore for synchronization between the created threads, %s\n",            AcpiFormatException (Status));        (void) AcpiOsDeleteSemaphore (MainThreadGate);        return;    }    ACPI_MEMSET (&AcpiGbl_DbMethodInfo, 0, sizeof (ACPI_DB_METHOD_INFO));    /* Array to store IDs of threads */    AcpiGbl_DbMethodInfo.NumThreads = NumThreads;    Size = 4 * AcpiGbl_DbMethodInfo.NumThreads;    AcpiGbl_DbMethodInfo.Threads = (UINT32 *) AcpiOsAllocate (Size);    if (AcpiGbl_DbMethodInfo.Threads == NULL)    {        AcpiOsPrintf ("No memory for thread IDs array\n");        (void) AcpiOsDeleteSemaphore (MainThreadGate);        (void) AcpiOsDeleteSemaphore (ThreadCompleteGate);        return;    }    ACPI_MEMSET (AcpiGbl_DbMethodInfo.Threads, 0, Size);    /* Setup the context to be passed to each thread */    AcpiGbl_DbMethodInfo.Name = MethodNameArg;    AcpiGbl_DbMethodInfo.Flags = 0;    AcpiGbl_DbMethodInfo.NumLoops = NumLoops;    AcpiGbl_DbMethodInfo.MainThreadGate = MainThreadGate;    AcpiGbl_DbMethodInfo.ThreadCompleteGate = ThreadCompleteGate;    /* Init arguments to be passed to method */    AcpiGbl_DbMethodInfo.InitArgs = 1;    AcpiGbl_DbMethodInfo.Args = AcpiGbl_DbMethodInfo.Arguments;    AcpiGbl_DbMethodInfo.Arguments[0] = AcpiGbl_DbMethodInfo.NumThreadsStr;    AcpiGbl_DbMethodInfo.Arguments[1] = AcpiGbl_DbMethodInfo.IdOfThreadStr;    AcpiGbl_DbMethodInfo.Arguments[2] = AcpiGbl_DbMethodInfo.IndexOfThreadStr;    AcpiGbl_DbMethodInfo.Arguments[3] = NULL;    AcpiDbUInt32ToHexString (NumThreads, AcpiGbl_DbMethodInfo.NumThreadsStr);    AcpiDbExecuteSetup (&AcpiGbl_DbMethodInfo);    /* Create the threads */    AcpiOsPrintf ("Creating %X threads to execute %X times each\n",        NumThreads, NumLoops);    for (i = 0; i < (NumThreads); i++)    {        Status = AcpiOsExecute (OSL_DEBUGGER_THREAD, AcpiDbMethodThread,            &AcpiGbl_DbMethodInfo);        if (ACPI_FAILURE (Status))        {            break;        }    }    /* Wait for all threads to complete */    (void) AcpiOsWaitSemaphore (MainThreadGate, 1, ACPI_WAIT_FOREVER);    AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);    AcpiOsPrintf ("All threads (%X) have completed\n", NumThreads);    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);    /* Cleanup and exit */    (void) AcpiOsDeleteSemaphore (MainThreadGate);    (void) AcpiOsDeleteSemaphore (ThreadCompleteGate);    AcpiOsFree (AcpiGbl_DbMethodInfo.Threads);    AcpiGbl_DbMethodInfo.Threads = NULL;}#endif /* ACPI_DEBUGGER */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -