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 ||
470 Register
+ Width
> PCI_COMMON_HDR_LENGTH
)
474 slot
.u
.bits
.DeviceNumber
= PciId
->Device
;
475 slot
.u
.bits
.FunctionNumber
= PciId
->Function
;
477 DPRINT("AcpiOsReadPciConfiguration, slot=0x%X, func=0x%X\n", slot
.u
.AsULONG
, Register
);
478 Status
= HalGetBusDataByOffset(PCIConfiguration
,
485 if (NT_SUCCESS(Status
))
492 AcpiOsWritePciConfiguration (
500 PCI_SLOT_NUMBER slot
;
502 if (Register
== 0 || PciId
->Device
== 0 ||
503 Register
+ Width
> PCI_COMMON_HDR_LENGTH
)
507 slot
.u
.bits
.DeviceNumber
= PciId
->Device
;
508 slot
.u
.bits
.FunctionNumber
= PciId
->Function
;
510 DPRINT("AcpiOsWritePciConfiguration, slot=0x%x\n", slot
.u
.AsULONG
);
511 Status
= HalSetBusDataByOffset(PCIConfiguration
,
518 if (NT_SUCCESS(Status
))
525 AcpiOsCreateSemaphore (
528 ACPI_SEMAPHORE
*OutHandle
)
532 Mutex
= ExAllocatePool(NonPagedPool
, sizeof(FAST_MUTEX
));
536 DPRINT("AcpiOsCreateSemaphore() at 0x%X\n", Mutex
);
538 ExInitializeFastMutex(Mutex
);
545 AcpiOsDeleteSemaphore (
546 ACPI_SEMAPHORE Handle
)
548 PFAST_MUTEX Mutex
= (PFAST_MUTEX
)Handle
;
550 DPRINT("AcpiOsDeleteSemaphore(handle 0x%X)\n", Handle
);
553 return AE_BAD_PARAMETER
;
561 ACPI_SEMAPHORE Handle
,
565 PFAST_MUTEX Mutex
= (PFAST_MUTEX
)Handle
;
567 if (!Mutex
|| (units
< 1))
569 DPRINT("AcpiOsWaitSemaphore(handle 0x%X, units %d) Bad parameters\n",
571 return AE_BAD_PARAMETER
;
574 DPRINT("Waiting for semaphore %p\n", Handle
);
577 ExAcquireFastMutex(Mutex
);
582 AcpiOsSignalSemaphore (
586 PFAST_MUTEX Mutex
= (PFAST_MUTEX
)Handle
;
588 DPRINT("AcpiOsSignalSemaphore %p\n",Handle
);
591 ExReleaseFastMutex(Mutex
);
597 ACPI_SPINLOCK
*OutHandle
)
599 DPRINT("AcpiOsCreateLock\n");
600 return (AcpiOsCreateSemaphore (1, 1, OutHandle
));
605 ACPI_SPINLOCK Handle
)
607 DPRINT("AcpiOsDeleteLock %p\n", Handle
);
608 AcpiOsDeleteSemaphore (Handle
);
616 DPRINT("AcpiOsAcquireLock, %p\n", Handle
);
617 AcpiOsWaitSemaphore (Handle
, 1, 0xFFFF);
624 ACPI_SPINLOCK Handle
,
625 ACPI_CPU_FLAGS Flags
)
627 DPRINT("AcpiOsReleaseLock %p\n",Handle
);
628 AcpiOsSignalSemaphore (Handle
, 1);
639 case ACPI_SIGNAL_FATAL
:
641 AcpiOsPrintf ("AcpiOsBreakpoint: %s ****\n", Info
);
643 AcpiOsPrintf ("AcpiOsBreakpoint ****\n");
645 case ACPI_SIGNAL_BREAKPOINT
:
647 AcpiOsPrintf ("AcpiOsBreakpoint: %s ****\n", Info
);
649 AcpiOsPrintf ("AcpiOsBreakpoint ****\n");
658 AcpiOsGetThreadId (void)
660 return (ULONG
)PsGetCurrentThreadId();
665 ACPI_EXECUTE_TYPE Type
,
666 ACPI_OSD_EXEC_CALLBACK Function
,
669 DPRINT("AcpiOsExecute\n");
671 KeInsertQueueDpc(&AcpiDpc
, (PVOID
)Function
, (PVOID
)Context
);
673 #ifdef _MULTI_THREADED
674 //_beginthread (Function, (unsigned) 0, Context);
681 AcpiOsGetTimer (void)
683 DPRINT("AcpiOsGetTimer\n");
685 KeQueryTickCount(&Timer
);
687 return Timer
.QuadPart
;
696 DPRINT("AcpiOsDerivePciId\n");
701 AcpiOsPredefinedOverride (
702 const ACPI_PREDEFINED_NAMES
*InitVal
,
705 if (!InitVal
|| !NewVal
)
706 return AE_BAD_PARAMETER
;
708 *NewVal
= ACPI_OS_NAME
;
709 DPRINT("AcpiOsPredefinedOverride\n");
713 ACPI_PHYSICAL_ADDRESS
714 AcpiOsGetRootPointer (
718 AcpiOsTableOverride (
719 ACPI_TABLE_HEADER
*ExistingTable
,
720 ACPI_TABLE_HEADER
**NewTable
)
722 DPRINT("AcpiOsTableOverride\n");
728 AcpiOsValidateInterface (
731 DPRINT("AcpiOsValidateInterface\n");
736 AcpiOsValidateAddress (
738 ACPI_PHYSICAL_ADDRESS Address
,
741 DPRINT("AcpiOsValidateAddress\n");
745 ACPI_PHYSICAL_ADDRESS
746 AcpiOsGetRootPointer (
749 DPRINT("AcpiOsGetRootPointer\n");
750 ACPI_PHYSICAL_ADDRESS pa
= 0;
752 AcpiFindRootPointer(&pa
);