dojafioqjriosjfilajdklafjweofjwiofwujfowiidkioeadjakldjaklfjsdklfjsdilfjiosdafjl

This commit is contained in:
Morten Delenk 2016-06-26 17:14:09 +02:00
parent 0e85f6616e
commit 2e7b37527a
23 changed files with 999 additions and 592 deletions

View file

@ -1,13 +1,13 @@
include ../kernel.settings include ../kernel.settings
SRCS = $(shell find hal/$(arch) -name '*.cpp' -o -name '*.[cS]') SRCS = $(shell find hal/$(arch) -name '*.cpp' -o -name '*.[cS]')
KERNSRCS = $(shell find kernel -name '*.cpp' -o -name '*.c') KERNSRCS = $(shell find kernel -name '*.cpp' -o -name '*.c')
OBJS = $(addsuffix .o,$(basename $(SRCS))) #OBJS = $(addsuffix .o,$(basename $(SRCS)))
OBJS += $(addsuffix .o,$(basename $(KERNSRCS))) OBJS = $(addsuffix .o,$(basename $(KERNSRCS)))
LD = $(PREFIX)g++ LD = $(PREFIX)g++
LDFLAGS = -nostdlib -nodefaultlibs -nostdlib -fno-builtin $(ARCHFLAGS) -T kernel-$(arch).ld -z max-page-size=0x1000 -lgcc LDFLAGS = -nostdlib -nodefaultlibs -nostdlib -fno-builtin $(ARCHFLAGS) -T kernel-$(arch).ld -z max-page-size=0x1000
all: hal kernel all: hal kernel
$(LD) $(LDFLAGS) -o mtgos $(OBJS) $(LD) $(LDFLAGS) -o mtgos $(OBJS) libhal.a -lgcc
hal: hal:
make -C hal make -C hal
kernel: kernel:

View file

@ -1,6 +1,9 @@
include ../../kernel.settings include ../../kernel.settings
all: SRCS = $(shell find $(arch) -name '*.cpp' -o -name '*.[cS]')
OBJS = $(addsuffix .o,$(basename $(SRCS)))
all:
make -C $(arch) make -C $(arch)
ar rcs ../libhal.a $(OBJS)
clean: clean:
rm -rf hal.o rm -rf hal.o
make -C $(arch) clean make -C $(arch) clean

View file

@ -4,6 +4,7 @@ OBJS = $(addsuffix .o,$(basename $(SRCS)))
CPP = $(PREFIX)g++ CPP = $(PREFIX)g++
CC = $(PREFIX)gcc CC = $(PREFIX)gcc
AR = $(PREFIX)ar
ASFLAGS = -m32 ASFLAGS = -m32
CFLAGS += -m32 -Wall -fno-stack-protector -nostdinc -Ic_include/ -I../../kernel/c_include -ffreestanding -std=c11 -fno-builtin -Werror -nostdlib -g -fpie CFLAGS += -m32 -Wall -fno-stack-protector -nostdinc -Ic_include/ -I../../kernel/c_include -ffreestanding -std=c11 -fno-builtin -Werror -nostdlib -g -fpie
CPPFLAGS += -m32 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder CPPFLAGS += -m32 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder

View file

