1 /*******************************************************************************
3 * ACPI Component Architecture Operating System Layer (OSL) for ReactOS *
5 *******************************************************************************/
13 #define NUM_SEMAPHORES 128
15 static PKINTERRUPT AcpiInterrupt
;
16 static BOOLEAN AcpiInterruptHandlerRegistered
= FALSE
;
17 static ACPI_OSD_HANDLER AcpiIrqHandler
= NULL
;
18 static PVOID AcpiIrqContext
= NULL
;
19 static ULONG AcpiIrqNumber
= 0;
21 static PVOID IVTVirtualAddress
= NULL
;
24 typedef struct semaphore_entry
31 static SEMAPHORE_ENTRY AcpiGbl_Semaphores
[NUM_SEMAPHORES
];
36 IN PVOID DeferredContext
,
37 IN PVOID SystemArgument1
,
38 IN PVOID SystemArgument2
)
40 ACPI_OSD_EXEC_CALLBACK Routine
= (ACPI_OSD_EXEC_CALLBACK
)SystemArgument1
;
42 DPRINT("OslDpcStub()\n");
43 DPRINT("Calling [%p]([%p])\n", Routine
, SystemArgument2
);
44 (*Routine
)(SystemArgument2
);
49 PKINTERRUPT Interrupt
,
54 Status
= (*AcpiIrqHandler
)(AcpiIrqContext
);
56 if (ACPI_SUCCESS(Status
))
63 AcpiOsRemoveInterruptHandler (
64 UINT32 InterruptNumber
,
65 ACPI_OSD_HANDLER ServiceRoutine
);
68 AcpiOsInitialize (void)
70 DPRINT("AcpiOsInitialize called\n");
73 /* Verboseness level of the acpica core */
74 AcpiDbgLevel
= 0x00FFFFFF;
75 AcpiDbgLayer
= 0xFFFFFFFF;
80 for (i
= 0; i
< NUM_SEMAPHORES
; i
++)
82 AcpiGbl_Semaphores
[i
].OsHandle
= NULL
;
85 KeInitializeDpc(&AcpiDpc
, OslDpcStub
, NULL
);
93 DPRINT("AcpiOsTerminate() called\n");
95 if (AcpiInterruptHandlerRegistered
)
96 AcpiOsRemoveInterruptHandler(AcpiIrqNumber
, AcpiIrqHandler
);
101 void ACPI_INTERNAL_VAR_XFACE
107 va_start (Args
, Fmt
);
109 AcpiOsVprintf (Fmt
, Args
);
120 vDbgPrintEx (-1, DPFLTR_ERROR_LEVEL
, Fmt
, Args
);
125 AcpiOsAllocate (ACPI_SIZE size
)
127 DPRINT("AcpiOsAllocate size %d\n",size
);
128 return ExAllocatePool(NonPagedPool
, size
);
132 AcpiOsCallocate(ACPI_SIZE size
)
134 PVOID ptr
= ExAllocatePool(NonPagedPool
, size
);
136 memset(ptr
, 0, size
);
141 AcpiOsFree(void *ptr
)
144 DPRINT1("Attempt to free null pointer!!!\n");
148 #ifndef ACPI_USE_LOCAL_CACHE
151 AcpiOsAcquireObjectHelper (
153 SIZE_T NumberOfBytes
,
156 void* Alloc
= ExAllocatePool(PoolType
, NumberOfBytes
);
158 /* acpica expects memory allocated from cache to be zeroed */
159 RtlZeroMemory(Alloc
,NumberOfBytes
);
168 ACPI_CACHE_T
**ReturnCache
)
170 PNPAGED_LOOKASIDE_LIST Lookaside
=
171 ExAllocatePool(NonPagedPool
,sizeof(NPAGED_LOOKASIDE_LIST
));
173 ExInitializeNPagedLookasideList(Lookaside
,
174 (PALLOCATE_FUNCTION
)AcpiOsAcquireObjectHelper
,// custom memory allocator
180 *ReturnCache
= (ACPI_CACHE_T
*)Lookaside
;
182 DPRINT("AcpiOsCreateCache %p\n", Lookaside
);
190 DPRINT("AcpiOsDeleteCache %p\n", Cache
);
191 ExDeleteNPagedLookasideList(
192 (PNPAGED_LOOKASIDE_LIST
) Cache
);
201 DPRINT("AcpiOsPurgeCache\n");
202 /* No such functionality for LookAside lists */
207 AcpiOsAcquireObject (
210 PNPAGED_LOOKASIDE_LIST List
= (PNPAGED_LOOKASIDE_LIST
)Cache
;
211 DPRINT("AcpiOsAcquireObject from %p\n", Cache
);
213 ExAllocateFromNPagedLookasideList(List
);
216 RtlZeroMemory(ptr
,List
->L
.Size
);
221 AcpiOsReleaseObject (
225 DPRINT("AcpiOsReleaseObject %p from %p\n",Object
, Cache
);
226 ExFreeToNPagedLookasideList(
227 (PNPAGED_LOOKASIDE_LIST
)Cache
,
236 ACPI_PHYSICAL_ADDRESS phys
,
239 PHYSICAL_ADDRESS Address
;
241 DPRINT("AcpiOsMapMemory(phys 0x%X size 0x%X)\n", (ULONG
)phys
, length
);
244 IVTVirtualAddress
= ExAllocatePool(NonPagedPool
, length
);
245 return IVTVirtualAddress
;
248 Address
.QuadPart
= (ULONG
)phys
;
249 return MmMapIoSpace(Address
, length
, MmNonCached
);
257 DPRINT("AcpiOsUnmapMemory()\n");
261 ExFreePool(IVTVirtualAddress
);
264 MmUnmapIoSpace(virt
, length
);
268 AcpiOsInstallInterruptHandler (
269 UINT32 InterruptNumber
,
270 ACPI_OSD_HANDLER ServiceRoutine
,
278 DPRINT("AcpiOsInstallInterruptHandler()\n");
279 Vector
= HalGetInterruptVector(
287 AcpiIrqNumber
= InterruptNumber
;
288 AcpiIrqHandler
= ServiceRoutine
;
289 AcpiIrqContext
= Context
;
290 AcpiInterruptHandlerRegistered
= TRUE
;
292 Status
= IoConnectInterrupt(
300 LevelSensitive
, /* FIXME: LevelSensitive or Latched? */
305 if (!NT_SUCCESS(Status
))
307 DPRINT("Could not connect to interrupt %d\n", Vector
);
314 AcpiOsRemoveInterruptHandler (
315 UINT32 InterruptNumber
,
316 ACPI_OSD_HANDLER ServiceRoutine
)
318 DPRINT("AcpiOsRemoveInterruptHandler()\n");
319 if (AcpiInterruptHandlerRegistered
)
321 IoDisconnectInterrupt(AcpiInterrupt
);
322 AcpiInterrupt
= NULL
;
323 AcpiInterruptHandlerRegistered
= FALSE
;
330 AcpiOsStall (UINT32 microseconds
)
332 DPRINT("AcpiOsStall %d\n",microseconds
);
333 KeStallExecutionProcessor(microseconds
);
338 AcpiOsSleep (ACPI_INTEGER milliseconds
)
340 DPRINT("AcpiOsSleep %d\n", milliseconds
);
341 KeStallExecutionProcessor(milliseconds
*1000);
347 ACPI_IO_ADDRESS Address
,
351 DPRINT("AcpiOsReadPort %p, width %d\n",Address
,Width
);
356 *Value
= READ_PORT_UCHAR((PUCHAR
)Address
);
360 *Value
= READ_PORT_USHORT((PUSHORT
)Address
);
364 *Value
= READ_PORT_ULONG((PULONG
)Address
);
367 DPRINT1("AcpiOsReadPort got bad width: %d\n",Width
);
368 return (AE_BAD_PARAMETER
);
376 ACPI_IO_ADDRESS Address
,
380 DPRINT("AcpiOsWritePort %p, width %d\n",Address
,Width
);
384 WRITE_PORT_UCHAR((PUCHAR
)Address
, Value
);
388 WRITE_PORT_USHORT((PUSHORT
)Address
, Value
);
392 WRITE_PORT_ULONG((PULONG
)Address
, Value
);
396 DPRINT1("AcpiOsWritePort got bad width: %d\n",Width
);
397 return (AE_BAD_PARAMETER
);
405 ACPI_PHYSICAL_ADDRESS Address
,
409 DPRINT("AcpiOsReadMemory %p\n", Address
);
413 *Value
= (*(PUCHAR
)(ULONG
)Address
);
416 *Value
= (*(PUSHORT
)(ULONG
)Address
);
419 *Value
= (*(PULONG
)(ULONG
)Address
);
423 DPRINT1("AcpiOsReadMemory got bad width: %d\n",Width
);
424 return (AE_BAD_PARAMETER
);
433 ACPI_PHYSICAL_ADDRESS Address
,
437 DPRINT("AcpiOsWriteMemory %p\n", Address
);
441 *(PUCHAR
)(ULONG
)Address
= Value
;
444 *(PUSHORT
)(ULONG
)Address
= Value
;
447 *(PULONG
)(ULONG
)Address
= Value
;
451 DPRINT1("AcpiOsWriteMemory got bad width: %d\n",Width
);
452 return (AE_BAD_PARAMETER
);
460 AcpiOsReadPciConfiguration (
467 PCI_SLOT_NUMBER slot
;
469 if (Register
== 0 || PciId
->Device
== 0)
473 slot
.u
.bits
.DeviceNumber
= PciId
->Device
;
474 slot
.u
.bits
.FunctionNumber
= PciId
->Function
;
476 DPRINT("AcpiOsReadPciConfiguration, slot=0x%X, func=0x%X\n", slot
.u
.AsULONG
, Register
);
477 Status
= HalGetBusDataByOffset(PCIConfiguration
,
484 if (NT_SUCCESS(Status
))
491 AcpiOsWritePciConfiguration (
499 PCI_SLOT_NUMBER slot
;
501 if (Register
== 0 || PciId
->Device
== 0)
505 slot
.u
.bits
.DeviceNumber
= PciId
->Device
;
506 slot
.u
.bits
.FunctionNumber
= PciId
->Function
;
508 DPRINT("AcpiOsWritePciConfiguration, slot=0x%x\n", slot
.u
.AsULONG
);
509 Status
= HalSetBusDataByOffset(PCIConfiguration
,
516 if (NT_SUCCESS(Status
))
523 AcpiOsCreateSemaphore (
526 ACPI_SEMAPHORE
*OutHandle
)
530 Mutex
= ExAllocatePool(NonPagedPool
, sizeof(FAST_MUTEX
));
534 DPRINT("AcpiOsCreateSemaphore() at 0x%X\n", Mutex
);
536 ExInitializeFastMutex(Mutex
);
543 AcpiOsDeleteSemaphore (
544 ACPI_SEMAPHORE Handle
)
546 PFAST_MUTEX Mutex
= (PFAST_MUTEX
)Handle
;
548 DPRINT("AcpiOsDeleteSemaphore(handle 0x%X)\n", Handle
);
551 return AE_BAD_PARAMETER
;
559 ACPI_SEMAPHORE Handle
,
563 PFAST_MUTEX Mutex
= (PFAST_MUTEX
)Handle
;
565 if (!Mutex
|| (units
< 1))
567 DPRINT("AcpiOsWaitSemaphore(handle 0x%X, units %d) Bad parameters\n",
569 return AE_BAD_PARAMETER
;
572 DPRINT("Waiting for semaphore %p\n", Handle
);
575 ExAcquireFastMutex(Mutex
);
580 AcpiOsSignalSemaphore (
584 PFAST_MUTEX Mutex
= (PFAST_MUTEX
)Handle
;
586 DPRINT("AcpiOsSignalSemaphore %p\n",Handle
);
589 ExReleaseFastMutex(Mutex
);
595 ACPI_SPINLOCK
*OutHandle
)
597 DPRINT("AcpiOsCreateLock\n");
598 return (AcpiOsCreateSemaphore (1, 1, OutHandle
));
603 ACPI_SPINLOCK Handle
)
605 DPRINT("AcpiOsDeleteLock %p\n", Handle
);
606 AcpiOsDeleteSemaphore (Handle
);
614 DPRINT("AcpiOsAcquireLock, %p\n", Handle
);
615 AcpiOsWaitSemaphore (Handle
, 1, 0xFFFF);
622 ACPI_SPINLOCK Handle
,
623 ACPI_CPU_FLAGS Flags
)
625 DPRINT("AcpiOsReleaseLock %p\n",Handle
);
626 AcpiOsSignalSemaphore (Handle
, 1);
637 case ACPI_SIGNAL_FATAL
:
639 AcpiOsPrintf ("AcpiOsBreakpoint: %s ****\n", Info
);
641 AcpiOsPrintf ("AcpiOsBreakpoint ****\n");
643 case ACPI_SIGNAL_BREAKPOINT
:
645 AcpiOsPrintf ("AcpiOsBreakpoint: %s ****\n", Info
);
647 AcpiOsPrintf ("AcpiOsBreakpoint ****\n");
656 AcpiOsGetThreadId (void)
658 return (ULONG
)PsGetCurrentThreadId();
663 ACPI_EXECUTE_TYPE Type
,
664 ACPI_OSD_EXEC_CALLBACK Function
,
667 DPRINT("AcpiOsExecute\n");
669 KeInsertQueueDpc(&AcpiDpc
, (PVOID
)Function
, (PVOID
)Context
);
671 #ifdef _MULTI_THREADED
672 //_beginthread (Function, (unsigned) 0, Context);
679 AcpiOsGetTimer (void)
681 DPRINT("AcpiOsGetTimer\n");
683 KeQueryTickCount(&Timer
);
685 return Timer
.QuadPart
;
694 DPRINT("AcpiOsDerivePciId\n");
699 AcpiOsPredefinedOverride (
700 const ACPI_PREDEFINED_NAMES
*InitVal
,
703 if (!InitVal
|| !NewVal
)
704 return AE_BAD_PARAMETER
;
706 *NewVal
= ACPI_OS_NAME
;
707 DPRINT("AcpiOsPredefinedOverride\n");
711 ACPI_PHYSICAL_ADDRESS
712 AcpiOsGetRootPointer (
716 AcpiOsTableOverride (
717 ACPI_TABLE_HEADER
*ExistingTable
,
718 ACPI_TABLE_HEADER
**NewTable
)
720 DPRINT("AcpiOsTableOverride\n");
726 AcpiOsValidateInterface (
729 DPRINT("AcpiOsValidateInterface\n");
734 AcpiOsValidateAddress (
736 ACPI_PHYSICAL_ADDRESS Address
,
739 DPRINT("AcpiOsValidateAddress\n");
743 ACPI_PHYSICAL_ADDRESS
744 AcpiOsGetRootPointer (
747 DPRINT("AcpiOsGetRootPointer\n");
748 ACPI_PHYSICAL_ADDRESS pa
= 0;
750 AcpiFindRootPointer(&pa
);