Moving files to rust-xargo dir
This commit is contained in:
29
ferrocyanide/raspi-xargo/Makefile
Normal file
29
ferrocyanide/raspi-xargo/Makefile
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
all: process
|
||||||
|
|
||||||
|
process:
|
||||||
|
arm-none-eabi-as -I asm -o main.o main.s
|
||||||
|
arm-none-eabi-ld --no-undefined main.o -Map kernel.map -o output.elf -T kernel.ld
|
||||||
|
arm-none-eabi-objcopy output.elf -O binary kernel.img
|
||||||
|
|
||||||
|
#arm-none-eabi-ld --no-undefined rust_kernel.o -Map kernel.map -o rust_kernel.elf -T kernel.ld
|
||||||
|
#rust_kernel: rust_kernel.rs
|
||||||
|
# rustc --target arm-unknown-linux-gnueabihf --emit=obj rust_kernel.rs
|
||||||
|
# arm-none-eabi-gcc -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -nostartfiles rust_kernel.o -o rust_kernel.elf
|
||||||
|
# arm-none-eabi-objcopy rust_kernel.elf -O binary kernel.img
|
||||||
|
|
||||||
|
rust_loader.o: rust_loader.s
|
||||||
|
arm-none-eabi-gcc -mcpu=arm1176jzf-s -fpic -ffreestanding -c rust_loader.s -o rust_loader.o
|
||||||
|
|
||||||
|
#rust_kernel.o: rust_kernel.rs
|
||||||
|
# rustc --target ./arm-none-eabihf.json --emit=obj -Cpanic=abort -C lto rust_kernel.rs
|
||||||
|
|
||||||
|
kernel.elf: rust_kernel.o rust_loader.o
|
||||||
|
arm-none-eabi-gcc -T rust_linker_script.ld -o kernel.elf -ffreestanding -nostdlib rust_loader.o rust_kernel.o
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o
|
||||||
|
rm -f *.elf
|
||||||
|
rm -f *.a
|
||||||
|
rm -f kernel.img
|
||||||
|
rm -f kernel.map
|
||||||
15
ferrocyanide/raspi-xargo/arm-none-eabihf.json
Normal file
15
ferrocyanide/raspi-xargo/arm-none-eabihf.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"llvm-target": "arm-none-eabihf",
|
||||||
|
"target-endian": "little",
|
||||||
|
"target-pointer-width": "32",
|
||||||
|
"os": "none",
|
||||||
|
"env": "eabi",
|
||||||
|
"vendor": "unknown",
|
||||||
|
"arch": "arm",
|
||||||
|
|
||||||
|
"linker": "arm-none-eabi-gcc",
|
||||||
|
"data-layout": "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64",
|
||||||
|
"executables": true,
|
||||||
|
"relocation-model": "static",
|
||||||
|
"no-compiler-rt": true
|
||||||
|
}
|
||||||
43
ferrocyanide/raspi-xargo/rust_linker_script.ld
Normal file
43
ferrocyanide/raspi-xargo/rust_linker_script.ld
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
ENTRY(_start)
|
||||||
|
|
||||||
|
SECTIONS {
|
||||||
|
|
||||||
|
. = 0x8000;
|
||||||
|
_start = .;
|
||||||
|
|
||||||
|
_text_start = .;
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
KEEP(*(.text.boot))
|
||||||
|
*(.text)
|
||||||
|
}
|
||||||
|
. = ALIGN(4096);
|
||||||
|
_text_end = .;
|
||||||
|
|
||||||
|
_rodata_start = .;
|
||||||
|
.rodata :
|
||||||
|
{
|
||||||
|
*(.rodata);
|
||||||
|
}
|
||||||
|
. = ALIGN(4096);
|
||||||
|
_rodata_end = .;
|
||||||
|
|
||||||
|
_data_start = .;
|
||||||
|
.data :
|
||||||
|
{
|
||||||
|
*(.data)
|
||||||
|
}
|
||||||
|
. = ALIGN(4096);
|
||||||
|
_data_end = .;
|
||||||
|
|
||||||
|
|
||||||
|
_bss_start = .;
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
*(.bss)
|
||||||
|
}
|
||||||
|
. = ALIGN(4096);
|
||||||
|
_bss_end = .;
|
||||||
|
|
||||||
|
_end = .;
|
||||||
|
}
|
||||||
30
ferrocyanide/raspi-xargo/rust_loader.s
Normal file
30
ferrocyanide/raspi-xargo/rust_loader.s
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
.section ".text.boot"
|
||||||
|
|
||||||
|
.globl _start
|
||||||
|
|
||||||
|
_start:
|
||||||
|
/* r15 (SP) begins execution at 0x8000 */
|
||||||
|
mov sp, #0x8000
|
||||||
|
|
||||||
|
/* zero out bss_start to bss_end */
|
||||||
|
ldr r4, =_bss_start
|
||||||
|
ldr r9, =_bss_end
|
||||||
|
mov r5, #0
|
||||||
|
mov r6, #0
|
||||||
|
mov r7, #0
|
||||||
|
mov r8, #0
|
||||||
|
b 2f
|
||||||
|
1:
|
||||||
|
stmia r4!, {r5-r8}
|
||||||
|
2:
|
||||||
|
cmp r4, r9
|
||||||
|
blo 1b // branch less than
|
||||||
|
|
||||||
|
/* call kernel_main */
|
||||||
|
ldr r3, =kernel_main
|
||||||
|
blx r3 /* branch and change processor state from thumb -> arm */
|
||||||
|
|
||||||
|
halt:
|
||||||
|
wfe /* wait for event */
|
||||||
|
b halt
|
||||||
|
|
||||||
56
ferrocyanide/raspi-xargo/src/lib.rs
Normal file
56
ferrocyanide/raspi-xargo/src/lib.rs
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
#![feature(lang_items, asm)]
|
||||||
|
#![crate_type = "staticlib"]
|
||||||
|
#![no_std]
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn __eabi_unwind_cpp_pr0() { }
|
||||||
|
|
||||||
|
#[cfg(not(test))]
|
||||||
|
#[lang = "eh_personality"]
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn eh_personality() {}
|
||||||
|
|
||||||
|
#[cfg(not(test))]
|
||||||
|
#[lang = "panic_fmt"]
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn panic_fmt() -> ! { loop {}}
|
||||||
|
|
||||||
|
#[cfg(not(test))]
|
||||||
|
#[lang = "eh_unwind_resume"]
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn eh_unwind_resume() { }
|
||||||
|
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn _Unwind_Resume() -> ! {
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
|
||||||
|
const GPIO_BASE: u32 = 0x2020000;
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn kernel_main() {
|
||||||
|
|
||||||
|
let gpio = GPIO_BASE as *const u32;
|
||||||
|
let led_on = unsafe { gpio.offset(8) as *mut u32 };
|
||||||
|
let led_off = unsafe { gpio.offset(11) as *mut u32 };
|
||||||
|
|
||||||
|
loop {
|
||||||
|
unsafe { *(led_on) = 1 << 15 };
|
||||||
|
sleep(500_000);
|
||||||
|
unsafe { *(led_off) = 1 << 15 };
|
||||||
|
sleep(500_000);
|
||||||
|
|
||||||
|
unsafe { *(led_on) = 1 << 15 };
|
||||||
|
sleep(200_000);
|
||||||
|
unsafe { *(led_off) = 1 << 15 };
|
||||||
|
sleep(200_000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sleep(value: u32) {
|
||||||
|
for _ in 1..value {
|
||||||
|
unsafe { asm!("") }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user