void* VMemoryManager_CRT::AlignedAlloc(size_t iSize, int iAlignment)
{
#if defined(WIN32)  || defined (_VISION_XENON) 
#if defined(VBASE_USE_CRT_DEBUG)
  return _aligned_malloc_dbg(iSize, iAlignment, 0, 0);
#else
  return _aligned_malloc(iSize, iAlignment);
#endif


#elif defined (_VISION_PS3)
  return memalign(iAlignment, iSize);


#elif defined (_VISION_POSIX) && !defined(_VISION_ANDROID)
  void* pMemPointer = NULL;
  posix_memalign(&pMemPointer, iAlignment, iSize);
  return pMemPointer;
#elif defined(_VISION_PSP2)
  return memalign(iAlignment, iSize);
#elif defined(_VISION_ANDROID)

  return memalign(iAlignment, iSize);

#elif defined(_VISION_WIIU)
  return MEMAllocFromDefaultHeapEx(iSize, iAlignment);

#else
#error Undefined platform!
#endif
}
예제 #2
0
파일: main.c 프로젝트: Maschell/wut
static OSDynLoad_Error
CustomDynLoadAlloc(int32_t size,
                   int32_t align,
                   void **outAddr)
{
   if (!outAddr) {
      return OS_DYNLOAD_INVALID_ALLOCATOR_PTR;
   }

   if (align >= 0 && align < 4) {
      align = 4;
   } else if (align < 0 && align > -4) {
      align = -4;
   }

   if (!(*outAddr = MEMAllocFromDefaultHeapEx(size, align))) {
      return OS_DYNLOAD_OUT_OF_MEMORY;
   }

   return OS_DYNLOAD_OK;
}
예제 #3
0
파일: fs.c 프로젝트: Joonie86/loadiine
/* *****************************************************************************
 * Dynamic RPL loading to memory
 * ****************************************************************************/
static int LoadRPLToMemory(s_rpx_rpl *rpl_entry)
{
    if ((int)bss_ptr != 0x0a000000)
    {
        char buffer[200];
        __os_snprintf(buffer, sizeof(buffer), "CheckAndLoadRPL(%s) found and loading", rpl_entry->name);
        log_string(bss.global_sock, buffer, BYTE_LOG_STR);
    }

    // initialize FS
    FSInit();
    FSClient *pClient = (FSClient*) MEMAllocFromDefaultHeap(sizeof(FSClient));
    if (!pClient)
        return 0;

    FSCmdBlock *pCmd = (FSCmdBlock*) MEMAllocFromDefaultHeap(sizeof(FSCmdBlock));
    if (!pCmd)
    {
        MEMFreeToDefaultHeap(pClient);
        return 0;
    }

    // calculate path length for SD access of RPL
    int path_len = strlen(CAFE_OS_SD_PATH) + strlen(SD_GAMES_PATH) + strlen(GAME_DIR_NAME) + strlen(RPX_RPL_PATH) + strlen(rpl_entry->name) + 3;
    char *path_rpl = MEMAllocFromDefaultHeap(path_len);
    if(!path_rpl) {
        MEMFreeToDefaultHeap(pCmd);
        MEMFreeToDefaultHeap(pClient);
        return 0;
    }
    // create path
    __os_snprintf(path_rpl, path_len, "%s%s/%s%s/%s", CAFE_OS_SD_PATH, SD_GAMES_PATH, GAME_DIR_NAME, RPX_RPL_PATH, rpl_entry->name);

    // malloc mem for read file
    unsigned char* dataBuf = (unsigned char*)MEMAllocFromDefaultHeapEx(0x1000, 0x40);
    if(!dataBuf) {
        MEMFreeToDefaultHeap(pCmd);
        MEMFreeToDefaultHeap(pClient);
        MEMFreeToDefaultHeap(path_rpl);
        return 0;
    }

    // do more initial FS stuff
    FSInitCmdBlock(pCmd);
    FSAddClientEx(pClient, 0, FS_RET_NO_ERROR);

    // set RPL size to 0 to avoid wrong RPL being loaded when opening file fails
    rpl_entry->size = 0;
    rpl_entry->offset = 0;

    int fd = 0;
    if (real_FSOpenFile(pClient, pCmd, path_rpl, "r", &fd, FS_RET_ALL_ERROR) == FS_STATUS_OK)
    {
        int ret;
        int rpl_size = 0;

        // Get current memory area
        s_mem_area* mem_area    = (s_mem_area*)(MEM_AREA_ARRAY);
        int mem_area_addr_start = mem_area->address;
        int mem_area_addr_end   = mem_area->address + mem_area->size;
        int mem_area_offset     = 0;

        // Copy rpl in memory
        while ((ret = FSReadFile(pClient, pCmd, dataBuf, 0x1, 0x1000, fd, 0, FS_RET_ALL_ERROR)) > 0)
        {
            // Copy in memory and save offset
            for (int j = 0; j < ret; j++)
            {
                if ((mem_area_addr_start + mem_area_offset) >= mem_area_addr_end)
                {
                    // Set next memory area
                    mem_area            = mem_area->next;
                    mem_area_addr_start = mem_area->address;
                    mem_area_addr_end   = mem_area->address + mem_area->size;
                    mem_area_offset     = 0;
                }
                *(volatile unsigned char*)(mem_area_addr_start + mem_area_offset) = dataBuf[j];
                mem_area_offset += 1;
            }
            rpl_size += ret;
        }

        // Fill rpl entry
        rpl_entry->area = (s_mem_area*)(MEM_AREA_ARRAY);
        rpl_entry->offset = 0;
        rpl_entry->size = rpl_size;

        // flush memory
        // DCFlushRange((void*)rpl_entry, sizeof(s_rpx_rpl));
        // DCFlushRange((void*)rpl_entry->address, rpl_entry->size);

        if ((int)bss_ptr != 0x0a000000)
        {
            char buffer[200];
            __os_snprintf(buffer, sizeof(buffer), "CheckAndLoadRPL(%s) file loaded 0x%08X %i", rpl_entry->name, rpl_entry->area->address, rpl_entry->size);
            log_string(bss.global_sock, buffer, BYTE_LOG_STR);
        }

        FSCloseFile(pClient, pCmd, fd, FS_RET_NO_ERROR);
    }

    FSDelClient(pClient);
    MEMFreeToDefaultHeap(dataBuf);
    MEMFreeToDefaultHeap(pCmd);
    MEMFreeToDefaultHeap(pClient);
    MEMFreeToDefaultHeap(path_rpl);
    return 1;
}