From db3097364f7534da501b67cf6d9d91621e097956 Mon Sep 17 00:00:00 2001 From: "m.kindritskiy" Date: Sun, 22 Jun 2025 19:57:02 +0300 Subject: [PATCH 1/2] working chainloader --- Cargo.lock | 2 +- Cargo.toml | 2 +- Makefile | 9 +-- common/serial/minipush.rb | 1 - common/serial/miniterm.rb | 1 + demo_payload_rpi5.img | Bin 0 -> 8696 bytes kernel8_chainloader.img | Bin 0 -> 8608 bytes src/_arch/aarch64/cpu/boot.s | 39 +++++++++-- .../device_driver/bcm/bcm2xxx_pl011_uart.rs | 13 ++-- src/bsp/raspberrypi/console.rs | 16 ----- src/bsp/raspberrypi/kernel.ld | 8 ++- src/bsp/raspberrypi/memory.rs | 15 ++++- src/driver.rs | 14 +--- src/main.rs | 61 ++++++++++++------ 14 files changed, 107 insertions(+), 74 deletions(-) create mode 100755 demo_payload_rpi5.img create mode 100755 kernel8_chainloader.img delete mode 100644 src/bsp/raspberrypi/console.rs diff --git a/Cargo.lock b/Cargo.lock index 51490099a..57450848f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,7 +13,7 @@ dependencies = [ [[package]] name = "mingo" -version = "0.8.0" +version = "0.6.0" dependencies = [ "aarch64-cpu", "tock-registers", diff --git a/Cargo.toml b/Cargo.toml index 984a374d1..7226c6755 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mingo" -version = "0.8.0" +version = "0.6.0" authors = ["Andre Richter "] edition = "2021" diff --git a/Makefile b/Makefile index afb578d6b..de9ef6854 100644 --- a/Makefile +++ b/Makefile @@ -65,6 +65,7 @@ else ifeq ($(BSP),rpi5) JTAG_BOOT_IMAGE = ./X1_JTAG_boot/jtag_boot_rpi5.img LD_SCRIPT_PATH = $(shell pwd)/src/bsp/raspberrypi RUSTC_MISC_ARGS = -C target-cpu=cortex-a76 + CHAINBOOT_DEMO_PAYLOAD = demo_payload_rpi5.img endif # Export for build.rs. @@ -138,11 +139,7 @@ ifeq ($(shell uname -s),Linux) DOCKER_MINITERM = $(DOCKER_CMD_DEV) $(DOCKER_ARG_DIR_COMMON) $(DOCKER_IMAGE) - DOCKER_CHAINBOOT = $(DOCKER_CMD_DEV) $(DOCKER_ARG_DIR_COMMON) $(DOCKER_IMAGE) - DOCKER_JTAGBOOT = $(DOCKER_CMD_DEV) $(DOCKER_ARG_DIR_COMMON) $(DOCKER_ARG_DIR_JTAG) $(DOCKER_IMAGE) - DOCKER_OPENOCD = $(DOCKER_CMD_DEV) $(DOCKER_ARG_NET) $(DOCKER_IMAGE) -else - DOCKER_OPENOCD = echo "Not yet supported on non-Linux systems."; \# + DOCKER_CHAINBOOT = $(DOCKER_CMD_DEV) $(DOCKER_ARG_DIR_COMMON) $(DOCKER_IMAGE) endif @@ -219,7 +216,7 @@ miniterm: ## Push the kernel to the real HW target chainboot: $(KERNEL_BIN) - @$(DOCKER_CHAINBOOT) $(EXEC_MINIPUSH) $(DEV_SERIAL) $(KERNEL_BIN) + @$(DOCKER_CHAINBOOT) $(EXEC_MINIPUSH) $(DEV_SERIAL) $(CHAINBOOT_DEMO_PAYLOAD) ##------------------------------------------------------------------------------ ## Run clippy diff --git a/common/serial/minipush.rb b/common/serial/minipush.rb index 2f7fdfbab..ddc6aed4b 100755 --- a/common/serial/minipush.rb +++ b/common/serial/minipush.rb @@ -47,7 +47,6 @@ def wait_for_payload_request else # A normal character resets token counting. count = 0 - print c end end diff --git a/common/serial/miniterm.rb b/common/serial/miniterm.rb index d1cb33881..5c5d9f612 100755 --- a/common/serial/miniterm.rb +++ b/common/serial/miniterm.rb @@ -13,6 +13,7 @@ require 'rubyserial' # SERIAL_BAUD = 921_600 +# SERIAL_BAUD = 230_400 # for mac os SERIAL_BAUD = 115_200 # for mac os class ConnectionError < StandardError; end diff --git a/demo_payload_rpi5.img b/demo_payload_rpi5.img new file mode 100755 index 0000000000000000000000000000000000000000..96513413c7e65d5e881c1835ee783f98a31255cb GIT binary patch literal 8696 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 NXuIxvZR*P7e*tPSVd4M) literal 0 HcmV?d00001 diff --git a/kernel8_chainloader.img b/kernel8_chainloader.img new file mode 100755 index 0000000000000000000000000000000000000000..652291fc8fd46201ef56c5ada2a0cb19d9b3ec71 GIT binary patch literal 8608 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 Option { + fn read_char(&mut self, blocking_mode: BlockingMode) -> Option { // If RX FIFO is empty, if self.registers.FR.matches_all(FR::RXFE::SET) { // immediately return in non-blocking mode. @@ -318,12 +318,7 @@ impl PL011UartInner { } // Read one character. - let mut ret = self.registers.DR.get() as u8 as char; - - // Convert carrige return to newline. - if ret == '\r' { - ret = '\n' - } + let ret = self.registers.DR.get() as u8 as char; // Update statistics. self.chars_read += 1; @@ -409,14 +404,14 @@ impl console::interface::Write for PL011Uart { impl console::interface::Read for PL011Uart { fn read_char(&self) -> char { self.inner - .lock(|inner| inner.read_char_converting(BlockingMode::Blocking).unwrap()) + .lock(|inner| inner.read_char(BlockingMode::Blocking).unwrap()) } fn clear_rx(&self) { // Read from the RX FIFO until it is indicating empty. while self .inner - .lock(|inner| inner.read_char_converting(BlockingMode::NonBlocking)) + .lock(|inner| inner.read_char(BlockingMode::NonBlocking)) .is_some() {} } diff --git a/src/bsp/raspberrypi/console.rs b/src/bsp/raspberrypi/console.rs deleted file mode 100644 index 0d585229e..000000000 --- a/src/bsp/raspberrypi/console.rs +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-License-Identifier: MIT OR Apache-2.0 -// -// Copyright (c) 2018-2023 Andre Richter - -//! BSP console facilities. - -use crate::console; - -//-------------------------------------------------------------------------------------------------- -// Public Code -//-------------------------------------------------------------------------------------------------- - -/// Return a reference to the console. -pub fn console() -> &'static dyn console::interface::All { - &super::driver::PL011_UART -} diff --git a/src/bsp/raspberrypi/kernel.ld b/src/bsp/raspberrypi/kernel.ld index eab51318f..9678c8f8a 100644 --- a/src/bsp/raspberrypi/kernel.ld +++ b/src/bsp/raspberrypi/kernel.ld @@ -28,7 +28,8 @@ PHDRS SECTIONS { - . = __rpi_phys_dram_start_addr; + /* Set the link address to 32 MiB */ + . = 0x2000000; /*********************************************************************************************** * Boot Core Stack @@ -46,6 +47,7 @@ SECTIONS /*********************************************************************************************** * Code + RO Data + Global Offset Table ***********************************************************************************************/ + __binary_nonzero_start = .; .text : { KEEP(*(.text._start)) @@ -62,6 +64,10 @@ SECTIONS ***********************************************************************************************/ .data : { *(.data*) } :segment_data + /* Fill up to 8 byte, b/c relocating the binary is done in u64 chunks */ + . = ALIGN(8); + __binary_nonzero_end_exclusive = .; + /* Section is zeroed in pairs of u64. Align start and end to 16 bytes */ .bss (NOLOAD) : ALIGN(16) { diff --git a/src/bsp/raspberrypi/memory.rs b/src/bsp/raspberrypi/memory.rs index 2e929f79c..64069febd 100644 --- a/src/bsp/raspberrypi/memory.rs +++ b/src/bsp/raspberrypi/memory.rs @@ -11,6 +11,8 @@ /// The board's physical memory map. #[rustfmt::skip] pub(super) mod map { + #[allow(dead_code)] + pub const BOARD_DEFAULT_LOAD_ADDRESS: usize = 0x8_0000; #[allow(dead_code)] pub const GPIO_OFFSET: usize = 0x0020_0000; @@ -50,8 +52,19 @@ pub(super) mod map { #[allow(dead_code)] pub const START: usize = 0x107c000000; pub const GPIO_START: usize = 0x1f000d0000; - pub const PL011_UART_START: usize = 0x1c00030000; // w/o pcie + pub const PL011_UART_START: usize = 0x1c00030000; // w/o pcie // pub const PL011_UART_START: usize = 0x1f00030000; // w/ pcie pub const PL011_EARLY_UART_START: usize = 0x107d001000; } } + + +//-------------------------------------------------------------------------------------------------- +// Public Code +//-------------------------------------------------------------------------------------------------- + +/// The address on which the Raspberry firmware loads every binary by default. +#[inline(always)] +pub fn board_default_load_addr() -> *const u64 { + map::BOARD_DEFAULT_LOAD_ADDRESS as _ +} diff --git a/src/driver.rs b/src/driver.rs index 9918ad579..7d57469f8 100644 --- a/src/driver.rs +++ b/src/driver.rs @@ -4,10 +4,7 @@ //! Driver support. -use crate::{ - println, - synchronization::{interface::Mutex, NullLock}, -}; +use crate::synchronization::{interface::Mutex, NullLock}; //-------------------------------------------------------------------------------------------------- // Private Definitions @@ -154,13 +151,4 @@ impl DriverManager { } }); } - - /// Enumerate all registered device drivers. - pub fn enumerate(&self) { - let mut i: usize = 1; - self.for_each_descriptor(|descriptor| { - println!(" {}. {}", i, descriptor.device_driver.compatible()); - i += 1; - }); - } } diff --git a/src/main.rs b/src/main.rs index 49dae4e12..ae1dff0a3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -119,7 +119,13 @@ mod driver; mod panic_wait; mod print; mod synchronization; -mod time; + +const MINILOAD_LOGO: &str = r#" + __ __ _ _ _ _ +| \/ (_)_ _ (_) | ___ __ _ __| | +| |\/| | | ' \| | |__/ _ \/ _` / _` | +|_| |_|_|_||_|_|____\___/\__,_\__,_| +"#; /// Early init code. /// @@ -142,29 +148,48 @@ unsafe fn kernel_init() -> ! { } /// The main function running after the early init. +/// Run to build: BSP=rpi5 RPI5_EARLY_UART=1 make clean sdcard fn kernel_main() -> ! { use core::time::Duration; - info!( - "{} version {}", - env!("CARGO_PKG_NAME"), - env!("CARGO_PKG_VERSION") - ); - info!("Booting on: {}", bsp::board_name()); + println!("{}", MINILOAD_LOGO); + // println!("{:^37}", bsp::board_name()); + println!(); + println!("[ML] Requesting binary"); + console().flush(); + + // Discard any spurious received characters before starting with the loader protocol. + console().clear_rx(); - info!( - "Architectural timer resolution: {} ns", - time::time_manager().resolution().as_nanos() - ); + // Notify `Minipush` to send the binary. + for _ in 0..3 { + console().write_char(3 as char); + } - info!("Drivers loaded:"); - driver::driver_manager().enumerate(); + // Read the binary's size. + let mut size: u32 = u32::from(console().read_char() as u8); + size |= u32::from(console().read_char() as u8) << 8; + size |= u32::from(console().read_char() as u8) << 16; + size |= u32::from(console().read_char() as u8) << 24; - // Test a failing timer case. - time::time_manager().spin_for(Duration::from_nanos(1)); + // Trust it's not too big. + console().write_char('O'); + console().write_char('K'); - loop { - info!("Spinning for 1 second"); - time::time_manager().spin_for(Duration::from_secs(1)); + let kernel_addr: *mut u8 = bsp::memory::board_default_load_addr() as *mut u8; + unsafe { + // Read the kernel byte by byte. + for i in 0..size { + core::ptr::write_volatile(kernel_addr.offset(i as isize), console().read_char() as u8) + } } + + println!("[ML] Loaded! Executing the payload now\n"); + console().flush(); + + // Use black magic to create a function pointer. + let kernel: fn() -> ! = unsafe { core::mem::transmute(kernel_addr) }; + + // Jump to loaded kernel! + kernel() } From 1ab142ca9a60c54a62b416769bf12c07d5a7a43a Mon Sep 17 00:00:00 2001 From: "m.kindritskiy" Date: Mon, 23 Jun 2025 22:14:15 +0300 Subject: [PATCH 2/2] some fixes --- Makefile | 2 +- kernel8_chainloader_debug_uart.img | Bin 0 -> 8608 bytes kernel8_chainloader_rpi1_uart.img | Bin 0 -> 8672 bytes src/main.rs | 2 +- src/panic_wait.rs | 5 +---- 5 files changed, 3 insertions(+), 6 deletions(-) create mode 100755 kernel8_chainloader_debug_uart.img create mode 100755 kernel8_chainloader_rpi1_uart.img diff --git a/Makefile b/Makefile index de9ef6854..3d8592231 100644 --- a/Makefile +++ b/Makefile @@ -276,7 +276,7 @@ openocd-local: $(call color_header, "Launching local OpenOCD with lldb") openocd -f ./cmsis-dap.cfg -f ./rpi5-openocd.cfg -c "adapter speed 5000" & OPENOCD_PID=$! - PROGRAM=target/aarch64-unknown-none-softfloat/release/kernel + PROGRAM=target/aarch64-unknown-none-softfloat/release/kernel lldb $(PROGRAM) # aarch64-elf-gdb -q -x gdb_init "$(PROGRAM)" kill -TERM ${OPENOCD_PID} diff --git a/kernel8_chainloader_debug_uart.img b/kernel8_chainloader_debug_uart.img new file mode 100755 index 0000000000000000000000000000000000000000..652291fc8fd46201ef56c5ada2a0cb19d9b3ec71 GIT binary patch literal 8608 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 In1BmK9)&Kwi literal 0 HcmV?d00001 diff --git a/src/main.rs b/src/main.rs index ae1dff0a3..6cc0d32d1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -150,7 +150,7 @@ unsafe fn kernel_init() -> ! { /// The main function running after the early init. /// Run to build: BSP=rpi5 RPI5_EARLY_UART=1 make clean sdcard fn kernel_main() -> ! { - use core::time::Duration; + use crate::console::console; println!("{}", MINILOAD_LOGO); // println!("{:^37}", bsp::board_name()); diff --git a/src/panic_wait.rs b/src/panic_wait.rs index e33eda797..a88a0dd98 100644 --- a/src/panic_wait.rs +++ b/src/panic_wait.rs @@ -45,18 +45,15 @@ fn panic(info: &PanicInfo) -> ! { // Protect against panic infinite loops if any of the following code panics itself. panic_prevent_reenter(); - let timestamp = crate::time::time_manager().uptime(); let (location, line, column) = match info.location() { Some(loc) => (loc.file(), loc.line(), loc.column()), _ => ("???", 0, 0), }; println!( - "[ {:>3}.{:06}] Kernel panic!\n\n\ + "Kernel panic!\n\n\ Panic location:\n File '{}', line {}, column {}\n\n\ {}", - timestamp.as_secs(), - timestamp.subsec_micros(), location, line, column,