diff --git a/src/kernel/kmain.c b/src/kernel/kmain.c index 8aff6c6..4039830 100644 --- a/src/kernel/kmain.c +++ b/src/kernel/kmain.c @@ -8,7 +8,6 @@ #include "gdt.h" #include "idt.h" #include "system.h" -#include "paging.h" #include "../drivers/ata.h" #include #include "../drivers/framebuffer.h" @@ -62,10 +61,7 @@ void kmain(multiboot2_info *mb_info) irq_install(); __asm__ __volatile__("sti"); - //init_paging(); //test_read_sector(); - //uint32_t *ptr = (uint32_t*)0xA0000000; - //uint32_t do_page_fault = *ptr; timer_install(); keyboard_install(); diff --git a/src/kernel/loader.s b/src/kernel/loader.s index aa53c33..44f5fbe 100644 --- a/src/kernel/loader.s +++ b/src/kernel/loader.s @@ -26,7 +26,7 @@ CHECKSUM equ -(MAGIC_NUMBER + FLAGS + HEADER_LEN) ; Tags? (28bytes) ; Tag 1 : set graphics mode (only recommended, can be overriden by GRUB) - + align 8 dw 5 ; 2 dw 0 ; 2 dd 20 ; 4 @@ -36,8 +36,9 @@ CHECKSUM equ -(MAGIC_NUMBER + FLAGS + HEADER_LEN) ; End of tags + align 8 + dw 0 ; 2 dw 0 ; 2 - ;dw 0 ; 2 dd 8 ; 4 ; End of Multiboot 2 header diff --git a/src/kernel/paging.c b/src/kernel/paging.c deleted file mode 100644 index daa964a..0000000 --- a/src/kernel/paging.c +++ /dev/null @@ -1,151 +0,0 @@ -// Paging kernel module -// Author: xamidev -// Licensed under the Unlicense. See the repo below. -// https://github.com/xamidev/blankos - -#include -#include "paging.h" -#include "../libc/stdio.h" -#include "system.h" -#include "kheap.h" - -uint32_t *frames; -uint32_t nframes; - -extern uint32_t placement_address; - -static void set_frame(uint32_t frame_addr) -{ - uint32_t frame = frame_addr/0x1000; - uint32_t idx = INDEX_FROM_BIT(frame); - uint32_t off = OFFSET_FROM_BIT(frame); - frames[idx] |= (0x1 << off); -} - -static void clear_frame(uint32_t frame_addr) -{ - uint32_t frame = frame_addr/0x1000; - uint32_t idx = INDEX_FROM_BIT(frame); - uint32_t off = OFFSET_FROM_BIT(frame); - frames[idx] &= ~(0x1 << off); -} - -/* -static uint32_t test_frame(uint32_t frame_addr) -{ - uint32_t frame = frame_addr/0x1000; - uint32_t idx = INDEX_FROM_BIT(frame); - uint32_t off = OFFSET_FROM_BIT(frame); - return (frames[idx] & (0x1 << off)); -} -*/ - -static uint32_t first_frame() -{ - uint32_t i, j; - for (i=0; iframe != 0) - { - return; - } else { - uint32_t idx = first_frame(); - if (idx == (uint32_t)-1) - { - panic(); - } - set_frame(idx*0x1000); - page->present = 1; - page->rw = (is_writeable)?1:0; - page->user = (is_kernel)?0:1; - page->frame = idx; - } -} - -void free_frame(page_t *page) -{ - uint32_t frame; - if (!(frame=page->frame)) - { - return; - } else { - clear_frame(frame); - page->frame = 0x0; - } -} - -void init_paging() -{ - uint32_t mem_end_page = 0x10000000; - nframes = mem_end_page / 0x1000; - frames = (uint32_t*)kmalloc(INDEX_FROM_BIT(nframes)); - memset(frames, 0, INDEX_FROM_BIT(nframes)); - - page_directory_t* kernel_directory = (page_directory_t*)kmalloc_a(sizeof(page_directory_t)); - memset(kernel_directory, 0, sizeof(page_directory_t)); - //page_directory_t* current_directory = kernel_directory; - - unsigned int i = 0; - while (i < placement_address) - { - alloc_frame(get_page(i, 1, kernel_directory), 0, 0); - i += 0x1000; - } - - irq_install_handler(14, page_fault); - - switch_page_directory(kernel_directory); -} - -void switch_page_directory(page_directory_t *dir) -{ - //page_directory_t* current_directory = dir; - asm volatile("mov %0, %%cr3":: "r"(&dir->tablesPhysical)); - uint32_t cr0; - asm volatile("mov %%cr0, %0": "=r"(cr0)); - cr0 |= 0x80000000; - asm volatile("mov %0, %%cr0":: "r"(cr0)); -} - -page_t *get_page(uint32_t address, int make, page_directory_t *dir) -{ - address /= 0x1000; - uint32_t table_idx = address / 1024; - if (dir->tables[table_idx]) - { - return &dir->tables[table_idx]->pages[address%1024]; - } else if (make) - { - uint32_t tmp; - dir->tables[table_idx] = (page_table_t*)kmalloc_ap(sizeof(page_table_t), &tmp); - memset(dir->tables[table_idx], 0, 0x1000); - dir->tablesPhysical[table_idx] = tmp | 0x7; - return &dir->tables[table_idx]->pages[address%1024]; - } else { - return 0; - } - return 0; -} - -void page_fault() -{ - puts("Page fault"); - panic(); -} diff --git a/src/kernel/paging.h b/src/kernel/paging.h deleted file mode 100644 index fa7f063..0000000 --- a/src/kernel/paging.h +++ /dev/null @@ -1,43 +0,0 @@ -// Paging kernel module header -// Author: xamidev -// Licensed under the Unlicense. See the repo below. -// https://github.com/xamidev/blankos - -#ifndef PAGING_H -#define PAGING_H - -#include "system.h" -#include - -#define INDEX_FROM_BIT(a) (a/(8*4)) -#define OFFSET_FROM_BIT(a) (a%(8*4)) - -typedef struct -{ - 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_t pages[1024]; -} page_table_t; - -typedef struct -{ - page_table_t *tables[1024]; - uint32_t tablesPhysical[1024]; - uint32_t physicalAsddr; -} page_directory_t; - -void init_paging(); -void switch_page_directory(page_directory_t *new); -page_t *get_page(uint32_t address, int make, page_directory_t *dir); -void page_fault(); - -#endif diff --git a/src/kernel/shell.c b/src/kernel/shell.c index 21c55bd..0392c17 100644 --- a/src/kernel/shell.c +++ b/src/kernel/shell.c @@ -12,7 +12,7 @@ #include "../drivers/rtc.h" #define BUFFER_SIZE 256 -#define MAX_COMMANDS 16 +#define MAX_COMMANDS 64 #define MAX_ARGS 64 // Splash screen: esthetic stuff. @@ -104,6 +104,8 @@ void shell_install() register_command("rot13", program_rot13); register_command("morse", program_morse); register_command("cowsay", program_cowsay); + register_command("time", program_time); + register_command("read", program_read); for (;;) { diff --git a/src/programs/misc.c b/src/programs/misc.c index 960ae69..bc5d8c9 100644 --- a/src/programs/misc.c +++ b/src/programs/misc.c @@ -7,6 +7,8 @@ #include "../kernel/system.h" #include "../libc/string.h" #include "../drivers/framebuffer.h" +#include "../drivers/ata.h" +#include "../drivers/rtc.h" // Print a rainbow colorful text for testing @@ -49,7 +51,7 @@ void program_uptime() void program_help() { - printf("help\tpanic\twords\tprimes\trainbow\tclear\nmath\tbf\t uptime echo\t sysinfo\tconway\nrot13 morse\tcowsay\n"); + printf("help\tpanic\twords\tprimes\trainbow\tclear\nmath\tbf\t uptime echo\t sysinfo\tconway\nrot13 morse\tcowsay time\t read\n"); } // Panic @@ -72,3 +74,38 @@ void program_echo(int argc, char* argv[]) } puts("\n"); } + +// Get current RTC time + +void program_time() +{ + rtc_time_t time; + rtc_read_time(&time); + puts("Current RTC time: "); + print_time(&time); + puts("\n"); +} + +// Read a sector + +void program_read(int argc, char* argv[]) +{ + if (argc < 2) + { + printf("Usage: %s \n", argv[0]); + } else if (argc == 2) + { + uint8_t buffer[512]; + ata_read_sector(atoi(argv[1]), buffer); + + for (int i=0; i<512; i++) + { + if (i%50==0) puts("\n"); // hardcoded = bad + printf("%02x ", buffer[i]); + } + puts("\n"); + } else + { + puts("Invalid argument number\n"); + } +} diff --git a/src/programs/programs.h b/src/programs/programs.h index 8f6d327..16a2b55 100644 --- a/src/programs/programs.h +++ b/src/programs/programs.h @@ -29,5 +29,7 @@ void program_uptime(); void program_panic(); void program_help(); void program_echo(); +void program_time(); +void program_read(); #endif