Initial commit. Still a lot to do
This commit is contained in:
commit
5d355504bc
149
.clang-format
Normal file
149
.clang-format
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
---
|
||||||
|
Language: Cpp
|
||||||
|
# BasedOnStyle: GNU
|
||||||
|
AccessModifierOffset: -2
|
||||||
|
AlignAfterOpenBracket: Align
|
||||||
|
AlignConsecutiveMacros: false
|
||||||
|
AlignConsecutiveAssignments: false
|
||||||
|
AlignConsecutiveBitFields: false
|
||||||
|
AlignConsecutiveDeclarations: false
|
||||||
|
AlignEscapedNewlines: Right
|
||||||
|
AlignOperands: Align
|
||||||
|
AlignTrailingComments: true
|
||||||
|
AllowAllArgumentsOnNextLine: true
|
||||||
|
AllowAllConstructorInitializersOnNextLine: true
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
|
AllowShortEnumsOnASingleLine: true
|
||||||
|
AllowShortBlocksOnASingleLine: Never
|
||||||
|
AllowShortCaseLabelsOnASingleLine: false
|
||||||
|
AllowShortFunctionsOnASingleLine: All
|
||||||
|
AllowShortLambdasOnASingleLine: All
|
||||||
|
AllowShortIfStatementsOnASingleLine: Never
|
||||||
|
AllowShortLoopsOnASingleLine: false
|
||||||
|
AlwaysBreakAfterDefinitionReturnType: All
|
||||||
|
AlwaysBreakAfterReturnType: AllDefinitions
|
||||||
|
AlwaysBreakBeforeMultilineStrings: false
|
||||||
|
AlwaysBreakTemplateDeclarations: MultiLine
|
||||||
|
BinPackArguments: true
|
||||||
|
BinPackParameters: true
|
||||||
|
BraceWrapping:
|
||||||
|
AfterCaseLabel: true
|
||||||
|
AfterClass: true
|
||||||
|
AfterControlStatement: Always
|
||||||
|
AfterEnum: true
|
||||||
|
AfterFunction: true
|
||||||
|
AfterNamespace: true
|
||||||
|
AfterObjCDeclaration: true
|
||||||
|
AfterStruct: true
|
||||||
|
AfterUnion: true
|
||||||
|
AfterExternBlock: true
|
||||||
|
BeforeCatch: true
|
||||||
|
BeforeElse: true
|
||||||
|
BeforeLambdaBody: false
|
||||||
|
BeforeWhile: true
|
||||||
|
IndentBraces: true
|
||||||
|
SplitEmptyFunction: true
|
||||||
|
SplitEmptyRecord: true
|
||||||
|
SplitEmptyNamespace: true
|
||||||
|
BreakBeforeBinaryOperators: All
|
||||||
|
BreakBeforeBraces: GNU
|
||||||
|
BreakBeforeInheritanceComma: false
|
||||||
|
BreakInheritanceList: BeforeColon
|
||||||
|
BreakBeforeTernaryOperators: true
|
||||||
|
BreakConstructorInitializersBeforeComma: false
|
||||||
|
BreakConstructorInitializers: BeforeColon
|
||||||
|
BreakAfterJavaFieldAnnotations: false
|
||||||
|
BreakStringLiterals: true
|
||||||
|
ColumnLimit: 79
|
||||||
|
CommentPragmas: '^ IWYU pragma:'
|
||||||
|
CompactNamespaces: false
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
||||||
|
ConstructorInitializerIndentWidth: 4
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
Cpp11BracedListStyle: false
|
||||||
|
DeriveLineEnding: true
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
DisableFormat: false
|
||||||
|
ExperimentalAutoDetectBinPacking: false
|
||||||
|
FixNamespaceComments: false
|
||||||
|
ForEachMacros:
|
||||||
|
- foreach
|
||||||
|
- Q_FOREACH
|
||||||
|
- BOOST_FOREACH
|
||||||
|
IncludeBlocks: Preserve
|
||||||
|
IncludeCategories:
|
||||||
|
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
||||||
|
Priority: 2
|
||||||
|
SortPriority: 0
|
||||||
|
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
|
||||||
|
Priority: 3
|
||||||
|
SortPriority: 0
|
||||||
|
- Regex: '.*'
|
||||||
|
Priority: 1
|
||||||
|
SortPriority: 0
|
||||||
|
IncludeIsMainRegex: '(Test)?$'
|
||||||
|
IncludeIsMainSourceRegex: ''
|
||||||
|
IndentCaseLabels: false
|
||||||
|
IndentCaseBlocks: false
|
||||||
|
IndentGotoLabels: true
|
||||||
|
IndentPPDirectives: None
|
||||||
|
IndentExternBlock: AfterExternBlock
|
||||||
|
IndentWidth: 2
|
||||||
|
IndentWrappedFunctionNames: false
|
||||||
|
InsertTrailingCommas: None
|
||||||
|
JavaScriptQuotes: Leave
|
||||||
|
JavaScriptWrapImports: true
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||||
|
MacroBlockBegin: ''
|
||||||
|
MacroBlockEnd: ''
|
||||||
|
MaxEmptyLinesToKeep: 1
|
||||||
|
NamespaceIndentation: None
|
||||||
|
ObjCBinPackProtocolList: Auto
|
||||||
|
ObjCBlockIndentWidth: 2
|
||||||
|
ObjCBreakBeforeNestedBlockParam: true
|
||||||
|
ObjCSpaceAfterProperty: false
|
||||||
|
ObjCSpaceBeforeProtocolList: true
|
||||||
|
PenaltyBreakAssignment: 2
|
||||||
|
PenaltyBreakBeforeFirstCallParameter: 19
|
||||||
|
PenaltyBreakComment: 300
|
||||||
|
PenaltyBreakFirstLessLess: 120
|
||||||
|
PenaltyBreakString: 1000
|
||||||
|
PenaltyBreakTemplateDeclaration: 10
|
||||||
|
PenaltyExcessCharacter: 1000000
|
||||||
|
PenaltyReturnTypeOnItsOwnLine: 60
|
||||||
|
PointerAlignment: Right
|
||||||
|
ReflowComments: true
|
||||||
|
SortIncludes: true
|
||||||
|
SortUsingDeclarations: true
|
||||||
|
SpaceAfterCStyleCast: false
|
||||||
|
SpaceAfterLogicalNot: false
|
||||||
|
SpaceAfterTemplateKeyword: true
|
||||||
|
SpaceBeforeAssignmentOperators: true
|
||||||
|
SpaceBeforeCpp11BracedList: false
|
||||||
|
SpaceBeforeCtorInitializerColon: true
|
||||||
|
SpaceBeforeInheritanceColon: true
|
||||||
|
SpaceBeforeParens: Always
|
||||||
|
SpaceBeforeRangeBasedForLoopColon: true
|
||||||
|
SpaceInEmptyBlock: false
|
||||||
|
SpaceInEmptyParentheses: false
|
||||||
|
SpacesBeforeTrailingComments: 1
|
||||||
|
SpacesInAngles: false
|
||||||
|
SpacesInConditionalStatement: false
|
||||||
|
SpacesInContainerLiterals: true
|
||||||
|
SpacesInCStyleCastParentheses: false
|
||||||
|
SpacesInParentheses: false
|
||||||
|
SpacesInSquareBrackets: false
|
||||||
|
SpaceBeforeSquareBrackets: false
|
||||||
|
Standard: c++03
|
||||||
|
StatementMacros:
|
||||||
|
- Q_UNUSED
|
||||||
|
- QT_REQUIRE_VERSION
|
||||||
|
TabWidth: 8
|
||||||
|
UseCRLF: false
|
||||||
|
UseTab: Never
|
||||||
|
WhitespaceSensitiveMacros:
|
||||||
|
- STRINGIZE
|
||||||
|
- PP_STRINGIZE
|
||||||
|
- BOOST_PP_STRINGIZE
|
||||||
|
...
|
||||||
|
|
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
*.o
|
||||||
|
*.bin
|
||||||
|
*~
|
||||||
|
\#*\#
|
||||||
|
.\#*
|
||||||
|
*.out
|
92
Makefile
Normal file
92
Makefile
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
CROSS_PATH=$(HOME)/opt/cross/bin
|
||||||
|
|
||||||
|
LD=$(CROSS_PATH)/i686-elf-ld
|
||||||
|
CC=$(CROSS_PATH)/i686-elf-gcc
|
||||||
|
|
||||||
|
ASM=nasm
|
||||||
|
ECHO=echo -e
|
||||||
|
QEMU=qemu-system-i386
|
||||||
|
GDB=gdb
|
||||||
|
|
||||||
|
CFLAGS=-g -ffreestanding -falign-jumps -falign-functions -falign-labels \
|
||||||
|
-falign-loops -fstrength-reduce -fomit-frame-pointer \
|
||||||
|
-finline-functions -Wno-unused-function -fno-builtin -Werror \
|
||||||
|
-Wno-unused-label -Wno-cpp -Wno-unused-parameter -nostdlib \
|
||||||
|
-nostartfiles -nodefaultlibs -Wall -O0
|
||||||
|
INCLUDES=-I.
|
||||||
|
|
||||||
|
NO_SECTORS=100
|
||||||
|
|
||||||
|
OBJS=build/kernel.asm.o build/kernel.o build/idt/idt.asm.o build/idt/idt.o \
|
||||||
|
build/mm/mem.o build/io/io.asm.o build/string/string.o
|
||||||
|
|
||||||
|
# VESA Driver
|
||||||
|
OBJS+=build/drivers/vesa/vesa.o build/drivers/vesa/terminal.o \
|
||||||
|
build/drivers/vesa/fonts/vga.o
|
||||||
|
|
||||||
|
all: build/boot/boot.bin build/kernel.out
|
||||||
|
@dd if=build/boot/boot.bin > kinl.bin
|
||||||
|
@dd if=build/kernel.out >> kinl.bin
|
||||||
|
@dd if=/dev/zero bs=512 count=$(NO_SECTORS) >> kinl.bin
|
||||||
|
|
||||||
|
build/kernel.out: $(OBJS)
|
||||||
|
@$(LD) -g -relocatable $(OBJS) -o build/kernelfull.o
|
||||||
|
@$(CC) $(CFLAGS) -T linker.ld -o $@ -ffreestanding -O0 -nostdlib \
|
||||||
|
build/kernelfull.o
|
||||||
|
|
||||||
|
build/boot/boot.bin: boot/bios.asm
|
||||||
|
@$(ECHO) "ASM\t\t"$<
|
||||||
|
@$(ASM) -f bin $< -o $@
|
||||||
|
|
||||||
|
build/kernel.asm.o: sys/kernel.asm
|
||||||
|
@$(ECHO) "ASM\t\t"$<
|
||||||
|
@$(ASM) -f elf -g $< -o $@
|
||||||
|
|
||||||
|
build/kernel.o: sys/kernel.c
|
||||||
|
@$(ECHO) "CC\t\t"$<
|
||||||
|
@$(CC) $(CFLAGS) $(INCLUDES) -std=gnu99 -c $< -o $@
|
||||||
|
|
||||||
|
build/idt/idt.asm.o: sys/idt/idt.asm
|
||||||
|
@$(ECHO) "ASM\t\t"$<
|
||||||
|
@$(ASM) -f elf -g $< -o $@
|
||||||
|
|
||||||
|
build/idt/idt.o: sys/idt/idt.c
|
||||||
|
@$(ECHO) "CC\t\t"$<
|
||||||
|
@$(CC) $(CFLAGS) $(INCLUDES) -std=gnu99 -c $< -o $@
|
||||||
|
|
||||||
|
build/mm/mem.o: sys/mm/mem.c
|
||||||
|
@$(ECHO) "CC\t\t"$<
|
||||||
|
@$(CC) $(CFLAGS) $(INCLUDES) -std=gnu99 -c $< -o $@
|
||||||
|
|
||||||
|
build/io/io.asm.o: sys/io/io.asm
|
||||||
|
@$(ECHO) "ASM\t\t"$<
|
||||||
|
@$(ASM) -f elf -g $< -o $@
|
||||||
|
|
||||||
|
build/string/string.o: sys/string/string.c
|
||||||
|
@$(ECHO) "CC\t\t"$<
|
||||||
|
@$(CC) $(CFLAGS) $(INCLUDES) -std=gnu99 -c $< -o $@
|
||||||
|
|
||||||
|
# VESA Driver
|
||||||
|
build/drivers/vesa/vesa.o: drivers/vesa/vesa.c
|
||||||
|
@$(ECHO) "CC\t\t"$<
|
||||||
|
@$(CC) $(CFLAGS) $(INCLUDES) -std=gnu99 -c $< -o $@
|
||||||
|
|
||||||
|
build/drivers/vesa/terminal.o: drivers/vesa/terminal.c
|
||||||
|
@$(ECHO) "CC\t\t"$<
|
||||||
|
@$(CC) $(CFLAGS) $(INCLUDES) -std=gnu99 -c $< -o $@
|
||||||
|
|
||||||
|
build/drivers/vesa/fonts/vga.o: drivers/vesa/fonts/vga.c
|
||||||
|
@$(ECHO) "CC\t\t"$<
|
||||||
|
@$(CC) $(CFLAGS) $(INCLUDES) -std=gnu99 -c $< -o $@
|
||||||
|
|
||||||
|
gdb: all
|
||||||
|
@$(GDB) -ex "set confirm off" \
|
||||||
|
-ex "add-symbol-file build/kernelfull.o 0x0100000" \
|
||||||
|
-ex "target remote | qemu-system-i386 -hda kinl.bin -S -gdb stdio"
|
||||||
|
|
||||||
|
run: all
|
||||||
|
@$(QEMU) -hda kinl.bin
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@rm -Rf build/boot/boot.bin build/kernel.out \
|
||||||
|
build/kernelfull.o $(OBJS)
|
142
boot/bios.asm
Normal file
142
boot/bios.asm
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
ORG 0x7c00
|
||||||
|
BITS 16
|
||||||
|
|
||||||
|
CODE_SEG equ gdt_code - gdt_start
|
||||||
|
DATA_SEG equ gdt_data - gdt_start
|
||||||
|
|
||||||
|
_start:
|
||||||
|
jmp short start
|
||||||
|
nop
|
||||||
|
|
||||||
|
times 33 db 0
|
||||||
|
|
||||||
|
start:
|
||||||
|
jmp 0:step2
|
||||||
|
|
||||||
|
step2:
|
||||||
|
cli ; Disable interrupts
|
||||||
|
mov ax, 0x00
|
||||||
|
mov ds, ax
|
||||||
|
mov es, ax
|
||||||
|
|
||||||
|
mov ss, ax
|
||||||
|
mov sp, 0x7c00
|
||||||
|
sti ; Enable interrupts
|
||||||
|
|
||||||
|
mov ax, 0x4F01
|
||||||
|
mov cx, 0x118
|
||||||
|
mov di, 0x500
|
||||||
|
int 0x10
|
||||||
|
|
||||||
|
mov ax, 0x4F02
|
||||||
|
mov bx, 0x118
|
||||||
|
int 0x10
|
||||||
|
|
||||||
|
.load_protected:
|
||||||
|
cli
|
||||||
|
lgdt [gdt_descriptor]
|
||||||
|
mov eax, cr0
|
||||||
|
or eax, 1
|
||||||
|
mov cr0, eax
|
||||||
|
jmp CODE_SEG:load32
|
||||||
|
|
||||||
|
;; GDT
|
||||||
|
gdt_start:
|
||||||
|
gdt_null:
|
||||||
|
dd 0x0
|
||||||
|
dd 0x0
|
||||||
|
|
||||||
|
;; offset 0x8
|
||||||
|
gdt_code: ; CS Should point to this
|
||||||
|
dw 0xffff ; Segment limit first 0-15 bits
|
||||||
|
dw 0 ; Base first 0-15 bits
|
||||||
|
db 0 ; Base 16-23 bits
|
||||||
|
db 0x9a ; Access bytes
|
||||||
|
db 11001111b ; High 4 bit flags and the low 4 bit flags
|
||||||
|
db 0 ; Base 24-31 bits
|
||||||
|
|
||||||
|
;; offset 0x10
|
||||||
|
gdt_data: ; DS, SS, ES, FS, GS
|
||||||
|
dw 0xffff ; Segment limit, first 0-15 bits
|
||||||
|
dw 0 ; Base first 0-15 bits
|
||||||
|
db 0 ; Base 16-23 bits
|
||||||
|
db 0x92 ; Access byte
|
||||||
|
db 11001111b ; High 4 bit flags and the low 4 bit flags
|
||||||
|
db 0 ; Base 24-31 bits
|
||||||
|
gdt_end:
|
||||||
|
gdt_descriptor:
|
||||||
|
dw gdt_end - gdt_start - 1
|
||||||
|
dd gdt_start
|
||||||
|
|
||||||
|
[BITS 32]
|
||||||
|
load32:
|
||||||
|
mov eax, 1
|
||||||
|
mov ecx, 100
|
||||||
|
mov edi, 0x0100000
|
||||||
|
call ata_lba_read
|
||||||
|
jmp CODE_SEG:0x0100000
|
||||||
|
|
||||||
|
|
||||||
|
ata_lba_read:
|
||||||
|
mov ebx, eax ; Backup the LBA
|
||||||
|
|
||||||
|
;; Send the highest 8 bits of the LBA to the hard disk controller
|
||||||
|
shr eax, 24
|
||||||
|
or eax, 0xE0
|
||||||
|
mov dx, 0x1F6
|
||||||
|
out dx, al
|
||||||
|
;; Finished sending the highest 8 bits of the LBA
|
||||||
|
|
||||||
|
;; Send the total sectors to read
|
||||||
|
mov eax, ecx
|
||||||
|
mov dx, 0x1F2
|
||||||
|
out dx, al
|
||||||
|
;; Finished sending the total sectors to read
|
||||||
|
|
||||||
|
;; Send more bits of the LBA
|
||||||
|
mov eax, ebx ; Restore the backup LBA
|
||||||
|
mov dx, 0x1F3
|
||||||
|
out dx, al
|
||||||
|
;; Finished sending more bits of the LBA
|
||||||
|
|
||||||
|
;; Send more bits of the LBA
|
||||||
|
mov dx, 0x1F4
|
||||||
|
mov eax, ebx ; Restore the backup LBA
|
||||||
|
shr eax, 8
|
||||||
|
out dx, al
|
||||||
|
;; Finished sending more bits of the LBA
|
||||||
|
|
||||||
|
;; Send upper 16 bits of the LBA
|
||||||
|
mov dx, 0x1F5
|
||||||
|
mov eax, ebx ; Restore the backup LBA
|
||||||
|
shr eax, 16
|
||||||
|
out dx, al
|
||||||
|
;; Finished sending upper 16 bits of the LBA
|
||||||
|
|
||||||
|
mov dx, 0x1F7
|
||||||
|
mov al, 0x20
|
||||||
|
out dx, al
|
||||||
|
|
||||||
|
;; Read all sectors into memory
|
||||||
|
.next_sector:
|
||||||
|
push ecx
|
||||||
|
|
||||||
|
;; Checking if we need to read
|
||||||
|
.try_again:
|
||||||
|
mov dx, 0x1F7
|
||||||
|
in al, dx
|
||||||
|
test al, 8
|
||||||
|
jz .try_again
|
||||||
|
|
||||||
|
;; We need to read 256 words at a time
|
||||||
|
mov ecx, 256
|
||||||
|
mov dx, 0x1F0
|
||||||
|
rep insw
|
||||||
|
pop ecx
|
||||||
|
loop .next_sector
|
||||||
|
;; End of reading sectors into memory
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
times 510-($-$$) db 0
|
||||||
|
dw 0xAA55
|
0
build/.gitkeep
Normal file
0
build/.gitkeep
Normal file
0
build/boot/.gitkeep
Normal file
0
build/boot/.gitkeep
Normal file
0
build/drivers/.gitkeep
Normal file
0
build/drivers/.gitkeep
Normal file
0
build/drivers/vesa/.gitkeep
Normal file
0
build/drivers/vesa/.gitkeep
Normal file
0
build/drivers/vesa/fonts/.gitkeep
Normal file
0
build/drivers/vesa/fonts/.gitkeep
Normal file
0
build/idt/.gitkeep
Normal file
0
build/idt/.gitkeep
Normal file
0
build/io/.gitkeep
Normal file
0
build/io/.gitkeep
Normal file
0
build/mm/.gitkeep
Normal file
0
build/mm/.gitkeep
Normal file
0
build/string/.gitkeep
Normal file
0
build/string/.gitkeep
Normal file
8
compile_flags.txt
Normal file
8
compile_flags.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
-Wno-unused-function
|
||||||
|
-Wno-unused-label
|
||||||
|
-Wno-cpp
|
||||||
|
-Wno-unused-parameter
|
||||||
|
-nostdlib
|
||||||
|
-nodefaultlibs
|
||||||
|
-Wall
|
||||||
|
-I.
|
9
drivers/vesa/fonts/fonts.h
Normal file
9
drivers/vesa/fonts/fonts.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef __VESA_FONTS_H
|
||||||
|
#define __VESA_FONTS_H
|
||||||
|
|
||||||
|
#define FONT_VGA_WIDTH 12
|
||||||
|
#define FONT_VGA_HEIGHT 18
|
||||||
|
|
||||||
|
int font_vga (int index, int y);
|
||||||
|
|
||||||
|
#endif
|
2058
drivers/vesa/fonts/vga.c
Normal file
2058
drivers/vesa/fonts/vga.c
Normal file
File diff suppressed because it is too large
Load Diff
71
drivers/vesa/terminal.c
Normal file
71
drivers/vesa/terminal.c
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
#include "vesa.h"
|
||||||
|
|
||||||
|
#include "fonts/fonts.h"
|
||||||
|
|
||||||
|
#include <sys/kernel.h>
|
||||||
|
#include <sys/string/string.h>
|
||||||
|
|
||||||
|
#define TERMINAL_DEFAULT_FONT font_vga
|
||||||
|
|
||||||
|
u16 _row = 0;
|
||||||
|
u16 _col = 0;
|
||||||
|
|
||||||
|
static void
|
||||||
|
terminal_putchar (char c, u32 col)
|
||||||
|
{
|
||||||
|
if (c == '\n')
|
||||||
|
{
|
||||||
|
_row += 1;
|
||||||
|
_col = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vesa_putchar (TERMINAL_DEFAULT_FONT, FONT_VGA_WIDTH, FONT_VGA_HEIGHT, c,
|
||||||
|
_col * (FONT_VGA_WIDTH / 1.5), _row * FONT_VGA_HEIGHT, col);
|
||||||
|
|
||||||
|
_col += 1;
|
||||||
|
if (_col * (FONT_VGA_WIDTH / 1.5) >= vesa_get_width ())
|
||||||
|
{
|
||||||
|
_col = 0;
|
||||||
|
_row += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
terminal_print (const char *str)
|
||||||
|
{
|
||||||
|
int len = strlen (str);
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
terminal_putchar (str[i], vesa_make_colour (255, 255, 255));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
terminal_print_ext (const char *str, u32 col)
|
||||||
|
{
|
||||||
|
int len = strlen (str);
|
||||||
|
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
terminal_putchar (str[i], col);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is a function that will write "* PENDING `task'" to the screen
|
||||||
|
void
|
||||||
|
terminal_print_pending (const char *task)
|
||||||
|
{
|
||||||
|
terminal_print_ext ("\n*", vesa_make_colour (255, 105, 147));
|
||||||
|
terminal_print_ext (" PENDING ", vesa_make_colour (255, 20, 147));
|
||||||
|
terminal_print (task);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is a function that will write "* DONE `task'" to the screen
|
||||||
|
void
|
||||||
|
terminal_print_done (const char *task)
|
||||||
|
{
|
||||||
|
terminal_print_ext ("\n*", vesa_make_colour (0, 255, 0));
|
||||||
|
terminal_print_ext (" DONE ", vesa_make_colour (34, 139, 34));
|
||||||
|
terminal_print (task);
|
||||||
|
}
|
105
drivers/vesa/vesa.c
Normal file
105
drivers/vesa/vesa.c
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
#include "vesa.h"
|
||||||
|
|
||||||
|
struct vbe_info *info = (struct vbe_info *)VBE_INFO_ADDR;
|
||||||
|
|
||||||
|
u32
|
||||||
|
vesa_make_colour (u8 r, u8 g, u8 b)
|
||||||
|
{
|
||||||
|
return r << info->red_position | g << info->green_position
|
||||||
|
| b << info->blue_position;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vesa_putpixel (u16 x, u16 y, u32 col)
|
||||||
|
{
|
||||||
|
void *framebuffer = (void *)(unsigned long)info->framebuffer;
|
||||||
|
|
||||||
|
switch (info->bpp)
|
||||||
|
{
|
||||||
|
case 8:
|
||||||
|
{
|
||||||
|
u8 *pixel = framebuffer + info->pitch * y + x;
|
||||||
|
*pixel = col;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 15:
|
||||||
|
case 16:
|
||||||
|
{
|
||||||
|
u16 *pixel = framebuffer + info->pitch * y + 2 * x;
|
||||||
|
*pixel = col;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 24:
|
||||||
|
{
|
||||||
|
u32 *pixel = framebuffer + info->pitch * y + 3 * x;
|
||||||
|
*pixel = (col & 0xffffff) | (*pixel & 0xff000000);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 32:
|
||||||
|
{
|
||||||
|
u32 *pixel = framebuffer + info->pitch * y + 4 * x;
|
||||||
|
*pixel = col;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vesa_cls (u32 col)
|
||||||
|
{
|
||||||
|
for (u16 y = 0; y < info->height; y++)
|
||||||
|
{
|
||||||
|
for (u16 x = 0; x < info->width; x++)
|
||||||
|
{
|
||||||
|
vesa_putpixel (x, y, col);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vesa_draw_rect (u16 x, u16 y, u16 w, u16 h, u32 col)
|
||||||
|
{
|
||||||
|
for (u16 j = y; j < (y + h); j++)
|
||||||
|
{
|
||||||
|
for (u16 i = x; i < (x + w); i++)
|
||||||
|
{
|
||||||
|
vesa_putpixel (i, j, col);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
u16
|
||||||
|
vesa_get_width ()
|
||||||
|
{
|
||||||
|
return info->width;
|
||||||
|
}
|
||||||
|
|
||||||
|
u16
|
||||||
|
vesa_get_height ()
|
||||||
|
{
|
||||||
|
return info->height;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vesa_putchar (int (*font) (int, int), u8 font_width, u8 font_height, char c,
|
||||||
|
u16 x, u16 y, u32 col)
|
||||||
|
{
|
||||||
|
for (u8 j = 0; j < font_height; j++)
|
||||||
|
{
|
||||||
|
u32 row = (*font) ((i32)c, j);
|
||||||
|
i32 shift = font_width - 1;
|
||||||
|
i32 bit_val = 0;
|
||||||
|
|
||||||
|
for (u8 i = 0; i < font_width; i++)
|
||||||
|
{
|
||||||
|
bit_val = (row >> shift) & 1;
|
||||||
|
if (bit_val)
|
||||||
|
vesa_putpixel (x + i, y + j, col);
|
||||||
|
|
||||||
|
shift -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
66
drivers/vesa/vesa.h
Normal file
66
drivers/vesa/vesa.h
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#ifndef __VESA_H
|
||||||
|
#define __VESA_H
|
||||||
|
|
||||||
|
#include <sys/kernel.h>
|
||||||
|
|
||||||
|
#define VBE_INFO_ADDR 0x500
|
||||||
|
|
||||||
|
struct vbe_info
|
||||||
|
{
|
||||||
|
u16 attributes;
|
||||||
|
u8 window_a;
|
||||||
|
u8 window_b;
|
||||||
|
u16 granularity;
|
||||||
|
u16 window_size;
|
||||||
|
u16 segment_a;
|
||||||
|
u16 segment_b;
|
||||||
|
u32 win_func_ptr;
|
||||||
|
u16 pitch;
|
||||||
|
u16 width;
|
||||||
|
u16 height;
|
||||||
|
u8 w_char;
|
||||||
|
u8 y_char;
|
||||||
|
u8 planes;
|
||||||
|
u8 bpp;
|
||||||
|
u8 banks;
|
||||||
|
u8 memory_model;
|
||||||
|
u8 bank_size;
|
||||||
|
u8 image_pages;
|
||||||
|
u8 reserved0;
|
||||||
|
|
||||||
|
u8 red_mask;
|
||||||
|
u8 red_position;
|
||||||
|
u8 green_mask;
|
||||||
|
u8 green_position;
|
||||||
|
u8 blue_mask;
|
||||||
|
u8 blue_position;
|
||||||
|
u8 reserved_mask;
|
||||||
|
u8 reserved_position;
|
||||||
|
u8 direct_colour_attributes;
|
||||||
|
|
||||||
|
u32 framebuffer;
|
||||||
|
|
||||||
|
u32 off_screen_mem_off;
|
||||||
|
u16 off_screen_mem_size;
|
||||||
|
|
||||||
|
u8 reserved1[206];
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
u32 vesa_make_colour (u8 r, u8 g, u8 b);
|
||||||
|
void vesa_putpixel (u16 x, u16 y, u32 col);
|
||||||
|
void vesa_cls (u32 col);
|
||||||
|
void vesa_draw_rect (u16 x, u16 y, u16 w, u16 h, u32 col);
|
||||||
|
void vesa_putchar (int (*font) (int, int), u8 font_width, u8 font_height,
|
||||||
|
char c, u16 x, u16 y, u32 col);
|
||||||
|
|
||||||
|
// "terminal"
|
||||||
|
void terminal_print (const char *str);
|
||||||
|
void terminal_print_ext (const char *str, u32 col);
|
||||||
|
|
||||||
|
void terminal_print_pending (const char *task);
|
||||||
|
void terminal_print_done (const char *task);
|
||||||
|
|
||||||
|
u16 vesa_get_width ();
|
||||||
|
u16 vesa_get_height ();
|
||||||
|
|
||||||
|
#endif
|
31
linker.ld
Normal file
31
linker.ld
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
ENTRY (_start)
|
||||||
|
OUTPUT_FORMAT(binary)
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
. = 1M;
|
||||||
|
.text : ALIGN (4096)
|
||||||
|
{
|
||||||
|
*(.text)
|
||||||
|
}
|
||||||
|
|
||||||
|
.rodata : ALIGN (4096)
|
||||||
|
{
|
||||||
|
*(.rodata)
|
||||||
|
}
|
||||||
|
|
||||||
|
.data : ALIGN (4096)
|
||||||
|
{
|
||||||
|
*(.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
.bss : ALIGN (4096)
|
||||||
|
{
|
||||||
|
*(COMMON)
|
||||||
|
*(.bss)
|
||||||
|
}
|
||||||
|
|
||||||
|
.asm :
|
||||||
|
{
|
||||||
|
*(.asm)
|
||||||
|
}
|
||||||
|
}
|
9
sys/config.h
Normal file
9
sys/config.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef __CONFIG_H
|
||||||
|
#define __CONFIG_H
|
||||||
|
|
||||||
|
#define KERNEL_CODE_SELECTOR 0x08
|
||||||
|
#define KERNEL_DATA_SELECTOR 0x10
|
||||||
|
|
||||||
|
#define KINL_TOTAL_INTERRUPTS 512
|
||||||
|
|
||||||
|
#endif
|
13
sys/idt/idt.asm
Normal file
13
sys/idt/idt.asm
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
section .asm
|
||||||
|
|
||||||
|
global idt_load
|
||||||
|
|
||||||
|
idt_load:
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
|
||||||
|
mov ebx, [ebp + 8]
|
||||||
|
lidt [ebx]
|
||||||
|
|
||||||
|
pop ebp
|
||||||
|
ret
|
41
sys/idt/idt.c
Normal file
41
sys/idt/idt.c
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#include "idt.h"
|
||||||
|
#include <sys/config.h>
|
||||||
|
|
||||||
|
#include <sys/mm/mem.h>
|
||||||
|
|
||||||
|
#include <drivers/vesa/vesa.h>
|
||||||
|
|
||||||
|
struct idt_desc idt_descriptors[KINL_TOTAL_INTERRUPTS];
|
||||||
|
struct idtr_desc idtr_descriptor;
|
||||||
|
|
||||||
|
extern void idt_load (void *ptr);
|
||||||
|
|
||||||
|
void
|
||||||
|
idt_zero ()
|
||||||
|
{
|
||||||
|
terminal_print ("Divide by zero error\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
idt_set (int interrupt_no, void *address)
|
||||||
|
{
|
||||||
|
struct idt_desc *desc = &idt_descriptors[interrupt_no];
|
||||||
|
desc->offset_1 = (u32)address & 0x0000ffff;
|
||||||
|
desc->selector = KERNEL_CODE_SELECTOR;
|
||||||
|
desc->zero = 0x00;
|
||||||
|
desc->type_attribute = 0xee;
|
||||||
|
desc->offset_2 = (u32)address >> 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
idt_init ()
|
||||||
|
{
|
||||||
|
memset (idt_descriptors, 0, sizeof (idt_descriptors));
|
||||||
|
idtr_descriptor.limit = sizeof (idt_descriptors) - 1;
|
||||||
|
idtr_descriptor.base = (u32)idt_descriptors;
|
||||||
|
|
||||||
|
idt_set (0, idt_zero);
|
||||||
|
|
||||||
|
// Load the interrupt descriptor table
|
||||||
|
idt_load (&idtr_descriptor);
|
||||||
|
}
|
24
sys/idt/idt.h
Normal file
24
sys/idt/idt.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#ifndef __IDT_H
|
||||||
|
#define __IDT_H
|
||||||
|
|
||||||
|
#include <sys/kernel.h>
|
||||||
|
|
||||||
|
struct idt_desc
|
||||||
|
{
|
||||||
|
u16 offset_1; // Offset bits 0 - 16
|
||||||
|
u16 selector; // Selector that's in our GDT
|
||||||
|
u8 zero;
|
||||||
|
u8 type_attribute; // Descriptor type attribute
|
||||||
|
u16 offset_2; // Offset bits 16-31
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
struct idtr_desc
|
||||||
|
{
|
||||||
|
u16 limit; // Size of descriptor tabe
|
||||||
|
u32 base; // Base address of the start of the interrupt table
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
void idt_init ();
|
||||||
|
void idt_set (int interrupt_no, void *address);
|
||||||
|
|
||||||
|
#endif
|
51
sys/io/io.asm
Normal file
51
sys/io/io.asm
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
section .asm
|
||||||
|
|
||||||
|
global insb
|
||||||
|
global insw
|
||||||
|
|
||||||
|
global outb
|
||||||
|
global outw
|
||||||
|
|
||||||
|
insb:
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
|
||||||
|
xor eax, eax
|
||||||
|
mov edx, [ebp + 8]
|
||||||
|
in al, dx
|
||||||
|
|
||||||
|
pop ebp
|
||||||
|
ret
|
||||||
|
|
||||||
|
insw:
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
|
||||||
|
xor eax, eax
|
||||||
|
mov edx, [ebp + 8]
|
||||||
|
in ax, dx
|
||||||
|
|
||||||
|
pop ebp
|
||||||
|
ret
|
||||||
|
|
||||||
|
outb:
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
|
||||||
|
mov eax, [ebp + 12]
|
||||||
|
mov edx, [ebp + 8]
|
||||||
|
out dx, al
|
||||||
|
|
||||||
|
pop ebp
|
||||||
|
ret
|
||||||
|
|
||||||
|
outw:
|
||||||
|
push ebp
|
||||||
|
mov ebp, esp
|
||||||
|
|
||||||
|
mov eax, [ebp + 12]
|
||||||
|
mov edx, [ebp + 8]
|
||||||
|
out dx, ax
|
||||||
|
|
||||||
|
pop ebp
|
||||||
|
ret
|
12
sys/io/io.h
Normal file
12
sys/io/io.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#ifndef __IO_H
|
||||||
|
#define __IO_H
|
||||||
|
|
||||||
|
#include <sys/kernel.h>
|
||||||
|
|
||||||
|
u8 insb (u16 port);
|
||||||
|
u16 insw (u16 port);
|
||||||
|
|
||||||
|
void outb (u16 port, u8 val);
|
||||||
|
void outw (u16 port, u16 val);
|
||||||
|
|
||||||
|
#endif
|
29
sys/kernel.asm
Normal file
29
sys/kernel.asm
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
[BITS 32]
|
||||||
|
|
||||||
|
extern kmain
|
||||||
|
|
||||||
|
global _start
|
||||||
|
|
||||||
|
CODE_SEG equ 0x08
|
||||||
|
DATA_SEG equ 0x10
|
||||||
|
|
||||||
|
_start:
|
||||||
|
mov ax, DATA_SEG
|
||||||
|
mov ds, ax
|
||||||
|
mov es, ax
|
||||||
|
mov fs, ax
|
||||||
|
mov gs, ax
|
||||||
|
mov ss, ax
|
||||||
|
mov ebp, 0x00200000
|
||||||
|
mov esp, ebp
|
||||||
|
|
||||||
|
;; Enable A20 line
|
||||||
|
in al, 0x92
|
||||||
|
or al, 2
|
||||||
|
out 0x92, al
|
||||||
|
|
||||||
|
call kmain
|
||||||
|
|
||||||
|
jmp $
|
||||||
|
|
||||||
|
times 512-($-$$) db 0
|
17
sys/kernel.c
Normal file
17
sys/kernel.c
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#include <sys/kernel.h>
|
||||||
|
|
||||||
|
#include <drivers/vesa/vesa.h>
|
||||||
|
|
||||||
|
#include <sys/idt/idt.h>
|
||||||
|
#include <sys/io/io.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
kmain ()
|
||||||
|
{
|
||||||
|
terminal_print ("Welcome to the Kinl operating system!\n");
|
||||||
|
|
||||||
|
// Initialise the IDT
|
||||||
|
terminal_print_pending ("Initialise IDT");
|
||||||
|
idt_init ();
|
||||||
|
terminal_print_done ("Initialised IDT");
|
||||||
|
}
|
16
sys/kernel.h
Normal file
16
sys/kernel.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#ifndef __KERNEL_H
|
||||||
|
#define __KERNEL_H
|
||||||
|
|
||||||
|
typedef unsigned char u8;
|
||||||
|
typedef unsigned short u16;
|
||||||
|
typedef unsigned int u32;
|
||||||
|
typedef unsigned long long u64;
|
||||||
|
|
||||||
|
typedef char i8;
|
||||||
|
typedef short i16;
|
||||||
|
typedef int i32;
|
||||||
|
typedef long long i64;
|
||||||
|
|
||||||
|
void kmain ();
|
||||||
|
|
||||||
|
#endif
|
14
sys/mm/mem.c
Normal file
14
sys/mm/mem.c
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#include "mem.h"
|
||||||
|
|
||||||
|
void *
|
||||||
|
memset (void *ptr, int c, u32 size)
|
||||||
|
{
|
||||||
|
char *c_ptr = (char *)ptr;
|
||||||
|
|
||||||
|
for (u32 i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
c_ptr[i] = (char)c;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
8
sys/mm/mem.h
Normal file
8
sys/mm/mem.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef __MEM_H_
|
||||||
|
#define __MEM_H
|
||||||
|
|
||||||
|
#include <sys/kernel.h>
|
||||||
|
|
||||||
|
void *memset (void *ptr, int c, u32 size);
|
||||||
|
|
||||||
|
#endif
|
36
sys/string/string.c
Normal file
36
sys/string/string.c
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#include "string.h"
|
||||||
|
|
||||||
|
char
|
||||||
|
tolower (char s1)
|
||||||
|
{
|
||||||
|
if (s1 >= 65 && s1 <= 90)
|
||||||
|
s1 += 32;
|
||||||
|
|
||||||
|
return s1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
strlen (const char *str)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
while (*str != 0)
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
str += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
strnlen (const char *str, int max)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
for (int i = 0; i < max; i++)
|
||||||
|
{
|
||||||
|
if (str[i] == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
8
sys/string/string.h
Normal file
8
sys/string/string.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef __STRING_H
|
||||||
|
#define __STRING_H
|
||||||
|
|
||||||
|
char tolower (char s1);
|
||||||
|
int strlen (const char *str);
|
||||||
|
int strnlen (const char *str, int max);
|
||||||
|
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user