In idle thread, to support C3, ACPI spec recommends to use several
ACPI registers like BM_STS, etc. In solaris, we have ACPICA to read
and write these registers.

AcpiGetRegister (
    UINT32                  RegisterId,
    UINT32                  *ReturnValue,
    UINT32                  Flags)

AcpiSetRegister (
    UINT32                  RegisterId,
    UINT32                  Value,
    UINT32                  Flags)

The problem is, osl use mutex to lock these operation in case of the
multiprocessor race. That means it's possible CPU1 will hit turnstiles
block if the same time it requires the ACPI register access as CPU0.
That will cause a ASSERT failure. (t != CPU->cpu_idle_thread);
I think the interface in acpica need to be fixed. Or I have to implement
another interface function in c-state driver?
Before do that, I'll try to see if there is any better suggestions.

Thanks,
-Aubrey


Reply via email to