Skip to content

Commit

Permalink
Bootloader: Locate the kernel's data segment and clear it.
Browse files Browse the repository at this point in the history
This was a constant source of stupid bugs and I kept postponing it because
I wasn't in the mood to write assembly code. Until now! :^)
  • Loading branch information
awesomekling committed Feb 6, 2019
1 parent 781f216 commit a1b63bb
Show file tree
Hide file tree
Showing 22 changed files with 54 additions and 83 deletions.
9 changes: 0 additions & 9 deletions AK/StringImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,6 @@ namespace AK {

static StringImpl* s_the_empty_stringimpl = nullptr;

void StringImpl::initialize_globals()
{
s_the_empty_stringimpl = nullptr;
#ifdef DEBUG_STRINGIMPL
g_stringimpl_count = 0;
g_all_live_stringimpls = new HashTable<StringImpl*>;
#endif
}

StringImpl& StringImpl::the_empty_stringimpl()
{
if (!s_the_empty_stringimpl)
Expand Down
1 change: 0 additions & 1 deletion AK/StringImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ class StringImpl : public Retainable<StringImpl> {
RetainPtr<StringImpl> to_uppercase() const;

static StringImpl& the_empty_stringimpl();
static void initialize_globals();

~StringImpl();

Expand Down
5 changes: 0 additions & 5 deletions Kernel/BochsVGADevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,6 @@ BochsVGADevice& BochsVGADevice::the()
return *s_the;
}

void BochsVGADevice::initialize_statics()
{
s_the = nullptr;
}

BochsVGADevice::BochsVGADevice()
{
s_the = this;
Expand Down
1 change: 0 additions & 1 deletion Kernel/BochsVGADevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ class BochsVGADevice {
AK_MAKE_ETERNAL
public:
static BochsVGADevice& the();
static void initialize_statics();

BochsVGADevice();

Expand Down
57 changes: 54 additions & 3 deletions Kernel/Boot/boot.asm
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,13 @@ boot:
mov ax, 0x2401
int 0x15

mov bx, 0x1000
; HACK: Load the ELF kernel at 0xf000. Assuming that the first
; LOAD header has a file offset of 0x1000, this puts _start
; at 0x10000 which we jump to later.
; This is all quite rickety.
mov bx, 0xf00
mov es, bx
xor bx, bx ; Load kernel @ 0x10000
xor bx, bx

mov cx, word [cur_lba]
.sector_loop:
Expand Down Expand Up @@ -65,6 +69,53 @@ boot:
xor al, al
out dx, al

; Let's look at the ELF header.
mov bx, 0xf00
mov fs, bx
cmp [fs:0], dword 0x464c457f ; ELF magic: { 0x7f "ELF" }
jne fug

cmp [fs:24], dword 0x10000 ; Entry should be 0x10000
jne fug

mov ebx, dword [fs:28] ; EBX <- program header table
mov ecx, dword [fs:44] ; ECX <- program header count

; Let's find the BSS and clear it.

parse_program_header:
cmp [fs:ebx], dword 0x1 ; Is Load segment?
jne .next

cmp [fs:ebx+24], dword 0x6 ; Is read+write but not execute?
jne .next

mov edi, [fs:ebx+8] ; EDI <- p_vaddr
add edi, [fs:ebx+16] ; skip over 'p_filesz' bytes (leave them intact)

push ecx

sub edi, [fs:ebx+16] ; skip over 'p_filesz' bytes (see above)

; Since we're in 16-bit real mode, create a segment address.
mov eax, edi
shr eax, 4
mov es, ax
and edi, 0xf

mov ecx, [fs:ebx+20] ; ECX <- p_memsz
xor al, al
rep stosb

pop ecx

.next:
add ebx, 32
loop parse_program_header

; Okay we're all set to go!

lets_go:
lgdt [cs:test_gdt_ptr]

mov eax, cr0
Expand Down Expand Up @@ -182,7 +233,7 @@ convert_lba_to_chs:
ret
cur_lba:
dw 9
dw 1
sectors_per_track:
dw 18
heads:
Expand Down
7 changes: 0 additions & 7 deletions Kernel/FileSystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,6 @@ HashTable<Inode*>& all_inodes()
return *s_inode_set;
}

void FS::initialize_globals()
{
s_lastFileSystemID = 0;
s_fs_map = nullptr;
s_inode_set = nullptr;
}

FS::FS()
: m_fsid(++s_lastFileSystemID)
{
Expand Down
1 change: 0 additions & 1 deletion Kernel/FileSystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ class VMObject;

class FS : public Retainable<FS> {
public:
static void initialize_globals();
virtual ~FS();

unsigned fsid() const { return m_fsid; }
Expand Down
5 changes: 0 additions & 5 deletions Kernel/PTYMultiplexer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,6 @@ PTYMultiplexer& PTYMultiplexer::the()
return *s_the;
}

void PTYMultiplexer::initialize_statics()
{
s_the = nullptr;
}

PTYMultiplexer::PTYMultiplexer()
: CharacterDevice(5, 2)
{
Expand Down
1 change: 0 additions & 1 deletion Kernel/PTYMultiplexer.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ class PTYMultiplexer final : public CharacterDevice {
virtual ~PTYMultiplexer() override;

static PTYMultiplexer& the();
static void initialize_statics();

// ^CharacterDevice
virtual RetainPtr<FileDescriptor> open(int& error, int options) override;
Expand Down
5 changes: 0 additions & 5 deletions Kernel/ProcessGUI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,6 @@

void Process::initialize_gui_statics()
{
Font::initialize();
WSMessageLoop::initialize();
WSWindowManager::initialize();
WSScreen::initialize();

new WSMessageLoop;
}

Expand Down
6 changes: 0 additions & 6 deletions Kernel/VirtualFileSystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,6 @@ VFS& VFS::the()
return *s_the;
}

void VFS::initialize_globals()
{
s_the = nullptr;
FS::initialize_globals();
}

VFS::VFS()
{
#ifdef VFS_DEBUG
Expand Down
2 changes: 0 additions & 2 deletions Kernel/VirtualFileSystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,6 @@ class VFS;
class VFS {
AK_MAKE_ETERNAL
public:
static void initialize_globals();

class Mount {
public:
Mount(InodeIdentifier host, RetainPtr<FS>&&);
Expand Down
6 changes: 0 additions & 6 deletions Kernel/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,8 +151,6 @@ void init()
gdt_init();
idt_init();

PTYMultiplexer::initialize_statics();
VFS::initialize_globals();
vfs = new VFS;

keyboard = new Keyboard;
Expand All @@ -169,10 +167,6 @@ void init()
kprintf("Starting Serenity Operating System...\n");

MemoryManager::initialize();

StringImpl::initialize_globals();
BochsVGADevice::initialize_statics();

PIT::initialize();

memset(&system, 0, sizeof(system));
Expand Down
2 changes: 0 additions & 2 deletions LibC/entry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ extern "C" int _start()
__stdio_init();
__malloc_init();

StringImpl::initialize_globals();

int status = 254;
int argc;
char** argv;
Expand Down
6 changes: 0 additions & 6 deletions SharedGraphics/Font.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,6 @@ static inline constexpr size_t font_file_size(unsigned glyph_height)
return sizeof(FontFileHeader) + 256 * sizeof(dword) * glyph_height;
}

void Font::initialize()
{
s_default_font = nullptr;
s_default_bold_font = nullptr;
}

Font& Font::default_font()
{
static const char* default_font_path = "/res/fonts/LizaRegular8x10.font";
Expand Down
2 changes: 0 additions & 2 deletions SharedGraphics/Font.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,6 @@ class Font : public Retainable<Font> {
String name() const { return m_name; }
void set_name(const String& name) { m_name = name; }

static void initialize();

private:
Font(const String& name, unsigned* rows, byte glyph_width, byte glyph_height);

Expand Down
5 changes: 0 additions & 5 deletions WindowServer/WSMessageLoop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,6 @@

static WSMessageLoop* s_the;

void WSMessageLoop::initialize()
{
s_the = nullptr;
}

WSMessageLoop::WSMessageLoop()
{
if (!s_the)
Expand Down
2 changes: 0 additions & 2 deletions WindowServer/WSMessageLoop.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ class WSMessageLoop {

static WSMessageLoop& the();

static void initialize();

bool running() const { return m_running; }
Process& server_process() { return *m_server_process; }

Expand Down
5 changes: 0 additions & 5 deletions WindowServer/WSScreen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,6 @@

static WSScreen* s_the;

void WSScreen::initialize()
{
s_the = nullptr;
}

WSScreen& WSScreen::the()
{
ASSERT(s_the);
Expand Down
2 changes: 0 additions & 2 deletions WindowServer/WSScreen.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ class WSScreen {
Size size() const { return { width(), height() }; }
Rect rect() const { return { 0, 0, width(), height() }; }

static void initialize();

Point cursor_location() const { return m_cursor_location; }
bool left_mouse_button_pressed() const { return m_left_mouse_button_pressed; }
bool right_mouse_button_pressed() const { return m_right_mouse_button_pressed; }
Expand Down
5 changes: 0 additions & 5 deletions WindowServer/WSWindowManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,6 @@ WSWindowManager& WSWindowManager::the()
return *s_the;
}

void WSWindowManager::initialize()
{
s_the = nullptr;
}

static const char* cursor_bitmap_inner_ascii = {
" # "
" ## "
Expand Down
2 changes: 0 additions & 2 deletions WindowServer/WSWindowManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@ class WSWindowManager : public WSMessageReceiver {

void move_to_front(WSWindow&);

static void initialize();

void draw_cursor();

void invalidate(const WSWindow&);
Expand Down

0 comments on commit a1b63bb

Please sign in to comment.