Compare commits

182 Commits

Author SHA1 Message Date
d824493ba2 small clarification on what "unreal" mode really is 2025-09-05 09:12:55 -04:00
cb089681cf make arena_align_up use 16-bit values 2025-09-05 09:12:26 -04:00
d868008726 another oopsie from when I changed the calling convention... 2025-09-05 08:43:41 -04:00
935427509a inital code for align_up function 2025-09-05 08:27:56 -04:00
f5e4927d70 add basic arena area init code
Some checks failed
Daily Build and trunk tester / debian_update (push) Failing after 1m14s
2025-09-04 20:04:25 -04:00
b106eae066 fix alignment macros 2025-09-04 20:04:03 -04:00
f2657fdc01 seems I found a /little/ oopsie in the fat32 system 2025-09-04 19:59:36 -04:00
86d966811b prototypes for displaying some memory maps
but now I need to write an arena allocator...so brb
2025-09-04 17:51:52 -04:00
c10394a0cd early allocator prototypes 2025-09-04 17:49:57 -04:00
28b23b9ce2 paragraph align the values in bss 2025-09-04 15:32:42 -04:00
105ceb8b8b make sure eax and edx are set each call to E820 2025-09-04 15:32:28 -04:00
7fd5b9b85d wx is still broken, also point to disk.img in build/ 2025-09-04 15:31:39 -04:00
a618a837d4 added root check back in, but check that we aren't root
changed how mtools accesses images, should functionally be the same.
2025-09-04 12:29:57 -04:00
930d49c353 Delete LICENSE.md
GPLv3 is in COPYING, remove LICENSE.md
2025-09-04 10:11:36 -04:00
06d00d02e2 Update .github/workflows/daily.yaml
oh boy, github actions as well
2025-09-04 09:19:23 -04:00
61379e8116 add a daily cron and general build action for github actions 2025-09-04 08:58:45 -04:00
828428e73b removed debug files (they were moved earlier)
All checks were successful
Daily Build and trunk tester / debian_update (push) Successful in 1m19s
2025-08-24 10:47:54 -04:00
402bf9974d moved map file output to build
moved output of builds to build/output
updated gitea action
2025-08-24 10:47:18 -04:00
5dfc3533d9 ignore everything in build output manually track .keep_dir files 2025-08-24 10:19:10 -04:00
d9225718c2 moving some documentation around and a bit of build cleanup 2025-08-24 10:18:01 -04:00
8a6730bc9c Update README.md
All checks were successful
Daily Build and trunk tester / debian_update (push) Successful in 1m27s
2025-08-23 09:32:44 -04:00
67523208b3 Update scripts/create-disk.sh
fix label-id, was a bit over the ballmer ridge
2025-08-23 08:35:26 -04:00
ffe887b6a9 Update .gitea/workflows/onpush.yaml
All checks were successful
Daily Build and trunk tester / debian_update (push) Successful in 1m34s
2025-08-22 22:45:59 -04:00
c45e62ecc2 Merge branch 'trunk' of chtm-lapp-02.lan.chtm.me:nivirx/stevia into trunk 2025-08-22 22:43:40 -04:00
d7c50575cf re-wrote crate-disk.sh to not need root access, now requires mtools
removed macOS support in disk creation script
2025-08-22 22:43:24 -04:00
39148869bc Update .gitea/workflows/onpush.yaml 2025-08-22 21:14:14 -04:00
81e6b6e835 Update Makefile 2025-08-22 21:07:47 -04:00
63c5e0d00e Update .gitea/workflows/onpush.yaml 2025-08-22 21:04:42 -04:00
29a2a598ba Update .gitea/workflows/onpush.yaml 2025-08-22 21:01:24 -04:00
47b18de37e setup an action to auto build stevia 2025-08-22 20:57:15 -04:00
8129a71fdd Merge branch 'trunk' of chtm-lapp-02.lan.chtm.me:nivirx/stevia into trunk 2025-08-22 11:58:53 -04:00
ef42ae084b Merge branch 'fat32_sys_rewrite' into trunk 2025-08-22 11:52:48 -04:00
578e9934d8 more bug catching after changing the location of data
also cleanup comment from previous bug
2024-12-19 18:59:34 -05:00
2a6792ae01 moved varibles passed from vbr to .data section
this is to work around having to save them without .bss ready
2024-12-19 15:18:28 -05:00
2c5e5ccbee might have fixed some of the boot_drive issues with ext_read 2024-12-19 13:13:46 -05:00
a830191547 added carry and divz checks across the fat32 code
also use the pointers we have in bss to our saved data
2024-10-16 11:58:57 -04:00
38bcd93ced some debuging text for fat32 stuff 2024-10-15 20:37:49 -04:00
f1842d0cbc remove some redundant reloads of si
use xchg to swap si/di instead of the stack
uninline ClusterToLBA call
2024-10-15 20:01:24 -04:00
e085cbbab7 remove jmp short init at the start of stage2
also correct total size output as combined .data + .text
2024-10-15 18:33:57 -04:00
915ac4c8ae align to 16 byte bounds and add git info to build 2024-10-15 18:28:06 -04:00
e65220fece correct size of operand in PrintDWORD
added some magic debug points for stuff that isn't working as well.
2024-10-15 13:32:36 -04:00
6731e03e38 magic debug before touching anything in error printer 2024-10-15 13:31:51 -04:00
47a47051b2 turn off magic debug in mbr/vbr stages 2024-10-15 13:31:32 -04:00
8e2ca06406 removed bpb_offset_bx dep
reworked init: process
512 byte stack...should be more than enough for the vbr
2024-10-15 12:57:54 -04:00
2b9d0d9946 moved stack to end of bss & reduced size for now.
removed redzone label
reordered sp/bp setup and bss zeroing in init:
fixed kmemcpy call stack usage
2024-10-15 12:56:12 -04:00
1ce3f67263 reduced stack size in mbr stage
removed some unused data in bss
reordered how/when in init we set sp/bp and zero bss
we now push the top of the stack pointer/bp at the top of the stack, which makes the stack frame more 'normal'
also use movsb instead of movsw
2024-10-15 12:53:22 -04:00
f81f358987 include disk signature and reserved bytes in part table struct 2024-10-15 12:51:34 -04:00
41db11cc64 ha ha ha, again! 2024-10-15 12:51:02 -04:00
fd7754bc60 I guess wx work again on Debian Trixie? 2024-10-15 12:50:51 -04:00
0f04e682df change entry points (again) 2024-10-14 17:58:43 -04:00
36fcb5faf0 16 KiB stage2 2024-10-14 17:58:30 -04:00
a5296bb438 correct drive_num argument on read_disk_raw 2024-10-14 13:18:41 -04:00
933cccb88e replace text documentation with markdown 2024-10-14 10:44:44 -04:00
ad2d37c63b use bochs magic breakpoints in the error printer
makes it easier to get a good state to do some investigating before reseting.
2024-10-13 20:53:13 -04:00
f32745a7e3 enable magic in the normal bochsrc.txt 2024-10-13 20:51:34 -04:00
8537d6cd5e use bx addressing in read_disk_raw 2024-10-13 20:51:16 -04:00
e57c2cc67d Merge pull request #3 from Nivirx/bss-setup
convert MBR, VBR, & Stage2 to use a BSS section.
2024-10-13 18:05:19 -04:00
e4b9c5d77f added partition_table and fat32_bpb params to stage2
also the partition table and fat32_bpb and passed/copied from the mbr/vbr now
2024-10-13 17:54:06 -04:00
e3a646675f bss for vbr stage 2024-10-13 17:52:28 -04:00
9d33469e32 fixed bss init in mbr 2024-10-13 17:52:09 -04:00
dd1a74bff0 pass location of partition_table structure to vbr 2024-10-13 16:41:39 -04:00
29db27925f initial work on a macro to call read_disk_raw 2024-10-13 16:37:52 -04:00
7f06d47f32 add reserved space for jmp short init at the start, technically this is part of the bpb anyways 2024-10-13 16:37:29 -04:00
4faffbf7fe remove defs for memory locations (moving to bss) 2024-10-13 16:36:55 -04:00
832141efb4 bss convertion for mbr stage 2024-10-13 16:36:11 -04:00
c919144496 turns out huge unreal mode isn't supported in bochs
huge unreal mode is 4GiB code in 16bit mode + 4GiB data
we will just use the regular big flat model instead (64KiB code/4GiB data)
2024-10-13 14:50:49 -04:00
a62f3de26f unreal gdt tweaks & fixes 2024-10-13 13:22:01 -04:00
0983ec3fd5 remove map files as well 2024-10-12 22:16:17 -04:00
bd40d6d324 relocate code sections to end up with stage2 starting at 0x500 2024-10-12 22:14:47 -04:00
3d3bcc6ea5 reduced stage2 to 24KiB 2024-10-12 22:13:12 -04:00
d1f8ec4a9e follow standard proceedure and reallocate the mbr to 0x600 2024-10-12 21:21:43 -04:00
2fa03c31d7 partially roll back changing the segment to 0x07E0 2024-10-12 20:25:04 -04:00
f535840572 big step...and also its completely broken right now
we are going to use 0x07E0 as our base segment so we have a bit
more memory to work with until we are fully in 32bit protected mode.

