[SC64][SW] Bootloader fixes

This commit is contained in:
Mateusz Faderewski 2023-01-30 05:55:15 +01:00
parent 40a4b3e222
commit 65baa521b4
11 changed files with 84 additions and 57 deletions

View File

@ -30,12 +30,12 @@ build_bootloader () {
if [ "$FORCE_CLEAN" = true ]; then if [ "$FORCE_CLEAN" = true ]; then
make clean make clean
fi fi
FLAGS="$USER_FLAGS" VERSION=""
if [ ! -z "${GIT_BRANCH+x}" ]; then FLAGS+=" -DGIT_BRANCH='\"$GIT_BRANCH\"'"; fi if [ ! -z "${GIT_BRANCH+x}" ]; then VERSION+=" -DGIT_BRANCH='\"$GIT_BRANCH\"'"; fi
if [ ! -z "${GIT_TAG+x}" ]; then FLAGS+=" -DGIT_TAG='\"$GIT_TAG\"'"; fi if [ ! -z "${GIT_TAG+x}" ]; then VERSION+=" -DGIT_TAG='\"$GIT_TAG\"'"; fi
if [ ! -z "${GIT_SHA+x}" ]; then FLAGS+=" -DGIT_SHA='\"$GIT_SHA\"'"; fi if [ ! -z "${GIT_SHA+x}" ]; then VERSION+=" -DGIT_SHA='\"$GIT_SHA\"'"; fi
if [ ! -z "${GIT_MESSAGE+x}" ]; then FLAGS+=" -DGIT_MESSAGE='\"$GIT_MESSAGE\"'"; fi if [ ! -z "${GIT_MESSAGE+x}" ]; then VERSION+=" -DGIT_MESSAGE='\"$GIT_MESSAGE\"'"; fi
make all -j USER_FLAGS="$FLAGS" make all -j VERSION="$VERSION" USER_FLAGS="$USER_FLAGS"
popd > /dev/null popd > /dev/null
BUILT_BOOTLOADER=true BUILT_BOOTLOADER=true

View File

@ -10,6 +10,7 @@ FLAGS = -march=vr4300 -mtune=vr4300 $(USER_FLAGS)
CFLAGS = -Os -Wall -ffunction-sections -fdata-sections -ffreestanding -MMD -MP CFLAGS = -Os -Wall -ffunction-sections -fdata-sections -ffreestanding -MMD -MP
ASFLAGS = -Wa,-I$(N64_INST)/mips64-elf/lib ASFLAGS = -Wa,-I$(N64_INST)/mips64-elf/lib
LDFLAGS = -lc -nostartfiles -Wl,--gc-sections LDFLAGS = -lc -nostartfiles -Wl,--gc-sections
VERSION ?=
SRC_DIR = src SRC_DIR = src
ASSET_DIR = assets ASSET_DIR = assets
@ -57,6 +58,9 @@ $(BUILD_DIR)/%.S.o: %.S
$(BUILD_DIR)/%.c.o: %.c $(BUILD_DIR)/%.c.o: %.c
$(CC) $(FLAGS) $(CFLAGS) -c $< -o $@ $(CC) $(FLAGS) $(CFLAGS) -c $< -o $@
$(BUILD_DIR)/version.c.o: version.c .FORCE
$(CC) $(FLAGS) $(CFLAGS) $(VERSION) -c $< -o $@
$(BUILD_DIR)/%.asset: $(ASSET_DIR)/%.png tools/asset_converter.py $(BUILD_DIR)/%.asset: $(ASSET_DIR)/%.png tools/asset_converter.py
$(PYTHON) tools/asset_converter.py $< $@ --compress $(PYTHON) tools/asset_converter.py $< $@ --compress
@ -67,13 +71,9 @@ $(BUILD_DIR)/bootloader.elf: $(OBJS) N64.ld
$(CXX) $(FLAGS) $(LDFLAGS) -TN64.ld $(OBJS) -o $@ $(CXX) $(FLAGS) $(LDFLAGS) -TN64.ld $(OBJS) -o $@
@$(OBJDUMP) -S $@ > $(BUILD_DIR)/bootloader.lst @$(OBJDUMP) -S $@ > $(BUILD_DIR)/bootloader.lst
$(BUILD_DIR)/bootloader.bin: $(BUILD_DIR)/bootloader.elf tools/strip.py $(BUILD_DIR)/bootloader.bin: $(BUILD_DIR)/bootloader.elf tools/finalize.py
@$(OBJCOPY) -O binary $< $@ @$(OBJCOPY) -O binary $< $@
@chksum64 $@ > /dev/null @$(PYTHON) tools/finalize.py $@ > /dev/null
@$(PYTHON) tools/strip.py $@ 1024
$(BUILD_DIR)/bootloader.hex: $(BUILD_DIR)/bootloader.bin
@$(OBJCOPY) -I binary -O ihex $< $@
print_size: $(BUILD_DIR)/bootloader.elf print_size: $(BUILD_DIR)/bootloader.elf
@echo 'Size of modules:' @echo 'Size of modules:'
@ -81,13 +81,11 @@ print_size: $(BUILD_DIR)/bootloader.elf
@echo 'Size of bootloader:' @echo 'Size of bootloader:'
@$(SIZE) -B -d $< @$(SIZE) -B -d $<
all: $(BUILD_DIR)/bootloader.hex print_size all: $(BUILD_DIR)/bootloader.bin print_size
clean: clean:
@rm -rf ./$(BUILD_DIR)/* @rm -rf ./$(BUILD_DIR)/*
$(BUILD_DIR)/version.c.o: .FORCE
.FORCE: .FORCE:
.PHONY: .FORCE all clean print_size .PHONY: .FORCE all clean print_size

View File

@ -45,12 +45,6 @@ SECTIONS {
_ebss = .; _ebss = .;
} > ram } > ram
.fill : {
FILL(0xFF);
BYTE(0xFF);
. = ORIGIN(rom) + LENGTH(rom);
} > rom
_sheap = .; _sheap = .;
. = ORIGIN(ram) + LENGTH(ram) - __exception_stack_size - __stack_size; . = ORIGIN(ram) + LENGTH(ram) - __exception_stack_size - __stack_size;
_eheap = .; _eheap = .;

View File

@ -1,4 +1,5 @@
.section .assets.@sym@ .section .assets.@sym@, "a", %progbits
.type assets_@sym@, %object
.global assets_@sym@ .global assets_@sym@
assets_@sym@: assets_@sym@:
.incbin "@file@" .incbin "@file@"

View File

@ -14,7 +14,7 @@
#define LINE_SPACING (2) #define LINE_SPACING (2)
static io32_t display_framebuffer[SCREEN_WIDTH * SCREEN_HEIGHT] __attribute__((section(".framebuffer"))); static io32_t display_framebuffer[SCREEN_WIDTH * SCREEN_HEIGHT] __attribute__((section(".framebuffer, \"aw\", %nobits#")));
static int char_x; static int char_x;
static int char_y; static int char_y;
static const vi_regs_t vi_config[] = {{ static const vi_regs_t vi_config[] = {{

View File

@ -7,6 +7,7 @@
#define VECTOR_SIZE (0x80) #define VECTOR_SIZE (0x80)
#define VECTOR_NUM (4) #define VECTOR_NUM (4)
#define ZR_OFFSET (0)
#define AT_OFFSET (8) #define AT_OFFSET (8)
#define V0_OFFSET (16) #define V0_OFFSET (16)
#define V1_OFFSET (24) #define V1_OFFSET (24)
@ -49,6 +50,7 @@
exception_handler: exception_handler:
.set noat .set noat
la $k0, (_esp - SAVE_REGISTERS_SIZE) la $k0, (_esp - SAVE_REGISTERS_SIZE)
sd $zero, ZR_OFFSET($k0)
sd $at, AT_OFFSET($k0) sd $at, AT_OFFSET($k0)
sd $v0, V0_OFFSET($k0) sd $v0, V0_OFFSET($k0)
sd $v1, V1_OFFSET($k0) sd $v1, V1_OFFSET($k0)

View File

@ -2,7 +2,8 @@
.set noreorder .set noreorder
.section .data.ipl2 .section .text.ipl2, "ax", %progbits
.type ipl2, %object
ipl2: ipl2:
.global ipl2 .global ipl2
lui $t5, 0xBFC0 lui $t5, 0xBFC0

View File

@ -6,21 +6,25 @@ static version_t version = {
.git_branch = GIT_BRANCH, .git_branch = GIT_BRANCH,
#else #else
#warning "No GIT_BRANCH provided" #warning "No GIT_BRANCH provided"
.git_branch = "GIT_BRANCH",
#endif #endif
#ifdef GIT_TAG #ifdef GIT_TAG
.git_tag = GIT_TAG, .git_tag = GIT_TAG,
#else #else
#warning "No GIT_TAG provided" #warning "No GIT_TAG provided"
.git_tag = "GIT_TAG",
#endif #endif
#ifdef GIT_SHA #ifdef GIT_SHA
.git_sha = GIT_SHA, .git_sha = GIT_SHA,
#else #else
#warning "No GIT_SHA provided" #warning "No GIT_SHA provided"
.git_sha = "GIT_SHA",
#endif #endif
#ifdef GIT_MESSAGE #ifdef GIT_MESSAGE
.git_message = GIT_MESSAGE, .git_message = GIT_MESSAGE,
#else #else
#warning "No GIT_MESSAGE provided" #warning "No GIT_MESSAGE provided"
.git_message = "GIT_MESSAGE",
#endif #endif
}; };

View File

@ -33,9 +33,9 @@ def compress(data: bytes, step_size: int=4) -> bytes:
return compressed_data return compressed_data
if __name__ == "__main__": if __name__ == '__main__':
if (len(sys.argv) < 3): if (len(sys.argv) < 3):
print(f"Usage: python {sys.argv[0]} input_path output_path [--compress]") print(f'Usage: python {sys.argv[0]} input_path output_path [--compress]')
sys.exit(1) sys.exit(1)
asset_input = sys.argv[1] asset_input = sys.argv[1]
@ -47,17 +47,22 @@ if __name__ == "__main__":
try: try:
source_asset = Image.open(asset_input) source_asset = Image.open(asset_input)
converted_asset = source_asset.convert("RGBA").tobytes() converted_asset = source_asset.convert('RGBA').tobytes()
if (asset_compress): if (asset_compress):
converted_asset = compress(converted_asset) converted_asset = compress(converted_asset)
final_asset = open(asset_output, "wb")
final_asset = open(asset_output, 'wb')
final_asset.write(converted_asset) final_asset.write(converted_asset)
except FileNotFoundError: except FileNotFoundError:
print(f"Couldn't open file \"{asset_input}\"") print(f'Couldn\'t open file "{asset_input}"')
sys.exit(2) sys.exit(2)
except Exception as e: except Exception as e:
print(e) print(e)
sys.exit(3) sys.exit(3)
finally: finally:
if (source_asset): if (source_asset):
source_asset.close() source_asset.close()

View File

@ -0,0 +1,50 @@
#!/usr/bin/env python3
import subprocess
import sys
if __name__ == '__main__':
if (len(sys.argv) != 2):
print(f'Usage: python {sys.argv[0]} file_path')
sys.exit(1)
ALIGN = 1024
CHECKSUM_SIZE = 0x101000
bin_file = sys.argv[1]
try:
bin_data = b''
with open(bin_file, 'rb') as f:
bin_data = f.read()
pad_size = CHECKSUM_SIZE - len(bin_data)
if (pad_size > 0):
bin_data += b'\xFF' * pad_size
with open(bin_file, 'wb') as f:
f.write(bin_data)
subprocess.run(['chksum64', bin_file])
with open(bin_file, 'rb') as f:
bin_data = f.read()
bin_data = bin_data.strip(b'\xFF')
modulo = len(bin_data) % ALIGN
if (modulo > 0):
bin_data += b'\xFF' * (ALIGN - modulo)
with open(bin_file, 'wb') as f:
f.write(bin_data)
except FileNotFoundError as e:
print(f'Couldn\'t open file "{bin_file}" {e}')
sys.exit(2)
except Exception as e:
print(e)
sys.exit(3)

View File

@ -1,28 +0,0 @@
#!/usr/bin/env python3
import sys
if __name__ == "__main__":
if (len(sys.argv) != 3):
print(f"Usage: python {sys.argv[0]} file_path align")
sys.exit(1)
file = sys.argv[1]
align = int(sys.argv[2], base=0)
try:
data = b''
with open(file, 'rb') as f:
data = f.read().strip(b'\xFF')
with open(file, 'wb') as f:
modulo = (len(data) % align) if (align > 0) else 0
data += b'\xFF' * ((align - modulo) if (modulo != 0) else 0)
f.write(data)
except FileNotFoundError:
print(f"Couldn't open file \"{file}\"")
sys.exit(2)
except Exception as e:
print(e)
sys.exit(3)