1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- //! crt0
- #![no_std]
- #![feature(asm)]
- #![feature(lang_items)]
- #![feature(naked_functions)]
- extern crate platform;
- use platform::types::*;
- #[no_mangle]
- #[naked]
- pub unsafe extern "C" fn _start() {
- #[cfg(target_arch = "x86_64")]
- asm!("mov rdi, rsp
- call _start_rust"
- :
- :
- :
- : "intel", "volatile"
- );
- #[cfg(target_arch = "aarch64")]
- asm!("mov x0, sp
- bl _start_rust"
- :
- :
- :
- : "volatile"
- );
- }
- #[repr(C)]
- pub struct Stack {
- argc: isize,
- argv0: *const u8,
- }
- impl Stack {
- fn argc(&self) -> isize {
- self.argc
- }
- fn argv(&self) -> *const *const u8 {
- &self.argv0 as *const *const u8
- }
- }
- #[inline(never)]
- #[no_mangle]
- pub unsafe extern "C" fn _start_rust(sp: &'static Stack) -> ! {
- extern "C" {
- fn main(argc: isize, argv: *const *const u8) -> c_int;
- }
- let argc = sp.argc();
- let argv = sp.argv();
- platform::exit(main(argc, argv));
- }
- #[lang = "panic_fmt"]
- pub extern "C" fn rust_begin_unwind(_fmt: ::core::fmt::Arguments, _file: &str, _line: u32) -> ! {
- loop {}
- }
|