From 5661ee64e118095d37913d6e562022434c61d76f Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Wed, 17 Aug 2011 14:55:33 +0200 Subject: [PATCH 1/2] remove compiler warnings --- include/metalsvm/tasks_types.h | 2 -- kernel/tasks.c | 4 ---- 2 files changed, 6 deletions(-) diff --git a/include/metalsvm/tasks_types.h b/include/metalsvm/tasks_types.h index 3379fccb..a3d0bd3a 100644 --- a/include/metalsvm/tasks_types.h +++ b/include/metalsvm/tasks_types.h @@ -85,10 +85,8 @@ typedef struct task { uint32_t start_heap; /// End address of the heap uint32_t end_heap; -#ifdef CONFIG_LWIP /// LwIP error code int lwip_err; -#endif /// Mail inbox mailbox_wait_msg_t inbox; /// Mail outbox array diff --git a/kernel/tasks.c b/kernel/tasks.c index 413ce994..2dec1348 100644 --- a/kernel/tasks.c +++ b/kernel/tasks.c @@ -243,9 +243,7 @@ static int create_task(tid_t* id, internal_entry_point_t ep, void* arg) task_table[i].start_heap = 0; task_table[i].end_heap = 0; -#ifdef CONFIG_LWIP task_table[i].lwip_err = 0; -#endif task_table[i].start_tick = get_clock_tick(); break; } @@ -311,9 +309,7 @@ int sys_fork(void) task_table[i].start_tick = get_clock_tick(); task_table[i].start_heap = 0; task_table[i].end_heap = 0; -#ifdef CONFIG_LWIP task_table[i].lwip_err = 0; -#endif ret = arch_fork(task_table+i); From e9aa86ed519e9c6431b4a9a788576d2e277c914b Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Thu, 18 Aug 2011 05:38:23 -0700 Subject: [PATCH 2/2] fix bug in the MPB-specific memcpy functions => solves a problem in Simon's mailbox system --- arch/x86/scc/iRCCE_get.c | 4 ++-- arch/x86/scc/iRCCE_put.c | 4 ++-- arch/x86/scc/scc_memcpy.h | 18 +++++++++++++++++- include/metalsvm/config.h.example | 1 + 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/arch/x86/scc/iRCCE_get.c b/arch/x86/scc/iRCCE_get.c index 1b2efb83..7916c268 100644 --- a/arch/x86/scc/iRCCE_get.c +++ b/arch/x86/scc/iRCCE_get.c @@ -41,8 +41,8 @@ void* iRCCE_memcpy_get(void *dest, const void *src, size_t count) { -#ifdef COPPERRIDGE - return memcpy_from_mpb(dest, src, count); +#if defined(COPPERRIDGE) || defined(SCC) + return memcpy_get(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..e810057a 100644 --- a/arch/x86/scc/iRCCE_put.c +++ b/arch/x86/scc/iRCCE_put.c @@ -41,8 +41,8 @@ void* iRCCE_memcpy_put(void *dest, const void *src, size_t count) { -#ifdef COPPERRIDGE - return memcpy_to_mpb(dest, src, count); +#if defined(COPPERRIDGE) || defined(SCC) + return memcpy_put(dest, src, count); #else return memcpy(dest, src, count); #endif diff --git a/arch/x86/scc/scc_memcpy.h b/arch/x86/scc/scc_memcpy.h index 8748a496..00662c41 100644 --- a/arch/x86/scc/scc_memcpy.h +++ b/arch/x86/scc/scc_memcpy.h @@ -90,7 +90,23 @@ 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 +inline static void *memcpy_put(void* dest, const void *src, size_t count) +{ + int32_t i, j, k; + + if (BUILTIN_EXPECT(!dest || !src, 0)) + return dest; + + asm volatile ( + "cld; rep movsl\n\t" + "movl %4, %%ecx\n\t" + "andl $3, %%ecx\n\t" + "rep movsb\n\t" + : "=&c"(i), "=&D"(j), "=&S"(k) + : "0"(count/4), "g"(count), "1"(dest), "2"(src) : "memory"); + + return dest; +} #else /** @brief Fast procedure to get a byte range from on-die memory into RAM. * 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