Add test architecture

This commit is contained in:
Jeremy Soller 2016-08-14 14:59:18 -06:00
parent 1c9b6361c9
commit 29b6544d8f
9 changed files with 108 additions and 7 deletions

View file

@ -3,15 +3,19 @@ name = "kernel"
version = "0.1.0"
[lib]
name = "kernel"
path = "kernel/lib.rs"
crate-type = ["staticlib"]
[target.'cfg(target_arch = "x86_64")'.dependencies]
arch = { path = "arch/x86_64" }
[dependencies]
bitflags = "*"
[dev-dependencies]
arch_test = { path = "arch/test" }
[target.'cfg(target_arch = "x86_64")'.dependencies]
arch_x86_64 = { path = "arch/x86_64" }
[profile.dev]
panic = "abort"

View file

@ -15,7 +15,7 @@ qemu: build/harddrive.bin
FORCE:
build/libkernel.a: FORCE
cargo rustc -- -C lto -o $@
cargo rustc -- --crate-type staticlib -o $@
#--target $(ARCH)-unknown-none.json
build/kernel.bin: build/libkernel.a

3
arch/test/Cargo.toml Normal file
View file

@ -0,0 +1,3 @@
[package]
name = "arch_test"
version = "0.1.0"

View file

@ -0,0 +1,24 @@
//! Interrupt instructions
static mut INTERRUPTS_ENABLED: bool = false;
/// Clear interrupts
#[inline(always)]
pub unsafe fn clear_interrupts() {
println!("CLEAR INTERRUPTS");
INTERRUPTS_ENABLED = false;
}
/// Set interrupts
#[inline(always)]
pub unsafe fn set_interrupts() {
println!("SET INTERRUPTS");
INTERRUPTS_ENABLED = true;
}
/// Halt instruction
#[inline(always)]
pub unsafe fn halt() {
assert!(INTERRUPTS_ENABLED);
::std::thread::yield_now();
}

40
arch/test/src/lib.rs Normal file
View file

@ -0,0 +1,40 @@
//! Architecture support for testing
pub use std::io;
/// Print to console
#[macro_export]
macro_rules! print {
($($arg:tt)*) => ({
use $crate::io::Write;
let _ = write!($crate::io::stdout(), $($arg)*);
});
}
/// Print with new line to console
#[macro_export]
macro_rules! println {
($fmt:expr) => (print!(concat!($fmt, "\n")));
($fmt:expr, $($arg:tt)*) => (print!(concat!($fmt, "\n"), $($arg)*));
}
/// Create an interrupt function that can safely run rust code
#[macro_export]
macro_rules! interrupt {
($name:ident, $func:block) => {
pub unsafe extern fn $name () {
unsafe fn inner() {
$func
}
// Call inner rust function
inner();
}
};
}
/// Interrupt instructions
pub mod interrupt;
/// Initialization and main function
pub mod main;

11
arch/test/src/main.rs Normal file
View file

@ -0,0 +1,11 @@
/// This function is where the kernel sets up IRQ handlers
/// It is increcibly unsafe, and should be minimal in nature
extern {
fn kmain() -> !;
}
#[no_mangle]
pub unsafe extern fn kstart() -> ! {
kmain();
}

View file

@ -1,5 +1,5 @@
[package]
name = "arch"
name = "arch_x86_64"
version = "0.1.0"
[dependencies]

View file

@ -72,13 +72,23 @@ extern crate bitflags;
use arch::interrupt::{set_interrupts, halt};
/// Architecture specific items
/// Architecture specific items (test)
#[cfg(test)]
#[macro_use]
extern crate arch;
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;
/// Intrinsics for panic handling
pub mod panic;
/// Tests
#[cfg(test)]
pub mod tests;
#[no_mangle]
pub extern fn kmain() {
println!("TEST");

9
kernel/tests/mod.rs Normal file
View file

@ -0,0 +1,9 @@
use arch::interrupt::{set_interrupts, halt};
#[test]
fn halt_with_interrupts() {
unsafe {
set_interrupts();
halt();
}
}