diff --git a/source/kernel/boot/boot.s b/source/kernel/boot/boot.s index c5414f9..ca822c4 100644 --- a/source/kernel/boot/boot.s +++ b/source/kernel/boot/boot.s @@ -99,11 +99,9 @@ isPaging: # Unmap the identity mapping as it is now unnecessary # movl $0, boot_page_directory + 0 - - - call early_main + call kernel cli 1: hlt @@ -115,4 +113,18 @@ isPaging: .include "./source/kernel/irq_table.s" .include "./source/kernel/interrupts/idt.s" +.globl jump_usermode +jump_usermode: + mov $((4*8) | 3) , %ax + mov %ax, %ds + mov %ax, %es + mov %ax, %fs + mov %ax, %gs + mov %esp, %eax + push $( (3*8) | 3) + push %eax + pushf + push $( ( 3 * 8) | 3) + push startSuperVisorTerminal + iret diff --git a/source/kernel/definitions.h b/source/kernel/definitions.h index 942949d..c29df40 100644 --- a/source/kernel/definitions.h +++ b/source/kernel/definitions.h @@ -4,6 +4,6 @@ */ #define __DEBUG__ false -#define KERNEL_VERSION 0 +#define KERNEL_VERSION 0.03 #define ARCHITECTURE "I386" diff --git a/source/kernel/kernel.cpp b/source/kernel/kernel.cpp index 62a3ff0..5e0dd90 100644 --- a/source/kernel/kernel.cpp +++ b/source/kernel/kernel.cpp @@ -21,6 +21,7 @@ extern "C"{ #include "interrupts/idt.h" #include "serial.h" extern "C" void LoadGlobalDescriptorTable(); +extern "C" void jump_usermode(); void set_protected_bit() { @@ -63,18 +64,13 @@ extern "C" void kernel () printf("Enable Protected mode and jump to kernel main\n"); - // Set the protected bit of control register 0 - // this will put the CPU into protected mode - // NOTE: This should really be a assembly procedure - // We cant directly write to control register 0 - // therefor we copy the value of control register 0 into eax - // once we are done manipulating the value we write the value in - // eax back to control register 0 + set_protected_bit(); - asm volatile("mov %cr0, %eax "); - asm volatile("or $1, %eax"); - asm volatile("mov %eax, %cr0"); - - pit_initialise(); +#ifdef USERMODE_RELEASE + // Lets jump into user mode + jump_usermode(); +#else + startSuperVisorTerminal(); +#endif } \ No newline at end of file diff --git a/source/kernel/supervisorterminal/superVisorTerminal.cpp b/source/kernel/supervisorterminal/superVisorTerminal.cpp index a178fd8..1a5cc67 100644 --- a/source/kernel/supervisorterminal/superVisorTerminal.cpp +++ b/source/kernel/supervisorterminal/superVisorTerminal.cpp @@ -4,7 +4,13 @@ #include "../filesystem/FAT/BiosParameterBlock.h" #include "../filesystem/FAT/DirectoryEntry.h" bool isRunning = true; -void startSuperVisorTerminal(){ +extern "C" void startSuperVisorTerminal() +{ + /* + * Show a little banner for cuteness + */ + printf("|=== BarinkOS ===|\n"); + while (isRunning){ printf("SUPERVISOR:>$ " ); @@ -115,7 +121,7 @@ void startSuperVisorTerminal(){ uint16_t biosparameterblock[256]; ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, mbr->TableEntries[0].LBA_partition_start, biosparameterblock); - BiosParameterBlock* bpb = (BiosParameterBlock*) biosparameterblock; + auto* bpb = (BiosParameterBlock*) biosparameterblock; printf("\nBPB: Bytes per Sector %d\n", bpb->BytesPerSector ); @@ -138,8 +144,8 @@ void startSuperVisorTerminal(){ ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, FATAddress, FAT ); // Show data in terminal - for(int i = 0; i < 256; i++ ) { - printf("%x ", FAT[i]); + for(unsigned short i : FAT) { + printf("%x ", i); } kterm_put('\n'); @@ -149,33 +155,35 @@ void startSuperVisorTerminal(){ uint16_t data2 [256]; ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, RootDirectoryRegion, data2 ); - DirectoryEntry* RootDirectory = (DirectoryEntry*) data2; + auto* RootDirectory = (DirectoryEntry*) data2; // List files in root for(int i= 0; i < bpb->NumberOfDirectoryEntries ; i++ ) { - DirectoryEntry* entry = (DirectoryEntry*)((uint32_t) RootDirectory + (i * sizeof(DirectoryEntry))); + auto* entry = (DirectoryEntry*)((uint32_t) RootDirectory + (i * sizeof(DirectoryEntry))); if( entry->filename[0] == (uint8_t) 0x00 ) break; // There are no more entries in this directory or the entry is free - if( entry->attribute & 0x01 == 0x01 || entry->attribute & 0x20 == 0x20) + if( (entry->attribute & 0x01) == 0x01 || (entry->attribute & 0x20) == 0x20) continue; // Skip listing if hidden or Achieve flag is set // Print the filename; - for( int n = 0; n < 8; n++ ){ - if(entry->filename[n] == 0x20) + for(char n : entry->filename){ + if(n == 0x20) break; - kterm_put(entry->filename[n]); - }kterm_put('\n'); + kterm_put(n); + } + kterm_put('\n'); - for( int n = 0; n < 3; n++){ - kterm_put(entry->Extension[n]); - }kterm_put('\n'); + for(unsigned char n : entry->Extension){ + kterm_put(n); + } + kterm_put('\n'); printf("Attribute: %x \n" , entry->attribute); printf("FileSize: %d Bytes\n", entry->FilesizeInBytes); - if( entry->FilesizeInBytes != 0x0 || entry->attribute & 0x8 == 0x0){ + if( entry->FilesizeInBytes != 0x0 || (entry->attribute & 0x8) == 0x0){ printf("Show contents"); printf( "Start cluster of the file: 0x%x\n" , entry->StartingCluster); @@ -187,11 +195,11 @@ void startSuperVisorTerminal(){ uint16_t dataBlob [256]; ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, sector, dataBlob ); - for( int n = 0; n < 256; n++) + for(unsigned short n : dataBlob) { - kterm_put(dataBlob[n] & 0x00ff); + kterm_put(n & 0x00ff); - kterm_put(dataBlob[n] >> 8); + kterm_put(n >> 8); }kterm_put('\n'); diff --git a/source/kernel/supervisorterminal/superVisorTerminal.h b/source/kernel/supervisorterminal/superVisorTerminal.h index 3ca186e..ad3c39b 100644 --- a/source/kernel/supervisorterminal/superVisorTerminal.h +++ b/source/kernel/supervisorterminal/superVisorTerminal.h @@ -8,4 +8,4 @@ extern "C" { #include "../../lib/include/string.h" } -void startSuperVisorTerminal(); \ No newline at end of file +extern "C" void startSuperVisorTerminal(); \ No newline at end of file