You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
30 lines
991 B
30 lines
991 B
#pragma once
|
|
|
|
#include "src/panic.h"
|
|
#include <stdint.h>
|
|
|
|
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");
|
|
}
|
|
|