1 /*******************************************************************************
3 * ACPI Component Architecture Operating System Layer (OSL) for ReactOS *
5 *******************************************************************************/
12 #define NUM_SEMAPHORES 128
14 static PKINTERRUPT AcpiInterrupt
;
15 static BOOLEAN AcpiInterruptHandlerRegistered
= FALSE
;
16 static ACPI_OSD_HANDLER AcpiIrqHandler
= NULL
;
17 static PVOID AcpiIrqContext
= NULL
;
18 static ULONG AcpiIrqNumber
= 0;
20 static PVOID IVTVirtualAddress
= NULL
;
23 typedef struct semaphore_entry
30 static SEMAPHORE_ENTRY AcpiGbl_Semaphores
[NUM_SEMAPHORES
];
35 IN PVOID DeferredContext
,
36 IN PVOID SystemArgument1
,
37 IN PVOID SystemArgument2
)
39 ACPI_OSD_EXEC_CALLBACK Routine
= (ACPI_OSD_EXEC_CALLBACK
)SystemArgument1
;
41 DPRINT("OslDpcStub()\n");
42 DPRINT("Calling [%p]([%p])\n", Routine
, SystemArgument2
);
43 (*Routine
)(SystemArgument2
);
48 PKINTERRUPT Interrupt
,
53 Status
= (*AcpiIrqHandler
)(AcpiIrqContext
);
55 if (ACPI_SUCCESS(Status
))
62 AcpiOsRemoveInterruptHandler (
63 UINT32 InterruptNumber
,
64 ACPI_OSD_HANDLER ServiceRoutine
);
67 AcpiOsInitialize (void)
69 DPRINT("AcpiOsInitialize called\n");
72 /* Verboseness level of the acpica core */
73 AcpiDbgLevel
= 0x00FFFFFF;
74 AcpiDbgLayer
= 0xFFFFFFFF;
79 for (i
= 0; i
< NUM_SEMAPHORES
; i
++)
81 AcpiGbl_Semaphores
[i
].OsHandle
= NULL
;
84 KeInitializeDpc(&AcpiDpc
, OslDpcStub
, NULL
);
92 DPRINT1("AcpiOsTerminate() called\n");
94 if (AcpiInterruptHandlerRegistered
)
95 AcpiOsRemoveInterruptHandler(AcpiIrqNumber
, AcpiIrqHandler
);
100 void ACPI_INTERNAL_VAR_XFACE
106 va_start (Args
, Fmt
);
108 AcpiOsVprintf (Fmt
, Args
);
119 vDbgPrintEx (-1, DPFLTR_ERROR_LEVEL
, Fmt
, Args
);
124 AcpiOsAllocate (ACPI_SIZE size
)
126 DPRINT("AcpiOsAllocate size %d\n",size
);
127 return ExAllocatePool(NonPagedPool
, size
);
131 AcpiOsCallocate(ACPI_SIZE size
)
133 PVOID ptr
= ExAllocatePool(NonPagedPool
, size
);
135 memset(ptr
, 0, size
);
140 AcpiOsFree(void *ptr
)
143 DPRINT1("Attempt to free null pointer!!!\n");
147 #ifndef ACPI_USE_LOCAL_CACHE
150 AcpiOsAcquireObjectHelper (
152 SIZE_T NumberOfBytes
,
155 void* Alloc
= ExAllocatePool(PoolType
, NumberOfBytes
);
157 /* acpica expects memory allocated from cache to be zeroed */
158 RtlZeroMemory(Alloc
,NumberOfBytes
);
167 ACPI_CACHE_T
**ReturnCache
)
169 PNPAGED_LOOKASIDE_LIST Lookaside
=
170 ExAllocatePool(NonPagedPool
,sizeof(NPAGED_LOOKASIDE_LIST
));
172 ExInitializeNPagedLookasideList(Lookaside
,
173 (PALLOCATE_FUNCTION
)AcpiOsAcquireObjectHelper
,// custom memory allocator
179 *ReturnCache
= (ACPI_CACHE_T
*)Lookaside
;
181 DPRINT("AcpiOsCreateCache %p\n", Lookaside
);
189 DPRINT("AcpiOsDeleteCache %p\n", Cache
);
190 ExDeleteNPagedLookasideList(
191 (PNPAGED_LOOKASIDE_LIST
) Cache
);
200 DPRINT("AcpiOsPurgeCache\n");
201 /* No such functionality for LookAside lists */
206 AcpiOsAcquireObject (
209 PNPAGED_LOOKASIDE_LIST List
= (PNPAGED_LOOKASIDE_LIST
)Cache
;
210 DPRINT("AcpiOsAcquireObject from %p\n", Cache
);
212 ExAllocateFromNPagedLookasideList(List
);
215 RtlZeroMemory(ptr
,List
->L
.Size
);
220 AcpiOsReleaseObject (
224 DPRINT("AcpiOsReleaseObject %p from %p\n",Object
, Cache
);
225 ExFreeToNPagedLookasideList(
226 (PNPAGED_LOOKASIDE_LIST
)Cache
,
235 ACPI_PHYSICAL_ADDRESS phys
,
238 PHYSICAL_ADDRESS Address
;
240 DPRINT("AcpiOsMapMemory(phys 0x%X size 0x%X)\n", (ULONG
)phys
, length
);
243 IVTVirtualAddress
= ExAllocatePool(NonPagedPool
, length
);
244 return IVTVirtualAddress
;
247 Address
.QuadPart
= (ULONG
)phys
;
248 return MmMapIoSpace(Address
, length
, MmNonCached
);
256 DPRINT("AcpiOsUnmapMemory()\n");
260 ExFreePool(IVTVirtualAddress
);
263 MmUnmapIoSpace(virt
, length
);
267 AcpiOsInstallInterruptHandler (
268 UINT32 InterruptNumber
,
269 ACPI_OSD_HANDLER ServiceRoutine
,
277 DPRINT("AcpiOsInstallInterruptHandler()\n");
278 Vector
= HalGetInterruptVector(
286 AcpiIrqNumber
= InterruptNumber
;
287 AcpiIrqHandler
= ServiceRoutine
;
288 AcpiIrqContext
= Context
;
289 AcpiInterruptHandlerRegistered
= TRUE
;
291 Status
= IoConnectInterrupt(
299 LevelSensitive
, /* FIXME: LevelSensitive or Latched? */
304 if (!NT_SUCCESS(Status
))
306 DPRINT("Could not connect to interrupt %d\n", Vector
);
313 AcpiOsRemoveInterruptHandler (
314 UINT32 InterruptNumber
,
315 ACPI_OSD_HANDLER ServiceRoutine
)
317 DPRINT("AcpiOsRemoveInterruptHandler()\n");
318 if (AcpiInterruptHandlerRegistered
)
320 IoDisconnectInterrupt(AcpiInterrupt
);
321 AcpiInterrupt
= NULL
;
322 AcpiInterruptHandlerRegistered
= FALSE
;
329 AcpiOsStall (UINT32 microseconds
)
331 DPRINT1("AcpiOsStall %d\n",microseconds
);
332 KeStallExecutionProcessor(microseconds
);
337 AcpiOsSleep (ACPI_INTEGER milliseconds
)
339 DPRINT1("AcpiOsSleep %d\n", milliseconds
);
340 KeStallExecutionProcessor(milliseconds
*1000);
346 ACPI_IO_ADDRESS Address
,
350 DPRINT("AcpiOsReadPort %p, width %d\n",Address
,Width
);
355 *Value
= READ_PORT_UCHAR((PUCHAR
)Address
);
359 *Value
= READ_PORT_USHORT((PUSHORT
)Address
);
363 *Value
= READ_PORT_ULONG((PULONG
)Address
);
366 DPRINT1("AcpiOsReadPort got bad width: %d\n",Width
);
367 return (AE_BAD_PARAMETER
);
375 ACPI_IO_ADDRESS Address
,
379 DPRINT("AcpiOsWritePort %p, width %d\n",Address
,Width
);
383 WRITE_PORT_UCHAR((PUCHAR
)Address
, Value
);
387 WRITE_PORT_USHORT((PUSHORT
)Address
, Value
);
391 WRITE_PORT_ULONG((PULONG
)Address
, Value
);
395 DPRINT1("AcpiOsWritePort got bad width: %d\n",Width
);
396 return (AE_BAD_PARAMETER
);
404 ACPI_PHYSICAL_ADDRESS Address
,
408 DPRINT("AcpiOsReadMemory %p\n", Address
);
412 *Value
= (*(PUCHAR
)(ULONG
)Address
);
415 *Value
= (*(PUSHORT
)(ULONG
)Address
);
418 *Value
= (*(PULONG
)(ULONG
)Address
);
422 DPRINT1("AcpiOsReadMemory got bad width: %d\n",Width
);
423 return (AE_BAD_PARAMETER
);
432 ACPI_PHYSICAL_ADDRESS Address
,
436 DPRINT("AcpiOsWriteMemory %p\n", Address
);
440 *(PUCHAR
)(ULONG
)Address
= Value
;
443 *(PUSHORT
)(ULONG
)Address
= Value
;
446 *(PULONG
)(ULONG
)Address
= Value
;
450 DPRINT1("AcpiOsWriteMemory got bad width: %d\n",Width
);
451 return (AE_BAD_PARAMETER
);
459 AcpiOsReadPciConfiguration (
466 PCI_SLOT_NUMBER slot
;
472 slot
.u
.bits
.DeviceNumber
= PciId
->Bus
;
473 slot
.u
.bits
.FunctionNumber
= PciId
->Function
;
475 DPRINT("AcpiOsReadPciConfiguration, slot=0x%X, func=0x%X\n", slot
.u
.AsULONG
, Register
);
476 Status
= HalGetBusDataByOffset(PCIConfiguration
,
483 if (NT_SUCCESS(Status
))
490 AcpiOsWritePciConfiguration (
498 PCI_SLOT_NUMBER slot
;
504 slot
.u
.bits
.DeviceNumber
= PciId
->Bus
;
505 slot
.u
.bits
.FunctionNumber
= PciId
->Function
;
507 DPRINT("AcpiOsWritePciConfiguration, slot=0x%x\n", slot
.u
.AsULONG
);
508 Status
= HalSetBusDataByOffset(PCIConfiguration
,
515 if (NT_SUCCESS(Status
))
522 AcpiOsCreateSemaphore (
525 ACPI_SEMAPHORE
*OutHandle
)
529 Mutex
= ExAllocatePool(NonPagedPool
, sizeof(FAST_MUTEX
));
533 DPRINT("AcpiOsCreateSemaphore() at 0x%X\n", Mutex
);
535 ExInitializeFastMutex(Mutex
);
542 AcpiOsDeleteSemaphore (
543 ACPI_SEMAPHORE Handle
)
545 PFAST_MUTEX Mutex
= (PFAST_MUTEX
)Handle
;
547 DPRINT("AcpiOsDeleteSemaphore(handle 0x%X)\n", Handle
);
550 return AE_BAD_PARAMETER
;
558 ACPI_SEMAPHORE Handle
,
562 PFAST_MUTEX Mutex
= (PFAST_MUTEX
)Handle
;
564 if (!Mutex
|| (units
< 1))
566 DPRINT("AcpiOsWaitSemaphore(handle 0x%X, units %d) Bad parameters\n",
568 return AE_BAD_PARAMETER
;
571 DPRINT("Waiting for semaphore %p\n", Handle
);
574 ExAcquireFastMutex(Mutex
);
579 AcpiOsSignalSemaphore (
583 PFAST_MUTEX Mutex
= (PFAST_MUTEX
)Handle
;
585 DPRINT("AcpiOsSignalSemaphore %p\n",Handle
);
588 ExReleaseFastMutex(Mutex
);
594 ACPI_SPINLOCK
*OutHandle
)
596 DPRINT("AcpiOsCreateLock\n");
597 return (AcpiOsCreateSemaphore (1, 1, OutHandle
));
602 ACPI_SPINLOCK Handle
)
604 DPRINT("AcpiOsDeleteLock %p\n", Handle
);
605 AcpiOsDeleteSemaphore (Handle
);
613 DPRINT("AcpiOsAcquireLock, %p\n", Handle
);
614 AcpiOsWaitSemaphore (Handle
, 1, 0xFFFF);
621 ACPI_SPINLOCK Handle
,
622 ACPI_CPU_FLAGS Flags
)
624 DPRINT("AcpiOsReleaseLock %p\n",Handle
);
625 AcpiOsSignalSemaphore (Handle
, 1);
636 case ACPI_SIGNAL_FATAL
:
638 AcpiOsPrintf ("AcpiOsBreakpoint: %s ****\n", Info
);
640 AcpiOsPrintf ("AcpiOsBreakpoint ****\n");
642 case ACPI_SIGNAL_BREAKPOINT
:
644 AcpiOsPrintf ("AcpiOsBreakpoint: %s ****\n", Info
);
646 AcpiOsPrintf ("AcpiOsBreakpoint ****\n");
655 AcpiOsGetThreadId (void)
657 return (ULONG
)PsGetCurrentThreadId();
662 ACPI_EXECUTE_TYPE Type
,
663 ACPI_OSD_EXEC_CALLBACK Function
,
666 DPRINT1("AcpiOsExecute\n");
668 KeInsertQueueDpc(&AcpiDpc
, (PVOID
)Function
, (PVOID
)Context
);
670 #ifdef _MULTI_THREADED
671 //_beginthread (Function, (unsigned) 0, Context);
678 AcpiOsGetTimer (void)
680 DPRINT("AcpiOsGetTimer\n");
682 KeQueryTickCount(&Timer
);
684 return Timer
.QuadPart
;
693 DPRINT("AcpiOsDerivePciId\n");
698 AcpiOsPredefinedOverride (
699 const ACPI_PREDEFINED_NAMES
*InitVal
,
702 if (!InitVal
|| !NewVal
)
703 return AE_BAD_PARAMETER
;
705 *NewVal
= ACPI_OS_NAME
;
706 DPRINT("AcpiOsPredefinedOverride\n");
710 ACPI_PHYSICAL_ADDRESS
711 AcpiOsGetRootPointer (
715 AcpiOsTableOverride (
716 ACPI_TABLE_HEADER
*ExistingTable
,
717 ACPI_TABLE_HEADER
**NewTable
)
719 DPRINT("AcpiOsTableOverride\n");
725 AcpiOsValidateInterface (
728 DPRINT("AcpiOsValidateInterface\n");
733 AcpiOsValidateAddress (
735 ACPI_PHYSICAL_ADDRESS Address
,
738 DPRINT("AcpiOsValidateAddress\n");
742 ACPI_PHYSICAL_ADDRESS
743 AcpiOsGetRootPointer (
746 DPRINT("AcpiOsGetRootPointer\n");
747 ACPI_PHYSICAL_ADDRESS pa
= 0;
749 AcpiFindRootPointer(&pa
);