trying to get VGA fb mode to work..
This commit is contained in:
@@ -16,6 +16,40 @@
|
||||
"file": "/home/slinky/source/RockOS/rocklibc/src/string.c",
|
||||
"output": "/home/slinky/source/RockOS/rocklibc/src/string.o"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
"/home/slinky/opt/cross/bin/i686-elf-gcc",
|
||||
"-ffreestanding",
|
||||
"-O2",
|
||||
"-Wall",
|
||||
"-Wextra",
|
||||
"-Iinclude",
|
||||
"-c",
|
||||
"-o",
|
||||
"src/malloc.o",
|
||||
"src/malloc.c"
|
||||
],
|
||||
"directory": "/home/slinky/source/RockOS/rocklibc",
|
||||
"file": "/home/slinky/source/RockOS/rocklibc/src/malloc.c",
|
||||
"output": "/home/slinky/source/RockOS/rocklibc/src/malloc.o"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
"/home/slinky/opt/cross/bin/i686-elf-gcc",
|
||||
"-ffreestanding",
|
||||
"-O2",
|
||||
"-Wall",
|
||||
"-Wextra",
|
||||
"-Iinclude",
|
||||
"-c",
|
||||
"-o",
|
||||
"src/strcat.o",
|
||||
"src/strcat.c"
|
||||
],
|
||||
"directory": "/home/slinky/source/RockOS/rocklibc",
|
||||
"file": "/home/slinky/source/RockOS/rocklibc/src/strcat.c",
|
||||
"output": "/home/slinky/source/RockOS/rocklibc/src/strcat.o"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
"/home/slinky/opt/cross/bin/i686-elf-gcc",
|
||||
@@ -33,6 +67,23 @@
|
||||
"file": "/home/slinky/source/RockOS/rocklibc/src/syscall.c",
|
||||
"output": "/home/slinky/source/RockOS/rocklibc/src/syscall.o"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
"/home/slinky/opt/cross/bin/i686-elf-gcc",
|
||||
"-ffreestanding",
|
||||
"-O2",
|
||||
"-Wall",
|
||||
"-Wextra",
|
||||
"-Iinclude",
|
||||
"-c",
|
||||
"-o",
|
||||
"src/strtok.o",
|
||||
"src/strtok.c"
|
||||
],
|
||||
"directory": "/home/slinky/source/RockOS/rocklibc",
|
||||
"file": "/home/slinky/source/RockOS/rocklibc/src/strtok.c",
|
||||
"output": "/home/slinky/source/RockOS/rocklibc/src/strtok.o"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
"/home/slinky/opt/cross/bin/i686-elf-gcc",
|
||||
|
||||
8
rocklibc/include/stdlib.h
Normal file
8
rocklibc/include/stdlib.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef RLIBC_STDLIB_H
|
||||
#define RLIBC_STDLIB_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
void* malloc(size_t size);
|
||||
|
||||
#endif
|
||||
@@ -10,5 +10,6 @@ void *memset(void *s, int c, size_t n);
|
||||
size_t strlen(const char *s);
|
||||
int strcmp(const char *s1, const char *s2);
|
||||
char *strcpy(char *dest, const char *src);
|
||||
char* strcat(char *dest, const char* src);
|
||||
|
||||
#endif
|
||||
@@ -9,6 +9,8 @@
|
||||
#define SYS_WRITE 4
|
||||
#define SYS_OPEN 5
|
||||
#define SYS_CLOSE 6
|
||||
#define SYS_BRK 12
|
||||
#define SYS_SBRK 13
|
||||
#define SYS_PTY 20
|
||||
#define SYS_FORK 21
|
||||
#define SYS_EXEC 22
|
||||
@@ -25,7 +27,7 @@ int lseek(int fd, size_t offset, int whence);
|
||||
|
||||
void exit(int status) __attribute__((noreturn));
|
||||
|
||||
void *sbrk(intptr_t increment);
|
||||
void* sbrk(int32_t increment);
|
||||
int brk(void *addr);
|
||||
|
||||
int pty(int* slave);
|
||||
|
||||
74
rocklibc/src/malloc.c
Normal file
74
rocklibc/src/malloc.c
Normal 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
8
rocklibc/src/strcat.c
Normal 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
63
rocklibc/src/strtok.c
Normal 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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user