Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.53 KB | None | 0 0
  1. #![no_std]
  2. #![feature(lang_items, core_intrinsics)]
  3. use core::intrinsics;
  4. use core::panic::PanicInfo;
  5. use core::alloc::{GlobalAlloc, Layout};
  6. use core::fmt;
  7. use core::fmt::Write;
  8.  
  9. extern {
  10. fn malloc(size: usize) -> *mut u8;
  11. fn free(ptr: *mut u8);
  12. fn write(file: isize, buffer: *const u8, count: usize) -> usize;
  13. }
  14.  
  15. struct LibcAllocator;
  16. unsafe impl GlobalAlloc for LibcAllocator {
  17. unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
  18. if layout.align() > 8 {
  19. panic!("Unsupported alignment")
  20. }
  21. malloc(layout.size())
  22. }
  23. unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout) {
  24. free(ptr)
  25. }
  26. }
  27.  
  28. struct Stdout;
  29. impl fmt::Write for Stdout {
  30. fn write_str(&mut self, s: &str) -> fmt::Result {
  31. unsafe {
  32. let buffer = s.as_bytes();
  33. if write(0, buffer.as_ptr(), buffer.len()) > 0 {
  34. Ok(())
  35. } else {
  36. Err(()).map_err(|_| fmt::Error)
  37. }
  38. }
  39. }
  40. }
  41.  
  42. fn stdout() -> Stdout {
  43. Stdout
  44. }
  45.  
  46. fn print_str(s: &str) -> Result<(), ()> {
  47. stdout().write_str(s).map_err(drop)
  48. }
  49. fn print_fmt(args: fmt::Arguments) -> Result<(), ()> {
  50. stdout().write_fmt(args).map_err(drop)
  51. }
  52.  
  53.  
  54. #[global_allocator]
  55. static A: LibcAllocator = LibcAllocator;
  56.  
  57.  
  58. #[no_mangle]
  59. pub extern fn rust_main() {
  60. print_str("Hello from Rust!\n");
  61. print_fmt(format_args!("Hello formatted from {}\n", "Rust"));
  62. }
  63.  
  64. #[lang = "panic_impl"]
  65. #[no_mangle]
  66. pub extern fn rust_begin_panic(_info: &PanicInfo) -> ! {
  67. unsafe { intrinsics::abort() }
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement