lib.rs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. //! crt0
  2. #![no_std]
  3. #![feature(asm)]
  4. #![feature(lang_items)]
  5. #![feature(naked_functions)]
  6. extern crate platform;
  7. use platform::types::*;
  8. #[no_mangle]
  9. #[naked]
  10. pub unsafe extern "C" fn _start() {
  11. #[cfg(target_arch = "x86_64")]
  12. asm!("mov rdi, rsp
  13. call _start_rust"
  14. :
  15. :
  16. :
  17. : "intel", "volatile"
  18. );
  19. #[cfg(target_arch = "aarch64")]
  20. asm!("mov x0, sp
  21. bl _start_rust"
  22. :
  23. :
  24. :
  25. : "volatile"
  26. );
  27. }
  28. #[repr(C)]
  29. pub struct Stack {
  30. argc: isize,
  31. argv0: *const u8,
  32. }
  33. impl Stack {
  34. fn argc(&self) -> isize {
  35. self.argc
  36. }
  37. fn argv(&self) -> *const *const u8 {
  38. &self.argv0 as *const *const u8
  39. }
  40. }
  41. #[inline(never)]
  42. #[no_mangle]
  43. pub unsafe extern "C" fn _start_rust(sp: &'static Stack) -> ! {
  44. extern "C" {
  45. fn main(argc: isize, argv: *const *const u8) -> c_int;
  46. }
  47. let argc = sp.argc();
  48. let argv = sp.argv();
  49. platform::exit(main(argc, argv));
  50. }
  51. #[lang = "panic_fmt"]
  52. pub extern "C" fn rust_begin_unwind(_fmt: ::core::fmt::Arguments, _file: &str, _line: u32) -> ! {
  53. loop {}
  54. }