mirror of
https://github.com/tailix/libkernaux.git
synced 2026-07-11 04:06:18 -04:00
Main: include/kernaux/memmap.h: Improve
This commit is contained in:
parent
71c2ea8883
commit
0536bc47d5
2 changed files with 26 additions and 28 deletions
|
|
@ -13,17 +13,17 @@ extern "C" {
|
|||
#define KERNAUX_MEMMAP_ENTRY_TAG_SLEN_MAX 24
|
||||
#define KERNAUX_MEMMAP_ENTRY_TAG_SIZE_MAX (KERNAUX_MEMMAP_ENTRY_TAG_SLEN_MAX + 1)
|
||||
|
||||
typedef struct KernAux_MemMap_Entry {
|
||||
typedef const struct KernAux_MemMap_Entry {
|
||||
bool is_available;
|
||||
char tag[KERNAUX_MEMMAP_ENTRY_TAG_SIZE_MAX];
|
||||
size_t start, size, end, limit;
|
||||
} KernAux_MemMap_Entry[1];
|
||||
} *KernAux_MemMap_Entry;
|
||||
|
||||
typedef struct KernAux_MemMap {
|
||||
bool is_finished;
|
||||
size_t memory_size;
|
||||
size_t entries_count;
|
||||
KernAux_MemMap_Entry entries[KERNAUX_MEMMAP_ENTRIES_MAX];
|
||||
struct KernAux_MemMap_Entry entries[KERNAUX_MEMMAP_ENTRIES_MAX];
|
||||
} KernAux_MemMap[1];
|
||||
|
||||
void KernAux_MemMap_init(KernAux_MemMap memmap, size_t memory_size);
|
||||
|
|
@ -41,11 +41,11 @@ bool KernAux_MemMap_add_entry(
|
|||
bool KernAux_MemMap_finish(KernAux_MemMap memmap);
|
||||
|
||||
/// @warning Must only be called with finished memmap, otherwise panics.
|
||||
const struct KernAux_MemMap_Entry*
|
||||
KernAux_MemMap_Entry
|
||||
KernAux_MemMap_entry_by_index(KernAux_MemMap memmap, size_t index);
|
||||
|
||||
/// @warning Must only be called with finished memmap, otherwise panics.
|
||||
const struct KernAux_MemMap_Entry*
|
||||
KernAux_MemMap_Entry
|
||||
KernAux_MemMap_entry_by_start(KernAux_MemMap memmap, size_t start);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
|||
44
src/memmap.c
44
src/memmap.c
|
|
@ -35,18 +35,18 @@ bool KernAux_MemMap_add_entry(
|
|||
if (MEMMAP.entries_count >= KERNAUX_MEMMAP_ENTRIES_MAX) return false;
|
||||
if (SIZE_MAX - start < size) return false;
|
||||
|
||||
memset(MEMMAP.entries[MEMMAP.entries_count], 0, sizeof(MEMMAP.entries[MEMMAP.entries_count]));
|
||||
memset(&MEMMAP.entries[MEMMAP.entries_count], 0, sizeof(MEMMAP.entries[MEMMAP.entries_count]));
|
||||
const size_t index = MEMMAP.entries_count++;
|
||||
|
||||
MEMMAP.entries[index]->is_available = is_available;
|
||||
MEMMAP.entries[index].is_available = is_available;
|
||||
if (tag) {
|
||||
memset (MEMMAP.entries[index]->tag, 0, KERNAUX_MEMMAP_ENTRY_TAG_SIZE_MAX);
|
||||
strncpy(MEMMAP.entries[index]->tag, tag, KERNAUX_MEMMAP_ENTRY_TAG_SLEN_MAX);
|
||||
memset (MEMMAP.entries[index].tag, 0, KERNAUX_MEMMAP_ENTRY_TAG_SIZE_MAX);
|
||||
strncpy(MEMMAP.entries[index].tag, tag, KERNAUX_MEMMAP_ENTRY_TAG_SLEN_MAX);
|
||||
}
|
||||
MEMMAP.entries[index]->start = start;
|
||||
MEMMAP.entries[index]->size = size;
|
||||
MEMMAP.entries[index]->end = start + size - 1;
|
||||
MEMMAP.entries[index]->limit = start + size;
|
||||
MEMMAP.entries[index].start = start;
|
||||
MEMMAP.entries[index].size = size;
|
||||
MEMMAP.entries[index].end = start + size - 1;
|
||||
MEMMAP.entries[index].limit = start + size;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -60,22 +60,22 @@ bool KernAux_MemMap_finish(KernAux_MemMap memmap)
|
|||
|
||||
if ((MEMMAP.entries_count == 0 && MEMMAP.memory_size != 0) ||
|
||||
MEMMAP.entries_count > KERNAUX_MEMMAP_ENTRIES_MAX ||
|
||||
MEMMAP.entries[0]->start != 0 ||
|
||||
MEMMAP.entries[MEMMAP.entries_count - 1]->limit != MEMMAP.memory_size)
|
||||
MEMMAP.entries[0].start != 0 ||
|
||||
MEMMAP.entries[MEMMAP.entries_count - 1].limit != MEMMAP.memory_size)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// At first, let's validate the individual entries.
|
||||
for (size_t index = 0; index < MEMMAP.entries_count; ++index) {
|
||||
if (SIZE_MAX - MEMMAP.entries[index]->start <
|
||||
MEMMAP.entries[index]->size
|
||||
if (SIZE_MAX - MEMMAP.entries[index].start <
|
||||
MEMMAP.entries[index].size
|
||||
||
|
||||
MEMMAP.entries[index]->end !=
|
||||
MEMMAP.entries[index]->start + MEMMAP.entries[index]->size - 1
|
||||
MEMMAP.entries[index].end !=
|
||||
MEMMAP.entries[index].start + MEMMAP.entries[index].size - 1
|
||||
||
|
||||
MEMMAP.entries[index]->limit !=
|
||||
MEMMAP.entries[index]->start + MEMMAP.entries[index]->size)
|
||||
MEMMAP.entries[index].limit !=
|
||||
MEMMAP.entries[index].start + MEMMAP.entries[index].size)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
@ -85,7 +85,7 @@ bool KernAux_MemMap_finish(KernAux_MemMap memmap)
|
|||
|
||||
// Finally, let's validate that the entries fit each other properly.
|
||||
for (size_t index = 1; index < MEMMAP.entries_count; ++index) {
|
||||
if (MEMMAP.entries[index - 1]->limit != MEMMAP.entries[index]->start) {
|
||||
if (MEMMAP.entries[index - 1].limit != MEMMAP.entries[index].start) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -93,7 +93,7 @@ bool KernAux_MemMap_finish(KernAux_MemMap memmap)
|
|||
return MEMMAP.is_finished = true;
|
||||
}
|
||||
|
||||
const struct KernAux_MemMap_Entry*
|
||||
KernAux_MemMap_Entry
|
||||
KernAux_MemMap_entry_by_index(KernAux_MemMap memmap, const size_t index)
|
||||
{
|
||||
if (!MEMMAP.is_finished) {
|
||||
|
|
@ -102,10 +102,10 @@ KernAux_MemMap_entry_by_index(KernAux_MemMap memmap, const size_t index)
|
|||
}
|
||||
|
||||
if (index >= MEMMAP.entries_count) return NULL;
|
||||
return MEMMAP.entries[index];
|
||||
return &MEMMAP.entries[index];
|
||||
}
|
||||
|
||||
const struct KernAux_MemMap_Entry*
|
||||
KernAux_MemMap_Entry
|
||||
KernAux_MemMap_entry_by_start(KernAux_MemMap memmap, const size_t start)
|
||||
{
|
||||
if (!MEMMAP.is_finished) {
|
||||
|
|
@ -114,9 +114,7 @@ KernAux_MemMap_entry_by_start(KernAux_MemMap memmap, const size_t start)
|
|||
}
|
||||
|
||||
for (size_t index = 0; index < MEMMAP.entries_count; ++index) {
|
||||
if (MEMMAP.entries[index]->start == start) {
|
||||
return MEMMAP.entries[index];
|
||||
}
|
||||
if (MEMMAP.entries[index].start == start) return &MEMMAP.entries[index];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue