diff --git a/Cargo.lock b/Cargo.lock index 5917d515..9632e288 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -200,7 +200,7 @@ dependencies = [ "argh_shared", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -296,7 +296,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -564,7 +564,7 @@ dependencies = [ "libc", "serde", "serde_json", - "thiserror", + "thiserror 1.0.65", "time", "windows-sys 0.52.0", ] @@ -642,7 +642,7 @@ dependencies = [ "serde", "serde-untagged", "serde-value", - "thiserror", + "thiserror 1.0.65", "toml", "unicode-xid", "url", @@ -659,7 +659,7 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -741,7 +741,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -774,7 +774,7 @@ dependencies = [ "nom", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -855,7 +855,7 @@ dependencies = [ "percent-encoding", "serde", "serde_json", - "thiserror", + "thiserror 1.0.65", "url", ] @@ -962,7 +962,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1023,7 +1023,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1034,7 +1034,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1116,7 +1116,7 @@ dependencies = [ "secgate", "stable-vec", "talc", - "thiserror", + "thiserror 1.0.65", "tracing", "twizzler-abi", "twizzler-object", @@ -1460,7 +1460,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1609,7 +1609,7 @@ dependencies = [ "once_cell", "prodash", "smallvec", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1622,7 +1622,7 @@ dependencies = [ "gix-date 0.8.7", "gix-utils", "itoa", - "thiserror", + "thiserror 1.0.65", "winnow 0.6.20", ] @@ -1639,7 +1639,7 @@ dependencies = [ "gix-trace", "kstring", "smallvec", - "thiserror", + "thiserror 1.0.65", "unicode-bom", ] @@ -1649,7 +1649,7 @@ version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10f78312288bd02052be5dbc2ecbc342c9f4eb791986d86c0a5c06b92dc72efa" dependencies = [ - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1658,7 +1658,7 @@ version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c28b58ba04f0c004722344390af9dbc85888fbb84be1981afb934da4114d4cf" dependencies = [ - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1684,7 +1684,7 @@ dependencies = [ "gix-features", "gix-hash", "memmap2", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1703,7 +1703,7 @@ dependencies = [ "memchr", "once_cell", "smallvec", - "thiserror", + "thiserror 1.0.65", "unicode-bom", "winnow 0.6.20", ] @@ -1718,7 +1718,7 @@ dependencies = [ "bstr", "gix-path", "libc", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1735,7 +1735,7 @@ dependencies = [ "gix-sec", "gix-trace", "gix-url", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1746,7 +1746,7 @@ checksum = "9eed6931f21491ee0aeb922751bd7ec97b4b2fe8fbfedcb678e2a2dce5f3b8c0" dependencies = [ "bstr", "itoa", - "thiserror", + "thiserror 1.0.65", "time", ] @@ -1759,7 +1759,7 @@ dependencies = [ "bstr", "itoa", "jiff", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1771,7 +1771,7 @@ dependencies = [ "bstr", "gix-hash", "gix-object", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1791,7 +1791,7 @@ dependencies = [ "gix-trace", "gix-utils", "gix-worktree", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1807,7 +1807,7 @@ dependencies = [ "gix-path", "gix-ref", "gix-sec", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1828,7 +1828,7 @@ dependencies = [ "parking_lot", "prodash", "sha1_smol", - "thiserror", + "thiserror 1.0.65", "walkdir", ] @@ -1850,7 +1850,7 @@ dependencies = [ "gix-trace", "gix-utils", "smallvec", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1883,7 +1883,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93d7df7366121b5018f947a04d37f034717e113dcf9ccd85c34b58e57a74d5e" dependencies = [ "faster-hex", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1935,7 +1935,7 @@ dependencies = [ "memmap2", "rustix", "smallvec", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1946,7 +1946,7 @@ checksum = "e3bc7fe297f1f4614774989c00ec8b1add59571dc9b024b4c00acb7dedd4e19d" dependencies = [ "gix-tempfile", "gix-utils", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1957,7 +1957,7 @@ checksum = "999ce923619f88194171a67fb3e6d613653b8d4d6078b529b15a765da0edcc17" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -1973,7 +1973,7 @@ dependencies = [ "gix-object", "gix-revwalk", "smallvec", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1991,7 +1991,7 @@ dependencies = [ "gix-validate", "itoa", "smallvec", - "thiserror", + "thiserror 1.0.65", "winnow 0.6.20", ] @@ -2012,7 +2012,7 @@ dependencies = [ "gix-quote", "parking_lot", "tempfile", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2032,7 +2032,7 @@ dependencies = [ "memmap2", "parking_lot", "smallvec", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2044,7 +2044,7 @@ dependencies = [ "bstr", "faster-hex", "gix-trace", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2056,7 +2056,7 @@ dependencies = [ "bstr", "faster-hex", "gix-trace", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2069,7 +2069,7 @@ dependencies = [ "gix-trace", "home", "once_cell", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2084,7 +2084,7 @@ dependencies = [ "gix-config-value", "gix-glob", "gix-path", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2097,7 +2097,7 @@ dependencies = [ "gix-config-value", "parking_lot", "rustix", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2114,7 +2114,7 @@ dependencies = [ "gix-transport", "gix-utils", "maybe-async", - "thiserror", + "thiserror 1.0.65", "winnow 0.6.20", ] @@ -2126,7 +2126,7 @@ checksum = "f89f9a1525dcfd9639e282ea939f5ab0d09d93cf2b90c1fc6104f1b9582a8e49" dependencies = [ "bstr", "gix-utils", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2146,7 +2146,7 @@ dependencies = [ "gix-utils", "gix-validate", "memmap2", - "thiserror", + "thiserror 1.0.65", "winnow 0.6.20", ] @@ -2161,7 +2161,7 @@ dependencies = [ "gix-revision", "gix-validate", "smallvec", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2175,7 +2175,7 @@ dependencies = [ "gix-hash", "gix-object", "gix-revwalk", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2190,7 +2190,7 @@ dependencies = [ "gix-hashtable", "gix-object", "smallvec", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2217,7 +2217,7 @@ dependencies = [ "gix-pathspec", "gix-refspec", "gix-url", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2255,7 +2255,7 @@ dependencies = [ "gix-quote", "gix-sec", "gix-url", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2272,7 +2272,7 @@ dependencies = [ "gix-object", "gix-revwalk", "smallvec", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2285,7 +2285,7 @@ dependencies = [ "gix-features", "gix-path", "home", - "thiserror", + "thiserror 1.0.65", "url", ] @@ -2307,7 +2307,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82c27dd34a49b1addf193c92070bcbf3beaf6e10f16a78544de6372e146a0acf" dependencies = [ "bstr", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -3121,7 +3121,7 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -3156,7 +3156,7 @@ checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" dependencies = [ "miette-derive", "once_cell", - "thiserror", + "thiserror 1.0.65", "unicode-width", ] @@ -3168,7 +3168,7 @@ checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -3407,7 +3407,7 @@ checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -3483,7 +3483,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -3566,7 +3566,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -3864,9 +3864,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -4089,7 +4089,7 @@ checksum = "8fb2b066405a6d48a1b39c0022270503e352ae84da0c24e1d5f8ffc38e97a325" dependencies = [ "serde", "serde_json", - "thiserror", + "thiserror 1.0.65", "tracing", ] @@ -4182,7 +4182,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -4255,7 +4255,7 @@ checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -4503,7 +4503,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -4537,9 +4537,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.85" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -4627,7 +4627,16 @@ version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.65", +] + +[[package]] +name = "thiserror" +version = "2.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f5383f3e0071702bf93ab5ee99b52d26936be9dedd9413067cbdcddcb6141a" +dependencies = [ + "thiserror-impl 2.0.8", ] [[package]] @@ -4638,7 +4647,18 @@ checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f357fcec90b3caef6623a099691be676d033b40a058ac95d2a6ade6fa0c943" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", ] [[package]] @@ -4840,7 +4860,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] @@ -4899,6 +4919,16 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +[[package]] +name = "twizzler" +version = "0.99.0" +dependencies = [ + "bitflags 2.6.0", + "thiserror 2.0.8", + "twizzler-abi", + "twizzler-rt-abi", +] + [[package]] name = "twizzler-abi" version = "0.1.0" @@ -5078,7 +5108,7 @@ dependencies = [ "stable-vec", "static_assertions", "talc", - "thiserror", + "thiserror 1.0.65", "tracing", "tracing-subscriber", "twizzler-abi", @@ -5249,7 +5279,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "wasm-bindgen-shared", ] @@ -5283,7 +5313,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5693,7 +5723,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.90", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 05cf2bff..3208b7a5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ members = [ "src/lib/twizzler-futures", "src/lib/dynlink", "src/lib/secgate", + "src/lib/twizzler", "src/rt/monitor", "src/rt/monitor-api", "src/rt/monitor/tests/montest", diff --git a/src/lib/twizzler-abi/src/syscall/create.rs b/src/lib/twizzler-abi/src/syscall/create.rs index 4a1ab1fe..618ed28f 100644 --- a/src/lib/twizzler-abi/src/syscall/create.rs +++ b/src/lib/twizzler-abi/src/syscall/create.rs @@ -43,27 +43,23 @@ impl ObjectSource { } } -#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Ord, Eq)] +#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Ord, Eq, Default)] #[repr(C)] /// The backing memory type for this object. Currently doesn't do anything. pub enum BackingType { /// The default, let the kernel decide based on the [LifetimeType] of the object. + #[default] Normal = 0, } -impl Default for BackingType { - fn default() -> Self { - Self::Normal - } -} - -#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Ord, Eq)] +#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Ord, Eq, Default)] #[repr(C)] /// The base lifetime type of the object. Note that this does not ensure that the object is stored /// in a specific type of memory, the kernel is allowed to migrate objects with the Normal /// [BackingType] as it sees fit. For more information on object lifetime, see [the book](https://twizzler-operating-system.github.io/nightly/book/object_lifetime.html). pub enum LifetimeType { /// This object is volatile, and is expected to be deleted after a power cycle. + #[default] Volatile = 0, /// This object is persistent, and should be deleted only after an explicit delete call. Persistent = 1, @@ -71,7 +67,7 @@ pub enum LifetimeType { bitflags! { /// Flags to pass to the object create system call. - #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] + #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default)] pub struct ObjectCreateFlags: u32 { } } @@ -83,7 +79,7 @@ bitflags! { } } -#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Ord, Eq)] +#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Ord, Eq, Default)] #[repr(C)] /// Full object creation specification, minus ties. pub struct ObjectCreate { diff --git a/src/lib/twizzler/Cargo.toml b/src/lib/twizzler/Cargo.toml new file mode 100644 index 00000000..b681ac6e --- /dev/null +++ b/src/lib/twizzler/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "twizzler" +version = "0.99.0" +edition = "2021" + +[dependencies] +bitflags = "2" +thiserror = "2" +twizzler-rt-abi = { path = "../../abi/rt-abi" } +twizzler-abi = { path = "../../lib/twizzler-abi" } diff --git a/src/lib/twizzler/src/alloc.rs b/src/lib/twizzler/src/alloc.rs new file mode 100644 index 00000000..e093bce3 --- /dev/null +++ b/src/lib/twizzler/src/alloc.rs @@ -0,0 +1,4 @@ +pub mod arena; +pub mod invbox; + +pub trait Allocator {} diff --git a/src/lib/twizzler/src/alloc/arena.rs b/src/lib/twizzler/src/alloc/arena.rs new file mode 100644 index 00000000..923fbca9 --- /dev/null +++ b/src/lib/twizzler/src/alloc/arena.rs @@ -0,0 +1,14 @@ +use super::Allocator; +use crate::object::Object; + +pub struct ArenaAllocator { + obj: Object, +} + +#[repr(C)] +pub struct ArenaBase {} + +#[repr(C)] +pub struct ArenaObjBase {} + +impl Allocator for ArenaAllocator {} diff --git a/src/lib/twizzler/src/alloc/invbox.rs b/src/lib/twizzler/src/alloc/invbox.rs new file mode 100644 index 00000000..47333c17 --- /dev/null +++ b/src/lib/twizzler/src/alloc/invbox.rs @@ -0,0 +1,5 @@ +use crate::{marker::Invariant, ptr::InvPtr}; + +pub struct InvBox { + raw: InvPtr, +} diff --git a/src/lib/twizzler/src/collections.rs b/src/lib/twizzler/src/collections.rs new file mode 100644 index 00000000..63e55caa --- /dev/null +++ b/src/lib/twizzler/src/collections.rs @@ -0,0 +1 @@ +pub mod vec; diff --git a/src/lib/twizzler/src/collections/vec.rs b/src/lib/twizzler/src/collections/vec.rs new file mode 100644 index 00000000..e69de29b diff --git a/src/lib/twizzler/src/lib.rs b/src/lib/twizzler/src/lib.rs new file mode 100644 index 00000000..7249b2fd --- /dev/null +++ b/src/lib/twizzler/src/lib.rs @@ -0,0 +1,11 @@ +#![feature(negative_impls)] +#![feature(auto_traits)] +#![feature(strict_provenance)] +#![feature(allocator_api)] + +pub mod alloc; +pub mod collections; +pub mod marker; +pub mod object; +pub mod ptr; +pub mod tx; diff --git a/src/lib/twizzler/src/marker.rs b/src/lib/twizzler/src/marker.rs new file mode 100644 index 00000000..c54cc50f --- /dev/null +++ b/src/lib/twizzler/src/marker.rs @@ -0,0 +1,58 @@ +//! Marker types for invariance, store side-effects, and base types. + +/// Indicates that a type is _invariant_ and thus can be stored in an object. +/// +/// # Safety +/// The implementation must ensure that the type is invariant, meaning that the type must: +/// - Be FFI safe. +/// - Be stable in-memory (independent of architecture). This means, among other things, that the +/// type must be fixed-width. For example, usize is not `Invariant`. +pub unsafe trait Invariant {} + +unsafe impl Invariant for u8 {} +unsafe impl Invariant for u16 {} +unsafe impl Invariant for u32 {} +unsafe impl Invariant for u64 {} +unsafe impl Invariant for bool {} +unsafe impl Invariant for i8 {} +unsafe impl Invariant for i16 {} +unsafe impl Invariant for i32 {} +unsafe impl Invariant for i64 {} + +unsafe impl Invariant for f64 {} +unsafe impl Invariant for f32 {} + +unsafe impl Invariant for () {} + +unsafe impl Invariant for [T; N] {} + +unsafe impl Invariant for (T,) {} + +unsafe impl Invariant for Option {} +unsafe impl Invariant for Result {} + +/// The type may move between objects without side effects. Notably, this is +/// not implemented for invariant pointers or types that contain them, since an invariant pointer +/// may reference an object's Foreign Object Table. This is a little restrictive (technically +/// intra-object pointers are safe to move intra-object), but it's the best we can do at +/// compile-time. +/// +/// # Safety +/// The implementation must ensure that no store side effects must occur when writing this value to +/// object memory. +pub unsafe auto trait StoreCopy {} + +/// A zero-sized phantom marker for indicating that the containing type has a side effect when +/// storing (e.g. it has an invariant pointer). +#[derive(Copy, Clone, PartialEq, PartialOrd, Ord, Eq, Hash, Debug)] +pub struct PhantomStoreEffect; + +impl !StoreCopy for PhantomStoreEffect {} +impl !Unpin for PhantomStoreEffect {} + +pub trait BaseType { + /// The fingerprint of this type. + fn fingerprint() -> u64 { + 0 + } +} diff --git a/src/lib/twizzler/src/object.rs b/src/lib/twizzler/src/object.rs new file mode 100644 index 00000000..89324cd2 --- /dev/null +++ b/src/lib/twizzler/src/object.rs @@ -0,0 +1,115 @@ +//! Traits and types for working with objects. + +use std::marker::PhantomData; + +use fot::FotEntry; +use twizzler_abi::{ + meta::MetaInfo, + object::{ObjID, MAX_SIZE, NULLPAGE_SIZE}, +}; +use twizzler_rt_abi::object::ObjectHandle; + +use crate::{marker::BaseType, ptr::Ref}; + +mod builder; +mod fot; +mod meta; + +/// Operations common to structured objects. +pub trait TypedObject { + /// The base type of this object. + type Base: BaseType; + + /// Returns a resolved reference to the object's base. + fn base(&self) -> Ref<'_, Self::Base>; +} + +/// Operations common to all objects, with raw pointers. +pub trait RawObject { + /// Get the underlying runtime handle for this object. + fn handle(&self) -> &ObjectHandle; + + /// Get the object ID. + fn id(&self) -> ObjID { + self.handle().id() + } + + /// Get a const pointer to the object base. + fn base_ptr(&self) -> *const T { + self.lea(NULLPAGE_SIZE, size_of::()).unwrap().cast() + } + + /// Get a mut pointer to the object base. + fn base_mut_ptr(&self) -> *mut T { + self.lea_mut(NULLPAGE_SIZE, size_of::()).unwrap().cast() + } + + /// Get a const pointer to the object metadata. + fn meta_ptr(&self) -> *const MetaInfo { + self.handle().meta().cast() + } + + /// Get a mut pointer to the object metadata. + fn meta_mut_ptr(&self) -> *mut MetaInfo { + self.handle().meta().cast() + } + + /// Get a const pointer to a given FOT entry. + fn fote_ptr(&self, idx: usize) -> Option<*const FotEntry> { + let offset: isize = (1 + idx).try_into().ok()?; + unsafe { Some((self.meta_ptr() as *const FotEntry).offset(-offset)) } + } + + /// Get a mut pointer to a given FOT entry. + fn fote_ptr_mut(&self, idx: usize) -> Option<*mut FotEntry> { + let offset: isize = (1 + idx).try_into().ok()?; + unsafe { Some((self.meta_mut_ptr() as *mut FotEntry).offset(-offset)) } + } + + /// Get a const pointer to given range of the object. + fn lea(&self, offset: usize, _len: usize) -> Option<*const u8> { + Some(unsafe { self.handle().start().add(offset) as *const u8 }) + } + + /// Get a mut pointer to given range of the object. + fn lea_mut(&self, offset: usize, _len: usize) -> Option<*mut u8> { + Some(unsafe { self.handle().start().add(offset) as *mut u8 }) + } + + /// If the pointer is local to this object, return the offset into the object. Otherwise, return + /// None. + fn ptr_local(&self, ptr: *const u8) -> Option { + if ptr.addr() >= self.handle().start().addr() + && ptr.addr() < self.handle().start().addr() + MAX_SIZE + { + Some(ptr.addr() - self.handle().start().addr()) + } else { + None + } + } +} + +impl RawObject for ObjectHandle { + fn handle(&self) -> &ObjectHandle { + self + } +} + +pub struct Object { + handle: ObjectHandle, + _pd: PhantomData<*const Base>, +} + +impl RawObject for Object { + fn handle(&self) -> &ObjectHandle { + &self.handle + } +} + +impl TypedObject for Object { + type Base = Base; + + fn base(&self) -> Ref<'_, Self::Base> { + todo!() + } +} diff --git a/src/lib/twizzler/src/object/builder.rs b/src/lib/twizzler/src/object/builder.rs new file mode 100644 index 00000000..5e986b57 --- /dev/null +++ b/src/lib/twizzler/src/object/builder.rs @@ -0,0 +1,53 @@ +use std::{alloc::AllocError, marker::PhantomData, mem::MaybeUninit}; + +use thiserror::Error; +use twizzler_abi::syscall::{ObjectCreate, ObjectCreateError}; +use twizzler_rt_abi::object::{MapError, ObjectHandle}; + +use super::RawObject; +use crate::marker::BaseType; + +#[derive(Clone, Copy, Debug, Error)] +/// Possible errors from creating an object. +pub enum CreateError { + #[error(transparent)] + Create(#[from] ObjectCreateError), + #[error(transparent)] + Map(#[from] MapError), + #[error(transparent)] + Alloc(#[from] AllocError), +} + +/// An object builder, for constructing objects using a builder API. +pub struct ObjectBuilder { + spec: ObjectCreate, + _pd: PhantomData, +} + +impl ObjectBuilder { + /// Make a new object builder. + pub fn new(spec: ObjectCreate) -> Self { + Self { + spec, + _pd: PhantomData, + } + } +} + +impl Default for ObjectBuilder { + fn default() -> Self { + Self::new(ObjectCreate::default()) + } +} + +/// An uninitialized object, used during object construction. +pub struct UninitObject { + handle: ObjectHandle, + _pd: PhantomData<*mut MaybeUninit>, +} + +impl RawObject for UninitObject { + fn handle(&self) -> &ObjectHandle { + &self.handle + } +} diff --git a/src/lib/twizzler/src/object/fot.rs b/src/lib/twizzler/src/object/fot.rs new file mode 100644 index 00000000..1d71bc05 --- /dev/null +++ b/src/lib/twizzler/src/object/fot.rs @@ -0,0 +1,34 @@ +use std::sync::atomic::AtomicU32; + +use thiserror::Error; + +bitflags::bitflags! { + #[repr(C)] + #[derive(Copy, Clone, Debug, PartialEq, PartialOrd, Ord, Eq, Hash)] + pub struct FotFlags : u32 { + const RESERVED = 1; + const ACTIVE = 2; + const RESOLVER = 4; + } +} + +pub type ResolverFn = extern "C" fn(ResolveRequest) -> Result; + +#[derive(Copy, Clone, Debug, PartialEq, PartialOrd, Ord, Eq, Hash, Error)] +pub enum FotError { + #[error("invalid FOT index")] + InvalidIndex, + #[error("invalid FOT entry")] + InvalidFotEntry, +} + +pub struct ResolveRequest {} + +pub struct FotResolve {} + +#[repr(C)] +pub struct FotEntry { + pub values: [u64; 2], + pub resolver: u64, + pub flags: AtomicU32, +} diff --git a/src/lib/twizzler/src/object/meta.rs b/src/lib/twizzler/src/object/meta.rs new file mode 100644 index 00000000..86254b3e --- /dev/null +++ b/src/lib/twizzler/src/object/meta.rs @@ -0,0 +1 @@ +pub use twizzler_abi::meta::*; diff --git a/src/lib/twizzler/src/ptr.rs b/src/lib/twizzler/src/ptr.rs new file mode 100644 index 00000000..a60e639a --- /dev/null +++ b/src/lib/twizzler/src/ptr.rs @@ -0,0 +1,7 @@ +mod global; +mod invariant; +mod resolved; + +pub use global::*; +pub use invariant::*; +pub use resolved::*; diff --git a/src/lib/twizzler/src/ptr/global.rs b/src/lib/twizzler/src/ptr/global.rs new file mode 100644 index 00000000..a9d06b06 --- /dev/null +++ b/src/lib/twizzler/src/ptr/global.rs @@ -0,0 +1,11 @@ +use std::marker::PhantomData; + +use twizzler_abi::object::ObjID; + +#[derive(Copy, Clone, Debug, Default, PartialEq, PartialOrd, Ord, Eq, Hash)] +/// A global pointer, containing a fully qualified object ID and offset. +pub struct GlobalPtr { + id: ObjID, + offset: usize, + _pd: PhantomData<*const T>, +} diff --git a/src/lib/twizzler/src/ptr/invariant.rs b/src/lib/twizzler/src/ptr/invariant.rs new file mode 100644 index 00000000..c1c10987 --- /dev/null +++ b/src/lib/twizzler/src/ptr/invariant.rs @@ -0,0 +1,11 @@ +use std::marker::PhantomData; + +use crate::marker::{Invariant, PhantomStoreEffect}; + +#[repr(C)] +#[derive(Debug, PartialEq, PartialOrd, Ord, Eq)] +pub struct InvPtr { + value: u64, + _pse: PhantomStoreEffect, + _pd: PhantomData<*const T>, +} diff --git a/src/lib/twizzler/src/ptr/resolved.rs b/src/lib/twizzler/src/ptr/resolved.rs new file mode 100644 index 00000000..2f65395e --- /dev/null +++ b/src/lib/twizzler/src/ptr/resolved.rs @@ -0,0 +1,9 @@ +use std::marker::PhantomData; + +use twizzler_rt_abi::object::ObjectHandle; + +pub struct Ref<'obj, T> { + ptr: *const T, + handle: *const ObjectHandle, + _pd: PhantomData<&'obj T>, +} diff --git a/src/lib/twizzler/src/tx.rs b/src/lib/twizzler/src/tx.rs new file mode 100644 index 00000000..16830d95 --- /dev/null +++ b/src/lib/twizzler/src/tx.rs @@ -0,0 +1,28 @@ +/// A trait for implementing transaction handles. +/// +/// Takes a lifetime argument, 'obj. All object handles referenced by this transaction must have +/// this lifetime or longer. +pub trait TxHandle<'obj> { + /// Ensures transactional safety for mutably accessing data given by the range [data, data + + /// sizeof(T)). + fn tx_mut(&self, data: *const T) -> TxResult<*mut T, E>; +} + +pub type TxResult = Result>; + +#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, thiserror::Error)] +/// Transaction errors, with user-definable abort type. +pub enum TxError { + /// Transaction aborted. + #[error("aborted: {0}")] + Abort(E), + /// Resources exhausted. + #[error("resources exhausted")] + Exhausted, + /// Tried to mutate immutable data. + #[error("object is immutable")] + Immutable, + /// Invalid argument. + #[error("invalid argument")] + InvalidArgument, +} diff --git a/src/lib/twizzler/src/tx/unsafe.rs b/src/lib/twizzler/src/tx/unsafe.rs new file mode 100644 index 00000000..e69de29b