this commit is broken but is just one step towards a working release.
2024-10-12 15:41:39 -04:00
54b7a81648 correct typo 2024-10-12 15:39:16 -04:00
1d84f52690 definition corrections in part table stuff 2024-10-12 15:39:04 -04:00
276fe70572 use early_mem.inc 2024-10-12 15:38:47 -04:00
73b42c66fd renamed mem.inc and removed unused items 2024-10-12 15:38:24 -04:00
9656a9465b first version of kmemcpy5/kmemset4 2024-10-12 14:48:26 -04:00
bd80f48b1b use NASM defined size value from structure macro 2024-10-12 12:58:32 -04:00
3fbfcbef53 BIOSMemoryMap is a location in bss now, use lea 2024-10-12 12:58:16 -04:00
31c45051e6 minor cleanup related to memory refactor 2024-10-12 12:57:56 -04:00
a523e17d27 moved stuff that is only referenced in Stage2 to stage2 bss 2024-10-12 12:55:29 -04:00
65e5a83eb4 stage2 is now a multisection binary file
also preparing to move memory globals to bss section.
2024-10-12 11:29:20 -04:00
cd048933ec output symbol maps to ease debuging 2024-10-12 11:28:25 -04:00
e648fd0de6 remove PRINT_FUNC macro...this isn't it chief 2024-10-12 11:27:55 -04:00
2581e50c8b ignore nasm symbol map files 2024-10-12 11:27:20 -04:00
60aaf5cdd9 move far jump setup in EnterUnrealMode to right after we save CS 2024-10-11 21:51:07 -04:00
59678149e0 added debug config for bochs 2024-10-11 21:49:15 -04:00
075e51c8bc move macro definition super early
fix a few mistakes in macro defs
2024-10-11 19:31:31 -04:00
48cd0f742d added macros to define cstr and str
aligned all the entry points for proceedures to 4 bytes
added a PrintString wraper macro
2024-10-11 19:05:15 -04:00
e5fb1b41eb added bochs debug wrappers 2024-10-11 19:03:27 -04:00
208729ed01 split e820 bios call documentation to its own file under docs/ 2024-10-11 17:20:53 -04:00
086cf9d8ea correct src size in op 2024-10-11 16:52:57 -04:00
095822fa27 inlined ClusterToLBA
removed caller save kludge for now
init first_root_dir_sector from ebpb data
2024-10-11 15:55:24 -04:00
71f13fd6b5 somewhat of a cludge, but added a macro to save all caller saved regs 2024-10-11 14:25:01 -04:00
802d47fbf7 fix passing stage2 wrong data for boot drive 2024-10-11 13:09:17 -04:00
4af0637c7f use kmemset to 0 out fat32_state in InitFATDriver 2024-10-11 13:00:45 -04:00
07197b0d5b reduce proceedure local storage to 16 bytes 2024-10-11 12:59:36 -04:00
056551fdd1 rename file to BOOT.BIN
K.I.S.S.
2024-10-11 12:16:01 -04:00
0aae0616fd more comments to seperate setups 2024-10-11 12:08:09 -04:00
aff631f3db force 1-1 logical to physical sectors
copy our VBR code to backup VBR
2024-10-11 12:04:44 -04:00
a3a768adf4 more error handling in detecting disk image creation
will need ported to macOS sometime
2024-10-11 11:44:04 -04:00
d684d4f11f more error handling for dd writes 2024-10-11 11:31:38 -04:00
75c046f9cd use gs for vesa framebuffer (was fs) 2024-10-08 20:23:16 -04:00
00daf92df5 unreal gdt now has 2 selectors 1 code, 1 data
ss, and e/f/g segments are loaded to the same flat 4gb segment
moved gdt notes to documentation
2024-10-08 20:22:21 -04:00
5ab7e70455 Update README.md 2024-10-08 09:08:47 -04:00
6ae68d1a19 ensure 2 byte jmp rel8 thunk to init
surpress reloc abs warnings
corrected include paths/filenames
2024-10-08 08:55:17 -04:00
586f3f0106 converted error handler to a 16bit far jump
optimized the early error printer a bit to save some bytes
removed DEBUG_HCF macro
2024-10-08 08:53:30 -04:00
8301fc20a8 renamed files to show code vs defs
files that actually include code should be in .nasm files
defines/macros/non-code should be in .inc files
2024-10-07 20:41:15 -04:00
4218a08658 force the first jump to init in all stages to be the rel8 version 2024-10-07 20:39:39 -04:00
2bbdaddb68 jmp imm32 vs jmp rel8 (5 bytes vs 2 bytes) 2024-10-06 21:46:32 -04:00
213ea11209 cutting out everything from miniboot
this file has always just been a place holder to get some code to load from the disk
I wanted to cut out all the extra stuff in it just to simplify things down.
2024-10-06 18:52:20 -04:00
e41b597056 surpress some of the relocation warnings for mbr, vbr & stage2 2024-10-06 18:50:32 -04:00
f33ecbcea2 make the Linux bochs run more inline with the Windows one 2024-10-06 15:37:19 -04:00
03a09ed54b Merge pull request #2 from Nivirx/FAT_Refactor
Full refactor for modularization
2024-10-05 20:19:51 -04:00
145e9fbaa9 fixed read_disk_raw in ReadFATCluster
boot_drive and partition_offset are global pointers now
removed an extra error from mbr disk read
and some general formating and cleanup 😅
2024-10-05 20:14:00 -04:00
8f95c8f267 tons more work on modularizing the code 2024-10-05 18:55:00 -04:00
5440a1ae61 more modularization and updating date in MIT licence header 2024-10-05 13:35:39 -04:00
d6af15a7a6 typo fix 2024-10-05 12:16:31 -04:00
a4fa48949c Move fat32 and BIOS functions to their own files 2024-10-05 12:04:40 -04:00
0a1123c5b5 removed extra part probe and added sleep before removing disk
also back to putting the test 32bit mode code on the root of the volume
2024-10-05 10:14:02 -04:00
e162e268c4 remove the dword stack macros and just use the 32bit override 2024-10-05 10:13:18 -04:00
62f036b645 change test kernel stage name
also pointed up a bug in memory.inc
2024-10-04 22:17:35 -04:00
fdbfd811d5 increased disk size and moved bpb/ebpb a bit 2024-10-04 14:26:10 -04:00
d93236d298 some bpb/ebpb tweaks 2024-10-04 11:48:25 -04:00
86fd76e909 remove old kmem functions 2024-10-04 09:57:32 -04:00
3f029e6b4c vbr cdecl overhaul
refactored read_disk_raw to read_stage2_raw
switched to new kmem functions
2024-10-04 09:56:41 -04:00
30c4f1b82c move cdecl macros to nearly the top so early functions can use them 2024-10-04 09:55:45 -04:00
597132df9f cdecl16 overhaul for mbr code
switch to cdecl kmem* functions
refactored read_disk_raw to read_vbr_raw
fixed a small issue where the mbr wasn't checking its signature
2024-10-04 09:55:19 -04:00
63e6f1fac8 kmemset and kmemcpy cdecl16 versions 2024-10-04 09:53:01 -04:00
4ee766304b seperate error code for reading disk in mbr vs vbr vs stage2 2024-10-04 09:52:24 -04:00
d5aa70daf3 add macros to prevent __CDECL16 stuff from being defined multiple times 2024-10-04 09:51:44 -04:00
ec1f40c305 added isoz stage to make a compressed disk image
also included a work around for a WSL bug in create-disk.sh
2024-10-04 07:57:56 -04:00
36e3bd968a change FAT partition type to 0Ch from 0Bh (W95 FAT32 LBA was CHS/LBA) 2024-10-03 21:00:49 -04:00
36b8869140 add bpb and ebpb reserve area back to vbr.nasm 2024-10-03 21:00:02 -04:00
41b9bf5134 remove this and add it back to vbr.nasm 2024-10-03 20:59:25 -04:00
b96f587921 add forked functions and remove from memory.inc for kmem* 2024-10-03 19:53:11 -04:00
89ebe30ad8 forking kmemset functions for stage2 usage 2024-10-03 19:52:24 -04:00
e98cc41403 forking kmemset functions to be updated later for mbr/vbr 2024-10-03 19:52:00 -04:00
27c41c8b0a update some of the dword stack macros 2024-10-03 19:33:07 -04:00
015def8d52 rough pass on fixing the stack across the board 2024-10-03 19:02:47 -04:00
8157dd301c swap order of entering Unreal mode and getting an E820
also InitFATDriver should be ok to add to the start process again.
2024-10-03 18:15:18 -04:00
4d05d2ae4c move E820 function desc to memory.inc 2024-10-03 18:14:04 -04:00
de5b0ddc5d cdecl16 update for EnterUnrealMode 2024-10-03 17:59:29 -04:00
2cfe86efac refactored and validated MemoryMap funciton 2024-10-03 17:41:48 -04:00
c8ca94d7ba some general cleanup & moving the halt to the next point in main() 2024-10-03 16:43:10 -04:00
ac6110aa40 cdecl16 work and cleanup in MemoryMap 2024-10-03 16:34:27 -04:00
46717935a1 src/stage2/stage2.nasm:573: warning: label alone on a line without a colon might be in error [-w+label-orphan] 2024-10-03 15:28:44 -04:00
f691000a31 cdecl16 for EnableA20 ver.1 2024-10-03 15:10:22 -04:00
c524d8801d replace prologs and epilogs in cdecl functions so far 2024-10-03 14:51:43 -04:00
0084747765 added entry & exit macros 2024-10-03 14:46:47 -04:00
929962eaca bunch of changes mostly to do with cdecl16 conformity
moved top of stack marker to init
SetTextMode and Cursor done before hello msg
corrected CC/Stack usage to conform with cdecl16 for PrintString
corrected CC/Stack usage to conform with cdecl16 for PrintChar
corrected stack usage to conform with cdecl16 for SetTextMode
corrected stack usage to conform with cdecl16 for disable_cursor
2024-10-03 13:49:44 -04:00
054f4320ba fixing how the stack works stage1 😳 2024-10-02 12:37:21 -04:00
2f6bd2e2d8 remove comment about CC, see docs/ 2024-10-02 11:59:34 -04:00
7c446ef3b2 load our base headers in the same order as the mbr 2024-10-02 10:26:36 -04:00
2bbfa0931b moved reservation for bpb to a include 2024-10-02 10:25:59 -04:00
8e595e8eba added some clarification on cdecl16 2024-10-02 10:13:45 -04:00
5e4e40f7de removed ata1 from windows bochsrc 2024-10-02 10:13:00 -04:00
6db97e3258 added bxrc config to launch on windows hosts 2024-09-21 14:09:52 -04:00
d42ee1df60 small optimization to error printer
saves us 5 bytes of code (15 overall)
2024-09-21 13:45:15 -04:00
96a8103e11 added debuging 'errors'
also there is special handling for them in error.inc
2024-09-21 13:28:52 -04:00
a5702bd92e partially revert change, sti is still in init 2024-09-21 12:32:49 -04:00
bdc1fc5bf0 added -P option to losetup
this fixes an issue that appeared on WSL2 recently(ish)
2024-09-21 12:04:05 -04:00
1c27b665b0 ignore vscode personal configs 2024-09-21 11:46:36 -04:00
abc79adeb7 remove reallocation in mbr init
also reenable interupts in the init block
2024-09-21 11:45:22 -04:00
7fd4a89d96 Update README.md
updated description to more accurately reflect project status
2024-07-27 09:21:41 -04:00
355ceb49a7 changed extention from .s to .nasm 2023-08-23 10:10:30 -04:00
b590edd3ff enable logging and bump to 128MB of memory 2023-08-23 10:10:13 -04:00
30b71d2e6e updated gitignore 2023-08-23 10:09:49 -04:00
b2857ff9fd clarify that WSL is supported 2023-08-23 07:35:30 -04:00
4e9e58c430 added description for create-disk script 2023-08-22 16:45:22 -04:00
5916b46a9e Update README.md 2023-08-22 16:34:39 -04:00
d162d5dc4c update readme with more information 2023-08-22 16:22:13 -04:00
d4dc46d770 MIT license applied to all project files 2023-08-22 16:03:46 -04:00
ad828ac1f4 use wx interface for config, gui, and debug 2023-08-22 15:56:15 -04:00
5fdde61dd3 remove packaged binaries 2023-08-22 15:55:45 -04:00
90ced63cba small changes to License
🏳️‍⚧️
2023-08-22 14:24:35 -04:00
2c55ed5c04 Update README.md 2023-08-22 10:43:54 -04:00
94a2fb08ca Delete COPYING
Removing GPL-3.0 license.
2023-08-22 10:43:01 -04:00
b9850f7ab9 Create README.md 2023-08-22 10:36:35 -04:00
Elaina Claus
f181f21e41 Merge pull request #1 from Xinnx/add-license-1
Create LICENSE.md
2023-02-28 22:24:40 -05:00
Elaina Claus
309a5fb95c Create LICENSE.md 2023-02-28 22:24:32 -05:00
21 changed files with 395 additions and 283 deletions

