aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorFranklin Wei <frankhwei536@gmail.com>2015-03-01 14:20:47 -0500
committerFranklin Wei <frankhwei536@gmail.com>2015-03-01 14:20:47 -0500
commitc7252588ebb95f97631e9470778c69afa00c35b5 (patch)
tree06d760878e18f6cddbe4305cddd4d5dfa74529f8 /include
parentb8f54e63d2b8f8007c580adf2a6034c98a0f2eaa (diff)
downloadkappa-c7252588ebb95f97631e9470778c69afa00c35b5.zip
kappa-c7252588ebb95f97631e9470778c69afa00c35b5.tar.gz
kappa-c7252588ebb95f97631e9470778c69afa00c35b5.tar.bz2
kappa-c7252588ebb95f97631e9470778c69afa00c35b5.tar.xz
Huge restructure
Diffstat (limited to 'include')
-rw-r--r--include/arch/i686/drivers/gfx.h105
-rw-r--r--include/arch/i686/drivers/gfx_font.h4
-rw-r--r--include/arch/i686/drivers/pcspkr.h3
-rw-r--r--include/arch/i686/drivers/ps2_keymaps.h39
-rw-r--r--include/arch/i686/drivers/ps2kbd.h66
-rw-r--r--include/arch/i686/drivers/vgatext.h9
-rw-r--r--include/arch/i686/fpu.h2
-rw-r--r--include/arch/i686/gdt.h23
-rw-r--r--include/arch/i686/idt.h23
-rw-r--r--include/arch/i686/irq.h19
-rw-r--r--include/arch/i686/isr.h51
-rw-r--r--include/arch/i686/paging.h8
-rw-r--r--include/arch/i686/timer.h13
-rw-r--r--include/kernel/heap.h5
-rw-r--r--include/kernel/io.h5
-rw-r--r--include/kernel/log.h3
-rw-r--r--include/kernel/multiboot.h90
-rw-r--r--include/kernel/panic.h1
-rw-r--r--include/kernel/task.c16
-rw-r--r--include/kernel/task.h10
-rw-r--r--include/kernel/version.h2
-rw-r--r--include/stdio.h7
-rw-r--r--include/stdlib.h30
-rw-r--r--include/string.h4
24 files changed, 538 insertions, 0 deletions
diff --git a/include/arch/i686/drivers/gfx.h b/include/arch/i686/drivers/gfx.h
new file mode 100644
index 0000000..5e97100
--- /dev/null
+++ b/include/arch/i686/drivers/gfx.h
@@ -0,0 +1,105 @@
+#ifndef _GFX_H_
+#define _GFX_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+
+enum vga_color_t {
+ VGA_BLACK = 0,
+ VGA_BLUE = 1,
+ VGA_GREEN = 2,
+ VGA_CYAN = 3,
+ VGA_RED = 4,
+ VGA_MAGENTA = 5,
+ VGA_BROWN = 6,
+ VGA_LIGHT_GRAY = 7,
+ VGA_DARK_GRAY = 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_WIDTH 80
+#define VGA_HEIGHT 25
+
+#define VGA_MAKE_COLOR(fg, bg) (fg | bg << 4)
+#define VGA_MAKE_ENTRY(ch, col) (((uint16_t)ch)|((uint16_t)col<<8))
+#define VGA_RGBPACK(r, g, b) ((r << 16)|(g << 8)|(b << 0))
+
+#define GFX_WHITE 0xFFFFFF
+#define GFX_BLACK 0x000000
+
+struct vbe_info_t;
+
+bool gfx_init(struct vbe_info_t *vbe_mode_info);
+
+extern void (*gfx_drawpixel)(int x, int y);
+
+/* transparent background */
+void gfx_drawchar(int x, int y, int ch);
+
+/* fills the background with bgcolor */
+void gfx_drawchar_bg(int x, int y, int ch);
+
+void gfx_putchar(int ch);
+
+void gfx_puts(const char* str);
+
+/* this function can be different from resolution to resolution */
+extern void (*gfx_clear)(void);
+
+void gfx_reset(void);
+
+void gfx_set_foreground(uint32_t);
+
+uint32_t gfx_get_foreground(void);
+
+void gfx_set_background(uint32_t);
+
+uint32_t gfx_get_background(void);
+
+void (*gfx_hline)(int x1, int x2, int y);
+
+void (*gfx_vline)(int y1, int y2, int x);
+
+void gfx_fillrect(int x1, int y1, int w, int h);
+
+void gfx_drawline(int x1, int y1, int x2, int y2);
+
+/* these circle algorithms are very fast */
+void gfx_drawcircle(int cx, int cy, int rad);
+
+void gfx_fillcircle(int cx, int cy, int rad);
+
+void gfx_filltriangle(int x1, int y1, int x2, int y2, int x3, int y3);
+
+extern const uint16_t *gfx_width, *gfx_height;
+
+/* this is _BYTES_ per pixel, NOT BITS per pixel! */
+extern const uint8_t *gfx_bpp;
+
+struct bitmap_t {
+ unsigned int w, h;
+ unsigned int bpp;
+ uint8_t *data;
+};
+
+void gfx_bitmap(int x, int y, const struct bitmap_t*);
+
+void gfx_drawrect(int x, int y, int w, int h);
+
+void gfx_set_doublebuffer(bool);
+
+bool gfx_get_doublebuffer(void);
+
+/* don't call this wo/ double buffering! */
+void gfx_update(void);
+
+void gfx_putsxy(int, int, const char*);
+
+void gfx_putsxy_bg(int, int, const char*);
+#endif
diff --git a/include/arch/i686/drivers/gfx_font.h b/include/arch/i686/drivers/gfx_font.h
new file mode 100644
index 0000000..f7db9d7
--- /dev/null
+++ b/include/arch/i686/drivers/gfx_font.h
@@ -0,0 +1,4 @@
+#include <stdint.h>
+#define FONT_WIDTH 8
+#define FONT_HEIGHT 12
+extern const uint8_t gfx_font[][FONT_HEIGHT];
diff --git a/include/arch/i686/drivers/pcspkr.h b/include/arch/i686/drivers/pcspkr.h
new file mode 100644
index 0000000..84e640f
--- /dev/null
+++ b/include/arch/i686/drivers/pcspkr.h
@@ -0,0 +1,3 @@
+#include <stdint.h>
+
+void pcspkr_play(uint32_t freq);
diff --git a/include/arch/i686/drivers/ps2_keymaps.h b/include/arch/i686/drivers/ps2_keymaps.h
new file mode 100644
index 0000000..0e8ae26
--- /dev/null
+++ b/include/arch/i686/drivers/ps2_keymaps.h
@@ -0,0 +1,39 @@
+#include <stdint.h>
+
+#define EXTENDED_SCANCODE 0xE0
+
+#define ERROR_KEY 0
+#define PRINTING_KEY 1
+#define SPECIAL_KEY 2
+
+#define SPECIAL_NONE 0
+#define SPECIAL_SHIFT 1
+#define SPECIAL_CTRL 2
+#define SPECIAL_BKSP 3
+#define SPECIAL_ALT 4
+#define SPECIAL_GUI 5
+#define SPECIAL_NUMLOCK 6
+#define SPECIAL_CAPLOCK 7
+#define SPECIAL_SCRLLOCK 8
+#define SPECIAL_UPARROW 9
+#define SPECIAL_DNARROW 10
+#define SPECIAL_LFTARROW 11
+#define SPECIAL_RTARROW 12
+#define SPECIAL_ESC 13
+#define SPECIAL_F1 21
+#define SPECIAL_F2 22
+#define SPECIAL_F3 23
+#define SPECIAL_F4 24
+#define SPECIAL_F5 25
+#define SPECIAL_F6 26
+#define SPECIAL_F7 27
+#define SPECIAL_F8 28
+#define SPECIAL_F9 29
+#define SPECIAL_F10 30
+#define SPECIAL_F11 31
+#define SPECIAL_F12 32
+
+extern uint8_t ps2_set1_scancodes[128];
+extern char ps2_set1_ascii[128];
+extern char ps2_set1_shift[128];
+extern uint8_t ps2_set1_special[128];
diff --git a/include/arch/i686/drivers/ps2kbd.h b/include/arch/i686/drivers/ps2kbd.h
new file mode 100644
index 0000000..9e353ee
--- /dev/null
+++ b/include/arch/i686/drivers/ps2kbd.h
@@ -0,0 +1,66 @@
+/* this is both a PS/2 keyboard AND a PS/2 MOUSE driver */
+#ifndef _PS2KBD_H_
+#define _PS2KBD_H_
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#define PS2_SCROLL_LOCK (1 << 0)
+#define PS2_NUM_LOCK (1 << 1)
+#define PS2_CAPS_LOCK (1 << 2)
+
+#define BUTTON_UP (1 << 0)
+#define BUTTON_LEFT (1 << 1)
+#define BUTTON_DOWN (1 << 2)
+#define BUTTON_RIGHT (1 << 3)
+
+#define MODIFIER_NONE 0
+#define MODIFIER_SHIFT (1 << 0)
+#define MODIFIER_CTRL (1 << 1)
+#define MODIFIER_ALT (1 << 2)
+
+struct ps2_specialkeys_t {
+ int shift :1;
+ int ctrl :1;
+ int bksp :1;
+ int alt :1;
+ int gui :1;
+ int numlock :1;
+ int capslock :1;
+ int scrllock :1;
+ int uparrow :1;
+ int downarrow :1;
+ int leftarrow :1;
+ int rightarrow :1;
+ int esc :1;
+ int f1 :1;
+ int f2 :1;
+ int f3 :1;
+ int f4 :1;
+ int f5 :1;
+ int f6 :1;
+ int f7 :1;
+ int f8 :1;
+ int f9 :1;
+ int f10 :1;
+ int f11 :1;
+ int f12 :1;
+};
+
+struct ps2_keyevent {
+ const struct ps2_specialkeys_t *special_keys;
+ char ascii;
+};
+
+/* returns which arrow keys are down */
+uint8_t ps2kbd_button_get(void);
+
+uint8_t ps2kbd_modifier_get(void);
+
+void ps2kbd_set_leds(uint8_t status);
+
+void ps2kbd_set_handler(void (*h)(const struct ps2_keyevent*));
+
+void ps2kbd_init(void);
+
+#endif
diff --git a/include/arch/i686/drivers/vgatext.h b/include/arch/i686/drivers/vgatext.h
new file mode 100644
index 0000000..1cfe4c4
--- /dev/null
+++ b/include/arch/i686/drivers/vgatext.h
@@ -0,0 +1,9 @@
+#include <stdint.h>
+
+void vgatext_init(void);
+void vgatext_clear(void);
+void vgatext_set_color(uint8_t);
+uint8_t vgatext_get_color(void);
+void vgatext_putchar_at(int ch, uint8_t color, int x, int y);
+void vgatext_putchar(int ch);
+void vgatext_puts(const char*);
diff --git a/include/arch/i686/fpu.h b/include/arch/i686/fpu.h
new file mode 100644
index 0000000..0eb448a
--- /dev/null
+++ b/include/arch/i686/fpu.h
@@ -0,0 +1,2 @@
+void fpu_enable(void);
+void fpu_disable(void);
diff --git a/include/arch/i686/gdt.h b/include/arch/i686/gdt.h
new file mode 100644
index 0000000..4cf7c4f
--- /dev/null
+++ b/include/arch/i686/gdt.h
@@ -0,0 +1,23 @@
+#include <stdint.h>
+
+struct gdt_entry {
+ uint16_t limit_low;
+ uint16_t base_low;
+ uint8_t base_middle;
+ uint8_t access;
+ uint8_t granularity;
+ uint8_t base_high;
+} __attribute__((packed));
+
+struct gdt_ptr {
+ uint16_t limit;
+ uint32_t base;
+} __attribute__((packed));
+
+struct gdt_entry gdt[3];
+struct gdt_ptr gp;
+
+/* assembly */
+extern void gdt_flush(uint32_t);
+
+void gdt_init(void);
diff --git a/include/arch/i686/idt.h b/include/arch/i686/idt.h
new file mode 100644
index 0000000..250ab82
--- /dev/null
+++ b/include/arch/i686/idt.h
@@ -0,0 +1,23 @@
+#include <stdint.h>
+
+struct idt_entry {
+ uint16_t base_lo;
+ uint16_t sel;
+ uint8_t zero;
+ uint8_t flags;
+ uint16_t base_hi;
+} __attribute__((packed));
+
+struct idt_ptr {
+ uint16_t limit;
+ uint32_t base;
+} __attribute__((packed));
+
+struct idt_entry idt[0x100];
+struct idt_ptr idt_pt;
+
+void idt_init(void);
+
+extern void idt_flush(uint32_t);
+
+void idt_set_gate(uint8_t idx, uint32_t base, uint16_t sel, uint8_t flags);
diff --git a/include/arch/i686/irq.h b/include/arch/i686/irq.h
new file mode 100644
index 0000000..13461e9
--- /dev/null
+++ b/include/arch/i686/irq.h
@@ -0,0 +1,19 @@
+extern void _irq0(void);
+extern void _irq1(void);
+extern void _irq2(void);
+extern void _irq3(void);
+extern void _irq4(void);
+extern void _irq5(void);
+extern void _irq6(void);
+extern void _irq7(void);
+extern void _irq8(void);
+extern void _irq9(void);
+extern void _irq10(void);
+extern void _irq11(void);
+extern void _irq12(void);
+extern void _irq13(void);
+extern void _irq14(void);
+extern void _irq15(void);
+extern void _int0x80(void);
+
+void irq_init(void);
diff --git a/include/arch/i686/isr.h b/include/arch/i686/isr.h
new file mode 100644
index 0000000..4cc7f1b
--- /dev/null
+++ b/include/arch/i686/isr.h
@@ -0,0 +1,51 @@
+#include <stdint.h>
+
+/* these are all implemented in isr-as.S */
+extern void _isr0(void);
+extern void _isr1(void);
+extern void _isr2(void);
+extern void _isr3(void);
+extern void _isr4(void);
+extern void _isr5(void);
+extern void _isr6(void);
+extern void _isr7(void);
+extern void _isr8(void);
+extern void _isr9(void);
+extern void _isr10(void);
+extern void _isr11(void);
+extern void _isr12(void);
+extern void _isr13(void);
+extern void _isr14(void);
+extern void _isr15(void);
+extern void _isr16(void);
+extern void _isr17(void);
+extern void _isr18(void);
+extern void _isr19(void);
+extern void _isr20(void);
+extern void _isr21(void);
+extern void _isr22(void);
+extern void _isr23(void);
+extern void _isr24(void);
+extern void _isr25(void);
+extern void _isr26(void);
+extern void _isr27(void);
+extern void _isr28(void);
+extern void _isr29(void);
+extern void _isr30(void);
+extern void _isr31(void);
+
+/* installs ISR's 0-31 */
+void isr_init(void);
+
+/* This defines what the stack looks like after an ISR was running */
+struct regs_t {
+ uint32_t gs, fs, es, ds; /* pushed the segs last */
+ uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; /* pushed by 'pusha' */
+ uint32_t int_no; /* interrupt stubs do this */
+ uint32_t err_code; /* exceptions push this */
+ uint32_t eip, cs, eflags, useresp, ss; /* pushed by the processor automatically */
+} __attribute__((packed));
+
+#define IRQ(x) (32+x)
+
+void set_interrupt_handler(uint8_t interrupt, void (*func)(struct regs_t*));
diff --git a/include/arch/i686/paging.h b/include/arch/i686/paging.h
new file mode 100644
index 0000000..0481069
--- /dev/null
+++ b/include/arch/i686/paging.h
@@ -0,0 +1,8 @@
+#define PAGE_PRESENT (1<<0)
+#define PAGE_RW (1<<1)
+#define PAGE_USER (1<<2)
+
+#define PAGE_MASK 0xFFFFF000
+#define PAGE_SIZE 0x1000
+
+void paging_init(void);
diff --git a/include/arch/i686/timer.h b/include/arch/i686/timer.h
new file mode 100644
index 0000000..7a15949
--- /dev/null
+++ b/include/arch/i686/timer.h
@@ -0,0 +1,13 @@
+#include <stdint.h>
+
+#define HZ 100
+#define PIT_FREQ 1193182
+
+extern volatile const uint64_t *current_tick;
+
+struct regs_t;
+
+void timer_init(uint32_t freq);
+
+/* NOTE: enables interrupts by default */
+void timer_delay(uint64_t ticks);
diff --git a/include/kernel/heap.h b/include/kernel/heap.h
new file mode 100644
index 0000000..dfadf36
--- /dev/null
+++ b/include/kernel/heap.h
@@ -0,0 +1,5 @@
+#include <stddef.h>
+void *kmalloc(size_t);
+void *kmalloc_a(size_t);
+void *kmalloc_p(size_t, void**);
+void *kmalloc_ap(size_t, void**);
diff --git a/include/kernel/io.h b/include/kernel/io.h
new file mode 100644
index 0000000..d1177ac
--- /dev/null
+++ b/include/kernel/io.h
@@ -0,0 +1,5 @@
+#include <stdint.h>
+void outb(uint16_t port, uint8_t val);
+void outw(uint16_t port, uint16_t val);
+uint8_t inb(uint16_t port);
+uint16_t inw(uint16_t port);
diff --git a/include/kernel/log.h b/include/kernel/log.h
new file mode 100644
index 0000000..1a28c0d
--- /dev/null
+++ b/include/kernel/log.h
@@ -0,0 +1,3 @@
+void log_putchar(int);
+void log_puts(const char*);
+void log(const char*, ...);
diff --git a/include/kernel/multiboot.h b/include/kernel/multiboot.h
new file mode 100644
index 0000000..e1f7cf0
--- /dev/null
+++ b/include/kernel/multiboot.h
@@ -0,0 +1,90 @@
+#include <stdint.h>
+
+struct multiboot_aout_symbol_table_t
+{
+ uint32_t tabsize;
+ uint32_t strsize;
+ uint32_t addr;
+ uint32_t reserved;
+} __attribute__((packed));
+
+struct multiboot_elf_section_header_table_t
+{
+ uint32_t num;
+ uint32_t size;
+ uint32_t addr;
+ uint32_t shndx;
+} __attribute__((packed));
+
+struct vbe_info_t {
+ uint16_t attributes;
+ uint8_t winA, winB;
+ uint16_t granularity;
+ uint16_t winsize;
+ uint16_t segmentA, segmentB;
+ uint32_t realFctPtr;
+ uint16_t pitch;
+ uint16_t Xres, Yres;
+ uint8_t Wchar, Ychar, planes, bpp, banks;
+ uint8_t memory_model, bank_size, image_pages;
+ uint8_t reserved0;
+ uint8_t red_mask, red_position;
+ uint8_t green_mask, green_position;
+ uint8_t blue_mask, blue_position;
+ uint8_t rsv_mask, rsv_position;
+ uint8_t directcolor_attributes;
+ uint32_t physbase;
+ uint32_t reserved1;
+ uint16_t reserved2;
+} __attribute__((packed));
+
+struct multiboot_info_t
+{
+ /* Multiboot info version number */
+ uint32_t flags;
+
+ /* Available memory from BIOS */
+ uint32_t mem_lower;
+ uint32_t mem_upper;
+
+ /* "root" partition */
+ uint32_t boot_device;
+
+ /* Kernel command line */
+ uint32_t cmdline;
+
+ /* Boot-Module list */
+ uint32_t mods_count;
+ uint32_t mods_addr;
+
+ union
+ {
+ struct multiboot_aout_symbol_table_t aout_sym;
+ struct multiboot_elf_section_header_table_t elf_sec;
+ } u;
+
+ /* Memory Mapping buffer */
+ uint32_t mmap_length;
+ uint32_t mmap_addr;
+
+ /* Drive Info buffer */
+ uint32_t drives_length;
+ uint32_t drives_addr;
+
+ /* ROM configuration table */
+ uint32_t config_table;
+
+ /* Boot Loader Name */
+ uint32_t boot_loader_name;
+
+ /* APM table */
+ uint32_t apm_table;
+
+ /* Video */
+ uint32_t vbe_control_info;
+ uint32_t vbe_mode_info;
+ uint16_t vbe_mode;
+ uint16_t vbe_interface_seg;
+ uint16_t vbe_interface_off;
+ uint16_t vbe_interface_len;
+} __attribute__((packed));
diff --git a/include/kernel/panic.h b/include/kernel/panic.h
new file mode 100644
index 0000000..db53e8e
--- /dev/null
+++ b/include/kernel/panic.h
@@ -0,0 +1 @@
+void panic(const char*, ...);
diff --git a/include/kernel/task.c b/include/kernel/task.c
new file mode 100644
index 0000000..ecc0042
--- /dev/null
+++ b/include/kernel/task.c
@@ -0,0 +1,16 @@
+#include "task.h"
+
+void task_create(struct task_t *task, void (*func)(void), uint32_t flags, uint32_t *pagedir)
+{
+ task->regs.eax = 0;
+ task->regs.ebx = 0;
+ task->regs.ecx = 0;
+ task->regs.edx = 0;
+ task->regs.esi = 0;
+ task->regs.edi = 0;
+ task->regs.eflags = flags;
+ task->regs.eip = (uint32_t)main;
+ task->regs.cr3 = (uint32_t)pagedir;
+ task->regs.esp = kmalloc(0x1000) + 0x1000;
+ task->next = NULL;
+}
diff --git a/include/kernel/task.h b/include/kernel/task.h
new file mode 100644
index 0000000..86beed3
--- /dev/null
+++ b/include/kernel/task.h
@@ -0,0 +1,10 @@
+#include <stdint.h>
+
+struct taskregs_t {
+ uint32_t eax, ebx, ecx, edx, esi, edi, esp, ebp, eip, eflags, cr3;
+};
+
+struct task_t {
+ struct taskregs_t regs;
+ struct task_t *next;
+};
diff --git a/include/kernel/version.h b/include/kernel/version.h
new file mode 100644
index 0000000..8fff367
--- /dev/null
+++ b/include/kernel/version.h
@@ -0,0 +1,2 @@
+#define KAPPA_KERNEL_VERSION "0.0.1-alpha"
+#define KAPPA_KERNEL_CODENAME "Ayatollah's Buybacks"
diff --git a/include/stdio.h b/include/stdio.h
new file mode 100644
index 0000000..49966cf
--- /dev/null
+++ b/include/stdio.h
@@ -0,0 +1,7 @@
+int printf(const char* fmt, ...) __attribute__ ((format (printf, 1, 2)));;
+int puts(const char*);
+int putchar(int);
+
+/* sets the I/O functions, allows easy switching between text mode and VBE */
+void set_putchar(void (*func)(int));
+void set_puts(void (*func)(const char*));
diff --git a/include/stdlib.h b/include/stdlib.h
new file mode 100644
index 0000000..f55f0f5
--- /dev/null
+++ b/include/stdlib.h
@@ -0,0 +1,30 @@
+#ifndef _STDLIB_H_
+#define _STDLIB_H_
+
+#include <stddef.h>
+#include <stdio.h>
+#include <stdint.h>
+
+/* this is by no means standards-compliant... but who cares? :P */
+
+/* NOT reentrant! */
+char* itoa(int val, int base);
+
+#define RAND_MAX ((1U << 31) - 1)
+
+#define MIN(x,y) ((x<y)?x:y)
+#define MAX(x,y) ((x>y)?x:y)
+
+uint64_t rand64(void);
+unsigned int rand(void);
+void srand(uint64_t);
+int abs(int);
+void *malloc(size_t);
+int snprintf(char*, int, const char*, ...);
+void assert_fail(const char*, const char*, int);
+int toupper(int);
+int tolower(int);
+
+#define assert(x) if(!(x))assert_fail(__func__, __FILE__, __LINE__);
+
+#endif
diff --git a/include/string.h b/include/string.h
new file mode 100644
index 0000000..05050a0
--- /dev/null
+++ b/include/string.h
@@ -0,0 +1,4 @@
+#include <stddef.h>
+int strlen(const char*);
+void* memset(void*, int, size_t);
+void* memcpy(void*, void*, size_t);