diff --git a/com1.out b/com1.out index a2cf745..66b5100 100644 Binary files a/com1.out and b/com1.out differ diff --git a/iso/boot/kernel.elf b/iso/boot/kernel.elf index 4abba8b..4430a0e 100755 Binary files a/iso/boot/kernel.elf and b/iso/boot/kernel.elf differ diff --git a/src/kernel/kmain.c b/src/kernel/kmain.c index c14f6ad..0a9e5be 100644 --- a/src/kernel/kmain.c +++ b/src/kernel/kmain.c @@ -14,9 +14,12 @@ char* ascii_title = " o888ooo888 o888o 88ooo88 8o o888o o888o o888o o888o 88ooo88 o88oooo888\n\n" " --------------------------------- v0.3.45 --------------------------------\n\n"; -int kmain(int retvalue) +unsigned int g_multiboot_info_address; + +void kmain(unsigned int multiboot_info_address) { - + g_multiboot_info_address = multiboot_info_address; + init_serial(); log("serial connection established", 3); gdt_install(); @@ -29,18 +32,14 @@ int kmain(int retvalue) __asm__ __volatile__("sti"); log("initialized IRQs", 2), - log("kernel started", 2); - clear(); - colorputs(ascii_title, 10); colorputs(" by @xamidev - star the repo for a cookie!\n\n", 14); - - // TODO: Grub modules to load programs - + timer_install(); + log("initialized timer handler", 2); keyboard_install(); + log("initialized keyboard driver", 2); shell_install(); - - return retvalue; + log("started system shell", 2); } diff --git a/src/kernel/loader.s b/src/kernel/loader.s index f159209..2459695 100644 --- a/src/kernel/loader.s +++ b/src/kernel/loader.s @@ -19,7 +19,8 @@ extern kmain loader: cli ; mov eax, 0xCAFEBABE - push dword 42 + ; push dword 42 + push ebx call kmain .loop: diff --git a/src/kernel/shell.c b/src/kernel/shell.c index 9b69bfa..e5325ec 100644 --- a/src/kernel/shell.c +++ b/src/kernel/shell.c @@ -64,6 +64,7 @@ void shell_install() register_command("bf", program_bf); register_command("uptime", program_uptime); register_command("echo", program_echo); + register_command("sysinfo", program_sysinfo); for (;;) { diff --git a/src/kernel/sysinfo.c b/src/kernel/sysinfo.c new file mode 100644 index 0000000..b5b7bbe --- /dev/null +++ b/src/kernel/sysinfo.c @@ -0,0 +1,11 @@ +#include "../libc/stdio.h" +#include "../libc/string.h" + +void cpuid(int code, unsigned int* a, unsigned int* d) +{ + asm volatile("cpuid" + : "=a"(*a), "=d"(*d) + : "a"(code) + : "ecx", "ebx"); +} + diff --git a/src/kernel/sysinfo.h b/src/kernel/sysinfo.h new file mode 100644 index 0000000..66188ca --- /dev/null +++ b/src/kernel/sysinfo.h @@ -0,0 +1,6 @@ +#ifndef SYSINFO_H +#define SYSINFO_H + +void cpuid(int code, unsigned int* a, unsigned int* d); + +#endif diff --git a/src/kernel/system.h b/src/kernel/system.h index 0ca520e..a2884c3 100644 --- a/src/kernel/system.h +++ b/src/kernel/system.h @@ -26,5 +26,7 @@ int uptime(); extern volatile unsigned long global_ticks; +extern unsigned int g_multiboot_info_address; + #endif diff --git a/src/programs/misc.c b/src/programs/misc.c index 0fa54ac..7e0f126 100644 --- a/src/programs/misc.c +++ b/src/programs/misc.c @@ -45,7 +45,7 @@ void program_uptime() void program_help() { - printf("help\tpanic\twords\tprimes\trainbow\tclear\nmath\tbf\tuptime\techo\n"); + printf("help\tpanic\twords\tprimes\trainbow\tclear\nmath\tbf\t uptime echo\t sysinfo\n"); } // Panic diff --git a/src/programs/programs.h b/src/programs/programs.h index 66907ae..37ebde2 100644 --- a/src/programs/programs.h +++ b/src/programs/programs.h @@ -5,6 +5,10 @@ void program_words(); void program_primes(); void program_math(); void program_bf(); +void program_sysinfo(); + +void get_cpuid(); +void get_meminfo(unsigned int multiboot_info_address); // Misc void program_rainbow(); diff --git a/src/programs/sysinfo.c b/src/programs/sysinfo.c new file mode 100644 index 0000000..3ef7b45 --- /dev/null +++ b/src/programs/sysinfo.c @@ -0,0 +1,64 @@ + +#include "../kernel/sysinfo.h" +#include "../libc/stdio.h" +#include "../kernel/system.h" + +extern unsigned int multiboot_info_address; + +typedef struct multiboot_memory_map +{ + unsigned int size; + unsigned int base_addr_low; + unsigned int base_addr_high; + unsigned int length_low; + unsigned int length_high; + unsigned int type; +} multiboot_memory_map_t; + +void get_cpuid() +{ + // CPUid + + unsigned int eax, edx; + char vendor[13]; + unsigned int* v = (unsigned int*)vendor; + + asm volatile("cpuid" + : "=b"(v[0]), "=d"(v[1]), "=c"(v[2]) + : "a"(0)); + vendor[12] = '\0'; + + cpuid(1, &eax, &edx); + unsigned int model = (eax >> 4) & 0xF; + unsigned int family = (eax >> 8) & 0xF; + + printf("CPU information\n\tvendor: %s\n\tfamily: %u\n\tmodel: %u\n\tfeatures: 0x%x\n", vendor, family, model, edx); +} + +void get_meminfo(unsigned int multiboot_info_address) +{ + // RAM + + unsigned int mem_lower = *((unsigned int*)(multiboot_info_address + 4)); + unsigned int mem_upper = *((unsigned int*)(multiboot_info_address + 8)); + + printf("RAM information\n\tLower memory: %u KB\n\tUpper memory: %u KB\n", mem_lower, mem_upper); + + multiboot_memory_map_t* mmap = (multiboot_memory_map_t*)*((unsigned int*)(multiboot_info_address + 44)); + printf("\tMemory map:\n"); + + while ((unsigned int)mmap < multiboot_info_address + *((unsigned int*)(multiboot_info_address + 40))) + { + printf("\t\tBase addr: 0x%x%x\n\t\tLength: 0x%x%x\n\t\tType: %u\n", + mmap->base_addr_high, mmap->base_addr_low, + mmap->length_high, mmap->length_low, + mmap->type); + mmap = (multiboot_memory_map_t*)((unsigned int)mmap + mmap->size + sizeof(unsigned int)); + } +} + +void program_sysinfo() +{ + get_cpuid(); + get_meminfo(g_multiboot_info_address); +}