Skip to content
Snippets Groups Projects
Commit c39ec435 authored by Per's avatar Per
Browse files

A bit of modularization

parent 3fa2870c
No related branches found
No related tags found
No related merge requests found
Pipeline #163 canceled
# This file is automatically @generated by Cargo. # This file is automatically @generated by Cargo.
# It is not intended for manual editing. # It is not intended for manual editing.
[[package]] [[package]]
name = "reverse" name = "mips-rt"
version = "0.1.0" version = "0.1.0"
[package] [package]
name = "reverse" name = "mips-rt"
version = "0.1.0" version = "0.1.0"
authors = ["pln <Per Lindgren>"] authors = ["pln <Per Lindgren>"]
edition = "2018" edition = "2018"
...@@ -7,6 +7,7 @@ edition = "2018" ...@@ -7,6 +7,7 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
# r0 = "0.2.2"
[profile.release] [profile.release]
......
# MIPS-3k Proof Of Concept
A minimal crate for experimenting with bare metal Rust for the MIPS-3k.
## Compilation
- cargo install xargo
- rustup
\ No newline at end of file
#![no_std]
#![no_main]
// #![feature(const_generics)] // #![feature(const_generics)]
// fn rev<const X: usize>(from: &[u8; X], to: &mut [u8; X]) { // fn rev<const X: usize>(from: &[u8; X], to: &mut [u8; X]) {
// if from.len() > 0 {} // if from.len() > 0 {}
// } // }
#![feature(lang_items)]
#![no_std]
#![no_main]
// use panic_abort; extern crate mips_rt;
// use libc;
fn rev(from: &[u8], to: &mut [u8]) { fn rev(from: &[u8], to: &mut [u8]) {
let len = from.len(); let len = from.len();
...@@ -21,33 +20,10 @@ const FROM: &[u8] = b"Hello Word!"; ...@@ -21,33 +20,10 @@ const FROM: &[u8] = b"Hello Word!";
const SIZE: usize = FROM.len(); const SIZE: usize = FROM.len();
#[no_mangle] #[no_mangle]
pub extern "C" fn main() { fn main() {
let mut to: [u8; SIZE] = [0; SIZE]; let mut to: [u8; SIZE] = [0; SIZE];
rev(&FROM[..], &mut to); rev(&FROM[..], &mut to);
unsafe { unsafe {
core::ptr::read_volatile(&to); core::ptr::read_volatile(&to);
} }
// println!("from : {:?}", std::str::from_utf8(FROM).unwrap());
// println!("to : {:?}", std::str::from_utf8(&to).unwrap());
} }
#[panic_handler]
fn my_panic(_info: &core::panic::PanicInfo) -> ! {
loop {}
}
// The reset vector, a pointer into the reset handler
#[link_section = ".init"]
#[no_mangle]
pub extern "C" fn _start() -> ! {
main();
loop {}
}
#[lang = "eh_personality"]
extern "C" fn eh_personality() {}
// #[lang = "panic_fmt"]
// extern "C" fn panic_fmt() -> ! {
// loop {}
// }
target/mipsel-unknown-none/release/reverse: file format ELF32-mips target/mipsel-unknown-none/release/examples/reverse: file format ELF32-mips
Disassembly of section .text: Disassembly of section .text:
...@@ -7,65 +7,72 @@ Disassembly of section .text: ...@@ -7,65 +7,72 @@ Disassembly of section .text:
00000000 _start: 00000000 _start:
; pub extern "C" fn _start() -> ! { ; pub extern "C" fn _start() -> ! {
0: f0 ff bd 27 addiu $sp, $sp, -16 0: f0 ff bd 27 addiu $sp, $sp, -16
4: 0c 00 bf af sw $ra, 12($sp) ; #[lang = "eh_personality"]
; rev(&FROM[..], &mut to); 4: 1c 00 00 0c jal 112 <reverse.9oy966i4-cgu.0+0x70>
8: 00 00 01 3c lui $1, 0 8: 00 00 00 00 nop
c: 00 00 a6 27 addiu $6, $sp, 0 c: 0d 00 00 00 break
10: 0b 00 05 24 addiu $5, $zero, 11
14: 0b 00 07 24 addiu $7, $zero, 11
; let mut to: [u8; SIZE] = [0; SIZE];
18: 0a 00 a0 ab swl $zero, 10($sp)
1c: 07 00 a0 bb swr $zero, 7($sp)
20: 04 00 a0 af sw $zero, 4($sp)
24: 00 00 a0 af sw $zero, 0($sp)
; rev(&FROM[..], &mut to);
28: 19 00 00 0c jal 100 <reverse.a07il72d-cgu.0+0x64>
2c: f8 00 24 24 addiu $4, $1, 248
; intrinsics::volatile_load(src)
30: 0a 00 a1 93 lbu $1, 10($sp)
34: 09 00 a1 93 lbu $1, 9($sp)
38: 08 00 a1 93 lbu $1, 8($sp)
3c: 07 00 a1 93 lbu $1, 7($sp)
40: 06 00 a1 93 lbu $1, 6($sp)
44: 05 00 a1 93 lbu $1, 5($sp)
48: 04 00 a1 93 lbu $1, 4($sp)
4c: 03 00 a1 93 lbu $1, 3($sp)
50: 02 00 a1 93 lbu $1, 2($sp)
54: 01 00 a1 93 lbu $1, 1($sp)
58: 00 00 a1 93 lbu $1, 0($sp)
; loop {}
5c: 17 00 00 08 j 92 <reverse.a07il72d-cgu.0+0x5c>
60: 00 00 00 00 nop
00000064 reverse::rev::h99451ae97e77db4d: 00000010 reverse::rev::h045b7f4ff3ea22c3:
; }
64: 15 00 a0 10 beqz $5, 88 <reverse.a07il72d-cgu.0+0xbc>
; if len > 0 { ; if len > 0 {
68: 00 00 00 00 nop 10: 15 00 a0 10 beqz $5, 88 <reverse.9oy966i4-cgu.0+0x68>
6c: f0 ff bd 27 addiu $sp, $sp, -16 14: 00 00 00 00 nop
70: 0c 00 bf af sw $ra, 12($sp) 18: f0 ff bd 27 addiu $sp, $sp, -16
74: 08 00 b2 af sw $18, 8($sp) 1c: 0c 00 bf af sw $ra, 12($sp)
78: 04 00 b1 af sw $17, 4($sp) 20: 08 00 b2 af sw $18, 8($sp)
7c: 00 00 b0 af sw $16, 0($sp) 24: 04 00 b1 af sw $17, 4($sp)
28: 00 00 b0 af sw $16, 0($sp)
; from_raw_parts(slice.as_ptr().add(self.start), self.end - self.start) ; from_raw_parts(slice.as_ptr().add(self.start), self.end - self.start)
80: ff ff b2 24 addiu $18, $5, -1 2c: ff ff b2 24 addiu $18, $5, -1
84: 25 88 80 00 move $17, $4 30: 25 88 80 00 move $17, $4
; intrinsics::offset(self, count) ; intrinsics::offset(self, count)
88: 01 00 84 24 addiu $4, $4, 1 34: 01 00 84 24 addiu $4, $4, 1
8c: 25 80 c0 00 move $16, $6 38: 25 80 c0 00 move $16, $6
; rev(&from[1..], &mut to[..len - 1]); ; rev(&from[1..], &mut to[..len - 1]);
90: 25 28 40 02 move $5, $18 3c: 25 28 40 02 move $5, $18
94: 19 00 00 0c jal 100 <reverse.a07il72d-cgu.0+0x64> 40: 04 00 00 0c jal 16 <reverse.9oy966i4-cgu.0+0x10>
98: 25 38 40 02 move $7, $18 44: 25 38 40 02 move $7, $18
; to[len - 1] = from[0]; ; to[len - 1] = from[0];
9c: 21 08 12 02 addu $1, $16, $18 48: 21 08 12 02 addu $1, $16, $18
a0: 00 00 22 92 lbu $2, 0($17) 4c: 00 00 22 92 lbu $2, 0($17)
a4: 00 00 b0 8f lw $16, 0($sp) 50: 00 00 b0 8f lw $16, 0($sp)
a8: 04 00 b1 8f lw $17, 4($sp) 54: 04 00 b1 8f lw $17, 4($sp)
ac: 08 00 b2 8f lw $18, 8($sp) 58: 08 00 b2 8f lw $18, 8($sp)
b0: 0c 00 bf 8f lw $ra, 12($sp) 5c: 0c 00 bf 8f lw $ra, 12($sp)
b4: 00 00 22 a0 sb $2, 0($1) 60: 00 00 22 a0 sb $2, 0($1)
b8: 10 00 bd 27 addiu $sp, $sp, 16 64: 10 00 bd 27 addiu $sp, $sp, 16
; } ; }
bc: 08 00 e0 03 jr $ra 68: 08 00 e0 03 jr $ra
c0: 00 00 00 00 nop 6c: 00 00 00 00 nop
00000070 main:
; fn main() -> ! {
70: f0 ff bd 27 addiu $sp, $sp, -16
74: 0c 00 bf af sw $ra, 12($sp)
; rev(&FROM[..], &mut to);
78: 00 00 01 3c lui $1, 0
7c: 00 00 a6 27 addiu $6, $sp, 0
80: 0b 00 05 24 addiu $5, $zero, 11
84: 0b 00 07 24 addiu $7, $zero, 11
; let mut to: [u8; SIZE] = [0; SIZE];
88: 0a 00 a0 ab swl $zero, 10($sp)
8c: 07 00 a0 bb swr $zero, 7($sp)
90: 04 00 a0 af sw $zero, 4($sp)
94: 00 00 a0 af sw $zero, 0($sp)
; rev(&FROM[..], &mut to);
98: 04 00 00 0c jal 16 <reverse.9oy966i4-cgu.0+0x10>
9c: 08 01 24 24 addiu $4, $1, 264
; intrinsics::volatile_load(src)
a0: 0a 00 a1 93 lbu $1, 10($sp)
a4: 09 00 a1 93 lbu $1, 9($sp)
a8: 08 00 a1 93 lbu $1, 8($sp)
ac: 07 00 a1 93 lbu $1, 7($sp)
b0: 06 00 a1 93 lbu $1, 6($sp)
b4: 05 00 a1 93 lbu $1, 5($sp)
b8: 04 00 a1 93 lbu $1, 4($sp)
bc: 03 00 a1 93 lbu $1, 3($sp)
c0: 02 00 a1 93 lbu $1, 2($sp)
c4: 01 00 a1 93 lbu $1, 1($sp)
c8: 00 00 a1 93 lbu $1, 0($sp)
; loop {}
cc: 33 00 00 08 j 204 <reverse.9oy966i4-cgu.0+0xcc>
d0: 00 00 00 00 nop
#![feature(lang_items)]
#![no_std]
#![no_main]
#[panic_handler]
fn my_panic(_info: &core::panic::PanicInfo) -> ! {
loop {}
}
// The reset vector, a pointer into the reset handler
#[link_section = ".init"]
#[no_mangle]
pub extern "C" fn _start() -> ! {
extern "C" {
// These symbols come from `link.x`
static mut __sbss: u32;
static mut __ebss: u32;
static mut __sdata: u32;
static mut __edata: u32;
static __sidata: u32;
}
extern "Rust" {
// This symbol will be provided by the user via `#[entry]`
fn main() -> !;
}
// Initialize RAM
// r0::zero_bss(&mut __sbss, &mut __ebss);
// r0::init_data(&mut __sdata, &mut __edata, &__sidata);
unsafe { main() }
loop {}
}
#[lang = "eh_personality"]
extern "C" fn eh_personality() {}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment