summaryrefslogtreecommitdiff
path: root/lib/libc/internal/include/malloc.h
diff options
context:
space:
mode:
authorKacper <kacper@mail.openlinux.dev>2025-12-16 17:02:05 +0100
committerKacper <kacper@mail.openlinux.dev>2025-12-16 17:02:05 +0100
commit90dad97fc07f049383903a166631e2c257f9b8c1 (patch)
tree096cd247ecfda9e46598215a4f32aecedeedda90 /lib/libc/internal/include/malloc.h
parent0e832a9329cc4d4647e1ce529846073f21e66991 (diff)
Add support for TLS in the libc
Diffstat (limited to 'lib/libc/internal/include/malloc.h')
-rw-r--r--lib/libc/internal/include/malloc.h98
1 files changed, 98 insertions, 0 deletions
diff --git a/lib/libc/internal/include/malloc.h b/lib/libc/internal/include/malloc.h
new file mode 100644
index 00000000..b7cb0093
--- /dev/null
+++ b/lib/libc/internal/include/malloc.h
@@ -0,0 +1,98 @@
+#ifndef __LIBC_MALLOC_H
+#define __LIBC_MALLOC_H
+
+#include <stdatomic.h>
+#include <stdint.h>
+
+struct class {
+ uint32_t size;
+ uint32_t count;
+};
+
+struct page {
+ volatile atomic_flag lock;
+
+ enum {
+ PAGE_SMALL = 0x0,
+ PAGE_MEDIUM = 0x1,
+ PAGE_LARGE = 0x2,
+ } flags;
+
+ struct {
+ uint32_t size;
+ uint32_t used;
+ uint32_t count;
+ } block;
+
+ uint8_t *bitmap;
+ uint8_t *heap;
+
+ struct page *next;
+ struct page *prev;
+};
+
+extern struct page *__malloc_pvec;
+
+#define SMALL_PAGE_SIZE_SHIFT 16
+#define SMALL_PAGE_SIZE (1 << SMALL_PAGE_SIZE_SHIFT)
+#define SMALL_PAGE_MASK (~((uintptr_t)SMALL_PAGE_SIZE - 1))
+
+#define MEDIUM_PAGE_SIZE_SHIFT 22
+#define MEDIUM_PAGE_SIZE (1 << MEDIUM_PAGE_SIZE_SHIFT)
+#define MEDIUM_PAGE_MASK (~((uintptr_t)MEDIUM_PAGE_SIZE - 1))
+
+#define LARGE_PAGE_SIZE_SHIFT 26
+#define LARGE_PAGE_SIZE (1 << LARGE_PAGE_SIZE_SHIFT)
+#define LARGE_PAGE_MASK (~((uintptr_t)LARGE_PAGE_SIZE - 1))
+
+#define SMALL_CLASS(n) \
+ { (((n)) * 16), (SMALL_PAGE_SIZE - sizeof(struct page)) / (((n)) * 16) }
+#define MEDIUM_CLASS(n) \
+ { (((n)) * 16), \
+ (MEDIUM_PAGE_SIZE - sizeof(struct page)) / (((n)) * 16) }
+#define LARGE_CLASS(n) \
+ { (((n)) * 16), (LARGE_PAGE_SIZE - sizeof(struct page)) / (((n)) * 16) }
+
+static const struct class global_size_class[] = {
+ SMALL_CLASS(1), SMALL_CLASS(1), SMALL_CLASS(2),
+ SMALL_CLASS(3), SMALL_CLASS(4), SMALL_CLASS(5),
+ SMALL_CLASS(6), SMALL_CLASS(7), SMALL_CLASS(8),
+ SMALL_CLASS(9), SMALL_CLASS(10), SMALL_CLASS(11),
+ SMALL_CLASS(12), SMALL_CLASS(13), SMALL_CLASS(14),
+ SMALL_CLASS(15), SMALL_CLASS(16), SMALL_CLASS(17),
+ SMALL_CLASS(18), SMALL_CLASS(19), SMALL_CLASS(20),
+ SMALL_CLASS(21), SMALL_CLASS(22), SMALL_CLASS(23),
+ SMALL_CLASS(24), SMALL_CLASS(25), SMALL_CLASS(26),
+ SMALL_CLASS(27), SMALL_CLASS(28), SMALL_CLASS(29),
+ SMALL_CLASS(30), SMALL_CLASS(31), SMALL_CLASS(32),
+ SMALL_CLASS(33), SMALL_CLASS(34), SMALL_CLASS(35),
+ SMALL_CLASS(36), SMALL_CLASS(37), SMALL_CLASS(38),
+ SMALL_CLASS(39), SMALL_CLASS(40), SMALL_CLASS(41),
+ SMALL_CLASS(42), SMALL_CLASS(43), SMALL_CLASS(44),
+ SMALL_CLASS(45), SMALL_CLASS(46), SMALL_CLASS(47),
+ SMALL_CLASS(48), SMALL_CLASS(49), SMALL_CLASS(50),
+ SMALL_CLASS(51), SMALL_CLASS(52), SMALL_CLASS(53),
+ SMALL_CLASS(54), SMALL_CLASS(55), SMALL_CLASS(56),
+ SMALL_CLASS(57), SMALL_CLASS(58), SMALL_CLASS(59),
+ SMALL_CLASS(60), SMALL_CLASS(61), SMALL_CLASS(62),
+ SMALL_CLASS(63), SMALL_CLASS(64), SMALL_CLASS(80),
+ SMALL_CLASS(96), SMALL_CLASS(112), SMALL_CLASS(128),
+ SMALL_CLASS(160), SMALL_CLASS(192), SMALL_CLASS(224),
+ SMALL_CLASS(256), MEDIUM_CLASS(320), MEDIUM_CLASS(384),
+ MEDIUM_CLASS(448), MEDIUM_CLASS(512), MEDIUM_CLASS(640),
+ MEDIUM_CLASS(768), MEDIUM_CLASS(896), MEDIUM_CLASS(1024),
+ MEDIUM_CLASS(1280), MEDIUM_CLASS(1536), MEDIUM_CLASS(1792),
+ MEDIUM_CLASS(2048), MEDIUM_CLASS(2560), MEDIUM_CLASS(3072),
+ MEDIUM_CLASS(3584), MEDIUM_CLASS(4096), MEDIUM_CLASS(5120),
+ MEDIUM_CLASS(6144), MEDIUM_CLASS(7168), MEDIUM_CLASS(8192),
+ MEDIUM_CLASS(10240), MEDIUM_CLASS(12288), MEDIUM_CLASS(14336),
+ MEDIUM_CLASS(16384), LARGE_CLASS(20480), LARGE_CLASS(24576),
+ LARGE_CLASS(28672), LARGE_CLASS(32768), LARGE_CLASS(40960),
+ LARGE_CLASS(49152), LARGE_CLASS(57344), LARGE_CLASS(65536),
+ LARGE_CLASS(81920), LARGE_CLASS(98304), LARGE_CLASS(114688),
+ LARGE_CLASS(131072), LARGE_CLASS(163840), LARGE_CLASS(196608),
+ LARGE_CLASS(229376), LARGE_CLASS(262144), LARGE_CLASS(327680),
+ LARGE_CLASS(393216), LARGE_CLASS(458752), LARGE_CLASS(524288)
+};
+
+#endif