diff --git a/kernel/mem/memset.go b/kernel/mem/mem.go similarity index 65% rename from kernel/mem/memset.go rename to kernel/mem/mem.go index 6041487..74b944e 100644 --- a/kernel/mem/memset.go +++ b/kernel/mem/mem.go @@ -27,3 +27,23 @@ func Memset(addr uintptr, value byte, size Size) { copy(target[index:], target[:index]) } } + +// Memcopy copies size bytes from src to dst. +func Memcopy(src, dst uintptr, size Size) { + if size == 0 { + return + } + + srcSlice := *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{ + Len: int(size), + Cap: int(size), + Data: src, + })) + dstSlice := *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{ + Len: int(size), + Cap: int(size), + Data: dst, + })) + + copy(dstSlice, srcSlice) +} diff --git a/kernel/mem/memset_test.go b/kernel/mem/mem_test.go similarity index 53% rename from kernel/mem/memset_test.go rename to kernel/mem/mem_test.go index c4af743..eef37da 100644 --- a/kernel/mem/memset_test.go +++ b/kernel/mem/mem_test.go @@ -25,3 +25,28 @@ func TestMemset(t *testing.T) { } } } + +func TestMemcopy(t *testing.T) { + // memcopy with a 0 size should be a no-op + Memcopy(uintptr(0), uintptr(0), 0) + + var ( + src = make([]byte, PageSize) + dst = make([]byte, PageSize) + ) + for i := 0; i < len(src); i++ { + src[i] = byte(i % 256) + } + + Memcopy( + uintptr(unsafe.Pointer(&src[0])), + uintptr(unsafe.Pointer(&dst[0])), + PageSize, + ) + + for i := 0; i < len(src); i++ { + if got := dst[i]; got != src[i] { + t.Errorf("value mismatch between src and dst at index %d", i) + } + } +}