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; }
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; }