aboutsummaryrefslogtreecommitdiff
path: root/src/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/gdt.c12
-rw-r--r--src/kernel/gen_gdt.c18
-rw-r--r--src/kernel/kernel.c8
-rw-r--r--src/kernel/print.c168
4 files changed, 101 insertions, 105 deletions
diff --git a/src/kernel/gdt.c b/src/kernel/gdt.c
index cf0f487..96ddf67 100644
--- a/src/kernel/gdt.c
+++ b/src/kernel/gdt.c
@@ -1,18 +1,6 @@
#include "gdt.h"
#include <stdint.h>
-uint8_t make_access(uint8_t DPL, uint8_t type, uint8_t exec, uint8_t direction,
- uint8_t read_write) {
- uint8_t access = 0;
- access |= (1 << 7);
- access |= (DPL << 5);
- access |= (type << 4);
- access |= (exec << 3);
- access |= (direction << 2);
- access |= (read_write << 1); // 10
- return access;
-}
-
uint16_t make_code(uint8_t priv, uint8_t dc, uint8_t rw) {
uint16_t access = 0;
access |= (1 << 7);
diff --git a/src/kernel/gen_gdt.c b/src/kernel/gen_gdt.c
index 05eedaa..ccfb461 100644
--- a/src/kernel/gen_gdt.c
+++ b/src/kernel/gen_gdt.c
@@ -1,11 +1,19 @@
#include "gdt.h"
+#include <stdint.h>
GDT_t *table = 0x0;
-GDTR_t gdtr = {0, 0};
+extern GDTR_t gdtr;
void get_gdtr() {
- *table = (GDT_t){make_descriptor(0, 0, 0),
- make_descriptor(0x0000, 0xFFFFF, make_code(0, 0, 1)),
- make_descriptor(0x0000, 0xFFFFF, make_data(0, 0, 1))};
+ uint32_t base = 0x0000;
+
+ *table = (GDT_t){
+ // NULL
+ make_descriptor(0, 0, 0),
+ // Code segment, read
+ make_descriptor(base, 0x8FFFF, make_code(0, 0, 1)),
+ // Data segment, read write
+ make_descriptor(base, 0x8FFFF, make_data(0, 0, 1)),
+ };
gdtr.size = sizeof(Segment_Descriptor_t) * 3 - 1;
- gdtr.offset = 0x0;
+ gdtr.offset = base;
}
diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c
index 01c017b..5f6f5ae 100644
--- a/src/kernel/kernel.c
+++ b/src/kernel/kernel.c
@@ -20,10 +20,10 @@ void kernel_main(void) {
}
printf("%n");
}
- print_set_color(PRINT_COLOR_YELLOW, PRINT_COLOR_BLACK);
- printf("printf\n\tint: %d\n\tstring: %s\n\tchar: %c\n\tpercent: "
- "%%\n\tnothing: %n",
- 99, "World! ", 't');
+ // print_set_color(PRINT_COLOR_YELLOW, PRINT_COLOR_BLACK);
+ // printf("printf\n\tint: %d\n\tstring: %s\n\tchar: %c\n\tpercent: "
+ // "%%\n\tnothing: %n",
+ // 99, "World! ", 't');
// printf("\n0x%d\n", *((int *)(0x0010)));
}
diff --git a/src/kernel/print.c b/src/kernel/print.c
index 89f6722..d2857bc 100644
--- a/src/kernel/print.c
+++ b/src/kernel/print.c
@@ -7,8 +7,8 @@ static const size_t NUM_ROWS = 25;
// Char struct
struct Char {
- uint8_t character;
- uint8_t color;
+ uint8_t character;
+ uint8_t color;
};
// Set video mem buffer
@@ -22,112 +22,112 @@ uint8_t color = PRINT_COLOR_WHITE | PRINT_COLOR_BLACK << 4;
// clear row
void clear_row(size_t row) {
- // Define empty character
- struct Char empty = (struct Char){
- ' ',
- color,
- };
-
- // For every col in row, set vmem to empty
- for (size_t col = 0; col < NUM_COLS; col++) {
- buffer[col + NUM_COLS * row] = empty;
- }
+ // Define empty character
+ struct Char empty = (struct Char){
+ ' ',
+ color,
+ };
+
+ // For every col in row, set vmem to empty
+ for (size_t col = 0; col < NUM_COLS; col++) {
+ buffer[col + NUM_COLS * row] = empty;
+ }
}
// Call clear_row for every row
void print_clear() {
- for (size_t i = 0; i < NUM_ROWS; i++) {
- clear_row(i);
- }
+ for (size_t i = 0; i < NUM_ROWS; i++) {
+ clear_row(i);
+ }
}
// newline
void print_newline() {
- // Reset col and iterate row if not at bottom of screen
- col = 0;
- if (row < NUM_ROWS - 1) {
- row++;
- return;
- }
-
- // If at bottom of screen, move all the text up one row
- for (size_t row = 1; row < NUM_ROWS; row++) {
- for (size_t col = 0; col < NUM_COLS; col++) {
- struct Char character = buffer[col + NUM_COLS * row];
- buffer[col + NUM_COLS * (row - 1)] = character;
+ // Reset col and iterate row if not at bottom of screen
+ col = 0;
+ if (row < NUM_ROWS - 1) {
+ row++;
+ return;
+ }
+
+ // If at bottom of screen, move all the text up one row
+ for (size_t row = 1; row < NUM_ROWS; row++) {
+ for (size_t col = 0; col < NUM_COLS; col++) {
+ struct Char character = buffer[col + NUM_COLS * row];
+ buffer[col + NUM_COLS * (row - 1)] = character;
+ }
}
- }
- // Clear
- clear_row(NUM_ROWS - 1);
+ // Clear
+ clear_row(NUM_ROWS - 1);
}
// printchar
void print_char(char character) {
- // If \n, call newline
- if (character == '\n') {
- print_newline();
- return;
- }
-
- if (character == '\t') {
- print_str(" \0");
- return;
- }
-
- // if cols is too large, overflow
- if (col > NUM_COLS) {
- print_newline();
- }
-
- // set video memeory to requested character
- buffer[col + NUM_COLS * row] = (struct Char){
- (uint8_t)character,
- color,
- };
-
- // iterate col
- col++;
+ // If \n, call newline
+ if (character == '\n') {
+ print_newline();
+ return;
+ }
+
+ if (character == '\t') {
+ print_str(" \0");
+ return;
+ }
+
+ // if cols is too large, overflow
+ if (col > NUM_COLS) {
+ print_newline();
+ }
+
+ // set video memeory to requested character
+ buffer[col + NUM_COLS * row] = (struct Char){
+ (uint8_t)character,
+ color,
+ };
+
+ // iterate col
+ col++;
}
// print_str
void print_str(char *str) {
- // while character != '\0' print char
- for (size_t i = 0; str[i] != '\0'; ++i)
- print_char(str[i]);
+ // while character != '\0' print char
+ for (size_t i = 0; str[i] != '\0'; ++i)
+ print_char(str[i]);
}
// Set color byte to requested colors using color enum from print.h
void print_set_color(uint8_t foreground, uint8_t background) {
- color = foreground + (background << 4);
+ color = foreground + (background << 4);
}
void printf(const char *str, ...) {
- va_list args;
- va_start(args, str);
- char temp_str[256];
-
- for (size_t i = 0; str[i] != '\0'; ++i) {
- if (str[i] == '%') {
- switch (str[++i]) {
- case 'i':
- case 'd':
- print_str(itoa(va_arg(args, int), temp_str));
- break;
- case 's':
- print_str(va_arg(args, char *));
- break;
- case 'c':
- print_char(va_arg(args, int));
- break;
- case '%':
- print_char('%');
- case 'n':
- break;
- }
- continue;
+ va_list args;
+ va_start(args, str);
+ char temp_str[256];
+
+ for (size_t i = 0; str[i] != '\0'; ++i) {
+ if (str[i] == '%') {
+ switch (str[++i]) {
+ case 'i':
+ case 'd':
+ print_str(itoa(va_arg(args, int), temp_str));
+ break;
+ case 's':
+ print_str(va_arg(args, char *));
+ break;
+ case 'c':
+ print_char(va_arg(args, int));
+ break;
+ case '%':
+ print_char('%');
+ case 'n':
+ break;
+ }
+ continue;
+ }
+ print_char(str[i]);
}
- print_char(str[i]);
- }
- va_end(args);
+ va_end(args);
}