redox/kernel/lib.rs

116 lines
3.2 KiB
Rust
Raw Normal View History

2016-08-14 00:34:27 +02:00
//! # 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
2016-08-14 00:53:05 +02:00
//!
//! ## Syscalls
//! Syscalls in Redox are often handled by userspace `schemes`.
//! The essential syscalls in Redox are as follows:
//!
2016-08-14 00:57:21 +02:00
//! ### Open
//! `open(path: &str, flags: usize) -> Result<file_descriptor: usize>`
//!
2016-08-14 00:53:05 +02:00
//! Open a file, providing a path as a `&str` and flags, defined elsewhere.
2016-08-14 02:21:46 +02:00
//!
2016-08-14 00:53:05 +02:00
//! Returns a number, known as a file descriptor, that is passed to other syscalls
//!
2016-08-14 00:57:21 +02:00
//! ### Close
//! `close(file_descriptor: usize) -> Result<()>`
//!
2016-08-14 00:53:05 +02:00
//! Close a file descriptor, providing the file descriptor from `open`
2016-08-14 02:21:46 +02:00
//!
2016-08-14 00:53:05 +02:00
//! Returns an error, `EBADF`, if the file descriptor was not found.
2016-08-14 02:21:46 +02:00
//!
2016-08-14 00:53:05 +02:00
//! This potential error is often ignored by userspace
//!
2016-08-14 00:57:21 +02:00
//! ### Duplicate
//! `dup(file_descriptor: usize) -> Result<file_descriptor: usize>`
//!
2016-08-14 00:53:05 +02:00
//! Duplicate a file descriptor, providing the file descriptor from `open`
2016-08-14 02:21:46 +02:00
//!
2016-08-14 00:53:05 +02:00
//! Returns a new file descriptor, or an error
//!
2016-08-14 00:57:21 +02:00
//! ### Read
//! `read(file_descriptor: usize, buffer: &mut [u8]) -> Result<count: usize>`
//!
2016-08-14 00:53:05 +02:00
//! Read from a file descriptor, providing the file descriptor from `open` and a mutable buffer
2016-08-14 02:21:46 +02:00
//!
2016-08-14 00:53:05 +02:00
//! Returns the number of bytes actually read, or an error
//!
2016-08-14 00:57:21 +02:00
//! ### Write
//! `write(file_descriptor: usize, buffer: &[u8]) -> Result<count: usize>`
//!
2016-08-14 00:53:05 +02:00
//! Write to a file descriptor, providing the file descriptor from `open` and a const buffer
2016-08-14 02:21:46 +02:00
//!
2016-08-14 00:53:05 +02:00
//! Returns the number of bytes actually written, or an error
//!
2016-08-14 00:57:21 +02:00
//! ### Stat
//! `fstat(file_descriptor: usize, stat: &mut Stat) -> Result<()>`
//!
2016-08-14 00:53:05 +02:00
//! Get information from a file descriptor, providing the file descriptor from `open`
//! and a mutable Stat struct, defined elsewhere.
2016-08-14 02:21:46 +02:00
//!
2016-08-14 00:53:05 +02:00
//! Returns an error if the operation failed
//!
2016-08-14 00:57:21 +02:00
//! ### Path
//! `fpath(file_descriptor: usize, buffer: &mut [u8]) -> Result<count: usize>`
//!
2016-08-14 02:21:46 +02:00
//! Read the path of a file descriptor, providing the file descriptor from `open` and
//! a mutable buffer.
//!
2016-08-14 00:53:05 +02:00
//! Returns the number of bytes actually read, or an error
2016-08-14 02:21:46 +02:00
//!
//! 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.
2016-08-15 02:16:56 +02:00
#![feature(const_fn)]
2016-08-14 02:21:46 +02:00
#![feature(lang_items)]
2016-08-14 23:58:35 +02:00
#![feature(question_mark)]
2016-08-14 02:21:46 +02:00
#![no_std]
#[macro_use]
extern crate bitflags;
2016-08-15 02:16:56 +02:00
use arch::interrupt::{enable_interrupts, halt};
2016-08-14 22:59:18 +02:00
/// Architecture specific items (test)
#[cfg(test)]
2016-08-14 19:45:47 +02:00
#[macro_use]
2016-08-14 22:59:18 +02:00
extern crate arch_test as arch;
/// Architecture specific items (x86_64)
#[cfg(all(not(test), target_arch = "x86_64"))]
#[macro_use]
extern crate arch_x86_64 as arch;
2016-08-14 02:21:46 +02:00
2016-08-15 02:16:56 +02:00
/// Context management
pub mod context;
2016-08-14 20:11:53 +02:00
/// Intrinsics for panic handling
2016-08-14 19:45:47 +02:00
pub mod panic;
2016-08-14 23:58:35 +02:00
/// Syscall handlers
pub mod syscall;
2016-08-14 22:59:18 +02:00
/// Tests
#[cfg(test)]
pub mod tests;
#[no_mangle]
2016-08-14 19:45:47 +02:00
pub extern fn kmain() {
println!("TEST");
2016-08-15 02:16:56 +02:00
println!("{:?}", syscall::open(b"stdin", 0));
println!("{:?}", syscall::open(b"stdout", 0));
println!("{:?}", syscall::open(b"stderr", 0));
2016-08-14 23:58:35 +02:00
2016-08-14 19:45:47 +02:00
loop {
2016-08-15 02:16:56 +02:00
unsafe {
enable_interrupts();
halt();
}
println!("{:?}", syscall::write(1, b"HALT\n"));
2016-08-14 19:45:47 +02:00
}
}