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