#ifndef __SYSTEM_H #define __SYSTEM_H /* Types */ #define NULL ((void *)0UL) typedef unsigned long uintptr_t; typedef long size_t; typedef unsigned int uint32_t; typedef unsigned short uint16_t; typedef unsigned char uint8_t; typedef unsigned long long uint64_t; /* Unimportant Kernel Strings */ #define KERNEL_UNAME "ToAruOS" #define KERNEL_VERSION_STRING "0.0.1" #define CHAR_BIT 8 #define INT32_MAX 0x7fffffffL #define UINT32_MAX 0xffffffffL extern void *sbrk(uintptr_t increment); /* Kernel Main */ extern void *memcpy(void *restrict dest, const void *restrict src, size_t count); extern void *memset(void *dest, int val, size_t count); extern unsigned short *memsetw(unsigned short *dest, unsigned short val, int count); extern int strlen(const char *str); extern int atoi(const char *str); extern unsigned char inportb(unsigned short _port); extern void outportb(unsigned short _port, unsigned char _data); extern int strcmp(const char *a, const char *b); extern char * strtok_r(char * str, const char * delim, char ** saveptr); extern size_t lfind(const char * str, const char accept); extern size_t strspn(const char * str, const char * accept); extern char * strpbrk(const char * str, const char * accept); /* Panic */ #define HALT_AND_CATCH_FIRE(mesg) halt_and_catch_fire(mesg, __FILE__, __LINE__) #define ASSERT(statement) ((statement) ? (void)0 : assert_failed(__FILE__, __LINE__, #statement)) #define assert(statement) ((statement) ? (void)0 : assert_failed(__FILE__, __LINE__, #statement)) void halt_and_catch_fire(char *error_message, const char *file, int line); void assert_failed(const char *file, uint32_t line, const char *desc); /* VGA driver */ extern void cls(); extern void puts(char *str); extern void settextcolor(unsigned char forecolor, unsigned char backcolor); extern void resettextcolor(); extern void init_video(); extern void placech(unsigned char c, int x, int y, int attr); extern void writechf(unsigned char c); extern void writech(unsigned char c); /* GDT */ extern void gdt_install(); extern void gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran); /* IDT */ extern void idt_install(); extern void idt_set_gate(unsigned char num, unsigned long base, unsigned short sel, unsigned char flags); /* Registers */ struct regs { unsigned int gs, fs, es, ds; unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax; unsigned int int_no, err_code; unsigned int eip, cs, eflags, useresp, ss; }; typedef void (*irq_handler_t) (struct regs *); /* ISRS */ extern void isrs_install(); extern void isrs_install_handler(int isrs, irq_handler_t); extern void isrs_uninstall_handler(int isrs); /* Interrupt Handlers */ extern void irq_install(); extern void irq_install_handler(int irq, irq_handler_t); extern void irq_uninstall_handler(int irq); /* Timer */ extern void timer_install(); extern long timer_ticks; extern void timer_wait(int ticks); /* Keyboard */ typedef void (*keyboard_buffer_t)(char ch); keyboard_buffer_t keyboard_buffer_handler; extern void keyboard_install(); extern void keyboard_wait(); extern void putch(unsigned char c); /* kprintf */ extern void kprintf(const char *fmt, ...); extern int kgets(char *buf, int size); /* Memory Management */ extern uintptr_t placement_pointer; extern void kmalloc_startat(uintptr_t address); extern uintptr_t kmalloc_real(size_t size, int align, uintptr_t * phys); extern uintptr_t kmalloc(size_t size); extern uintptr_t kvmalloc(size_t size); extern uintptr_t kmalloc_p(size_t size, uintptr_t * phys); extern uintptr_t kvmalloc_p(size_t size, uintptr_t * phys); typedef struct page { uint32_t present:1; uint32_t rw:1; uint32_t user:1; uint32_t accessed:1; uint32_t dirty:1; uint32_t unused:7; uint32_t frame:20; } page_t; typedef struct page_table { page_t pages[1024]; } page_table_t; typedef struct page_directory { page_table_t *tables[1024]; /* 1024 pointers to page tables... */ uintptr_t physical_tables[1024]; /* Physical addresses of the tables */ uintptr_t physical_address; /* The physical address of physical_tables */ } page_directory_t; page_directory_t *kernel_directory; page_directory_t *current_directory; extern void paging_install(uint32_t memsize); extern void switch_page_directory(page_directory_t * new); extern page_t *get_page(uintptr_t address, int make, page_directory_t * dir); extern void page_fault(struct regs *r); void heap_install(); /* klmalloc */ void * __attribute__ ((malloc)) malloc(size_t size); void * __attribute__ ((malloc)) realloc(void *ptr, size_t size); void * __attribute__ ((malloc)) calloc(size_t nmemb, size_t size); void free(void *ptr); /* shell */ extern void start_shell(); /* Serial */ extern void serial_install(); extern char serial_recv(); extern void serial_send(char out); #endif