Mercurial > lcfOS
diff cos/kernel/kernel.c @ 24:d8627924d40d
Split up in more files and reboot command
author | windel |
---|---|
date | Fri, 02 Dec 2011 14:00:02 +0100 |
parents | 5dd47d6eebac |
children | dcce92b1efbc |
line wrap: on
line diff
--- a/cos/kernel/kernel.c Thu Dec 01 21:42:59 2011 +0100 +++ b/cos/kernel/kernel.c Fri Dec 02 14:00:02 2011 +0100 @@ -1,211 +1,9 @@ #include "kernel.h" -static int shiftstate = 0; -static volatile uint8_t charAvail = 0; -static volatile char kbdchar = ' '; - -static char keymap[128] = { - '?','?','1','2', '3', '4', '5','6', '7', '8','9', '0', '-','=', 0xe, '?', - 'q','w','e','r', 't', 'y', 'u','i', 'o', 'p','[', ']', '\n','?', 'a', 's', - 'd','f','g','h', 'j', 'k', 'l',';', '\'', '?','?', '?', 'z','x', 'c', 'v', - 'b','n','m',',', '.', '/', '?','?', '?', ' ','?', '?', '?','?', '?', '?', - - '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?', - '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?', - '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?', - '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?' -}; - -static char keymapUPPER[128] = { - '?','?','!','@', '#', '$', '%','^', '&', '*','(', ')', '_','+', '?', '?', - 'Q','W','E','R', 'T', 'Y', 'U','I', 'O', 'P','{', '}', '|','?', 'A', 'S', - 'D','F','G','H', 'J', 'K', 'L',':', '"', '?','?', '?', 'Z','X', 'C', 'V', - 'B','N','M','<', '>', '?', '?','?', '?', ' ','?', '?', '?','?', '?', '?', - - '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?', - '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?', - '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?', - '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?' -}; - -// IO port helpers: -void outb(uint16_t port, uint8_t value) -{ - asm volatile ("outb %1, %0" : : "dN" (port), "a" (value)); -} - -uint8_t inb(uint16_t port) -{ - uint8_t ret; - asm volatile ("inb %1, %0" : "=a" (ret) : "dN" (port)); - return ret; -} - -uint16_t inw(uint16_t port) -{ - uint16_t ret; - asm volatile ("inw %1, %0" : "=a" (ret) : "dN" (port)); - return ret; -} - - -static uint64_t ticks = 0; -void timerDriverUpdate() -{ - ticks++; -} - -uint64_t getTimeMS() -{ - return 55*ticks; -} - -int strncmp(const char* s1, const char* s2, int size) { - int i; - for (i=0; i<size; i++) { - if (s1[i] != s2[i]) return 0; - } - return 1; -} - -void keyboardDriverUpdate(unsigned char scancode) -{ - switch(scancode) { - case 0x2a: - shiftstate = 1; - break; - case 0xaa: - shiftstate = 0; - break; - default: - if (scancode < 128) { - if (charAvail == 0) { - if (shiftstate == 0) { - kbdchar = keymap[scancode]; - } else { - kbdchar = keymapUPPER[scancode]; - } - - charAvail = 1; - } - } else { - // Key release - //printf("Unhandled scancode: 0x%x\n", scancode); - } - break; - } -} - -char getChar() { - while (charAvail == 0); - char c = kbdchar; - charAvail = 0; - return c; -} - -void getline(char *buffer, int len) { - char c; - int i = 0; - while (i < len-1) { - c = getChar(); - if (c == '\n') { - // Enter - break; - } - if (c == 0x0e) { - if (i>0) { - printf(" "); - i--; - } - continue; - } - buffer[i] = c; - printf("%c", c); - i++; - } - buffer[i] = 0; -} - -#define HEAP_MAGIC 0xc0ffee -#define HEAP_START 0x400000 -#define HEAP_SIZE 0x200000 -#define HEAP_INUSE 1 -#define HEAP_FREE 0 - -typedef struct { - uint64_t magic; - uint64_t state; - uint64_t size; -} heap_t; - -/* - malloc and free divide the chunks of memory present at the heap - of the kernel into smaller parts. - The heap is located at: 0x -*/ -static heap_t* kernel_heap = (heap_t*) 0x400000; // 4 MB - 6 MB is heap -/* Allocates 'size' bytes and returns the pointer if succesfull. - Kernelpanic in case of failure.. -*/ - -void* kmalloc(uint64_t size) { - // printf("Malloc %d bytes\n", size); - - // Start at the beginning of our heap and search a free block: - heap_t *current = kernel_heap; - while (current->magic == HEAP_MAGIC) - { - if ((current->state == HEAP_FREE) && (current->size >= size)) - { - // Mark block as used: - current->state = HEAP_INUSE; - - // Insert a heap header if required: - if (current->size > size + sizeof(heap_t) + 1) - { - // Calculate location of the inserted header: - heap_t *newheader = (heap_t*) (((char*)current)+size+sizeof(heap_t)); - - // Set the new header fields: - newheader->size = current->size - size - sizeof(heap_t); - newheader->state = HEAP_FREE; - newheader->magic = HEAP_MAGIC; - - // Set the size of this block - current->size = size; - } - else - { - // We allocate this whole block - } - // Calculate the size of the block: - char *address = ((char*)current)+sizeof(heap_t); - return address; - - } - // Goto next heap block: - current = (heap_t*)(((char*) current) + current->size + sizeof(heap_t)); - } - return 0x0; -} - -void kfree(void* ptr) { - printf("Free address %x\n", ptr); -} - -void init_heap(void) -{ - // Initialize the kernel heap: - kernel_heap->magic = HEAP_MAGIC; - kernel_heap->state = HEAP_FREE; - kernel_heap->size = HEAP_SIZE - sizeof(heap_t); -} - void startPython() { // TODO: connect to Py_Main //PyRun_SimpleString("print('hello world')"); - } void testMalloc() @@ -222,10 +20,19 @@ kfree(a); } +void reboot() +{ + while ( (inb(0x64) & 0x02) == 0x02) + { + ; + } + outb(0x64, 0xFE); +} + void kmain() { init_screen(); - setupIDT(); + setupIDT(); // This causes error on real hardware init_heap(); printf("Welcome!\n"); @@ -237,7 +44,6 @@ getline(buffer, 70); // TODO: interpret this line with python :) printf("\n"); - printf("Got line: '%s'\n", buffer); if (buffer[0] == 'x') { printf("System time in ms: %d\n", getTimeMS()); @@ -251,6 +57,10 @@ printf("Help\n Try one of these commands:\n"); printf(" x: print system time in ms\n"); } + if (strncmp(buffer, "r", 1)) + { + reboot(); + } } }