forked from PoliEcho-holding-org/kern
Major libk restructuring, also rewrote drivers/serial.h
This commit is contained in:
+59
-3
@@ -3,11 +3,12 @@
|
|||||||
#include <memory/addresses.h>
|
#include <memory/addresses.h>
|
||||||
#include <screen/gfxmode.h>
|
#include <screen/gfxmode.h>
|
||||||
#include <screen/text.h>
|
#include <screen/text.h>
|
||||||
#include <error/bigerr.h>
|
#include <drivers/disk.h>
|
||||||
#include <disk/disk.h>
|
#include <fs/kernfs.h>
|
||||||
#include <fs/impl.h>
|
|
||||||
#include <fs/fs.h>
|
#include <fs/fs.h>
|
||||||
|
|
||||||
|
void bigError(uint32_t err);
|
||||||
|
|
||||||
__attribute__ ((section("entry")))
|
__attribute__ ((section("entry")))
|
||||||
void main() {
|
void main() {
|
||||||
// Physical memory manager setup
|
// Physical memory manager setup
|
||||||
@@ -80,3 +81,58 @@ void main() {
|
|||||||
bigError(0xffffffff);
|
bigError(0xffffffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void rect(uint32_t c, uint16_t x, uint16_t y, uint16_t w, uint16_t h) {
|
||||||
|
uint8_t* vidmem = (uint8_t*)gfxMode->physicalBasePtr;
|
||||||
|
uint8_t bytesPerPx = gfxMode->bpp / 8;
|
||||||
|
uint32_t convColor = convertColor(c);
|
||||||
|
|
||||||
|
for (uint32_t dx = 0; dx < w; dx++) {
|
||||||
|
for (uint32_t dy = 0; dy < h; dy++) {
|
||||||
|
uint32_t offset = (((y + dy) * gfxMode->xRes) + (x + dx)) * bytesPerPx;
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < gfxMode->bpp; i++) {
|
||||||
|
vidmem[offset + i] = (uint8_t)(convColor >> (i*8));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void bigError(uint32_t err) {
|
||||||
|
// Red BG
|
||||||
|
rect(0x00ff0000, 0, 0, gfxMode->xRes, gfxMode->yRes);
|
||||||
|
// E
|
||||||
|
rect(0x00ffffff, 20, 10, 10, 50);
|
||||||
|
rect(0x00ffffff, 30, 10, 30, 10);
|
||||||
|
rect(0x00ffffff, 30, 30, 30, 10);
|
||||||
|
rect(0x00ffffff, 30, 50, 30, 10);
|
||||||
|
// R
|
||||||
|
rect(0x00ffffff, 70, 10, 10, 50);
|
||||||
|
rect(0x00ffffff, 70, 10, 30, 10);
|
||||||
|
rect(0x00ffffff, 70, 30, 30, 10);
|
||||||
|
rect(0x00ffffff, 90, 10, 10, 30);
|
||||||
|
rect(0x00ffffff, 80, 40, 10, 10);
|
||||||
|
rect(0x00ffffff, 90, 50, 10, 10);
|
||||||
|
// R
|
||||||
|
rect(0x00ffffff, 110, 10, 10, 50);
|
||||||
|
rect(0x00ffffff, 110, 10, 30, 10);
|
||||||
|
rect(0x00ffffff, 110, 30, 30, 10);
|
||||||
|
rect(0x00ffffff, 130, 10, 10, 30);
|
||||||
|
rect(0x00ffffff, 120, 40, 10, 10);
|
||||||
|
rect(0x00ffffff, 130, 50, 10, 10);
|
||||||
|
// O
|
||||||
|
rect(0x00ffffff, 150, 10, 10, 50);
|
||||||
|
rect(0x00ffffff, 170, 10, 10, 50);
|
||||||
|
rect(0x00ffffff, 150, 10, 30, 10);
|
||||||
|
rect(0x00ffffff, 150, 50, 30, 10);
|
||||||
|
// R
|
||||||
|
rect(0x00ffffff, 190, 10, 10, 50);
|
||||||
|
rect(0x00ffffff, 190, 10, 30, 10);
|
||||||
|
rect(0x00ffffff, 190, 30, 30, 10);
|
||||||
|
rect(0x00ffffff, 210, 10, 10, 30);
|
||||||
|
rect(0x00ffffff, 200, 40, 10, 10);
|
||||||
|
rect(0x00ffffff, 210, 50, 10, 10);
|
||||||
|
|
||||||
|
__asm__ volatile ("cli; hlt" :: "a"(err));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+19
-19
@@ -1,29 +1,29 @@
|
|||||||
#include <interrupt/isr.h>
|
|
||||||
#include <interrupt/pit.h>
|
|
||||||
#include <interrupt/rtc.h>
|
|
||||||
#include <syscalls/syscalls.h>
|
#include <syscalls/syscalls.h>
|
||||||
#include <keyboard/keyboard.h>
|
#include <memory/addresses.h>
|
||||||
#include <memory/physical.h>
|
#include <memory/physical.h>
|
||||||
#include <memory/virtual.h>
|
#include <memory/virtual.h>
|
||||||
#include <memory/addresses.h>
|
|
||||||
#include <memory/malloc.h>
|
#include <memory/malloc.h>
|
||||||
#include <fs/fs.h>
|
#include <drivers/keyboard.h>
|
||||||
#include <fs/impl.h>
|
#include <drivers/serial.h>
|
||||||
#include <disk/disk.h>
|
#include <drivers/timer.h>
|
||||||
#include <screen/text.h>
|
#include <drivers/pcspk.h>
|
||||||
|
#include <drivers/disk.h>
|
||||||
|
#include <drivers/rtc.h>
|
||||||
#include <screen/graphics.h>
|
#include <screen/graphics.h>
|
||||||
#include <screen/gfxmode.h>
|
#include <screen/gfxmode.h>
|
||||||
#include <tty/tty.h>
|
#include <screen/text.h>
|
||||||
#include <sound/pcspk.h>
|
#include <screen/tty.h>
|
||||||
#include <sound/notes.h>
|
#include <cpu/system.h>
|
||||||
#include <ports/io.h>
|
#include <cpu/isr.h>
|
||||||
#include <ports/serial.h>
|
#include <fs/kernfs.h>
|
||||||
#include <stdio.h>
|
#include <fs/fs.h>
|
||||||
|
#include <sys/notes.h>
|
||||||
|
#include <sys/gfx.h>
|
||||||
|
#include <syscall.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <syscall.h>
|
|
||||||
#include <sys/gfx.h>
|
|
||||||
|
|
||||||
/* Little teaser
|
/* Little teaser
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
@@ -64,8 +64,8 @@ void main() {
|
|||||||
// Setup serial output for debugf()
|
// Setup serial output for debugf()
|
||||||
if (setupSerial(PORT_COM1) != 0) { printf("\x1b[1MFailed to initialize serial interface\x1b[8M\n"); }
|
if (setupSerial(PORT_COM1) != 0) { printf("\x1b[1MFailed to initialize serial interface\x1b[8M\n"); }
|
||||||
else {
|
else {
|
||||||
serialPrint(PORT_COM1, "\x1b[H\x1b[J"); // Clear
|
debugf("\x1b[H\x1b[J"); // Clear
|
||||||
serialPrint(PORT_COM1, "kern. \x1b[36m(Serial console)\x1b[0m\n\n");
|
debugf("kern. \x1b[36m(Serial console)\x1b[0m\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Interrupt setup
|
// Interrupt setup
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
#include <interrupt/idt.h>
|
#include <cpu/idt.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define IDT_ENTRIES 256
|
|
||||||
|
|
||||||
__attribute__ ((aligned(0x10))) // For performance
|
__attribute__ ((aligned(0x10))) // For performance
|
||||||
idtEntry_t idt[IDT_ENTRIES] = { 0 };
|
idtEntry_t idt[IDT_ENTRIES] = { 0 };
|
||||||
idtp_t idtp;
|
idtp_t idtp;
|
||||||
@@ -1,11 +1,10 @@
|
|||||||
#include <interrupt/isr.h>
|
|
||||||
#include <interrupt/idt.h>
|
|
||||||
#include <syscalls/syscalls.h>
|
#include <syscalls/syscalls.h>
|
||||||
#include <error/panic.h>
|
#include <drivers/serial.h>
|
||||||
#include <error/debug.h>
|
#include <cpu/system.h>
|
||||||
#include <ports/io.h>
|
#include <cpu/idt.h>
|
||||||
|
#include <cpu/isr.h>
|
||||||
|
|
||||||
const char* format = "\x1b[31mPanic: %s!\n";
|
const char* format = "\x1b[31m[kernel] %s!\n\x1b[0m";
|
||||||
const char* exceptions[] = {
|
const char* exceptions[] = {
|
||||||
"Division By Zero",
|
"Division By Zero",
|
||||||
"Debug",
|
"Debug",
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
#include <cpu/system.h>
|
||||||
|
#include <drivers/serial.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
void cpuid(uint32_t* eax, uint32_t* ebx, uint32_t* ecx, uint32_t* edx) {
|
||||||
|
__asm__ volatile (
|
||||||
|
"cpuid"
|
||||||
|
: "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx)
|
||||||
|
: "a"(*eax)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t inb(uint16_t port) {
|
||||||
|
uint8_t result;
|
||||||
|
__asm__ volatile("inb %1, %0" : "=a"(result) : "Nd"(port));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
void outb(uint16_t port, uint8_t data) {
|
||||||
|
__asm__ volatile("outb %0, %1" :: "a"(data), "Nd"(port));
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t inw(uint16_t port) {
|
||||||
|
uint16_t result;
|
||||||
|
__asm__ volatile("inw %1, %0" : "=a"(result) : "Nd"(port));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
void outw(uint16_t port, uint16_t data) {
|
||||||
|
__asm__ volatile("outw %0, %1" :: "a"(data), "Nd"(port));
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t inl(uint16_t port) {
|
||||||
|
uint32_t result;
|
||||||
|
__asm__ volatile("inl %1, %0" : "=a"(result) : "Nd"(port));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
void outl(uint16_t port, uint32_t data) {
|
||||||
|
__asm__ volatile("outl %0, %1" :: "a"(data), "Nd"(port));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ioWait() {
|
||||||
|
// Waits ~1 I/O Cycle (Linux uses this so it should be good)
|
||||||
|
__asm__ volatile("outb %%al, $0x80" : : "a"(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
void panic() {
|
||||||
|
debugf("\x1b[31m[kernel] Kern panic!\x1b[0m\n");
|
||||||
|
while (1) { __asm__ volatile ("cli; hlt"); }
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#include <disk/disk.h>
|
#include <drivers/disk.h>
|
||||||
|
#include <cpu/system.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <ports/io.h>
|
|
||||||
|
|
||||||
void diskRead(uint32_t lbaAddress, uint8_t sectorCount, char* dst) {
|
void diskRead(uint32_t lbaAddress, uint8_t sectorCount, char* dst) {
|
||||||
outb(PIO_PORT + 6, ((lbaAddress >> 24) & 0x0f) | 0xe0); // 6 - Use LBA; 4 - Drive number; 3-0 - Highest lba address nibble
|
outb(PIO_PORT + 6, ((lbaAddress >> 24) & 0x0f) | 0xe0); // 6 - Use LBA; 4 - Drive number; 3-0 - Highest lba address nibble
|
||||||
@@ -1,27 +1,23 @@
|
|||||||
#include <keyboard/keyboard.h>
|
#include <drivers/keyboard.h>
|
||||||
#include <interrupt/isr.h>
|
|
||||||
#include <keyboard/keys.h>
|
|
||||||
#include <memory/addresses.h>
|
#include <memory/addresses.h>
|
||||||
#include <ports/io.h>
|
#include <cpu/system.h>
|
||||||
#include <stdio.h>
|
#include <cpu/isr.h>
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
static const uint8_t US_Keyboard[2][128] = US_KEYBOARD;
|
static const uint8_t US_Keyboard[2][128] = US_KEYBOARD;
|
||||||
keyboardState_t* keyboard = (keyboardState_t*)KEYBOARD_STATE_LOC;
|
keyboardState_t* keyboard = (keyboardState_t*)KEYBOARD_STATE_LOC;
|
||||||
|
|
||||||
void keyboardHandler(intFrame_t*) { // TODO: Make this better and be able to read multi-byte scancode
|
// TODO: Make this better and be able to read multi-byte scancode
|
||||||
|
void keyboardHandler(intFrame_t*) {
|
||||||
uint8_t scancode = inb(0x60);
|
uint8_t scancode = inb(0x60);
|
||||||
char c = US_Keyboard[keyboard->shift][scancode];
|
char c = US_Keyboard[keyboard->shift][scancode];
|
||||||
|
|
||||||
if (scancode == LEFT_SHIFT_PRESS || scancode == RIGHT_SHIFT_PRESS) {
|
if (scancode == LEFT_SHIFT_PRESS || scancode == RIGHT_SHIFT_PRESS) {
|
||||||
keyboard->shift = true;
|
keyboard->shift = 1;
|
||||||
} else if (scancode == LEFT_SHIFT_RELEASE || scancode == RIGHT_SHIFT_RELEASE) {
|
} else if (scancode == LEFT_SHIFT_RELEASE || scancode == RIGHT_SHIFT_RELEASE) {
|
||||||
keyboard->shift = false;
|
keyboard->shift = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scancode & 0x80) { // Keyup
|
if (scancode & 0x80) { // Keyup
|
||||||
} else if (c != '\0') {
|
} else if (c != '\0') { keyboard->character = c; }
|
||||||
keyboard->character = c;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
#include <sound/pcspk.h>
|
#include <drivers/pcspk.h>
|
||||||
#include <sound/notes.h>
|
#include <drivers/timer.h>
|
||||||
#include <interrupt/pit.h>
|
#include <cpu/system.h>
|
||||||
#include <ports/io.h>
|
#include <sys/notes.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
@@ -1,15 +1,14 @@
|
|||||||
#include <interrupt/rtc.h>
|
#include <drivers/rtc.h>
|
||||||
#include <interrupt/isr.h>
|
|
||||||
#include <screen/text.h>
|
|
||||||
#include <screen/gfxmode.h>
|
#include <screen/gfxmode.h>
|
||||||
#include <tty/tty.h>
|
#include <screen/text.h>
|
||||||
#include <ports/io.h>
|
#include <screen/tty.h>
|
||||||
#include <stdbool.h>
|
#include <cpu/system.h>
|
||||||
|
#include <cpu/isr.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
static datetime_t* datetime = (datetime_t*)DATETIME_LOC;
|
static datetime_t* datetime = (datetime_t*)DATETIME_LOC;
|
||||||
|
|
||||||
bool cmosUpdateProgress() {
|
int cmosUpdateProgress() {
|
||||||
outb(CMOS_ADDRESS, 0x8a); // Read status reg A, disable NMI
|
outb(CMOS_ADDRESS, 0x8a); // Read status reg A, disable NMI
|
||||||
return inb(CMOS_DATA) & 0x80;
|
return inb(CMOS_DATA) & 0x80;
|
||||||
}
|
}
|
||||||
@@ -97,7 +96,7 @@ void rtcHandler(intFrame_t* iframe) {
|
|||||||
datetime->month = newDatetime.month;
|
datetime->month = newDatetime.month;
|
||||||
datetime->year = newDatetime.year;
|
datetime->year = newDatetime.year;
|
||||||
|
|
||||||
if (true) { // TODO: Probably get rid of this idk
|
if (1) { // TODO: Probably get rid of this idk
|
||||||
char buf[20] = { 0 }; // "12/12 2012 12:12:12" - Max string 20 chars with null byte
|
char buf[20] = { 0 }; // "12/12 2012 12:12:12" - Max string 20 chars with null byte
|
||||||
|
|
||||||
strcat(buf, itoa(datetime->day, 10));
|
strcat(buf, itoa(datetime->day, 10));
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
#include <drivers/serial.h>
|
||||||
|
#include <cpu/system.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
int serialEnable(int port) {
|
||||||
|
outb(port + 1, 0x00); // Disable all interrupts
|
||||||
|
outb(port + 3, 0x80); // Enable DLAB (set baud rate divisor)
|
||||||
|
outb(port + 0, 0x03); // Set divisor to 3 (low byte) 38400 baud
|
||||||
|
outb(port + 1, 0x00); // (high byte)
|
||||||
|
outb(port + 3, 0x03); // 8 bits, no parity, one stop bit
|
||||||
|
outb(port + 2, 0xC7); // Enable FIFO, clear them, with 14 byte threshold
|
||||||
|
outb(port + 4, 0x0B); // IRQs enabled, RTS/DSR set
|
||||||
|
outb(port + 4, 0x1E); // Set in loopback mode, test the serial chip
|
||||||
|
outb(port + 0, 0xAE); // Test serial chip (send byte 0xAE and check if it returns)
|
||||||
|
|
||||||
|
if (inb(port + 0) != 0xAE) return 1;
|
||||||
|
outb(port + 4, 0x0F); // non-loopback, IRQs enabled, OUT#1 and OUT#2 bits enabled
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int setupSerial() {
|
||||||
|
if (serialEnable(PORT_COM1) != 0) { return 1; }
|
||||||
|
outb(PORT_COM1 + 1, 0x01);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int serialTransimitEmpty(int port) { return inb(port + 5) & 0x20; }
|
||||||
|
static int serialRecieved(int port) { return inb(port + 5) & 0x01; }
|
||||||
|
|
||||||
|
void serialWrite(int port, char c) { while (!serialTransimitEmpty(port)); outb(port, c); }
|
||||||
|
char serialRead(int port) { while (!serialRecieved(port)); return inb(port); }
|
||||||
|
char serialReadAsync(int port) { return inb(port); }
|
||||||
|
|
||||||
|
void _dbgPutc(char c, void* arg) {
|
||||||
|
(void)arg;
|
||||||
|
serialWrite(PORT_COM1, c);
|
||||||
|
if (c == '\n') serialWrite(PORT_COM1, '\r');
|
||||||
|
}
|
||||||
|
int vdebugf(const char* fmt, va_list va) { return vpprintf(_dbgPutc, NULL, fmt, va); }
|
||||||
|
int debugf(const char* fmt, ...) {
|
||||||
|
va_list va;
|
||||||
|
va_start(va, fmt);
|
||||||
|
int ret = vdebugf(fmt, va);
|
||||||
|
va_end(va);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
#include <interrupt/pit.h>
|
#include <drivers/timer.h>
|
||||||
#include <interrupt/isr.h>
|
|
||||||
#include <tty/tty.h>
|
|
||||||
#include <memory/addresses.h>
|
#include <memory/addresses.h>
|
||||||
#include <ports/io.h>
|
#include <screen/tty.h>
|
||||||
|
#include <cpu/system.h>
|
||||||
|
#include <cpu/isr.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
void timerHandler(intFrame_t*) {
|
void timerHandler(intFrame_t*) {
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
#include <error/bigerr.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <screen/gfxmode.h>
|
|
||||||
|
|
||||||
void rect(uint32_t c, uint16_t x, uint16_t y, uint16_t w, uint16_t h) {
|
|
||||||
uint8_t* vidmem = (uint8_t*)gfxMode->physicalBasePtr;
|
|
||||||
uint8_t bytesPerPx = gfxMode->bpp / 8;
|
|
||||||
uint32_t convColor = convertColor(c);
|
|
||||||
|
|
||||||
for (uint32_t dx = 0; dx < w; dx++) {
|
|
||||||
for (uint32_t dy = 0; dy < h; dy++) {
|
|
||||||
uint32_t offset = (((y + dy) * gfxMode->xRes) + (x + dx)) * bytesPerPx;
|
|
||||||
|
|
||||||
for (uint8_t i = 0; i < gfxMode->bpp; i++) {
|
|
||||||
vidmem[offset + i] = (uint8_t)(convColor >> (i*8));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void bigError(uint32_t err) {
|
|
||||||
// Red BG
|
|
||||||
rect(0x00ff0000, 0, 0, gfxMode->xRes, gfxMode->yRes);
|
|
||||||
// E
|
|
||||||
rect(0x00ffffff, 20, 10, 10, 50);
|
|
||||||
rect(0x00ffffff, 30, 10, 30, 10);
|
|
||||||
rect(0x00ffffff, 30, 30, 30, 10);
|
|
||||||
rect(0x00ffffff, 30, 50, 30, 10);
|
|
||||||
// R
|
|
||||||
rect(0x00ffffff, 70, 10, 10, 50);
|
|
||||||
rect(0x00ffffff, 70, 10, 30, 10);
|
|
||||||
rect(0x00ffffff, 70, 30, 30, 10);
|
|
||||||
rect(0x00ffffff, 90, 10, 10, 30);
|
|
||||||
rect(0x00ffffff, 80, 40, 10, 10);
|
|
||||||
rect(0x00ffffff, 90, 50, 10, 10);
|
|
||||||
// R
|
|
||||||
rect(0x00ffffff, 110, 10, 10, 50);
|
|
||||||
rect(0x00ffffff, 110, 10, 30, 10);
|
|
||||||
rect(0x00ffffff, 110, 30, 30, 10);
|
|
||||||
rect(0x00ffffff, 130, 10, 10, 30);
|
|
||||||
rect(0x00ffffff, 120, 40, 10, 10);
|
|
||||||
rect(0x00ffffff, 130, 50, 10, 10);
|
|
||||||
// O
|
|
||||||
rect(0x00ffffff, 150, 10, 10, 50);
|
|
||||||
rect(0x00ffffff, 170, 10, 10, 50);
|
|
||||||
rect(0x00ffffff, 150, 10, 30, 10);
|
|
||||||
rect(0x00ffffff, 150, 50, 30, 10);
|
|
||||||
// R
|
|
||||||
rect(0x00ffffff, 190, 10, 10, 50);
|
|
||||||
rect(0x00ffffff, 190, 10, 30, 10);
|
|
||||||
rect(0x00ffffff, 190, 30, 30, 10);
|
|
||||||
rect(0x00ffffff, 210, 10, 10, 30);
|
|
||||||
rect(0x00ffffff, 200, 40, 10, 10);
|
|
||||||
rect(0x00ffffff, 210, 50, 10, 10);
|
|
||||||
|
|
||||||
__asm__ volatile ("cli; hlt" :: "a"(err));
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
#include <error/debug.h>
|
|
||||||
#include <ports/serial.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
static void _dbgPutc(char c, void* arg) {
|
|
||||||
(void)arg;
|
|
||||||
serialWrite(PORT_COM1, c);
|
|
||||||
if (c == '\n') { serialWrite(PORT_COM1, '\r'); }
|
|
||||||
}
|
|
||||||
|
|
||||||
int debugf(const char* fmt, ...) {
|
|
||||||
va_list va;
|
|
||||||
va_start(va, fmt);
|
|
||||||
int res = vpprintf(_dbgPutc, NULL, fmt, va);
|
|
||||||
va_end(va);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#include <error/panic.h>
|
|
||||||
|
|
||||||
void panic() {
|
|
||||||
// TODO: print a message
|
|
||||||
while (1) { __asm__ volatile ("cli; hlt"); }
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
#include <fs/impl.h>
|
#include <fs/kernfs.h>
|
||||||
#include <fs/fs.h>
|
|
||||||
#include <memory/addresses.h>
|
#include <memory/addresses.h>
|
||||||
#include <disk/disk.h>
|
#include <drivers/disk.h>
|
||||||
|
#include <fs/fs.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
#ifndef INTERRUPT_IDT_H
|
#ifndef _CPU_IDT_H
|
||||||
#define INTERRUPT_IDT_H
|
#define _CPU_IDT_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define IDT_ENTRIES 256
|
||||||
|
|
||||||
#define TRAP_GATE_FLAGS 0x8f // P = 1, DPL = 00, S = 0, Type = 1111 (32-bit Trap gate)
|
#define TRAP_GATE_FLAGS 0x8f // P = 1, DPL = 00, S = 0, Type = 1111 (32-bit Trap gate)
|
||||||
#define INT_GATE_FLAGS 0x8e // P = 1, DPL = 00, S = 0, Type = 1110 (32-bit Int gate)
|
#define INT_GATE_FLAGS 0x8e // P = 1, DPL = 00, S = 0, Type = 1110 (32-bit Int gate)
|
||||||
#define USR_INT_GATE_FLAGS 0xee // P = 1, DPL = 11, S = 0, Type = 1110 (32-bit Int gate)
|
#define USR_INT_GATE_FLAGS 0xee // P = 1, DPL = 11, S = 0, Type = 1110 (32-bit Int gate)
|
||||||
@@ -24,4 +26,3 @@ void idtSetGate(uint8_t i, void* handler, uint8_t flags);
|
|||||||
void setupIdt();
|
void setupIdt();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef INTERRUPT_ISR_H
|
#ifndef _CPU_ISR_H
|
||||||
#define INTERRUPT_ISR_H
|
#define _CPU_ISR_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
@@ -15,8 +15,8 @@ typedef struct {
|
|||||||
typedef void (*HandlerPtr)(intFrame_t* iframe);
|
typedef void (*HandlerPtr)(intFrame_t* iframe);
|
||||||
|
|
||||||
void setupIsrs();
|
void setupIsrs();
|
||||||
int handleInterrupt(intFrame_t iframe);
|
|
||||||
void registerIrq(uint8_t id, HandlerPtr handler);
|
void registerIrq(uint8_t id, HandlerPtr handler);
|
||||||
|
int handleInterrupt(intFrame_t iframe);
|
||||||
|
|
||||||
// ISR Table
|
// ISR Table
|
||||||
extern void* asm_isrRedirectTable[48];
|
extern void* asm_isrRedirectTable[48];
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef _CPU_SYSTEM_H
|
||||||
|
#define _CPU_SYSTEM_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
void cpuid(uint32_t* eax, uint32_t* ebx, uint32_t* ecx, uint32_t* edx);
|
||||||
|
|
||||||
|
void outb(uint16_t port, uint8_t data);
|
||||||
|
void outw(uint16_t port, uint16_t data);
|
||||||
|
void outl(uint16_t port, uint32_t data);
|
||||||
|
|
||||||
|
uint8_t inb(uint16_t port);
|
||||||
|
uint16_t inw(uint16_t port);
|
||||||
|
uint32_t inl(uint16_t port);
|
||||||
|
|
||||||
|
void ioWait();
|
||||||
|
void panic();
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef DISK_DISK_H
|
#ifndef _DRIVERS_DISK_H
|
||||||
#define DISK_DISK_H
|
#define _DRIVERS_DISK_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
#ifndef KEYBOARD_KEYS_H
|
#ifndef _DRIVERS_KEYBOARD_H
|
||||||
#define KEYBOARD_KEYS_H
|
#define _DRIVERS_KEYBOARD_H
|
||||||
|
|
||||||
|
#include <cpu/isr.h>
|
||||||
|
|
||||||
|
// Special keys
|
||||||
#define LEFT_SHIFT_PRESS 0x2a
|
#define LEFT_SHIFT_PRESS 0x2a
|
||||||
#define LEFT_SHIFT_RELEASE (LEFT_SHIFT_PRESS | 0x80)
|
#define LEFT_SHIFT_RELEASE (LEFT_SHIFT_PRESS | 0x80)
|
||||||
#define RIGHT_SHIFT_PRESS 0x36
|
#define RIGHT_SHIFT_PRESS 0x36
|
||||||
@@ -35,4 +38,11 @@
|
|||||||
}\
|
}\
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char character;
|
||||||
|
int shift;
|
||||||
|
} keyboardState_t;
|
||||||
|
|
||||||
|
void keyboardHandler(intFrame_t*);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
#ifndef SOUND_PCSPK_H
|
#ifndef _DRIVERS_PCSPK_H
|
||||||
#define SOUND_PCSPK_H
|
#define _DRIVERS_PCSPK_H
|
||||||
|
|
||||||
#include <sound/notes.h>
|
#include <sys/notes.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define PC_SPEAKER 0x61
|
#define PC_SPEAKER 0x61
|
||||||
@@ -1,9 +1,8 @@
|
|||||||
#ifndef INTERRUPT_RTC_H
|
#ifndef _DRIVERS_RTC_H
|
||||||
#define INTERRUPT_RTC_H
|
#define _DRIVERS_RTC_H
|
||||||
|
|
||||||
#include <interrupt/isr.h>
|
#include <cpu/isr.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#define CMOS_ADDRESS 0x70
|
#define CMOS_ADDRESS 0x70
|
||||||
#define CMOS_DATA 0x71
|
#define CMOS_DATA 0x71
|
||||||
@@ -18,7 +17,7 @@ typedef struct {
|
|||||||
} __attribute__ ((packed)) datetime_t;
|
} __attribute__ ((packed)) datetime_t;
|
||||||
|
|
||||||
void rtcHandler(intFrame_t*);
|
void rtcHandler(intFrame_t*);
|
||||||
bool cmosUpdateProgress();
|
int cmosUpdateProgress();
|
||||||
uint8_t getRtcRegister(uint8_t reg);
|
uint8_t getRtcRegister(uint8_t reg);
|
||||||
void enableRtc();
|
void enableRtc();
|
||||||
void disableRtc();
|
void disableRtc();
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
#ifndef _DRIVERS_SERIAL_H
|
||||||
|
#define _DRIVERS_SERIAL_H
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#define PORT_COM1 0x3f8
|
||||||
|
#define PORT_COM2 0x2f8
|
||||||
|
#define PORT_COM3 0x3e8
|
||||||
|
#define PORT_COM4 0x2e8
|
||||||
|
|
||||||
|
// IRQ4 -> COM1, IRQ3 -> COM2
|
||||||
|
#define SERIAL_IRQ 4
|
||||||
|
|
||||||
|
int serialEnable(int port);
|
||||||
|
int setupSerial();
|
||||||
|
void serialWrite(int port, char c);
|
||||||
|
char serialRead(int port);
|
||||||
|
char serialReadAsync(int port);
|
||||||
|
|
||||||
|
int debugf(const char* fmt, ...);
|
||||||
|
int vdebugf(const char* fmt, va_list va);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
#ifndef INTERRUPT_PIT_H
|
#ifndef _DRIVERS_TIMER_H
|
||||||
#define INTERRUPT_PIT_H
|
#define _DRIVERS_TIMER_H
|
||||||
|
|
||||||
#include <interrupt/isr.h>
|
#include <cpu/isr.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define CHANNEL_0 0x40 // Offset it by 1 or 2 for ch1 and ch2
|
#define CHANNEL_0 0x40 // Offset it by 1 or 2 for ch1 and ch2
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
#ifndef ERROR_BIGERR_H
|
|
||||||
#define ERROR_BIGERR_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Something went VERY wrong.
|
|
||||||
* Eg. kernel.bin is missing, no filesystem, Virtual Memory failed, etc.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
void rect(uint32_t c, uint16_t x, uint16_t y, uint16_t w, uint16_t h);
|
|
||||||
void bigError(uint32_t err);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#ifndef ERROR_DEBUG_H
|
|
||||||
#define ERROR_DEBUG_H
|
|
||||||
|
|
||||||
int debugf(const char* fmt, ...);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#ifndef ERROR_PANIC_H
|
|
||||||
#define ERROR_PANIC_H
|
|
||||||
|
|
||||||
void panic();
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef FS_FS_H
|
#ifndef _FS_FS_H
|
||||||
#define FS_FS_H
|
#define _FS_FS_H
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For info, read the fs-spec.txt document inside of docs/
|
* For info, read the fs-spec.txt document inside of docs/
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef FS_IMPL_H
|
#ifndef _FS_KERNFS_H
|
||||||
#define FS_IMPL_H
|
#define _FS_KERNFS_H
|
||||||
|
|
||||||
#include <fs/fs.h>
|
#include <fs/fs.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@@ -17,5 +17,6 @@ extern fsInfo_t* fsInfo;
|
|||||||
|
|
||||||
inode_t* getInode(char* path, dirEntry_t* dentries);
|
inode_t* getInode(char* path, dirEntry_t* dentries);
|
||||||
uint8_t loadFile(inode_t* inode, void* dest);
|
uint8_t loadFile(inode_t* inode, void* dest);
|
||||||
|
void initOpenFileTable();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#ifndef INTERRUPT_EXCEPTIONS_H
|
|
||||||
#define INTERRUPT_EXCEPTIONS_H
|
|
||||||
|
|
||||||
void setupExceptions();
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
#ifndef KEYBOARD_KEYBOARD_H
|
|
||||||
#define KEYBOARD_KEYBOARD_H
|
|
||||||
|
|
||||||
#include <interrupt/isr.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char character;
|
|
||||||
bool shift;
|
|
||||||
} keyboardState_t;
|
|
||||||
|
|
||||||
void keyboardHandler(intFrame_t*);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef MEMORY_ADDRESSES_H
|
#ifndef _MEMORY_ADDRESSES_H
|
||||||
#define MEMORY_ADDRESSES_H
|
#define _MEMORY_ADDRESSES_H
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Memory layout of addresses 0x0000 - 0x12000
|
* Memory layout of addresses 0x0000 - 0x12000
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
#define PHYS_MEM_USED_BLOCKS 0x180C
|
#define PHYS_MEM_USED_BLOCKS 0x180C
|
||||||
|
|
||||||
// Some structs 0x2000-0x2fff
|
// Some structs 0x2000-0x2fff
|
||||||
#define TERMINAL_INFO_LOC 0x2000
|
#define CONSOLE_INFO_LOC 0x2000
|
||||||
#define KEYBOARD_STATE_LOC 0x2100
|
#define KEYBOARD_STATE_LOC 0x2100
|
||||||
#define DATETIME_LOC 0x2200
|
#define DATETIME_LOC 0x2200
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef MEMORY_MALLOC_H
|
#ifndef _MEMORY_MALLOC_H
|
||||||
#define MEMORY_MALLOC_H
|
#define _MEMORY_MALLOC_H
|
||||||
|
|
||||||
#include <memory/virtual.h>
|
#include <memory/virtual.h>
|
||||||
#include <memory/physical.h>
|
#include <memory/physical.h>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef MEMORY_PHYSICAL_H
|
#ifndef _MEMORY_PHYSICAL_H
|
||||||
#define MEMORY_PHYSICAL_H
|
#define _MEMORY_PHYSICAL_H
|
||||||
|
|
||||||
#include <memory/addresses.h>
|
#include <memory/addresses.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#ifndef MEMORY_VIRTUAL_H
|
#ifndef _MEMORY_VIRTUAL_H
|
||||||
#define MEMORY_VIRTUAL_H
|
#define _MEMORY_VIRTUAL_H
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <memory/physical.h>
|
#include <memory/physical.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
#define PAGES_PER_TABLE 1024
|
#define PAGES_PER_TABLE 1024
|
||||||
#define TABLES_PER_DIRECTORY 1024
|
#define TABLES_PER_DIRECTORY 1024
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
#ifndef PORTS_IO_H
|
|
||||||
#define PORTS_IO_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
// Port functions
|
|
||||||
uint8_t inb(uint16_t port);
|
|
||||||
void outb(uint16_t port, uint8_t data);
|
|
||||||
uint16_t inw(uint16_t port);
|
|
||||||
void outw(uint16_t port, uint16_t data);
|
|
||||||
void ioWait();
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
#ifndef PORTS_SERIAL_H
|
|
||||||
#define PORTS_SERIAL_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#define PORT_COM1 0x3f8
|
|
||||||
#define PORT_COM2 0x2f8
|
|
||||||
#define PORT_COM3 0x3e8
|
|
||||||
#define PORT_COM4 0x2e8
|
|
||||||
#define PORT_COM5 0x5f8
|
|
||||||
#define PORT_COM6 0x4f8
|
|
||||||
#define PORT_COM7 0x5e8
|
|
||||||
#define PORT_COM8 0x4e8
|
|
||||||
|
|
||||||
int setupSerial(uint32_t port);
|
|
||||||
|
|
||||||
int serialTransmitEmpty(uint32_t port);
|
|
||||||
int serialRecieved(uint32_t port);
|
|
||||||
|
|
||||||
void serialWrite(uint32_t port, char c);
|
|
||||||
void serialPrint(uint32_t port, const char* s);
|
|
||||||
char serialRead(uint32_t port);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef SCREEN_GFXMODE_H
|
#ifndef _SCREEN_GFXMODE_H
|
||||||
#define SCREEN_GFXMODE_H
|
#define _SCREEN_GFXMODE_H
|
||||||
|
|
||||||
#include <memory/addresses.h>
|
#include <memory/addresses.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
#ifndef SCREEN_GRAPHICS_H
|
#ifndef _SCREEN_GRAPHICS_H
|
||||||
#define SCREEN_GRAPHICS_H
|
#define _SCREEN_GRAPHICS_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define rgb(r,g,b) ( ((r) << 16 | (g) << 8 | (b)) & 0x00ffffff )
|
#define rgb(_r,_g,_b) ( ((_r) << 16 | (_g) << 8 | (_b)) & 0x00ffffff )
|
||||||
|
|
||||||
void drawPixel(int32_t x, int32_t y, uint32_t color);
|
void drawPixel(int32_t x, int32_t y, uint32_t color);
|
||||||
void drawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color);
|
void drawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef SCREEN_TEXT_H
|
#ifndef _SCREEN_TEXT_H
|
||||||
#define SCREEN_TEXT_H
|
#define _SCREEN_TEXT_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef TERMINAL_TERMINAL_H
|
#ifndef _SCREEN_TTY_H
|
||||||
#define TERMINAL_TERMINAL_H
|
#define _SCREEN_TTY_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
#ifndef INTERRUPT_SYSCALLS_H
|
#ifndef _SYSCALLS_SYSCALLS_H
|
||||||
#define INTERRUPT_SYSCALLS_H
|
#define _SYSCALLS_SYSCALLS_H
|
||||||
|
|
||||||
#include <interrupt/isr.h>
|
#include <cpu/isr.h>
|
||||||
|
|
||||||
int sys_exit (intFrame_t* iframe);
|
int sys_exit (intFrame_t* iframe);
|
||||||
int sys_read (intFrame_t* iframe);
|
int sys_read (intFrame_t* iframe);
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
include make.defaults
|
include make.defaults
|
||||||
|
|
||||||
LIBK_ASM=$(LIBK_DIR)/interrupt/isr.s
|
LIBK_ASM=$(LIBK_DIR)/cpu/isr.s
|
||||||
|
|
||||||
$(LIBK): $(LIBK_SRC) $(LIBK_ASM) $(LIBC)
|
$(LIBK): $(LIBK_SRC) $(LIBK_ASM) $(LIBC)
|
||||||
@echo "Building $(LIBK)..."
|
@echo "Building $(LIBK)..."
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
#include <ports/io.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
// Port functions
|
|
||||||
uint8_t inb(uint16_t port) {
|
|
||||||
uint8_t result;
|
|
||||||
__asm__ volatile("inb %1, %0" : "=a"(result) : "Nd"(port));
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void outb(uint16_t port, uint8_t data) {
|
|
||||||
__asm__ volatile("outb %0, %1" :: "a"(data), "Nd"(port));
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t inw(uint16_t port) {
|
|
||||||
uint16_t result;
|
|
||||||
__asm__ volatile("inw %1, %0" : "=a"(result) : "Nd"(port));
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void outw(uint16_t port, uint16_t data) {
|
|
||||||
__asm__ volatile("outw %0, %1" :: "a"(data), "Nd"(port));
|
|
||||||
}
|
|
||||||
|
|
||||||
void ioWait() {
|
|
||||||
// Waits ~1 I/O Cycle (Linux uses this so it should be good)
|
|
||||||
__asm__ volatile("outb %%al, $0x80" : : "a"(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
#include <ports/serial.h>
|
|
||||||
#include <ports/io.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
int setupSerial(uint32_t port) {
|
|
||||||
outb(port + 1, 0x00); // Disable all interrupts
|
|
||||||
outb(port + 3, 0x80); // Enable DLAB (set baud rate divisor)
|
|
||||||
outb(port + 0, 0x03); // Set divisor to 3 (low byte) 38400 baud
|
|
||||||
outb(port + 1, 0x00); // (high byte)
|
|
||||||
outb(port + 3, 0x03); // 8 bits, no parity, one stop bit
|
|
||||||
outb(port + 2, 0xC7); // Enable FIFO, clear them, with 14 byte threshold
|
|
||||||
outb(port + 4, 0x0B); // IRQs enabled, RTS/DSR set
|
|
||||||
outb(port + 4, 0x1E); // Set in loopback mode, test the serial chip
|
|
||||||
outb(port + 0, 0xAE); // Test serial chip (send byte 0xAE and check if it returns)
|
|
||||||
|
|
||||||
if (inb(port + 0) != 0xAE) return 1;
|
|
||||||
outb(port + 4, 0x0F); // non-loopback, IRQs enabled, OUT#1 and OUT#2 bits enabled
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int serialTransmitEmpty(uint32_t port) {
|
|
||||||
return inb(port + 5) & 0x20;
|
|
||||||
}
|
|
||||||
|
|
||||||
int serialRecieved(uint32_t port) {
|
|
||||||
return inb(port + 5) & 0x01;
|
|
||||||
}
|
|
||||||
|
|
||||||
void serialWrite(uint32_t port, char c) {
|
|
||||||
while (serialTransmitEmpty(port) == 0);
|
|
||||||
outb(port, c);
|
|
||||||
}
|
|
||||||
|
|
||||||
void serialPrint(uint32_t port, const char* s) {
|
|
||||||
while (*s != '\0') {
|
|
||||||
if (*s == '\n') serialWrite(port, '\r');
|
|
||||||
serialWrite(port, *s++);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
char serialRead(uint32_t port) {
|
|
||||||
while (serialRecieved(port));
|
|
||||||
return inb(port);
|
|
||||||
}
|
|
||||||
|
|
||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
#include <screen/text.h>
|
#include <screen/text.h>
|
||||||
#include <tty/tty.h>
|
|
||||||
#include <memory/addresses.h>
|
|
||||||
#include <screen/gfxmode.h>
|
#include <screen/gfxmode.h>
|
||||||
|
#include <screen/tty.h>
|
||||||
|
#include <memory/addresses.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include <tty/tty.h>
|
#include <screen/tty.h>
|
||||||
#include <screen/gfxmode.h>
|
#include <screen/gfxmode.h>
|
||||||
#include <screen/text.h>
|
#include <screen/text.h>
|
||||||
#include <memory/addresses.h>
|
#include <memory/addresses.h>
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <sys/gfx.h>
|
#include <sys/gfx.h>
|
||||||
|
|
||||||
console_t* console = (console_t*)TERMINAL_INFO_LOC;
|
console_t* console = (console_t*)CONSOLE_INFO_LOC;
|
||||||
|
|
||||||
int32_t consoleWrite(const void* buf, uint32_t len) { // TODO fix font size
|
int32_t consoleWrite(const void* buf, uint32_t len) { // TODO fix font size
|
||||||
console->width = gfxMode->xRes / 8;//*(uint8_t*)(FONT_LOC);
|
console->width = gfxMode->xRes / 8;//*(uint8_t*)(FONT_LOC);
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#include <syscalls/syscalls.h>
|
#include <syscalls/syscalls.h>
|
||||||
#include <interrupt/isr.h>
|
#include <cpu/isr.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
int sys_close(intFrame_t* iframe) {
|
int sys_close(intFrame_t* iframe) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#include <syscalls/syscalls.h>
|
#include <syscalls/syscalls.h>
|
||||||
#include <interrupt/isr.h>
|
#include <drivers/serial.h>
|
||||||
#include <error/debug.h>
|
#include <cpu/isr.h>
|
||||||
|
|
||||||
int sys_exit(intFrame_t* iframe) {
|
int sys_exit(intFrame_t* iframe) {
|
||||||
debugf("Tried to exit with %d", iframe->eax);
|
debugf("Tried to exit with %d", iframe->eax);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#include <syscalls/syscalls.h>
|
#include <syscalls/syscalls.h>
|
||||||
#include <interrupt/isr.h>
|
|
||||||
#include <memory/malloc.h>
|
#include <memory/malloc.h>
|
||||||
|
#include <cpu/isr.h>
|
||||||
|
|
||||||
int sys_free(intFrame_t* iframe) {
|
int sys_free(intFrame_t* iframe) {
|
||||||
void* ptr = (void*)iframe->ebx;
|
void* ptr = (void*)iframe->ebx;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#include <syscalls/syscalls.h>
|
#include <syscalls/syscalls.h>
|
||||||
#include <interrupt/isr.h>
|
|
||||||
#include <memory/malloc.h>
|
#include <memory/malloc.h>
|
||||||
|
#include <cpu/isr.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
int sys_malloc(intFrame_t* iframe) {
|
int sys_malloc(intFrame_t* iframe) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#include <syscalls/syscalls.h>
|
#include <syscalls/syscalls.h>
|
||||||
#include <interrupt/isr.h>
|
#include <cpu/isr.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
int sys_open(intFrame_t* iframe) {
|
int sys_open(intFrame_t* iframe) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#include <syscalls/syscalls.h>
|
#include <syscalls/syscalls.h>
|
||||||
#include <interrupt/isr.h>
|
#include <cpu/isr.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
int sys_read(intFrame_t* iframe) {
|
int sys_read(intFrame_t* iframe) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#include <syscalls/syscalls.h>
|
#include <syscalls/syscalls.h>
|
||||||
#include <interrupt/isr.h>
|
#include <cpu/isr.h>
|
||||||
|
|
||||||
int sys_seek(intFrame_t* iframe) {
|
int sys_seek(intFrame_t* iframe) {
|
||||||
// TODO
|
// TODO
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#include <syscalls/syscalls.h>
|
#include <syscalls/syscalls.h>
|
||||||
#include <interrupt/isr.h>
|
|
||||||
#include <memory/addresses.h>
|
#include <memory/addresses.h>
|
||||||
|
#include <cpu/isr.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
int sys_sleep(intFrame_t* iframe) {
|
int sys_sleep(intFrame_t* iframe) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#include <syscalls/syscalls.h>
|
#include <syscalls/syscalls.h>
|
||||||
#include <tty/tty.h>
|
#include <screen/tty.h>
|
||||||
#include <interrupt/isr.h>
|
#include <cpu/isr.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
int sys_write(intFrame_t* iframe) {
|
int sys_write(intFrame_t* iframe) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#include <syscalls/syscalls.h>
|
#include <syscalls/syscalls.h>
|
||||||
#include <interrupt/isr.h>
|
#include <drivers/serial.h>
|
||||||
#include <error/debug.h>
|
#include <cpu/isr.h>
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
|
|
||||||
// System call table
|
// System call table
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
# Main kern makefile
|
# Main kern makefile
|
||||||
#
|
#
|
||||||
|
|
||||||
export VERSION = 0.2.1
|
export VERSION = 0.2.2
|
||||||
|
|
||||||
# Configurable variables (eg. CC, CFLAGS, ...)
|
# Configurable variables (eg. CC, CFLAGS, ...)
|
||||||
include make.defaults
|
include make.defaults
|
||||||
|
|||||||
@@ -58,18 +58,14 @@ Legend:
|
|||||||
- [ ] types.h (syscall types)
|
- [ ] types.h (syscall types)
|
||||||
- [ ] gfx.h (basic graphics lib)
|
- [ ] gfx.h (basic graphics lib)
|
||||||
|
|
||||||
- [ ] LIBK
|
- [x] LIBK
|
||||||
- [x] disk - disk r/w
|
- [x] drivers - everything that works with hardware
|
||||||
- [ ] error - error handling (bigerr is not enough :( )
|
- [x] error - error handling (bigerr is not enough :( )
|
||||||
- [ ] fs - filesystem
|
- [x] fs - filesystem
|
||||||
- [x] interrupt - handling and registering interupts
|
- [x] interrupt - handling and registering interupts
|
||||||
- [ ] input - handle ALL input devices (currently implemented as the keyboard dir)
|
|
||||||
- [x] memory - memory managing (physical and virtual)
|
- [x] memory - memory managing (physical and virtual)
|
||||||
- [x] ports - handles IO ports (eg. serial console)
|
|
||||||
- [x] screen - everything that displays on the screen
|
- [x] screen - everything that displays on the screen
|
||||||
- [x] sound - handles everything related to sound
|
|
||||||
- [x] syscall - system calls
|
- [x] syscall - system calls
|
||||||
- [x] tty - handles terminal output
|
|
||||||
|
|
||||||
- [x] Multistage Bootloader
|
- [x] Multistage Bootloader
|
||||||
- [x] Bootloader reads filesystem to find files
|
- [x] Bootloader reads filesystem to find files
|
||||||
|
|||||||
Reference in New Issue
Block a user