PMM and liballoc port
This commit is contained in:
8
kernel/libk/align.h
Normal file
8
kernel/libk/align.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef _KERNEL_LIBK_ALIGN_H
|
||||
#define _KERNEL_LIBK_ALIGN_H
|
||||
|
||||
#define div_align_up(x, div) (((x) + (div) - 1) / (div))
|
||||
#define align_down(x, a) ((x) & ~((a) - 1))
|
||||
#define align_up(x, a) (((x) + ((a) - 1)) & ~((a) - 1))
|
||||
|
||||
#endif // _KERNEL_LIBK_ALIGN_H
|
||||
91
kernel/libk/bm.c
Normal file
91
kernel/libk/bm.c
Normal file
@@ -0,0 +1,91 @@
|
||||
#include <libk/std.h>
|
||||
#include <libk/bm.h>
|
||||
#include <libk/string.h>
|
||||
|
||||
void bm_init(struct bm *bm, uint8_t *base, size_t nbits) {
|
||||
bm->base = base;
|
||||
bm->nbits = nbits;
|
||||
memset(bm->base, 0, (nbits + 7) / 8);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set a bit in a bitmap.
|
||||
*/
|
||||
void bm_set(struct bm *bm, size_t k) {
|
||||
if (k >= bm->nbits)
|
||||
return;
|
||||
|
||||
uint8_t *b = (uint8_t *)((uintptr_t)bm->base + (k / 8));
|
||||
*b = ((*b) | (1 << (k % 8)));
|
||||
}
|
||||
|
||||
/*
|
||||
* Clear a bit in a bitmap.
|
||||
*/
|
||||
void bm_clear(struct bm *bm, size_t k) {
|
||||
if (k >= bm->nbits)
|
||||
return;
|
||||
|
||||
uint8_t *b = (uint8_t *)((uintptr_t)bm->base + (k / 8));
|
||||
*b = ((*b) & ~(1 << (k % 8)));
|
||||
}
|
||||
|
||||
/*
|
||||
* Test (true/false) a bit in a bitmap.
|
||||
*/
|
||||
bool bm_test(struct bm *bm, size_t k) {
|
||||
if (k >= bm->nbits)
|
||||
return false;
|
||||
|
||||
uint8_t *b = (uint8_t *)((uintptr_t)bm->base + (k / 8));
|
||||
return (*b) & (1 << (k % 8));
|
||||
}
|
||||
|
||||
/*
|
||||
* Set a range of bits in a bitmap. if starting bit is out of range, we fail.
|
||||
*/
|
||||
bool bm_set_region(struct bm *bm, size_t k, size_t m) {
|
||||
if ((k >= m) || (k >= bm->nbits) || (k + m >= bm->nbits))
|
||||
return false;
|
||||
|
||||
for (size_t i = k; i < m; i++) {
|
||||
bool taken = bm_test(bm, i);
|
||||
if (taken)
|
||||
return false;
|
||||
}
|
||||
|
||||
for (size_t i = k; i < m; i++)
|
||||
bm_set(bm, i);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Clear a range of bits in a bitmap. starting bit must be in range.
|
||||
*/
|
||||
void bm_clear_region(struct bm *bm, size_t k, size_t m) {
|
||||
if ((k >= m) || (k >= bm->nbits) || (k + m >= bm->nbits))
|
||||
return;
|
||||
|
||||
for (size_t i = k; i < m; i++)
|
||||
bm_clear(bm, i);
|
||||
}
|
||||
|
||||
/*
|
||||
* Test a range if bits in a bitmap. Return true if at least one bit
|
||||
* is set, else return false (all bits clear). For convenience, if k or m
|
||||
* are out of range, act as if the bits are set / bitmap is full - this is
|
||||
* useful for implementing the physical memory manager algorithm.
|
||||
*/
|
||||
bool bm_test_region(struct bm *bm, size_t k, size_t m) {
|
||||
if ((k >= m) || (k >= bm->nbits) || (k + m >= bm->nbits))
|
||||
return true;
|
||||
|
||||
for (size_t i = k; i < m; i++) {
|
||||
bool test = bm_test(bm, i);
|
||||
if (test)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
19
kernel/libk/bm.h
Normal file
19
kernel/libk/bm.h
Normal file
@@ -0,0 +1,19 @@
|
||||
#ifndef _KERNEL_LIBK_BM_H
|
||||
#define _KERNEL_LIBK_BM_H
|
||||
|
||||
#include <libk/std.h>
|
||||
|
||||
struct bm {
|
||||
uint8_t *base;
|
||||
size_t nbits;
|
||||
};
|
||||
|
||||
void bm_init(struct bm *bm, uint8_t *base, size_t nbits);
|
||||
void bm_set(struct bm *bm, size_t k);
|
||||
bool bm_set_region(struct bm *bm, size_t k, size_t m);
|
||||
void bm_clear(struct bm *bm, size_t k);
|
||||
void bm_clear_region(struct bm *bm, size_t k, size_t m);
|
||||
bool bm_test(struct bm *bm, size_t k);
|
||||
bool bm_test_region(struct bm *bm, size_t k, size_t m);
|
||||
|
||||
#endif // _KERNEL_LIBK_BM_H
|
||||
@@ -1,7 +1,9 @@
|
||||
c += libk/string.c \
|
||||
libk/printf.c \
|
||||
libk/putchar_.c
|
||||
libk/putchar_.c \
|
||||
libk/bm.c
|
||||
|
||||
o += libk/string.o \
|
||||
libk/printf.o \
|
||||
libk/putchar_.o
|
||||
libk/putchar_.o \
|
||||
libk/bm.o
|
||||
|
||||
@@ -8,5 +8,6 @@
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdnoreturn.h>
|
||||
#include <stdatomic.h>
|
||||
|
||||
#endif // _KERNEL_LIBK_STD_H
|
||||
|
||||
Reference in New Issue
Block a user