6b98c64663
Phase J: the kernel needs two Cargo patch overrides so that the typed-AcPiVerb path (EnterS2Idle / ExitS2Idle) is usable. Without these: * the kernel's redox_syscall dep is fetched from gitlab.redox-os.org (upstream), so the local fork at local/sources/syscall (with the new AcPiVerb variants) is not visible to the kernel's build. * the libredox dep is fetched from crates.io, so the local fork at local/sources/libredox (which uses the local syscall fork) is not visible. This means libredox::error::Error and syscall::Error are different compile-time types and the E0277 errors in scheme-utils and daemon return. The fix: a single [patch.crates-io] section overriding libredox (which is from crates.io) and a [patch.'<URL>'] section overriding redox_syscall (which is from a git URL). [patch.crates-io] only matches crates.io deps; [patch.'<URL>'] matches the dep's source URL. Also: declare members = ['.', 'rmm'] in the [workspace] section. Without this, cargo doesn't recognize the kernel as a workspace and the [patch] sections are silently ignored (workspace_metadata is None). The members list includes the kernel's own directory and the rmm path dep.
149 lines
5.1 KiB
TOML
149 lines
5.1 KiB
TOML
[workspace]
|
|
resolver = "3"
|
|
members = [".", "rmm"]
|
|
|
|
[package]
|
|
name = "kernel"
|
|
version = "0.5.12"
|
|
build = "build.rs"
|
|
edition = "2024"
|
|
|
|
[build-dependencies]
|
|
cc = "1.0"
|
|
toml = "0.8"
|
|
|
|
[dependencies]
|
|
arrayvec = { version = "0.7.4", default-features = false }
|
|
bitfield = "0.13.2"
|
|
bitflags = "2"
|
|
fdt = { git = "https://github.com/repnop/fdt.git", rev = "2fb1409edd1877c714a0aa36b6a7c5351004be54" }
|
|
hashbrown = { version = "0.14.3", default-features = false, features = ["ahash", "inline-more"] }
|
|
linked_list_allocator = "0.9.0"
|
|
redox-path = "0.2.0"
|
|
redox_syscall = { git = "https://gitlab.redox-os.org/redox-os/syscall.git", default-features = false }
|
|
rmm = { path = "rmm", default-features = false }
|
|
slab = { version = "0.4", default-features = false }
|
|
smallvec = { version = "1.15.1", default-features = false }
|
|
spin = { version = "0.9.8" }
|
|
|
|
[dependencies.object]
|
|
version = "0.37.1"
|
|
default-features = false
|
|
features = ["read_core", "elf"]
|
|
|
|
[dependencies.rustc-demangle]
|
|
version = "0.1.16"
|
|
default-features = false
|
|
|
|
[lints.clippy]
|
|
# Overflows are very, very bad in kernel code as it may provide an attack vector for
|
|
# userspace applications, and it is only checked in debug builds
|
|
# TODO: address occurrences and then deny
|
|
arithmetic_side_effects = "warn"
|
|
cast_ptr_alignment = "warn" # TODO: address occurrences and then deny
|
|
identity_op = "allow" # Used to allow stuff like 1 << 0 and 1 * 1024 * 1024
|
|
if_same_then_else = "allow" # Useful for adding comments about different branches
|
|
# Indexing a slice can cause panics and that is something we always want to avoid
|
|
# in kernel code. Use .get and return an error instead
|
|
# TODO: address occurrences and then deny
|
|
indexing_slicing = "warn"
|
|
many_single_char_names = "allow" # Useful in the syscall function
|
|
module_inception = "allow" # Used for context::context
|
|
# Not implementing default is sometimes useful in the case something has significant cost
|
|
# to allocate. If you implement default, it can be allocated without evidence using the
|
|
# ..Default::default() syntax. Not fun in kernel space
|
|
new_without_default = "allow"
|
|
not_unsafe_ptr_arg_deref = "deny"
|
|
or_fun_call = "allow" # Used to make it nicer to return errors, for example, .ok_or(Error::new(ESRCH))
|
|
precedence = "deny"
|
|
ptr_cast_constness = "deny"
|
|
too_many_arguments = "allow" # This is needed in some cases, like for syscall
|
|
# Avoid panicking in the kernel without information about the panic. Use expect
|
|
# TODO: address occurrences and then deny
|
|
unwrap_used = "warn"
|
|
|
|
[lints.rust]
|
|
static_mut_refs = "warn" # FIXME deny once all occurrences are fixed
|
|
# This is usually a serious issue - a missing import of a define where it is interpreted
|
|
# as a catch-all variable in a match, for example
|
|
unreachable_patterns = "deny"
|
|
unused_must_use = "deny" # Ensure that all must_use results are used
|
|
|
|
[target.'cfg(any(target_arch = "x86", target_arch = "x86_64"))'.dependencies]
|
|
raw-cpuid = "10.2.0"
|
|
x86 = { version = "0.47.0", default-features = false }
|
|
|
|
[target.'cfg(any(target_arch = "riscv64", target_arch = "riscv32"))'.dependencies]
|
|
sbi-rt = "0.0.3"
|
|
|
|
[features]
|
|
default = [
|
|
"acpi",
|
|
#"debugger",
|
|
"multi_core",
|
|
"serial_debug",
|
|
"self_modifying",
|
|
"x86_kvm_pv",
|
|
#"busy_panic",
|
|
#"drop_panic",
|
|
#"syscall_debug"
|
|
]
|
|
|
|
# Activates some limited code-overwriting optimizations, based on CPU features.
|
|
self_modifying = []
|
|
|
|
acpi = []
|
|
lpss_debug = []
|
|
multi_core = ["acpi"]
|
|
profiling = []
|
|
#TODO: remove when threading issues are fixed
|
|
pti = []
|
|
drop_panic = []
|
|
busy_panic = []
|
|
qemu_debug = []
|
|
serial_debug = []
|
|
system76_ec_debug = []
|
|
x86_kvm_pv = []
|
|
|
|
debugger = ["syscall_debug"]
|
|
syscall_debug = []
|
|
|
|
sys_fdstat = []
|
|
|
|
[profile.dev]
|
|
# Avoids having to define the eh_personality lang item and reduces kernel size
|
|
panic = "abort"
|
|
|
|
[profile.release]
|
|
# Avoids having to define the eh_personality lang item and reduces kernel size
|
|
panic = "abort"
|
|
#lto = true
|
|
debug = "full"
|
|
|
|
# Red Bear OS Phase J: see local/sources/base/Cargo.toml for
|
|
# the rationale. Both the kernel and the base workspace need
|
|
# the libredox override so that the libredox::error::Error
|
|
# type is the same compile-time type as syscall::Error. With
|
|
# the local libredox fork at local/sources/libredox/ using
|
|
# the local syscall fork at local/sources/syscall/, the
|
|
# libredox::error::Error (re-exported from the local syscall)
|
|
# and syscall::Error (also the local syscall) are now the
|
|
# same type, so `?` conversions in scheme-utils / daemon
|
|
# compile cleanly.
|
|
[patch.crates-io]
|
|
# Phase J: override libredox 0.1.17 to use the local
|
|
# fork at ../libredox/ (which itself uses the local syscall
|
|
# fork). This breaks the libredox::error::Error <->
|
|
# syscall::Error type-identity barrier that previously
|
|
# caused E0277 errors in scheme-utils and daemon.
|
|
libredox = { path = "../libredox" }
|
|
# Phase J: the kernel's redox_syscall dep is a git URL
|
|
# (not crates.io), so [patch.crates-io] doesn't apply.
|
|
# Use a [patch."<URL>"] section to match the dep source.
|
|
# The local fork at ../syscall adds the EnterS2Idle /
|
|
# ExitS2Idle AcpiVerb variants — the kernel's direct use
|
|
# of AcpiVerb in src/scheme/acpi.rs's kcall handler
|
|
# needs the fork to see these variants.
|
|
[patch."https://gitlab.redox-os.org/redox-os/syscall.git"]
|
|
redox_syscall = { path = "../syscall" }
|