@ -43,20 +43,23 @@ namespace MTGosHAL {
YELLOW=0xFFFF55, YELLOW=0xFFFF55,
WHITE=0xFFFFFF WHITE=0xFFFFFF
}; };
class Screen: public Output {
class Screen {
private: private:
FG_color fg; FG_color fg;
BG_color bg; BG_color bg;
uint32_t* lfb; uint32_t* lfb;
auto putChar(char c) -> void; auto putChar(char c) -> void;
int base;
public: public:
Screen(): fg(FG_color::WHITE), bg(BG_color::BLACK) { auto puts(const char *s) -> void;
Screen(): fg(FG_color::WHITE), bg(BG_color::BLACK), base(10) {
} }
Screen(struct multiboot_info* mb_info): Screen() {init(mb_info);} Screen(struct multiboot_info* mb_info): Screen() {init(mb_info);}
auto init(struct multiboot_info*) -> void; auto init(struct multiboot_info*) -> void;
template <typename T> template <typename T>
auto operator<< (T output) -> Screen & { auto operator<< (T output) -> Screen & {
Output::operator<<<T>(output); puts(output);
return *this; return *this;
} }
auto clrscr() -> void; auto clrscr() -> void;
@ -69,5 +72,15 @@ namespace MTGosHAL {
auto Screen::operator<<<FG_color>(FG_color fg) -> Screen &; auto Screen::operator<<<FG_color>(FG_color fg) -> Screen &;
template <> template <>
auto Screen::operator<<<BG_color>(BG_color bg) -> Screen &; auto Screen::operator<<<BG_color>(BG_color bg) -> Screen &;
template <>
auto Screen::operator<<<Base>(Base output) -> Screen &;
template <>
auto Screen::operator<<<int>(int output) -> Screen &;
template <>
auto Screen::operator<<<long int>(long int output) -> Screen &;
template <>
auto Screen::operator<<<char>(char output) -> Screen &;
template <>
auto Screen::operator<<<char*>(char* output) -> Screen &;
} }
#endif #endif

View file

@ -10,7 +10,8 @@
#include <blockdev.hpp> #include <blockdev.hpp>
#include <pmm.hpp> #include <pmm.hpp>
extern "C" void intr_stub_0(void); extern "C" void intr_stub_0(void);
void main(void ** programs); void main(void ** programs, MTGosHAL::Serial &debug, MTGosHAL::PMM &mm, MTGosHAL::Screen &out,
MTGosHAL::Screen &err, MTGosHAL::Keyboard &in, MTGosHAL::Multitasking &tasks, MTGosHAL::BlockDevice &disk);
void** progs; void** progs;
namespace MTGosHAL { namespace MTGosHAL {
Serial debug; Serial debug;
@ -77,7 +78,7 @@ namespace MTGosHAL {
progs[i]=(void*)(mods[i].mod_start); progs[i]=(void*)(mods[i].mod_start);
debug << "Found module!\n"; debug << "Found module!\n";
} }
::main(progs); ::main(progs, debug, mm, out, err, in, tasks, disk);
uint8_t buf[512]; uint8_t buf[512];
disk.readSector(disk.getDriveNumByName("ATA0m1"),0,buf); disk.readSector(disk.getDriveNumByName("ATA0m1"),0,buf);
out << (char*)buf; out << (char*)buf;

View file

@ -2,9 +2,91 @@
#include <textDISP.hpp> #include <textDISP.hpp>
#include <string.h> #include <string.h>
#include <stdfnt.h> #include <stdfnt.h>
#include <base.hpp>
#include <textDISP.hpp>
#include <string.h>
int x=0, y=0;
namespace MTGosHAL { namespace MTGosHAL {
auto Screen::putChar(char c) -> void {
switch(c) {
case '\n':
x=0; y++;
break;
case '\r':
x=0;
break;
case '\b':
x--;
if(x<0) x=0;
putChar(' ');
x--;
if(x<0) x=0;
break;
case '\0':
break;
default:
for(int lx=0;lx<8;lx++) {
for(int ly=0;ly<8;ly++) {
if(font[(int)((uint8_t)c)][ly]&(1<<lx)) {
lfb[(x*8+lx)+(y*8+ly)*1024]=0xFFFFFF;//static_cast<uint32_t>(fg);
} else {
lfb[(x*8+lx)+(y*8+ly)*1024]=0x000000;//static_cast<uint32_t>(bg);
}
}
}
x++;
if(x==SCREEN_WIDTH) {
x=0; y++;
}
break;
}
if(y>SCREEN_HEIGHT)
scroll();
}
auto Screen::clrscr() -> void {
for(int p=0;p<1024*786;p++) {
lfb[p]=0x000000;//static_cast<uint32_t>(bg);
}
x=y=0;
}
auto Screen::scroll() -> void {
for(int ly=0;ly<786-8;ly++) {
for(int lx=0;lx<1024;lx++) {
lfb[lx+ly*1024]=lfb[lx+(ly+8)*1024];
}
}
for(int ly=786-8;ly<786;ly++) {
for(int lx=0;lx<1024;lx++) {
lfb[lx+ly*1024]=0x000000;//static_cast<uint32_t>(bg);
}
}
y--;
}
template <>
auto Screen::operator<<<FG_color>(FG_color fg) -> Screen &{
this->fg=fg;
return *this;
}
template <>
auto Screen::operator<<<BG_color>(BG_color bg) -> Screen &{
this->bg=bg;
return *this;
}
auto Screen::setColor(FG_color fg) -> Screen &{
this->fg=fg;
return *this;
}
auto Screen::setColor(BG_color bg) -> Screen &{
this->bg=bg;
return *this;
}
auto Screen::setColor(FG_color fg, BG_color bg) -> Screen &{
return (*this).setColor(fg).setColor(bg);
}
auto Screen::init(struct multiboot_info* mb_info) -> void { auto Screen::init(struct multiboot_info* mb_info) -> void {
lfb=(uint32_t*)((uint32_t)mb_info->framebuffer_addr); lfb=(uint32_t*)((uintptr_t)mb_info->framebuffer_addr);
//clrscr(); //clrscr();
//Render '\001' character //Render '\001' character
for(int tx=0;tx<16;tx++) { for(int tx=0;tx<16;tx++) {
@ -18,4 +100,52 @@ namespace MTGosHAL {
} }
} }
} }
auto Screen::puts(const char* s) -> void {
int i=0;
while(s[i]!='\0')
putChar(s[i++]);
}
template <>
auto Screen::operator<<<Base>(Base output) -> Screen & {
base=static_cast<int>(output);
return *this;
}
template <>
auto Screen::operator<<<int>(int op) -> Screen & {
uintptr_t output=op;
const char* chars="0123456789ABCDEF";
char buf[33];
buf[32]='\0';
char* ptr=buf+31;
do {
*(ptr--)=chars[output%base];
output/=base;
} while(output && (ptr!=buf));
puts(ptr+1);
return *this;
}
template <>
auto Screen::operator<<<long int>(long int op) -> Screen & {
uint64_t output=op;
const char* chars="0123456789ABCDEF";
char buf[65];
buf[64]='\0';
char* ptr=buf+63;
do {
*(ptr--)=chars[output%base];
output/=base;
} while(output && (ptr!=buf));
puts(ptr+1);
return *this;
}
template <>
auto Screen::operator<<<char>(char output) -> Screen & {
putChar(output);
return *this;
}
template <>
auto Screen::operator<<<char*>(char* output) -> Screen & {
puts(output);
return *this;
}
} }

View file

@ -1,9 +1,111 @@
#include <base.hpp> #include <base.hpp>
#include <pmm.hpp> #include <pmm.hpp>
#include <vmm3.hpp> #include <vmm3.hpp>
#define PAGESIZE 4096
#define UNSHIFT(a) ((a)>>12)
#define SHIFT(a) ((a)<<12)
#define FLAGS 0xfff
extern "C" const int kernel_start; extern "C" const int kernel_start;
extern "C" const int kernel_end; //those are voids actually extern "C" const int kernel_end; //those are voids actually
void *operator new(size_t size) {
return MTGosHAL::mm.alloc(size);
}
void *operator new[](size_t size) {
return MTGosHAL::mm.alloc(size);
}
void operator delete(void* p) {
MTGosHAL::mm.free(p);
}
void operator delete[](void* p) {
MTGosHAL::mm.free(p);
}
void operator delete(void* p, size_t size) {
MTGosHAL::mm.free(p);
}
void operator delete[](void* p, size_t size) {
MTGosHAL::mm.free(p);
}
namespace MTGosHAL { namespace MTGosHAL {
auto PMM::alloc(size_t length) -> void * {
if(!head) {
//Alloc space for head
if(length+sizeof(malloc_t)<=PAGESIZE) { //Small optimization. The routine for allocating more than one continuous page is terribly slow.
void *tmp;
*this >> tmp;
head=(malloc_t*)tmp;
} else
head=(malloc_t*)(*this)(UNSHIFT((length+sizeof(malloc_t)))+1);
if(!head) //The alloc() didn't work! We're out of RAM!
return nullptr;
head->len=length;
head->next=head->last=nullptr;
malloc_t* tmp=head;
tmp++;
return (void*)tmp;
}
malloc_t* curr=head;
malloc_t* last=nullptr;
do {
uintptr_t loc=(uintptr_t)curr+sizeof(malloc_t)+curr->len;
if((loc+length+sizeof(malloc_t))<((loc&(~FLAGS))+PAGESIZE) &&
((!curr->next) || (loc+length+sizeof(malloc_t))<((uintptr_t)(curr->next)))) {
malloc_t *allocd=(malloc_t *)loc;
allocd->len=length;
allocd->last=curr;
allocd->next=curr->next; //Set double linked list
curr->next=allocd;
if(allocd->next)
allocd->next->last=allocd;
malloc_t *tmp=allocd;
tmp++;
return (void*)tmp;
}
last=curr;
curr=curr->next;
} while(curr);
malloc_t *allocd=nullptr;
if(length+sizeof(malloc_t)<=PAGESIZE) { //Small optimization. The routine for allocating more than one continuous page is terribly slow.
void *tmp;
*this >> tmp;
allocd=(malloc_t*)tmp;
} else
allocd=(malloc_t*)(*this)(UNSHIFT(length+sizeof(malloc_t))+1);
if(!allocd) //The alloc() didn't work! We're out of RAM!
return nullptr;
last->next=allocd;
allocd->len=length;
allocd->last=last;
allocd->next=nullptr;
malloc_t *tmp=allocd;
tmp++;
return (void*)tmp;
}
auto PMM::free(void* ptr) -> bool {
if(!ptr)
return false;
malloc_t* curr=head;
malloc_t* chk=(malloc_t*)ptr;
chk--;
do {
if(curr==chk) {
uintptr_t start=((uintptr_t)chk)&(~FLAGS);
uintptr_t end=start+PAGESIZE;
if((((uintptr_t)(curr->last)<start)||((uintptr_t)(curr->last)>=end))&&(((uintptr_t)(curr->next)>=end)||((uintptr_t)(curr->next)<start))) {
*this << (void*)start;
}
if(curr->last)
curr->last->next=curr->next;
else {
head=curr->next;
}
if(curr->next)
curr->next->last=curr->last;
return true;
}
curr=curr->next;
} while(curr);
return false;
}
PMM::PMM(): head(nullptr), pmm2() {} PMM::PMM(): head(nullptr), pmm2() {}
auto PMM::init(struct multiboot_info* mb_info) -> void { auto PMM::init(struct multiboot_info* mb_info) -> void {
pmm2.init(mb_info); pmm2.init(mb_info);

View file

@ -4,6 +4,7 @@ OBJS = $(addsuffix .o,$(basename $(SRCS)))
CPP = $(PREFIX)g++ CPP = $(PREFIX)g++
CC = $(PREFIX)gcc CC = $(PREFIX)gcc
AR = $(PREFIX)ar
ASFLAGS = -m64 ASFLAGS = -m64
CFLAGS += -m64 -Wall -fno-stack-protector -nostdinc -Ic_include/ -I../../kernel/c_include -ffreestanding -std=c11 -fno-builtin -Werror -nostdlib -g -fpie -ffreestanding -mcmodel=large -mno-mmx -mno-sse -mno-sse2 CFLAGS += -m64 -Wall -fno-stack-protector -nostdinc -Ic_include/ -I../../kernel/c_include -ffreestanding -std=c11 -fno-builtin -Werror -nostdlib -g -fpie -ffreestanding -mcmodel=large -mno-mmx -mno-sse -mno-sse2
CPPFLAGS += -m64 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -ffreestanding -mcmodel=large -mno-mmx -mno-sse -mno-sse2 CPPFLAGS += -m64 -Wall -fno-stack-protector -nostdinc -std=c++14 -Iinclude/ -Ic_include/ -I../../kernel/c_include -I../../kernel/include -fno-rtti -fno-exceptions -ffreestanding -fno-builtin -Werror -nostdlib -fno-use-cxa-atexit -Wextra -Wno-unused -g -fno-pie -Wno-reorder -ffreestanding -mcmodel=large -mno-mmx -mno-sse -mno-sse2

View file

@ -0,0 +1,5 @@
#include <blockdev.hpp>
namespace MTGosHAL {
BlockDevice::BlockDevice() {}
BlockDevice::~BlockDevice() {}
}

View file

@ -43,20 +43,23 @@ namespace MTGosHAL {
YELLOW=0xFFFF55, YELLOW=0xFFFF55,
WHITE=0xFFFFFF WHITE=0xFFFFFF
}; };
class Screen: public Output {
class Screen {
private: private:
FG_color fg; FG_color fg;
BG_color bg; BG_color bg;
uint32_t* lfb; uint32_t* lfb;
int base;
auto putChar(char c) -> void; auto putChar(char c) -> void;
public: public:
Screen(): fg(FG_color::WHITE), bg(BG_color::BLACK) { auto puts(const char *s) -> void;
Screen(): fg(FG_color::WHITE), bg(BG_color::BLACK), base(10) {
} }
Screen(struct multiboot_info* mb_info): Screen() {init(mb_info);} Screen(struct multiboot_info* mb_info): Screen() {init(mb_info);}
auto init(struct multiboot_info*) -> void; auto init(struct multiboot_info*) -> void;
template <typename T> template <typename T>
auto operator<< (T output) -> Screen & { auto operator<< (T output) -> Screen & {
Output::operator<<<T>(output); puts(output);
return *this; return *this;
} }
auto clrscr() -> void; auto clrscr() -> void;
@ -69,5 +72,15 @@ namespace MTGosHAL {
auto Screen::operator<<<FG_color>(FG_color fg) -> Screen &; auto Screen::operator<<<FG_color>(FG_color fg) -> Screen &;
template <> template <>
auto Screen::operator<<<BG_color>(BG_color bg) -> Screen &; auto Screen::operator<<<BG_color>(BG_color bg) -> Screen &;
template <>
auto Screen::operator<<<Base>(Base output) -> Screen &;
template <>
auto Screen::operator<<<int>(int output) -> Screen &;
template <>
auto Screen::operator<<<long int>(long int output) -> Screen &;
template <>
auto Screen::operator<<<char>(char output) -> Screen &;
template <>
auto Screen::operator<<<char*>(char* output) -> Screen &;
} }
#endif #endif

View file

@ -10,7 +10,8 @@
#include <idt.hpp> #include <idt.hpp>
#include <pmm.hpp> #include <pmm.hpp>
extern "C" void intr_stub_0(void); extern "C" void intr_stub_0(void);
void main(void ** programs); void main(void ** programs, MTGosHAL::Serial debug, MTGosHAL::PMM mm, MTGosHAL::Screen out,
MTGosHAL::Screen err, MTGosHAL::Keyboard in, MTGosHAL::Multitasking tasks, MTGosHAL::BlockDevice disk);
void** progs; void** progs;
namespace MTGosHAL { namespace MTGosHAL {
Serial debug; Serial debug;
@ -21,6 +22,7 @@ namespace MTGosHAL {
Screen err; Screen err;
Keyboard in; Keyboard in;
Multitasking tasks; Multitasking tasks;
BlockDevice disk;
struct multiboot_info* ebx; struct multiboot_info* ebx;
void main(long eax, struct multiboot_info* mb, uint64_t**** pt) { void main(long eax, struct multiboot_info* mb, uint64_t**** pt) {
ebx=mb; ebx=mb;
@ -57,12 +59,30 @@ namespace MTGosHAL {
auto startup() -> void { auto startup() -> void {
//asm volatile("ltr %%ax" : : "a"(5<<3)); //asm volatile("ltr %%ax" : : "a"(5<<3));
debug << "Init MM\n"; out << "Init MM\n";
new (&mm) PMM(ebx); new (&mm) PMM(ebx);
debug << "Init Keyboard\n"; out << "Init Keyboard\n";
new (&in) Keyboard(); new (&in) Keyboard();
out << "Init Multitasking\n";
new (&tasks) Multitasking();
out << "Init blockdev\n";
new (&disk) BlockDevice();
out << "Kernel initialized\n";
multiboot_mod_list *mods = (multiboot_mod_list*) (uint64_t)(ebx->mods_addr);
progs=(void**)mm.alloc(8192);
for(int i=0;i<1024;i++) {
progs[i]=nullptr;
}
for(uint32_t i=0;i<(ebx->mods_count<1023?ebx->mods_count:1023);i++) { //Basically until MIN(ebx->mods_count, 1023), as we only support loading up to 1023 programs directly.
progs[i]=(void*)((uint64_t)mods[i].mod_start);
out << "Found module!\n";
}
::main(progs, debug, mm, out, err, in, tasks, disk);
} }
} }
typedef void (*constructor)(); typedef void (*constructor)();

View file

@ -0,0 +1,54 @@
#include <base.hpp>
#include <output.hpp>
#include <serial.hpp>
#include <textDISP.hpp>
namespace MTGosHAL {
auto Output::puts(const char* s) -> void {
int i=0;
while(s[i]!='\0')
putChar(s[i++]);
}
template <>
auto Output::operator<<<Base>(Base output) -> Output & {
base=static_cast<int>(output);
return *this;
}
template <>
auto Output::operator<<<int>(int op) -> Output & {
uintptr_t output=op;
const char* chars="0123456789ABCDEF";
char buf[33];
buf[32]='\0';
char* ptr=buf+31;
do {
*(ptr--)=chars[output%base];
output/=base;
} while(output && (ptr!=buf));
puts(ptr+1);
return *this;
}
template <>
auto Output::operator<<<long int>(long int op) -> Output & {
uint64_t output=op;
const char* chars="0123456789ABCDEF";
char buf[65];
buf[64]='\0';
char* ptr=buf+63;
do {
*(ptr--)=chars[output%base];
output/=base;
} while(output && (ptr!=buf));
puts(ptr+1);
return *this;
}
template <>
auto Output::operator<<<char>(char output) -> Output & {
putChar(output);
return *this;
}
template <>
auto Output::operator<<<char*>(char* output) -> Output & {
puts(output);
return *this;
}
}

View file

@ -2,7 +2,89 @@
#include <textDISP.hpp> #include <textDISP.hpp>
#include <string.h> #include <string.h>
#include <stdfnt.h> #include <stdfnt.h>
#include <output.hpp>
#include <textDISP.hpp>
#include <string.h>
int x=0, y=0;
namespace MTGosHAL { namespace MTGosHAL {
auto Screen::putChar(char c) -> void {
switch(c) {
case '\n':
x=0; y++;
break;
case '\r':
x=0;
break;
case '\b':
x--;
if(x<0) x=0;
putChar(' ');
x--;
if(x<0) x=0;
break;
case '\0':
break;
default:
for(int lx=0;lx<8;lx++) {
for(int ly=0;ly<8;ly++) {
if(font[(int)((uint8_t)c)][ly]&(1<<lx)) {
lfb[(x*8+lx)+(y*8+ly)*1024]=0xFFFFFF;//static_cast<uint32_t>(fg);
} else {
lfb[(x*8+lx)+(y*8+ly)*1024]=0x000000;//static_cast<uint32_t>(bg);
}
}
}
x++;
if(x==SCREEN_WIDTH) {
x=0; y++;
}
break;
}
if(y>SCREEN_HEIGHT)
scroll();
}
auto Screen::clrscr() -> void {
for(int p=0;p<1024*786;p++) {
lfb[p]=0x000000;//static_cast<uint32_t>(bg);
}
x=y=0;
}
auto Screen::scroll() -> void {
for(int ly=0;ly<786-8;ly++) {
for(int lx=0;lx<1024;lx++) {
lfb[lx+ly*1024]=lfb[lx+(ly+8)*1024];
}
}
for(int ly=786-8;ly<786;ly++) {
for(int lx=0;lx<1024;lx++) {
lfb[lx+ly*1024]=0x000000;//static_cast<uint32_t>(bg);
}
}
y--;
}
template <>
auto Screen::operator<<<FG_color>(FG_color fg) -> Screen &{
this->fg=fg;
return *this;
}
template <>
auto Screen::operator<<<BG_color>(BG_color bg) -> Screen &{
this->bg=bg;
return *this;
}
auto Screen::setColor(FG_color fg) -> Screen &{
this->fg=fg;
return *this;
}
auto Screen::setColor(BG_color bg) -> Screen &{
this->bg=bg;
return *this;
}
auto Screen::setColor(FG_color fg, BG_color bg) -> Screen &{
return (*this).setColor(fg).setColor(bg);
}
auto Screen::init(struct multiboot_info* mb_info) -> void { auto Screen::init(struct multiboot_info* mb_info) -> void {
lfb=(uint32_t*)((uintptr_t)mb_info->framebuffer_addr); lfb=(uint32_t*)((uintptr_t)mb_info->framebuffer_addr);
//clrscr(); //clrscr();
@ -18,4 +100,52 @@ namespace MTGosHAL {
} }
} }
} }
auto Screen::puts(const char* s) -> void {
int i=0;
while(s[i]!='\0')
putChar(s[i++]);
}
template <>
auto Screen::operator<<<Base>(Base output) -> Screen & {
base=static_cast<int>(output);
return *this;
}
template <>
auto Screen::operator<<<int>(int op) -> Screen & {
uintptr_t output=op;
const char* chars="0123456789ABCDEF";
char buf[33];
buf[32]='\0';
char* ptr=buf+31;
do {
*(ptr--)=chars[output%base];
output/=base;
} while(output && (ptr!=buf));
puts(ptr+1);
return *this;
}
template <>
auto Screen::operator<<<long int>(long int op) -> Screen & {
uint64_t output=op;
const char* chars="0123456789ABCDEF";
char buf[65];
buf[64]='\0';
char* ptr=buf+63;
do {
*(ptr--)=chars[output%base];
output/=base;
} while(output && (ptr!=buf));
puts(ptr+1);
return *this;
}
template <>
auto Screen::operator<<<char>(char output) -> Screen & {
putChar(output);
return *this;
}
template <>
auto Screen::operator<<<char*>(char* output) -> Screen & {
puts(output);
return *this;
}
} }

View file

@ -2,7 +2,109 @@
#include <pmm.hpp> #include <pmm.hpp>
extern "C" const int kernel_start; extern "C" const int kernel_start;
extern "C" const int kernel_end; //those are voids actually extern "C" const int kernel_end; //those are voids actually
#define PAGESIZE 0x200000
#define UNSHIFT(a) ((a)>>20)
#define SHIFT(a) ((a)<<20)
#define FLAGS 0x7ffff
void *operator new(size_t size) {
return MTGosHAL::mm.alloc(size);
}
void *operator new[](size_t size) {
return MTGosHAL::mm.alloc(size);
}
void operator delete(void* p) {
MTGosHAL::mm.free(p);
}
void operator delete[](void* p) {
MTGosHAL::mm.free(p);
}
void operator delete(void* p, size_t size) {
MTGosHAL::mm.free(p);
}
void operator delete[](void* p, size_t size) {
MTGosHAL::mm.free(p);
}
namespace MTGosHAL { namespace MTGosHAL {
auto PMM::alloc(size_t length) -> void * {
if(!head) {
//Alloc space for head
if(length+sizeof(malloc_t)<=PAGESIZE) { //Small optimization. The routine for allocating more than one continuous page is terribly slow.
void *tmp;
*this >> tmp;
head=(malloc_t*)tmp;
} else
head=(malloc_t*)(*this)(UNSHIFT((length+sizeof(malloc_t)))+1);
if(!head) //The alloc() didn't work! We're out of RAM!
return nullptr;
head->len=length;
head->next=head->last=nullptr;
malloc_t* tmp=head;
tmp++;
return (void*)tmp;
}
malloc_t* curr=head;
malloc_t* last=nullptr;
do {
uintptr_t loc=(uintptr_t)curr+sizeof(malloc_t)+curr->len;
if((loc+length+sizeof(malloc_t))<((loc&(~FLAGS))+PAGESIZE) &&
((!curr->next) || (loc+length+sizeof(malloc_t))<((uintptr_t)(curr->next)))) {
malloc_t *allocd=(malloc_t *)loc;
allocd->len=length;
allocd->last=curr;
allocd->next=curr->next; //Set double linked list
curr->next=allocd;
if(allocd->next)
allocd->next->last=allocd;
malloc_t *tmp=allocd;
tmp++;
return (void*)tmp;
}
last=curr;
curr=curr->next;
} while(curr);
malloc_t *allocd=nullptr;
if(length+sizeof(malloc_t)<=PAGESIZE) { //Small optimization. The routine for allocating more than one continuous page is terribly slow.
void *tmp;
*this >> tmp;
allocd=(malloc_t*)tmp;
} else
allocd=(malloc_t*)(*this)(UNSHIFT(length+sizeof(malloc_t))+1);
if(!allocd) //The alloc() didn't work! We're out of RAM!
return nullptr;
last->next=allocd;
allocd->len=length;
allocd->last=last;
allocd->next=nullptr;
malloc_t *tmp=allocd;
tmp++;
return (void*)tmp;
}
auto PMM::free(void* ptr) -> bool {
if(!ptr)
return false;
malloc_t* curr=head;
malloc_t* chk=(malloc_t*)ptr;
chk--;
do {
if(curr==chk) {
uintptr_t start=((uintptr_t)chk)&(~FLAGS);
uintptr_t end=start+PAGESIZE;
if((((uintptr_t)(curr->last)<start)||((uintptr_t)(curr->last)>=end))&&(((uintptr_t)(curr->next)>=end)||((uintptr_t)(curr->next)<start))) {
*this << (void*)start;
}
if(curr->last)
curr->last->next=curr->next;
else {
head=curr->next;
}
if(curr->next)
curr->next->last=curr->last;
return true;
}
curr=curr->next;
} while(curr);
return false;
}
PMM::PMM(): head(nullptr), pmm2() {} PMM::PMM(): head(nullptr), pmm2() {}
auto PMM::init(struct multiboot_info* mb_info) -> void { auto PMM::init(struct multiboot_info* mb_info) -> void {
pmm2.init(mb_info); pmm2.init(mb_info);

View file

@ -16,6 +16,8 @@ namespace MTGosHAL {
PMM2::PMM2(): pmm3() { PMM2::PMM2(): pmm3() {
} }
auto PMM2::markUsed(const void * addr, uint32_t length) -> bool { auto PMM2::markUsed(const void * addr, uint32_t length) -> bool {
if(length<0x200000)
length=0x200000;
uintptr_t add=(uintptr_t)addr; uintptr_t add=(uintptr_t)addr;
uint64_t pagetid = SPLIT1_UNSHIFT(add); uint64_t pagetid = SPLIT1_UNSHIFT(add);

View file

@ -42,18 +42,21 @@ namespace MTGosHAL {
YELLOW=0xFFFF55, YELLOW=0xFFFF55,
WHITE=0xFFFFFF WHITE=0xFFFFFF
}; };
class Screen: public Output {
class Screen {
private: private:
FG_color fg; FG_color fg;
BG_color bg; BG_color bg;
uint32_t* lfb; uint32_t* lfb;
int base;
auto putChar(char c) -> void; auto putChar(char c) -> void;
public: public:
Screen(): fg(FG_color::WHITE), bg(BG_color::BLACK) { auto puts(const char *s) -> void;
Screen(): fg(FG_color::WHITE), bg(BG_color::BLACK), base(10) {
} }
template <typename T> template <typename T>
auto operator<< (T output) -> Screen & { auto operator<< (T output) -> Screen & {
Output::operator<<<T>(output); puts(output);
return *this; return *this;
} }
auto clrscr() -> void; auto clrscr() -> void;
@ -66,5 +69,15 @@ namespace MTGosHAL {
auto Screen::operator<<<FG_color>(FG_color fg) -> Screen &; auto Screen::operator<<<FG_color>(FG_color fg) -> Screen &;
template <> template <>
auto Screen::operator<<<BG_color>(BG_color bg) -> Screen &; auto Screen::operator<<<BG_color>(BG_color bg) -> Screen &;
template <>
auto Screen::operator<<<Base>(Base output) -> Screen &;
template <>
auto Screen::operator<<<int>(int output) -> Screen &;
template <>
auto Screen::operator<<<long int>(long int output) -> Screen &;
template <>
auto Screen::operator<<<char>(char output) -> Screen &;
template <>
auto Screen::operator<<<char*>(char* output) -> Screen &;
} }
#endif #endif

View file

@ -6,6 +6,7 @@
#include <Multitasking.hpp> #include <Multitasking.hpp>
#include <blockdev.hpp> #include <blockdev.hpp>
#include <elf.hpp> #include <elf.hpp>
#include <pmm.hpp>
void * operator new (size_t, void * p) { return p ; } void * operator new (size_t, void * p) { return p ; }
void * operator new[] (size_t, void * p) { return p ; } void * operator new[] (size_t, void * p) { return p ; }
void operator delete (void *, void *) { } void operator delete (void *, void *) { }
@ -16,28 +17,29 @@ void pid_null() {
} }
void task_a() { void task_a() {
while(true) while(true)
MTGosHAL::out << "a"; out << "a";
} }
void task_b() { void task_b() {
while(true) while(true)
MTGosHAL::out << "b"; out << "b";
} }
void task_c() { void task_c() {
while(true) while(true)
MTGosHAL::out << "c"; out << "c";
} }
void task_d() { void task_d() {
while(true) while(true)
MTGosHAL::out << "d"; out << "d";
} }
void main(void** files) { void main(void ** files, MTGosHAL::Serial &debug, MTGosHAL::PMM &mm, MTGosHAL::Screen &out,
MTGosHAL::out << "Initializing Kernel!\n"; MTGosHAL::Screen &err, MTGosHAL::Keyboard &in, MTGosHAL::Multitasking &tasks, MTGosHAL::BlockDevice &disk) {
out << "Initializing Kernel!\n";
Elf32_Ehdr** programs=(Elf32_Ehdr**)files; Elf32_Ehdr** programs=(Elf32_Ehdr**)files;
MTGosHAL::tasks.initTask(&pid_null); tasks.initTask(&pid_null);
for(int i=0;programs[i];i++) { for(int i=0;programs[i];i++) {
void(*start)()=(void(*)())load(programs[i]); void(*start)()=(void(*)())load(programs[i]);
if(!start) if(!start)
continue; continue;
MTGosHAL::tasks.initTask(start); tasks.initTask(start);
} }
} }

View file

@ -1,84 +0,0 @@
#include <base.hpp>
#include <textDISP.hpp>
#include <string.h>
#include <stdfnt.h>
int x=0, y=0;
namespace MTGosHAL {
auto Screen::putChar(char c) -> void {
switch(c) {
case '\n':
x=0; y++;
break;
case '\r':
x=0;
break;
case '\b':
x--;
if(x<0) x=0;
putChar(' ');
x--;
if(x<0) x=0;
break;
case '\0':
break;
default:
for(int lx=0;lx<8;lx++) {
for(int ly=0;ly<8;ly++) {
if(font[(int)((uint8_t)c)][ly]&(1<<lx)) {
lfb[(x*8+lx)+(y*8+ly)*1024]=0xFFFFFF;//static_cast<uint32_t>(fg);
} else {
lfb[(x*8+lx)+(y*8+ly)*1024]=0x000000;//static_cast<uint32_t>(bg);
}
}
}
x++;
if(x==SCREEN_WIDTH) {
x=0; y++;
}
break;
}
if(y>SCREEN_HEIGHT)
scroll();
}
auto Screen::clrscr() -> void {
for(int p=0;p<1024*786;p++) {
lfb[p]=0x000000;//static_cast<uint32_t>(bg);
}
x=y=0;
}
auto Screen::scroll() -> void {
for(int ly=0;ly<786-8;ly++) {
for(int lx=0;lx<1024;lx++) {
lfb[lx+ly*1024]=lfb[lx+(ly+8)*1024];
}
}
for(int ly=786-8;ly<786;ly++) {
for(int lx=0;lx<1024;lx++) {
lfb[lx+ly*1024]=0x000000;//static_cast<uint32_t>(bg);
}
}
y--;
}
template <>
auto Screen::operator<<<FG_color>(FG_color fg) -> Screen &{
this->fg=fg;
return *this;
}
template <>
auto Screen::operator<<<BG_color>(BG_color bg) -> Screen &{
this->bg=bg;
return *this;
}
auto Screen::setColor(FG_color fg) -> Screen &{
this->fg=fg;
return *this;
}
auto Screen::setColor(BG_color bg) -> Screen &{
this->bg=bg;
return *this;
}
auto Screen::setColor(FG_color fg, BG_color bg) -> Screen &{
return (*this).setColor(fg).setColor(bg);
}
}

View file

@ -1,115 +0,0 @@
#include <base.hpp>
#include <pmm.hpp>
#include <stdint.h>
#ifdef __LP64
#define PAGESIZE 0x200000
#define UNSHIFT(a) ((a)>>20)
#define SHIFT(a) ((a)<<20)
#define FLAGS 0x7ffff
#else
#define PAGESIZE 4096
#define UNSHIFT(a) ((a)>>12)
#define SHIFT(a) ((a)<<12)
#define FLAGS 0xfff
#endif
void *operator new(size_t size) {
return MTGosHAL::mm.alloc(size);
}
void *operator new[](size_t size) {
return MTGosHAL::mm.alloc(size);
}
void operator delete(void* p) {
MTGosHAL::mm.free(p);
}
void operator delete[](void* p) {
MTGosHAL::mm.free(p);
}
void operator delete(void* p, size_t size) {
MTGosHAL::mm.free(p);
}
void operator delete[](void* p, size_t size) {
MTGosHAL::mm.free(p);
}
namespace MTGosHAL {
auto PMM::alloc(size_t length) -> void * {
if(!head) {
//Alloc space for head
if(length+sizeof(malloc_t)<=PAGESIZE) { //Small optimization. The routine for allocating more than one continuous page is terribly slow.
void *tmp;
*this >> tmp;
head=(malloc_t*)tmp;
} else
head=(malloc_t*)(*this)(UNSHIFT((length+sizeof(malloc_t)))+1);
if(!head) //The alloc() didn't work! We're out of RAM!
return nullptr;
head->len=length;
head->next=head->last=nullptr;
malloc_t* tmp=head;
tmp++;
return (void*)tmp;
}
malloc_t* curr=head;
malloc_t* last=nullptr;
do {
uintptr_t loc=(uintptr_t)curr+sizeof(malloc_t)+curr->len;
if((loc+length+sizeof(malloc_t))<((loc&(~FLAGS))+PAGESIZE) &&
((!curr->next) || (loc+length+sizeof(malloc_t))<((uintptr_t)(curr->next)))) {
malloc_t *allocd=(malloc_t *)loc;
allocd->len=length;
allocd->last=curr;
allocd->next=curr->next; //Set double linked list
curr->next=allocd;
if(allocd->next)
allocd->next->last=allocd;
malloc_t *tmp=allocd;
tmp++;
return (void*)tmp;
}
last=curr;
curr=curr->next;
} while(curr);
malloc_t *allocd=nullptr;
if(length+sizeof(malloc_t)<=PAGESIZE) { //Small optimization. The routine for allocating more than one continuous page is terribly slow.
void *tmp;
*this >> tmp;
allocd=(malloc_t*)tmp;
} else
allocd=(malloc_t*)(*this)(UNSHIFT(length+sizeof(malloc_t))+1);
if(!allocd) //The alloc() didn't work! We're out of RAM!
return nullptr;
last->next=allocd;
allocd->len=length;
allocd->last=last;
allocd->next=nullptr;
malloc_t *tmp=allocd;
tmp++;
return (void*)tmp;
}
auto PMM::free(void* ptr) -> bool {
if(!ptr)
return false;
malloc_t* curr=head;
malloc_t* chk=(malloc_t*)ptr;
chk--;
do {
if(curr==chk) {
uintptr_t start=((uintptr_t)chk)&(~FLAGS);
uintptr_t end=start+PAGESIZE;
if((((uintptr_t)(curr->last)<start)||((uintptr_t)(curr->last)>=end))&&(((uintptr_t)(curr->next)>=end)||((uintptr_t)(curr->next)<start))) {
*this << (void*)start;
}
if(curr->last)
curr->last->next=curr->next;
else {
head=curr->next;
}
if(curr->next)
curr->next->last=curr->last;
return true;
}
curr=curr->next;
} while(curr);
return false;
}
}

View file

@ -13,6 +13,9 @@ void memmove(void* dst, void* src, uint32_t size) {
to[i]=from[i]; //This would get optimized by gcc to memmove(dst, src, size); if optimizations are enabled. to[i]=from[i]; //This would get optimized by gcc to memmove(dst, src, size); if optimizations are enabled.
} }
} }
void memcpy(void* dest, void* src, uint32_t size) {
memmove(dest, src, size);
}
uint32_t strlen(const char* str) { uint32_t strlen(const char* str) {
uint32_t i=0; uint32_t i=0;
char* str2=(char*)((uintptr_t)str); char* str2=(char*)((uintptr_t)str);

BIN
kernel/libhal.a Normal file

Binary file not shown.

741
mtgos.sym
View file

@ -1,366 +1,377 @@
00202890 __cxa_pure_virtual 00200364 _Z4loadP10Elf32_Ehdr
00200063 enterPaging 00200240 _Z6task_av
00203ad6 handleINT 0020025c _Z6task_bv
0020282d init 00200278 _Z6task_cv
002000a0 intr_stub_0 00200294 _Z6task_dv
002000c0 intr_stub_1 00200775 _Z7syscalljPvS_
002001e0 intr_stub_10 0020023a _Z8pid_nullv
00200d20 intr_stub_100 00204364 _ZN8MTGosHAL11BlockDeviceC1Ev
00200d40 intr_stub_101 00204364 _ZN8MTGosHAL11BlockDeviceC2Ev
00200d60 intr_stub_102 00204370 _ZN8MTGosHAL11BlockDeviceD1Ev
00200d80 intr_stub_103 00204370 _ZN8MTGosHAL11BlockDeviceD2Ev
00200da0 intr_stub_104 00201334 _ZN8MTGosHAL12Multitasking8initTaskEPFvvE
00200dc0 intr_stub_105 0020148e _ZN8MTGosHAL12Multitasking8scheduleEPNS_9cpu_stateE
00200de0 intr_stub_106 0020127e _ZN8MTGosHAL12MultitaskingC1Ev
00200e00 intr_stub_107 0020127e _ZN8MTGosHAL12MultitaskingC2Ev
00200e20 intr_stub_108 0020686e _ZN8MTGosHAL3GDT5applyEv
00200e40 intr_stub_109 00206722 _ZN8MTGosHAL3GDT8setEntryEijji
00200200 intr_stub_11 002066ac _ZN8MTGosHAL3GDTC1Ev
00200e60 intr_stub_110 002066ac _ZN8MTGosHAL3GDTC2Ev
00200e80 intr_stub_111 002017ca _ZN8MTGosHAL3IDT5applyEv
00200ea0 intr_stub_112 0020182e _ZN8MTGosHAL3IDT6handleEPNS_9cpu_stateE
00200ec0 intr_stub_113 002022fa _ZN8MTGosHAL3IDT7requestEhPFPNS_9cpu_stateES2_E
00200ee0 intr_stub_114 0020163e _ZN8MTGosHAL3IDT8setEntryEiPvth
00200f00 intr_stub_115 00201552 _ZN8MTGosHAL3IDTC1Ev
00200f20 intr_stub_116 00201552 _ZN8MTGosHAL3IDTC2Ev
00200f40 intr_stub_117 00203c40 _ZN8MTGosHAL3PMM4freeEPv
00200f60 intr_stub_118 00203da0 _ZN8MTGosHAL3PMM4initEP14multiboot_info
00200f80 intr_stub_119 002039a0 _ZN8MTGosHAL3PMM5allocEm
00200220 intr_stub_12 00203dd2 _ZN8MTGosHAL3PMM8markUsedEPKvm
00200fa0 intr_stub_120 00203d6e _ZN8MTGosHAL3PMMC1Ev
00200fc0 intr_stub_121 00203d6e _ZN8MTGosHAL3PMMC2Ev
00200fe0 intr_stub_122 00203e74 _ZN8MTGosHAL3PMMclEi
00201000 intr_stub_123 00203e40 _ZN8MTGosHAL3PMMlsEPKv
00201020 intr_stub_124 00203e0c _ZN8MTGosHAL3PMMrsERPv
00201040 intr_stub_125 0020413a _ZN8MTGosHAL4PMM24initEP14multiboot_info
00201060 intr_stub_126 00203ec8 _ZN8MTGosHAL4PMM28markUsedEPKvj
00201080 intr_stub_127 00203ea2 _ZN8MTGosHAL4PMM2C1Ev
002010a0 intr_stub_128 00203ea2 _ZN8MTGosHAL4PMM2C2Ev
002010c0 intr_stub_129 002040d0 _ZN8MTGosHAL4PMM2clEi
00200240 intr_stub_13 0020402a _ZN8MTGosHAL4PMM2lsEPKv
002010e0 intr_stub_130 00203fd4 _ZN8MTGosHAL4PMM2rsERPv
00201100 intr_stub_131 002068d6 _ZN8MTGosHAL4PMM34initEP14multiboot_info
00201120 intr_stub_132 00206ab6 _ZN8MTGosHAL4PMM38markUsedEPKv
00201140 intr_stub_133 002068ca _ZN8MTGosHAL4PMM3C1Ev
00201160 intr_stub_134 002068ca _ZN8MTGosHAL4PMM3C2Ev
00201180 intr_stub_135 00206bee _ZN8MTGosHAL4PMM3lsEPKv
002011a0 intr_stub_136 00206b16 _ZN8MTGosHAL4PMM3rsERPv
002011c0 intr_stub_137 002005ca _ZN8MTGosHAL4Task5pauseEPNS_9cpu_stateE
002011e0 intr_stub_138 002005ec _ZN8MTGosHAL4Task7addTaskEPS0_
00201200 intr_stub_139 00200630 _ZN8MTGosHAL4Task7hasNextEv
00200260 intr_stub_14 002005b8 _ZN8MTGosHAL4Task7unpauseEv
00201220 intr_stub_140 00200592 _ZN8MTGosHAL4TaskC1EPNS_9cpu_stateE
00201240 intr_stub_141 00200592 _ZN8MTGosHAL4TaskC2EPNS_9cpu_stateE
00201260 intr_stub_142 00200899 _ZN8MTGosHAL4mainElP14multiboot_infoPPPPm
00201280 intr_stub_143 0020437c _ZN8MTGosHAL6Output4putsEPKc
002012a0 intr_stub_144 002043da _ZN8MTGosHAL6OutputlsINS_4BaseEEERS0_T_
002012c0 intr_stub_145 00204592 _ZN8MTGosHAL6OutputlsIPcEERS0_T_
002012e0 intr_stub_146 00204562 _ZN8MTGosHAL6OutputlsIcEERS0_T_
00201300 intr_stub_147 002043f6 _ZN8MTGosHAL6OutputlsIiEERS0_T_
00201320 intr_stub_148 002044ac _ZN8MTGosHAL6OutputlsIlEERS0_T_
00201340 intr_stub_149 002028fa _ZN8MTGosHAL6Screen4initEP14multiboot_info
00200280 intr_stub_15 00202a00 _ZN8MTGosHAL6Screen4putsEPKc
00201360 intr_stub_150 002026fe _ZN8MTGosHAL6Screen6clrscrEv
00201380 intr_stub_151 00202762 _ZN8MTGosHAL6Screen6scrollEv
002013a0 intr_stub_152 00202456 _ZN8MTGosHAL6Screen7putCharEc
002013c0 intr_stub_153 0020289a _ZN8MTGosHAL6Screen8setColorENS_8BG_colorE
002013e0 intr_stub_154 00202880 _ZN8MTGosHAL6Screen8setColorENS_8FG_colorE
00201400 intr_stub_155 002028b6 _ZN8MTGosHAL6Screen8setColorENS_8FG_colorENS_8BG_colorE
00201420 intr_stub_156 00202a5e _ZN8MTGosHAL6ScreenlsINS_4BaseEEERS0_T_
00201440 intr_stub_157 00202864 _ZN8MTGosHAL6ScreenlsINS_8BG_colorEEERS0_T_
00201460 intr_stub_158 0020284a _ZN8MTGosHAL6ScreenlsINS_8FG_colorEEERS0_T_
00201480 intr_stub_159 00202c16 _ZN8MTGosHAL6ScreenlsIPcEERS0_T_
002002a0 intr_stub_16 00202be6 _ZN8MTGosHAL6ScreenlsIcEERS0_T_
002014a0 intr_stub_160 00202a7a _ZN8MTGosHAL6ScreenlsIiEERS0_T_
002014c0 intr_stub_161 00202b30 _ZN8MTGosHAL6ScreenlsIlEERS0_T_
002014e0 intr_stub_162 0020336e _ZN8MTGosHAL6Serial15isTransmitEmptyEv
00201500 intr_stub_163 00203448 _ZN8MTGosHAL6Serial15serial_receivedEv
00201520 intr_stub_164 002036c4 _ZN8MTGosHAL6Serial5debugEv
00201540 intr_stub_165 00203478 _ZN8MTGosHAL6Serial7getCharEv
00201560 intr_stub_166 0020339e _ZN8MTGosHAL6Serial7putCharEc
00201580 intr_stub_167 0020354c _ZN8MTGosHAL6SerialC1Ev
002015a0 intr_stub_168 0020354c _ZN8MTGosHAL6SerialC2Ev
002015c0 intr_stub_169 00200ce8 _ZN8MTGosHAL7startupEv
002002c0 intr_stub_17 00202d62 _ZN8MTGosHAL8Keyboard10handleIRQ1EPNS_9cpu_stateE
002015e0 intr_stub_170 00202d14 _ZN8MTGosHAL8Keyboard11sendCommandEh
00201600 intr_stub_171 00202ca6 _ZN8MTGosHAL8Keyboard7getCharEv
00201620 intr_stub_172 002031ba _ZN8MTGosHAL8KeyboardC1Ev
00201640 intr_stub_173 002031ba _ZN8MTGosHAL8KeyboardC2Ev
00201660 intr_stub_174 00201252 _ZN8MTGosHAL8scheduleEPNS_9cpu_stateE
00201680 intr_stub_175 00202c7b _ZN8MTGosHAL9handleIRQEPNS_9cpu_stateE
002016a0 intr_stub_176 002006be _ZN9ScreenOut6clrscrEv
002016c0 intr_stub_177 002006fc _ZN9ScreenOut8setColorE7BGColor7FGColor
002016e0 intr_stub_178 00200648 _ZN9ScreenOutC1Eb
00201700 intr_stub_179 00200648 _ZN9ScreenOutC2Eb
002002e0 intr_stub_18 0020076a _ZN9ScreenOutD1Ev
00201720 intr_stub_180 0020076a _ZN9ScreenOutD2Ev
00201740 intr_stub_181 00200662 _ZN9ScreenOutlsEPc
00201760 intr_stub_182 0020353b _ZThn16_N8MTGosHAL6Serial7getCharEv
00201780 intr_stub_183 00203914 _ZdaPv
002017a0 intr_stub_184 0020022b _ZdaPvS_
002017c0 intr_stub_185 00203970 _ZdaPvm
002017e0 intr_stub_186 002038e8 _ZdlPv
00201800 intr_stub_187 0020021c _ZdlPvS_
00201820 intr_stub_188 00203940 _ZdlPvm
00201840 intr_stub_189 002038bd _Znam
00200300 intr_stub_19 0020020a _ZnamPv
00201860 intr_stub_190 00203892 _Znwm
00201880 intr_stub_191 002001f8 _ZnwmPv
002018a0 intr_stub_192 002010e0 __cxa_pure_virtual
002018c0 intr_stub_193 002023a7 _start
002018e0 intr_stub_194 00204603 enterPaging
00201900 intr_stub_195 0020237c handleINT
00201920 intr_stub_196 0020107d init
00201940 intr_stub_197 00204640 intr_stub_0
00201960 intr_stub_198 00204660 intr_stub_1
00201980 intr_stub_199 00204780 intr_stub_10
002000e0 intr_stub_2 002052c0 intr_stub_100
00200320 intr_stub_20 002052e0 intr_stub_101
002019a0 intr_stub_200 00205300 intr_stub_102
002019c0 intr_stub_201 00205320 intr_stub_103
002019e0 intr_stub_202 00205340 intr_stub_104
00201a00 intr_stub_203 00205360 intr_stub_105
00201a20 intr_stub_204 00205380 intr_stub_106
00201a40 intr_stub_205 002053a0 intr_stub_107
00201a60 intr_stub_206 002053c0 intr_stub_108
00201a80 intr_stub_207 002053e0 intr_stub_109
00201aa0 intr_stub_208 002047a0 intr_stub_11
00201ac0 intr_stub_209 00205400 intr_stub_110
00200340 intr_stub_21 00205420 intr_stub_111
00201ae0 intr_stub_210 00205440 intr_stub_112
00201b00 intr_stub_211 00205460 intr_stub_113
00201b20 intr_stub_212 00205480 intr_stub_114
00201b40 intr_stub_213 002054a0 intr_stub_115
00201b60 intr_stub_214 002054c0 intr_stub_116
00201b80 intr_stub_215 002054e0 intr_stub_117
00201ba0 intr_stub_216 00205500 intr_stub_118
00201bc0 intr_stub_217 00205520 intr_stub_119
00201be0 intr_stub_218 002047c0 intr_stub_12
00201c00 intr_stub_219 00205540 intr_stub_120
00200360 intr_stub_22 00205560 intr_stub_121
00201c20 intr_stub_220 00205580 intr_stub_122
00201c40 intr_stub_221 002055a0 intr_stub_123
00201c60 intr_stub_222 002055c0 intr_stub_124
00201c80 intr_stub_223 002055e0 intr_stub_125
00201ca0 intr_stub_224 00205600 intr_stub_126
00201cc0 intr_stub_225 00205620 intr_stub_127
00201ce0 intr_stub_226 00205640 intr_stub_128
00201d00 intr_stub_227 00205660 intr_stub_129
00201d20 intr_stub_228 002047e0 intr_stub_13
00201d40 intr_stub_229 00205680 intr_stub_130
00200380 intr_stub_23 002056a0 intr_stub_131
00201d60 intr_stub_230 002056c0 intr_stub_132
00201d80 intr_stub_231 002056e0 intr_stub_133
00201da0 intr_stub_232 00205700 intr_stub_134
00201dc0 intr_stub_233 00205720 intr_stub_135
00201de0 intr_stub_234 00205740 intr_stub_136
00201e00 intr_stub_235 00205760 intr_stub_137
00201e20 intr_stub_236 00205780 intr_stub_138
00201e40 intr_stub_237 002057a0 intr_stub_139
00201e60 intr_stub_238 00204800 intr_stub_14
00201e80 intr_stub_239 002057c0 intr_stub_140
002003a0 intr_stub_24 002057e0 intr_stub_141
00201ea0 intr_stub_240 00205800 intr_stub_142
00201ec0 intr_stub_241 00205820 intr_stub_143
00201ee0 intr_stub_242 00205840 intr_stub_144
00201f00 intr_stub_243 00205860 intr_stub_145
00201f20 intr_stub_244 00205880 intr_stub_146
00201f40 intr_stub_245 002058a0 intr_stub_147
00201f60 intr_stub_246 002058c0 intr_stub_148
00201f80 intr_stub_247 002058e0 intr_stub_149
00201fa0 intr_stub_248 00204820 intr_stub_15
00201fc0 intr_stub_249 00205900 intr_stub_150
002003c0 intr_stub_25 00205920 intr_stub_151
00201fe0 intr_stub_250 00205940 intr_stub_152
00202000 intr_stub_251 00205960 intr_stub_153
00202020 intr_stub_252 00205980 intr_stub_154
00202040 intr_stub_253 002059a0 intr_stub_155
00202060 intr_stub_254 002059c0 intr_stub_156
00202080 intr_stub_255 002059e0 intr_stub_157
002003e0 intr_stub_26 00205a00 intr_stub_158
00200400 intr_stub_27 00205a20 intr_stub_159
00200420 intr_stub_28 00204840 intr_stub_16
00200440 intr_stub_29 00205a40 intr_stub_160
00200100 intr_stub_3 00205a60 intr_stub_161
00200460 intr_stub_30 00205a80 intr_stub_162
00200480 intr_stub_31 00205aa0 intr_stub_163
002004a0 intr_stub_32 00205ac0 intr_stub_164
002004c0 intr_stub_33 00205ae0 intr_stub_165
002004e0 intr_stub_34 00205b00 intr_stub_166
00200500 intr_stub_35 00205b20 intr_stub_167
00200520 intr_stub_36 00205b40 intr_stub_168
00200540 intr_stub_37 00205b60 intr_stub_169
00200560 intr_stub_38 00204860 intr_stub_17
00200580 intr_stub_39 00205b80 intr_stub_170
00200120 intr_stub_4 00205ba0 intr_stub_171
002005a0 intr_stub_40 00205bc0 intr_stub_172
002005c0 intr_stub_41 00205be0 intr_stub_173
002005e0 intr_stub_42 00205c00 intr_stub_174
00200600 intr_stub_43 00205c20 intr_stub_175
00200620 intr_stub_44 00205c40 intr_stub_176
00200640 intr_stub_45 00205c60 intr_stub_177
00200660 intr_stub_46 00205c80 intr_stub_178
00200680 intr_stub_47 00205ca0 intr_stub_179
002006a0 intr_stub_48 00204880 intr_stub_18
002006c0 intr_stub_49 00205cc0 intr_stub_180
00200140 intr_stub_5 00205ce0 intr_stub_181
002006e0 intr_stub_50 00205d00 intr_stub_182
00200700 intr_stub_51 00205d20 intr_stub_183
00200720 intr_stub_52 00205d40 intr_stub_184
00200740 intr_stub_53 00205d60 intr_stub_185
00200760 intr_stub_54 00205d80 intr_stub_186
00200780 intr_stub_55 00205da0 intr_stub_187
002007a0 intr_stub_56 00205dc0 intr_stub_188
002007c0 intr_stub_57 00205de0 intr_stub_189
002007e0 intr_stub_58 002048a0 intr_stub_19
00200800 intr_stub_59 00205e00 intr_stub_190
00200160 intr_stub_6 00205e20 intr_stub_191
00200820 intr_stub_60 00205e40 intr_stub_192
00200840 intr_stub_61 00205e60 intr_stub_193
00200860 intr_stub_62 00205e80 intr_stub_194
00200880 intr_stub_63 00205ea0 intr_stub_195
002008a0 intr_stub_64 00205ec0 intr_stub_196
002008c0 intr_stub_65 00205ee0 intr_stub_197
002008e0 intr_stub_66 00205f00 intr_stub_198
00200900 intr_stub_67 00205f20 intr_stub_199
00200920 intr_stub_68 00204680 intr_stub_2
00200940 intr_stub_69 002048c0 intr_stub_20
00200180 intr_stub_7 00205f40 intr_stub_200
00200960 intr_stub_70 00205f60 intr_stub_201
00200980 intr_stub_71 00205f80 intr_stub_202
002009a0 intr_stub_72 00205fa0 intr_stub_203
002009c0 intr_stub_73 00205fc0 intr_stub_204
002009e0 intr_stub_74 00205fe0 intr_stub_205
00200a00 intr_stub_75 00206000 intr_stub_206
00200a20 intr_stub_76 00206020 intr_stub_207
00200a40 intr_stub_77 00206040 intr_stub_208
00200a60 intr_stub_78 00206060 intr_stub_209
00200a80 intr_stub_79 002048e0 intr_stub_21
002001a0 intr_stub_8 00206080 intr_stub_210
00200aa0 intr_stub_80 002060a0 intr_stub_211
00200ac0 intr_stub_81 002060c0 intr_stub_212
00200ae0 intr_stub_82 002060e0 intr_stub_213
00200b00 intr_stub_83 00206100 intr_stub_214
00200b20 intr_stub_84 00206120 intr_stub_215
00200b40 intr_stub_85 00206140 intr_stub_216
00200b60 intr_stub_86 00206160 intr_stub_217
00200b80 intr_stub_87 00206180 intr_stub_218
00200ba0 intr_stub_88 002061a0 intr_stub_219
00200bc0 intr_stub_89 00204900 intr_stub_22
002001c0 intr_stub_9 002061c0 intr_stub_220
00200be0 intr_stub_90 002061e0 intr_stub_221
00200c00 intr_stub_91 00206200 intr_stub_222
00200c20 intr_stub_92 00206220 intr_stub_223
00200c40 intr_stub_93 00206240 intr_stub_224
00200c60 intr_stub_94 00206260 intr_stub_225
00200c80 intr_stub_95 00206280 intr_stub_226
00200ca0 intr_stub_96 002062a0 intr_stub_227
00200cc0 intr_stub_97 002062c0 intr_stub_228
00200ce0 intr_stub_98 002062e0 intr_stub_229
00200d00 intr_stub_99 00204920 intr_stub_23
00206300 intr_stub_230
00206320 intr_stub_231
00206340 intr_stub_232
00206360 intr_stub_233
00206380 intr_stub_234
002063a0 intr_stub_235
002063c0 intr_stub_236
002063e0 intr_stub_237
00206400 intr_stub_238
00206420 intr_stub_239
00204940 intr_stub_24
00206440 intr_stub_240
00206460 intr_stub_241
00206480 intr_stub_242
002064a0 intr_stub_243
002064c0 intr_stub_244
002064e0 intr_stub_245
00206500 intr_stub_246
00206520 intr_stub_247
00206540 intr_stub_248
00206560 intr_stub_249
00204960 intr_stub_25
00206580 intr_stub_250
002065a0 intr_stub_251
002065c0 intr_stub_252
002065e0 intr_stub_253
00206600 intr_stub_254
00206620 intr_stub_255
00204980 intr_stub_26
002049a0 intr_stub_27
002049c0 intr_stub_28
002049e0 intr_stub_29
002046a0 intr_stub_3
00204a00 intr_stub_30
00204a20 intr_stub_31
00204a40 intr_stub_32
00204a60 intr_stub_33
00204a80 intr_stub_34
00204aa0 intr_stub_35
00204ac0 intr_stub_36
00204ae0 intr_stub_37
00204b00 intr_stub_38
00204b20 intr_stub_39
002046c0 intr_stub_4
00204b40 intr_stub_40
00204b60 intr_stub_41
00204b80 intr_stub_42
00204ba0 intr_stub_43
00204bc0 intr_stub_44
00204be0 intr_stub_45
00204c00 intr_stub_46
00204c20 intr_stub_47
00204c40 intr_stub_48
00204c60 intr_stub_49
002046e0 intr_stub_5
00204c80 intr_stub_50
00204ca0 intr_stub_51
00204cc0 intr_stub_52
00204ce0 intr_stub_53
00204d00 intr_stub_54
00204d20 intr_stub_55
00204d40 intr_stub_56
00204d60 intr_stub_57
00204d80 intr_stub_58
00204da0 intr_stub_59
00204700 intr_stub_6
00204dc0 intr_stub_60
00204de0 intr_stub_61
00204e00 intr_stub_62
00204e20 intr_stub_63
00204e40 intr_stub_64
00204e60 intr_stub_65
00204e80 intr_stub_66
00204ea0 intr_stub_67
00204ec0 intr_stub_68
00204ee0 intr_stub_69
00204720 intr_stub_7
00204f00 intr_stub_70
00204f20 intr_stub_71
00204f40 intr_stub_72
00204f60 intr_stub_73
00204f80 intr_stub_74
00204fa0 intr_stub_75
00204fc0 intr_stub_76
00204fe0 intr_stub_77
00205000 intr_stub_78
00205020 intr_stub_79
00204740 intr_stub_8
00205040 intr_stub_80
00205060 intr_stub_81
00205080 intr_stub_82
002050a0 intr_stub_83
002050c0 intr_stub_84
002050e0 intr_stub_85
00205100 intr_stub_86
00205120 intr_stub_87
00205140 intr_stub_88
00205160 intr_stub_89
00204760 intr_stub_9
00205180 intr_stub_90
002051a0 intr_stub_91
002051c0 intr_stub_92
002051e0 intr_stub_93
00205200 intr_stub_94
00205220 intr_stub_95
00205240 intr_stub_96
00205260 intr_stub_97
00205280 intr_stub_98
002052a0 intr_stub_99
00200000 kernel_start 00200000 kernel_start
00200040 loadGDT 002045e0 loadGDT
0020005c loadIDT 002045fc loadIDT
00205ad5 main 002002b0 main
0020526c memmove 002000e2 memcpy
00203b01 _start 00200030 memmove
00205350 strcmp 00200140 strcmp
0020531e strlen 0020010e strlen
00205b84 _Z4loadP10Elf32_Ehdr
00205a65 _Z6task_av
00205a81 _Z6task_bv
00205a9d _Z6task_cv
00205ab9 _Z6task_dv
00206425 _Z7syscalljPvS_
00205a5f _Z8pid_nullv
00205ed5 _ZdaPv
00205f23 _ZdaPvm
00205a50 _ZdaPvS_
00205eb0 _ZdlPv
00205efa _ZdlPvm
00205a41 _ZdlPvS_
00202a8e _ZN8MTGosHAL12Multitasking8initTaskEPFvvE
00202be8 _ZN8MTGosHAL12Multitasking8scheduleEPNS_9cpu_stateE
002029d8 _ZN8MTGosHAL12MultitaskingC1Ev
002029d8 _ZN8MTGosHAL12MultitaskingC2Ev
002022ce _ZN8MTGosHAL3GDT5applyEv
00202182 _ZN8MTGosHAL3GDT8setEntryEijji
0020210c _ZN8MTGosHAL3GDTC1Ev
0020210c _ZN8MTGosHAL3GDTC2Ev
00202f24 _ZN8MTGosHAL3IDT5applyEv
00202f88 _ZN8MTGosHAL3IDT6handleEPNS_9cpu_stateE
00203a54 _ZN8MTGosHAL3IDT7requestEhPFPNS_9cpu_stateES2_E
00202d98 _ZN8MTGosHAL3IDT8setEntryEiPvth
00202cac _ZN8MTGosHAL3IDTC1Ev
00202cac _ZN8MTGosHAL3IDTC2Ev
002061d0 _ZN8MTGosHAL3PMM4freeEPv
00204934 _ZN8MTGosHAL3PMM4initEP14multiboot_info
00205f4c _ZN8MTGosHAL3PMM5allocEm
00204966 _ZN8MTGosHAL3PMM8markUsedEPKvm
00204902 _ZN8MTGosHAL3PMMC1Ev
00204902 _ZN8MTGosHAL3PMMC2Ev
00204a08 _ZN8MTGosHAL3PMMclEi
002049d4 _ZN8MTGosHAL3PMMlsEPKv
002049a0 _ZN8MTGosHAL3PMMrsERPv
0020232a _ZN8MTGosHAL4mainElP14multiboot_infoPPPPm
00205042 _ZN8MTGosHAL4PMM24initEP14multiboot_info
00204de0 _ZN8MTGosHAL4PMM28markUsedEPKvj
00204dba _ZN8MTGosHAL4PMM2C1Ev
00204dba _ZN8MTGosHAL4PMM2C2Ev
00204fd8 _ZN8MTGosHAL4PMM2clEi
00204f32 _ZN8MTGosHAL4PMM2lsEPKv
00204edc _ZN8MTGosHAL4PMM2rsERPv
00204a42 _ZN8MTGosHAL4PMM34initEP14multiboot_info
00204c22 _ZN8MTGosHAL4PMM38markUsedEPKv
00204a36 _ZN8MTGosHAL4PMM3C1Ev
00204a36 _ZN8MTGosHAL4PMM3C2Ev
00204d5a _ZN8MTGosHAL4PMM3lsEPKv
00204c82 _ZN8MTGosHAL4PMM3rsERPv
00205dea _ZN8MTGosHAL4Task5pauseEPNS_9cpu_stateE
00205e0c _ZN8MTGosHAL4Task7addTaskEPS0_
00205e50 _ZN8MTGosHAL4Task7hasNextEv
00205dd8 _ZN8MTGosHAL4Task7unpauseEv
00205db2 _ZN8MTGosHAL4TaskC1EPNS_9cpu_stateE
00205db2 _ZN8MTGosHAL4TaskC2EPNS_9cpu_stateE
002057f2 _ZN8MTGosHAL6Output4putsEPKc
002059c4 _ZN8MTGosHAL6OutputlsIcEERS0_T_
0020586c _ZN8MTGosHAL6OutputlsIiEERS0_T_
00205918 _ZN8MTGosHAL6OutputlsIlEERS0_T_
00205850 _ZN8MTGosHAL6OutputlsINS_4BaseEEERS0_T_
002059f4 _ZN8MTGosHAL6OutputlsIPcEERS0_T_
00203bb0 _ZN8MTGosHAL6Screen4initEP14multiboot_info
0020561e _ZN8MTGosHAL6Screen6clrscrEv
00205670 _ZN8MTGosHAL6Screen6scrollEv
00205408 _ZN8MTGosHAL6Screen7putCharEc
002057a0 _ZN8MTGosHAL6Screen8setColorENS_8BG_colorE
00205784 _ZN8MTGosHAL6Screen8setColorENS_8FG_colorE
002057bc _ZN8MTGosHAL6Screen8setColorENS_8FG_colorENS_8BG_colorE
00205768 _ZN8MTGosHAL6ScreenlsINS_8BG_colorEEERS0_T_
0020574c _ZN8MTGosHAL6ScreenlsINS_8FG_colorEEERS0_T_
002043de _ZN8MTGosHAL6Serial15isTransmitEmptyEv
002044b8 _ZN8MTGosHAL6Serial15serial_receivedEv
00204734 _ZN8MTGosHAL6Serial5debugEv
002044e8 _ZN8MTGosHAL6Serial7getCharEv
0020440e _ZN8MTGosHAL6Serial7putCharEc
002045bc _ZN8MTGosHAL6SerialC1Ev
002045bc _ZN8MTGosHAL6SerialC2Ev
00202779 _ZN8MTGosHAL7startupEv
00203dd2 _ZN8MTGosHAL8Keyboard10handleIRQ1EPNS_9cpu_stateE
00203d84 _ZN8MTGosHAL8Keyboard11sendCommandEh
00203d16 _ZN8MTGosHAL8Keyboard7getCharEv
0020422a _ZN8MTGosHAL8KeyboardC1Ev
0020422a _ZN8MTGosHAL8KeyboardC2Ev
002029ac _ZN8MTGosHAL8scheduleEPNS_9cpu_stateE
00203ceb _ZN8MTGosHAL9handleIRQEPNS_9cpu_stateE
0020636e _ZN9ScreenOut6clrscrEv
002063ac _ZN9ScreenOut8setColorE7BGColor7FGColor
002062f8 _ZN9ScreenOutC1Eb
002062f8 _ZN9ScreenOutC2Eb
0020641a _ZN9ScreenOutD1Ev
0020641a _ZN9ScreenOutD2Ev
00206312 _ZN9ScreenOutlsEPc
00205e8c _Znam
00205a2f _ZnamPv
00205e68 _Znwm
00205a1d _ZnwmPv
002045ab _ZThn16_N8MTGosHAL6Serial7getCharEv