2 * Acess2 Kernel (x86 Core)
3 * - By John Hodge (thePowersGang)
11 #include <semaphore.h>
14 int ACPICA_Initialise(void);
18 int ACPICA_Initialise(void)
22 rv = AcpiInitializeSubsystem();
24 // AcpiInitializeTables?
25 rv = AcpiLoadTables();
27 rv = AcpiEnableSubsystem(ACPI_FULL_INITIALIZATION);
35 ACPI_STATUS AcpiOsInitialize(void)
40 ACPI_STATUS AcpiOsTerminate(void)
45 ACPI_PHYSICAL_ADDRESS AcpiOsGetRootPointer(void)
50 rv = AcpiFindRootPointer(&val);
51 if( ACPI_FAILURE(rv) )
58 ACPI_STATUS AcpiOsPredefinedOverride(const ACPI_PREDEFINED_NAMES *PredefinedObject, ACPI_STRING *NewValue)
60 return AE_NOT_IMPLEMENTED;
63 ACPI_STATUS AcpiOsTableOverride(ACPI_TABLE_HEADER *ExisitingTable, ACPI_TABLE_HEADER **NewTable)
65 return AE_NOT_IMPLEMENTED;
68 ACPI_STATUS AcpiOsPhysicalTableOverride(ACPI_TABLE_HEADER *ExisitingTable, ACPI_PHYSICAL_ADDRESS *NewAddress, UINT32 *NewTableLength)
70 return AE_NOT_IMPLEMENTED;
73 // -- Memory Management ---
74 ACPI_STATUS AcpiOsCreateCache(char *CacheName, UINT16 ObjectSize, UINT16 MaxDepth, ACPI_CACHE_T **ReturnCache)
76 return AE_NOT_IMPLEMENTED;
79 ACPI_STATUS AcpiOsDeleteCache(ACPI_CACHE_T *Cache)
82 return AE_BAD_PARAMETER;
84 return AE_NOT_IMPLEMENTED;
87 ACPI_STATUS AcpiOsPurgeCache(ACPI_CACHE_T *Cache)
90 return AE_BAD_PARAMETER;
92 return AE_NOT_IMPLEMENTED;
95 void *AcpiOsAcquireObject(ACPI_CACHE_T *Cache)
101 ACPI_STATUS AcpiOsReleaseObject(ACPI_CACHE_T *Cache, void *Object)
103 if( Cache == NULL || Object == NULL )
104 return AE_BAD_PARAMETER;
105 return AE_NOT_IMPLEMENTED;
108 void *AcpiOsMapMemory(ACPI_PHYSICAL_ADDRESS PhysicalAddress, ACPI_SIZE Length)
110 Uint ofs = PhysicalAddress & (PAGE_SIZE-1);
111 int npages = (ofs + Length + (PAGE_SIZE-1)) / PAGE_SIZE;
112 return (char*)MM_MapHWPages(PhysicalAddress, npages) + ofs;
115 void AcpiOsUnmapMemory(void *LogicalAddress, ACPI_SIZE Length)
117 Uint ofs = (tVAddr)LogicalAddress & (PAGE_SIZE-1);
118 int npages = (ofs + Length + (PAGE_SIZE-1)) / PAGE_SIZE;
119 // TODO: Validate `Length` is the same as was passed to AcpiOsMapMemory
120 MM_UnmapHWPages( (tVAddr)LogicalAddress, npages);
123 ACPI_STATUS AcpiOsGetPhysicalAddress(void *LogicalAddress, ACPI_PHYSICAL_ADDRESS *PhysicalAddress)
125 if( LogicalAddress == NULL || PhysicalAddress == NULL )
126 return AE_BAD_PARAMETER;
128 tPAddr rv = MM_GetPhysAddr(LogicalAddress);
131 *PhysicalAddress = rv;
135 void *AcpiOsAllocate(ACPI_SIZE Size)
140 void AcpiOsFree(void *Memory)
145 BOOLEAN AcpiOsReadable(void *Memory, ACPI_SIZE Length)
147 return CheckMem(Memory, Length);
150 BOOLEAN AcpiOsWritable(void *Memory, ACPI_SIZE Length)
152 // TODO: Actually check if it's writable
153 return CheckMem(Memory, Length);
158 ACPI_THREAD_ID AcpiOsGetThreadId(void)
160 return Threads_GetTID();
163 ACPI_STATUS AcpiOsExecute(ACPI_EXECUTE_TYPE Type, ACPI_OSD_EXEC_CALLBACK Function, void *Context)
165 // TODO: Need to store currently executing functions
166 if( Function == NULL )
167 return AE_BAD_PARAMETER;
168 Proc_SpawnWorker(Function, Context);
172 void AcpiOsSleep(UINT64 Milliseconds)
174 Time_Delay(Milliseconds);
177 void AcpiOsStall(UINT32 Microseconds)
179 // TODO: need a microsleep function
180 Microseconds += (1000-1);
181 Microseconds /= 1000;
182 Time_Delay(Microseconds);
185 void AcpiOsWaitEventsComplete(void)
190 // --- Mutexes etc ---
191 ACPI_STATUS AcpiOsCreateMutex(ACPI_MUTEX *OutHandle)
194 return AE_BAD_PARAMETER;
195 tMutex *ret = calloc( sizeof(tMutex), 1 );
198 ret->Name = "AcpiOsCreateMutex";
204 void AcpiOsDeleteMutex(ACPI_MUTEX Handle)
206 Mutex_Acquire(Handle);
210 ACPI_STATUS AcpiOsAcquireMutex(ACPI_MUTEX Handle, UINT16 Timeout)
213 return AE_BAD_PARAMETER;
215 Mutex_Acquire(Handle);
220 void AcpiOsReleaseMutex(ACPI_MUTEX Handle)
222 Mutex_Release(Handle);
225 ACPI_STATUS AcpiOsCreateSemaphore(UINT32 MaxUnits, UINT32 InitialUnits, ACPI_SEMAPHORE *OutHandle)
228 return AE_BAD_PARAMETER;
229 tSemaphore *ret = calloc( sizeof(tSemaphore), 1 );
233 Semaphore_Init(ret, InitialUnits, MaxUnits, "AcpiOsCreateSemaphore", "");
238 ACPI_STATUS AcpiOsDeleteSemaphore(ACPI_SEMAPHORE Handle)
241 return AE_BAD_PARAMETER;
248 ACPI_STATUS AcpiOsWaitSemaphore(ACPI_SEMAPHORE Handle, UINT32 Units, UINT16 Timeout)
251 return AE_BAD_PARAMETER;
256 // NOTE: Possible race condition
257 if( Semaphore_GetValue(Handle) >= Units ) {
258 Semaphore_Wait(Handle, Units);
266 while(rem && now() - start < Timeout)
268 rem -= Semaphore_Wait(Handle, rem);
272 Semaphore_Signal(Handle, Units - rem);
279 ACPI_STATUS AcpiOsSignalSemaphore(ACPI_SEMAPHORE Handle, UINT32 Units)
282 return AE_BAD_PARAMETER;
284 // TODO: Support AE_LIMIT detection early (to avoid blocks)
287 int rv = Semaphore_Signal(Handle, Units);
294 ACPI_STATUS AcpiOsCreateLock(ACPI_SPINLOCK *OutHandle)
297 return AE_BAD_PARAMETER;
298 tShortSpinlock *lock = calloc(sizeof(tShortSpinlock), 1);
306 void AcpiOsDeleteLock(ACPI_SPINLOCK Handle)
311 ACPI_CPU_FLAGS AcpiOsAcquireLock(ACPI_SPINLOCK Handle)
317 void AcpiOsReleaseLock(ACPI_SPINLOCK Handle, ACPI_CPU_FLAGS Flags)
322 // --- Interrupt handling ---
323 #define N_INT_LEVELS 16
324 ACPI_OSD_HANDLER gaACPI_InterruptHandlers[N_INT_LEVELS];
325 void *gaACPI_InterruptData[N_INT_LEVELS];
326 int gaACPI_InterruptHandles[N_INT_LEVELS];
328 void ACPI_int_InterruptProxy(int IRQ, void *data)
330 if( !gaACPI_InterruptHandlers[IRQ] )
332 gaACPI_InterruptHandlers[IRQ](gaACPI_InterruptData[IRQ]);
335 ACPI_STATUS AcpiOsInstallInterruptHandler(UINT32 InterruptLevel, ACPI_OSD_HANDLER Handler, void *Context)
337 if( InterruptLevel >= N_INT_LEVELS || Handler == NULL )
338 return AE_BAD_PARAMETER;
339 if( gaACPI_InterruptHandlers[InterruptLevel] )
340 return AE_ALREADY_EXISTS;
342 gaACPI_InterruptHandlers[InterruptLevel] = Handler;
343 gaACPI_InterruptData[InterruptLevel] = Context;
345 gaACPI_InterruptHandles[InterruptLevel] = IRQ_AddHandler(InterruptLevel, ACPI_int_InterruptProxy, NULL);
349 ACPI_STATUS AcpiOsRemoveInterruptHandler(UINT32 InterruptLevel, ACPI_OSD_HANDLER Handler)
351 if( InterruptLevel >= N_INT_LEVELS || Handler == NULL )
352 return AE_BAD_PARAMETER;
353 if( gaACPI_InterruptHandlers[InterruptLevel] != Handler )
355 gaACPI_InterruptHandlers[InterruptLevel] = NULL;
356 IRQ_RemHandler(gaACPI_InterruptHandles[InterruptLevel]);
360 // --- Memory Access ---
361 ACPI_STATUS AcpiOsReadMemory(ACPI_PHYSICAL_ADDRESS Address, UINT64 *Value, UINT32 Width)
364 if( Address < 1024*1024 ) {
365 ptr = (void*)(KERNEL_BASE | Address);
368 ptr = (char*)MM_MapTemp(Address) + (Address & 0xFFF);
373 case 8: *Value = *(Uint8 *)ptr; break;
374 case 16: *Value = *(Uint16*)ptr; break;
375 case 32: *Value = *(Uint32*)ptr; break;
376 case 64: *Value = *(Uint64*)ptr; break;
379 if( Address >= 1024*1024 ) {
386 ACPI_STATUS AcpiOsWriteMemory(ACPI_PHYSICAL_ADDRESS Address, UINT64 Value, UINT32 Width)
389 if( Address < 1024*1024 ) {
390 ptr = (void*)(KERNEL_BASE | Address);
393 ptr = (char*)MM_MapTemp(Address) + (Address & 0xFFF);
398 case 8: *(Uint8 *)ptr = Value; break;
399 case 16: *(Uint16*)ptr = Value; break;
400 case 32: *(Uint32*)ptr = Value; break;
401 case 64: *(Uint64*)ptr = Value; break;
403 return AE_BAD_PARAMETER;
406 if( Address >= 1024*1024 ) {
413 // --- Port Input / Output ---
414 ACPI_STATUS AcpiOsReadPort(ACPI_IO_ADDRESS Address, UINT32 *Value, UINT32 Width)
418 case 8: *Value = inb(Address); break;
419 case 16: *Value = inw(Address); break;
420 case 32: *Value = ind(Address); break;
422 return AE_BAD_PARAMETER;
427 ACPI_STATUS AcpiOsWritePort(ACPI_IO_ADDRESS Address, UINT32 Value, UINT32 Width)
431 case 8: outb(Address, Value); break;
432 case 16: outw(Address, Value); break;
433 case 32: outd(Address, Value); break;
435 return AE_BAD_PARAMETER;
440 // --- PCI Configuration Space Access ---
441 ACPI_STATUS AcpiOsReadPciConfiguration(ACPI_PCI_ID *PciId, UINT32 Register, UINT64 *Value, UINT32 Width)
443 return AE_NOT_IMPLEMENTED;
446 ACPI_STATUS AcpiOsWritePciConfiguration(ACPI_PCI_ID *PciId, UINT32 Register, UINT64 Value, UINT32 Width)
448 return AE_NOT_IMPLEMENTED;
451 // --- Formatted Output ---
452 void AcpiOsPrintf(const char *Format, ...)
455 va_start(args, Format);
462 void AcpiOsVprintf(const char *Format, va_list Args)
467 void AcpiOsRedirectOutput(void *Destination)
469 // TODO: is this needed?
472 // --- Miscellaneous ---
473 UINT64 AcpiOsGetTimer(void)
475 return now() * 10 * 1000;
478 ACPI_STATUS AcpiOsSignal(UINT32 Function, void *Info)
482 case ACPI_SIGNAL_FATAL: {
483 ACPI_SIGNAL_FATAL_INFO *finfo = Info;
484 Log_Error("ACPI AML", "Fatal %x %x %x", finfo->Type, finfo->Code, finfo->Argument);
486 case ACPI_SIGNAL_BREAKPOINT: {
487 Log_Notice("ACPI AML", "Breakpoint %s", Info);
493 ACPI_STATUS AcpiOsGetLine(char *Buffer, UINT32 BufferLength, UINT32 *BytesRead)
495 return AE_NOT_IMPLEMENTED;