trying to get VGA fb mode to work..

This commit is contained in:
2026-07-14 00:07:50 -05:00
parent 5c7febbbf0
commit 454de8feed
17 changed files with 567 additions and 300 deletions

74
rocklibc/src/malloc.c Normal file
View File

@@ -0,0 +1,74 @@
#include <stdlib.h>
#include <syscall.h>
#define ALIGN(size) (((size) + 3) & ~3)
#define HEADER_SIZE sizeof(struct Header)
struct Header {
size_t size;
int is_free;
struct Header* next;
};
static struct Header* free_list_head = NULL;
static struct Header* find_free_block(struct Header** last, size_t size) {
struct Header* current = free_list_head;
while (current && !(current->is_free && current->size >= size)) {
*last = current;
current = current->next;
}
return current;
}
static struct Header* request_space(struct Header* last, size_t size) {
struct Header* block = sbrk(0);
void* request = sbrk(size + HEADER_SIZE);
if (request == (void*)-1) {
return NULL;
}
if (last) {
last->next = block;
}
block->size = size;
block->next = NULL;
block->is_free = 0;
return block;
}
void* malloc(size_t size) {
if (size <= 0) {
return NULL;
}
size = ALIGN(size);
if (free_list_head == NULL) {
struct Header* block = request_space(NULL, size);
if (!block) return NULL;
free_list_head = block;
return (void*)(block + 1);
}
struct Header* last = free_list_head;
struct Header* block = find_free_block(&last, size);
if (block) {
block->is_free = 0;
} else {
block = request_space(last, size);
if (!block) return NULL;
}
return (void*)(block + 1);
}
void free(void* ptr) {
if (!ptr) return;
struct Header* block = (struct Header*)ptr - 1;
block->is_free = 1;
}

8
rocklibc/src/strcat.c Normal file
View File

@@ -0,0 +1,8 @@
#include <string.h>
#include <stdint.h>
char* strcat(char* dest, const char* src) {
char* start = dest + strlen(dest);
strcpy(start, src);
return dest;
}

63
rocklibc/src/strtok.c Normal file
View File

@@ -0,0 +1,63 @@
#include <string.h>
static size_t kernel_strspn(const char *s, const char *accept) {
const char *p;
const char *a;
size_t count = 0;
for (p = s; *p != '\0'; ++p) {
for (a = accept; *a != '\0'; ++a) {
if (*p == *a)
break;
}
if (*a == '\0')
return count;
++count;
}
return count;
}
static char *kernel_strpbrk(const char *s, const char *accept) {
while (*s != '\0') {
const char *a = accept;
while (*a != '\0') {
if (*s == *a) {
return (char *)s;
}
a++;
}
s++;
}
return NULL;
}
char *strtok_r(char *str, const char *delim, char **saveptr) {
char *token;
if (str == NULL) {
str = *saveptr;
}
if (str == NULL || *str == '\0') {
*saveptr = NULL;
return NULL;
}
str += kernel_strspn(str, delim);
if (*str == '\0') {
*saveptr = NULL;
return NULL;
}
token = str;
str = kernel_strpbrk(token, delim);
if (str == NULL) {
*saveptr = NULL;
} else {
*str = '\0';
*saveptr = str + 1;
}
return token;
}

View File

@@ -65,4 +65,12 @@ int dup2(int src, int dst) {
int waitpid(int pid, int* status) {
return syscall3(SYS_WAIT, pid, (uint32_t)status, 0);
}
void* sbrk(int32_t increment) {
return (void*)syscall1(SYS_SBRK, increment);
}
int brk(void *addr) {
return syscall1(SYS_BRK, (uint32_t)addr);
}