View File

@@ -0,0 +1,40 @@
name: Daily Build and trunk tester
on:
push:
branches: [ $default-branch ]
pull_request:
branches: [ $default-branch ]
schedule:
- cron: "0 7 * * *" # daily 07:00
workflow_dispatch: {}
jobs:
debian_update:
runs-on: debian-trixie
steps:
- name: Checkout (if needed)
uses: actions/checkout@v4
- name: Install CHTM apt cache endpoint into container
run: |
echo 'Acquire::http::Proxy "http://chtm-aptcache-01.lan.chtm.me:3142";' | tee /etc/apt/apt.conf.d/01aptproxy
- name: Ensure image is up to date and install build tools and deps
run: |
bash -c "apt update && apt upgrade -y"
apt install -y build-essential nasm mtools fdisk dosfstools
- name: Build stevia
run: make
- name: Upload build artifacts
if: always() # still keep logs/artifacts even if build fails
uses: actions/upload-artifact@v3
with:
name: stevia-${{ github.run_number }}
path: |
build/output/artifacts.tar.gz
build/output/disk.img.gz
build/output/part.img.gz
if-no-files-found: error
retention-days: 30 # override server default if you like

35
.github/workflows/daily.yaml vendored Normal file
View File

@@ -0,0 +1,35 @@
name: Daily Build and trunk tester
on:
push:
branches: [ $default-branch ]
schedule:
- cron: "0 7 * * *" # daily 07:00
workflow_dispatch: {}
jobs:
debian_update:
runs-on: ubuntu-latest
steps:
- name: Checkout (if needed)
uses: actions/checkout@v4
- name: Update and install build tools and deps
run: |
sudo bash -c "apt update && apt upgrade -y"
sudo apt install -y build-essential nasm mtools fdisk dosfstools
- name: Build stevia
run: make
- name: Upload build artifacts
if: always() # still keep logs/artifacts even if build fails
uses: actions/upload-artifact@v4
with:
name: stevia-${{ github.run_number }}
path: |
build/output/artifacts.tar.gz
build/output/disk.img.gz
build/output/part.img.gz
if-no-files-found: error
retention-days: 7 # override server default if you like

3
.gitignore vendored
View File

@@ -1,7 +1,8 @@
out/*
build/* build/*
build/output/*
*.img *.img
*.img.gz *.img.gz
*.img.gz
*.elf *.elf
bx_enh_dbg.ini bx_enh_dbg.ini
stevia-log stevia-log

View File

@@ -1,14 +0,0 @@
Copyright (C) 2025 Elaina Claus
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.

View File

@@ -32,8 +32,8 @@ GIT_VERSION := $(shell git describe --tags)
GIT_HASH := $(shell git rev-parse HEAD) GIT_HASH := $(shell git rev-parse HEAD)
GIT_NASM_DEFINES := -D __GIT_VER__='"$(GIT_VERSION)"' -D __GIT_HASH__='"$(GIT_HASH)"' GIT_NASM_DEFINES := -D __GIT_VER__='"$(GIT_VERSION)"' -D __GIT_HASH__='"$(GIT_HASH)"'
iso := '/tmp/disk.img' iso := 'build/disk.img'
isoz := 'disk.img.gz' isoz := 'build/output/disk.img.gz'
qemu_args := -L ./bin/ -bios bios.bin -cpu pentium3 -m 128 -S -s -monitor stdio -nic none qemu_args := -L ./bin/ -bios bios.bin -cpu pentium3 -m 128 -S -s -monitor stdio -nic none
.PHONY: all mbr vbr stage2 boottest clean run run_bochs iso isoz .PHONY: all mbr vbr stage2 boottest clean run run_bochs iso isoz
@@ -45,10 +45,11 @@ stage2: $(stage2_binary_files)
boottest: $(boottest_binary_files) boottest: $(boottest_binary_files)
clean: clean:
@rm -rvf *.map @rm -v $(build_dir)/*.bin
@rm -rvf $(build_dir)/* @rm -v $(build_dir)/*.map
@rm -rvf $(iso) @rm -v $(build_dir)/*.img
@rm -rvf $(isoz) @rm -v $(build_dir)/output/*.img.gz
@rm -v $(build_dir)/output/*.tar.gz
run: $(iso) run: $(iso)
@sudo qemu-system-i386 $(qemu_args) -hda $(iso) @sudo qemu-system-i386 $(qemu_args) -hda $(iso)
@@ -79,8 +80,7 @@ build/%.bin: src/miniboot32/%.nasm
@nasm -i$(include) -Wall -f bin $(GIT_NASM_DEFINES) $< -o $@ @nasm -i$(include) -Wall -f bin $(GIT_NASM_DEFINES) $< -o $@
$(iso): $(mbr_binary_files) $(vbr_binary_files) $(stage2_binary_files) $(boottest_binary_files) $(iso): $(mbr_binary_files) $(vbr_binary_files) $(stage2_binary_files) $(boottest_binary_files)
@echo root access needed to create disk image... @scripts/create-disk.sh
@sudo scripts/create-disk.sh
$(isoz): $(iso) $(isoz): $(iso)
@gzip -9kc $(iso) > $(isoz) @gzip -9kc $(iso) > $(isoz)

View File

@@ -67,4 +67,4 @@ We welcome contributions! Feel free to open issues for bugs or feature requests,
## License ## License
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for more details. This project is licensed under the GPLv3 License. See the [LICENSE](LICENSE.md) or [COPYING](COPYING) file for more details.

View File

@@ -1,7 +1,7 @@
# configuration file generated by Bochs # configuration file generated by Bochs
plugin_ctrl: voodoo=false, unmapped=true, biosdev=true, speaker=true, extfpuirq=true, parallel=true, serial=true, busmouse=false, e1000=false, es1370=false, gameport=true, ne2k=false, sb16=false, usb_uhci=false, usb_ohci=false, usb_ehci=false, usb_xhci=false plugin_ctrl: voodoo=false, unmapped=true, biosdev=true, speaker=true, extfpuirq=true, parallel=true, serial=true, busmouse=false, e1000=false, es1370=false, gameport=true, ne2k=false, sb16=false, usb_uhci=false, usb_ohci=false, usb_ehci=false, usb_xhci=false
config_interface: textconfig config_interface: textconfig
display_library: wx display_library: x, options=gui_debug
memory: guest=64, host=64, block_size=128 memory: guest=64, host=64, block_size=128
romimage: file="/usr/share/bochs/BIOS-bochs-legacy", address=0x00000000, options=none, flash_data=none romimage: file="/usr/share/bochs/BIOS-bochs-legacy", address=0x00000000, options=none, flash_data=none
vgaromimage: file="/usr/share/bochs/VGABIOS-lgpl-latest" vgaromimage: file="/usr/share/bochs/VGABIOS-lgpl-latest"
@@ -10,7 +10,7 @@ floppy_bootsig_check: disabled=0
floppya: type=1_44 floppya: type=1_44
# no floppyb # no floppyb
ata0: enabled=true, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 ata0: enabled=true, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="./disk.img", mode=flat, cylinders=0, heads=0, spt=0, sect_size=512, model="Stevia Disk", biosdetect=auto, translation=lba ata0-master: type=disk, path="./build/disk.img", mode=flat, cylinders=0, heads=0, spt=0, sect_size=512, model="Stevia Disk", biosdetect=auto, translation=lba
ata0-slave: type=none ata0-slave: type=none
ata1: enabled=false ata1: enabled=false
ata1-master: type=none ata1-master: type=none

0
build/.keep_dir Normal file
View File

0
build/output/.keep_dir Normal file
View File

View File

@@ -40,23 +40,27 @@ GetMemoryMap:
.func: .func:
mov dword [SteviaInfo + SteviaInfoStruct_t.MemoryMapEntries], 0 mov dword [SteviaInfo + SteviaInfoStruct_t.MemoryMapEntries], 0
mov eax, 0xE820 ; select 0xE820 function
xor ebx, ebx ; Continuation value, 0 for the first call xor ebx, ebx ; Continuation value, 0 for the first call
lea dx, [BIOSMemoryMap] mov dx, BIOSMemoryMap
shr dx, 4 shr dx, 4
mov es, dx mov es, dx
xor di, di ; (BIOSMemoryMap >> 4):0 makes di an index into BIOSMemoryMap xor di, di ; (BIOSMemoryMap >> 4):0 makes di an index into BIOSMemoryMap
mov ecx, AddressRangeDescStruct_t_size mov ecx, AddressRangeDescStruct_t_size ; hard request ACPI 3.0 table versions (24 bytes)
mov edx, 0x534D4150 ; 'SMAP' magic
.loop_L1: .loop_L1:
mov eax, 0x0000E820 ; select 0xE820 function
mov edx, 0x534D4150 ; 'SMAP' magic
int 0x15 int 0x15
jc GetMemoryMap.error jc GetMemoryMap.error
cmp eax, 0x534D4150 cmp eax, 0x534D4150
jne GetMemoryMap.no_smap_returned jne GetMemoryMap.no_smap_returned
.no_error: .no_error:
inc dword [SteviaInfo + SteviaInfoStruct_t.MemoryMapEntries] mov eax, dword [SteviaInfo + SteviaInfoStruct_t.MemoryMapEntries]
add eax, 1
mov dword [SteviaInfo + SteviaInfoStruct_t.MemoryMapEntries], eax
cmp ecx, 20 ; TODO: maybe this could be handled better than just panicing cmp ecx, 20 ; TODO: maybe this could be handled better than just panicing
jb GetMemoryMap.nonstandard_e820 ; non-standard entry found jb GetMemoryMap.nonstandard_e820 ; non-standard entry found
@@ -64,9 +68,11 @@ GetMemoryMap:
cmp ebx, 0 cmp ebx, 0
je GetMemoryMap.endp ; 0 in ebx means we have reached the end of memory ranges je GetMemoryMap.endp ; 0 in ebx means we have reached the end of memory ranges
add di, AddressRangeDescStruct_t_size ; increment di to next descriptor ; setup for next loop, ebx is our next index and has already been set.
mov edx, eax ; 'SMAP' to edx xor ecx, ecx
mov eax, 0xE820 ; select E820 function mov ecx, AddressRangeDescStruct_t_size ; set ecx (requested_size) to 24 bytes
add di, cx ; increment di to next descriptor so es:di points to the next free space
jmp GetMemoryMap.loop_L1 jmp GetMemoryMap.loop_L1
.error: .error:
ERROR STAGE2_MM_E820_MISC_ERR ERROR STAGE2_MM_E820_MISC_ERR
@@ -79,5 +85,37 @@ GetMemoryMap:
__CDECL16_EXIT __CDECL16_EXIT
ret ret
PrintMemoryMap:
__CDECL16_ENTRY
.func:
mov eax, dword [SteviaInfo + SteviaInfoStruct_t.MemoryMapEntries]
cmp eax, 0
je PrintMemoryMap.endp ; if entries == 0, exit
mov ecx, eax ; store # of entries in counter
mov eax, BIOSMemoryMap ; address to start of e820 mmap
push dword ecx
push dword eax
call FormatMemoryMapEntry
add sp, 0x8
; ax contains segment offset to string after call
; TODO: going to need an allocator for strings and stuff...
; print_string strformat_buffer
.endp:
__CDECL16_EXIT
ret
FormatMemoryMapEntry:
__CDECL16_ENTRY
.func:
; create a string buffer somewhere and return address to result string in ax
.endp:
__CDECL16_EXIT
ret
%endif %endif
%define __INC_E820MEMORY_MAP %define __INC_E820MEMORY_MAP

View File

@@ -32,7 +32,7 @@ InitFATDriver:
mov ax, fat32_state mov ax, fat32_state
push ax ; address of structure push ax ; address of structure
call kmemset call kmemset
sub sp, 0x6 add sp, 0x6
.calc_active_part: .calc_active_part:
mov ax, word [partition_offset] mov ax, word [partition_offset]
@@ -146,7 +146,7 @@ SearchFATDIR:
xor ax, ax xor ax, ax
push ax ; segment push ax ; segment
call ReadFATCluster ; uint8_t ReadFATCluster(uint16_t seg, uint16_t offset, uint32_t cluster) call ReadFATCluster ; uint8_t ReadFATCluster(uint16_t seg, uint16_t offset, uint32_t cluster)
sub sp, 0x8 add sp, 0x8
.empty_dir_entry: .empty_dir_entry:
; check for 0x0 in first byte, if true then there are no more files ; check for 0x0 in first byte, if true then there are no more files
; if true we did not find the file, we should error here ; if true we did not find the file, we should error here
@@ -221,7 +221,7 @@ NextCluster:
mov ax, fat32_nc_data mov ax, fat32_nc_data
push ax ; address of structure push ax ; address of structure
call kmemset call kmemset
sub sp, 0x6 add sp, 0x6
mov edx, dword [bp + 4] mov edx, dword [bp + 4]
mov si, fat32_nc_data ; instead of push/pop and moving the data back mov si, fat32_nc_data ; instead of push/pop and moving the data back

View File

@@ -0,0 +1,100 @@
%ifndef __INC_ARENA_ALLOC_FUNC
%define __ARENA_HEAP_START 0x8000
%define __ARENA_HEAP_SIZE 0x6000 ; 0x8000 -> 0xE000 = 24KiB of Heap
struc ArenaStateStruc_t
.start resw 1
.end resw 1
.mark resw 1
endstruc
; void arena_init(ArenaState *a)
;
arena_init:
__CDECL16_ENTRY
.func:
movzx eax, word [bp + 4] ; ptr to state structure
mov di, ax
xor eax, eax
mov word [di + ArenaStateStruc_t.mark], eax
mov word [di + ArenaStateStruc_t.end], word (__ARENA_HEAP_START + __ARENA_HEAP_SIZE)
mov word [di + ArenaStateStruc_t.start], __ARENA_HEAP_START
; zero out heap area on init
; void* kmemset_byte(void* dst, uint8_t val, uint16_t len);
mov ax, __ARENA_HEAP_SIZE
push ax ; len
xor ax, ax
push ax ; val = 0
mov ax, __ARENA_HEAP_START
push ax ; dst
call kmemset
add sp, 0x6
.endp:
__CDECL16_EXIT
ret
; size_t align_up(size_t x, size_t a)
; ax, bx. cx are all clobbered
; align x up to the nearest specified alignment (a), a should be a power of 2
; (x + (a-1)) & ~(a-1)
; return value in ax
arena_align_up:
__CDECL16_ENTRY
.func:
mov ax, [bp + 4] ; x
mov bx, [bp + 6]
sub bx, 1 ; a - 1
mov cx, ax
add cx, bx ; x + (a+1)
not bx ; ~(a-1)
and cx, bx ; and with the inverse
mov ax, cx ; move to ax and return
.endp:
__CDECL16_EXIT
ret
; void* arena_alloc(void* a, size_t bytes, size_t align)
arena_alloc:
__CDECL16_ENTRY
.func:
; remove bytes from pool and increment mark to the new cursor location
; return a pointer to the begining of allocated segment
.endp:
__CDECL16_EXIT
ret
arena_mark:
__CDECL16_ENTRY
.func:
; return the current location of the 'cursor' in the allocator
.endp:
__CDECL16_EXIT
ret
arena_reset_to:
__CDECL16_ENTRY
.func:
; rewind the arena to a previously marked point
.endp:
__CDECL16_EXIT
ret
arena_reset:
__CDECL16_ENTRY
.func:
; reset the entire heap to a fresh state
.endp:
__CDECL16_EXIT
ret
%endif
%define __INC_ARENA_ALLOC_FUNC

View File

@@ -1,4 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail
# Copyright (C) 2025 Elaina Claus # Copyright (C) 2025 Elaina Claus
# #
@@ -15,8 +16,8 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
if ! [ $(id -u) = 0 ]; then if [ $(id -u) = 0 ]; then
echo "Script must be run as root!" >&2 echo "Script should not be run as root, it could break something! Exiting!" >&2
exit 1 exit 1
fi fi
@@ -26,235 +27,143 @@ vbr_file=build/vbr.bin
stage2_file=build/stage2.bin stage2_file=build/stage2.bin
boottest_file=build/BOOTi686.bin boottest_file=build/BOOTi686.bin
# Disk creation options # Disk creation options
mount_point=/tmp/stevia_disk disk_img=build/disk.img
disk_tmp_file=/tmp/disk.img disk_img_final=build/output/disk.img.gz
disk_file_final=./disk.img.gz
part_img=build/part.img
part_img_final=build/output/part.img.gz
artifacts_archive=build/output/artifacts.tar.gz
# $disk_sector_size * $disk_size = total bytes, default is 256MiB # $disk_sector_size * $disk_size = total bytes, default is 256MiB
disk_size=(524288 * 2) disk_sectors=(524288 * 2)
disk_sector_size=512 disk_sector_size=512
part_start=2048
part_sectors=$((disk_sectors - part_start))
if ! [ -e $disk_tmp_file ]; then #
# Build sanity section
#
echo "*** Performing pre-build sanity checks ***"
# Tools needed:
# sfdisk dosfstools (mkfs.fat), mtools (mcopy,mmd), gzip, dd, truncate, awk
for t in mcopy mmd gzip dd truncate awk; do
command -v "$t" >/dev/null || { echo "Missing tool: $t" >&2; exit 1; }
done
# these are normally in the sbin paths so I've had issues detecting them with command -v
SF=$(command -v sfdisk || echo /usr/sbin/sfdisk)
MKFS=$(command -v mkfs.fat || echo /usr/sbin/mkfs.fat)
[[ -x "$SF" ]] || { echo "sfdisk not found"; exit 1; }
[[ -x "$MKFS" ]] || { echo "mkfs.fat not found"; exit 1; }
# check that required build files exist
for f in "$mbr_file" "$vbr_file" "$stage2_file" "$boottest_file"; do
[[ -f "$f" ]] || { echo "missing $f" >&2; exit 1; }
done
cat > /tmp/pt.sfdisk <<EOF
label: dos
unit: sectors
sector-size: $disk_sector_size
label-id: 0xa0b0c0d0
start=$part_start, size=$((disk_sectors - part_start)), type=c, bootable
EOF
mtool_src=/tmp/mtools.conf
cat > $mtool_src <<EOF
drive c: file="$part_img"
EOF
#
# Create disk images
#
echo "[1/7] Create disk.img and part.img"
if ! [ -e "$disk_img" ]; then
# create raw disk image # create raw disk image
if ! dd if=/dev/zero of=$disk_tmp_file bs=$disk_sector_size count=$disk_size; then if ! truncate -s $((disk_sectors * disk_sector_size)) "$disk_img"; then
echo "Failed creating blank disk image." >&2 echo "Failed creating blank disk image." >&2
exit 1 exit 1
fi fi
sync sync
else else
echo "Removing old disk image..." echo "Removing old disk image..."
rm -rfv $disk_tmp_file rm -rfv "$disk_img"
if ! dd if=/dev/zero of=$disk_tmp_file bs=$disk_sector_size count=$disk_size; then if ! truncate -s $((disk_sectors * disk_sector_size)) "$disk_img"; then
echo "Failed creating blank disk image." >&2 echo "Failed creating blank disk image." >&2
exit 1 exit 1
fi fi
sync sync
fi fi
if [[ "$OSTYPE" == "linux-gnu"* ]]; then if ! [ -e "$part_img" ]; then
if [ -e $mbr_file ] && [ -e $vbr_file ]; then # create raw partition disk image
# get next loop device and mount it if ! truncate -s $((part_sectors * disk_sector_size)) "$part_img"; then
ld=$(losetup -f) echo "Failed creating blank partition image." >&2
losetup -P -b 512 $ld $disk_tmp_file
# create a DOS disk, with 1 FAT32 partition that is bootable, part1 starts at sector 2048
sfdisk $ld < scripts/loop_setup.sfdisk
# get first partition, this is sloppy might need to review this...
firstpart=$(lsblk -ilp -o NAME $ld | tr '\n' ' ' | awk '{print $3}')
mkfs.fat -v -F32 -s 1 -n 'STEVIAFS' $firstpart
#
# MBR setup
#
# copy MBR while preserving partition table
if ! dd if=$mbr_file of=$ld bs=1 count=440; then
echo "Failed to write MBR to disk. (part 1)" >&2
exit 1
fi
# copy MBR 0xAA55
if ! dd if=$mbr_file of=$ld bs=1 seek=510 skip=510 count=2; then
echo "Failed to write MBR to disk. (part 2)" >&2
exit 1
fi
#
# VBR Setup & backup VBR
#
# copy VBR to partition 1 while preserving partition information
# copy jmp short entry; nop
if ! dd if=$vbr_file of=$firstpart bs=1 count=3; then
echo "Failed to write VBR to disk. (part 1)" >&2
exit 1
fi
# copy bootcode
if ! dd if=$vbr_file of=$firstpart bs=1 seek=90 skip=90 count=420; then
echo "Failed to write VBR to disk. (part 2)" >&2
exit 1
fi
# copy 0xAA55
if ! dd if=$vbr_file of=$firstpart bs=1 seek=510 skip=510 count=2; then
echo "Failed to write VBR to disk. (part 3)" >&2
exit 1
fi
# write backup VBR
if ! dd if=$firstpart of=$firstpart bs=$disk_sector_size count=1 seek=6; then
echo "Failed to copy VBR (sector 1) to backup VBR." >&2
exit 1
fi
#
# Stage2 Setup
#
#stage2 to sectors 1-64
if ! dd if=$stage2_file of=$ld bs=$disk_sector_size seek=1; then
echo "Failed to write Stage2 to disk." >&2
exit 1
fi
# copy boot32 boot test file to disk image
if ! [ -e $mount_point ]; then
mkdir $mount_point
fi
mount $firstpart $mount_point
# ensure mountpoint is actually a mountpoint
if ! mountpoint -q $mount_point; then
echo "Failed to mount partition at $mount_point." >&2
exit 1
fi
# copy kernel to filesystem
if [ -e $boottest_file ]; then
cp -v $boottest_file $mount_point/BOOT.BIN
else
echo "Failed to write $boottest_file to disk image" >&2
exit 1
fi
#
# Final Cleanup
#
# detach loop device
umount $mount_point
sync
sleep 1
losetup -d $ld
# chown to the real user to prevent issues with reading/writing the file later
# BUG: ${logname}:$(id $(logname -g)) doesn't work right on WSL because of runlevel hacks in WSL
# BUG: https://github.com/microsoft/WSL/issues/1761
# as a work around I'll just reference LICENSE.md...WHICH SHOULD ALWAYS BE THERE 👀
chown --from=root:root --reference=LICENSE.md $disk_tmp_file
else
echo "unable to find MBR/VBR binaries!" >&2
exit 1 exit 1
fi fi
# requires util-linux from homebrew sync
elif [[ "$OSTYPE" == "darwin"* ]]; then else
sfdisk_path="/usr/local/opt/util-linux/sbin/sfdisk" echo "Removing old (partition) disk image..."
if [ -e $mbr_file ] && [ -e $vbr_file ]; then rm -rfv "$part_img"
# use hdiutil to attach our empty disk image if ! truncate -s $((part_sectors * disk_sector_size)) "$part_img"; then
ld_path_raw=$(hdiutil attach -readwrite -imagekey diskimage-class=CRawDiskImage -nomount -blocksize 512 -noverify /tmp/disk.img) echo "Failed creating blank partition image." >&2
ld=$(echo $ld_path_raw | sed s:/dev/::) exit 1
ld_path="/dev/$ld"
# create a DOS disk, with 1 FAT32 partition
if ! [ -e $sfdisk_path ]; then
echo "sfdisk utility was not found...We cannot use diskutil to make disks due to the fact that it only makes Hybrid MBR's & GPT disks...blame Apple"
exit 4
else
$sfdisk_path $ld_path < scripts/loop_setup.sfdisk
fi
# give stuff a chance to settle, macOS has problems here
sync
sleep .5
# reattch the raw image file since macOS doesn't have a partprobe...
# this is the only way I know to get macOS to reprobe the disk
hdiutil eject $ld
unset ld_path
unset ld
unset ld_path_raw
ld_path_raw=$(hdiutil attach -readwrite -imagekey diskimage-class=CRawDiskImage -nomount -blocksize 512 -noverify /tmp/disk.img)
ld=$(echo $ld_path_raw | grep "FDisk_partition_scheme" | awk '{print $1}' | sed s:/dev/::)
ld_path="/dev/$ld"
if ! [ -b /dev/$ld ]; then
echo "Unable to remount disk! exitting before I do some damage!"
exit 5
fi
# get first partition and format as FAT32
firstpart=$(diskutil list $ld | grep 1: | awk '{print $6}')
firstpart_direct="r$firstpart"
newfs_msdos -F 32 /dev/$firstpart_direct
sync
# copy MBR while preserving partition table
dd if=$mbr_file of=$ld_path bs=1 count=440 conv=sync
# copy MBR 0xAA55
dd if=$mbr_file of=$ld_path bs=1 seek=510 skip=510 count=2 conv=sync
# copy VBR to partition 1 while preserving partition information
# copy jmp short entry; nop
dd if=$vbr_file of=/dev/$firstpart bs=1 count=3 conv=sync
# copy bootcode
dd if=$vbr_file of=/dev/$firstpart bs=1 seek=90 skip=90 count=420 conv=sync
# copy 0xAA55
dd if=$vbr_file of=/dev/$firstpart bs=1 seek=510 skip=510 count=2 conv=sync
#stage2 to sectors 1-64
dd if=$stage2_file of=$ld_path bs=$disk_sector_size seek=1 conv=sync
#sync pending dd stuff
sync
# copy boot32 boot test file to disk image
if ! [ -e $mount_point ]; then
mkdir $mount_point
else
echo "$mount_point exists! clearing contents..."
rm -rfv $mount_point
mkdir $mount_point
fi
mount -t msdos /dev/$firstpart $mount_point
if [ -e $boottest_file ]; then
cp -v $boottest_file $mount_point
else
echo "unable to find boot32.bin!"
exit 3
fi
# detach loop device
sync
umount /dev/$firstpart
hdiutil eject $ld
# chown to the real user to prevent issues with reading/writing the file later
SUDOUSER=$(logname)
chown ${SUDOUSER}:staff disk.img
gzip -9kc $disk_tmp_file > $disk_file_final
else
echo "unable to find MBR/VBR binaries!"
exit 2
fi fi
sync
fi
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
echo "[2/7] Write DOS partition table (single FAT32 LBA @ 2048)"
"$SF" --no-reread "$disk_img" < /tmp/pt.sfdisk
echo "[3/7] Make FAT32 filesystem in partition image"
"$MKFS" -v -F32 -s 1 -n 'STEVIAFS' "$part_img"
echo "[4/7] Patch VBR inside partition image (preserve BPB)"
# copy jmp short entry; nop
dd if=$vbr_file of="$part_img" bs=1 count=3 conv=notrunc
# copy bootcode
dd if=$vbr_file of="$part_img" bs=1 seek=90 skip=90 count=420 conv=notrunc
# copy signature (should be 0xAA55)
dd if=$vbr_file of="$part_img" bs=1 seek=510 skip=510 count=2 conv=notrunc
# copy backup VBR within the created partition image
# Linux dosfstools will complain (read: not work) unless this is done it seems
# HACK: sector 6 is the **default** location of the BPB_BkBootSec, it **can** be different.
dd if="$part_img" of="$part_img" bs=$disk_sector_size count=1 seek=6 conv=notrunc
echo "[5/7] Copy boot payload to FAT32 filesystem using mtools as BOOT.BIN"
MTOOLSRC="$mtool_src" mcopy "$boottest_file" C:BOOT.BIN
MTOOLSRC="$mtool_src" mdir C:
echo "[6/7] Patch MBR and install stage2 loader to disk image"
# patch MBR+signature while preserving partition table
dd if="$mbr_file" of="$disk_img" bs=1 count=440 conv=notrunc
dd if="$mbr_file" of="$disk_img" bs=1 seek=510 skip=510 count=2 conv=notrunc
# copy stage2 to absolute LBA 1
dd if="$stage2_file" of="$disk_img" bs=$disk_sector_size seek=1 conv=notrunc
echo "[7/7] Assembling final disk image"
# place partition at it's place in the disk image
dd if="$part_img" of="$disk_img" bs=$disk_sector_size seek=$part_start conv=notrunc
echo " *** Outputing disk images will be in ./build/output/* *** "
gzip -9c "$disk_img" > "$disk_img_final"
gzip -9c "$part_img" > "$part_img_final"
tar caf "$artifacts_archive" build/*.bin build/*.map
else else
# Unknown. # Unknown.
echo "Unknown OS type! Supported build hosts systems are GNU/Linux (WSL) and macOS." echo "Unknown OS type! Supported build hosts systems are GNU/Linux (& WSL)"
exit 1 exit 1
fi fi

View File

@@ -1,5 +0,0 @@
label: dos
unit: sectors
sector-size: 512
start= 2048, type=c, bootable

View File

@@ -18,7 +18,7 @@
[CPU KATMAI] [CPU KATMAI]
[WARNING -reloc-abs-byte] [WARNING -reloc-abs-byte]
[WARNING -reloc-abs-word] ; Yes, we use absolute addresses. surpress these warnings. [WARNING -reloc-abs-word] ; Yes, we use absolute addresses. surpress these warnings.
[map all mbr.map] [map all build/mbr.map]
%define __STEVIA_MBR %define __STEVIA_MBR
jmp short (init - $$) jmp short (init - $$)
nop nop

View File

@@ -16,7 +16,7 @@
[BITS 16] [BITS 16]
[ORG 0x0500] ; IF YOU CHANGE ORG CHANGE THE SIGN OFFSET AT THE END [ORG 0x0500] ; IF YOU CHANGE ORG CHANGE THE SIGN OFFSET AT THE END
[CPU KATMAI] [CPU KATMAI]
[map all stage2.map] [map all build/stage2.map]
[WARNING -reloc-abs-byte] [WARNING -reloc-abs-byte]
[WARNING -reloc-abs-word] [WARNING -reloc-abs-word]
[WARNING -reloc-abs-dword] ; Yes, we use absolute addresses. surpress these warnings. [WARNING -reloc-abs-dword] ; Yes, we use absolute addresses. surpress these warnings.
@@ -160,7 +160,7 @@ main:
call GetMemoryMap call GetMemoryMap
print_string MemoryMap_OK_info print_string MemoryMap_OK_info
; enter unreal mode ; enter unreal mode (16 bit code, 32 bit flat memory model)
call EnterUnrealMode call EnterUnrealMode
print_string UnrealMode_OK_info print_string UnrealMode_OK_info
@@ -361,13 +361,13 @@ begin_data:
%define CRLF 0Dh, 0Ah %define CRLF 0Dh, 0Ah
%macro define_cstr 2 %macro define_cstr 2
ALIGN 16 align 16
%1_cstr: %1_cstr:
db %2, 00h db %2, 00h
%endmacro %endmacro
%macro define_info 2 %macro define_info 2
ALIGN 16 align 16
%1_info: %1_info:
db %2, CRLF, 00h db %2, CRLF, 00h
%endmacro %endmacro
@@ -386,7 +386,7 @@ define_info MaybeFound_Boot, "Maybe found a file...checking..."
define_cstr BootTarget, "BOOT BIN" define_cstr BootTarget, "BOOT BIN"
ALIGN 16, db 0 align 16, db 0
BootTarget: BootTarget:
db 'BOOT BIN' db 'BOOT BIN'
@@ -394,28 +394,28 @@ BootTarget:
; pre-bss init globals (generally const...but there are exceptions) ; pre-bss init globals (generally const...but there are exceptions)
; ;
align 8, db 0x00 align 8, db 0
boot_drive: boot_drive:
db 0x00 db 0x00
align 8, db 0x00 align 8, db 0
partition_offset: partition_offset:
dw 0x0000 dw 0x0000
align 8, db 0x00 align 8, db 0
vbr_fat32_bpb_ptr: vbr_fat32_bpb_ptr:
dw 0x0000 dw 0x0000
align 8, db 0x00 align 8, db 0
vbr_part_table_ptr: vbr_part_table_ptr:
dw 0x0000 dw 0x0000
ALIGN 16 align 16, db 0
IntToHex_table: IntToHex_table:
db '0123456789ABCDEF' db '0123456789ABCDEF'
; see docs/gdt.txt for a quick refresher on GDT ; see docs/gdt.txt for a quick refresher on GDT
ALIGN 16, db 0 align 16, db 0
unreal_gdt_info: unreal_gdt_info:
unreal_gdt_size: dw (unreal_gdt_end - unreal_gdt_start) - 1 unreal_gdt_size: dw (unreal_gdt_end - unreal_gdt_start) - 1
unreal_gdt_ptr: dd ((__STAGE2_SEGMENT << 4) + unreal_gdt_start) unreal_gdt_ptr: dd ((__STAGE2_SEGMENT << 4) + unreal_gdt_start)
@@ -438,7 +438,7 @@ unreal_gdt_start:
db 0x00 ; Base Address(31:24) db 0x00 ; Base Address(31:24)
unreal_gdt_end: unreal_gdt_end:
ALIGN 16, db 0 align 16, db 0
gdt32_info: gdt32_info:
gdt32_size: dw (gdt32_end - gdt32_start) - 1 gdt32_size: dw (gdt32_end - gdt32_start) - 1
gdt32_ptr: dd ((__STAGE2_SEGMENT << 4) + gdt32_start) gdt32_ptr: dd ((__STAGE2_SEGMENT << 4) + gdt32_start)
@@ -474,19 +474,19 @@ gdt32_start:
db 0x00 db 0x00
gdt32_end: gdt32_end:
ALIGN 8,db 0x00 align 16,db 0
BUILD_NASM_VER: BUILD_NASM_VER:
db "Stevia Stage2 built with NASM - ", __NASM_VER__, 00h db "Stevia Stage2 built with NASM - ", __NASM_VER__, 00h
ALIGN 8,db 0x00 align 16,db 0
BUILD_DATETIME: BUILD_DATETIME:
db 'Assembled - ', __DATE__, ' ', __TIME__, 00h db 'Assembled - ', __DATE__, ' ', __TIME__, 00h
ALIGN 8,db 0x00 align 16,db 0
BUILD_GIT_VER: BUILD_GIT_VER:
db __GIT_VER__, 00h db __GIT_VER__, 00h
ALIGN 8,db 0x00 align 16,db 0
BUILD_GIT_HASH: BUILD_GIT_HASH:
db __GIT_HASH__, 00h db __GIT_HASH__, 00h
end_data: end_data:
@@ -504,24 +504,29 @@ section .bss follows=.sign
begin_bss: begin_bss:
; structures ; structures
align 8, resb 1 align 16, resb 1
partition_table resb PartTable_t_size partition_table:
resb PartTable_t_size
align 8, resb 1 align 16, resb 1
fat32_bpb resb FAT32_bpb_t_size fat32_bpb:
fat32_ebpb resb FAT32_ebpb_t_size resb FAT32_bpb_t_size
fat32_ebpb:
resb FAT32_ebpb_t_size
align 8, resb 1 align 16, resb 1
fat32_nc_data resb 16 fat32_nc_data:
resb 16
align 8, resb 1 align 16, resb 1
lba_packet resb LBAPkt_t_size lba_packet:
resb LBAPkt_t_size
align 8, resb 1 align 16, resb 1
fat32_state: fat32_state:
resb FAT32_State_t_size resb FAT32_State_t_size
align 8, resb 1 align 16, resb 1
SteviaInfo: SteviaInfo:
resd 4 resd 4
; ;
@@ -541,12 +546,15 @@ dir_buffer:
fat_fsinfo: fat_fsinfo:
resb 512 resb 512
; TODO: this will hold 42 entries from the map function
; the e820 function needs to check that it doesn't overflow
; but realisticly 42 entries is enough for dev work
align 16, resb 1 align 16, resb 1
%define BIOSMemoryMap_SIZE 2048 %define BIOSMemoryMap_SIZE 1024
BIOSMemoryMap: BIOSMemoryMap:
resb 2048 resb BIOSMemoryMap_SIZE
align 512, resb 1 align 16, resb 1
stack_bottom: stack_bottom:
resb 1024 resb 1024
stack_top: stack_top:

View File

@@ -17,7 +17,7 @@
[CPU KATMAI] [CPU KATMAI]
[WARNING -reloc-abs-byte] [WARNING -reloc-abs-byte]
[WARNING -reloc-abs-word] [WARNING -reloc-abs-word]
[map all vbr.map] ; Yes, we use absolute addresses. surpress these warnings. [map all build/vbr.map] ; Yes, we use absolute addresses. surpress these warnings.
%define __STEVIA_VBR %define __STEVIA_VBR
section .text section .text
__ENTRY: __ENTRY: