jump to
@@ -7,10 +7,12 @@
#include <stdarg.h> #include "cedos/drivers/console.h" +#include "cedos/interrupts.h" int core_init(void); void printk(const char* string, ...); void kpanic(const char* string); +void kfault(const char* string, INTERRUPT_FRAME *frame, uint16_t err_code); void memdump(void* start, uint32_t size); void crit_enter(void); void crit_exit(void);
@@ -3,7 +3,7 @@ #define FAT_H
#include <stdint.h> -void *FAT_init(); +void FAT_init(); void *FAT_read_sector_offset(uint32_t lba, uint32_t *offset); void *FAT_read_cluster(uint16_t cluster, void *buffer); uint16_t FAT_next_cluster(uint16_t cluster);
@@ -64,7 +64,7 @@
for (int j = 0; j < 0x10; j++) { uint8_t* p = (uint8_t*)(i | j); - if (p >= start && p < (start + size)) { + if (p >= (uint8_t*)(start) && p < (uint8_t*)(start + size)) { printk_hex_char(*p); core_con->write_c(' '); } else {@@ -114,7 +114,6 @@ void printk(const char* fmt, ...) {
crit_enter(); va_list args; va_start(args, fmt); - uint32_t index = 0; enum { STATE_DEFAULT,@@ -163,6 +162,18 @@ void kpanic(const char* string) {
cli(); printk(string); core_con->write_c('\n'); + // register dump / stack dump + regdump(); + stackdump(); + while (1) {} +} + +void kfault(const char* string, INTERRUPT_FRAME *frame, uint16_t err_code) { + cli(); + printk("%s\n", string); + printk("EIP: %p\n", frame->eip); + printk("CS: %p\n", frame->cs); + printk("EFLAGS: %p\n", frame->eflags); // register dump / stack dump regdump(); stackdump();
@@ -14,8 +14,10 @@ uint32_t size = REALMD_SIZE;
VIRT_ADDR dest = (VIRT_ADDR)(REALMD_VMA); memcpy(dest, src, size); + return 0; } int graphics_set_mode(int mode) { realmode_int10h((uint32_t)(mode), 0, 0); + return 0; }
@@ -112,9 +112,8 @@ assert(sizeof(SECT_HEADER) == section_size);
for (int i = 0; i < num_sections; i++) { SECT_HEADER sh = sect_headers[i]; - char *name = (char*)(sect_names_addr + sh.name); - - PRINT_DBG("Section: %s\n", name); + + PRINT_DBG("Section: %s\n", (char*)(sect_names_addr + sh.name)); PRINT_DBG("- type: %i\n", sh.type); PRINT_DBG("- offset: %i\n", sh.offset); PRINT_DBG("- size: %i\n", sh.size);@@ -125,6 +124,7 @@ }
} PROCESS_ID elf_exec(const char *fname, char *args) { + crit_enter(); PRINT_DBG("Loading ELF executable \"%s\".\n", fname); VIRT_ADDR elf_addr = (VIRT_ADDR*)(0xA0000000); // TODO: needs to change when we have other file systems@@ -183,9 +183,10 @@
PRINT_DBG("\n"); PRINT_DBG("Entry point: %p\n", header->entry); + crit_exit(); // enter the process - PROCESS_MAIN *entry = header->entry; + PROCESS_MAIN *entry = (PROCESS_MAIN*)(header->entry); entry(args); return 0;
@@ -52,10 +52,9 @@ uint32_t FAT2_lba;
uint32_t root_lba; uint32_t data_lba; -void *FAT_init() { +void FAT_init() { const int sector_size = 512; const int sector_num = 128; - const int part_size = sector_size * sector_num; // open image file FAT_addr = (void*)(0x10000);@@ -109,7 +108,7 @@ return -1;
} // deleted file - if (dir_entry->name[0] == 0xE5) { + if (dir_entry->name[0] == (char)(0xE5)) { index++; continue; }@@ -169,9 +168,9 @@ }
uint16_t FAT_next_cluster(uint16_t cluster) { // assuming FAT12 - int offset = (cluster >> 1) * 3; + uint32_t *offset = (cluster >> 1) * 3; uint8_t *sect = FAT_read_sector_offset(FAT1_lba, &offset); - sect += offset; + sect += (uint32_t)(offset); if (cluster & 0x01) { uint16_t high = (uint16_t)(sect[2]);
@@ -1,4 +1,5 @@
#include "cedos/file.h" +#include "cedos/fat.h" #include "cedos/drivers/console.h" #include "cedos/drivers/keyboard.h"@@ -18,6 +19,7 @@ if (fd & 0x1000) {
return FAT_openat(fd, fname, flags); } else { // open other files + return 0; } }@@ -25,23 +27,25 @@ int file_read(int fd, char *buffer, uint32_t size) {
if (fd & 0x1000) { return FAT_read(fd, buffer, size); } else { - int i = 0; + uint32_t i = 0; while (i < size) { char table[] = { - '^', 0x1B, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '\\', '´', 0x08, - '\t', 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', 'o', 'p', 'ü', '+', '\n', - 0, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'ö', 'ä', '#', + '^', 0x1B, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '\\', '`', 0x08, + '\t', 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', 'o', 'p', '?', '+', '\n', + 0, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', '?', '?', '#', 0, '<', 'y', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '-', 0, 0, 0, ' ' }; uint32_t scancode = std_kb->read(); - char c = scancode >= 0 && scancode <= 60 ? table[scancode] : 0; + char c = scancode <= 60 ? table[scancode] : 0; if (c == 0) { continue; } buffer[i++] = c; } + return size; } } int file_write(int fd, char *buffer, uint32_t size) { - for (int i = 0; i < size; i++) { + for (uint32_t i = 0; i < size; i++) { std_con->write_c(buffer[i]); } + return size; }
@@ -31,7 +31,7 @@ kpanic("CRITICAL: DOUBLE FAULT");
} EXCEPTION(gpf_isr, frame, error_code) { - kpanic("CRITICAL: GENERAL PROTECTION FAULT"); + kfault("CRITICAL: GENERAL PROTECTION FAULT", frame, error_code); } INTERRUPT(pic1_handler, frame) {
@@ -16,7 +16,7 @@ {
*/*(.text) */*(.data) */*(.rodata*) - + */*(.bss) } >KERNEL_VMA REALMD : AT(LOADADDR(KERNEL) + SIZEOF(KERNEL))
@@ -116,41 +116,6 @@ crit_exit();
} } -int sysinit(void) { - uint8_t scancode = 0; - - memdump((VIRT_ADDR)0x10000000, 0x3000); - - //syscall(0, 0xCAFEBABE, 0xDEADBEEF, 0x42069420); - - printk("PRESS ENTER:"); - - do { - scancode = ps2_kb.read(); - printk("%c", scancode); - } while (scancode != 0x1C); - - printk("THANKS, NOW PRESS ESC TO EXIT:"); - - do { - scancode = ps2_kb.read(); - printk("%c", scancode); - } while (scancode != 0x01); - - syscall(1, 0, 0, 0); - - //while (1) { - // printk("x"); - // hlt(); - //} - - //sched_exec(create_empty_page_dir(), fibonacci, "fibonacci"); - //sched_exec(create_empty_page_dir(), node, "node"); - //while (get_process_count() < 5) { sched_yield(); } - //tasktree(1); - printk("Terminating.\n"); -} - int os_main(void) { infodump();
@@ -66,8 +66,6 @@ */
int force_map_page_to(PHYS_ADDR page_addr, uint32_t dir_index, uint32_t table_index, uint32_t flags) { PAGE_DIR_ENTRY* page_dir = PAGE_DIR_ALT_MAPPED_ADDR; PAGE_TABLE_ENTRY* page_table = PAGE_TABLE_ALT_MAPPED_ADDR(dir_index); - - int tmp = 0; if (!is_present(page_dir[dir_index])) { // acquire new page table@@ -83,7 +81,7 @@ }
int map_page_to(PHYS_ADDR page_addr, uint32_t dir_index, uint32_t table_index, uint32_t flags) { if (is_addr_available(dir_index, table_index)) { - force_map_page_to(page_addr, dir_index, table_index, flags); + return force_map_page_to(page_addr, dir_index, table_index, flags); } else { return 0; }@@ -107,14 +105,14 @@ }
int map_page_to_this(PHYS_ADDR page_addr, uint32_t dir_index, uint32_t table_index, uint32_t flags) { if (is_addr_available(dir_index, table_index)) { - force_map_page_to_this(page_addr, dir_index, table_index, flags); + return force_map_page_to_this(page_addr, dir_index, table_index, flags); } else { return 0; } } size_t copy_to_pdir(VIRT_ADDR src, size_t length, PHYS_ADDR pdir, VIRT_ADDR dest) { - VIRT_ADDR mount_dest = 0xe0000000; + VIRT_ADDR mount_dest = (VIRT_ADDR)(0xe0000000); mount_page_dir(pdir); PHYS_ADDR page;@@ -136,6 +134,8 @@ dest += part_length;
src += part_length; length -= part_length; } + + return dest; } int map_range_to(PHYS_ADDR page_dir, VIRT_ADDR dest, PHYS_ADDR src, uint32_t page_count, uint32_t flags) {@@ -210,4 +210,5 @@ }
int paging_init(void) { install_interrupt(0x0e, page_fault_isr, 0x18, TRAP_GATE); + return 0; }
@@ -15,6 +15,7 @@
// pass process stack as arguments push %ebx push %eax + xor %eax, %eax call sched_interrupt_c pop %eax pop %ebx
@@ -3,7 +3,7 @@
void stack_compute_checksum(STACK_CHECKSUM* checksum, const void *esp, const void *ebp) { *checksum = 0; - for (uint32_t *p = esp; p < ebp; p = &p[1]) { + for (uint32_t *p = (uint32_t)(esp); p < (uint32_t)(ebp); p = &p[1]) { *checksum ^= *p; } }
@@ -8,10 +8,6 @@ void test(uint32_t ebx, uint32_t ecx, uint32_t edx) {
printk("SYSCALL 0x01: EBX=%i ECX=%X EDX=%X\n", ebx, ecx, edx); } -int __sysprint(const char *fmt, int arg1, int arg2) { - printk(fmt, arg1, arg2); -} - void* SYSCALL_TABLE[] = { file_read, file_write,
@@ -17,4 +17,4 @@ mov %eax, (%esi)
// restore stack add $12, %esp - iret+ iret