From 6e55a3a8747bf959c3f378b09e4001fbed938bc9 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Tue, 16 Aug 2011 16:08:04 -0700 Subject: [PATCH] add some debug messages and remove obsolete macros --- arch/x86/include/asm/page.h | 3 --- arch/x86/mm/page.c | 3 +++ arch/x86/mm/svm.c | 15 ++++++++----- arch/x86/scc/iRCCE_get.c | 3 ++- arch/x86/scc/iRCCE_put.c | 3 ++- arch/x86/scc/icc.c | 5 +++-- arch/x86/scc/scc_memcpy.h | 36 +++++-------------------------- include/metalsvm/config.h.example | 1 + kernel/tests.c | 11 +++++----- 9 files changed, 32 insertions(+), 48 deletions(-) diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h index 343362b3..5a07a76d 100644 --- a/arch/x86/include/asm/page.h +++ b/arch/x86/include/asm/page.h @@ -42,7 +42,6 @@ #define _PAGE_BIT_PAT 7 /* on 4KB pages */ #define _PAGE_BIT_GLOBAL 8 /* Global TLB entry PPro+ */ #define _PAGE_BIT_SVM 9 /* mark a virtual address range as used by the SVM system */ -#define _PAGE_BIT_PAT_LARGE 12 /* On 2MB or 1GB pages */ /// Page is present #define PG_PRESENT (1 << _PAGE_BIT_PRESENT) @@ -68,8 +67,6 @@ #define PG_PAT (1 << _PAGE_BIT_PAT) /// This virtual address range is used by SVM system as marked #define PG_SVM (1 << _PAGE_BIT_SVM) -/// Large page pattern flag -#define PG_PAT_LARGE (1 << _PAGE_BIT_PAT_LARGE) /// This is a whole set of flags (PRESENT,RW,ACCESSED,DIRTY) for kernelspace tables #define KERN_TABLE (PG_PRESENT|PG_RW|PG_ACCESSED|PG_DIRTY) diff --git a/arch/x86/mm/page.c b/arch/x86/mm/page.c index 5577e808..2cb7ff5f 100644 --- a/arch/x86/mm/page.c +++ b/arch/x86/mm/page.c @@ -626,14 +626,17 @@ static void pagefault_handler(struct state *s) index1 = viraddr >> 22; index2 = (viraddr >> 12) & 0x3FF; + kprintf("page fault: pgd 0x%p\n", pgd); if (pgd) pgt = (page_table_t*) (pgd->entries[index1] & 0xFFFFF000); + kprintf("page fault: pgt 0x%p\n", pgt); if (!pgt) goto default_handler; if (pgt->entries[index2] & PG_SVM) if (!svm_access_request(viraddr)) return; + kprintf("pgt->entries[%d] = 0x%x\n", index2, pgt->entries[index2]); default_handler: kprintf("PAGE FAULT: Task %u got page fault at %p (irq %d, cs:eip 0x%x:0x%x)\n", task->id, viraddr, s->int_no, s->cs, s->eip); diff --git a/arch/x86/mm/svm.c b/arch/x86/mm/svm.c index 0b5e0ae0..3c3f8458 100644 --- a/arch/x86/mm/svm.c +++ b/arch/x86/mm/svm.c @@ -63,7 +63,9 @@ int svm_init(void) if (BUILTIN_EXPECT(!phyaddr, 0)) return -ENOMEM; - page_owner = (uint8_t*) map_region(0, phyaddr, OWNER_SIZE >> PAGE_SHIFT, MAP_KERNEL_SPACE|MAP_NO_CACHE/*MAP_MPE*/|MAP_SVM); + kprintf("Shared memory starts at the physical address 0x%x\n", shmbegin); + + page_owner = (uint8_t*) map_region(0, phyaddr, OWNER_SIZE >> PAGE_SHIFT, MAP_SVM|MAP_KERNEL_SPACE|MAP_NO_CACHE/*MAP_MPE*/); if (BUILTIN_EXPECT(!page_owner, 0)) { flags = irq_nested_disable(); RCCE_shfree((t_vcharp) phyaddr); @@ -94,6 +96,8 @@ int svm_access_request(size_t addr) int remote_rank; uint8_t payload[iRCCE_MAIL_HEADER_PAYLOAD]; + kprintf("enter svm_access_request\n"); + if (phyaddr < shmbegin) return -EINVAL; if (phyaddr >= shmbegin + RCCE_SHM_SIZE_MAX) @@ -104,14 +108,13 @@ int svm_access_request(size_t addr) if (page_owner[pageid] == my_ue) return 0; - kprintf("send access request to %d of 0x%x\n", remote_rank, phyaddr); - remote_rank = page_owner[pageid]; ((size_t*) payload)[0] = my_ue; ((size_t*) payload)[1] = phyaddr; + kprintf("send access request to %d of 0x%x\n", remote_rank, phyaddr); /* send ping request */ - iRCCE_mail_send(sizeof(size_t), ICC_TAG_SVMREQUEST, 0, payload, remote_rank); + iRCCE_mail_send(2*sizeof(size_t), ICC_TAG_SVMREQUEST, 0, payload, remote_rank); NOP8; icc_send_irq(remote_rank); @@ -210,7 +213,7 @@ int svm_emit_page(size_t phyaddr, int ue) ((size_t*) payload)[1] = phyaddr; /* send ping request */ - iRCCE_mail_send(sizeof(size_t), ICC_TAG_SVMREQUEST, 0, payload, remote_rank); + iRCCE_mail_send(2*sizeof(size_t), ICC_TAG_SVMREQUEST, 0, payload, remote_rank); NOP8; icc_send_irq(remote_rank); @@ -219,7 +222,9 @@ int svm_emit_page(size_t phyaddr, int ue) change_page_permissions(viraddr, viraddr+PAGE_SIZE, VMA_NOACCESS|VMA_READ|VMA_CACHEABLE); + invalidate_cl1(); page_owner[pageid] = ue; + mb(); invalidate_cl1(); } diff --git a/arch/x86/scc/iRCCE_get.c b/arch/x86/scc/iRCCE_get.c index 1b2efb83..cd7a5b39 100644 --- a/arch/x86/scc/iRCCE_get.c +++ b/arch/x86/scc/iRCCE_get.c @@ -42,7 +42,8 @@ void* iRCCE_memcpy_get(void *dest, const void *src, size_t count) { #ifdef COPPERRIDGE - return memcpy_from_mpb(dest, src, count); + return memcpy_get(dest, src, count); + //return memcpy_from_mpb(dest, src, count); #else return memcpy(dest, src, count); #endif diff --git a/arch/x86/scc/iRCCE_put.c b/arch/x86/scc/iRCCE_put.c index 93cea070..a97e2ee1 100644 --- a/arch/x86/scc/iRCCE_put.c +++ b/arch/x86/scc/iRCCE_put.c @@ -42,7 +42,8 @@ void* iRCCE_memcpy_put(void *dest, const void *src, size_t count) { #ifdef COPPERRIDGE - return memcpy_to_mpb(dest, src, count); + return memcpy_put(dest, src, count); + //return memcpy_to_mpb(dest, src, count); #else return memcpy(dest, src, count); #endif diff --git a/arch/x86/scc/icc.c b/arch/x86/scc/icc.c index 2785f6d6..865e86c6 100644 --- a/arch/x86/scc/icc.c +++ b/arch/x86/scc/icc.c @@ -263,12 +263,13 @@ int icc_mail_ping( void ) void icc_mail_check(void) { iRCCE_MAIL_HEADER* header = NULL; - int res; uint64_t timer; //char* recv_buffer; // empty mailbox and interpret headers - while( (res = iRCCE_mail_recv( &header )) == iRCCE_SUCCESS ) { + while( iRCCE_mail_recv( &header ) == iRCCE_SUCCESS ) { + iRCCE_mailbox_print_header(header); + switch(header->tag) { case ICC_TAG_PINGREQUEST: diff --git a/arch/x86/scc/scc_memcpy.h b/arch/x86/scc/scc_memcpy.h index 8748a496..0386b26e 100644 --- a/arch/x86/scc/scc_memcpy.h +++ b/arch/x86/scc/scc_memcpy.h @@ -17,25 +17,10 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ -/** - * @author Stefan Lankey, Carsten Clauss - * @file arch/x86/scc/scc_memcpy.h - * @brief Special memcpy related implementations for the Intel SCC - * - * This file contains special SCC-efficient memcpy implementations - * to get memory from the RAM into the on-die memory or from the - * on-die memory into the RAM. - */ - #ifndef __SCC_MEMCPY_H_ #define __SCC_MEMPCY_H_ -#include - -#ifdef CONFIG_ROCKCREEK - -/** @brief Fast procedure to get a byte range from RAM into on-die memory. - * +/* * A write access, which cache line is not present, doesn't perform (on the * current SCC architecture) a cache line fill. Therefore, the core writes * in this case directly to the memory. @@ -43,14 +28,10 @@ * The following function copies from the on-die memory (MPB) to the off-die * memory and prefetchs its destintation. Therefore, the function avoids the * bad behavior of a "write miss". - * - * @param dest Destination address - * @param src Source address - * @param count Range size in bytes */ inline static void *memcpy_get(void *dest, const void *src, size_t count) { - int32_t h, i, j, k, l, m; + int h, i, j, k, l, m; asm volatile ("cld;\n\t" "1: cmpl $0, %%eax ; je 2f\n\t" @@ -90,20 +71,15 @@ inline static void *memcpy_get(void *dest, const void *src, size_t count) * In our kernel, we didn't want to use FPU registers. * Therefore, we use standard memcpy routine */ -#define memcpy_put memcpy +#define memcpy_put memcpy #else -/** @brief Fast procedure to get a byte range from on-die memory into RAM. - * +/* * If the destination is located on on-die memory (MPB), classical prefetching * techniques will be used to increase the performance. - * - * @param dest Destination address - * @param src Source address - * @param count range size in bytes */ inline static void *memcpy_put(void *dest, const void *src, size_t count) { - int32_t i, j, k, l; + int i, j, k, l; /* * We use the floating point registers to @@ -175,5 +151,3 @@ inline static void *memcpy_put(void *dest, const void *src, size_t count) #endif #endif - -#endif diff --git a/include/metalsvm/config.h.example b/include/metalsvm/config.h.example index bd4c0b73..90f8b7c8 100644 --- a/include/metalsvm/config.h.example +++ b/include/metalsvm/config.h.example @@ -60,6 +60,7 @@ extern "C" { // RCCE specific flags #define SCC +#define COPPERRIDGE #define MS_BAREMETAL //#define GORY #define SHMADD diff --git a/kernel/tests.c b/kernel/tests.c index bce1c56f..e5e1a8fe 100644 --- a/kernel/tests.c +++ b/kernel/tests.c @@ -161,15 +161,14 @@ static int svm_test(void *arg) invalidate_cl1(); // Now, we need only read access on A and B - change_page_permissions((size_t) A[0], (size_t) (A[0]+2*N*N), VMA_CACHEABLE|VMA_READ); + //change_page_permissions((size_t) A[0], (size_t) (A[0]+2*N*N), VMA_CACHEABLE|VMA_READ); // iRCCE is not thread save => disable interrupts flags = irq_nested_disable(); RCCE_barrier(&RCCE_COMM_WORLD); irq_nested_enable(flags); - if (!my_ue) - kprintf("Start calculation...\n"); + kputs("Start calculation...\n"); // start calculation for(i=my_ue*(N/num_ues); i<(my_ue+1)*(N/num_ues); i++) @@ -182,6 +181,8 @@ static int svm_test(void *arg) RCCE_barrier(&RCCE_COMM_WORLD); irq_nested_enable(flags); + kputs("Calculation finished...\n"); + svmfree((void*) A[0], 3*N*sizeof(int)); return 0; @@ -352,8 +353,8 @@ int test_init(void) //create_kernel_task(NULL, join_test, NULL); //create_kernel_task(NULL, producer, NULL); //create_kernel_task(NULL, consumer, NULL); - //create_kernel_task(NULL, mail_ping, NULL); - create_kernel_task(NULL, svm_test, NULL); + create_kernel_task(NULL, mail_ping, NULL); + //create_kernel_task(NULL, svm_test, NULL); //create_user_task(NULL, "/bin/hello", argv); //create_user_task(NULL, "/bin/tests", argv); //create_user_task(NULL, "/bin/jacobi", argv);