Build the kernel as an FXF binary and boot using the new boot mechanism
This commit is contained in:
parent
cc40cce81b
commit
a7064075e7
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,7 +1,6 @@
|
||||||
|
|
||||||
**/.vscode/
|
**/.vscode/
|
||||||
|
|
||||||
**/system.bin
|
|
||||||
**/*.fxf
|
**/*.fxf
|
||||||
**/wallpaper.inc
|
**/wallpaper.inc
|
||||||
**/wallpapr.raw
|
**/wallpapr.raw
|
||||||
|
|
38
bootloader/main.asm
Normal file
38
bootloader/main.asm
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
; fox32os bootloader
|
||||||
|
|
||||||
|
org 0x00000800
|
||||||
|
|
||||||
|
const LOAD_ADDRESS: 0x03000000
|
||||||
|
|
||||||
|
; open kernel.fxf
|
||||||
|
mov r0, kernel_file_name
|
||||||
|
movz.8 r1, 0
|
||||||
|
mov r2, kernel_file_struct
|
||||||
|
call [0xF0045008] ; ryfs_open
|
||||||
|
cmp r0, 0
|
||||||
|
ifz jmp error
|
||||||
|
|
||||||
|
; load it into memory
|
||||||
|
mov r0, kernel_file_struct
|
||||||
|
mov r1, LOAD_ADDRESS
|
||||||
|
call [0xF0045014] ; ryfs_read_whole_file
|
||||||
|
|
||||||
|
; relocate it and off we go!!
|
||||||
|
mov r0, LOAD_ADDRESS
|
||||||
|
call fxf_reloc
|
||||||
|
jmp r0
|
||||||
|
|
||||||
|
error:
|
||||||
|
mov r0, error_str
|
||||||
|
movz.8 r1, 16
|
||||||
|
movz.8 r2, 16
|
||||||
|
mov r3, 0xFFFFFFFF
|
||||||
|
movz.8 r4, 0
|
||||||
|
call [0xF0042004] ; draw_str_to_background
|
||||||
|
rjmp 0
|
||||||
|
|
||||||
|
kernel_file_name: data.str "kernel fxf" data.8 0
|
||||||
|
kernel_file_struct: data.32 0 data.32 0
|
||||||
|
error_str: data.str "failed to open kernel.fxf" data.8 0
|
||||||
|
|
||||||
|
#include "reloc.asm"
|
58
bootloader/reloc.asm
Normal file
58
bootloader/reloc.asm
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
; FXF relocation routines
|
||||||
|
|
||||||
|
const FXF_CODE_SIZE: 0x00000004
|
||||||
|
const FXF_CODE_PTR: 0x00000008
|
||||||
|
const FXF_RELOC_SIZE: 0x0000000C
|
||||||
|
const FXF_RELOC_PTR: 0x00000010
|
||||||
|
|
||||||
|
; relocate a FXF binary
|
||||||
|
; inputs:
|
||||||
|
; r0: pointer to memory buffer containing a FXF binary
|
||||||
|
; outputs:
|
||||||
|
; r0: relocation address
|
||||||
|
fxf_reloc:
|
||||||
|
; calculate relocation address
|
||||||
|
mov r5, r0
|
||||||
|
add r5, FXF_CODE_PTR
|
||||||
|
mov r5, [r5]
|
||||||
|
add r5, r0
|
||||||
|
|
||||||
|
; get the number of entries in the reloc table
|
||||||
|
mov r1, r0
|
||||||
|
add r1, FXF_RELOC_SIZE
|
||||||
|
mov r1, [r1]
|
||||||
|
div r1, 4
|
||||||
|
mov r31, r1
|
||||||
|
|
||||||
|
; get the pointer to the table
|
||||||
|
mov r1, r0
|
||||||
|
add r1, FXF_RELOC_PTR
|
||||||
|
mov r1, [r1]
|
||||||
|
add r1, r0
|
||||||
|
|
||||||
|
; get the pointer to the code
|
||||||
|
mov r2, r0
|
||||||
|
add r2, FXF_CODE_PTR
|
||||||
|
mov r2, [r2]
|
||||||
|
add r2, r0
|
||||||
|
|
||||||
|
; loop over the reloc table entries and relocate the code
|
||||||
|
fxf_reloc_loop:
|
||||||
|
; get the reloc table entry
|
||||||
|
mov r3, [r1]
|
||||||
|
|
||||||
|
; point to the location in the code
|
||||||
|
mov r4, r2
|
||||||
|
add r4, r3
|
||||||
|
|
||||||
|
; relocate
|
||||||
|
add [r4], r5
|
||||||
|
|
||||||
|
; increment the reloc table pointer
|
||||||
|
add r1, 4
|
||||||
|
loop fxf_reloc_loop
|
||||||
|
|
||||||
|
; return relocation address
|
||||||
|
mov r0, r5
|
||||||
|
|
||||||
|
ret
|
10
build.sh
10
build.sh
|
@ -7,11 +7,17 @@ mkdir -p base_image
|
||||||
# if fox32os.img doesn't exist, then create it
|
# if fox32os.img doesn't exist, then create it
|
||||||
if [ ! -f fox32os.img ]; then
|
if [ ! -f fox32os.img ]; then
|
||||||
echo "fox32os.img not found, creating it"
|
echo "fox32os.img not found, creating it"
|
||||||
meta/ryfs/ryfs.py -s 16777216 -l fox32os create fox32os.img
|
|
||||||
|
echo "assembling bootloader"
|
||||||
|
../fox32asm/target/release/fox32asm bootloader/main.asm bootloader/bootloader.bin
|
||||||
|
|
||||||
|
meta/ryfs/ryfs.py -s 16777216 -l fox32os -b bootloader/bootloader.bin create fox32os.img
|
||||||
|
|
||||||
|
rm bootloader/bootloader.bin
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "assembling kernel"
|
echo "assembling kernel"
|
||||||
../fox32asm/target/release/fox32asm kernel/main.asm base_image/system.bin
|
../fox32asm/target/release/fox32asm kernel/main.asm base_image/kernel.fxf
|
||||||
|
|
||||||
echo "assembling launcher"
|
echo "assembling launcher"
|
||||||
../fox32asm/target/release/fox32asm launcher/main.asm base_image/launcher.fxf
|
../fox32asm/target/release/fox32asm launcher/main.asm base_image/launcher.fxf
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
; fox32os kernel
|
; fox32os kernel
|
||||||
|
|
||||||
org 0x00000800
|
|
||||||
|
|
||||||
const FOX32OS_VERSION_MAJOR: 0
|
const FOX32OS_VERSION_MAJOR: 0
|
||||||
const FOX32OS_VERSION_MINOR: 1
|
const FOX32OS_VERSION_MINOR: 1
|
||||||
const FOX32OS_VERSION_PATCH: 0
|
const FOX32OS_VERSION_PATCH: 1
|
||||||
|
|
||||||
const SYSTEM_STACK: 0x01FFF800
|
const SYSTEM_STACK: 0x01FFF800
|
||||||
const BACKGROUND_COLOR: 0xFF674764
|
const BACKGROUND_COLOR: 0xFF674764
|
||||||
|
@ -12,17 +10,17 @@ const TEXT_COLOR: 0xFFFFFFFF
|
||||||
|
|
||||||
jmp entry
|
jmp entry
|
||||||
|
|
||||||
jump_table:
|
|
||||||
; system jump table
|
; system jump table
|
||||||
org.pad 0x00000810
|
org.pad 0x00000010
|
||||||
|
jump_table:
|
||||||
data.32 get_os_version
|
data.32 get_os_version
|
||||||
|
|
||||||
; FXF jump table
|
; FXF jump table
|
||||||
org.pad 0x00000910
|
org.pad 0x00000110
|
||||||
data.32 parse_fxf_binary
|
data.32 parse_fxf_binary
|
||||||
|
|
||||||
; task jump table
|
; task jump table
|
||||||
org.pad 0x00000A10
|
org.pad 0x00000210
|
||||||
data.32 new_task
|
data.32 new_task
|
||||||
data.32 yield_task
|
data.32 yield_task
|
||||||
data.32 end_current_task
|
data.32 end_current_task
|
||||||
|
@ -31,12 +29,12 @@ jump_table:
|
||||||
data.32 is_task_id_used
|
data.32 is_task_id_used
|
||||||
|
|
||||||
; memory jump table
|
; memory jump table
|
||||||
org.pad 0x00000B10
|
org.pad 0x00000310
|
||||||
data.32 allocate_memory
|
data.32 allocate_memory
|
||||||
data.32 free_memory
|
data.32 free_memory
|
||||||
|
|
||||||
; window jump table
|
; window jump table
|
||||||
org.pad 0x00000C10
|
org.pad 0x00000410
|
||||||
data.32 new_window
|
data.32 new_window
|
||||||
data.32 destroy_window
|
data.32 destroy_window
|
||||||
data.32 new_window_event
|
data.32 new_window_event
|
||||||
|
@ -48,7 +46,7 @@ jump_table:
|
||||||
data.32 start_dragging_window
|
data.32 start_dragging_window
|
||||||
|
|
||||||
; VFS jump table
|
; VFS jump table
|
||||||
org.pad 0x00000D10
|
org.pad 0x00000510
|
||||||
data.32 open
|
data.32 open
|
||||||
data.32 seek
|
data.32 seek
|
||||||
data.32 tell
|
data.32 tell
|
||||||
|
@ -56,8 +54,9 @@ jump_table:
|
||||||
data.32 write
|
data.32 write
|
||||||
|
|
||||||
; shell jump table
|
; shell jump table
|
||||||
org.pad 0x00000E10
|
org.pad 0x00000610
|
||||||
data.32 new_shell_task
|
data.32 new_shell_task
|
||||||
|
jump_table_end:
|
||||||
|
|
||||||
; initialization code
|
; initialization code
|
||||||
entry:
|
entry:
|
||||||
|
@ -81,6 +80,13 @@ entry:
|
||||||
mov r12, FOX32OS_VERSION_PATCH
|
mov r12, FOX32OS_VERSION_PATCH
|
||||||
call draw_format_str_to_background
|
call draw_format_str_to_background
|
||||||
|
|
||||||
|
; copy the jump table to 0x00000810
|
||||||
|
mov r0, jump_table
|
||||||
|
mov r1, 0x00000810
|
||||||
|
mov r2, jump_table_end
|
||||||
|
sub r2, jump_table
|
||||||
|
call copy_memory_bytes
|
||||||
|
|
||||||
; check if a disk is inserted as disk 1
|
; check if a disk is inserted as disk 1
|
||||||
; if so, skip checking startup.cfg and just run disk 1
|
; if so, skip checking startup.cfg and just run disk 1
|
||||||
in r31, 0x80001001
|
in r31, 0x80001001
|
||||||
|
|
Loading…
Reference in New Issue
Block a user