Usermode/libc - Fix strchr and strrchr behavior
[tpg/acess2.git] / KernelLand / Kernel / arch / x86 / acpica.c
index 1534789..5603add 100644 (file)
@@ -49,7 +49,6 @@ int ACPICA_Initialise(void)
                return -1;
        }
 
-       // AcpiInitializeTables?
        rv = AcpiLoadTables();
        if( ACPI_FAILURE(rv) )
        {
@@ -119,6 +118,7 @@ ACPI_STATUS AcpiOsPhysicalTableOverride(ACPI_TABLE_HEADER *ExisitingTable, ACPI_
 }
 
 // -- Memory Management ---
+#if USE_ACESS_ACPI_CACHE
 struct sACPICache
 {
        Uint16  nObj;
@@ -134,6 +134,10 @@ ACPI_STATUS AcpiOsCreateCache(char *CacheName, UINT16 ObjectSize, UINT16 MaxDept
         int    namelen = (CacheName ? strlen(CacheName) : 0) + 1;
        LOG("CacheName=%s, ObjSize=%x, MaxDepth=%x", CacheName, ObjectSize, MaxDepth);
 
+       if( ReturnCache == NULL || ObjectSize < 16) {
+               return AE_BAD_PARAMETER;
+       }
+
        namelen = (namelen + 3) & ~3;
 
        ret = malloc(sizeof(*ret) + MaxDepth*sizeof(char) + namelen + MaxDepth*ObjectSize);
@@ -151,7 +155,7 @@ ACPI_STATUS AcpiOsCreateCache(char *CacheName, UINT16 ObjectSize, UINT16 MaxDept
        else
                ret->Name[0] = 0;
        memset(ret->ObjectStates, 0, sizeof(char)*MaxDepth);
-
+       
        LOG("Allocated cache %p '%s' (%i x 0x%x)", ret, CacheName, MaxDepth, ObjectSize);
        
        *ReturnCache = ret;
@@ -185,11 +189,16 @@ ACPI_STATUS AcpiOsPurgeCache(ACPI_CACHE_T *Cache)
 void *AcpiOsAcquireObject(ACPI_CACHE_T *Cache)
 {
        ENTER("pCache", Cache);
+       LOG("Called by %p", __builtin_return_address(0));
        for(int i = 0; i < Cache->nObj; i ++ )
        {
                if( !Cache->ObjectStates[i] ) {
                        Cache->ObjectStates[i] = 1;
                        void *rv = (char*)Cache->First + i*Cache->ObjectSize;
+                       if(!rv) {
+                               LEAVE('n');
+                               return NULL;
+                       }
                        memset(rv, 0, Cache->ObjectSize);
                        LEAVE('p', rv);
                        return rv;
@@ -213,23 +222,28 @@ ACPI_STATUS AcpiOsReleaseObject(ACPI_CACHE_T *Cache, void *Object)
        delta /= Cache->ObjectSize;
        LOG("Cache=%p, delta = %i, (limit %i)", Cache, delta, Cache->nObj);
        
-       if( delta >= Cache->nObj )
+       if( delta >= Cache->nObj ) {
+               LEAVE('i', AE_BAD_PARAMETER);
                return AE_BAD_PARAMETER;
+       }
        
        Cache->ObjectStates[delta] = 0;
 
        LEAVE('i', AE_OK);
        return AE_OK;
 }
+#endif
 
 void *AcpiOsMapMemory(ACPI_PHYSICAL_ADDRESS PhysicalAddress, ACPI_SIZE Length)
 {
-       if( PhysicalAddress < ONEMEG )
+       if( PhysicalAddress < ONEMEG ) {
+               ASSERTCR(Length, <=, ONEMEG-PhysicalAddress, NULL);
                return (void*)(KERNEL_BASE | PhysicalAddress);
+       }
        
        Uint    ofs = PhysicalAddress & (PAGE_SIZE-1);
        int npages = (ofs + Length + (PAGE_SIZE-1)) / PAGE_SIZE;
-       char *maploc = (void*)MM_MapHWPages(PhysicalAddress, npages);
+       char *maploc = MM_MapHWPages(PhysicalAddress, npages);
        if(!maploc) {
                LOG("Mapping %P+0x%x failed", PhysicalAddress, Length);
                return NULL;
@@ -242,15 +256,16 @@ void *AcpiOsMapMemory(ACPI_PHYSICAL_ADDRESS PhysicalAddress, ACPI_SIZE Length)
 
 void AcpiOsUnmapMemory(void *LogicalAddress, ACPI_SIZE Length)
 {
-       if( (tVAddr)LogicalAddress - KERNEL_BASE < ONEMEG )
+       if( (tVAddr)LogicalAddress - KERNEL_BASE < ONEMEG ) {
                return ;
+       }
 
        LOG("%p", LogicalAddress);
 
        Uint    ofs = (tVAddr)LogicalAddress & (PAGE_SIZE-1);
        int npages = (ofs + Length + (PAGE_SIZE-1)) / PAGE_SIZE;
        // TODO: Validate `Length` is the same as was passed to AcpiOsMapMemory
-       MM_UnmapHWPages( (tVAddr)LogicalAddress, npages);
+       MM_UnmapHWPages( LogicalAddress, npages);
 }
 
 ACPI_STATUS AcpiOsGetPhysicalAddress(void *LogicalAddress, ACPI_PHYSICAL_ADDRESS *PhysicalAddress)
@@ -339,6 +354,7 @@ ACPI_STATUS AcpiOsCreateMutex(ACPI_MUTEX *OutHandle)
 
 void AcpiOsDeleteMutex(ACPI_MUTEX Handle)
 {
+       //  TODO: Need `Mutex_Destroy`
        Mutex_Acquire(Handle);
        free(Handle);
 }
@@ -520,6 +536,8 @@ ACPI_STATUS AcpiOsReadMemory(ACPI_PHYSICAL_ADDRESS Address, UINT64 *Value, UINT3
                MM_FreeTemp(ptr);
        }
 
+       LOG("*%P = [%i]%X", Address, Width, *Value);
+
        return AE_OK;
 }
 
@@ -543,7 +561,7 @@ ACPI_STATUS AcpiOsWriteMemory(ACPI_PHYSICAL_ADDRESS Address, UINT64 Value, UINT3
                return AE_BAD_PARAMETER;
        }
 
-       if( Address >= 1024*1024 ) {
+       if( Address >= ONEMEG ) {
                MM_FreeTemp(ptr);
        }
        

UCC git Repository :: git.ucc.asn.au