refactor: switch from NASM to FASM
This commit is contained in:
parent
32f1956ca2
commit
3fddd705f8
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
|
@ -11,7 +11,7 @@ jobs:
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install build-essential llvm lld nasm mtools
|
sudo apt-get install build-essential fasm mtools
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
make
|
make
|
||||||
|
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -23,3 +23,4 @@ a.out
|
||||||
*.old
|
*.old
|
||||||
/bx_enh_dbg.ini
|
/bx_enh_dbg.ini
|
||||||
bochsrc.bxrc
|
bochsrc.bxrc
|
||||||
|
/tmp
|
||||||
|
|
43
Makefile
43
Makefile
|
@ -1,31 +1,32 @@
|
||||||
.DEFAULT_GOAL := all
|
TOPDIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
|
||||||
TOPDIR := $(CURDIR)
|
SYSROOTDIR := $(TOPDIR)/sysroot
|
||||||
export TOPDIR
|
TOOLSDIR := $(TOPDIR)/tools
|
||||||
|
|
||||||
SUBDIR := thirdparty lib bin kernel
|
RM = echo
|
||||||
|
|
||||||
CLEANFILES += stupid.iso stupid.tar.gz
|
SUBDIRS := kernel lib bin
|
||||||
|
|
||||||
.PHONY: docs
|
TARGET = stupid.iso stupid.tar.gz
|
||||||
docs:
|
|
||||||
-mkdir -p docs/html
|
.PHONY: all
|
||||||
naturaldocs -p docs/config -img docs/img -xi tmp -i . -o HTML docs/html
|
all: $(TARGET)
|
||||||
cp docs/img/favicon.ico docs/html/
|
|
||||||
|
GOAL:=install
|
||||||
|
clean: GOAL:=clean
|
||||||
|
|
||||||
|
.PHONY: $(SUBDIRS)
|
||||||
|
$(SUBDIRS):
|
||||||
|
@echo "📁 $@"
|
||||||
|
DESTDIR=$(SYSROOTDIR) $(MAKE) -C $@ $(GOAL)
|
||||||
|
|
||||||
.PHONY: stupid.iso
|
.PHONY: stupid.iso
|
||||||
stupid.iso:
|
stupid.iso: $(SUBDIRS)
|
||||||
$(MAKE) all
|
|
||||||
DESTDIR=$(TOPDIR)/sysroot $(MAKE) install
|
|
||||||
$(TOPDIR)/tools/create-iso $@ sysroot
|
$(TOPDIR)/tools/create-iso $@ sysroot
|
||||||
|
|
||||||
.PHONY: stupid.tar.gz
|
.PHONY: stupid.tar.gz
|
||||||
stupid.tar.gz:
|
stupid.tar.gz: $(SUBDIRS)
|
||||||
$(MAKE) all
|
|
||||||
DESTDIR=$(TOPDIR)/sysroot $(MAKE) install
|
|
||||||
tar -czvf $@ sysroot
|
tar -czvf $@ sysroot
|
||||||
|
|
||||||
run: stupid.iso
|
.PHONY: clean
|
||||||
qemu-system-i386 -cdrom $< -serial stdio
|
clean: $(SUBDIRS)
|
||||||
|
$(RM) $(TARGET) $(SYSROOTDIR)
|
||||||
include $(TOPDIR)/share/mk/stupid.subdir.mk
|
|
||||||
include $(TOPDIR)/share/mk/stupid.clean.mk
|
|
12
bin/Makefile
12
bin/Makefile
|
@ -1,3 +1,11 @@
|
||||||
NOSUBDIR := 1
|
SUBDIRS = cmd
|
||||||
|
|
||||||
include $(TOPDIR)/share/mk/stupid.subdir.mk
|
TOPGOALS = all clean install
|
||||||
|
|
||||||
|
.PHONY: $(SUBDIRS)
|
||||||
|
$(SUBDIRS):
|
||||||
|
@echo "📁 bin/$@"
|
||||||
|
DESTDIR=$(DESTDIR)/bin $(MAKE) -C $@ $(MAKECMDGOALS)
|
||||||
|
|
||||||
|
.PHONY: $(TOPGOALS)
|
||||||
|
$(TOPGOALS): $(SUBDIRS)
|
||||||
|
|
5
bin/cmd/Makefile
Normal file
5
bin/cmd/Makefile
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
all:
|
||||||
|
|
||||||
|
clean:
|
||||||
|
|
||||||
|
install:
|
6
bin/cmd/builtins.inc
Normal file
6
bin/cmd/builtins.inc
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
builtins:
|
||||||
|
db 2, 'cd'
|
||||||
|
db 1, '.'
|
||||||
|
db 3, 'set'
|
||||||
|
db 5, 'unset'
|
||||||
|
db 4, 'exit'
|
8
bin/cmd/cmd.asm
Normal file
8
bin/cmd/cmd.asm
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
format ELF
|
||||||
|
entry start
|
||||||
|
|
||||||
|
include 'builtins.inc'
|
||||||
|
|
||||||
|
start:
|
||||||
|
|
||||||
|
int 0x2A
|
|
@ -9,10 +9,7 @@ Donate:
|
||||||
- <Liberapay at https://liberapay.com/d0p1/>
|
- <Liberapay at https://liberapay.com/d0p1/>
|
||||||
- <Github Sponsors at https://github.com/sponsors/d0p1s4m4>
|
- <Github Sponsors at https://github.com/sponsors/d0p1s4m4>
|
||||||
- Monero: 85cm3SuAs98dcqXcdiyCNz6hkb5fKwHbtJYr8cyFdAGWKgj8rG3kPENNv1BXVp2HsiaC8otTzxxaEEuUVZQFxrSr7eBY2uw
|
- Monero: 85cm3SuAs98dcqXcdiyCNz6hkb5fKwHbtJYr8cyFdAGWKgj8rG3kPENNv1BXVp2HsiaC8otTzxxaEEuUVZQFxrSr7eBY2uw
|
||||||
- Zcash: zs1sqsdn4acrqygvupmhwl5vvzcdjk6fd4p6n3k4nzdey0huq7cwkl2ca7dru8alhhtan47wjes0x9
|
|
||||||
- Bitcoin: bc1qhpxa0hgj0mjstttkjgg6ees9dj5kadty04kgpp
|
- Bitcoin: bc1qhpxa0hgj0mjstttkjgg6ees9dj5kadty04kgpp
|
||||||
- Oxen: LDrNKN6iXh98zUZbwa9iGmeuiWbrzU2WTKWwcwMYFSeCj2QACxfyFXNVQyN8QBe61bFgqtykTYpgcaWvf2C1K77KMQ82DaC
|
|
||||||
- Gridcoin: S8tw8EWXQ6p529kLEniCePceNAFTyc3GKM
|
|
||||||
|
|
||||||
About: License
|
About: License
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,27 @@
|
||||||
|
AS = fasm
|
||||||
|
RM = rm -f
|
||||||
|
INSTALL = install
|
||||||
|
|
||||||
KERNEL = vmstupid
|
KERNEL = vmstupid
|
||||||
|
SRCS = kernel.asm \
|
||||||
|
const.inc \
|
||||||
|
boot/multiboot.inc \
|
||||||
|
boot/boot.inc \
|
||||||
|
mm/mm.inc
|
||||||
|
|
||||||
SRCS = boot/head.s \
|
.PHONY: all
|
||||||
boot/gdt.s \
|
all: $(KERNEL)
|
||||||
boot/idt.s \
|
|
||||||
boot/isr.s \
|
|
||||||
boot/tss.s \
|
|
||||||
kernel.s \
|
|
||||||
lib/log.s dev/at/serial.s \
|
|
||||||
i18n/msg_en.s
|
|
||||||
INCS = sys/multiboot.inc \
|
|
||||||
sys/i386/cpuid.inc \
|
|
||||||
sys/i386/mmu.inc \
|
|
||||||
sys/i386/registers.inc
|
|
||||||
|
|
||||||
include $(TOPDIR)/share/mk/stupid.kernel.mk
|
$(KERNEL): $(SRCS)
|
||||||
#include $(TOPDIR)/share/mk/stupid.inc.mk
|
$(AS) kernel.asm $@
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
$(RM) $(KERNEL)
|
||||||
|
|
||||||
|
.PHONY: install
|
||||||
|
install: $(KERNEL)
|
||||||
|
@ mkdir -p $(DESTDIR)
|
||||||
|
install $< $(DESTDIR)
|
||||||
|
|
||||||
|
.PHONY: all clean
|
|
@ -1,4 +0,0 @@
|
||||||
struc console
|
|
||||||
.init:
|
|
||||||
|
|
||||||
endstruc
|
|
35
kernel/boot/boot.inc
Normal file
35
kernel/boot/boot.inc
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
ORG 0x100000
|
||||||
|
ALIGN 4
|
||||||
|
USE32
|
||||||
|
|
||||||
|
INCLUDE 'boot/multiboot.inc'
|
||||||
|
INCLUDE 'const.inc'
|
||||||
|
|
||||||
|
mb_header MultibootHeader MB_FLAGS, mb_header, VIDEO_WIDTH, VIDEO_HEIGHT, VIDEO_DEPTH
|
||||||
|
|
||||||
|
_start:
|
||||||
|
cli
|
||||||
|
cmp eax, MULTIBOOT_MAGIC
|
||||||
|
jne hang
|
||||||
|
|
||||||
|
; iterate over memory
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
|
;
|
||||||
|
xor esi, esi
|
||||||
|
mov edi, kernel_page_table - KBASE
|
||||||
|
|
||||||
|
mov ecx, kernel_page_directory - KBASE
|
||||||
|
mov cr3, ecx
|
||||||
|
|
||||||
|
mov ecx, cr0
|
||||||
|
|
||||||
|
|
||||||
|
hang:
|
||||||
|
hlt
|
||||||
|
jmp $-1
|
||||||
|
|
||||||
|
; SEGMENT readable writable
|
||||||
|
|
||||||
|
boot_struct dd 0x0
|
|
@ -1,94 +0,0 @@
|
||||||
;; File: gdt.s
|
|
||||||
;;
|
|
||||||
[BITS 32]
|
|
||||||
|
|
||||||
%include "sys/i386/mmu.inc"
|
|
||||||
|
|
||||||
section .text
|
|
||||||
|
|
||||||
; Function: gdt_setup
|
|
||||||
;
|
|
||||||
; in:
|
|
||||||
; none
|
|
||||||
;
|
|
||||||
; out:
|
|
||||||
; none
|
|
||||||
;
|
|
||||||
global gdt_setup
|
|
||||||
gdt_setup:
|
|
||||||
;; install tss
|
|
||||||
lea eax, gdt_entries.tss
|
|
||||||
push eax
|
|
||||||
extern tss_install
|
|
||||||
call tss_install
|
|
||||||
pop eax
|
|
||||||
|
|
||||||
;; setup gdt
|
|
||||||
lgdt [gdt_ptr]
|
|
||||||
mov eax, cr0
|
|
||||||
or al, 1
|
|
||||||
mov cr0, eax
|
|
||||||
jmp 0x08:.flush_cs
|
|
||||||
.flush_cs:
|
|
||||||
mov ax, 0x10 ; data segment
|
|
||||||
mov ds, ax
|
|
||||||
mov es, ax
|
|
||||||
mov fs, ax
|
|
||||||
mov gs, ax
|
|
||||||
mov ss, ax
|
|
||||||
ret
|
|
||||||
|
|
||||||
section .data
|
|
||||||
|
|
||||||
gdt_ptr:
|
|
||||||
dw gdt_entries.end - gdt_entries - 1
|
|
||||||
dd gdt_entries
|
|
||||||
|
|
||||||
gdt_entries:
|
|
||||||
;; null descriptor
|
|
||||||
dd 0x0
|
|
||||||
dd 0x0
|
|
||||||
|
|
||||||
;; kernel mode code segment
|
|
||||||
istruc gdt_entry
|
|
||||||
at gdt_entry.limit_low, dw 0xFFFF
|
|
||||||
at gdt_entry.base_low, dw 0x0000
|
|
||||||
at gdt_entry.base_mid, db 0x00
|
|
||||||
at gdt_entry.access, db 0x9A
|
|
||||||
at gdt_entry.flags, db 0xCF
|
|
||||||
at gdt_entry.base_high, db 0x00
|
|
||||||
iend
|
|
||||||
|
|
||||||
;; kernel mode data segment
|
|
||||||
istruc gdt_entry
|
|
||||||
at gdt_entry.limit_low, dw 0xFFFF
|
|
||||||
at gdt_entry.base_low, dw 0x0000
|
|
||||||
at gdt_entry.base_mid, db 0x00
|
|
||||||
at gdt_entry.access, db 0x92
|
|
||||||
at gdt_entry.flags, db 0xCF
|
|
||||||
at gdt_entry.base_high, db 0x00
|
|
||||||
iend
|
|
||||||
|
|
||||||
;; user mode code segment
|
|
||||||
istruc gdt_entry
|
|
||||||
at gdt_entry.limit_low, dw 0xFFFF
|
|
||||||
at gdt_entry.base_low, dw 0x0000
|
|
||||||
at gdt_entry.base_mid, db 0x00
|
|
||||||
at gdt_entry.access, db 0xFA
|
|
||||||
at gdt_entry.flags, db 0xCF
|
|
||||||
at gdt_entry.base_high, db 0x00
|
|
||||||
iend
|
|
||||||
|
|
||||||
;; user mode data segment
|
|
||||||
istruc gdt_entry
|
|
||||||
at gdt_entry.limit_low, dw 0xFFFF
|
|
||||||
at gdt_entry.base_low, dw 0x0000
|
|
||||||
at gdt_entry.base_mid, db 0x00
|
|
||||||
at gdt_entry.access, db 0xF2
|
|
||||||
at gdt_entry.flags, db 0xCF
|
|
||||||
at gdt_entry.base_high, db 0x00
|
|
||||||
iend
|
|
||||||
|
|
||||||
.tss:
|
|
||||||
times gdt_entry_size db 0
|
|
||||||
.end:
|
|
|
@ -1,125 +0,0 @@
|
||||||
;; File: head.s
|
|
||||||
;;
|
|
||||||
;; About: CPU compatibility
|
|
||||||
;; /!\ Only work on *486+* for now.
|
|
||||||
;; - `invlpg` which is not part of 386 ISA.
|
|
||||||
;;
|
|
||||||
[BITS 32]
|
|
||||||
|
|
||||||
%include "sys/multiboot.inc"
|
|
||||||
%include "sys/i386/registers.inc"
|
|
||||||
%include "sys/i386/mmu.inc"
|
|
||||||
|
|
||||||
;; Define: MB_HDR_FLAGS
|
|
||||||
MB_HDR_FLAGS equ MB_HDR_ALIGN | MB_HDR_MEMINFO | MB_HDR_VIDEO
|
|
||||||
|
|
||||||
section .multiboot.data
|
|
||||||
align 4
|
|
||||||
istruc mb_header
|
|
||||||
at mb_header.magic, dd MB_HDR_MAGIC
|
|
||||||
at mb_header.flags, dd MB_HDR_FLAGS
|
|
||||||
at mb_header.checksum, dd -(MB_HDR_MAGIC + MB_HDR_FLAGS)
|
|
||||||
|
|
||||||
; video mode info
|
|
||||||
at mb_header.mode_type, dd 0
|
|
||||||
at mb_header.width, dd 1024
|
|
||||||
at mb_header.height, dd 768
|
|
||||||
at mb_header.depth, dd 32
|
|
||||||
iend
|
|
||||||
|
|
||||||
section .multiboot.text
|
|
||||||
|
|
||||||
;; Function: entry
|
|
||||||
;; Setup boot page table, map kernel to higher half
|
|
||||||
;; then jump to <entry_high>
|
|
||||||
;;
|
|
||||||
;; in:
|
|
||||||
;; EAX - Multiboot magic
|
|
||||||
;; EBX - Multiboot structure
|
|
||||||
;;
|
|
||||||
;; out:
|
|
||||||
;; none
|
|
||||||
;;
|
|
||||||
global entry
|
|
||||||
entry:
|
|
||||||
;; disable interrupt
|
|
||||||
cli
|
|
||||||
|
|
||||||
;; save boot params
|
|
||||||
mov edi, eax
|
|
||||||
mov esi, ebx
|
|
||||||
|
|
||||||
;; setup 4MB paging
|
|
||||||
;; TODO: check if 4MB paging is available
|
|
||||||
mov eax, cr4
|
|
||||||
or eax, CR4_PSE
|
|
||||||
mov cr4, eax
|
|
||||||
|
|
||||||
cmp edi, MB_MAGIC
|
|
||||||
jne .skip_map_multiboot
|
|
||||||
;; check if multiboot struct is in first 4Mib
|
|
||||||
;; otherwith add entry in page dir
|
|
||||||
mov eax, 400000
|
|
||||||
cmp ebx, eax
|
|
||||||
jg .map_multiboot
|
|
||||||
jmp .skip_map_multiboot
|
|
||||||
.map_multiboot:
|
|
||||||
;; TODO: for now let's assume data are bellow 4Mib
|
|
||||||
jmp .end
|
|
||||||
.skip_map_multiboot:
|
|
||||||
add esi, KERNBASE
|
|
||||||
.end:
|
|
||||||
extern page_directory
|
|
||||||
mov eax, V2P(boot_page_dir)
|
|
||||||
mov cr3, eax
|
|
||||||
|
|
||||||
;; enable paging
|
|
||||||
mov eax, cr0
|
|
||||||
or eax, CR0_PG | CR0_PE | CR0_WP
|
|
||||||
mov cr0, eax
|
|
||||||
|
|
||||||
;; Jump to higher half
|
|
||||||
lea eax, entry_high
|
|
||||||
jmp eax ; near jump, indirect
|
|
||||||
|
|
||||||
section .text
|
|
||||||
|
|
||||||
;; Function: entry_high
|
|
||||||
;; Invalidate page[0], setup stack then call <kmain>
|
|
||||||
entry_high:
|
|
||||||
;; unmap first 4MiB, since it's not needed anymore
|
|
||||||
mov dword [boot_page_dir], 0
|
|
||||||
invlpg [0]
|
|
||||||
|
|
||||||
;; Setup stack
|
|
||||||
extern stack_top
|
|
||||||
mov esp, stack_top
|
|
||||||
xor ebp, ebp
|
|
||||||
|
|
||||||
;; Setup GDT: we "disable" segmentation
|
|
||||||
extern gdt_setup
|
|
||||||
call gdt_setup
|
|
||||||
|
|
||||||
extern tss_flush
|
|
||||||
call tss_flush
|
|
||||||
|
|
||||||
extern idt_setup
|
|
||||||
call idt_setup
|
|
||||||
|
|
||||||
push esi ; multiboot struct
|
|
||||||
push edi ; multiboot magic
|
|
||||||
extern kmain
|
|
||||||
call kmain
|
|
||||||
|
|
||||||
cli
|
|
||||||
hang:
|
|
||||||
hlt
|
|
||||||
jmp hang
|
|
||||||
|
|
||||||
section .data
|
|
||||||
align 0x1000
|
|
||||||
boot_page_dir:
|
|
||||||
dd 0 | PDE_P | PDE_W | PDE_PS
|
|
||||||
times (P2PDE(KERNBASE) - 1) dd 0
|
|
||||||
dd 0 | PDE_P | PDE_W | PDE_PS
|
|
||||||
times 0x400 - (boot_page_dir - $$) dd 0
|
|
|
@ -1,57 +0,0 @@
|
||||||
;; File: idt.s
|
|
||||||
;;
|
|
||||||
[BITS 32]
|
|
||||||
|
|
||||||
%include "sys/i386/cpu.inc"
|
|
||||||
|
|
||||||
section .text
|
|
||||||
|
|
||||||
idt_set_table:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
|
|
||||||
mov ecx, [ebp + 8]
|
|
||||||
|
|
||||||
extern isr_list
|
|
||||||
mov eax, [isr_list + (ecx * 4)]
|
|
||||||
|
|
||||||
; offset (low)
|
|
||||||
mov word [idt_entries + (ecx * 8)], ax
|
|
||||||
; segment selector (kernel code)
|
|
||||||
mov word [idt_entries + (ecx * 8) + idt_gate.selector], 0x08
|
|
||||||
; zero (skip)
|
|
||||||
; attr: 1 (Present) 00 (DPL) 0 1 (D: 32bits) 110
|
|
||||||
mov byte [idt_entries + (ecx * 8) + idt_gate.attributes], 0x8E
|
|
||||||
|
|
||||||
; offset (high)
|
|
||||||
shr eax, 16
|
|
||||||
mov word [idt_entries + (ecx * 8) + idt_gate.offset_high], ax
|
|
||||||
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
global idt_setup
|
|
||||||
idt_setup:
|
|
||||||
%assign i 0
|
|
||||||
%rep 32
|
|
||||||
push dword i
|
|
||||||
call idt_set_table
|
|
||||||
add esp, 4
|
|
||||||
%assign i i+1
|
|
||||||
%endrep
|
|
||||||
|
|
||||||
lidt [idt_ptr]
|
|
||||||
sti
|
|
||||||
ret
|
|
||||||
|
|
||||||
section .data
|
|
||||||
align 8
|
|
||||||
idt_ptr:
|
|
||||||
dw idt_entries.end-idt_entries-1
|
|
||||||
dd idt_entries
|
|
||||||
|
|
||||||
; variable: idt_entries
|
|
||||||
align 8
|
|
||||||
idt_entries:
|
|
||||||
times 256 dd 0x00000000, 0x00000000
|
|
||||||
.end:
|
|
|
@ -1,124 +0,0 @@
|
||||||
[BITS 32]
|
|
||||||
|
|
||||||
%include "sys/i386/cpu.inc"
|
|
||||||
%include "base.inc"
|
|
||||||
|
|
||||||
%macro ISR_NO_ERR 1
|
|
||||||
isr%1:
|
|
||||||
push dword 0
|
|
||||||
push dword %1
|
|
||||||
jmp isr_common
|
|
||||||
%endmacro
|
|
||||||
|
|
||||||
%macro ISR_ERR 1
|
|
||||||
isr%1:
|
|
||||||
push dword %1
|
|
||||||
jmp isr_common
|
|
||||||
%endmacro
|
|
||||||
|
|
||||||
%macro ISR_ADDR 1
|
|
||||||
dd isr%1
|
|
||||||
%endmacro
|
|
||||||
|
|
||||||
section .text
|
|
||||||
|
|
||||||
ISR_NO_ERR 0
|
|
||||||
ISR_NO_ERR 1
|
|
||||||
ISR_NO_ERR 2
|
|
||||||
ISR_NO_ERR 3
|
|
||||||
ISR_NO_ERR 4
|
|
||||||
ISR_NO_ERR 5
|
|
||||||
ISR_NO_ERR 6
|
|
||||||
ISR_NO_ERR 7
|
|
||||||
ISR_ERR 8
|
|
||||||
ISR_NO_ERR 9
|
|
||||||
ISR_ERR 10
|
|
||||||
ISR_ERR 11
|
|
||||||
ISR_ERR 12
|
|
||||||
ISR_ERR 13
|
|
||||||
ISR_ERR 14
|
|
||||||
ISR_NO_ERR 15
|
|
||||||
ISR_NO_ERR 16
|
|
||||||
ISR_NO_ERR 17
|
|
||||||
ISR_NO_ERR 18
|
|
||||||
ISR_NO_ERR 19
|
|
||||||
ISR_NO_ERR 20
|
|
||||||
ISR_NO_ERR 21
|
|
||||||
ISR_NO_ERR 22
|
|
||||||
ISR_NO_ERR 23
|
|
||||||
ISR_NO_ERR 24
|
|
||||||
ISR_NO_ERR 25
|
|
||||||
ISR_NO_ERR 26
|
|
||||||
ISR_NO_ERR 27
|
|
||||||
ISR_NO_ERR 28
|
|
||||||
ISR_NO_ERR 29
|
|
||||||
ISR_NO_ERR 30
|
|
||||||
ISR_NO_ERR 31
|
|
||||||
|
|
||||||
%assign i 32
|
|
||||||
%rep 224
|
|
||||||
ISR_NO_ERR i
|
|
||||||
%assign i i+1
|
|
||||||
%endrep
|
|
||||||
|
|
||||||
panic:
|
|
||||||
LOG msg_interrupt
|
|
||||||
;htl
|
|
||||||
;jmp panic
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
isr_handler:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
|
|
||||||
.end:
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
isr_common:
|
|
||||||
xchg bx, bx
|
|
||||||
push ds
|
|
||||||
push es
|
|
||||||
push fs
|
|
||||||
push gs
|
|
||||||
pusha
|
|
||||||
|
|
||||||
mov ax, 0x10 ; data segment
|
|
||||||
mov ds, ax
|
|
||||||
mov es, ax
|
|
||||||
mov fs, ax
|
|
||||||
mov gs, ax
|
|
||||||
|
|
||||||
LOG msg_interrupt
|
|
||||||
;call isr_handler
|
|
||||||
;extern pic_eoi
|
|
||||||
;call pic_eoi
|
|
||||||
|
|
||||||
popa
|
|
||||||
pop gs
|
|
||||||
pop fs
|
|
||||||
pop es
|
|
||||||
pop ds
|
|
||||||
add esp, 8 ; int no & error code
|
|
||||||
|
|
||||||
iret
|
|
||||||
|
|
||||||
section .data
|
|
||||||
global isr_list
|
|
||||||
isr_list:
|
|
||||||
%assign i 0
|
|
||||||
%rep 256
|
|
||||||
ISR_ADDR i
|
|
||||||
%assign i i+1
|
|
||||||
%endrep
|
|
||||||
|
|
||||||
section .rodata
|
|
||||||
|
|
||||||
msg_interrupt db "interrupt", 0xA
|
|
||||||
db "edi: %x esi: %x ebp: %x esp: %x", 0xA
|
|
||||||
db "ebx: %x edx: %x ecx: %x eax: %x", 0xA
|
|
||||||
db "gs: %x fs: %x es: %x ds: %x", 0xA
|
|
||||||
db "int: %x err: %x eip: %x cs: %x", 0xA
|
|
||||||
db "flg: %x usp: %x ss: %x", 0x0
|
|
||||||
file db __FILE__, 0
|
|
|
@ -1,25 +0,0 @@
|
||||||
extern kernel_start
|
|
||||||
extern kernel_end
|
|
||||||
extern kernel_size
|
|
||||||
|
|
||||||
pmm_check_page_free:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
|
|
||||||
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
pmm_setup_from_multiboot_mmap:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
push edi
|
|
||||||
push esi
|
|
||||||
push ebx
|
|
||||||
|
|
||||||
mov eax, [esi + mb_info.mmap_addr]
|
|
||||||
pop ebx
|
|
||||||
pop esi
|
|
||||||
pop edi
|
|
||||||
leave
|
|
||||||
ret
|
|
106
kernel/boot/multiboot.inc
Normal file
106
kernel/boot/multiboot.inc
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
MULTIBOOT_HDR_MAGIC = 0x1BADB002
|
||||||
|
MULTIBOOT_MAGIC = 0x2BADB002
|
||||||
|
|
||||||
|
MULTIBOOT_HDR_ALIGN = 0x1
|
||||||
|
MULTIBOOT_HDR_MEMINFO = 0x2
|
||||||
|
MULTIBOOT_HDR_VIDEO = 0x4
|
||||||
|
|
||||||
|
struc MultibootHeader flags,addr,width,height,depth
|
||||||
|
{
|
||||||
|
.magic dd MULTIBOOT_HDR_MAGIC
|
||||||
|
.flags dd flags
|
||||||
|
.checksum dd -(MULTIBOOT_HDR_MAGIC + flags)
|
||||||
|
|
||||||
|
; address fields (we'll just skip them)
|
||||||
|
.header_addr dd addr
|
||||||
|
.load_addr dd 0x100000
|
||||||
|
.load_end_addr dd _edata - KBASE
|
||||||
|
.bss_end_addr dd _end - KBASE
|
||||||
|
.entry_addr dd _start
|
||||||
|
|
||||||
|
; Video mode
|
||||||
|
.mode_type dd 0x0
|
||||||
|
.width dd width
|
||||||
|
.height dd height
|
||||||
|
.depth dd depth
|
||||||
|
}
|
||||||
|
|
||||||
|
struc MultibootData
|
||||||
|
{
|
||||||
|
.flags dd ?
|
||||||
|
|
||||||
|
; if flags[0] is set
|
||||||
|
.mem_lower dd ?
|
||||||
|
.mem_upper dd ?
|
||||||
|
|
||||||
|
; if flags[1] is set
|
||||||
|
.boot_device dd ?
|
||||||
|
|
||||||
|
; if flags[2] is set
|
||||||
|
.cmdline dd ?
|
||||||
|
|
||||||
|
; if flags[3] is set
|
||||||
|
.mods_count dd ?
|
||||||
|
.mods_addr dd ?
|
||||||
|
|
||||||
|
; if flags[4] is set
|
||||||
|
.syms dd 4 dup ?
|
||||||
|
|
||||||
|
; if flags[6] is set
|
||||||
|
.mmap_length dd ?
|
||||||
|
.mmap_addr dd ?
|
||||||
|
|
||||||
|
; if flags[7] is set
|
||||||
|
.drives_length dd ?
|
||||||
|
.drives_addr dd ?
|
||||||
|
|
||||||
|
; if flags[8] is set
|
||||||
|
.config_table dd ?
|
||||||
|
|
||||||
|
; if flags[9] is set
|
||||||
|
.bootloader_name dd ?
|
||||||
|
|
||||||
|
; if flags[10] is set
|
||||||
|
.apm_table dd ?
|
||||||
|
|
||||||
|
; if flags[11] is set
|
||||||
|
.vbe_control_info dd ?
|
||||||
|
.vbe_mode_info dd ?
|
||||||
|
.vbe_mode dw ?
|
||||||
|
.vbe_if_seg dw ?
|
||||||
|
.vbe_if_off dw ?
|
||||||
|
.vbe_if_length dw ?
|
||||||
|
|
||||||
|
; if flags[12] is set
|
||||||
|
.fb_addr dq ?
|
||||||
|
.fb_pitch dd ?
|
||||||
|
.fb_width dd ?
|
||||||
|
.fb_height dd ?
|
||||||
|
.fb_bpp db ?
|
||||||
|
.fb_type db ?
|
||||||
|
.fb_misc dw 3 dup ?
|
||||||
|
}
|
||||||
|
|
||||||
|
MULTIBOOT_DATA_MEM = 0x0001
|
||||||
|
MULTIBOOT_DATA_BOOTDEV = 0x0002
|
||||||
|
MULTIBOOT_DATA_CMDLINE = 0x0004
|
||||||
|
MULTIBOOT_DATA_MODULES = 0x0008
|
||||||
|
MULTIBOOT_DATA_MMAP = 0x0040
|
||||||
|
MULTIBOOT_DATA_DRIVES = 0x0080
|
||||||
|
MULTIBOOT_DATA_BOOTLOADER_NAME = 0x0200
|
||||||
|
MULTIBOOT_DATA_VBE = 0x0800
|
||||||
|
MULTIBOOT_DATA_FB = 0x1000
|
||||||
|
|
||||||
|
struc MultibootMMap
|
||||||
|
{
|
||||||
|
.size dd ?
|
||||||
|
.addr dq ?
|
||||||
|
.length dq ?
|
||||||
|
.type dd ?
|
||||||
|
}
|
||||||
|
|
||||||
|
MULTIBOOT_MEMORY_AVAILABLE = 0x1
|
||||||
|
MULTIBOOT_MEMORY_RESERVED = 0x2
|
||||||
|
MULTIBOOT_MEMORY_ACPI = 0x3
|
||||||
|
MULTIBOOT_MEMORY_NVS = 0x4
|
||||||
|
MULTIBOOT_MEMORY_BADPARAM = 0x5
|
|
@ -1,44 +0,0 @@
|
||||||
%include "sys/i386/mmu.inc"
|
|
||||||
%include "sys/i386/task.inc"
|
|
||||||
|
|
||||||
section .text
|
|
||||||
global tss_install
|
|
||||||
tss_install:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
push esi
|
|
||||||
mov esi, [ebp + 8]
|
|
||||||
|
|
||||||
mov eax, tss_size
|
|
||||||
lea ebx, tss_entry
|
|
||||||
mov [esi + gdt_entry.limit_low], ax
|
|
||||||
mov [esi + gdt_entry.base_low], bx
|
|
||||||
shr eax, 16
|
|
||||||
mov [esi + gdt_entry.base_mid], al
|
|
||||||
|
|
||||||
mov al, 0x9 | (1 << 7)
|
|
||||||
mov [esi + gdt_entry.access], al
|
|
||||||
|
|
||||||
shr ebx, 16
|
|
||||||
and bl, 0xF
|
|
||||||
mov [esi + gdt_entry.flags], bl
|
|
||||||
|
|
||||||
mov [esi + gdt_entry.base_high], ah
|
|
||||||
|
|
||||||
mov dword [tss_entry + tss.ss0], 0x10
|
|
||||||
extern stack_top
|
|
||||||
mov dword [tss_entry + tss.esp0], stack_top
|
|
||||||
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
global tss_flush
|
|
||||||
tss_flush:
|
|
||||||
mov ax, (5 * 8) | 0
|
|
||||||
ltr ax
|
|
||||||
ret
|
|
||||||
|
|
||||||
section .data
|
|
||||||
|
|
||||||
tss_entry:
|
|
||||||
times tss_size db 0
|
|
53
kernel/const.inc
Normal file
53
kernel/const.inc
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
KBASE = 0xC0000000
|
||||||
|
PSIZE = 0x1000
|
||||||
|
|
||||||
|
; --------- VERSION -------------
|
||||||
|
VERSION_MAJOR = 1
|
||||||
|
VERSION_MINOR = 0
|
||||||
|
|
||||||
|
|
||||||
|
; --------- BOOT PARAMS ---------
|
||||||
|
MB_FLAGS = MULTIBOOT_HDR_ALIGN or MULTIBOOT_HDR_MEMINFO or MULTIBOOT_HDR_VIDEO
|
||||||
|
VIDEO_WIDTH = 1024
|
||||||
|
VIDEO_HEIGHT = 768
|
||||||
|
VIDEO_DEPTH = 32
|
||||||
|
|
||||||
|
; --------- Registers ------------
|
||||||
|
CR0_PE = 0x00000001
|
||||||
|
CR0_MP = 0x00000002
|
||||||
|
CR0_EM = 0x00000004
|
||||||
|
CR0_TS = 0x00000008
|
||||||
|
CR0_ET = 0x00000010
|
||||||
|
CR0_NE = 0x00000020
|
||||||
|
CR0_WP = 0x00010000
|
||||||
|
CR0_AM = 0x00040000
|
||||||
|
CR0_NW = 0x20000000
|
||||||
|
CR0_CD = 0x40000000
|
||||||
|
CR0_PG = 0x80000000
|
||||||
|
|
||||||
|
CR3_PWT = 0x08
|
||||||
|
CR3_PCD = 0x10
|
||||||
|
|
||||||
|
CR4_VME = 0x0000001
|
||||||
|
CR4_PVI = 0x0000002
|
||||||
|
CR4_TSD = 0x0000004
|
||||||
|
CR4_DE = 0x0000008
|
||||||
|
CR4_PSE = 0x0000010
|
||||||
|
CR4_PAE = 0x0000020
|
||||||
|
CR4_MCE = 0x0000040
|
||||||
|
CR4_PGE = 0x0000080
|
||||||
|
CR4_PCE = 0x0000100
|
||||||
|
CR4_OSDXSR = 0x0000200
|
||||||
|
CR4_OSXMMEXCPT = 0x0000400
|
||||||
|
CR4_UMIP = 0x0000800
|
||||||
|
CR4_VMXE = 0x0002000
|
||||||
|
CR4_SMXE = 0x0004000
|
||||||
|
CR4_FSGSBASE = 0x0010000
|
||||||
|
CR4_PCIDE = 0x0020000
|
||||||
|
CR4_OSXSAVE = 0x0040000
|
||||||
|
CR4_SMEP = 0x0100000
|
||||||
|
CR4_SMAP = 0x0200000
|
||||||
|
CR4_PKE = 0x0400000
|
||||||
|
CR4_CET = 0x0800000
|
||||||
|
CR4_PKS = 0x1000000
|
||||||
|
|
|
@ -1,72 +0,0 @@
|
||||||
;; File: cmos.s
|
|
||||||
;; Real/Time Clock/CMOS RAM
|
|
||||||
;;
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x00 - 0x0D | *Real-time clock information |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x0E | *Diagnostic status byte |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x0F | *Shutdown status byte |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x10 | Diskette drive type byte |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x12 | Fixed disk type byte |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x14 | Equipment byte |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x15 | Low base memory byte |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x16 | High base memory byte |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x17 | Low expansion memory byte |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x18 | High expansion memory byte |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x19 | Disk C extended byte |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x1A | Disk D extended byte |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x2E - 0x2F | CMOS checksum |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x30 | *Low expansion memory byte |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x31 | *High expansion memory byte |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x32 | *Date century byte |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
;; > | 0x33 | *Flags |
|
|
||||||
;; > +-------------+------------------------------+
|
|
||||||
|
|
||||||
CMOS_RTC equ 0x00
|
|
||||||
|
|
||||||
RTC_SECONDS equ 0x00
|
|
||||||
RTC_SECOND_ALRM equ 0x01
|
|
||||||
RTC_MINUTES equ 0x02
|
|
||||||
RTC_MINUTE_ALRM equ 0x03
|
|
||||||
RTC_HOURS equ 0x04
|
|
||||||
RTC_HOUR_ALRM equ 0x05
|
|
||||||
RTC_WEEKDAY equ 0x06
|
|
||||||
RTC_DATE_OF_MONTH equ 0x07
|
|
||||||
RTC_MONTH equ 0x08
|
|
||||||
RTC_YEAR equ 0x09
|
|
||||||
RTC_STATUS_REGA equ 0x0A
|
|
||||||
RTC_STATUS_REGB equ 0x0B
|
|
||||||
RTC_STATUS_REGC equ 0x0C
|
|
||||||
RTC_STATUS_REGD equ 0x0D
|
|
||||||
|
|
||||||
STATUS_REGA_UIP equ (1 << 7)
|
|
||||||
|
|
||||||
STATUS_REGB_PIE equ (1 << 6)
|
|
||||||
STATUS_REGB_AIE equ (1 << 5)
|
|
||||||
STATUS_REGB_UIE equ (1 << 4)
|
|
||||||
STATUS_REGB_SQWE equ (1 << 3)
|
|
||||||
STATUS_REGB_DM equ (1 << 2)
|
|
||||||
STATUS_REGB_24H equ (1 << 1)
|
|
||||||
STATUS_REGB_DSE equ (1 << 0)
|
|
||||||
|
|
||||||
CMOS_CENTURY equ 0x32
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,54 +0,0 @@
|
||||||
File: IBM PC/AT
|
|
||||||
|
|
||||||
About: I/O Address Map
|
|
||||||
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x000 - 0x01F | DMA controller 1 |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x020 - 0x03F | 8259A, Primary |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x040 - 0x05F | Timer |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x060 - 0x06F | Keyboard |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x070 - 0x07F | CMOS |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x080 - 0x09F | DMA page register |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x0A0 - 0x0BF | 8259A, Secondary |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x0C0 - 0x0DF | DMA controller 2 |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x0F0 | Clear Math Coprocessor |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x0F1 | Reset Math Coprocessor |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x0F8 - 0x0FF | Math Coprocessor |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x1F0 - 0x1F8 | Fixed Disk |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x200 - 0x207 | Game I/O |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x278 - 0x27F | Parallel printer port 2 |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x2F8 - 0x2FF | Serial port 2 |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x300 - 0x31F | Prototype card |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x360 - 0x363 | PC Network (low) |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x368 - 0x36B | PC Network (high) |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x378 - 0x37F | Parallel printer port 1 |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x380 - 0x38F | SDLC, bisynchronous 2 |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x3B0 - 0x3BF | Monochrome Display |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x3D0 - 0x3DF | Color Monitor Adapter |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x3F0 - 0x3F7 | Diskette controller |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
> | 0x3F8 - 0x3FF | Serial port 1 |
|
|
||||||
> +---------------+-------------------------+
|
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
;; File: pit.s
|
|
||||||
;; Programmable Interval Timer (8253/8254)
|
|
||||||
|
|
||||||
PIT_CHAN_0 equ 0x40
|
|
||||||
PIT_CHAN_1 equ 0x41
|
|
||||||
PIT_CHAN_2 equ 0x42
|
|
||||||
PIT_CMD equ 0x43
|
|
||||||
|
|
||||||
CMD_CHANNEL_1 equ (0x1 << 6)
|
|
||||||
CMD_CHANNEL_2 equ (0x2 << 6)
|
|
||||||
CMD_READ_BACK equ (0x3 << 6)
|
|
||||||
CMD_ACCESS_LO equ (0x1 << 4)
|
|
||||||
CMD_ACCESS_HI equ (0x2 << 4)
|
|
||||||
CMD_ACCESS_LO_HI equ (0x3 << 4)
|
|
||||||
|
|
|
@ -1,64 +0,0 @@
|
||||||
section .text
|
|
||||||
|
|
||||||
COM1 equ 0x3F8
|
|
||||||
COM2 equ 0x2F8
|
|
||||||
COM3 equ 0x3E8
|
|
||||||
COM4 equ 0x2E8
|
|
||||||
|
|
||||||
THR equ 0x0
|
|
||||||
RBR equ 0x0
|
|
||||||
IER equ 0x1
|
|
||||||
IIR equ 0x2
|
|
||||||
LCR equ 0x3
|
|
||||||
MCR equ 0x4
|
|
||||||
LSR equ 0x5
|
|
||||||
MSR equ 0x7
|
|
||||||
DLL equ 0x0
|
|
||||||
DLH equ 0x0
|
|
||||||
|
|
||||||
%macro COM_OUT 3
|
|
||||||
mov dx, %1+%2
|
|
||||||
mov al, %3
|
|
||||||
out dx, al
|
|
||||||
%endmacro
|
|
||||||
|
|
||||||
%macro COM_IN 2
|
|
||||||
mov dx, %1+%2
|
|
||||||
in al, dx
|
|
||||||
%endmacro
|
|
||||||
|
|
||||||
; Function: serial_init
|
|
||||||
;
|
|
||||||
; in:
|
|
||||||
; none
|
|
||||||
;
|
|
||||||
; out:
|
|
||||||
; none
|
|
||||||
;
|
|
||||||
global serial_init
|
|
||||||
serial_init:
|
|
||||||
COM_OUT COM1, IER, 0x00
|
|
||||||
COM_OUT COM1, LCR, 0x80
|
|
||||||
COM_OUT COM1, DLH, 0x00
|
|
||||||
COM_OUT COM1, DLL, 0x0C
|
|
||||||
|
|
||||||
COM_OUT COM1, LCR, 0x03
|
|
||||||
|
|
||||||
ret
|
|
||||||
|
|
||||||
; Function: serial_write
|
|
||||||
;
|
|
||||||
; in:
|
|
||||||
; none
|
|
||||||
;
|
|
||||||
; out:
|
|
||||||
; none
|
|
||||||
;
|
|
||||||
global serial_write
|
|
||||||
serial_write:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
mov ecx, [ebp + 8]
|
|
||||||
COM_OUT COM1, THR, cl
|
|
||||||
leave
|
|
||||||
ret
|
|
|
@ -1,14 +0,0 @@
|
||||||
|
|
||||||
struc superblock
|
|
||||||
.devid: resd 1
|
|
||||||
.size: resd 1
|
|
||||||
.ninode: resd 1
|
|
||||||
.fs_type: resd 1
|
|
||||||
endstruc
|
|
||||||
|
|
||||||
struc inode
|
|
||||||
.devid: resd 1
|
|
||||||
.size: resd 1
|
|
||||||
.inode: resd 1s
|
|
||||||
.access: resd 1
|
|
||||||
endstruc
|
|
|
@ -1,3 +0,0 @@
|
||||||
%include "i18n/lang.inc"
|
|
||||||
|
|
||||||
extern msg_en
|
|
|
@ -1,10 +0,0 @@
|
||||||
struc lang_entry
|
|
||||||
.code: resb 2
|
|
||||||
.data: resd 1
|
|
||||||
.next: resd 1
|
|
||||||
endstruc
|
|
||||||
|
|
||||||
struc msg_table
|
|
||||||
.hello_world: resd 1
|
|
||||||
.cpu_exceptions: resd 32
|
|
||||||
endstruc
|
|
|
@ -1,102 +0,0 @@
|
||||||
; file: msg_en.s
|
|
||||||
; English strings
|
|
||||||
|
|
||||||
%include "i18n/lang.inc"
|
|
||||||
|
|
||||||
section .rodata
|
|
||||||
global lang_en
|
|
||||||
lang_en:
|
|
||||||
istruc lang_entry
|
|
||||||
at lang_entry.code, db "en"
|
|
||||||
at lang_entry.data, dd msg_en
|
|
||||||
at lang_entry.next, dd 0
|
|
||||||
iend
|
|
||||||
|
|
||||||
global msg_en
|
|
||||||
msg_en:
|
|
||||||
istruc msg_table
|
|
||||||
at msg_table.hello_world, dd msg_hello_world
|
|
||||||
at msg_table.cpu_exceptions,
|
|
||||||
dd msg_int_division_zero
|
|
||||||
dd msg_int_debug
|
|
||||||
dd msg_int_nmi
|
|
||||||
dd msg_int_breakpoint
|
|
||||||
dd msg_int_overflow
|
|
||||||
dd msg_int_range_exceeded
|
|
||||||
dd msg_int_invalid_opcode
|
|
||||||
dd msg_int_device_not_available
|
|
||||||
dd msg_int_double_fault
|
|
||||||
dd msg_int_coproc_segment_overrun
|
|
||||||
dd msg_int_invalid_tss
|
|
||||||
dd msg_int_seg_not_present
|
|
||||||
dd msg_int_stack_segfault
|
|
||||||
dd msg_int_gpf
|
|
||||||
dd msg_int_page_fault
|
|
||||||
dd msg_int_reserved
|
|
||||||
dd msg_int_fp_exception
|
|
||||||
dd msg_int_align_check
|
|
||||||
dd msg_int_machine_check
|
|
||||||
dd msg_int_simd_exception
|
|
||||||
dd msg_int_virt_exception
|
|
||||||
dd msg_int_reserved
|
|
||||||
dd msg_int_reserved
|
|
||||||
dd msg_int_reserved
|
|
||||||
dd msg_int_reserved
|
|
||||||
dd msg_int_reserved
|
|
||||||
dd msg_int_reserved
|
|
||||||
dd msg_int_reserved
|
|
||||||
dd msg_int_reserved
|
|
||||||
dd msg_int_reserved
|
|
||||||
dd msg_int_reserved
|
|
||||||
dd msg_int_reserved
|
|
||||||
iend
|
|
||||||
|
|
||||||
msg_hello_world:
|
|
||||||
db "StupidOS v", STUPID_VERSION, " (built with NASM v", __NASM_VER__, " on ", __DATE__, " ", __TIME__, ")", 0
|
|
||||||
msg_boot_info:
|
|
||||||
db "Bootloader: %s", 0
|
|
||||||
msg_pmm_initialized:
|
|
||||||
db "PMM initialized", 0
|
|
||||||
err_invalid_boot_magic:
|
|
||||||
db "[ERROR] Invalid boot magic (got: %x, expected: 0x2BADB002)", 0
|
|
||||||
err_cannot_map_memory:
|
|
||||||
db "[ERROR] Can't map memory", 0
|
|
||||||
warn_no_mmap:
|
|
||||||
db "[WARN] mmap flag not set", 0
|
|
||||||
msg_mmap_entry:
|
|
||||||
db "Memory Map Entry:", 0xA
|
|
||||||
db 0x9, "Address: (hi): %x (lo): %x", 0xA
|
|
||||||
db 0x9, "Length: (hi): %x (lo): %x", 0xA
|
|
||||||
db 0x9, "Type: %x", 0
|
|
||||||
msg_mem_block:
|
|
||||||
db "Free Memory:", 0xA
|
|
||||||
db 0x9, "Address: %x", 0xA
|
|
||||||
db 0x9, "Length: %x", 0
|
|
||||||
msg_max_mem:
|
|
||||||
db "Max memory: %x", 0
|
|
||||||
msg_bitmap_stored_at:
|
|
||||||
db "Bitmap stored at: %x", 0
|
|
||||||
|
|
||||||
|
|
||||||
msg_int_division_zero: db "Division by zero", 0x0
|
|
||||||
msg_int_debug: db "Debug", 0x0
|
|
||||||
msg_int_nmi: db "Non-maskable interrupt", 0x0
|
|
||||||
msg_int_breakpoint: db "Breakpoint", 0x0
|
|
||||||
msg_int_overflow: db "Overflow", 0x0
|
|
||||||
msg_int_range_exceeded: db "Bound range exceeded", 0x0
|
|
||||||
msg_int_invalid_opcode: db "Invalid Opcode", 0x0
|
|
||||||
msg_int_device_not_available: db "Device not available", 0x0
|
|
||||||
msg_int_double_fault: db "Double fault", 0x0
|
|
||||||
msg_int_coproc_segment_overrun: db "Coprocessor segment overrun", 0x0
|
|
||||||
msg_int_invalid_tss: db "Invalid TSS", 0x0
|
|
||||||
msg_int_seg_not_present: db "Segment not present", 0x0
|
|
||||||
msg_int_stack_segfault: db "Stack segment fault", 0x0
|
|
||||||
msg_int_gpf: db "General Protection Fault", 0x0
|
|
||||||
msg_int_page_fault: db "Page fault", 0x0
|
|
||||||
msg_int_reserved: db "Reserved", 0x0
|
|
||||||
msg_int_fp_exception: db "x87 Floating-Point Exception", 0x0
|
|
||||||
msg_int_align_check: db "Aligment check", 0x0
|
|
||||||
msg_int_machine_check: db "Machine check", 0x0
|
|
||||||
msg_int_simd_exception: db "SIMD Floating-Point exception", 0x0
|
|
||||||
msg_int_virt_exception: db "Virtualization exception", 0x0
|
|
||||||
msg_int_sec_exception: db "Security exception", 0x0
|
|
BIN
kernel/intro.txt
BIN
kernel/intro.txt
Binary file not shown.
15
kernel/kernel.asm
Normal file
15
kernel/kernel.asm
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
INCLUDE 'boot/boot.inc'
|
||||||
|
|
||||||
|
ORG $ + KBASE
|
||||||
|
|
||||||
|
INCLUDE 'mm/mm.inc'
|
||||||
|
|
||||||
|
kmain:
|
||||||
|
nop
|
||||||
|
|
||||||
|
_edata:
|
||||||
|
|
||||||
|
; BSS
|
||||||
|
rb 0x4000
|
||||||
|
|
||||||
|
_end:
|
|
@ -1,38 +0,0 @@
|
||||||
; File: kernel.s
|
|
||||||
[BITS 32]
|
|
||||||
|
|
||||||
%include "base.inc"
|
|
||||||
|
|
||||||
section .bss
|
|
||||||
align 16
|
|
||||||
stack_bottom:
|
|
||||||
resb 16384
|
|
||||||
global stack_top
|
|
||||||
stack_top:
|
|
||||||
|
|
||||||
section .text
|
|
||||||
; Function: kmain
|
|
||||||
global kmain
|
|
||||||
kmain:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
;; TODO: console init
|
|
||||||
|
|
||||||
extern serial_init
|
|
||||||
call serial_init
|
|
||||||
|
|
||||||
LOG msg_hello_world
|
|
||||||
LOG msg_print_boot, esi, edi
|
|
||||||
|
|
||||||
int3
|
|
||||||
;; setup cpu
|
|
||||||
;; initialize vm
|
|
||||||
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
section .rodata
|
|
||||||
|
|
||||||
msg_hello_world db "StupidOS v", STUPID_VERSION, " (built with ", __NASM_VER__, " on ", __DATE__, " ", __TIME__, ")", 0
|
|
||||||
msg_print_boot db "ESI: %x | EDI: %x", 0
|
|
||||||
file db __FILE__, 0
|
|
|
@ -1,39 +0,0 @@
|
||||||
OUTPUT_ARCH(i386)
|
|
||||||
ENTRY(entry)
|
|
||||||
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
. = 1M;
|
|
||||||
|
|
||||||
kernel_start = .;
|
|
||||||
|
|
||||||
.multiboot ALIGN(0x1000): {
|
|
||||||
KEEP(*(.multiboot.data))
|
|
||||||
KEEP(*(.multiboot.text))
|
|
||||||
}
|
|
||||||
|
|
||||||
. += 0xC0100000;
|
|
||||||
|
|
||||||
.text ALIGN(0x1000) : AT(ADDR(.text) - 0xC0000000) {
|
|
||||||
*(.text)
|
|
||||||
}
|
|
||||||
|
|
||||||
.rodata ALIGN(0x1000) : AT(ADDR(.rodata) - 0xC0000000) {
|
|
||||||
*(.rodata)
|
|
||||||
}
|
|
||||||
|
|
||||||
.data ALIGN(0x1000) : AT(ADDR(.data) - 0xC0000000) {
|
|
||||||
*(.data)
|
|
||||||
}
|
|
||||||
|
|
||||||
.bss ALIGN(0x1000) : AT(ADDR(.bss) - 0xC0000000) {
|
|
||||||
bss_start = .;
|
|
||||||
*(COMMON)
|
|
||||||
*(.bss)
|
|
||||||
bss_end = .;
|
|
||||||
}
|
|
||||||
|
|
||||||
kernel_end = .;
|
|
||||||
}
|
|
||||||
|
|
||||||
kernel_size = kernel_end - kernel_start;
|
|
11
kernel/mm/mm.inc
Normal file
11
kernel/mm/mm.inc
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
free_block_head dd 0x0
|
||||||
|
|
||||||
|
mm_init:
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
kernel_page_directory:
|
||||||
|
dd 0x1000 dup 0x0
|
||||||
|
kernel_page_table:
|
||||||
|
dd 0x1000 dup 0x0
|
7
kernel/mm/stats.inc
Normal file
7
kernel/mm/stats.inc
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
struc VMStat
|
||||||
|
{
|
||||||
|
total_page dd 0
|
||||||
|
free_pages dd 0
|
||||||
|
used_pages dd 0
|
||||||
|
}
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
[BITS 32]
|
|
||||||
|
|
||||||
PE_PRESENT equ 1 << 0
|
|
||||||
PE_WRITABLE equ 1 << 1
|
|
||||||
PE_USERMODE equ 1 << 2
|
|
||||||
PE_ACCESSED equ 1 << 5
|
|
||||||
PE_DIRTY equ 1 << 6
|
|
||||||
|
|
||||||
section .bss
|
|
||||||
align 4096
|
|
||||||
global page_directory
|
|
||||||
page_directory:
|
|
||||||
resb 4096
|
|
||||||
global boot_page_table
|
|
||||||
boot_page_table:
|
|
||||||
resb 4096
|
|
114
kernel/pic.s
114
kernel/pic.s
|
@ -1,114 +0,0 @@
|
||||||
; file: pic.s
|
|
||||||
; <Datasheet at https://pdos.csail.mit.edu/6.828/2005/readings/hardware/8259A.pdf>
|
|
||||||
[BITS 32]
|
|
||||||
|
|
||||||
PIC1_INT_START equ 0x20
|
|
||||||
PIC2_INT_START equ 0x28
|
|
||||||
PIC_INT_END equ PIC2_INT_START + 7
|
|
||||||
|
|
||||||
PIC1_CMD equ 0x20
|
|
||||||
PIC1_DATA equ 0x21
|
|
||||||
PIC2_CMD equ 0xA0
|
|
||||||
PIC2_DATA equ 0xA1
|
|
||||||
|
|
||||||
; Initialization Command Words (ICWs)
|
|
||||||
ICW1_INIT equ 1 << 4
|
|
||||||
ICW1_ICW4 equ 1 << 0
|
|
||||||
ICW1_SINGLE equ 1 << 1
|
|
||||||
ICW1_INTERVAL4 equ 1 << 2
|
|
||||||
ICW1_LVL_MODE equ 1 << 3
|
|
||||||
|
|
||||||
ICW4_8086_MODE equ 1 << 0
|
|
||||||
ICW4_AUTO_EOI equ 1 << 1
|
|
||||||
ICW4_BUF_SLAVE equ 1 << 3
|
|
||||||
ICW4_BUF_MASTER equ 1 << 3 | 1 << 2
|
|
||||||
ICW4_SFNM equ 1 << 4
|
|
||||||
|
|
||||||
; Operation Command Words (OWCs)
|
|
||||||
OCW2_EOI equ 1 << 5
|
|
||||||
|
|
||||||
section .text
|
|
||||||
|
|
||||||
; Function: setup_pic
|
|
||||||
;
|
|
||||||
; in:
|
|
||||||
; none
|
|
||||||
;
|
|
||||||
; out:
|
|
||||||
; none
|
|
||||||
;
|
|
||||||
global pic_setup
|
|
||||||
pic_setup:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
sub esp, 2
|
|
||||||
|
|
||||||
in al, PIC1_DATA
|
|
||||||
mov [ebp - 2], al
|
|
||||||
in al, PIC2_DATA
|
|
||||||
mov [ebp - 1], al
|
|
||||||
|
|
||||||
mov al, ICW1_INIT | ICW1_ICW4
|
|
||||||
out PIC1_CMD, al
|
|
||||||
out PIC2_CMD, al
|
|
||||||
|
|
||||||
mov al, PIC1_INT_START
|
|
||||||
out PIC1_DATA, al
|
|
||||||
mov al, PIC2_INT_START
|
|
||||||
out PIC2_DATA, al
|
|
||||||
|
|
||||||
mov al, 4
|
|
||||||
out PIC1_DATA, al
|
|
||||||
mov al, 2
|
|
||||||
out PIC2_DATA, al
|
|
||||||
|
|
||||||
mov al, ICW4_8086_MODE
|
|
||||||
out PIC1_DATA, al
|
|
||||||
out PIC2_DATA, al
|
|
||||||
|
|
||||||
mov al, [ebp - 2]
|
|
||||||
out PIC1_DATA, al
|
|
||||||
mov al, [ebp - 1]
|
|
||||||
out PIC2_DATA, al
|
|
||||||
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
; Function: pic_eoi
|
|
||||||
;
|
|
||||||
; in:
|
|
||||||
; none
|
|
||||||
;
|
|
||||||
; out:
|
|
||||||
; none
|
|
||||||
;
|
|
||||||
global pic_eoi
|
|
||||||
pic_eoi:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
|
|
||||||
mov al, OCW2_EOI
|
|
||||||
|
|
||||||
cmp byte [ebp + 8], PIC1_INT_START
|
|
||||||
jb .end
|
|
||||||
cmp byte [ebp + 8], PIC_INT_END
|
|
||||||
ja .end
|
|
||||||
|
|
||||||
cmp byte [ebp + 8], PIC2_INT_START
|
|
||||||
jb .pic1
|
|
||||||
out PIC2_CMD, al
|
|
||||||
jmp .end
|
|
||||||
.pic1:
|
|
||||||
out PIC1_CMD, al
|
|
||||||
|
|
||||||
.end:
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
; Function: pic_disable
|
|
||||||
global pic_disable
|
|
||||||
pic_disable:
|
|
||||||
mov al, 0xFF
|
|
||||||
out PIC1_DATA, al
|
|
||||||
out PIC2_DATA, al
|
|
||||||
ret
|
|
387
kernel/pmm.s
387
kernel/pmm.s
|
@ -1,387 +0,0 @@
|
||||||
; File: pmm.s
|
|
||||||
[BITS 32]
|
|
||||||
;; XXX: align address to page
|
|
||||||
|
|
||||||
%include "base.inc"
|
|
||||||
%include "sys/multiboot.inc"
|
|
||||||
|
|
||||||
extern kernel_size
|
|
||||||
extern kernel_end
|
|
||||||
|
|
||||||
struc bitmap
|
|
||||||
.length: resd 1
|
|
||||||
.addr: resd 1
|
|
||||||
endstruc
|
|
||||||
|
|
||||||
section .text
|
|
||||||
|
|
||||||
bitmap_count_free_page:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
push edi
|
|
||||||
push esi
|
|
||||||
push ebx
|
|
||||||
|
|
||||||
mov edi, [bitmap_info + bitmap.addr]
|
|
||||||
xor ebx, ebx
|
|
||||||
|
|
||||||
.loop:
|
|
||||||
|
|
||||||
inc edi
|
|
||||||
inc ebx
|
|
||||||
cmp ebx, [bitmap_info]
|
|
||||||
jb .loop
|
|
||||||
.end:
|
|
||||||
pop ebx
|
|
||||||
pop esi
|
|
||||||
pop edi
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
bitmap_mark:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
push edi
|
|
||||||
push esi
|
|
||||||
|
|
||||||
mov edi, 1
|
|
||||||
mov eax, [ebp + 8]
|
|
||||||
and eax, 0x7 ; eax % 8
|
|
||||||
mov ecx, eax
|
|
||||||
shl edi, cl
|
|
||||||
|
|
||||||
mov eax, [ebp + 8]
|
|
||||||
shr eax, 0x3 ; eax / 8
|
|
||||||
mov esi, [bitmap_info + bitmap.addr]
|
|
||||||
add esi, eax
|
|
||||||
mov dl, byte [esi]
|
|
||||||
|
|
||||||
mov ecx, [ebp + 12]
|
|
||||||
test ecx, ecx
|
|
||||||
jz .clear
|
|
||||||
|
|
||||||
or edx, edi ; set bit
|
|
||||||
jmp .end
|
|
||||||
|
|
||||||
.clear:
|
|
||||||
not edi
|
|
||||||
and edx, edi ; clear bit
|
|
||||||
|
|
||||||
.end:
|
|
||||||
mov byte [esi], dl
|
|
||||||
|
|
||||||
pop esi
|
|
||||||
pop edi
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
init_bitmap:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
push edi
|
|
||||||
|
|
||||||
mov ecx, [bitmap_info]
|
|
||||||
mov edi, [bitmap_info + bitmap.addr]
|
|
||||||
rep stosb
|
|
||||||
|
|
||||||
xchg bx, bx
|
|
||||||
|
|
||||||
pop edi
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
bitmap_mark_range_free:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
push edi
|
|
||||||
push esi
|
|
||||||
push ebx
|
|
||||||
|
|
||||||
mov edi, [ebp + 8] ; start address
|
|
||||||
mov esi, [ebp + 12] ; length
|
|
||||||
xor ebx, ebx ; counter (I know I SHOUD use 'ecx' as counter
|
|
||||||
; but since the ABI state it's not preserved
|
|
||||||
; accross function call)
|
|
||||||
push dword 0 ; bitmap_mark(addr, 0) == clear
|
|
||||||
.loop:
|
|
||||||
cmp ebx, esi
|
|
||||||
jnb .end_loop
|
|
||||||
add edi, ebx
|
|
||||||
jc .end_loop ; exit on overflow
|
|
||||||
push edi
|
|
||||||
call bitmap_mark
|
|
||||||
add esp, 4
|
|
||||||
|
|
||||||
add ebx, 0x1000 ; add page size
|
|
||||||
jmp .loop
|
|
||||||
.end_loop:
|
|
||||||
add esp, 4
|
|
||||||
pop ebx
|
|
||||||
pop esi
|
|
||||||
pop edi
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
setup_pmm_mmap:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
sub esp, 4
|
|
||||||
push edi
|
|
||||||
push esi
|
|
||||||
push ebx
|
|
||||||
|
|
||||||
mov edi, [ebp + 8] ; mb_mmap struct addr
|
|
||||||
mov esi, [ebp + 12] ; mmap length
|
|
||||||
xor ebx, ebx ; pass
|
|
||||||
mov [ebp - 4], ebx ; set max addr to 0
|
|
||||||
.loop:
|
|
||||||
;; TODO: PAE stuff
|
|
||||||
;; skip address > 32bit
|
|
||||||
mov eax, [edi + mb_mmap.addr + 4]
|
|
||||||
and eax, eax
|
|
||||||
jnz .next
|
|
||||||
mov eax, [edi + mb_mmap.length + 4]
|
|
||||||
and eax, eax
|
|
||||||
jnz .next
|
|
||||||
|
|
||||||
;; check if first pass
|
|
||||||
and ebx, ebx
|
|
||||||
jz .first_pass
|
|
||||||
mov eax, [edi + mb_mmap.type]
|
|
||||||
and eax, 0x1 ; check if free
|
|
||||||
jz .next
|
|
||||||
;;
|
|
||||||
mov eax, [bitmap_info]
|
|
||||||
mov ecx, [mb_mmap.length]
|
|
||||||
cmp eax, ecx
|
|
||||||
ja .next
|
|
||||||
|
|
||||||
cmp ebx, 0x1
|
|
||||||
jne .third_pass
|
|
||||||
mov eax, [edi + mb_mmap.addr]
|
|
||||||
mov [bitmap_info + bitmap.addr], eax
|
|
||||||
LOG msg_bitmap_stored_at, eax
|
|
||||||
call init_bitmap ; mark all memory as used
|
|
||||||
jmp .bitmap_size_already_set
|
|
||||||
|
|
||||||
;; TODO: mark as free in bitmap
|
|
||||||
.third_pass:
|
|
||||||
push dword [edi + mb_mmap.length]
|
|
||||||
push dword [edi + mb_mmap.addr]
|
|
||||||
call bitmap_mark_range_free
|
|
||||||
add esp, 8
|
|
||||||
jmp .next
|
|
||||||
|
|
||||||
;; first pass then calculate higher address
|
|
||||||
.first_pass:
|
|
||||||
LOG msg_mmap_entry, dword [edi + mb_mmap.addr + 4], \
|
|
||||||
dword [edi + mb_mmap.addr], \
|
|
||||||
dword [edi + mb_mmap.length + 4], \
|
|
||||||
dword [edi + mb_mmap.length], \
|
|
||||||
dword [edi + mb_mmap.type]
|
|
||||||
mov eax, [edi + mb_mmap.length]
|
|
||||||
add eax, [edi + mb_mmap.addr]
|
|
||||||
jnc .no_overflow
|
|
||||||
mov eax, -1 ; if overflow set eax to (uint32_t)-1
|
|
||||||
.no_overflow:
|
|
||||||
mov edx, [ebp - 4]
|
|
||||||
cmp edx, eax
|
|
||||||
ja .next
|
|
||||||
mov [ebp - 4], eax
|
|
||||||
|
|
||||||
.next:
|
|
||||||
mov eax, [edi + mb_mmap.size]
|
|
||||||
add eax, 0x4
|
|
||||||
add edi, eax ; jump to next entry
|
|
||||||
sub esi, eax
|
|
||||||
jnz .loop
|
|
||||||
|
|
||||||
and ebx, ebx
|
|
||||||
jnz .bitmap_size_already_set
|
|
||||||
LOG msg_max_mem, dword [ebp - 4]
|
|
||||||
|
|
||||||
mov eax, [ebp - 4]
|
|
||||||
shr eax, 15 ; eax / (4096*8)
|
|
||||||
mov [bitmap_info], eax
|
|
||||||
|
|
||||||
.bitmap_size_already_set:
|
|
||||||
mov edi, [ebp + 8] ; mb_mmap struct addr
|
|
||||||
mov esi, [ebp + 12] ; mmap length
|
|
||||||
inc ebx
|
|
||||||
cmp ebx, 2
|
|
||||||
jbe .loop
|
|
||||||
|
|
||||||
pop ebx
|
|
||||||
pop esi
|
|
||||||
pop edi
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
setup_pmm_legacy:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
push edi
|
|
||||||
push esi
|
|
||||||
push ebx
|
|
||||||
xor eax, eax
|
|
||||||
mov ecx, [ebp + 8]
|
|
||||||
shl ecx, 0xA ; ecx * 1KiB
|
|
||||||
mov esi, ecx
|
|
||||||
LOG msg_mem_block, eax, ecx
|
|
||||||
|
|
||||||
mov eax, 0x100000
|
|
||||||
mov ecx, [ebp + 12]
|
|
||||||
shl ecx, 0xA ; ecx * 1KiB
|
|
||||||
mov ebx, ecx
|
|
||||||
mov edi, eax
|
|
||||||
add edi, ecx
|
|
||||||
LOG msg_mem_block, eax, ecx
|
|
||||||
|
|
||||||
LOG msg_max_mem, edi
|
|
||||||
|
|
||||||
shr edi, 15 ; (edi / (4046*8))
|
|
||||||
mov dword [bitmap_info], edi
|
|
||||||
|
|
||||||
cmp edi, esi
|
|
||||||
ja .try_high
|
|
||||||
mov dword [bitmap_info + bitmap.addr], 0
|
|
||||||
jmp .initialize_bitmap
|
|
||||||
|
|
||||||
.try_high:
|
|
||||||
mov eax, ebx
|
|
||||||
sub ebx, kernel_size
|
|
||||||
cmp edi, ebx
|
|
||||||
ja .err_no_mem
|
|
||||||
mov dword [bitmap_info + bitmap.addr], kernel_end
|
|
||||||
|
|
||||||
.initialize_bitmap:
|
|
||||||
call init_bitmap
|
|
||||||
|
|
||||||
push esi
|
|
||||||
push dword 0
|
|
||||||
call bitmap_mark_range_free
|
|
||||||
|
|
||||||
push ebx
|
|
||||||
push dword 0x100000
|
|
||||||
call bitmap_mark_range_free
|
|
||||||
|
|
||||||
xor eax, eax
|
|
||||||
jmp .end
|
|
||||||
|
|
||||||
.err_no_mem:
|
|
||||||
mov eax, 1
|
|
||||||
|
|
||||||
.end:
|
|
||||||
pop ebx
|
|
||||||
pop esi
|
|
||||||
pop edi
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
global setup_pmm
|
|
||||||
setup_pmm:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
push edi
|
|
||||||
push esi
|
|
||||||
push ebx
|
|
||||||
|
|
||||||
mov edi, [ebp + 8]
|
|
||||||
|
|
||||||
mov eax, [edi]
|
|
||||||
and eax, 0x40 ; (1 << 6)
|
|
||||||
jz .no_mmap
|
|
||||||
|
|
||||||
push dword [edi + mb_info.mmap_length]
|
|
||||||
push dword [edi + mb_info.mmap_addr]
|
|
||||||
call setup_pmm_mmap
|
|
||||||
add esp, 8
|
|
||||||
|
|
||||||
jmp .end_mem_detection
|
|
||||||
|
|
||||||
.no_mmap:
|
|
||||||
LOG warn_no_mmap
|
|
||||||
mov eax, [edi]
|
|
||||||
and eax, 0x1
|
|
||||||
jz .err
|
|
||||||
|
|
||||||
push dword [edi + mb_info.mem_upper]
|
|
||||||
push dword [edi + mb_info.mem_lower]
|
|
||||||
call setup_pmm_legacy
|
|
||||||
add esp, 8
|
|
||||||
|
|
||||||
.end_mem_detection:
|
|
||||||
;; mark bitmap as used
|
|
||||||
xor ebx, ebx
|
|
||||||
mov edi, [bitmap_info + bitmap.addr]
|
|
||||||
mov esi, [bitmap_info]
|
|
||||||
push dword 1 ; bitmap_mark(addr, 1) == set
|
|
||||||
|
|
||||||
.loop:
|
|
||||||
cmp ebx, edi
|
|
||||||
jnb .end_loop
|
|
||||||
add edi, ebx
|
|
||||||
push edi
|
|
||||||
call bitmap_mark
|
|
||||||
add esp, 4
|
|
||||||
|
|
||||||
add ebx, 0x1000
|
|
||||||
jmp .loop
|
|
||||||
.end_loop:
|
|
||||||
add esp, 4 ; previous "push dword 0"
|
|
||||||
|
|
||||||
xor eax, eax
|
|
||||||
jmp .end
|
|
||||||
.err:
|
|
||||||
mov eax, 1
|
|
||||||
.end:
|
|
||||||
pop ebx
|
|
||||||
pop esi
|
|
||||||
pop ebx
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
global alloc_frames
|
|
||||||
alloc_frames:
|
|
||||||
push esp
|
|
||||||
mov ebp, esp
|
|
||||||
push edi
|
|
||||||
push esi
|
|
||||||
|
|
||||||
mov edi, [ebp + 8] ; count
|
|
||||||
|
|
||||||
pop esi
|
|
||||||
pop edi
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
global free_frames
|
|
||||||
free_frames:
|
|
||||||
push esp
|
|
||||||
mov ebp, esp
|
|
||||||
|
|
||||||
call bitmap_mark_range_free
|
|
||||||
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
section .data
|
|
||||||
bitmap_info:
|
|
||||||
istruc bitmap
|
|
||||||
at bitmap.length, dd 0
|
|
||||||
at bitmap.addr, dd 0
|
|
||||||
iend
|
|
||||||
|
|
||||||
section .rodata
|
|
||||||
warn_no_mmap db "[WARN] mmap flag not set", 0
|
|
||||||
msg_mmap_entry db "Memory Map Entry:", 0xA
|
|
||||||
db 0x9, "Address: (hi): %x (lo): %x", 0xA
|
|
||||||
db 0x9, "Length: (hi): %x (lo): %x", 0xA
|
|
||||||
db 0x9, "Type: %x", 0
|
|
||||||
msg_mem_block db "Free Memory:", 0xA
|
|
||||||
db 0x9, "Address: %x", 0xA
|
|
||||||
db 0x9, "Length: %x", 0
|
|
||||||
msg_max_mem db "Max memory: %x", 0
|
|
||||||
msg_dump_x db "dump: %x", 0
|
|
||||||
msg_bitmap_stored_at db "Bitmap stored at: %x", 0
|
|
||||||
file db __FILE__, 0
|
|
|
@ -1,70 +0,0 @@
|
||||||
;; File: cpu.inc
|
|
||||||
|
|
||||||
;; Structure: idt_gate
|
|
||||||
;; .offset_low - TODO
|
|
||||||
;; .selector - TODO
|
|
||||||
;; .zero - TODO
|
|
||||||
;; .attributes - TODO
|
|
||||||
;; .offset_high - TODO
|
|
||||||
;;
|
|
||||||
struc idt_gate
|
|
||||||
.offset_low: resw 1
|
|
||||||
.selector: resw 1
|
|
||||||
.zero: resb 1
|
|
||||||
.attributes: resb 1
|
|
||||||
.offset_high: resw 1
|
|
||||||
endstruc
|
|
||||||
|
|
||||||
;; About: Gates
|
|
||||||
;; - Task Gate
|
|
||||||
;; > 31 23 15 7 0
|
|
||||||
;; > +----------------|----------------+-----------------|-----------------+
|
|
||||||
;; > | (NOT USED) | P DPL 0 0 1 0 1 (NOT USED) |
|
|
||||||
;; > +----------------|----------------+-----------------|-----------------+
|
|
||||||
;; > | SELECTOR | (NOT USED) |
|
|
||||||
;; > +----------------|----------------+-----------------|-----------------+
|
|
||||||
;;
|
|
||||||
;; - Interrupt Gate
|
|
||||||
;; > 31 23 15 7 0
|
|
||||||
;; > +----------------|----------------+-----------------|-----------------+
|
|
||||||
;; > | OFFSET 31..16 | P DPL 0 1 1 1 0 0 0 0 0 0 0 0 0 |
|
|
||||||
;; > +----------------|----------------+-----------------|-----------------+
|
|
||||||
;; > | SELECTOR | OFFSET 15..0 |
|
|
||||||
;; > +--------------- |----------------+-----------------|-----------------+
|
|
||||||
;;
|
|
||||||
;; - Trap Gate
|
|
||||||
;; > 31 23 15 7 0
|
|
||||||
;; > +----------------|----------------+-----------------|-----------------+
|
|
||||||
;; > | OFFSET 31..16 | P DPL 0 1 1 1 1 0 0 0 0 0 0 0 0 |
|
|
||||||
;; > +----------------|----------------+-----------------|-----------------+
|
|
||||||
;; > | SELECTOR | OFFSET 15..0 |
|
|
||||||
;; > +--------------- |----------------+-----------------|-----------------+
|
|
||||||
|
|
||||||
struc intframe
|
|
||||||
;; registers
|
|
||||||
.edi: resd 1
|
|
||||||
.esi: resd 1
|
|
||||||
.ebp: resd 1
|
|
||||||
.esp: resd 1
|
|
||||||
.ebx: resd 1
|
|
||||||
.edx: resd 1
|
|
||||||
.ecx: resd 1
|
|
||||||
.eax: resd 1
|
|
||||||
|
|
||||||
;;
|
|
||||||
.gs: resd 1
|
|
||||||
.fs: resd 1
|
|
||||||
.es: resd 1
|
|
||||||
.ds: resd 1
|
|
||||||
.intno: resd 1
|
|
||||||
|
|
||||||
;; by x86 hardware
|
|
||||||
.err: resd 1
|
|
||||||
.eip: resd 1
|
|
||||||
.cs: resd 1
|
|
||||||
.eflags: resd 1
|
|
||||||
|
|
||||||
;; crossring
|
|
||||||
.useresp: resd 1
|
|
||||||
.ss: resd 1
|
|
||||||
endstruc
|
|
|
@ -1,13 +0,0 @@
|
||||||
;; File: cpuid.inc
|
|
||||||
|
|
||||||
CPUID_VENDORID equ 0x0
|
|
||||||
CPUID_GETFEATURES equ 0x1
|
|
||||||
|
|
||||||
CPUID_FEAT_EDX_FPU equ 1 << 0
|
|
||||||
CPUID_FEAT_EDX_VME equ 1 << 1
|
|
||||||
CPUID_FEAT_EDX_DE equ 1 << 2
|
|
||||||
CPUID_FEAT_EDX_PSE equ 1 << 3
|
|
||||||
CPUID_FEAT_EDX_TSC equ 1 << 4
|
|
||||||
CPUID_FEAT_EDX_MSR equ 1 << 5
|
|
||||||
CPUID_FEAT_EDX_PAE equ 1 << 6
|
|
||||||
CPUID_FEAT_EDX_MCE equ 1 << 7
|
|
|
@ -1,91 +0,0 @@
|
||||||
;; File: mmu.inc
|
|
||||||
;;
|
|
||||||
;; About: Address Translation
|
|
||||||
;;
|
|
||||||
;; Since we don't use segmentation, this is how address translation works
|
|
||||||
;; > 31 21 11 0
|
|
||||||
;; > +--------+--------+--------+
|
|
||||||
;; > | DIR | PAGE | OFFSET |
|
|
||||||
;; > +--------+--------+--------+
|
|
||||||
;; > |
|
|
||||||
;; > v
|
|
||||||
;; > Page Translation
|
|
||||||
;; > |
|
|
||||||
;; > 31 v 0
|
|
||||||
;; > +--------------------------+
|
|
||||||
;; > | Pyshical address |
|
|
||||||
;; > +--------------------------+
|
|
||||||
;;
|
|
||||||
;; About: Page Translation
|
|
||||||
;;
|
|
||||||
;; > +--------+--------+--------+ +--------+
|
|
||||||
;; > | DIR | PAGE | OFFSET |-----+ | Phys |
|
|
||||||
;; > +--------+--------+--------+ +------>| addr |
|
|
||||||
;; > | | | |
|
|
||||||
;; > | +----+ +--------+
|
|
||||||
;; > | Page Dir | +---> Page Frame
|
|
||||||
;; > | +---------+ | +--------+ |
|
|
||||||
;; > | | | | | | |
|
|
||||||
;; > +->| PDE |-+ +->| PTE |-+
|
|
||||||
;; > | | | | |
|
|
||||||
;; > +---------+ | +--------+
|
|
||||||
;; > +----> Page Table
|
|
||||||
;; >
|
|
||||||
;;
|
|
||||||
|
|
||||||
;; Macro: V2P(addr)
|
|
||||||
;; Convert Kernel Address to Physical Address
|
|
||||||
%define V2P(addr) (addr - KERNBASE)
|
|
||||||
|
|
||||||
;; Macro: P2V(addr)
|
|
||||||
;; Convert Physical Address to Kernel Address
|
|
||||||
%define P2V(addr) (addr + KERNBASE)
|
|
||||||
|
|
||||||
%define P2PDE(addr) ((addr >> 22) & 0x3FF)
|
|
||||||
%define PDE2P(addr) (addr << 22)
|
|
||||||
%define P2PTE(addr) ((addr >> 12) & 0x3FF)
|
|
||||||
|
|
||||||
;; Defines: Page Directory Flags
|
|
||||||
;; PDE_P - Present
|
|
||||||
;; PDE_W - Writable
|
|
||||||
;; PDE_U - User
|
|
||||||
;; PDE_PWT - Write-Through
|
|
||||||
;; PDE_PS - 4MiB page
|
|
||||||
PDE_P equ 1 << 0
|
|
||||||
PDE_W equ 1 << 1
|
|
||||||
PDE_U equ 1 << 2
|
|
||||||
PDE_PWT equ 1 << 3
|
|
||||||
PDE_PCD equ 1 << 4
|
|
||||||
PDE_A equ 1 << 5
|
|
||||||
PDE_D equ 1 << 6
|
|
||||||
PDE_PS equ 1 << 7
|
|
||||||
PDE_G equ 1 << 8
|
|
||||||
|
|
||||||
;; Defines: Page Table Flags
|
|
||||||
;; PTE_P - Present
|
|
||||||
;; PTE_W - Writable
|
|
||||||
;; PTE_U - User
|
|
||||||
;; PTE_PWT - Write-Through
|
|
||||||
;; PTE_PCD - Cache Disable
|
|
||||||
;; PTE_A - Accessed
|
|
||||||
;; PTE_D - Dirty
|
|
||||||
;; PTE_PAT - TODO
|
|
||||||
;; PTE_G - TODO
|
|
||||||
PTE_P equ 1 << 0
|
|
||||||
PTE_W equ 1 << 1
|
|
||||||
PTE_U equ 1 << 2
|
|
||||||
PTE_PWT equ 1 << 3
|
|
||||||
PTE_PCD equ 1 << 4
|
|
||||||
PTE_A equ 1 << 5
|
|
||||||
PTE_D equ 1 << 6
|
|
||||||
PTE_PAT equ 1 << 7
|
|
||||||
PTE_G equ 1 << 8
|
|
||||||
|
|
||||||
struc gdt_entry
|
|
||||||
.limit_low: resw 1
|
|
||||||
.base_low: resw 1
|
|
||||||
.base_mid: resb 1
|
|
||||||
.access: resb 1
|
|
||||||
.flags: resb 1
|
|
||||||
.base_high: resb 1
|
|
||||||
endstruc
|
|
|
@ -1,126 +0,0 @@
|
||||||
;; File: registers.inc
|
|
||||||
|
|
||||||
|
|
||||||
;; =========================================================================
|
|
||||||
;; Control Registers
|
|
||||||
;; =========================================================================
|
|
||||||
|
|
||||||
;; Defines: CR0
|
|
||||||
;; CR0_PE - Protected Mode Enable
|
|
||||||
;; CR0_MP - Monitor co-processor
|
|
||||||
;; CR0_EM - x87 FPU Emulation
|
|
||||||
;; CR0_TS - Task switched
|
|
||||||
;; CR0_ET - Extension type
|
|
||||||
;; CR0_NE - Numeric error
|
|
||||||
;; CR0_WP - Write protect
|
|
||||||
;; CR0_AM - Alignment mask
|
|
||||||
;; CR0_NW - Not-write through
|
|
||||||
;; CR0_CD - Cache disable
|
|
||||||
;; CR0_PG - Paging
|
|
||||||
CR0_PE equ 1 << 0
|
|
||||||
CR0_MP equ 1 << 1
|
|
||||||
CR0_EM equ 1 << 2
|
|
||||||
CR0_TS equ 1 << 3
|
|
||||||
CR0_ET equ 1 << 4
|
|
||||||
CR0_NE equ 1 << 5
|
|
||||||
CR0_WP equ 1 << 16
|
|
||||||
CR0_AM equ 1 << 18
|
|
||||||
CR0_NW equ 1 << 29
|
|
||||||
CR0_CD equ 1 << 30
|
|
||||||
CR0_PG equ 1 << 31
|
|
||||||
|
|
||||||
;; Defines: CR3
|
|
||||||
;; CR3_PWT - Page-level Write-Through
|
|
||||||
;; CR3_PCD - Page-level Cache Disable
|
|
||||||
CR3_PWT equ 1 << 3
|
|
||||||
CR3_PCD equ 1 << 4
|
|
||||||
|
|
||||||
;; Defines: CR4
|
|
||||||
;; CR4_VME - Virtual 8086 Mode Extensions
|
|
||||||
;; CR4_PVI - Protected-mode Virtual Interrupts
|
|
||||||
;; CR4_TSD - Time Stamp Disable
|
|
||||||
;; CR4_DE - Debugging Extensions
|
|
||||||
;; CR4_PSE - Page Size Extension
|
|
||||||
;; CR4_PAE - Physical Address Extension
|
|
||||||
;; CR4_MCE - Machine Check Exception
|
|
||||||
;; CR4_PGE - Page Global Enabled
|
|
||||||
;; CR4_PCE - Performance-Monitoring Counter enable
|
|
||||||
;; CR4_OSFXSR - Operating system support for FXSAVE and FXRSTOR
|
|
||||||
;; instructions
|
|
||||||
;; CR4_OSXMMEXCPT - Operating System Support for Unmasked SIMD
|
|
||||||
;; Floating-Point Excepions
|
|
||||||
;; CR4_UMIP - User-Mode Instruction Prevention
|
|
||||||
;; CR4_VMXE - Virtual Machine Extensions Enable
|
|
||||||
;; CR4_SMXE - Safer Mode Extensions Enable
|
|
||||||
;; CR4_FSGSBASE -
|
|
||||||
;; CR4_PCIDE - PCID Enable
|
|
||||||
;; CR4_OSXSSAVE - XSAVE and Processor Extended States Enable
|
|
||||||
;; CR4_SMEP - Supervisor Mode Execution Protection Enable
|
|
||||||
;; CR4_SMAP - Supervisor Mode Access Prevention Enable
|
|
||||||
;; CR4_PKE - Protection Key Enable
|
|
||||||
;; CR4_CET - Control-flow Enforcement Technology
|
|
||||||
;; CR4_PKS - Enable Protection Keys for Supervisor-Mode Pages
|
|
||||||
CR4_VME equ 1 << 0
|
|
||||||
CR4_PVI equ 1 << 1
|
|
||||||
CR4_TSD equ 1 << 2
|
|
||||||
CR4_DE equ 1 << 3
|
|
||||||
CR4_PSE equ 1 << 4
|
|
||||||
CR4_PAE equ 1 << 5
|
|
||||||
CR4_MCE equ 1 << 6
|
|
||||||
CR4_PGE equ 1 << 7
|
|
||||||
CR4_PCE equ 1 << 8
|
|
||||||
CR4_OSDXSR equ 1 << 9
|
|
||||||
CR4_OSXMMEXCPT equ 1 << 10
|
|
||||||
CR4_UMIP equ 1 << 11
|
|
||||||
CR4_VMXE equ 1 << 13
|
|
||||||
CR4_SMXE equ 1 << 14
|
|
||||||
CR4_FSGSBASE equ 1 << 16
|
|
||||||
CR4_PCIDE equ 1 << 17
|
|
||||||
CR4_OSXSAVE equ 1 << 18
|
|
||||||
CR4_SMEP equ 1 << 20
|
|
||||||
CR4_SMAP equ 1 << 21
|
|
||||||
CR4_PKE equ 1 << 22
|
|
||||||
CR4_CET equ 1 << 23
|
|
||||||
CR4_PKS equ 1 << 24
|
|
||||||
|
|
||||||
;; =========================================================================
|
|
||||||
;; eflags
|
|
||||||
;; =========================================================================
|
|
||||||
|
|
||||||
;; Defines: EFLAGS
|
|
||||||
;; EFLAGS_CF - Carry flag
|
|
||||||
;; EFLAGS_PF - Parity flag
|
|
||||||
;; EFLAGS_AF - Auxiliary flag
|
|
||||||
;; EFLAGS_ZF - Zero flag
|
|
||||||
;; EFLAGS_SF - Sign flag
|
|
||||||
;; EFLAGS_TF - Trap flag
|
|
||||||
;; EFLAGS_IF - Interrupt enable flag
|
|
||||||
;; EFLAGS_DF - Direction flag
|
|
||||||
;; EFLAGS_OF - Overflow flag
|
|
||||||
;; EFLAGS_IOPL1 - I/O privilege flag
|
|
||||||
;; EFLAGS_IOPL2 - I/O privilege flag
|
|
||||||
;; EFLAGS_NT - Nested task flag
|
|
||||||
;; EFLAGS_RF - Resume flag
|
|
||||||
;; EFLAGS_VM - Virtual 8086 mode flag
|
|
||||||
;; EFLAGS_AC - Alignment check
|
|
||||||
;; EFLAGS_VIF - Virtual Interrupt flag
|
|
||||||
;; EFLAGS_VIP - Virtual Interrupt pending
|
|
||||||
;; EFLAGS_ID - CPUID instruction available
|
|
||||||
EFLAGS_CF equ 1 << 0
|
|
||||||
EFLAGS_PF equ 1 << 2
|
|
||||||
EFLAGS_AF equ 1 << 4
|
|
||||||
EFLAGS_ZF equ 1 << 6
|
|
||||||
EFLAGS_SF equ 1 << 7
|
|
||||||
EFLAGS_TF equ 1 << 8
|
|
||||||
EFLAGS_IF equ 1 << 9
|
|
||||||
EFLAGS_DF equ 1 << 10
|
|
||||||
EFLAGS_OF equ 1 << 11
|
|
||||||
EFLAGS_IOPL1 equ 1 << 12
|
|
||||||
EFLAGS_IOPL2 equ 1 << 13
|
|
||||||
EFLAGS_NT equ 1 << 14
|
|
||||||
EFLAGS_RF equ 1 << 16
|
|
||||||
EFLAGS_VM equ 1 << 17
|
|
||||||
EFLAGS_AC equ 1 << 18
|
|
||||||
EFLAGS_VIF equ 1 << 19
|
|
||||||
EFLAGS_VIP equ 1 << 20
|
|
||||||
EFLAGS_ID equ 1 << 21
|
|
|
@ -1,99 +0,0 @@
|
||||||
;; File: task.inc
|
|
||||||
;;
|
|
||||||
|
|
||||||
;; Structure: tss
|
|
||||||
;;
|
|
||||||
;; > 31 23 15 7 0
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x64 | I/O map base | 00000000 0000000T |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x60 | 00000000 00000000 | LDT |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x5c | 00000000 00000000 | GS |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x58 | 00000000 00000000 | FS |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x54 | 00000000 00000000 | DS |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x50 | 00000000 00000000 | SS |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x4C | 00000000 00000000 | CS |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x48 | 00000000 00000000 | ES |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x44 | EDI |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x40 | ESI |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x3C | EBP |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x38 | ESP |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x34 | EBX |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x30 | EDX |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x2C | ECX |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x28 | EAX |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x24 | EFLAGS |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x20 | EIP |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x1C | CR3 |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x18 | 00000000 00000000 | SS2 |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x14 | ESP2 |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x10 | 00000000 00000000 | SS1 |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x0C | ESP1 |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x08 | 00000000 00000000 | SS0 |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x04 | ESP0 |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
;; > 0x00 | 00000000 00000000 | old TSS selector |
|
|
||||||
;; > +----------|----------+----------|----------+
|
|
||||||
struc tss
|
|
||||||
.link: resw 1
|
|
||||||
resw 1
|
|
||||||
.esp0: resd 1
|
|
||||||
.ss0: resw 1
|
|
||||||
resw 1
|
|
||||||
.esp1: resd 1
|
|
||||||
.ss1: resw 1
|
|
||||||
resw 1
|
|
||||||
.esp2: resd 1
|
|
||||||
.ss2: resw 1
|
|
||||||
resw 1
|
|
||||||
.cr3: resd 1
|
|
||||||
.eip: resd 1
|
|
||||||
.eflags: resd 1
|
|
||||||
.eax: resd 1
|
|
||||||
.ecx: resd 1
|
|
||||||
.edx: resd 1
|
|
||||||
.ebx: resd 1
|
|
||||||
.esp: resd 1
|
|
||||||
.ebp: resd 1
|
|
||||||
.esi: resd 1
|
|
||||||
.edi: resd 1
|
|
||||||
.es: resw 1
|
|
||||||
resw 1
|
|
||||||
.cs: resw 1
|
|
||||||
resw 1
|
|
||||||
.ss: resw 1
|
|
||||||
resw 1
|
|
||||||
.ds: resw 1
|
|
||||||
resw 1
|
|
||||||
.fs: resw 1
|
|
||||||
resw 1
|
|
||||||
.gs: resw 1
|
|
||||||
resw 1
|
|
||||||
.ldtr: resw 1
|
|
||||||
resw 1
|
|
||||||
.iopb: resw 1
|
|
||||||
resw 1
|
|
||||||
endstruc
|
|
|
@ -1,140 +0,0 @@
|
||||||
; File: multiboot.inc
|
|
||||||
|
|
||||||
; Define: MB_HDR_MAGIC
|
|
||||||
; Multiboot Header Magic
|
|
||||||
MB_HDR_MAGIC equ 0x1BADB002
|
|
||||||
|
|
||||||
; Define: MB_MAGIC
|
|
||||||
; Multiboot Magic passed by the bootloader.
|
|
||||||
MB_MAGIC equ 0x2BADB002
|
|
||||||
|
|
||||||
; Structure: mb_header
|
|
||||||
;
|
|
||||||
; .magic - todo
|
|
||||||
; .flags - See <flags>
|
|
||||||
; .checksum - todo
|
|
||||||
; .aout_kludge - todo
|
|
||||||
; .mode_type - todo
|
|
||||||
; .width - todo
|
|
||||||
; .height - todo
|
|
||||||
; .depth - todo
|
|
||||||
struc mb_header
|
|
||||||
.magic: resd 1
|
|
||||||
.flags: resd 1
|
|
||||||
.checksum: resd 1
|
|
||||||
.aout_kludge: resd 5
|
|
||||||
.mode_type: resd 1
|
|
||||||
.width: resd 1
|
|
||||||
.height: resd 1
|
|
||||||
.depth: resd 1
|
|
||||||
endstruc
|
|
||||||
|
|
||||||
; Defines: flags
|
|
||||||
;
|
|
||||||
; MB_HDR_ALIGN - todo
|
|
||||||
; MB_HDR_MEMINFO - <mb_info.mem_lower>
|
|
||||||
; MB_HDR_VIDEO - todo
|
|
||||||
MB_HDR_ALIGN equ 1 << 0
|
|
||||||
MB_HDR_MEMINFO equ 1 << 1
|
|
||||||
MB_HDR_VIDEO equ 1 << 2
|
|
||||||
|
|
||||||
; Structure: mb_info
|
|
||||||
;
|
|
||||||
; Fields:
|
|
||||||
; .flags - See <flags>
|
|
||||||
; .mem_lower - todo
|
|
||||||
; .mem_upper - todo
|
|
||||||
; .boot_device - todo
|
|
||||||
; .
|
|
||||||
struc mb_info
|
|
||||||
|
|
||||||
;; flags
|
|
||||||
.flags: resd 1
|
|
||||||
|
|
||||||
;; flags[0] is set
|
|
||||||
.mem_lower: resd 1
|
|
||||||
.mem_upper: resd 1
|
|
||||||
|
|
||||||
;; flags[1] is set
|
|
||||||
.boot_device: resd 1
|
|
||||||
|
|
||||||
;; flags[2] is set
|
|
||||||
.cmdline: resd 1
|
|
||||||
|
|
||||||
;; flags[3] is set
|
|
||||||
.mods_count: resd 1
|
|
||||||
.mods_addr: resd 1
|
|
||||||
|
|
||||||
;; flags[4] || flags[4] is set
|
|
||||||
.syms: resd 4
|
|
||||||
|
|
||||||
;; flags[6] is set
|
|
||||||
.mmap_length: resd 1
|
|
||||||
; <mb_info.mmap_length>
|
|
||||||
; see <mb_mmap>
|
|
||||||
.mmap_addr: resd 1
|
|
||||||
|
|
||||||
;; flags[7] is set
|
|
||||||
.drives_length: resd 1
|
|
||||||
.drives_addr: resd 1
|
|
||||||
|
|
||||||
;; flags[8] is set
|
|
||||||
.config_table: resd 1
|
|
||||||
|
|
||||||
;; flags[9] is set
|
|
||||||
.bootloader_name: resd 1
|
|
||||||
|
|
||||||
;; flags[10] is set
|
|
||||||
.apm_table: resd 1
|
|
||||||
|
|
||||||
;;
|
|
||||||
.vbe_control_info: resd 1
|
|
||||||
.vbe_mode_info: resd 1
|
|
||||||
.vbe_mode: resw 1
|
|
||||||
.vbe_interface_seg: resw 1
|
|
||||||
.vbe_interface_off: resw 1
|
|
||||||
.vbe_interface_len: resw 1
|
|
||||||
|
|
||||||
.framebuffer_addr: resq 1
|
|
||||||
.framebuffer_pitch: resd 1
|
|
||||||
.framebuffer_width: resd 1
|
|
||||||
.framebuffer_height: resd 1
|
|
||||||
.framebuffer_bpp: resb 1
|
|
||||||
.framebuffer_type: resb 1
|
|
||||||
.framebuffer_misc: resw 3
|
|
||||||
endstruc
|
|
||||||
|
|
||||||
; Defines: flags
|
|
||||||
;
|
|
||||||
; MB_INFO_MEM - todo
|
|
||||||
; MB_INFO_BOOTDEV - todo
|
|
||||||
MB_INFO_MEM equ 1 << 0
|
|
||||||
MB_INFO_BOOTDEV equ 1 << 1
|
|
||||||
MB_INFO_CMDLINE equ 1 << 2
|
|
||||||
MB_INFO_MODULES equ 1 << 3
|
|
||||||
MB_INFO_MMAP equ 1 << 6
|
|
||||||
MB_INFO_DRIVES equ 1 << 7
|
|
||||||
MB_INFO_BOOTLOADER_NAME equ 1 << 9
|
|
||||||
MB_INFO_VBE equ 1 << 11
|
|
||||||
MB_INFO_FRAMEBUFFER equ 1 << 12
|
|
||||||
|
|
||||||
; Structure: mb_mmap
|
|
||||||
struc mb_mmap
|
|
||||||
.size: resd 1
|
|
||||||
.addr: resq 1
|
|
||||||
.length: resq 1
|
|
||||||
.type: resd 1
|
|
||||||
endstruc
|
|
||||||
|
|
||||||
; Defines: types
|
|
||||||
;
|
|
||||||
; MB_MEMORY_AVAILABLE - 1
|
|
||||||
; MB_MEMORY_RESERVED - 2
|
|
||||||
; MB_MEMORY_ACPI - 3
|
|
||||||
; MB_MEMORY_NVS - 4
|
|
||||||
; MB_MEMORY_BADRAM - 5
|
|
||||||
%define MB_MEMORY_AVAILABLE 1
|
|
||||||
%define MB_MEMORY_RESERVED 2
|
|
||||||
%define MB_MEMORY_ACPI 3
|
|
||||||
%define MB_MEMORY_NVS 4
|
|
||||||
%define MB_MEMORY_BADRAM 5
|
|
|
@ -1,11 +0,0 @@
|
||||||
[BITS 32]
|
|
||||||
|
|
||||||
global syscall_table
|
|
||||||
syscall_table:
|
|
||||||
dd 0 ; sys_exit
|
|
||||||
dd 0 ; sys_fork
|
|
||||||
dd 0 ; sys_read
|
|
||||||
dd 0 ; sys_write
|
|
||||||
dd 0 ; sys_open
|
|
||||||
dd 0 ; sys_close
|
|
||||||
.end:
|
|
|
@ -1,46 +0,0 @@
|
||||||
;; File: pmap.s
|
|
||||||
;; Physical Memory Map
|
|
||||||
|
|
||||||
;; Structure: pmap_block
|
|
||||||
;;
|
|
||||||
;; .next - pointer to next pmap_block struct
|
|
||||||
;; .phys_start - start physical address of memory range
|
|
||||||
;; .phys_end - stop address of memory range
|
|
||||||
;; .bitmap_size - bitmap size (max: 0xFF0)
|
|
||||||
;; .last_alloc - last allocated frame in bitmap
|
|
||||||
;; .bitmap - bitmap array
|
|
||||||
;;
|
|
||||||
;; > pmap_block
|
|
||||||
;; > 0x0000 +-------------+
|
|
||||||
;; > | next |-----> pmap_block
|
|
||||||
;; > 0x0004 +-------------+ +----------+
|
|
||||||
;; > | phys start | | next |----> NULL (0x0)
|
|
||||||
;; > 0x0008 +-------------+ +----------+
|
|
||||||
;; > | phys end | | ..... |
|
|
||||||
;; > 0x000C +-------------+ | ..... |
|
|
||||||
;; > | bitmap size | | ..... |
|
|
||||||
;; > 0x000e +-------------+ +----------+
|
|
||||||
;; > | last alloc |
|
|
||||||
;; > 0x0010 +-------------+
|
|
||||||
;; > | bitmap |
|
|
||||||
;; > 0x???? +-------------+ (bitmap size * 4)
|
|
||||||
;;
|
|
||||||
struct pmap_block
|
|
||||||
.next: resd 1
|
|
||||||
.phys_start: resd 1
|
|
||||||
.phys_end: resd 1
|
|
||||||
.bitmap_size: resw 1
|
|
||||||
.last_alloc: resw 1
|
|
||||||
.bitmap:
|
|
||||||
endstruc
|
|
||||||
|
|
||||||
section .text
|
|
||||||
;; Function: pmap_bootstrap
|
|
||||||
;;
|
|
||||||
;; (see pmap_bootstrap.png)
|
|
||||||
pmap_bootstrap:
|
|
||||||
push esp
|
|
||||||
mov esp, ebp
|
|
||||||
|
|
||||||
leave
|
|
||||||
ret
|
|
|
@ -1,60 +0,0 @@
|
||||||
;; File: vm.inc
|
|
||||||
;; Stupid OS virtual Memory manager
|
|
||||||
;;
|
|
||||||
;; About: Memory Management
|
|
||||||
;;
|
|
||||||
;; Terminology:
|
|
||||||
;; VA - Virtual Address
|
|
||||||
;; PA - Physical Address
|
|
||||||
;; PDE - Page Directory Entry
|
|
||||||
;; PTE - Page Table Entry
|
|
||||||
;;
|
|
||||||
;; Memory Layout:
|
|
||||||
;;
|
|
||||||
;; Virtual Memory above `0xC0000000` is mapped as kernel only <PTE_U> flags
|
|
||||||
;;
|
|
||||||
;; > Virtual
|
|
||||||
;; > 0xFFFFFFFF +---------------+
|
|
||||||
;; > | |
|
|
||||||
;; > | Device Memory |
|
|
||||||
;; > | |
|
|
||||||
;; > +---------------+
|
|
||||||
;; > | |
|
|
||||||
;; > | Kernel Heap |
|
|
||||||
;; > | |
|
|
||||||
;; > KERN_END +---------------+
|
|
||||||
;; > | |
|
|
||||||
;; > | Stupid Kernel |
|
|
||||||
;; > | |
|
|
||||||
;; > 0xC0100000 +---------------+
|
|
||||||
;; > | I/O Space and |
|
|
||||||
;; > | phys memory |
|
|
||||||
;; > | Lower than 1M | kernel mode only
|
|
||||||
;; > 0xC0000000 +---------------+
|
|
||||||
;; > | | user mode
|
|
||||||
;; > | userspace |
|
|
||||||
;; > | |
|
|
||||||
;; > 0x00000000 +---------------+
|
|
||||||
;;
|
|
||||||
;; Page Frame Allocator
|
|
||||||
;;
|
|
||||||
%define K2P(addr) (addr - KERNBASE)
|
|
||||||
%define P2K(addr) (addr + KERNBASE)
|
|
||||||
|
|
||||||
struc vm_kmap
|
|
||||||
.virt: resd 1
|
|
||||||
.phys_start: resd 1
|
|
||||||
.phys_stop: resd 1
|
|
||||||
.access: resb 1
|
|
||||||
endstruc
|
|
||||||
|
|
||||||
struc vm_map
|
|
||||||
.pmap: resd 1
|
|
||||||
|
|
||||||
endstruc
|
|
||||||
|
|
||||||
struc
|
|
||||||
.directory: resd 1
|
|
||||||
.ref_count: resd 1
|
|
||||||
|
|
||||||
endstruc
|
|
12
lib/Makefile
12
lib/Makefile
|
@ -1,3 +1,11 @@
|
||||||
SUBDIR = base crypto
|
SUBDIRS = crypto
|
||||||
|
|
||||||
include $(TOPDIR)/share/mk/stupid.subdir.mk
|
TOPGOALS = all clean install
|
||||||
|
|
||||||
|
.PHONY: $(SUBDIRS)
|
||||||
|
$(SUBDIRS):
|
||||||
|
@echo "📁 lib/$@"
|
||||||
|
DESTDIR=$(DESTDIR)/lib $(MAKE) -C $@ $(MAKECMDGOALS)
|
||||||
|
|
||||||
|
.PHONY: $(TOPGOALS)
|
||||||
|
$(TOPGOALS): $(SUBDIRS)
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
LIB = base
|
|
||||||
SRCS = log.s
|
|
||||||
INCS = base.inc
|
|
||||||
|
|
||||||
include $(TOPDIR)/share/mk/stupid.lib.mk
|
|
||||||
#include $(TOPDIR)/share/mk/stupid.inc.mk
|
|
|
@ -1,26 +0,0 @@
|
||||||
; file: base.inc
|
|
||||||
|
|
||||||
extern log_impl
|
|
||||||
|
|
||||||
; macro: LOG
|
|
||||||
;
|
|
||||||
; example:
|
|
||||||
; (start code)
|
|
||||||
; LOG msg_boot_info, eax
|
|
||||||
; (end)
|
|
||||||
%macro LOG 1-*
|
|
||||||
%ifdef DEBUG
|
|
||||||
%rep %0
|
|
||||||
%rotate -1
|
|
||||||
push %1
|
|
||||||
%endrep
|
|
||||||
push file
|
|
||||||
|
|
||||||
call log_impl
|
|
||||||
|
|
||||||
add esp, 4
|
|
||||||
%rep %0
|
|
||||||
add esp, 4
|
|
||||||
%endrep
|
|
||||||
%endif
|
|
||||||
%endmacro
|
|
158
lib/base/log.s
158
lib/base/log.s
|
@ -1,158 +0,0 @@
|
||||||
; file: log.s
|
|
||||||
[BITS 32]
|
|
||||||
|
|
||||||
%ifdef __KERNEL__
|
|
||||||
extern serial_write
|
|
||||||
%endif
|
|
||||||
|
|
||||||
section .text
|
|
||||||
; Function: putstr
|
|
||||||
;
|
|
||||||
putstr:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
push edi
|
|
||||||
mov edi, [ebp + 8]
|
|
||||||
|
|
||||||
.loop:
|
|
||||||
mov eax, [edi]
|
|
||||||
cmp al, 0
|
|
||||||
je .end
|
|
||||||
push eax
|
|
||||||
%ifdef __KERNEL__
|
|
||||||
call serial_write
|
|
||||||
%else
|
|
||||||
%endif
|
|
||||||
add esp, 4
|
|
||||||
inc edi
|
|
||||||
jmp .loop
|
|
||||||
.end:
|
|
||||||
pop edi
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
; Function: puthex
|
|
||||||
;
|
|
||||||
puthex:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
push edi
|
|
||||||
push esi
|
|
||||||
mov edi, [ebp + 8] ; number
|
|
||||||
|
|
||||||
mov eax, hexprefix
|
|
||||||
push hexprefix
|
|
||||||
call putstr
|
|
||||||
add esp, 4
|
|
||||||
|
|
||||||
mov edx, 0xF
|
|
||||||
mov ecx, 0x8
|
|
||||||
mov esi, buffer
|
|
||||||
.loop:
|
|
||||||
rol edi, 4
|
|
||||||
mov eax, edi
|
|
||||||
and eax, edx
|
|
||||||
mov al, [digits + eax]
|
|
||||||
mov [esi], al
|
|
||||||
inc esi
|
|
||||||
dec ecx
|
|
||||||
jnz .loop
|
|
||||||
|
|
||||||
mov eax, buffer
|
|
||||||
push eax
|
|
||||||
call putstr
|
|
||||||
add esp, 4
|
|
||||||
|
|
||||||
pop esi
|
|
||||||
pop edi
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
; Function: log_impl
|
|
||||||
;
|
|
||||||
global log_impl
|
|
||||||
log_impl:
|
|
||||||
push ebp
|
|
||||||
mov ebp, esp
|
|
||||||
push edi
|
|
||||||
push esi
|
|
||||||
push ebx
|
|
||||||
mov eax, [ebp + 8]
|
|
||||||
|
|
||||||
push eax
|
|
||||||
call putstr
|
|
||||||
add esp, 4
|
|
||||||
|
|
||||||
%ifdef __KERNEL__
|
|
||||||
mov eax, ':'
|
|
||||||
push eax
|
|
||||||
call serial_write
|
|
||||||
add esp, 4
|
|
||||||
%else
|
|
||||||
%endif
|
|
||||||
|
|
||||||
mov edi, [ebp + 12]
|
|
||||||
mov esi, 12
|
|
||||||
.loop:
|
|
||||||
mov eax, [edi]
|
|
||||||
cmp al, 0
|
|
||||||
je .end
|
|
||||||
cmp al, '%'
|
|
||||||
jne .putchar
|
|
||||||
inc edi
|
|
||||||
mov eax, [edi]
|
|
||||||
cmp al, '%'
|
|
||||||
je .next
|
|
||||||
cmp al, 'x'
|
|
||||||
jne .check_s
|
|
||||||
add esi, 4
|
|
||||||
mov ebx, ebp
|
|
||||||
add ebx, esi
|
|
||||||
mov eax, [ebx]
|
|
||||||
push eax
|
|
||||||
call puthex
|
|
||||||
add esp, 4
|
|
||||||
jmp .next
|
|
||||||
.check_s:
|
|
||||||
cmp al, 's'
|
|
||||||
jne .unknown_format
|
|
||||||
add esi, 4
|
|
||||||
mov ebx, ebp
|
|
||||||
add ebx, esi
|
|
||||||
mov eax, [ebx]
|
|
||||||
push eax
|
|
||||||
call putstr
|
|
||||||
add esp, 4
|
|
||||||
jmp .next
|
|
||||||
.unknown_format:
|
|
||||||
mov al, '?'
|
|
||||||
.putchar:
|
|
||||||
push eax
|
|
||||||
%ifdef __KERNEL__
|
|
||||||
call serial_write
|
|
||||||
%else
|
|
||||||
;; TODO
|
|
||||||
%endif
|
|
||||||
add esp, 4
|
|
||||||
.next:
|
|
||||||
inc edi
|
|
||||||
jmp .loop
|
|
||||||
.end:
|
|
||||||
|
|
||||||
;; print new line
|
|
||||||
%ifdef __KERNEL__
|
|
||||||
mov al, 0xA
|
|
||||||
push eax
|
|
||||||
call serial_write
|
|
||||||
add esp, 4
|
|
||||||
%else
|
|
||||||
%endif
|
|
||||||
pop ebx
|
|
||||||
pop esi
|
|
||||||
pop edi
|
|
||||||
leave
|
|
||||||
ret
|
|
||||||
|
|
||||||
digits db '0123456789ABCDEF'
|
|
||||||
hexprefix db '0x', 0
|
|
||||||
buffer db '00000000', 0
|
|
|
@ -1,4 +1,5 @@
|
||||||
LIB = crypto
|
all:
|
||||||
SRCS = hash/sha256.s
|
|
||||||
|
|
||||||
include $(TOPDIR)/share/mk/stupid.lib.mk
|
clean:
|
||||||
|
|
||||||
|
install:
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
# File: stupid.clean.mk
|
|
||||||
#
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(RM) $(CLEANFILES)
|
|
|
@ -1,9 +0,0 @@
|
||||||
include $(TOPDIR)/share/mk/stupid.own.mk
|
|
||||||
|
|
||||||
ifdef INCS
|
|
||||||
|
|
||||||
install::
|
|
||||||
$(INSTALL) -d $(DESTDIR)$(INCSDIR)
|
|
||||||
$(INSTALL) $^ $(DESTDIR)$(INCSDIR)
|
|
||||||
|
|
||||||
endif
|
|
|
@ -1,45 +0,0 @@
|
||||||
# File: stupid.kernel.mk
|
|
||||||
#
|
|
||||||
include $(TOPDIR)/share/mk/stupid.own.mk
|
|
||||||
|
|
||||||
ifdef KERNEL
|
|
||||||
|
|
||||||
KERNBASE ?= 0xC0000000
|
|
||||||
|
|
||||||
ASFLAGS += -D__KERNEL__ -I$(TOPDIR)/kernel -DKERNBASE=$(KERNBASE) \
|
|
||||||
-I$(TOPDIR)/lib/base
|
|
||||||
|
|
||||||
OBJS = $(addsuffix .o, $(basename $(SRCS)))
|
|
||||||
OBJS-dbg = $(addsuffix .dbg.o, $(basename $(SRCS)))
|
|
||||||
|
|
||||||
CLEANFILES += $(KERNEL) $(KERNEL)-dbg $(OBJS) $(OBJS-dbg)
|
|
||||||
|
|
||||||
$(KERNEL): $(OBJS)
|
|
||||||
$(LD) -T $(TOPDIR)/kernel/linker.ld -nostdlib -o $@ $^
|
|
||||||
|
|
||||||
$(KERNEL)-dbg: $(OBJS-dbg)
|
|
||||||
$(LD) -T $(TOPDIR)/kernel/linker.ld -nostdlib -o $@ $^
|
|
||||||
|
|
||||||
%.o: %.s
|
|
||||||
$(AS) $(ASFLAGS) -o $@ $<
|
|
||||||
|
|
||||||
%.dbg.o: %.s
|
|
||||||
$(AS) $(ASFLAGS) $(ASDBGFLAGS) -o $@ $<
|
|
||||||
|
|
||||||
lib/%.o: ../lib/base/%.s
|
|
||||||
@$(MKCWD)
|
|
||||||
$(AS) $(ASFLAGS) -o $@ $<
|
|
||||||
|
|
||||||
lib/%.dbg.o: ../lib/base/%.s
|
|
||||||
@$(MKCWD)
|
|
||||||
$(AS) $(ASFLAGS) $(ASDBGFLAGS) -o $@ $<
|
|
||||||
|
|
||||||
all: $(KERNEL) $(KERNEL)-dbg
|
|
||||||
|
|
||||||
install:: $(KERNEL) $(KERNEL)-dbg
|
|
||||||
$(INSTALL) -d $(DESTDIR)/
|
|
||||||
$(INSTALL) $^ $(DESTDIR)/
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
include $(TOPDIR)/share/mk/stupid.clean.mk
|
|
|
@ -1,37 +0,0 @@
|
||||||
# File: stupid.lib.mk
|
|
||||||
# Support for building libraries
|
|
||||||
|
|
||||||
include $(TOPDIR)/share/mk/stupid.own.mk
|
|
||||||
|
|
||||||
ifdef LIB
|
|
||||||
|
|
||||||
CLEANFILES += lib$(LIB).a
|
|
||||||
|
|
||||||
ifdef SRCS
|
|
||||||
|
|
||||||
OBJS += $(addsuffix .o, $(basename $(SRCS)))
|
|
||||||
|
|
||||||
CLEANFILES += $(OBJS)
|
|
||||||
|
|
||||||
lib$(LIB).a: $(OBJS)
|
|
||||||
$(AR) rcs $@ $^
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
CLEANFILES += $(LIB).o
|
|
||||||
|
|
||||||
lib$(LIB).a: $(LIB).o
|
|
||||||
$(AR) rcs $@ $^
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
all: lib$(LIB).a
|
|
||||||
|
|
||||||
install:: lib$(LIB).a
|
|
||||||
$(INSTALL) -d $(DESTDIR)$(LIBDIR)
|
|
||||||
$(INSTALL) $< $(DESTDIR)$(LIBDIR)
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
include $(TOPDIR)/share/mk/stupid.clean.mk
|
|
||||||
include $(TOPDIR)/share/mk/stupid.sys.mk
|
|
|
@ -1,33 +0,0 @@
|
||||||
# File: stupid.own.mk
|
|
||||||
# Define common variables
|
|
||||||
ifndef _STUPID_OWN_MK_
|
|
||||||
_STUPID_OWN_MK_=1
|
|
||||||
|
|
||||||
.DEFAULT_GOAL := all
|
|
||||||
|
|
||||||
BINDIR = /bin
|
|
||||||
LIBDIR = /lib
|
|
||||||
|
|
||||||
CC = clang -target i386-none-elf
|
|
||||||
CXX = clang++ -target i386-none-elf
|
|
||||||
|
|
||||||
AS = nasm
|
|
||||||
LD = ld.lld
|
|
||||||
PLSCC = plsc
|
|
||||||
OBJCOPY = llvm-objcopy
|
|
||||||
OBJDUMP = llvm-objdump
|
|
||||||
INSTALL = install
|
|
||||||
|
|
||||||
MKCWD = mkdir -p $(@D)
|
|
||||||
|
|
||||||
TARGETS = all clean install
|
|
||||||
.PHONY: $(TARGETS)
|
|
||||||
|
|
||||||
EXTRAFLAGS = -DSTUPID_VERSION="\"0.0\"" -D__STUPID__
|
|
||||||
|
|
||||||
CFLAGS += -Wall -Werror -Wextra $(EXTRAFLAGS)
|
|
||||||
CXXFLAGS += -Wall -Werror -Wextra $(EXTRAFLAGS)
|
|
||||||
ASFLAGS += -felf -I$(TOPDIR)/lib $(EXTRAFLAGS)
|
|
||||||
ASDBGFLAGS += -F dwarf -g -DDEBUG
|
|
||||||
|
|
||||||
endif
|
|
|
@ -1,45 +0,0 @@
|
||||||
# File: stupid.prog.mk
|
|
||||||
# Building programs from source files
|
|
||||||
#
|
|
||||||
# targets:
|
|
||||||
# - all:
|
|
||||||
# build the program and its manual page.
|
|
||||||
# - clean:
|
|
||||||
# remove the program and any object files.
|
|
||||||
# - install:
|
|
||||||
# install the program and its manual page.
|
|
||||||
|
|
||||||
include $(TOPDIR)/share/mk/stupid.own.mk
|
|
||||||
|
|
||||||
ifdef PROG
|
|
||||||
|
|
||||||
CLEANFILES += $(PROG)
|
|
||||||
|
|
||||||
ifdef SRCS
|
|
||||||
|
|
||||||
OBJS += $(addsuffix .o, $(basename $(SRCS)))
|
|
||||||
|
|
||||||
CLEANFILES += $(OBJS)
|
|
||||||
|
|
||||||
$(PROG): $(OBJS)
|
|
||||||
$(CC) $(CFLAGS) -o $@ $^ $(LDADD)
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
CLEANFILES += $(PROG).o
|
|
||||||
|
|
||||||
$(PROG): $(PROG).o
|
|
||||||
$(CC) $(CFLAGS) -o $@ $< $(LDADD)
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
all: $(PROG)
|
|
||||||
|
|
||||||
install:: $(PROG)
|
|
||||||
$(INSTALL) -d $(DESTDIR)$(LIBDIR)
|
|
||||||
$(INSTALL) $< $(DESTDIR)$(LIBDIR)
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
include $(TOPDIR)/share/mk/stupid.clean.mk
|
|
||||||
include $(TOPDIR)/share/mk/stupid.sys.mk
|
|
|
@ -1,20 +0,0 @@
|
||||||
# File: stupid.subdir.mk
|
|
||||||
# Targets for building subdirectories
|
|
||||||
|
|
||||||
.DEFAULT_GOAL := all
|
|
||||||
TOPGOALS = all clean install
|
|
||||||
|
|
||||||
ifndef NOSUBDIR
|
|
||||||
|
|
||||||
.PHONY: $(SUBDIR)
|
|
||||||
$(SUBDIR):
|
|
||||||
$(MAKE) -C $@ $(MAKECMDGOALS)
|
|
||||||
|
|
||||||
$(TOPGOALS): $(SUBDIR)
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
# ensure target exist
|
|
||||||
$(TOPGOALS):
|
|
||||||
|
|
||||||
endif
|
|
|
@ -1,19 +0,0 @@
|
||||||
# File: stupid.sys.mk
|
|
||||||
|
|
||||||
%.o: %.c
|
|
||||||
$(CC) -c -o $@ $< $(CFLAGS)
|
|
||||||
|
|
||||||
%.o: %.cc
|
|
||||||
$(CXX) -c -o $@ $< $(CXXFLAGS)
|
|
||||||
|
|
||||||
%.o: %.cpp
|
|
||||||
$(CXX) -c -o $@ $< $(CXXFLAGS)
|
|
||||||
|
|
||||||
%.o: %.cxx
|
|
||||||
$(CXX) -c -o $@ $< $(CXXFLAGS)
|
|
||||||
|
|
||||||
%.o: %.C
|
|
||||||
$(CXX) -c -o $@ $< $(CXXFLAGS)
|
|
||||||
|
|
||||||
%.o: %.s
|
|
||||||
$(AS) $(ASFLAGS) -o $@ $<
|
|
3
thirdparty/Makefile
vendored
3
thirdparty/Makefile
vendored
|
@ -1,3 +0,0 @@
|
||||||
NOSUBDIR := 1
|
|
||||||
|
|
||||||
include $(TOPDIR)/share/mk/stupid.subdir.mk
|
|
|
@ -12,12 +12,6 @@ menuentry "StupidOS" {
|
||||||
boot
|
boot
|
||||||
}
|
}
|
||||||
|
|
||||||
menuentry "StupidOS (debug)" {
|
|
||||||
hashsum --hash sha256 --check /boot/hashfile --prefix /
|
|
||||||
multiboot /vmstupid-dbg "lang=en"
|
|
||||||
boot
|
|
||||||
}
|
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -25,7 +19,6 @@ gen_iso_file() {
|
||||||
mkdir -p "$2/boot/grub"
|
mkdir -p "$2/boot/grub"
|
||||||
echo "$grub_config" > "$2/boot/grub/grub.cfg"
|
echo "$grub_config" > "$2/boot/grub/grub.cfg"
|
||||||
sha256sum "$2/vmstupid" > "$2/boot/hashfile"
|
sha256sum "$2/vmstupid" > "$2/boot/hashfile"
|
||||||
sha256sum "$2/vmstupid-dbg" >> "$2/boot/hashfile"
|
|
||||||
|
|
||||||
grub-mkrescue -o $1 $2
|
grub-mkrescue -o $1 $2
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue