fix: multiboot in stpdboot.sys
Some checks are pending
Build / test (push) Waiting to run
Docs / test (push) Waiting to run

This commit is contained in:
d0p1 🏳️‍⚧️ 2024-03-20 10:48:47 +01:00
parent 6b36d17a5e
commit 9aaad60e6e
6 changed files with 383 additions and 374 deletions

132
Makefile
View file

@ -1,66 +1,66 @@
.EXPORT_ALL_VARIABLES: .EXPORT_ALL_VARIABLES:
TOPDIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST)))) TOPDIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
SYSROOTDIR := $(TOPDIR)/sysroot SYSROOTDIR := $(TOPDIR)/sysroot
TOOLSDIR := $(TOPDIR)/tools TOOLSDIR := $(TOPDIR)/tools
RM = echo RM = echo
MK_BUGREPORT := \"https://git.cute.engineering/d0p1/StupidOS/issues\" MK_BUGREPORT := \"https://git.cute.engineering/d0p1/StupidOS/issues\"
MK_COMMIT := \"$(shell git rev-parse --short HEAD)\" MK_COMMIT := \"$(shell git rev-parse --short HEAD)\"
SUBDIRS := tools boot kernel lib bin SUBDIRS := tools boot kernel lib bin
TARGET = stupid.tar.gz floppy_boot.img TARGET = stupid.tar.gz floppy_boot.img
ifneq ($(OS),Windows_NT) ifneq ($(OS),Windows_NT)
EXEXT = EXEXT =
TARGET += stupid.iso stdupid.hdd TARGET += stupid.iso stupid.hdd
else else
EXEXT = .exe EXEXT = .exe
endif endif
.PHONY: all .PHONY: all
all: $(TARGET) all: $(TARGET)
GOAL:=install GOAL:=install
clean: GOAL:=clean clean: GOAL:=clean
.PHONY: $(SUBDIRS) .PHONY: $(SUBDIRS)
$(SUBDIRS): $(SUBDIRS):
@echo "📁 $@" @echo "📁 $@"
DESTDIR=$(SYSROOTDIR) $(MAKE) -C $@ $(GOAL) DESTDIR=$(SYSROOTDIR) $(MAKE) -C $@ $(GOAL)
.PHONY: stupid.iso .PHONY: stupid.iso
stupid.iso: $(SUBDIRS) stupid.iso: $(SUBDIRS)
$(TOPDIR)/tools/create-iso $@ sysroot $(TOPDIR)/tools/create-iso $@ sysroot
.PHONY: stupid.hdd .PHONY: stupid.hdd
stupid.hdd: $(SUBDIRS) stupid.hdd: $(SUBDIRS)
@echo "" @echo ""
.PHONY: stupid.tar.gz .PHONY: stupid.tar.gz
stupid.tar.gz: $(SUBDIRS) stupid.tar.gz: $(SUBDIRS)
tar -czvf $@ sysroot tar -czvf $@ sysroot
.PHONY: floppy_boot.img .PHONY: floppy_boot.img
floppy_boot.img: $(SUBDIRS) floppy_boot.img: $(SUBDIRS)
dd if=/dev/zero of=$@ bs=512 count=1440 dd if=/dev/zero of=$@ bs=512 count=1440
mformat -C -f 1440 -i $@ mformat -C -f 1440 -i $@
dd if=boot/bootsector.bin of=$@ conv=notrunc dd if=boot/bootsector.bin of=$@ conv=notrunc
mcopy -i $@ boot/stpdboot.sys ::/STPDBOOT.SYS mcopy -i $@ boot/stpdboot.sys ::/STPDBOOT.SYS
mcopy -i $@ kernel/vmstupid.sys ::/VMSTUPID.SYS mcopy -i $@ kernel/vmstupid.sys ::/VMSTUPID.SYS
.PHONY: run .PHONY: run
run: all run: all
qemu-system-i386 \ qemu-system-i386 \
-rtc base=localtime \ -rtc base=localtime \
-drive file=floppy_boot.img,if=none,format=raw,id=boot \ -drive file=floppy_boot.img,if=none,format=raw,id=boot \
-drive file=fat:rw:./sysroot,if=none,id=hdd \ -drive file=fat:rw:./sysroot,if=none,id=hdd \
-device floppy,drive=boot \ -device floppy,drive=boot \
-device ide-hd,drive=hdd \ -device ide-hd,drive=hdd \
-global isa-fdc.bootindexA=0 \ -global isa-fdc.bootindexA=0 \
-serial mon:stdio -serial mon:stdio
.PHONY: clean .PHONY: clean
clean: $(SUBDIRS) clean: $(SUBDIRS)
$(RM) $(TARGET) $(SYSROOTDIR) $(RM) $(TARGET) $(SYSROOTDIR)

View file

@ -1,120 +1,120 @@
INCLUDE 'const.inc' INCLUDE 'const.inc'
ORG STAGE0_BASE ORG STAGE0_BASE
USE16 USE16
jmp short _start jmp short _start
nop nop
; Boot Record ; Boot Record
OEM_identifier db 'STUPID ' OEM_identifier db 'STUPID '
bytes_per_sector dw 512 bytes_per_sector dw 512
sectors_per_cluster db 1 sectors_per_cluster db 1
reserved_sectors dw 1 reserved_sectors dw 1
FAT_count db 2 FAT_count db 2
root_dir_entries dw 224 root_dir_entries dw 224
total_sectors dw 2880 total_sectors dw 2880
media_desc_type db 0xF0 media_desc_type db 0xF0
sectors_per_FAT dw 9 sectors_per_FAT dw 9
sectors_per_track dw 18 sectors_per_track dw 18
heads_per_cylinder dw 2 heads_per_cylinder dw 2
hidden_sectors dd 0 hidden_sectors dd 0
large_sector_count dd 0 large_sector_count dd 0
; Extended Boot Record ; Extended Boot Record
drive_number db 0x0 drive_number db 0x0
reserved db 0x0 reserved db 0x0
signature db 0x29 ; 0x28 or 0x29 signature db 0x29 ; 0x28 or 0x29
volume_id dd 0xB00B135 ; hope mine will grow :'( volume_id dd 0xB00B135 ; hope mine will grow :'(
volume_label db 'Stupid Boot' volume_label db 'Stupid Boot'
system_id db 'FAT12 ' system_id db 'FAT12 '
_start: _start:
cli cli
cld cld
jmp 0x0:.canonicalize_cs jmp 0x0:.canonicalize_cs
.canonicalize_cs: .canonicalize_cs:
xor ax, ax xor ax, ax
mov ds, ax mov ds, ax
mov ss, ax mov ss, ax
mov es, ax mov es, ax
mov sp, 0x7c00 mov sp, 0x7c00
mov [drive_number], dl mov [drive_number], dl
; reset floppy disk ; reset floppy disk
@@: @@:
mov dl, [drive_number] mov dl, [drive_number]
xor ah, ah xor ah, ah
int 0x13 int 0x13
jc @b jc @b
call fat_load_root call fat_load_root
; search in root directory ; search in root directory
mov si, kernel_file mov si, kernel_file
call fat_search_root call fat_search_root
jc .error_not_found jc .error_not_found
mov [kernel_start], ax mov [kernel_start], ax
mov si, stage1_file mov si, stage1_file
call fat_search_root call fat_search_root
jc .error_not_found jc .error_not_found
mov [stage1_start], ax mov [stage1_start], ax
; load fat ; load fat
xor ax, ax xor ax, ax
mov al, [FAT_count] mov al, [FAT_count]
mul word [sectors_per_FAT] mul word [sectors_per_FAT]
mov cx, ax mov cx, ax
mov ax, [reserved_sectors] mov ax, [reserved_sectors]
xor bx, bx xor bx, bx
call disk_read_sectors call disk_read_sectors
; preload kernel ; preload kernel
mov ax, KERNEL_PRELOAD/0x10 mov ax, KERNEL_PRELOAD/0x10
mov es, ax mov es, ax
mov ax, [kernel_start] mov ax, [kernel_start]
xor bx, bx xor bx, bx
call fat_load_binary call fat_load_binary
; load stage 2 ; load stage 2
mov ax, STAGE1_BASE/0x10 mov ax, STAGE1_BASE/0x10
mov es, ax mov es, ax
mov ax, [stage1_start] mov ax, [stage1_start]
xor bx, bx xor bx, bx
call fat_load_binary call fat_load_binary
jmp 0x0:STAGE1_BASE jmp 0x0:STAGE1_BASE
.error_not_found: .error_not_found:
push si push si
mov si, msg_error mov si, msg_error
call bios_print call bios_print
pop si pop si
call bios_print call bios_print
mov si, msg_not_found mov si, msg_not_found
call bios_print call bios_print
hlt hlt
jmp $ jmp $
INCLUDE "utils.inc" INCLUDE "utils.inc"
INCLUDE "fat12.inc" INCLUDE "fat12.inc"
msg_error db "ERROR: ", 0 msg_error db "ERROR: ", 0
msg_not_found db " not found", CR, LF, 0 msg_not_found db " not found", CR, LF, 0
kernel_file db "VMSTUPIDSYS", 0 kernel_file db "VMSTUPIDSYS", 0
stage1_file db "STPDBOOTSYS", 0 stage1_file db "STPDBOOTSYS", 0
kernel_start dw 0x0 kernel_start dw 0x0
stage1_start dw 0x0 stage1_start dw 0x0
rb 0x7C00+512-2-$ rb 0x7C00+512-2-$
db 0x55, 0xAA db 0x55, 0xAA

View file

@ -1,65 +1,68 @@
INCLUDE 'const.inc' INCLUDE 'const.inc'
INCLUDE 'multiboot.inc' INCLUDE 'multiboot.inc'
ORG STAGE1_BASE ORG STAGE1_BASE
USE16 USE32
jmp _start jmp _start
mb_header MultibootHeader mb_header ALIGN 4
multiboot_header:
_start: mb_header MultibootHeader multiboot_header
cmp eax, MULTIBOOT_MAGIC
je .multiboot _start:
cmp eax, MULTIBOOT_MAGIC
;; non multiboot process je .multiboot
push cs
pop ds USE16
;; non multiboot process
mov si, msg_stage2 push cs
call bios_print pop ds
call a20_enable mov si, msg_stage2
jc .error_a20 call bios_print
; detect memory call a20_enable
call memory_get_map jc .error_a20
jc .error_memory
xchg bx, bx ; detect memory
call memory_get_map
call video_setup jc .error_memory
xchg bx, bx
.multiboot:
jmp .hang call video_setup
.error_memory: .multiboot:
mov si, msg_error_memory jmp .hang
jmp .error
.error_a20: .error_memory:
mov si, msg_error_a20 mov si, msg_error_memory
.error: jmp .error
call bios_print .error_a20:
.hang: mov si, msg_error_a20
hlt .error:
jmp $ call bios_print
.hang:
INCLUDE 'a20.inc' hlt
INCLUDE 'utils.inc' jmp $
INCLUDE 'memory.inc'
INCLUDE 'video.inc' INCLUDE 'a20.inc'
INCLUDE 'utils.inc'
msg_stage2 db "StupidOS Bootloader (Stage 1)", CR, LF, 0 INCLUDE 'memory.inc'
msg_error_a20 db "ERROR: can't enable a20 line", CR, LF, 0 INCLUDE 'video.inc'
msg_error_memory db "ERROR: can't detect available memory", CR, LF, 0
msg_stage2 db "StupidOS Bootloader (Stage 1)", CR, LF, 0
msg_error_a20 db "ERROR: can't enable a20 line", CR, LF, 0
;; msg_error_memory db "ERROR: can't detect available memory", CR, LF, 0
bi_screen_width: dw 0
bi_screen_height: dw 0
;;
_edata: bi_screen_width: dw 0
bi_screen_height: dw 0
; BSS
rb 0x4000 _edata:
_end: ; BSS
rb 0x4000
_end:

View file

@ -1,14 +1,15 @@
CR = 0x0D CR = 0x0D
LF = 0x0A LF = 0x0A
; -------- Address ---------- ; -------- Address ----------
STAGE0_BASE = 0x7C00 STAGE0_BASE = 0x7C00
STAGE1_BASE = 0x1000 STAGE1_BASE = 0x1000
DISK_BUFFER = 0x8000 MULTIBOOT_BASE = 0x100000
KERNEL_PRELOAD = 0xF000 DISK_BUFFER = 0x8000
STACK_TOP = 0x7000 KERNEL_PRELOAD = 0xF000
STACK_TOP = 0x7000
; ---------- Video ------------
VIDEO_WIDTH = 1024 ; ---------- Video ------------
VIDEO_HEIGHT = 768 VIDEO_WIDTH = 1024
VIDEO_DEPTH = 32 VIDEO_HEIGHT = 768
VIDEO_DEPTH = 32

View file

@ -1,107 +1,108 @@
MULTIBOOT_HDR_MAGIC = 0x1BADB002 MULTIBOOT_HDR_MAGIC = 0x1BADB002
MULTIBOOT_MAGIC = 0x2BADB002 MULTIBOOT_MAGIC = 0x2BADB002
MULTIBOOT_HDR_ALIGN = 0x1 MULTIBOOT_HDR_ALIGN = 0x1
MULTIBOOT_HDR_MEMINFO = 0x2 MULTIBOOT_HDR_MEMINFO = 0x2
MULTIBOOT_HDR_VIDEO = 0x4 MULTIBOOT_HDR_VIDEO = 0x4
MULTIBOOT_FLAGS = MULTIBOOT_HDR_ALIGN or MULTIBOOT_HDR_MEMINFO or MULTIBOOT_HDR_VIDEO MULTIBOOT_HDR_AOUT_KLUDGE = 0x10000
MULTIBOOT_FLAGS = MULTIBOOT_HDR_ALIGN or MULTIBOOT_HDR_MEMINFO or MULTIBOOT_HDR_VIDEO or MULTIBOOT_HDR_AOUT_KLUDGE
struc MultibootHeader addr
{ struc MultibootHeader addr
.magic dd MULTIBOOT_HDR_MAGIC {
.flags dd MULTIBOOT_FLAGS .magic dd MULTIBOOT_HDR_MAGIC
.checksum dd -(MULTIBOOT_HDR_MAGIC + MULTIBOOT_FLAGS) .flags dd MULTIBOOT_FLAGS
.checksum dd -(MULTIBOOT_HDR_MAGIC + MULTIBOOT_FLAGS)
; address fields (we'll just skip them)
.header_addr dd addr ; address fields (we'll just skip them)
.load_addr dd STAGE1_BASE .header_addr dd addr
.load_end_addr dd _edata - STAGE1_BASE .load_addr dd STAGE1_BASE
.bss_end_addr dd _end - STAGE1_BASE .load_end_addr dd _edata
.entry_addr dd _start .bss_end_addr dd _end
.entry_addr dd _start
; Video mode
.mode_type dd 0x0 ; Video mode
.width dd VIDEO_WIDTH .mode_type dd 0x0
.height dd VIDEO_HEIGHT .width dd VIDEO_WIDTH
.depth dd VIDEO_DEPTH .height dd VIDEO_HEIGHT
} .depth dd VIDEO_DEPTH
}
struc MultibootData
{ struc MultibootData
.flags dd ? {
.flags dd ?
; if flags[0] is set
.mem_lower dd ? ; if flags[0] is set
.mem_upper dd ? .mem_lower dd ?
.mem_upper dd ?
; if flags[1] is set
.boot_device dd ? ; if flags[1] is set
.boot_device dd ?
; if flags[2] is set
.cmdline dd ? ; if flags[2] is set
.cmdline dd ?
; if flags[3] is set
.mods_count dd ? ; if flags[3] is set
.mods_addr dd ? .mods_count dd ?
.mods_addr dd ?
; if flags[4] is set
.syms dd 4 dup ? ; if flags[4] is set
.syms dd 4 dup ?
; if flags[6] is set
.mmap_length dd ? ; if flags[6] is set
.mmap_addr dd ? .mmap_length dd ?
.mmap_addr dd ?
; if flags[7] is set
.drives_length dd ? ; if flags[7] is set
.drives_addr dd ? .drives_length dd ?
.drives_addr dd ?
; if flags[8] is set
.config_table dd ? ; if flags[8] is set
.config_table dd ?
; if flags[9] is set
.bootloader_name dd ? ; if flags[9] is set
.bootloader_name dd ?
; if flags[10] is set
.apm_table dd ? ; if flags[10] is set
.apm_table dd ?
; if flags[11] is set
.vbe_control_info dd ? ; if flags[11] is set
.vbe_mode_info dd ? .vbe_control_info dd ?
.vbe_mode dw ? .vbe_mode_info dd ?
.vbe_if_seg dw ? .vbe_mode dw ?
.vbe_if_off dw ? .vbe_if_seg dw ?
.vbe_if_length dw ? .vbe_if_off dw ?
.vbe_if_length dw ?
; if flags[12] is set
.fb_addr dq ? ; if flags[12] is set
.fb_pitch dd ? .fb_addr dq ?
.fb_width dd ? .fb_pitch dd ?
.fb_height dd ? .fb_width dd ?
.fb_bpp db ? .fb_height dd ?
.fb_type db ? .fb_bpp db ?
.fb_misc dw 3 dup ? .fb_type db ?
} .fb_misc dw 3 dup ?
}
MULTIBOOT_DATA_MEM = 0x0001
MULTIBOOT_DATA_BOOTDEV = 0x0002 MULTIBOOT_DATA_MEM = 0x0001
MULTIBOOT_DATA_CMDLINE = 0x0004 MULTIBOOT_DATA_BOOTDEV = 0x0002
MULTIBOOT_DATA_MODULES = 0x0008 MULTIBOOT_DATA_CMDLINE = 0x0004
MULTIBOOT_DATA_MMAP = 0x0040 MULTIBOOT_DATA_MODULES = 0x0008
MULTIBOOT_DATA_DRIVES = 0x0080 MULTIBOOT_DATA_MMAP = 0x0040
MULTIBOOT_DATA_BOOTLOADER_NAME = 0x0200 MULTIBOOT_DATA_DRIVES = 0x0080
MULTIBOOT_DATA_VBE = 0x0800 MULTIBOOT_DATA_BOOTLOADER_NAME = 0x0200
MULTIBOOT_DATA_FB = 0x1000 MULTIBOOT_DATA_VBE = 0x0800
MULTIBOOT_DATA_FB = 0x1000
struc MultibootMMap
{ struc MultibootMMap
.size dd ? {
.addr dq ? .size dd ?
.length dq ? .addr dq ?
.type dd ? .length dq ?
} .type dd ?
}
MULTIBOOT_MEMORY_AVAILABLE = 0x1
MULTIBOOT_MEMORY_RESERVED = 0x2 MULTIBOOT_MEMORY_AVAILABLE = 0x1
MULTIBOOT_MEMORY_ACPI = 0x3 MULTIBOOT_MEMORY_RESERVED = 0x2
MULTIBOOT_MEMORY_NVS = 0x4 MULTIBOOT_MEMORY_ACPI = 0x3
MULTIBOOT_MEMORY_BADPARAM = 0x5 MULTIBOOT_MEMORY_NVS = 0x4
MULTIBOOT_MEMORY_BADPARAM = 0x5

View file

@ -8,7 +8,8 @@ set default=0
menuentry "StupidOS" { menuentry "StupidOS" {
echo "verify system integrity" echo "verify system integrity"
hashsum --hash sha256 --check /boot/hashfile --prefix / hashsum --hash sha256 --check /boot/hashfile --prefix /
multiboot /vmstupid multiboot /stpdboot.sys
module /vmstupid.sys
boot boot
} }
@ -18,7 +19,10 @@ EOF
gen_iso_file() { 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.sys" > "$2/boot/hashfile"
sha256sum "$2/stpdboot.sys" >> "$2/boot/hashfile"
grub-file --is-x86-multiboot "$2/stpdboot.sys" || exit 1
grub-mkrescue -o $1 $2 grub-mkrescue -o $1 $2
} }