#pragma once #include "src/panic.h" #include void memory_init(); void *memory_allocate(uint64_t size); void memory_free(void *pointer); static inline void memory_set(uint8_t value, uint64_t bytes, void *to) { __asm__ volatile("rep stosb" : "=D"(to), "=c"(bytes) : "D"(to), "a"(value), "c"(bytes) : "memory"); } static inline void memory_move(void *from, uint64_t bytes, void *to) { if (to == from) { return; } else if (to < from) { __asm__ volatile("rep movsb" : "=D"(to), "=S"(from), "=c"(bytes) : "D"(to), "S"(from), "c"(bytes) : "memory"); } else { ASSERT(0, "memory_move: forward overlapping move not implemented"); } } static inline void memory_copy(const void *from, uint64_t bytes, void *to) { ASSERT((uint64_t)to + bytes <= (uint64_t)from || (uint64_t)to >= (uint64_t)from + bytes, "memory_copy: overlapping backward copy"); __asm__ volatile("rep movsb" : "=D"(to), "=S"(from), "=c"(bytes) : "D"(to), "S"(from), "c"(bytes) : "memory"); }