Nigel
97606dbf71
As this project grows it becomes important to keep things properly organised. In this commit I've put some effort into making the kernel.cpp file more consise and thus improve its readability. Certain parts of the code have gotten their own definition file where before it was only a header file. - Moving the Supervisor Terminal into its own definition file. - Subtracting debugging messages with preprocessor ifdef's - Time and Date is now not just a header but has its own proper definition file - Banner is displayed when booting up - Terminal has a couple new commands Commmand Description =================|||||=================================================== DATE (was TIME) Displays the curren time, date and ticks VERSION Displays system version information MEMORY Displays memory information
109 lines
3.0 KiB
C++
109 lines
3.0 KiB
C++
#include "kernel.h"
|
|
#define GB2 262144
|
|
|
|
extern "C" void kernel_main (void);
|
|
|
|
extern "C" void early_main(unsigned long magic, unsigned long addr){
|
|
/**
|
|
* Initialize terminal interface
|
|
* NOTE: This should be done later on , the magic value should be checked first.
|
|
*/
|
|
kterm_init();
|
|
|
|
/**
|
|
* Check Multiboot magic number
|
|
* NOTE: Printf call should not be a thing this early on ...
|
|
*/
|
|
if (magic != MULTIBOOT_BOOTLOADER_MAGIC){
|
|
printf("Invalid magic number: 0x%x\n", magic);
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* Show a little banner for cuteness
|
|
*/
|
|
printf("|=== BarinkOS ===|\n");
|
|
|
|
|
|
/**
|
|
* Use the address given as an argument as the pointer
|
|
* to a Multiboot information structure.
|
|
*/
|
|
multiboot_info_t* mbt = (multiboot_info_t*) addr;
|
|
|
|
/*
|
|
If we got a memory map from our bootloader we
|
|
should be parsing it to find out the memory regions available.
|
|
*/
|
|
if (CHECK_FLAG(mbt->flags, 6))
|
|
{
|
|
printf("Preliminary results mmap scan:\n");
|
|
mapMultibootMemoryMap(mbt);
|
|
|
|
PhysicalMemoryManager_initialise( mbt->mmap_addr, GB2/* Seriously dangerous hardcoded memory value*/);
|
|
PhysicalMemoryManager_initialise_available_regions(mbt->mmap_addr, mbt->mmap_addr + mbt->mmap_length);
|
|
PhysicalMemoryManager_deinitialise_kernel();
|
|
}
|
|
|
|
initGDT();
|
|
init_idt();
|
|
// Enable interrupts
|
|
asm volatile("STI");
|
|
|
|
|
|
CheckMBT( (multiboot_info_t *) addr);
|
|
|
|
|
|
kernel_main();
|
|
|
|
}
|
|
|
|
extern "C" void kernel_main (void) {
|
|
init_serial();
|
|
pit_initialise();
|
|
|
|
while (true){
|
|
|
|
printf("SUPERVISOR:>$ " );
|
|
int characterCount = 0;
|
|
char command[10] = "";
|
|
|
|
// NOTE: lets just show a kernel prompt
|
|
uint8_t ScanCode = getKey();
|
|
while( ScanCode != 0x1C )
|
|
{
|
|
char character = getASCIIKey();
|
|
kterm_put(character );
|
|
// wHAT THE HELL
|
|
|
|
if( characterCount < 10 ){
|
|
command[characterCount] = character;
|
|
characterCount++;
|
|
}
|
|
|
|
ScanCode = getKey();
|
|
}
|
|
printf("\n");
|
|
KeyHandled();
|
|
|
|
|
|
if ( strncmp("TIME", command , characterCount ) == 0 ) {
|
|
read_rtc();
|
|
printf( "UTC time: %02d-%02d-%02d %02d:%02d:%02d (Ticks: %06d)\n" ,year, month, day, hour, minute, second, pit_tick);
|
|
} else if(strncmp("TEST", command, characterCount) == 0){
|
|
// asm volatile ("MOV $4, %AX ; MOV $0, %BX ; DIV %BX"); // IRS 0
|
|
}
|
|
else{
|
|
printf("Unknown command\n");
|
|
}
|
|
|
|
|
|
delay(1000);
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|