refactoring
This commit is contained in:
parent
e6bec1afcd
commit
7a912d1b66
52 changed files with 563 additions and 693 deletions
4
.env
4
.env
|
@ -1,4 +1,4 @@
|
||||||
ARCH = i386
|
ARCH = i686
|
||||||
FORMAT = elf
|
FORMAT = elf
|
||||||
CC = $(ARCH)-$(FORMAT)-gcc
|
CC = $(ARCH)-$(FORMAT)-gcc
|
||||||
LD = $(ARCH)-$(FORMAT)-ld
|
LD = $(ARCH)-$(FORMAT)-ld
|
||||||
|
@ -8,4 +8,4 @@ AR = ar
|
||||||
CFLAGS = -ffreestanding -m32 -O2 -Wall -Wextra -pedantic # -DKERNEL_LOG
|
CFLAGS = -ffreestanding -m32 -O2 -Wall -Wextra -pedantic # -DKERNEL_LOG
|
||||||
LDFLAGS = -nostdlib
|
LDFLAGS = -nostdlib
|
||||||
|
|
||||||
QEMU = qemu-system-$(ARCH)
|
QEMU = qemu-system-i386
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
include ../.env
|
include ../.env
|
||||||
|
|
||||||
C_SRC = $(shell find src -type f -name "*.c")
|
C_SRC = $(shell find src -type f -name "*.c" -not -path "src/arch/*")
|
||||||
|
C_SRC += $(shell find src/arch/$(ARCH) -type f -name "*.c")
|
||||||
C_OBJ = $(patsubst %.c,bin/%.o, $(C_SRC))
|
C_OBJ = $(patsubst %.c,bin/%.o, $(C_SRC))
|
||||||
|
|
||||||
ASM_SRC = $(shell find src -type f -name "*.asm")
|
ASM_SRC = $(shell find src -type f -name "*.asm" -not -path "src/arch/*")
|
||||||
|
ASM_SRC += $(shell find src/arch/$(ARCH) -type f -name "*.asm")
|
||||||
ASM_OBJ = $(patsubst %.asm,bin/%.asm.o, $(ASM_SRC))
|
ASM_OBJ = $(patsubst %.asm,bin/%.asm.o, $(ASM_SRC))
|
||||||
|
|
||||||
CFLAGS += -Iinclude -Isrc -I../libk/include -std=gnu17
|
CFLAGS += -Iinclude -Isrc -I../libk/include -std=gnu17
|
||||||
|
@ -22,7 +24,7 @@ $(ASM_OBJ): bin/%.asm.o : %.asm
|
||||||
|
|
||||||
bin/kernel.bin: $(C_OBJ) $(ASM_OBJ)
|
bin/kernel.bin: $(C_OBJ) $(ASM_OBJ)
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
$(LD) -o bin/kernel.bin -T linker.ld $(C_OBJ) $(ASM_OBJ) ../libk/bin/libk.a $(LDFLAGS)
|
$(LD) -o bin/kernel.bin -T arch/$(ARCH)/linker.ld $(C_OBJ) $(ASM_OBJ) ../libk/bin/libk.a $(LDFLAGS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -fr bin
|
rm -fr bin
|
||||||
|
|
|
@ -6,12 +6,10 @@ SECTIONS {
|
||||||
|
|
||||||
kernel_start = .;
|
kernel_start = .;
|
||||||
|
|
||||||
.multiboot.data : {
|
.bootstrap : {
|
||||||
*(.multiboot.data)
|
*(.bootstrap.data)
|
||||||
}
|
*(.bootstrap.stack)
|
||||||
|
*(.bootstrap.text)
|
||||||
.multiboot.text : {
|
|
||||||
*(.multiboot.text)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
. += 0xC0000000;
|
. += 0xC0000000;
|
||||||
|
@ -32,7 +30,7 @@ SECTIONS {
|
||||||
{
|
{
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
*(.bss)
|
*(.bss)
|
||||||
*(.bootstrap_stack)
|
*(.stack)
|
||||||
}
|
}
|
||||||
|
|
||||||
kernel_end = .;
|
kernel_end = .;
|
|
@ -102,5 +102,5 @@ struct FixedACPIDescriptionTable {
|
||||||
struct GenericAddressStructure x_gpe1_block;
|
struct GenericAddressStructure x_gpe1_block;
|
||||||
};
|
};
|
||||||
|
|
||||||
void acpi_init(void);
|
void acpi_init(void *rsdp);
|
||||||
void acpi_poweroff(void);
|
void acpi_poweroff(void);
|
13
kernel/include/arch/i686/asm.h
Normal file
13
kernel/include/arch/i686/asm.h
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
extern uint8_t inb(uint16_t port);
|
||||||
|
extern void outb(uint16_t port, uint8_t val);
|
||||||
|
extern uint16_t inw(uint16_t port);
|
||||||
|
extern void outw(uint16_t port, uint16_t val);
|
||||||
|
extern uint32_t inl(uint16_t port);
|
||||||
|
extern void outl(uint16_t port, uint32_t val);
|
||||||
|
extern void io_wait(void);
|
||||||
|
extern void int_enable(void);
|
||||||
|
extern void int_disable(void);
|
||||||
|
extern void int_wait(void);
|
||||||
|
extern void halt(void);
|
7
kernel/include/arch/i686/drivers/rtc.h
Normal file
7
kernel/include/arch/i686/drivers/rtc.h
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
extern void rtc_update(void);
|
||||||
|
extern struct Time rtc_utctime(void);
|
||||||
|
extern struct Time rtc_localtime(enum Timezone tz);
|
6
kernel/include/arch/i686/idt.h
Normal file
6
kernel/include/arch/i686/idt.h
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define IDT_SIZE 256
|
||||||
|
#define IDT_INTERRUPTS 256
|
||||||
|
|
||||||
|
void idt_init(void);
|
|
@ -2,9 +2,8 @@
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <arch/i686/mboot.h>
|
||||||
#include "acpi/acpi.h"
|
#include <arch/i686/memory.h>
|
||||||
#include "memory/memory.h"
|
|
||||||
|
|
||||||
#define CMDLINE_MAX 32
|
#define CMDLINE_MAX 32
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#define PIC_REMAP_OFFSET 0x20
|
#define PIC_REMAP_OFFSET 0x20
|
||||||
|
|
||||||
void pic_remap(uint8_t offset);
|
void pic_remap(void);
|
||||||
void pic_mask(int irq);
|
void pic_mask(int irq);
|
||||||
void pic_unmask(int irq);
|
void pic_unmask(int irq);
|
||||||
void pic_disable(void);
|
void pic_disable(void);
|
32
kernel/include/drivers/vga.h
Normal file
32
kernel/include/drivers/vga.h
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
enum vga_color {
|
||||||
|
VGA_BLACK = 0,
|
||||||
|
VGA_BLUE = 1,
|
||||||
|
VGA_GREEN = 2,
|
||||||
|
VGA_CYAN = 3,
|
||||||
|
VGA_RED = 4,
|
||||||
|
VGA_MAGENTA = 5,
|
||||||
|
VGA_BROWN = 6,
|
||||||
|
VGA_LIGHT_GREY = 7,
|
||||||
|
VGA_DARK_GREY = 8,
|
||||||
|
VGA_LIGHT_BLUE = 9,
|
||||||
|
VGA_LIGHT_GREEN = 10,
|
||||||
|
VGA_LIGHT_CYAN = 11,
|
||||||
|
VGA_LIGHT_RED = 12,
|
||||||
|
VGA_LIGHT_MAGENTA = 13,
|
||||||
|
VGA_LIGHT_BROWN = 14,
|
||||||
|
VGA_WHITE = 15,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define VGA_TEXT_W 80
|
||||||
|
#define VGA_TEXT_H 25
|
||||||
|
|
||||||
|
void vgatext_write_char(char c, enum vga_color color, uint8_t x, uint8_t y);
|
||||||
|
void vgatext_write_data(uint16_t data, uint16_t index);
|
||||||
|
void vgatext_write_buf(const uint16_t *buffer);
|
||||||
|
void vgatext_cur_mov(uint8_t x, uint8_t y);
|
||||||
|
void vgatext_cur_resize(uint8_t start, uint8_t end);
|
||||||
|
void vgatext_cur_visible(bool visible);
|
6
kernel/include/memory.h
Normal file
6
kernel/include/memory.h
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
extern int memory_lock(void);
|
||||||
|
extern int memory_unlock(void);
|
||||||
|
extern void *memory_alloc_page(int);
|
||||||
|
extern int memory_free_page(void* ,int);
|
|
@ -7,17 +7,3 @@ extern void putchar(int c);
|
||||||
extern void puts(const char* s);
|
extern void puts(const char* s);
|
||||||
extern void printk(const char *restrict format, ...);
|
extern void printk(const char *restrict format, ...);
|
||||||
extern void vprintk(const char *restrict format, va_list ap);
|
extern void vprintk(const char *restrict format, va_list ap);
|
||||||
|
|
||||||
#ifdef KERNEL_LOG
|
|
||||||
#define debugk(msg, ...) _debugk_impl(msg, ## __VA_ARGS__)
|
|
||||||
#define succek(msg, ...) _succek_impl(msg, ## __VA_ARGS__)
|
|
||||||
#define errork(msg, ...) _errork_impl(msg, ## __VA_ARGS__)
|
|
||||||
#else
|
|
||||||
#define debugk(msg, ...)
|
|
||||||
#define succek(msg, ...)
|
|
||||||
#define errork(msg, ...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern void _debugk_impl(char* msg, ...);
|
|
||||||
extern void _succek_impl(char* msg, ...);
|
|
||||||
extern void _errork_impl(char* msg, ...);
|
|
||||||
|
|
10
kernel/include/sys.h
Normal file
10
kernel/include/sys.h
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
extern void arch_init(void *boot_info);
|
||||||
|
extern void arch_update(void);
|
||||||
|
extern void arch_halt(void);
|
||||||
|
extern void arch_wait_io(void);
|
||||||
|
extern void arch_wait_int(void);
|
||||||
|
extern void arch_disable_int(void);
|
||||||
|
extern void arch_enable_int(void);
|
||||||
|
extern void arch_poweroff(void);
|
|
@ -2,18 +2,15 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <drivers/vga.h>
|
||||||
|
|
||||||
#include "color.h"
|
#define TERM_W VGA_TEXT_W
|
||||||
|
#define TERM_H VGA_TEXT_H
|
||||||
#define TERM_W 80
|
|
||||||
#define TERM_H 25
|
|
||||||
|
|
||||||
void term_init(void);
|
void term_init(void);
|
||||||
|
|
||||||
void term_reset(void);
|
void term_reset(void);
|
||||||
void term_setfg(enum VGAColor color);
|
void term_setfg(enum vga_color color);
|
||||||
void term_setbg(enum VGAColor color);
|
void term_setbg(enum vga_color color);
|
||||||
|
|
||||||
void term_clear(void);
|
void term_clear(void);
|
||||||
void term_scroll(int lines);
|
void term_scroll(int lines);
|
||||||
void term_setpos(uint8_t x, uint8_t y);
|
void term_setpos(uint8_t x, uint8_t y);
|
|
@ -16,10 +16,25 @@ struct Time {
|
||||||
int leap; /// If year is a leap year (True == 1)
|
int leap; /// If year is a leap year (True == 1)
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void rtc_update(void);
|
enum Timezone {
|
||||||
extern void rtc_set_timezone(int offset);
|
UTC = 0,
|
||||||
extern struct Time *rtc_utctime(void);
|
EST = -4
|
||||||
extern struct Time *rtc_localtime(void);
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the current timezone
|
||||||
|
*/
|
||||||
|
extern void set_timezone(enum Timezone tz);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns current time in UTC
|
||||||
|
*/
|
||||||
|
extern struct Time get_utctime(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns current time from current Timezone
|
||||||
|
*/
|
||||||
|
extern struct Time get_localtime(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the time into a string format
|
* Converts the time into a string format
|
||||||
|
|
|
@ -3,11 +3,10 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <sys.h>
|
#include <arch/i686/acpi.h>
|
||||||
|
#include <arch/i686/asm.h>
|
||||||
|
|
||||||
#include "acpi.h"
|
extern uintptr_t KERNEL_MAPPING;
|
||||||
#include "boot/tag.h"
|
|
||||||
#include "print.h"
|
|
||||||
|
|
||||||
static struct RootSystemDescriptionTable *rsdt;
|
static struct RootSystemDescriptionTable *rsdt;
|
||||||
static struct FixedACPIDescriptionTable *fadt;
|
static struct FixedACPIDescriptionTable *fadt;
|
||||||
|
@ -17,9 +16,7 @@ static uint16_t SLP_TYPb;
|
||||||
static uint16_t SLP_EN;
|
static uint16_t SLP_EN;
|
||||||
static uint16_t SCI_EN;
|
static uint16_t SCI_EN;
|
||||||
|
|
||||||
static bool is_init = false;
|
static bool checksum(uint8_t *data, size_t len) {
|
||||||
|
|
||||||
bool checksum(uint8_t *data, size_t len) {
|
|
||||||
unsigned char sum = 0;
|
unsigned char sum = 0;
|
||||||
for (size_t i = 0; i < len; i++)
|
for (size_t i = 0; i < len; i++)
|
||||||
sum += data[i];
|
sum += data[i];
|
||||||
|
@ -39,7 +36,7 @@ static void *find_fadt(void) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int read_s5_addr(void) {
|
static void read_s5_addr(void) {
|
||||||
uintptr_t ptr = fadt->dsdt;
|
uintptr_t ptr = fadt->dsdt;
|
||||||
char *s5_addr = (void*) (ptr + 36);
|
char *s5_addr = (void*) (ptr + 36);
|
||||||
|
|
||||||
|
@ -69,73 +66,41 @@ static int read_s5_addr(void) {
|
||||||
SCI_EN = 1;
|
SCI_EN = 1;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
errork("\\_S5 parse error.");
|
panic("\\_S5 parse error.");
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
errork("\\_S5 not present.");
|
panic("\\_S5 not present.");
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void acpi_init(void) {
|
void acpi_init(void *ptr) {
|
||||||
|
|
||||||
is_init = false;
|
struct RootSystemDescriptionPointer *rsdp = ptr;
|
||||||
|
|
||||||
debugk("Loading ACPI");
|
|
||||||
|
|
||||||
struct BootTag *tag;
|
|
||||||
if(!get_boot_tag(ID_RSDP, &tag)) {
|
|
||||||
errork("Could not find RSDP");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
debugk("Loading RSDT");
|
|
||||||
|
|
||||||
struct RootSystemDescriptionPointer *rsdp = tag->data.rsdp;
|
|
||||||
if (!checksum((uint8_t*) rsdp, sizeof(struct RootSystemDescriptionPointer))) {
|
if (!checksum((uint8_t*) rsdp, sizeof(struct RootSystemDescriptionPointer))) {
|
||||||
errork("RSDP checksum failed to validate");
|
panic("RSDP checksum failed to validate");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uintptr_t rsdt_ptr = rsdp->rsdt_address;
|
uintptr_t rsdt_ptr = rsdp->rsdt_address;
|
||||||
rsdt = (void *) rsdt_ptr;
|
rsdt = (void *) rsdt_ptr;
|
||||||
if (!checksum((uint8_t*) &rsdt->header, rsdt->header.length)) {
|
if (!checksum((uint8_t*) &rsdt->header, rsdt->header.length)) {
|
||||||
errork("RSDT checksum failed to validate");
|
panic("RSDT checksum failed to validate");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
debugk("Loading FADT");
|
|
||||||
|
|
||||||
fadt = find_fadt();
|
fadt = find_fadt();
|
||||||
if (fadt == NULL) {
|
if (fadt == NULL) {
|
||||||
errork("Could not find FADT");
|
panic("Could not find FADT");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!checksum((uint8_t*) &fadt->header, fadt->header.length)) {
|
if (!checksum((uint8_t*) &fadt->header, fadt->header.length)) {
|
||||||
errork("FADT checksum failed to validate");
|
panic("FADT checksum failed to validate");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
debugk("Reading \\_S5 Addr");
|
read_s5_addr();
|
||||||
|
|
||||||
if (read_s5_addr()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
outb(fadt->smi_command_port,fadt->acpi_enable);
|
outb(fadt->smi_command_port,fadt->acpi_enable);
|
||||||
|
|
||||||
succek("ACPI has been loaded");
|
|
||||||
is_init = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void acpi_poweroff(void) {
|
void acpi_poweroff(void) {
|
||||||
if (is_init) {
|
|
||||||
outw((unsigned int) fadt->pm1_a_control_block, SLP_TYPb | SLP_EN);
|
outw((unsigned int) fadt->pm1_a_control_block, SLP_TYPb | SLP_EN);
|
||||||
panic("failed to shutdown");
|
panic("failed to shutdown");
|
||||||
} else {
|
|
||||||
errork("Cannot shutdown, ACPI not loaded");
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -1,51 +1,51 @@
|
||||||
#include <stdint.h>
|
#include <arch/i686/asm.h>
|
||||||
|
|
||||||
static inline uint8_t inb(uint16_t port) {
|
uint8_t inb(uint16_t port) {
|
||||||
uint8_t ret;
|
uint8_t ret;
|
||||||
__asm__ volatile ("inb %1, %0" : "=a"(ret) : "Nd"(port));
|
__asm__ volatile ("inb %1, %0" : "=a"(ret) : "Nd"(port));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void outb(uint16_t port, uint8_t val) {
|
void outb(uint16_t port, uint8_t val) {
|
||||||
__asm__ volatile ("outb %0, %1" : : "a"(val), "Nd"(port));
|
__asm__ volatile ("outb %0, %1" : : "a"(val), "Nd"(port));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint16_t inw(uint16_t port) {
|
uint16_t inw(uint16_t port) {
|
||||||
uint16_t ret;
|
uint16_t ret;
|
||||||
__asm__ volatile ("inw %1, %0" : "=a"(ret) : "Nd"(port));
|
__asm__ volatile ("inw %1, %0" : "=a"(ret) : "Nd"(port));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void outw(uint16_t port, uint16_t val) {
|
void outw(uint16_t port, uint16_t val) {
|
||||||
__asm__ volatile ("outw %0, %1" : : "a"(val), "Nd"(port));
|
__asm__ volatile ("outw %0, %1" : : "a"(val), "Nd"(port));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t inl(uint16_t port) {
|
uint32_t inl(uint16_t port) {
|
||||||
uint32_t ret;
|
uint32_t ret;
|
||||||
__asm__ volatile ("inl %1, %0" : "=a"(ret) : "Nd"(port));
|
__asm__ volatile ("inl %1, %0" : "=a"(ret) : "Nd"(port));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void outl(uint16_t port, uint32_t val) {
|
void outl(uint16_t port, uint32_t val) {
|
||||||
__asm__ volatile ("outl %0, %1" : : "a"(val), "Nd"(port));
|
__asm__ volatile ("outl %0, %1" : : "a"(val), "Nd"(port));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void io_wait(void) {
|
void io_wait(void) {
|
||||||
outb(0x80, 0);
|
outb(0x80, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void int_enable(void) {
|
void int_enable(void) {
|
||||||
__asm__ volatile ("sti");
|
__asm__ volatile ("sti");
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void int_disable(void) {
|
void int_disable(void) {
|
||||||
__asm__ volatile ("cli");
|
__asm__ volatile ("cli");
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void int_wait(void) {
|
void int_wait(void) {
|
||||||
__asm__ volatile ("sti; hlt");
|
__asm__ volatile ("sti; hlt");
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void halt(void) {
|
void halt(void) {
|
||||||
__asm__ volatile ("cli; hlt");
|
__asm__ volatile ("cli; hlt");
|
||||||
}
|
}
|
|
@ -1,9 +1,7 @@
|
||||||
#include <panic.h>
|
#include <panic.h>
|
||||||
#include <sys.h>
|
#include <arch/i686/drivers/ps2ctrl.h>
|
||||||
|
#include <arch/i686/pic.h>
|
||||||
#include "print.h"
|
#include <arch/i686/asm.h>
|
||||||
#include "ps2ctrl.h"
|
|
||||||
#include "interrupt/pic.h"
|
|
||||||
|
|
||||||
#define STATUS_OUT_BUF ((uint8_t)0x01)
|
#define STATUS_OUT_BUF ((uint8_t)0x01)
|
||||||
#define STATUS_IN_BUF ((uint8_t)0x02)
|
#define STATUS_IN_BUF ((uint8_t)0x02)
|
|
@ -1,10 +1,8 @@
|
||||||
#include <panic.h>
|
#include <panic.h>
|
||||||
#include <sys.h>
|
#include <arch/i686/drivers/ps2ctrl.h>
|
||||||
|
#include <arch/i686/pic.h>
|
||||||
#include "print.h"
|
#include <arch/i686/asm.h>
|
||||||
#include "ps2kb.h"
|
#include <drivers/ps2kb.h>
|
||||||
#include "ps2ctrl.h"
|
|
||||||
#include "interrupt/pic.h"
|
|
||||||
|
|
||||||
#define BUFFER_LEN 16
|
#define BUFFER_LEN 16
|
||||||
|
|
|
@ -1,12 +1,8 @@
|
||||||
#include <panic.h>
|
#include <panic.h>
|
||||||
#include <stdbool.h>
|
#include <arch/i686/drivers/ps2ctrl.h>
|
||||||
#include <string.h>
|
#include <arch/i686/pic.h>
|
||||||
#include <sys.h>
|
#include <arch/i686/asm.h>
|
||||||
|
#include <drivers/ps2mouse.h>
|
||||||
#include "print.h"
|
|
||||||
#include "ps2mouse.h"
|
|
||||||
#include "drivers/ps2ctrl.h"
|
|
||||||
#include "interrupt/pic.h"
|
|
||||||
|
|
||||||
static bool is_init = false;
|
static bool is_init = false;
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
#include "print.h"
|
#include "time.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <sys.h>
|
#include <sys.h>
|
||||||
#include <time.h>
|
#include <arch/i686/drivers/rtc.h>
|
||||||
|
#include <arch/i686/asm.h>
|
||||||
|
|
||||||
#define CMOS_WRITE_PORT 0x70
|
#define CMOS_WRITE_PORT 0x70
|
||||||
#define CMOS_READ_PORT 0x71
|
#define CMOS_READ_PORT 0x71
|
||||||
|
@ -15,9 +16,16 @@
|
||||||
#define CMOS_REG_YEAR 0x09
|
#define CMOS_REG_YEAR 0x09
|
||||||
#define CMOS_REG_CEN 0x32
|
#define CMOS_REG_CEN 0x32
|
||||||
|
|
||||||
|
// Live buffers to work on data
|
||||||
static struct Time time;
|
static struct Time time;
|
||||||
static struct Time localtime;
|
static struct Time localtime;
|
||||||
static int cur_offset = 0;
|
|
||||||
|
// Front buffers so interupts dont request data that is half done
|
||||||
|
static struct Time cur_time;
|
||||||
|
static struct Time cur_localtime;
|
||||||
|
|
||||||
|
// Current set Time Zone
|
||||||
|
static enum Timezone last_timezone = UTC;
|
||||||
|
|
||||||
static uint8_t cmos_read(uint8_t reg) {
|
static uint8_t cmos_read(uint8_t reg) {
|
||||||
uint8_t hex, ret;
|
uint8_t hex, ret;
|
||||||
|
@ -46,9 +54,11 @@ static void update_localtime(void) {
|
||||||
// set localtime
|
// set localtime
|
||||||
localtime = time;
|
localtime = time;
|
||||||
|
|
||||||
// do we acutally need to do anything
|
// if tz is UTC, we dont need to do anythin
|
||||||
if (cur_offset == 0) return;
|
if (last_timezone == UTC) {
|
||||||
localtime.hour += cur_offset;
|
cur_localtime = localtime;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// check if day rolled over
|
// check if day rolled over
|
||||||
change = localtime.hour < 0 ? -1 : localtime.hour >= 24 ? 1 : 0;
|
change = localtime.hour < 0 ? -1 : localtime.hour >= 24 ? 1 : 0;
|
||||||
|
@ -99,10 +109,8 @@ year:
|
||||||
|
|
||||||
localtime.year -= 1900;
|
localtime.year -= 1900;
|
||||||
|
|
||||||
}
|
cur_localtime = localtime;
|
||||||
|
|
||||||
void rtc_set_timezone(int offset) {
|
|
||||||
cur_offset = offset;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_update(void) {
|
void rtc_update(void) {
|
||||||
|
@ -127,12 +135,18 @@ void rtc_update(void) {
|
||||||
time.year -= 1900;
|
time.year -= 1900;
|
||||||
|
|
||||||
update_localtime();
|
update_localtime();
|
||||||
|
|
||||||
|
cur_time = time;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Time *rtc_utctime(void) {
|
struct Time rtc_utctime(void) {
|
||||||
return &time;
|
return cur_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Time *rtc_localtime(void) {
|
struct Time rtc_localtime(enum Timezone tz) {
|
||||||
return &localtime;
|
if (tz != last_timezone) {
|
||||||
|
last_timezone = tz;
|
||||||
|
update_localtime();
|
||||||
|
}
|
||||||
|
return cur_localtime;
|
||||||
}
|
}
|
50
kernel/src/arch/i686/drivers/vga.c
Normal file
50
kernel/src/arch/i686/drivers/vga.c
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
#include <arch/i686/asm.h>
|
||||||
|
#include <drivers/vga.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
static uint16_t *buffer = (uint16_t*) 0xC03FF000;
|
||||||
|
static uint8_t start, end;
|
||||||
|
|
||||||
|
void vgatext_write(char c, enum vga_color color, uint8_t x, uint8_t y) {
|
||||||
|
const size_t index = y * VGA_TEXT_W + x;
|
||||||
|
buffer[index] = c | (uint16_t) color << 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vgatext_write_data(uint16_t data, uint16_t index) {
|
||||||
|
buffer[index] = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vgatext_write_buf(const uint16_t *src) {
|
||||||
|
memcpy(buffer, src, VGA_TEXT_W * VGA_TEXT_H * sizeof(uint16_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
void vgatext_cur_mov(uint8_t x, uint8_t y) {
|
||||||
|
; const uint16_t pos = y * VGA_TEXT_W + x;
|
||||||
|
|
||||||
|
outb(0x3D4, 0x0F);
|
||||||
|
outb(0x3D5, (uint8_t) (pos & 0xFF));
|
||||||
|
outb(0x3D4, 0x0E);
|
||||||
|
outb(0x3D5, (uint8_t) ((pos >> 8) & 0xFF));
|
||||||
|
}
|
||||||
|
|
||||||
|
void vgatext_cur_resize(uint8_t s, uint8_t e) {
|
||||||
|
start = s;
|
||||||
|
end = e;
|
||||||
|
|
||||||
|
outb(0x3D4, 0x0A);
|
||||||
|
outb(0x3D5, (inb(0x3D5) & 0xC0) | start);
|
||||||
|
|
||||||
|
outb(0x3D4, 0x0B);
|
||||||
|
outb(0x3D5, (inb(0x3D5) & 0xE0) | end);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vgatext_cur_visible(bool visible) {
|
||||||
|
if (visible) {
|
||||||
|
vgatext_cur_resize(start, end);
|
||||||
|
} else {
|
||||||
|
outb(0x3D4, 0x0A);
|
||||||
|
outb(0x3D5, 0x20);
|
||||||
|
}
|
||||||
|
}
|
42
kernel/src/arch/i686/gdt.asm
Normal file
42
kernel/src/arch/i686/gdt.asm
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
global load_gdt
|
||||||
|
|
||||||
|
%macro gdt_entry 4
|
||||||
|
db %2 & 0xff
|
||||||
|
db (%2 >> 8) & 0xff
|
||||||
|
db %1 & 0xff
|
||||||
|
db (%1 >> 8) & 0xff
|
||||||
|
db (%1 >> 16) & 0xff
|
||||||
|
db %3
|
||||||
|
db ((%2 >> 16) & 0x0f) | (%4 << 4)
|
||||||
|
db (%1 >> 24) & 0xff
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
section .rodata
|
||||||
|
align 16
|
||||||
|
gdt_start:
|
||||||
|
gdt_entry 0, 0, 0, 0
|
||||||
|
gdt_entry 0, 0xFFFFF, 0x9A, 0xC
|
||||||
|
gdt_entry 0, 0xFFFFF, 0x92, 0xC
|
||||||
|
gdt_end:
|
||||||
|
gdt_descriptor:
|
||||||
|
dw gdt_end - gdt_start - 1
|
||||||
|
dd gdt_start
|
||||||
|
|
||||||
|
|
||||||
|
section .text
|
||||||
|
align 8
|
||||||
|
load_gdt:
|
||||||
|
cli
|
||||||
|
lgdt [gdt_descriptor]
|
||||||
|
mov eax, cr0
|
||||||
|
or al, 1
|
||||||
|
mov cr0, eax
|
||||||
|
mov ax, 0x10
|
||||||
|
mov ds, ax
|
||||||
|
mov ss, ax
|
||||||
|
mov es, ax
|
||||||
|
mov fs, ax
|
||||||
|
mov gs, ax
|
||||||
|
jmp 0x08:after_gdt
|
||||||
|
after_gdt:
|
||||||
|
ret
|
|
@ -5,16 +5,42 @@
|
||||||
#include <sys.h>
|
#include <sys.h>
|
||||||
#include <print.h>
|
#include <print.h>
|
||||||
#include <panic.h>
|
#include <panic.h>
|
||||||
|
#include <arch/i686/pic.h>
|
||||||
|
#include <arch/i686/idt.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <drivers/ps2kb.h>
|
||||||
|
#include <drivers/ps2mouse.h>
|
||||||
|
|
||||||
#include "acpi/acpi.h"
|
|
||||||
#include "drivers/ps2kb.h"
|
|
||||||
#include "drivers/ps2mouse.h"
|
|
||||||
#include "time.h"
|
|
||||||
#include "tty/color.h"
|
|
||||||
#include "idt.h"
|
|
||||||
#include "pic.h"
|
|
||||||
#include "tty/term.h"
|
#include "tty/term.h"
|
||||||
|
|
||||||
|
struct IdtEntry {
|
||||||
|
uint16_t isr_low;
|
||||||
|
uint16_t kernel_cs;
|
||||||
|
uint8_t _reserved;
|
||||||
|
uint8_t attributes;
|
||||||
|
uint16_t isr_high;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct Idtr {
|
||||||
|
uint16_t limit;
|
||||||
|
uint32_t base;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
enum IDTFlags {
|
||||||
|
IDT_FLAG_GATE_TASK = 0x5,
|
||||||
|
IDT_FLAG_GATE_16BIT_INT = 0x6,
|
||||||
|
IDT_FLAG_GATE_16BIT_TRAP = 0x7,
|
||||||
|
IDT_FLAG_GATE_32BIT_INT = 0xE,
|
||||||
|
IDT_FLAG_GATE_32BIT_TRAP = 0xF,
|
||||||
|
|
||||||
|
IDT_FLAG_RING0 = (0 << 5),
|
||||||
|
IDT_FLAG_RING1 = (1 << 5),
|
||||||
|
IDT_FLAG_RING2 = (2 << 5),
|
||||||
|
IDT_FLAG_RING3 = (3 << 5),
|
||||||
|
|
||||||
|
IDT_FLAG_PRESENT = 0x80,
|
||||||
|
};
|
||||||
|
|
||||||
#define WIDTH 30
|
#define WIDTH 30
|
||||||
static char buf[WIDTH];
|
static char buf[WIDTH];
|
||||||
static int timer = -1;
|
static int timer = -1;
|
||||||
|
@ -35,7 +61,8 @@ void idt_pic_timer(void) {
|
||||||
for (size_t i = 0; i < WIDTH; i++) putchar(' ');
|
for (size_t i = 0; i < WIDTH; i++) putchar(' ');
|
||||||
term_setpos(TERM_W - WIDTH - 1, 0);
|
term_setpos(TERM_W - WIDTH - 1, 0);
|
||||||
|
|
||||||
timetostr(rtc_localtime(), "%a %b %d %Y %H:%M:%S", buf, WIDTH);
|
struct Time t = get_localtime();
|
||||||
|
timetostr(&t, "%a %b %d %Y %H:%M:%S", buf, WIDTH);
|
||||||
printk("%s", buf);
|
printk("%s", buf);
|
||||||
|
|
||||||
term_load(state);
|
term_load(state);
|
||||||
|
@ -101,9 +128,6 @@ static void set_descriptor(uint8_t vector, void* isr, uint8_t flags) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void idt_init(void) {
|
void idt_init(void) {
|
||||||
|
|
||||||
debugk("Loading IDT");
|
|
||||||
|
|
||||||
idtr.base = (uintptr_t)&idt[0];
|
idtr.base = (uintptr_t)&idt[0];
|
||||||
idtr.limit = (uint16_t)sizeof(struct IdtEntry) * IDT_SIZE - 1;
|
idtr.limit = (uint16_t)sizeof(struct IdtEntry) * IDT_SIZE - 1;
|
||||||
|
|
||||||
|
@ -112,7 +136,5 @@ void idt_init(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
__asm__ volatile ("lidt %0" : : "m"(idtr));
|
__asm__ volatile ("lidt %0" : : "m"(idtr));
|
||||||
|
|
||||||
succek("IDT has been loaded");
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
#include <panic.h>
|
#include <panic.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <arch/i686/mboot.h>
|
||||||
#include "print.h"
|
#include <arch/i686/memory.h>
|
||||||
#include "tag.h"
|
#include <arch/i686/acpi.h>
|
||||||
#include "acpi/acpi.h"
|
|
||||||
#include "memory/memory.h"
|
|
||||||
|
|
||||||
static struct BootInfo info;
|
static struct BootInfo info;
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys.h>
|
#include <sys.h>
|
||||||
#include <panic.h>
|
#include <panic.h>
|
||||||
|
#include <arch/i686/memory.h>
|
||||||
#include "memory.h"
|
#include <arch/i686/mboot.h>
|
||||||
#include "boot/tag.h"
|
|
||||||
#include "print.h"
|
|
||||||
|
|
||||||
struct MemoryArea {
|
struct MemoryArea {
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
|
@ -25,12 +24,12 @@ static uint32_t page_free_start;
|
||||||
static struct MemoryArea *page_start;
|
static struct MemoryArea *page_start;
|
||||||
|
|
||||||
int memory_lock(void) {
|
int memory_lock(void) {
|
||||||
int_disable();
|
// int_disable();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int memory_unlock(void) {
|
int memory_unlock(void) {
|
||||||
int_enable();
|
// int_enable();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,8 +113,6 @@ int memory_free_page(void *ptr, int pages) {
|
||||||
|
|
||||||
void memory_init(void) {
|
void memory_init(void) {
|
||||||
|
|
||||||
debugk("Loading memory pages");
|
|
||||||
|
|
||||||
memory_lock();
|
memory_lock();
|
||||||
|
|
||||||
bitmap = NULL;
|
bitmap = NULL;
|
||||||
|
@ -185,8 +182,6 @@ void memory_init(void) {
|
||||||
|
|
||||||
memory_unlock();
|
memory_unlock();
|
||||||
|
|
||||||
succek("Memory loaded. %k total %k free", total_memory, free_memory);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t memory_total(void) {
|
uint32_t memory_total(void) {
|
62
kernel/src/arch/i686/paging.asm
Normal file
62
kernel/src/arch/i686/paging.asm
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
global page_directory
|
||||||
|
global paging_init
|
||||||
|
global paging_finish
|
||||||
|
global KERNEL_MAPPING
|
||||||
|
|
||||||
|
KERNEL_MAPPING equ 0xC0000000
|
||||||
|
VGABUF equ 0x000B8000
|
||||||
|
|
||||||
|
section .bss
|
||||||
|
align 4096
|
||||||
|
page_directory:
|
||||||
|
resb 4096
|
||||||
|
page_table1:
|
||||||
|
resb 4096
|
||||||
|
|
||||||
|
section .bootstrap.text
|
||||||
|
align 8
|
||||||
|
paging_init:
|
||||||
|
extern kernel_start
|
||||||
|
extern kernel_end
|
||||||
|
|
||||||
|
paging_load:
|
||||||
|
mov edi, page_table1 - KERNEL_MAPPING
|
||||||
|
mov esi, 0
|
||||||
|
mov ecx, 1023
|
||||||
|
|
||||||
|
paging_cmp:
|
||||||
|
cmp esi, kernel_start
|
||||||
|
jl paging_add
|
||||||
|
cmp esi, kernel_end - KERNEL_MAPPING
|
||||||
|
jge paging_map
|
||||||
|
|
||||||
|
mov edx, esi
|
||||||
|
or edx, 0x003
|
||||||
|
mov [edi], edx
|
||||||
|
|
||||||
|
paging_add:
|
||||||
|
add esi, 4096
|
||||||
|
add edi, 4
|
||||||
|
loop paging_cmp
|
||||||
|
|
||||||
|
paging_map:
|
||||||
|
mov dword [page_table1 - KERNEL_MAPPING + 1023 * 4], VGABUF | 0x003
|
||||||
|
mov dword [page_directory - KERNEL_MAPPING + 0], page_table1 - KERNEL_MAPPING + 0x003
|
||||||
|
mov dword [page_directory - KERNEL_MAPPING + 768 * 4], page_table1 - KERNEL_MAPPING + 0x003
|
||||||
|
|
||||||
|
mov ecx, page_directory - KERNEL_MAPPING
|
||||||
|
mov cr3, ecx
|
||||||
|
|
||||||
|
mov ecx, cr0
|
||||||
|
or ecx, 0x80010000
|
||||||
|
mov cr0, ecx
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
section .text
|
||||||
|
align 8
|
||||||
|
paging_finish:
|
||||||
|
mov dword [page_directory], 0
|
||||||
|
mov ecx, cr3
|
||||||
|
mov cr3, ecx
|
||||||
|
ret
|
|
@ -1,17 +1,14 @@
|
||||||
#include <sys.h>
|
#include <sys.h>
|
||||||
#include <print.h>
|
#include <print.h>
|
||||||
|
#include <arch/i686/pic.h>
|
||||||
#include "pic.h"
|
#include <arch/i686/asm.h>
|
||||||
|
|
||||||
#define PIC1_COMMAND_PORT 0x20
|
#define PIC1_COMMAND_PORT 0x20
|
||||||
#define PIC1_DATA_PORT 0x21
|
#define PIC1_DATA_PORT 0x21
|
||||||
#define PIC2_COMMAND_PORT 0xA0
|
#define PIC2_COMMAND_PORT 0xA0
|
||||||
#define PIC2_DATA_PORT 0xA1
|
#define PIC2_DATA_PORT 0xA1
|
||||||
|
|
||||||
void pic_remap(uint8_t offset) {
|
void pic_remap(void) {
|
||||||
|
|
||||||
debugk("Remapping PIC");
|
|
||||||
|
|
||||||
char a1 = inb(PIC1_DATA_PORT);
|
char a1 = inb(PIC1_DATA_PORT);
|
||||||
char a2 = inb(PIC2_DATA_PORT);
|
char a2 = inb(PIC2_DATA_PORT);
|
||||||
// control word 1
|
// control word 1
|
||||||
|
@ -22,9 +19,9 @@ void pic_remap(uint8_t offset) {
|
||||||
io_wait();
|
io_wait();
|
||||||
// control word 2
|
// control word 2
|
||||||
// interrupt offset
|
// interrupt offset
|
||||||
outb(PIC1_DATA_PORT, offset);
|
outb(PIC1_DATA_PORT, PIC_REMAP_OFFSET);
|
||||||
io_wait();
|
io_wait();
|
||||||
outb(PIC2_DATA_PORT, offset + 8);
|
outb(PIC2_DATA_PORT, PIC_REMAP_OFFSET + 8);
|
||||||
io_wait();
|
io_wait();
|
||||||
// control word 3
|
// control word 3
|
||||||
// primary pic: set which pin secondary is connected to
|
// primary pic: set which pin secondary is connected to
|
||||||
|
@ -42,8 +39,6 @@ void pic_remap(uint8_t offset) {
|
||||||
// clear data registers
|
// clear data registers
|
||||||
outb(PIC1_DATA_PORT, a1);
|
outb(PIC1_DATA_PORT, a1);
|
||||||
outb(PIC2_DATA_PORT, a2);
|
outb(PIC2_DATA_PORT, a2);
|
||||||
|
|
||||||
succek("PIC has been remapped to offset 0x%X", offset);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void pic_mask(int irq) {
|
void pic_mask(int irq) {
|
82
kernel/src/arch/i686/start.asm
Normal file
82
kernel/src/arch/i686/start.asm
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
global start
|
||||||
|
bits 32
|
||||||
|
|
||||||
|
|
||||||
|
; create the multiboot header
|
||||||
|
section .bootstrap.data
|
||||||
|
align 8
|
||||||
|
mb_start:
|
||||||
|
dd 0xe85250d6
|
||||||
|
dd 0
|
||||||
|
dd mb_end - mb_start
|
||||||
|
dd -(0xe85250d6 + (mb_end - mb_start))
|
||||||
|
dw 0
|
||||||
|
dw 0
|
||||||
|
dd 8
|
||||||
|
mb_end:
|
||||||
|
|
||||||
|
|
||||||
|
; create the stack for bootstrapping
|
||||||
|
section .bootstrap.stack
|
||||||
|
align 16
|
||||||
|
bootstrap_stack_start:
|
||||||
|
resb 1024 ; 1 KiB
|
||||||
|
bootstrap_stack_end:
|
||||||
|
|
||||||
|
|
||||||
|
; create the stack for the kernel
|
||||||
|
section .stack
|
||||||
|
align 16
|
||||||
|
stack_start:
|
||||||
|
resb 16384 ; 16 KiB
|
||||||
|
stack_end:
|
||||||
|
|
||||||
|
|
||||||
|
; load the kernel into the higher half
|
||||||
|
section .bootstrap.text
|
||||||
|
align 8
|
||||||
|
start:
|
||||||
|
; init bootstrap stack
|
||||||
|
mov esp, bootstrap_stack_end
|
||||||
|
mov ebp, bootstrap_stack_end
|
||||||
|
|
||||||
|
; load kernel into higher half and init paging
|
||||||
|
extern paging_init
|
||||||
|
call paging_init
|
||||||
|
|
||||||
|
jmp near load_kernel
|
||||||
|
|
||||||
|
; initalize kernel after it has been loaded in higher half
|
||||||
|
section .text
|
||||||
|
align 8
|
||||||
|
load_kernel:
|
||||||
|
; init stack
|
||||||
|
mov esp, stack_end
|
||||||
|
mov ebp, stack_end
|
||||||
|
|
||||||
|
; load global descripter table
|
||||||
|
extern load_gdt
|
||||||
|
call load_gdt
|
||||||
|
|
||||||
|
; unmap kernel at page 0
|
||||||
|
extern paging_finish
|
||||||
|
call paging_finish
|
||||||
|
|
||||||
|
; initalize the FPU
|
||||||
|
finit
|
||||||
|
|
||||||
|
; push multiboot header
|
||||||
|
extern KERNEL_MAPPING
|
||||||
|
add ebx, KERNEL_MAPPING
|
||||||
|
push ebx
|
||||||
|
|
||||||
|
; start kernel
|
||||||
|
sti
|
||||||
|
call kernel_main
|
||||||
|
extern kernel_main
|
||||||
|
|
||||||
|
; hlt forever if kernel quits (it should never)
|
||||||
|
cli
|
||||||
|
halt:
|
||||||
|
hlt
|
||||||
|
jmp halt
|
51
kernel/src/arch/i686/sys.c
Normal file
51
kernel/src/arch/i686/sys.c
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
#include <sys.h>
|
||||||
|
#include <arch/i686/asm.h>
|
||||||
|
#include <arch/i686/acpi.h>
|
||||||
|
#include <arch/i686/drivers/rtc.h>
|
||||||
|
#include <arch/i686/idt.h>
|
||||||
|
#include <arch/i686/pic.h>
|
||||||
|
#include <arch/i686/mboot.h>
|
||||||
|
#include <arch/i686/drivers/ps2ctrl.h>
|
||||||
|
|
||||||
|
void arch_init(void *boot_info) {
|
||||||
|
rtc_update();
|
||||||
|
|
||||||
|
idt_init();
|
||||||
|
pic_remap();
|
||||||
|
|
||||||
|
load_boot_info(boot_info);
|
||||||
|
|
||||||
|
/* havent refactored to work with paging yet */
|
||||||
|
// acpi_init();
|
||||||
|
// memory_init();
|
||||||
|
|
||||||
|
ps2ctrl_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
extern void arch_update(void) {
|
||||||
|
rtc_update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void arch_halt(void) {
|
||||||
|
halt();
|
||||||
|
}
|
||||||
|
|
||||||
|
void arch_wait_io(void) {
|
||||||
|
io_wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
void arch_disable_int(void) {
|
||||||
|
int_disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
void arch_enable_int(void) {
|
||||||
|
int_enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
extern void arch_wait_int(void) {
|
||||||
|
int_wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
void arch_poweroff(void) {
|
||||||
|
acpi_poweroff();
|
||||||
|
}
|
17
kernel/src/arch/i686/time.c
Normal file
17
kernel/src/arch/i686/time.c
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#include <time.h>
|
||||||
|
#include <arch/i686/drivers/rtc.h>
|
||||||
|
|
||||||
|
static enum Timezone cur_tz = UTC;
|
||||||
|
|
||||||
|
struct Time get_utctime(void) {
|
||||||
|
return rtc_utctime();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Time get_localtime(void) {
|
||||||
|
return rtc_localtime(cur_tz);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_timezone(enum Timezone tz) {
|
||||||
|
cur_tz = tz;
|
||||||
|
}
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
#include "cpu.h"
|
|
||||||
|
|
||||||
#include "print.h"
|
|
||||||
|
|
||||||
extern uint8_t sse_init (void);
|
|
||||||
extern uint8_t fpu_init (void);
|
|
||||||
|
|
||||||
uint8_t init_registers (uint8_t reg) {
|
|
||||||
uint8_t res = 0;
|
|
||||||
|
|
||||||
if (reg & SSE_REG)
|
|
||||||
res |= ~sse_init() & SSE_REG;
|
|
||||||
|
|
||||||
if (reg & FPU_REG)
|
|
||||||
res |= ~fpu_init() & FPU_REG;
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#define SSE_REG 0x01
|
|
||||||
#define FPU_REG 0x02
|
|
||||||
|
|
||||||
uint8_t init_registers (uint8_t reg);
|
|
|
@ -1,19 +0,0 @@
|
||||||
global fpu_init
|
|
||||||
|
|
||||||
fpu_init:
|
|
||||||
mov edx, cr0
|
|
||||||
and edx, (-1) - ((1 << 3) + (1 << 4))
|
|
||||||
mov cr0, edx
|
|
||||||
fninit
|
|
||||||
fnstsw [test]
|
|
||||||
cmp word [test], 0
|
|
||||||
jne no_fpu
|
|
||||||
|
|
||||||
mov eax, 0
|
|
||||||
ret
|
|
||||||
|
|
||||||
no_fpu:
|
|
||||||
mov eax, 1
|
|
||||||
ret
|
|
||||||
|
|
||||||
test: dw 0x55AA
|
|
|
@ -1,22 +0,0 @@
|
||||||
global sse_init
|
|
||||||
|
|
||||||
sse_init:
|
|
||||||
mov eax, 0x1
|
|
||||||
cpuid
|
|
||||||
test edx, 1<<25
|
|
||||||
jmp no_sse
|
|
||||||
|
|
||||||
mov eax, cr0
|
|
||||||
and ax, 0xFFFB
|
|
||||||
or ax, 0x2
|
|
||||||
mov cr0, eax
|
|
||||||
mov eax, cr4
|
|
||||||
or ax, 3 << 9
|
|
||||||
mov cr4, eax
|
|
||||||
|
|
||||||
mov eax, 0
|
|
||||||
ret
|
|
||||||
|
|
||||||
no_sse:
|
|
||||||
mov eax, 1
|
|
||||||
ret
|
|
|
@ -1,36 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#define IDT_SIZE 256
|
|
||||||
#define IDT_INTERRUPTS 256
|
|
||||||
|
|
||||||
struct IdtEntry {
|
|
||||||
uint16_t isr_low;
|
|
||||||
uint16_t kernel_cs;
|
|
||||||
uint8_t _reserved;
|
|
||||||
uint8_t attributes;
|
|
||||||
uint16_t isr_high;
|
|
||||||
} __attribute__((packed));
|
|
||||||
|
|
||||||
struct Idtr {
|
|
||||||
uint16_t limit;
|
|
||||||
uint32_t base;
|
|
||||||
} __attribute__((packed));
|
|
||||||
|
|
||||||
enum IDTFlags {
|
|
||||||
IDT_FLAG_GATE_TASK = 0x5,
|
|
||||||
IDT_FLAG_GATE_16BIT_INT = 0x6,
|
|
||||||
IDT_FLAG_GATE_16BIT_TRAP = 0x7,
|
|
||||||
IDT_FLAG_GATE_32BIT_INT = 0xE,
|
|
||||||
IDT_FLAG_GATE_32BIT_TRAP = 0xF,
|
|
||||||
|
|
||||||
IDT_FLAG_RING0 = (0 << 5),
|
|
||||||
IDT_FLAG_RING1 = (1 << 5),
|
|
||||||
IDT_FLAG_RING2 = (2 << 5),
|
|
||||||
IDT_FLAG_RING3 = (3 << 5),
|
|
||||||
|
|
||||||
IDT_FLAG_PRESENT = 0x80,
|
|
||||||
};
|
|
||||||
|
|
||||||
void idt_init(void);
|
|
|
@ -1,52 +1,29 @@
|
||||||
#include "acpi/acpi.h"
|
|
||||||
#include "boot/tag.h"
|
|
||||||
#include "cpu/cpu.h"
|
|
||||||
#include "drivers/ps2ctrl.h"
|
|
||||||
#include "drivers/ps2kb.h"
|
|
||||||
#include "drivers/ps2mouse.h"
|
|
||||||
#include "interrupt/idt.h"
|
|
||||||
#include "interrupt/pic.h"
|
|
||||||
#include "time.h"
|
#include "time.h"
|
||||||
#include "tty/cursor.h"
|
#include <drivers/ps2kb.h>
|
||||||
#include "tty/term.h"
|
#include <drivers/ps2mouse.h>
|
||||||
|
#include <panic.h>
|
||||||
#include <print.h>
|
#include <print.h>
|
||||||
|
#include <sys.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys.h>
|
#include <term.h>
|
||||||
|
|
||||||
static double x = 0, y = 0;
|
static double x = 0, y = 0;
|
||||||
|
|
||||||
void kernel_boot(void *boot_info) {
|
void kernel_main(void *boot_info) {
|
||||||
(void)boot_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void kernel_main(void) {
|
|
||||||
|
|
||||||
term_init();
|
term_init();
|
||||||
cursor_enable();
|
|
||||||
|
|
||||||
rtc_set_timezone(-4);
|
arch_init(boot_info);
|
||||||
rtc_update();
|
|
||||||
|
|
||||||
idt_init();
|
|
||||||
pic_remap(PIC_REMAP_OFFSET);
|
|
||||||
|
|
||||||
// load_boot_info(boot_info);
|
|
||||||
// acpi_init();
|
|
||||||
|
|
||||||
// memory_init();
|
|
||||||
|
|
||||||
ps2ctrl_init();
|
|
||||||
ps2kb_init();
|
ps2kb_init();
|
||||||
ps2mouse_init();
|
ps2mouse_init();
|
||||||
|
|
||||||
init_registers(FPU_REG | SSE_REG);
|
set_timezone(EST);
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
int_wait();
|
arch_wait_int();
|
||||||
|
arch_update();
|
||||||
|
|
||||||
struct Keycode code = ps2kb_get();
|
struct Keycode code = ps2kb_get();
|
||||||
if(code.key != KEY_NONE) {
|
if(code.key != KEY_NONE) {
|
||||||
|
@ -60,7 +37,7 @@ void kernel_main(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code.key == KEY_ESCAPE) {
|
if (code.key == KEY_ESCAPE) {
|
||||||
acpi_poweroff();
|
arch_poweroff();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct MouseEvent event = ps2mouse_get();
|
struct MouseEvent event = ps2mouse_get();
|
||||||
|
@ -76,6 +53,5 @@ void kernel_main(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
term_flush();
|
term_flush();
|
||||||
rtc_update();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <memory.h>
|
||||||
|
|
||||||
struct boundary_tag {
|
struct boundary_tag {
|
||||||
unsigned int magic;
|
unsigned int magic;
|
||||||
|
@ -15,11 +16,6 @@ struct boundary_tag {
|
||||||
struct boundary_tag *prev;
|
struct boundary_tag *prev;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int memory_lock(void);
|
|
||||||
extern int memory_unlock(void);
|
|
||||||
extern void *memory_alloc_page(int);
|
|
||||||
extern int memory_free_page(void* ,int);
|
|
||||||
|
|
||||||
#define ALLOC_MAGIC 0xc001c0de
|
#define ALLOC_MAGIC 0xc001c0de
|
||||||
#define MAXCOMPLETE 5
|
#define MAXCOMPLETE 5
|
||||||
#define MAXEXP 32
|
#define MAXEXP 32
|
|
@ -3,13 +3,11 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <panic.h>
|
#include <panic.h>
|
||||||
#include <print.h>
|
#include <print.h>
|
||||||
|
#include <term.h>
|
||||||
#include "tty/color.h"
|
|
||||||
#include "tty/term.h"
|
|
||||||
|
|
||||||
__attribute__((noreturn))
|
__attribute__((noreturn))
|
||||||
void _panic_impl(char* msg, int line, char* file, ...) {
|
void _panic_impl(char* msg, int line, char* file, ...) {
|
||||||
int_disable();
|
arch_disable_int();
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, file);
|
va_start(args, file);
|
||||||
term_clear();
|
term_clear();
|
||||||
|
@ -22,6 +20,6 @@ void _panic_impl(char* msg, int line, char* file, ...) {
|
||||||
printk("\nin %s at line %d\n", file, line);
|
printk("\nin %s at line %d\n", file, line);
|
||||||
term_flush();
|
term_flush();
|
||||||
while(1) {
|
while(1) {
|
||||||
halt();
|
arch_halt();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,10 +1,9 @@
|
||||||
#include "tty/color.h"
|
|
||||||
#include "tty/term.h"
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <print.h>
|
#include <print.h>
|
||||||
|
#include <term.h>
|
||||||
|
|
||||||
void printk(const char *restrict format, ...) {
|
void printk(const char *restrict format, ...) {
|
||||||
va_list args;
|
va_list args;
|
||||||
|
@ -82,47 +81,3 @@ void vprintk(const char *restrict format, va_list args) {
|
||||||
void puts(const char *s) {
|
void puts(const char *s) {
|
||||||
for(; *s; s++) putchar(*s);
|
for(; *s; s++) putchar(*s);
|
||||||
}
|
}
|
||||||
|
|
||||||
void printl(enum VGAColor color, const char* msg) {
|
|
||||||
term_setbg(VGA_BLACK);
|
|
||||||
term_setfg(VGA_WHITE);
|
|
||||||
putchar('[');
|
|
||||||
term_setfg(color);
|
|
||||||
printk("%s", msg);
|
|
||||||
term_setfg(VGA_WHITE);
|
|
||||||
putchar(']');
|
|
||||||
putchar(' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
void _debugk_impl(char *format, ...) {
|
|
||||||
uint16_t color = term_save_col();
|
|
||||||
printl(VGA_LIGHT_CYAN, "LOG");
|
|
||||||
va_list args;
|
|
||||||
va_start(args, format);
|
|
||||||
vprintk(format, args);
|
|
||||||
va_end(args);
|
|
||||||
if (!term_newline()) putchar('\n');
|
|
||||||
term_load_col(color);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _succek_impl(char *format, ...) {
|
|
||||||
uint16_t color = term_save_col();
|
|
||||||
printl(VGA_LIGHT_GREEN, "OK");
|
|
||||||
va_list args;
|
|
||||||
va_start(args, format);
|
|
||||||
vprintk(format, args);
|
|
||||||
va_end(args);
|
|
||||||
if (!term_newline()) putchar('\n');
|
|
||||||
term_load_col(color);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _errork_impl(char *format, ...) {
|
|
||||||
uint16_t color = term_save_col();
|
|
||||||
printl(VGA_LIGHT_RED, "ERR");
|
|
||||||
va_list args;
|
|
||||||
va_start(args, format);
|
|
||||||
vprintk(format, args);
|
|
||||||
va_end(args);
|
|
||||||
if (!term_newline()) putchar('\n');
|
|
||||||
term_load_col(color);
|
|
||||||
}
|
|
|
@ -1,135 +0,0 @@
|
||||||
global start
|
|
||||||
extern kernel_boot
|
|
||||||
extern kernel_main
|
|
||||||
extern kernel_start
|
|
||||||
extern kernel_end
|
|
||||||
bits 32
|
|
||||||
|
|
||||||
; base, limit, access, flags
|
|
||||||
%macro gdt_entry 4
|
|
||||||
db %2 & 0xff
|
|
||||||
db (%2 >> 8) & 0xff
|
|
||||||
db %1 & 0xff
|
|
||||||
db (%1 >> 8) & 0xff
|
|
||||||
db (%1 >> 16) & 0xff
|
|
||||||
db %3
|
|
||||||
db ((%2 >> 16) & 0x0f) | (%4 << 4)
|
|
||||||
db (%1 >> 24) & 0xff
|
|
||||||
%endmacro
|
|
||||||
|
|
||||||
MAGIC equ 0xe85250d6
|
|
||||||
FLAGS equ 0
|
|
||||||
LENGTH equ mb_end - mb_start
|
|
||||||
CHECKSUM equ -(MAGIC + LENGTH)
|
|
||||||
|
|
||||||
VGABUF equ 0x000B8000
|
|
||||||
KRNMAP equ 0xC0000000
|
|
||||||
|
|
||||||
section .multiboot.data
|
|
||||||
align 8
|
|
||||||
mb_start:
|
|
||||||
dd MAGIC
|
|
||||||
dd FLAGS
|
|
||||||
dd LENGTH
|
|
||||||
dd CHECKSUM
|
|
||||||
dw 0
|
|
||||||
dw 0
|
|
||||||
dd 8
|
|
||||||
mb_end:
|
|
||||||
|
|
||||||
section .rodata
|
|
||||||
align 16
|
|
||||||
gdt_start:
|
|
||||||
gdt_entry 0, 0, 0, 0
|
|
||||||
gdt_entry 0, 0xFFFFF, 0x9A, 0xC
|
|
||||||
gdt_entry 0, 0xFFFFF, 0x92, 0xC
|
|
||||||
gdt_end:
|
|
||||||
gdt_descriptor:
|
|
||||||
dw gdt_end - gdt_start - 1
|
|
||||||
dd gdt_start
|
|
||||||
|
|
||||||
section .bootstrap_stack
|
|
||||||
align 16
|
|
||||||
stack_start:
|
|
||||||
resb 16384 ; 16 KiB
|
|
||||||
stack_end:
|
|
||||||
|
|
||||||
section .bss
|
|
||||||
align 4096
|
|
||||||
page_directory:
|
|
||||||
resb 4096
|
|
||||||
page_table1:
|
|
||||||
resb 4096
|
|
||||||
|
|
||||||
section .multiboot.text
|
|
||||||
align 8
|
|
||||||
start:
|
|
||||||
|
|
||||||
; push ebx
|
|
||||||
; call kernel_boot
|
|
||||||
; pop eax
|
|
||||||
|
|
||||||
mov edi, page_table1 - KRNMAP
|
|
||||||
mov esi, 0
|
|
||||||
mov ecx, 1023
|
|
||||||
|
|
||||||
paging_cmp:
|
|
||||||
cmp esi, kernel_start
|
|
||||||
jl paging_add
|
|
||||||
cmp esi, kernel_end - KRNMAP
|
|
||||||
jge paging_map
|
|
||||||
|
|
||||||
mov edx, esi
|
|
||||||
or edx, 0x003
|
|
||||||
mov [edi], edx
|
|
||||||
|
|
||||||
paging_add:
|
|
||||||
add esi, 4096
|
|
||||||
add edi, 4
|
|
||||||
loop paging_cmp
|
|
||||||
|
|
||||||
paging_map:
|
|
||||||
mov dword [page_table1 - KRNMAP + 1023 * 4], VGABUF | 0x003
|
|
||||||
mov dword [page_directory - KRNMAP + 0], page_table1 - KRNMAP + 0x003
|
|
||||||
mov dword [page_directory - KRNMAP + 768 * 4], page_table1 - KRNMAP + 0x003
|
|
||||||
|
|
||||||
mov ecx, page_directory - KRNMAP
|
|
||||||
mov cr3, ecx
|
|
||||||
|
|
||||||
mov ecx, cr0
|
|
||||||
or ecx, 0x80010000
|
|
||||||
mov cr0, ecx
|
|
||||||
|
|
||||||
lea ecx, load_gdt
|
|
||||||
jmp near ecx
|
|
||||||
|
|
||||||
section .text
|
|
||||||
align 8
|
|
||||||
load_gdt:
|
|
||||||
cli
|
|
||||||
lgdt [gdt_descriptor]
|
|
||||||
mov eax, cr0
|
|
||||||
or al, 1
|
|
||||||
mov cr0, eax
|
|
||||||
jmp 0x08:load_kernel
|
|
||||||
|
|
||||||
load_kernel:
|
|
||||||
|
|
||||||
mov dword [page_directory], 0
|
|
||||||
mov ecx, cr3
|
|
||||||
mov cr3, ecx
|
|
||||||
|
|
||||||
mov ax, 0x10
|
|
||||||
mov ds, ax
|
|
||||||
mov ss, ax
|
|
||||||
mov es, ax
|
|
||||||
mov fs, ax
|
|
||||||
mov gs, ax
|
|
||||||
mov esp, stack_end
|
|
||||||
mov ebp, stack_end
|
|
||||||
sti
|
|
||||||
call kernel_main
|
|
||||||
cli
|
|
||||||
halt:
|
|
||||||
hlt
|
|
||||||
jmp halt
|
|
|
@ -5,12 +5,10 @@
|
||||||
#include <sys.h>
|
#include <sys.h>
|
||||||
#include <print.h>
|
#include <print.h>
|
||||||
|
|
||||||
|
#include "drivers/vga.h"
|
||||||
#include "term.h"
|
#include "term.h"
|
||||||
#include "color.h"
|
|
||||||
#include "cursor.h"
|
|
||||||
|
|
||||||
uint16_t buffer[TERM_W * TERM_H * sizeof(uint16_t)];
|
uint16_t buffer[TERM_W * TERM_H * sizeof(uint16_t)];
|
||||||
uint16_t *front;
|
|
||||||
uint8_t x, y;
|
uint8_t x, y;
|
||||||
uint8_t color;
|
uint8_t color;
|
||||||
|
|
||||||
|
@ -28,7 +26,6 @@ static void term_clear_line(int y) {
|
||||||
void term_init (void) {
|
void term_init (void) {
|
||||||
x = 0;
|
x = 0;
|
||||||
y = 0;
|
y = 0;
|
||||||
front = (uint16_t*) 0xC03FF000;
|
|
||||||
term_setfg(VGA_WHITE);
|
term_setfg(VGA_WHITE);
|
||||||
term_setbg(VGA_BLACK);
|
term_setbg(VGA_BLACK);
|
||||||
term_clear();
|
term_clear();
|
||||||
|
@ -37,11 +34,11 @@ void term_init (void) {
|
||||||
void term_setpos(uint8_t xp, uint8_t yp) {
|
void term_setpos(uint8_t xp, uint8_t yp) {
|
||||||
x = xp;
|
x = xp;
|
||||||
y = yp;
|
y = yp;
|
||||||
cursor_setpos(x, y);
|
vgatext_cur_mov(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void term_scroll (int lines) {
|
void term_scroll (int lines) {
|
||||||
int_disable();
|
arch_disable_int();
|
||||||
y -= lines;
|
y -= lines;
|
||||||
if (!lines) return;
|
if (!lines) return;
|
||||||
if(lines >= TERM_H || lines <= -TERM_H) {
|
if(lines >= TERM_H || lines <= -TERM_H) {
|
||||||
|
@ -52,14 +49,14 @@ void term_scroll (int lines) {
|
||||||
} else {
|
} else {
|
||||||
memmove(buffer + lines * TERM_W, buffer + lines, (TERM_H + lines) * TERM_W);
|
memmove(buffer + lines * TERM_W, buffer + lines, (TERM_H + lines) * TERM_W);
|
||||||
}
|
}
|
||||||
int_enable();
|
arch_enable_int();
|
||||||
}
|
}
|
||||||
|
|
||||||
void term_setfg(enum VGAColor c) {
|
void term_setfg(enum vga_color c) {
|
||||||
color = (color & 0xF0) | c;
|
color = (color & 0xF0) | c;
|
||||||
}
|
}
|
||||||
|
|
||||||
void term_setbg(enum VGAColor c) {
|
void term_setbg(enum vga_color c) {
|
||||||
color = (color & 0x0F) | c << 4;
|
color = (color & 0x0F) | c << 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,7 +77,7 @@ void term_load(uint32_t state) {
|
||||||
x = (uint8_t) (state >> 16);
|
x = (uint8_t) (state >> 16);
|
||||||
y = (uint8_t) (state >> 8);
|
y = (uint8_t) (state >> 8);
|
||||||
color = (uint8_t) (state >> 0);
|
color = (uint8_t) (state >> 0);
|
||||||
cursor_setpos(x, y);
|
vgatext_cur_mov(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t term_save_col(void) {
|
uint16_t term_save_col(void) {
|
||||||
|
@ -124,7 +121,7 @@ void putchar(int c) {
|
||||||
y = TERM_H - 1;
|
y = TERM_H - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
cursor_setpos(x, y);
|
vgatext_cur_mov(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool term_newline(void) {
|
bool term_newline(void) {
|
||||||
|
@ -132,7 +129,7 @@ bool term_newline(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void term_flush(void) {
|
void term_flush(void) {
|
||||||
int_disable();
|
arch_disable_int();
|
||||||
memcpy(front, buffer, TERM_W * TERM_H * sizeof(uint16_t));
|
vgatext_write_buf(buffer);
|
||||||
int_enable();
|
arch_enable_int();
|
||||||
}
|
}
|
|
@ -1,7 +1,5 @@
|
||||||
#include <stdbool.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
static char* ABB_WEEKDAY[7] = {
|
static char* ABB_WEEKDAY[7] = {
|
||||||
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
|
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
|
|
@ -1,67 +0,0 @@
|
||||||
#include "color.h"
|
|
||||||
#include "panic.h"
|
|
||||||
|
|
||||||
bool itoac(int i, enum AnsiiColor *color) {
|
|
||||||
if (i < 0 || i > 15) return false;
|
|
||||||
*color = i;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool itovc(int i, enum VGAColor *color) {
|
|
||||||
if (
|
|
||||||
(i >= 30 && i <= 37) ||
|
|
||||||
(i >= 40 && i <= 47) ||
|
|
||||||
(i >= 90 && i <= 97) ||
|
|
||||||
(i >= 100 && i <= 107)
|
|
||||||
) {
|
|
||||||
*color = i;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum VGAColor atovc(enum AnsiiColor color) {
|
|
||||||
switch(color) {
|
|
||||||
case ANSII_FRONT_BLACK:
|
|
||||||
case ANSII_FRONT_BLACK_EMPH:
|
|
||||||
case ANSII_BACK_BLACK:
|
|
||||||
case ANSII_BACK_BLACK_EMPH:
|
|
||||||
return VGA_BLACK;
|
|
||||||
case ANSII_FRONT_RED:
|
|
||||||
case ANSII_FRONT_RED_EMPH:
|
|
||||||
case ANSII_BACK_RED:
|
|
||||||
case ANSII_BACK_RED_EMPH:
|
|
||||||
return VGA_LIGHT_RED;
|
|
||||||
case ANSII_FRONT_GREEN:
|
|
||||||
case ANSII_FRONT_GREEN_EMPH:
|
|
||||||
case ANSII_BACK_GREEN:
|
|
||||||
case ANSII_BACK_GREEN_EMPH:
|
|
||||||
return VGA_LIGHT_GREEN;
|
|
||||||
case ANSII_FRONT_YELLOW:
|
|
||||||
case ANSII_FRONT_YELLOW_EMPH:
|
|
||||||
case ANSII_BACK_YELLOW:
|
|
||||||
case ANSII_BACK_YELLOW_EMPH:
|
|
||||||
return VGA_LIGHT_BROWN;
|
|
||||||
case ANSII_FRONT_BLUE:
|
|
||||||
case ANSII_FRONT_BLUE_EMPH:
|
|
||||||
case ANSII_BACK_BLUE:
|
|
||||||
case ANSII_BACK_BLUE_EMPH:
|
|
||||||
return VGA_LIGHT_BLUE;
|
|
||||||
case ANSII_FRONT_PURPLE:
|
|
||||||
case ANSII_FRONT_PURPLE_EMPH:
|
|
||||||
case ANSII_BACK_PURPLE:
|
|
||||||
case ANSII_BACK_PURPLE_EMPH:
|
|
||||||
return VGA_LIGHT_MAGENTA;
|
|
||||||
case ANSII_FRONT_CYAN:
|
|
||||||
case ANSII_FRONT_CYAN_EMPH:
|
|
||||||
case ANSII_BACK_CYAN:
|
|
||||||
case ANSII_BACK_CYAN_EMPH:
|
|
||||||
return VGA_LIGHT_CYAN;
|
|
||||||
case ANSII_FRONT_WHITE:
|
|
||||||
case ANSII_FRONT_WHITE_EMPH:
|
|
||||||
case ANSII_BACK_WHITE:
|
|
||||||
case ANSII_BACK_WHITE_EMPH:
|
|
||||||
return VGA_WHITE;
|
|
||||||
}
|
|
||||||
panic("this should not be reached (make gcc quiet)");
|
|
||||||
}
|
|
|
@ -1,62 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
enum VGAColor {
|
|
||||||
VGA_BLACK = 0,
|
|
||||||
VGA_BLUE = 1,
|
|
||||||
VGA_GREEN = 2,
|
|
||||||
VGA_CYAN = 3,
|
|
||||||
VGA_RED = 4,
|
|
||||||
VGA_MAGENTA = 5,
|
|
||||||
VGA_BROWN = 6,
|
|
||||||
VGA_LIGHT_GREY = 7,
|
|
||||||
VGA_DARK_GREY = 8,
|
|
||||||
VGA_LIGHT_BLUE = 9,
|
|
||||||
VGA_LIGHT_GREEN = 10,
|
|
||||||
VGA_LIGHT_CYAN = 11,
|
|
||||||
VGA_LIGHT_RED = 12,
|
|
||||||
VGA_LIGHT_MAGENTA = 13,
|
|
||||||
VGA_LIGHT_BROWN = 14,
|
|
||||||
VGA_WHITE = 15,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum AnsiiColor {
|
|
||||||
ANSII_FRONT_BLACK = 30,
|
|
||||||
ANSII_FRONT_RED = 31,
|
|
||||||
ANSII_FRONT_GREEN = 32,
|
|
||||||
ANSII_FRONT_YELLOW = 33,
|
|
||||||
ANSII_FRONT_BLUE = 34,
|
|
||||||
ANSII_FRONT_PURPLE = 35,
|
|
||||||
ANSII_FRONT_CYAN = 36,
|
|
||||||
ANSII_FRONT_WHITE = 37,
|
|
||||||
ANSII_FRONT_BLACK_EMPH = 90,
|
|
||||||
ANSII_FRONT_RED_EMPH = 91,
|
|
||||||
ANSII_FRONT_GREEN_EMPH = 92,
|
|
||||||
ANSII_FRONT_YELLOW_EMPH = 93,
|
|
||||||
ANSII_FRONT_BLUE_EMPH = 94,
|
|
||||||
ANSII_FRONT_PURPLE_EMPH = 95,
|
|
||||||
ANSII_FRONT_CYAN_EMPH = 96,
|
|
||||||
ANSII_FRONT_WHITE_EMPH = 97,
|
|
||||||
ANSII_BACK_BLACK = 40,
|
|
||||||
ANSII_BACK_RED = 41,
|
|
||||||
ANSII_BACK_GREEN = 42,
|
|
||||||
ANSII_BACK_YELLOW = 43,
|
|
||||||
ANSII_BACK_BLUE = 44,
|
|
||||||
ANSII_BACK_PURPLE = 45,
|
|
||||||
ANSII_BACK_CYAN = 46,
|
|
||||||
ANSII_BACK_WHITE = 47,
|
|
||||||
ANSII_BACK_BLACK_EMPH = 100,
|
|
||||||
ANSII_BACK_RED_EMPH = 101,
|
|
||||||
ANSII_BACK_GREEN_EMPH = 102,
|
|
||||||
ANSII_BACK_YELLOW_EMPH = 103,
|
|
||||||
ANSII_BACK_BLUE_EMPH = 104,
|
|
||||||
ANSII_BACK_PURPLE_EMPH = 105,
|
|
||||||
ANSII_BACK_CYAN_EMPH = 106,
|
|
||||||
ANSII_BACK_WHITE_EMPH = 107,
|
|
||||||
};
|
|
||||||
|
|
||||||
bool itoac(int i, enum AnsiiColor *color);
|
|
||||||
bool itovc(int i, enum VGAColor *color);
|
|
||||||
enum VGAColor atovc(enum AnsiiColor color);
|
|
|
@ -1,30 +0,0 @@
|
||||||
#include <sys.h>
|
|
||||||
|
|
||||||
#include "cursor.h"
|
|
||||||
#include "term.h"
|
|
||||||
|
|
||||||
void cursor_enable(void) {
|
|
||||||
cursor_setsize(13, 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cursor_disable(void) {
|
|
||||||
outb(0x3D4, 0x0A);
|
|
||||||
outb(0x3D5, 0x20);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cursor_setsize(uint8_t start, uint8_t end) {
|
|
||||||
outb(0x3D4, 0x0A);
|
|
||||||
outb(0x3D5, (inb(0x3D5) & 0xC0) | start);
|
|
||||||
|
|
||||||
outb(0x3D4, 0x0B);
|
|
||||||
outb(0x3D5, (inb(0x3D5) & 0xE0) | end);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cursor_setpos(uint8_t x, uint8_t y) {
|
|
||||||
; uint16_t pos = y * TERM_W + x;
|
|
||||||
|
|
||||||
outb(0x3D4, 0x0F);
|
|
||||||
outb(0x3D5, (uint8_t) (pos & 0xFF));
|
|
||||||
outb(0x3D4, 0x0E);
|
|
||||||
outb(0x3D5, (uint8_t) ((pos >> 8) & 0xFF));
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
void cursor_enable(void);
|
|
||||||
void cursor_disable(void);
|
|
||||||
void cursor_setsize(uint8_t start, uint8_t end);
|
|
||||||
void cursor_setpos(uint8_t x, uint8_t y);
|
|
||||||
|
|
Loading…
Reference in a new issue