diff --git a/arch/x86/mm/svm.c b/arch/x86/mm/svm.c index 725c2887..b685eaed 100644 --- a/arch/x86/mm/svm.c +++ b/arch/x86/mm/svm.c @@ -34,7 +34,7 @@ #include #include -#define SHARED_PAGES ((4*RCCE_SHM_SIZE_MAX) >> PAGE_SHIFT) +#define SHARED_PAGES (4*(RCCE_SHM_SIZE_MAX >> PAGE_SHIFT)) #define OWNER_SIZE ((SHARED_PAGES * sizeof(uint8_t) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)) #define AIREG1 0 @@ -157,9 +157,9 @@ int svm_init(void) return -ENOMEM; } - // per default is core 0 owner + // per default is no owner specified if (!RCCE_IAM) - memset((void*)page_owner, 0x00, OWNER_SIZE); + memset((void*)page_owner, 0xFF, OWNER_SIZE); // initialize svm barrier incregs = (volatile atomic_increg_t*) map_region(0, 0xF900E000, 2, MAP_KERNEL_SPACE|MAP_NO_CACHE); @@ -198,6 +198,12 @@ int svm_access_request(size_t addr) uint8_t payload[iRCCE_MAIL_HEADER_PAYLOAD]; int ret; + if (!phyaddr) { + kputs("Need new shared page\n"); + + while(1); + } + if (phyaddr < shmbegin) return -EINVAL; if (phyaddr >= shmbegin + RCCE_SHM_SIZE_MAX) @@ -212,7 +218,7 @@ int svm_access_request(size_t addr) ((size_t*) payload)[1] = phyaddr; /* send ping request */ - iRCCE_mail_send(2*sizeof(size_t), SVM_REQUEST, 0, payload, remote_rank); + iRCCE_mail_send(2*sizeof(size_t), SVM_REQUEST, 0, (char*) payload, remote_rank); icc_send_gic_irq(remote_rank); request[remote_rank]++; @@ -237,8 +243,9 @@ static atomic_int32_t size_counter = ATOMIC_INIT(0); void* svm_malloc(size_t size, uint32_t consistency) { - size_t phyaddr, viraddr, i; - uint32_t flags; + size_t viraddr; + //size_t phyaddr, viraddr, i; + //uint32_t flags; uint32_t map_flags = MAP_KERNEL_SPACE; if( !(consistency & SVM_L2) ) @@ -248,12 +255,12 @@ void* svm_malloc(size_t size, uint32_t consistency) map_flags |= MAP_SVM_STRONG; else if (consistency & SVM_LAZYRELEASE) map_flags |= MAP_SVM_LAZYRELEASE; - else return 0; + else return NULL; // currently, we allocate memory in page size granulation size = (size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); -#if 1 // Workaround for our MARC paper +#if 0 // Workaround for our MARC paper // iRCCE is not thread save => disable interrupts flags = irq_nested_disable(); @@ -302,7 +309,8 @@ void* svm_malloc(size_t size, uint32_t consistency) kprintf("shmmalloc returns 0x%x\n", viraddr); return (void*) viraddr; -#else +#endif +#if 0 // iRCCE is not thread save => disable interrupts flags = irq_nested_disable(); phyaddr = (size_t) RCCE_shmalloc(size); @@ -326,16 +334,28 @@ void* svm_malloc(size_t size, uint32_t consistency) return (void*) viraddr; #endif + + map_flags |= MAP_NO_ACCESS; + + viraddr = map_region(0, 0, size >> PAGE_SHIFT, map_flags); + + kprintf("svmmalloc: viraddr 0x%x, size 0x%x\n", viraddr, size); + + return (void*) viraddr; } void svm_free(void* addr, size_t size) { - size_t phyaddr, i; - uint32_t flags; + //size_t phyaddr, i; + //uint32_t flags; if (BUILTIN_EXPECT(!addr || !size, 0)) return; + // TODO: free is currently not implemented + return; + +#if 0 phyaddr = virt_to_phys((size_t) addr); // currently, we allocate memory in page size granulation @@ -351,6 +371,7 @@ void svm_free(void* addr, size_t size) flags = irq_nested_disable(); RCCE_shfree((t_vcharp) phyaddr); irq_nested_enable(flags); +#endif } /* @@ -382,7 +403,7 @@ int svm_emit_page(size_t phyaddr, int ue) ((size_t*) payload)[1] = phyaddr; /* send ping request */ - iRCCE_mail_send(2*sizeof(size_t), SVM_REQUEST, 0, payload, remote_rank); + iRCCE_mail_send(2*sizeof(size_t), SVM_REQUEST, 0, (char*)payload, remote_rank); /* send interrupt */ icc_send_gic_irq(remote_rank);