98 lines
4.3 KiB
C
98 lines
4.3 KiB
C
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <lib.h>
|
|
#include <moduleLoader.h>
|
|
#include <naiveConsole.h>
|
|
#include "video.h"
|
|
#include "keyboard.h"
|
|
#include "time.h"
|
|
#include "pcb.h"
|
|
|
|
extern uint8_t text;
|
|
extern uint8_t rodata;
|
|
extern uint8_t data;
|
|
extern uint8_t bss;
|
|
extern uint8_t endOfKernelBinary;
|
|
extern uint8_t endOfKernel;
|
|
|
|
static const uint64_t PageSize = 0x1000;
|
|
|
|
static void * const sampleCodeModuleAddress = (void*)0x400000;
|
|
static void * const sampleDataModuleAddress = (void*)0x500000;
|
|
|
|
typedef int (*EntryPoint)();
|
|
|
|
|
|
void clearBSS(void * bssAddress, uint64_t bssSize) {
|
|
memset(bssAddress, 0, bssSize);
|
|
}
|
|
|
|
void * getStackBase() {
|
|
return (void*)(
|
|
(uint64_t)&endOfKernel
|
|
+ PageSize * 8 //The size of the stack itself, 32KiB
|
|
- sizeof(uint64_t) //Begin at the top of the stack
|
|
);
|
|
}
|
|
|
|
void * initializeKernelBinary() {
|
|
void * moduleAddresses[] = {
|
|
sampleCodeModuleAddress,
|
|
sampleDataModuleAddress
|
|
};
|
|
|
|
loadModules(&endOfKernelBinary, moduleAddresses);
|
|
clearBSS(&bss, &endOfKernel - &bss);
|
|
|
|
return getStackBase();
|
|
}
|
|
|
|
void load_idt();
|
|
uint64_t getRSP();
|
|
|
|
int main() {
|
|
load_idt();
|
|
|
|
printStringLen(4, " ", 80); new_line();
|
|
printStringLen(4, " (%( ", 80); new_line();
|
|
printStringLen(15, " Welcome to", 17);
|
|
printStringLen(4, " %%%%% ", 80); new_line();
|
|
printStringLen(15, " BottlerOS", 18);
|
|
printStringLen(4, " %%% ", 80); new_line();
|
|
printStringLen(12, " %%%%%%%%%%%%% ", 80); new_line();
|
|
printStringLen(12, " %%%%%%%%%%%%%%%%%%%%% ", 80); new_line();
|
|
printStringLen(12, " %%%%%%% %%%%%%% ", 80); new_line();
|
|
printStringLen(12, " %%%%% %%%%% ", 80); new_line();
|
|
printStringLen(14, " %%%%% %%%%% ", 80); new_line();
|
|
printStringLen(14, " %%%%% ", 27);
|
|
printStringLen(14, " %%%% %%%% ", 22);
|
|
printStringLen(14, " %%%%% ", 30); new_line();
|
|
printStringLen(14, " %%%%% ", 28);
|
|
printStringLen(14, " (% %( ", 21);
|
|
printStringLen(14, " %%%%% ", 30); new_line();
|
|
printStringLen(14, " %%%%%%% %%%%%%% ", 80); new_line();
|
|
printStringLen(2, " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", 80); new_line();
|
|
printStringLen(2, " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", 80); new_line();
|
|
printStringLen(2, " %%%%%%%%%%%%%%%%%%%%%%% ", 41);
|
|
printStringLen(12, " % %* ", 8);
|
|
printStringLen(2, " %%%%%%%%% ", 30); new_line();
|
|
printStringLen(2, " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ", 80); new_line();
|
|
printStringLen(9, " %%**%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/%% ", 80); new_line();
|
|
printStringLen(9, " %%* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /%% ", 80); new_line();
|
|
printStringLen(9, " %%* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /%% ", 80); new_line();
|
|
printStringLen(9, " %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% ", 80); new_line();
|
|
printStringLen(13, " ,%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%. ", 80); new_line();
|
|
printStringLen(13, " %%. %%%%%%%%%%%%%%%%% .%% ", 80); new_line();
|
|
printStringLen(13, " %%%%%%%%%%%%% ", 80); new_line();
|
|
printStringLen(13, " %%%%%%% ", 80); new_line();
|
|
printStringLen(13, " ", 80); new_line();
|
|
|
|
wait(3);
|
|
|
|
clear();
|
|
|
|
saveSampleRSP(getRSP());
|
|
|
|
((EntryPoint)sampleCodeModuleAddress)();
|
|
return 0;
|
|
} |