コード例 #1
0
ファイル: run.c プロジェクト: joeldevahl/evil-scheme
int main(int argc, char** argv)
{
    int ret = -1;
    mmap_t handle;
    char* data;
    func_t func;

    handle = mmap_create(argv[1]);
    data = mmap_get_pointer(handle);

    func = (func_t)(data+1);
    ret = func();

    mmap_destroy(handle);

    printf("Image exited with retcode %d\n", ret);

    return ret;
}
コード例 #2
0
ファイル: embx_os21.c プロジェクト: MarkusVolk/martii-tdt
EMBX_VOID *EMBX_OS_PhysMemMap(EMBX_UINT pMem, int size, int cached)
{
    EMBX_VOID *vaddr = NULL;

    EMBX_Info(EMBX_INFO_OS, (">>>>PhysMemMap(0x%08x, %d)\n", (unsigned int) pMem, size));

    /* Test the weak symbol for being non NULL, if true we are linked against a vmem capable OS21 */
    if (vmem_create)
    {
      unsigned mode;

      mode = VMEM_CREATE_READ|VMEM_CREATE_WRITE;

      if (cached)
	  mode |= VMEM_CREATE_CACHED;
      else
	  mode |= VMEM_CREATE_UNCACHED | VMEM_CREATE_NO_WRITE_BUFFER;
      
      vaddr = vmem_create((EMBX_VOID *)pMem, size, NULL, mode);

    }
    else
    {
#if defined __ST231__
	  /* This assumes that pMem is a true physical address */
	  vaddr = mmap_translate_virtual((EMBX_VOID *)pMem);
	  vaddr = (cached ? mmap_translate_cached(vaddr) : mmap_translate_uncached(vaddr));
	  
	  if (!vaddr)
	  {
	      /* Failed to find a current translation, so create our own */

	      EMBX_UINT page_size = 0x10000000; /* Map 256MB pages unconditionally */
	      EMBX_UINT pMem_base = pMem & ~(page_size-1);
	      EMBX_UINT pMem_size = (size + (page_size-1)) & ~(page_size-1);

	      vaddr = mmap_create((void *)pMem_base, 
				  pMem_size,
				  mmap_protect_rwx, 
				  (cached ? mmap_cached : mmap_uncached),
				  page_size);
	      
	      /* Adjust the returned vaddr accordingly */
	      if (vaddr)
		  vaddr = (void *) ((EMBX_UINT) vaddr + (pMem - pMem_base));
	  }

#elif defined __sh__

      if (cached)
	  vaddr = ST40_P1_ADDR(pMem);
      else
	  vaddr = ST40_P2_ADDR(pMem);

#endif /* defined __ST231__ */
      
      if (NULL == vaddr) {
	  EMBX_DebugMessage(("PhysMemMap: pMem %p size %d cached %d failed\n", pMem, size, cached));
      }
    }

    EMBX_Info(EMBX_INFO_OS, ("PhysMemMap: *vMem = %p\n", vaddr));
    
    EMBX_Info(EMBX_INFO_OS, ("<<<<PhysMemMap\n"));
    
    return vaddr;
}