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