summaryrefslogtreecommitdiff
path: root/kernel/src/arch
diff options
context:
space:
mode:
authorTyler Murphy <=>2023-07-17 19:34:52 -0400
committerTyler Murphy <=>2023-07-17 19:34:52 -0400
commit7a912d1b668ab86ffe088eca3ac7e6f78a04a0c5 (patch)
tree4e86ff20e73171285156631db043e12aaf63bf04 /kernel/src/arch
parentpaging (diff)
downloadfinix-7a912d1b668ab86ffe088eca3ac7e6f78a04a0c5.tar.gz
finix-7a912d1b668ab86ffe088eca3ac7e6f78a04a0c5.tar.bz2
finix-7a912d1b668ab86ffe088eca3ac7e6f78a04a0c5.zip
refactoring
Diffstat (limited to '')
-rw-r--r--kernel/src/arch/i686/acpi.c (renamed from kernel/src/acpi/acpi.c)67
-rw-r--r--kernel/src/arch/i686/asm.c (renamed from libk/include/sys.h)24
-rw-r--r--kernel/src/arch/i686/drivers/ps2ctrl.c (renamed from kernel/src/drivers/ps2ctrl.c)8
-rw-r--r--kernel/src/arch/i686/drivers/ps2kb.c (renamed from kernel/src/drivers/ps2kb.c)10
-rw-r--r--kernel/src/arch/i686/drivers/ps2mouse.c (renamed from kernel/src/drivers/ps2mouse.c)12
-rw-r--r--kernel/src/arch/i686/drivers/rtc.c (renamed from kernel/src/drivers/cmos.c)44
-rw-r--r--kernel/src/arch/i686/drivers/vga.c50
-rw-r--r--kernel/src/arch/i686/gdt.asm42
-rw-r--r--kernel/src/arch/i686/idt.asm (renamed from kernel/src/interrupt/idt.asm)0
-rw-r--r--kernel/src/arch/i686/idt.c (renamed from kernel/src/interrupt/idt.c)48
-rw-r--r--kernel/src/arch/i686/mboot.c (renamed from kernel/src/boot/tag.c)8
-rw-r--r--kernel/src/arch/i686/memory.c (renamed from kernel/src/memory/memory.c)15
-rw-r--r--kernel/src/arch/i686/paging.asm62
-rw-r--r--kernel/src/arch/i686/pic.c (renamed from kernel/src/interrupt/pic.c)15
-rw-r--r--kernel/src/arch/i686/start.asm82
-rw-r--r--kernel/src/arch/i686/sys.c51
-rw-r--r--kernel/src/arch/i686/time.c17
17 files changed, 420 insertions, 135 deletions
diff --git a/kernel/src/acpi/acpi.c b/kernel/src/arch/i686/acpi.c
index ef1fb76..7807558 100644
--- a/kernel/src/acpi/acpi.c
+++ b/kernel/src/arch/i686/acpi.c
@@ -3,11 +3,10 @@
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
-#include <sys.h>
+#include <arch/i686/acpi.h>
+#include <arch/i686/asm.h>
-#include "acpi.h"
-#include "boot/tag.h"
-#include "print.h"
+extern uintptr_t KERNEL_MAPPING;
static struct RootSystemDescriptionTable *rsdt;
static struct FixedACPIDescriptionTable *fadt;
@@ -17,9 +16,7 @@ static uint16_t SLP_TYPb;
static uint16_t SLP_EN;
static uint16_t SCI_EN;
-static bool is_init = false;
-
-bool checksum(uint8_t *data, size_t len) {
+static bool checksum(uint8_t *data, size_t len) {
unsigned char sum = 0;
for (size_t i = 0; i < len; i++)
sum += data[i];
@@ -39,7 +36,7 @@ static void *find_fadt(void) {
return NULL;
}
-static int read_s5_addr(void) {
+static void read_s5_addr(void) {
uintptr_t ptr = fadt->dsdt;
char *s5_addr = (void*) (ptr + 36);
@@ -69,73 +66,41 @@ static int read_s5_addr(void) {
SCI_EN = 1;
} else {
- errork("\\_S5 parse error.");
- return 1;
+ panic("\\_S5 parse error.");
}
} else {
- errork("\\_S5 not present.");
- return 1;
+ panic("\\_S5 not present.");
}
- return 0;
}
-void acpi_init(void) {
-
- is_init = false;
-
- debugk("Loading ACPI");
-
- struct BootTag *tag;
- if(!get_boot_tag(ID_RSDP, &tag)) {
- errork("Could not find RSDP");
- return;
- }
-
- debugk("Loading RSDT");
+void acpi_init(void *ptr) {
- struct RootSystemDescriptionPointer *rsdp = tag->data.rsdp;
+ struct RootSystemDescriptionPointer *rsdp = ptr;
if (!checksum((uint8_t*) rsdp, sizeof(struct RootSystemDescriptionPointer))) {
- errork("RSDP checksum failed to validate");
- return;
+ panic("RSDP checksum failed to validate");
}
uintptr_t rsdt_ptr = rsdp->rsdt_address;
rsdt = (void *) rsdt_ptr;
if (!checksum((uint8_t*) &rsdt->header, rsdt->header.length)) {
- errork("RSDT checksum failed to validate");
- return;
+ panic("RSDT checksum failed to validate");
}
- debugk("Loading FADT");
-
fadt = find_fadt();
if (fadt == NULL) {
- errork("Could not find FADT");
- return;
+ panic("Could not find FADT");
}
if (!checksum((uint8_t*) &fadt->header, fadt->header.length)) {
- errork("FADT checksum failed to validate");
- return;
+ panic("FADT checksum failed to validate");
}
- debugk("Reading \\_S5 Addr");
-
- if (read_s5_addr()) {
- return;
- }
+ read_s5_addr();
outb(fadt->smi_command_port,fadt->acpi_enable);
-
- succek("ACPI has been loaded");
- is_init = true;
}
void acpi_poweroff(void) {
- if (is_init) {
- outw((unsigned int) fadt->pm1_a_control_block, SLP_TYPb | SLP_EN);
- panic("failed to shutdown");
- } else {
- errork("Cannot shutdown, ACPI not loaded");
- }
+ outw((unsigned int) fadt->pm1_a_control_block, SLP_TYPb | SLP_EN);
+ panic("failed to shutdown");
}
diff --git a/libk/include/sys.h b/kernel/src/arch/i686/asm.c
index 75618e8..8ed00d0 100644
--- a/libk/include/sys.h
+++ b/kernel/src/arch/i686/asm.c
@@ -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;
__asm__ volatile ("inb %1, %0" : "=a"(ret) : "Nd"(port));
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));
}
-static inline uint16_t inw(uint16_t port) {
+uint16_t inw(uint16_t port) {
uint16_t ret;
__asm__ volatile ("inw %1, %0" : "=a"(ret) : "Nd"(port));
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));
}
-static inline uint32_t inl(uint16_t port) {
+uint32_t inl(uint16_t port) {
uint32_t ret;
__asm__ volatile ("inl %1, %0" : "=a"(ret) : "Nd"(port));
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));
}
-static inline void io_wait(void) {
+void io_wait(void) {
outb(0x80, 0);
}
-static inline void int_enable(void) {
+void int_enable(void) {
__asm__ volatile ("sti");
}
-static inline void int_disable(void) {
+void int_disable(void) {
__asm__ volatile ("cli");
}
-static inline void int_wait(void) {
+void int_wait(void) {
__asm__ volatile ("sti; hlt");
}
-static inline void halt(void) {
+void halt(void) {
__asm__ volatile ("cli; hlt");
}
diff --git a/kernel/src/drivers/ps2ctrl.c b/kernel/src/arch/i686/drivers/ps2ctrl.c
index 05ef25d..794aabd 100644
--- a/kernel/src/drivers/ps2ctrl.c
+++ b/kernel/src/arch/i686/drivers/ps2ctrl.c
@@ -1,9 +1,7 @@
#include <panic.h>
-#include <sys.h>
-
-#include "print.h"
-#include "ps2ctrl.h"
-#include "interrupt/pic.h"
+#include <arch/i686/drivers/ps2ctrl.h>
+#include <arch/i686/pic.h>
+#include <arch/i686/asm.h>
#define STATUS_OUT_BUF ((uint8_t)0x01)
#define STATUS_IN_BUF ((uint8_t)0x02)
diff --git a/kernel/src/drivers/ps2kb.c b/kernel/src/arch/i686/drivers/ps2kb.c
index f6fc514..50bdfb6 100644
--- a/kernel/src/drivers/ps2kb.c
+++ b/kernel/src/arch/i686/drivers/ps2kb.c
@@ -1,10 +1,8 @@
#include <panic.h>
-#include <sys.h>
-
-#include "print.h"
-#include "ps2kb.h"
-#include "ps2ctrl.h"
-#include "interrupt/pic.h"
+#include <arch/i686/drivers/ps2ctrl.h>
+#include <arch/i686/pic.h>
+#include <arch/i686/asm.h>
+#include <drivers/ps2kb.h>
#define BUFFER_LEN 16
diff --git a/kernel/src/drivers/ps2mouse.c b/kernel/src/arch/i686/drivers/ps2mouse.c
index 1616cd6..d1082a1 100644
--- a/kernel/src/drivers/ps2mouse.c
+++ b/kernel/src/arch/i686/drivers/ps2mouse.c
@@ -1,12 +1,8 @@
#include <panic.h>
-#include <stdbool.h>
-#include <string.h>
-#include <sys.h>
-
-#include "print.h"
-#include "ps2mouse.h"
-#include "drivers/ps2ctrl.h"
-#include "interrupt/pic.h"
+#include <arch/i686/drivers/ps2ctrl.h>
+#include <arch/i686/pic.h>
+#include <arch/i686/asm.h>
+#include <drivers/ps2mouse.h>
static bool is_init = false;
diff --git a/kernel/src/drivers/cmos.c b/kernel/src/arch/i686/drivers/rtc.c
index 5ac12c3..ba69d15 100644
--- a/kernel/src/drivers/cmos.c
+++ b/kernel/src/arch/i686/drivers/rtc.c
@@ -1,7 +1,8 @@
-#include "print.h"
+#include "time.h"
#include <stdint.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_READ_PORT 0x71
@@ -15,9 +16,16 @@
#define CMOS_REG_YEAR 0x09
#define CMOS_REG_CEN 0x32
+// Live buffers to work on data
static struct Time time;
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) {
uint8_t hex, ret;
@@ -46,10 +54,12 @@ static void update_localtime(void) {
// set localtime
localtime = time;
- // do we acutally need to do anything
- if (cur_offset == 0) return;
- localtime.hour += cur_offset;
-
+ // if tz is UTC, we dont need to do anythin
+ if (last_timezone == UTC) {
+ cur_localtime = localtime;
+ return;
+ }
+
// check if day rolled over
change = localtime.hour < 0 ? -1 : localtime.hour >= 24 ? 1 : 0;
if (!change) return;
@@ -98,13 +108,11 @@ year:
localtime.yday = 0;
localtime.year -= 1900;
+
+ cur_localtime = localtime;
}
-void rtc_set_timezone(int offset) {
- cur_offset = offset;
-}
-
void rtc_update(void) {
time.sec = cmos_read(CMOS_REG_SEC);
time.min = cmos_read(CMOS_REG_MIN);
@@ -127,12 +135,18 @@ void rtc_update(void) {
time.year -= 1900;
update_localtime();
+
+ cur_time = time;
}
-struct Time *rtc_utctime(void) {
- return &time;
+struct Time rtc_utctime(void) {
+ return cur_time;
}
-struct Time *rtc_localtime(void) {
- return &localtime;
+struct Time rtc_localtime(enum Timezone tz) {
+ if (tz != last_timezone) {
+ last_timezone = tz;
+ update_localtime();
+ }
+ return cur_localtime;
}
diff --git a/kernel/src/arch/i686/drivers/vga.c b/kernel/src/arch/i686/drivers/vga.c
new file mode 100644
index 0000000..a41ce54
--- /dev/null
+++ b/kernel/src/arch/i686/drivers/vga.c
@@ -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);
+ }
+}
diff --git a/kernel/src/arch/i686/gdt.asm b/kernel/src/arch/i686/gdt.asm
new file mode 100644
index 0000000..ea8a86b
--- /dev/null
+++ b/kernel/src/arch/i686/gdt.asm
@@ -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
diff --git a/kernel/src/interrupt/idt.asm b/kernel/src/arch/i686/idt.asm
index 6cccdc6..6cccdc6 100644
--- a/kernel/src/interrupt/idt.asm
+++ b/kernel/src/arch/i686/idt.asm
diff --git a/kernel/src/interrupt/idt.c b/kernel/src/arch/i686/idt.c
index aaa7034..04fd5f8 100644
--- a/kernel/src/interrupt/idt.c
+++ b/kernel/src/arch/i686/idt.c
@@ -5,16 +5,42 @@
#include <sys.h>
#include <print.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"
+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
static char buf[WIDTH];
static int timer = -1;
@@ -35,7 +61,8 @@ void idt_pic_timer(void) {
for (size_t i = 0; i < WIDTH; i++) putchar(' ');
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);
term_load(state);
@@ -101,9 +128,6 @@ static void set_descriptor(uint8_t vector, void* isr, uint8_t flags) {
}
void idt_init(void) {
-
- debugk("Loading IDT");
-
idtr.base = (uintptr_t)&idt[0];
idtr.limit = (uint16_t)sizeof(struct IdtEntry) * IDT_SIZE - 1;
@@ -112,7 +136,5 @@ void idt_init(void) {
}
__asm__ volatile ("lidt %0" : : "m"(idtr));
-
- succek("IDT has been loaded");
}
diff --git a/kernel/src/boot/tag.c b/kernel/src/arch/i686/mboot.c
index a344d72..108812f 100644
--- a/kernel/src/boot/tag.c
+++ b/kernel/src/arch/i686/mboot.c
@@ -1,10 +1,8 @@
#include <panic.h>
#include <string.h>
-
-#include "print.h"
-#include "tag.h"
-#include "acpi/acpi.h"
-#include "memory/memory.h"
+#include <arch/i686/mboot.h>
+#include <arch/i686/memory.h>
+#include <arch/i686/acpi.h>
static struct BootInfo info;
diff --git a/kernel/src/memory/memory.c b/kernel/src/arch/i686/memory.c
index 30da0fc..29f1f56 100644
--- a/kernel/src/memory/memory.c
+++ b/kernel/src/arch/i686/memory.c
@@ -1,11 +1,10 @@
+#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include <sys.h>
#include <panic.h>
-
-#include "memory.h"
-#include "boot/tag.h"
-#include "print.h"
+#include <arch/i686/memory.h>
+#include <arch/i686/mboot.h>
struct MemoryArea {
uint32_t len;
@@ -25,12 +24,12 @@ static uint32_t page_free_start;
static struct MemoryArea *page_start;
int memory_lock(void) {
- int_disable();
+ // int_disable();
return 0;
}
int memory_unlock(void) {
- int_enable();
+ // int_enable();
return 0;
}
@@ -114,8 +113,6 @@ int memory_free_page(void *ptr, int pages) {
void memory_init(void) {
- debugk("Loading memory pages");
-
memory_lock();
bitmap = NULL;
@@ -185,8 +182,6 @@ void memory_init(void) {
memory_unlock();
- succek("Memory loaded. %k total %k free", total_memory, free_memory);
-
}
uint32_t memory_total(void) {
diff --git a/kernel/src/arch/i686/paging.asm b/kernel/src/arch/i686/paging.asm
new file mode 100644
index 0000000..f74cc55
--- /dev/null
+++ b/kernel/src/arch/i686/paging.asm
@@ -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
diff --git a/kernel/src/interrupt/pic.c b/kernel/src/arch/i686/pic.c
index 86056a1..f5d0f94 100644
--- a/kernel/src/interrupt/pic.c
+++ b/kernel/src/arch/i686/pic.c
@@ -1,17 +1,14 @@
#include <sys.h>
#include <print.h>
-
-#include "pic.h"
+#include <arch/i686/pic.h>
+#include <arch/i686/asm.h>
#define PIC1_COMMAND_PORT 0x20
#define PIC1_DATA_PORT 0x21
#define PIC2_COMMAND_PORT 0xA0
#define PIC2_DATA_PORT 0xA1
-void pic_remap(uint8_t offset) {
-
- debugk("Remapping PIC");
-
+void pic_remap(void) {
char a1 = inb(PIC1_DATA_PORT);
char a2 = inb(PIC2_DATA_PORT);
// control word 1
@@ -22,9 +19,9 @@ void pic_remap(uint8_t offset) {
io_wait();
// control word 2
// interrupt offset
- outb(PIC1_DATA_PORT, offset);
+ outb(PIC1_DATA_PORT, PIC_REMAP_OFFSET);
io_wait();
- outb(PIC2_DATA_PORT, offset + 8);
+ outb(PIC2_DATA_PORT, PIC_REMAP_OFFSET + 8);
io_wait();
// control word 3
// primary pic: set which pin secondary is connected to
@@ -42,8 +39,6 @@ void pic_remap(uint8_t offset) {
// clear data registers
outb(PIC1_DATA_PORT, a1);
outb(PIC2_DATA_PORT, a2);
-
- succek("PIC has been remapped to offset 0x%X", offset);
}
void pic_mask(int irq) {
diff --git a/kernel/src/arch/i686/start.asm b/kernel/src/arch/i686/start.asm
new file mode 100644
index 0000000..2151b51
--- /dev/null
+++ b/kernel/src/arch/i686/start.asm
@@ -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
diff --git a/kernel/src/arch/i686/sys.c b/kernel/src/arch/i686/sys.c
new file mode 100644
index 0000000..209fea4
--- /dev/null
+++ b/kernel/src/arch/i686/sys.c
@@ -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();
+}
diff --git a/kernel/src/arch/i686/time.c b/kernel/src/arch/i686/time.c
new file mode 100644
index 0000000..66fabc1
--- /dev/null
+++ b/kernel/src/arch/i686/time.c
@@ -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;
+}
+