//! # The Redox OS Kernel, version 2 //! //! The Redox OS Kernel is a hybrid kernel that supports X86 systems and //! provides Unix-like syscalls for primarily Rust applications //! //! ## Syscalls //! Syscalls in Redox are often handled by userspace `schemes`. //! The essential syscalls in Redox are as follows: //! //! ### Open //! `open(path: &str, flags: usize) -> Result` //! //! Open a file, providing a path as a `&str` and flags, defined elsewhere. //! //! Returns a number, known as a file descriptor, that is passed to other syscalls //! //! ### Close //! `close(file_descriptor: usize) -> Result<()>` //! //! Close a file descriptor, providing the file descriptor from `open` //! //! Returns an error, `EBADF`, if the file descriptor was not found. //! //! This potential error is often ignored by userspace //! //! ### Duplicate //! `dup(file_descriptor: usize) -> Result` //! //! Duplicate a file descriptor, providing the file descriptor from `open` //! //! Returns a new file descriptor, or an error //! //! ### Read //! `read(file_descriptor: usize, buffer: &mut [u8]) -> Result` //! //! Read from a file descriptor, providing the file descriptor from `open` and a mutable buffer //! //! Returns the number of bytes actually read, or an error //! //! ### Write //! `write(file_descriptor: usize, buffer: &[u8]) -> Result` //! //! Write to a file descriptor, providing the file descriptor from `open` and a const buffer //! //! Returns the number of bytes actually written, or an error //! //! ### Stat //! `fstat(file_descriptor: usize, stat: &mut Stat) -> Result<()>` //! //! Get information from a file descriptor, providing the file descriptor from `open` //! and a mutable Stat struct, defined elsewhere. //! //! Returns an error if the operation failed //! //! ### Path //! `fpath(file_descriptor: usize, buffer: &mut [u8]) -> Result` //! //! Read the path of a file descriptor, providing the file descriptor from `open` and //! a mutable buffer. //! //! Returns the number of bytes actually read, or an error //! //! The buffer should be 4096 bytes, to ensure that the entire path will fit. //! An error will be returned, `ENOBUFS`, if the buffer is not long enough for the name. //! In this case, it is recommended to add one page, 4096 bytes, to the buffer and retry. #![feature(asm)] #![feature(const_fn)] #![feature(core_intrinsics)] #![feature(lang_items)] #![feature(naked_functions)] #![no_std] #[macro_use] extern crate bitflags; /// Print to console macro_rules! print { ($($arg:tt)*) => ({ use $crate::core::fmt::Write; let _ = write!($crate::arch::serial::SerialConsole::new(), $($arg)*); }); } /// Print with new line to console macro_rules! println { ($fmt:expr) => (print!(concat!($fmt, "\n"))); ($fmt:expr, $($arg:tt)*) => (print!(concat!($fmt, "\n"), $($arg)*)); } /// Architecture specific items pub mod arch; #[cfg(not(test))] #[lang = "eh_personality"] extern "C" fn eh_personality() {} #[cfg(not(test))] /// Required to handle panics #[lang = "panic_fmt"] extern "C" fn panic_fmt() -> ! {loop{}} #[allow(non_snake_case)] #[no_mangle] /// Required to handle panics pub extern "C" fn _Unwind_Resume() -> ! { loop {} }