Use config.toml instead of x86_* Cargo feature.

This commit is contained in:
4lDO2
2023-09-12 21:18:56 +02:00
parent c210e59a75
commit f028b77412
7 changed files with 14 additions and 20 deletions
+1 -7
View File
@@ -45,7 +45,7 @@ raw-cpuid = "10.2.0"
x86 = { version = "0.47.0", default-features = false }
[features]
default = ["acpi", "multi_core", "graphical_debug", "serial_debug", "x86_smap"]
default = ["acpi", "multi_core", "graphical_debug", "serial_debug"]
acpi = []
doc = []
graphical_debug = []
@@ -58,12 +58,6 @@ serial_debug = []
system76_ec_debug = []
slab = ["slab_allocator"]
# TODO: Either wait for LLVM 12 and use target_feature, or use another system for cpu features
x86_fsgsbase = []
# Enables SMAP if available, on x86_64. Ignored on other architectures.
x86_smap = []
[profile.dev]
# Avoids having to define the eh_personality lang item and reduces kernel size
panic = "abort"
+1 -1
View File
@@ -206,7 +206,7 @@ pub unsafe fn init_paging(stack_offset: usize, cpu_id: LogicalCpuId) {
})
});
if cfg!(feature = "x86_fsgsbase") {
if cfg!(cpu_feature_always = "fsgsbase") {
assert!(cpu_supports_fsgsbase, "running kernel with features not supported by the current CPU");
x86::controlregs::cr4_write(x86::controlregs::cr4() | x86::controlregs::Cr4::CR4_ENABLE_FSGSBASE);
+1 -1
View File
@@ -23,7 +23,7 @@ pub unsafe fn init(cpu_id: LogicalCpuId) {
// obvious reasons.
x86::controlregs::cr4_write(x86::controlregs::cr4() | Cr4::CR4_ENABLE_SMEP);
}
if has_ext_feat(|feat| feat.has_smap()) && cfg!(feature = "x86_smap") {
if has_ext_feat(|feat| feat.has_smap()) && cfg!(cpu_feature_always = "smap") {
// SMAP (Supervisor-Mode Access Prevention) forbids the kernel from accessing any
// userspace-accessible pages, with the necessary exception of RFLAGS.AC = 1. This limits
// user-memory accesses to the UserSlice wrapper, so that no code outside of usercopy
+2 -2
View File
@@ -64,7 +64,7 @@ pub mod flags {
pub unsafe extern "C" fn arch_copy_to_user(dst: usize, src: usize, len: usize) -> u8 {
// TODO: LFENCE (spectre_v1 mitigation)?
#[cfg(not(feature = "x86_smap"))]
#[cfg(cpu_feature_never = "smap")]
core::arch::asm!("
xor eax, eax
mov rcx, rdx
@@ -72,7 +72,7 @@ pub unsafe extern "C" fn arch_copy_to_user(dst: usize, src: usize, len: usize) -
ret
", options(noreturn));
#[cfg(feature = "x86_smap")]
#[cfg(cpu_feature_always = "smap")]
core::arch::asm!("
xor eax, eax
mov rcx, rdx
+4 -4
View File
@@ -285,7 +285,7 @@ macro_rules! inner_pit_unmap(
}
);
#[cfg(not(feature = "x86_fsgsbase"))]
#[cfg(cpu_feature_never = "fsgsbase")]
macro_rules! save_fsgsbase(
() => {
"
@@ -303,7 +303,7 @@ macro_rules! save_fsgsbase(
"
}
);
#[cfg(feature = "x86_fsgsbase")]
#[cfg(cpu_feature_always = "fsgsbase")]
macro_rules! save_fsgsbase(
() => {
"
@@ -314,7 +314,7 @@ macro_rules! save_fsgsbase(
}
);
#[cfg(feature = "x86_fsgsbase")]
#[cfg(cpu_feature_always = "fsgsbase")]
macro_rules! restore_fsgsbase(
() => {
"
@@ -324,7 +324,7 @@ macro_rules! restore_fsgsbase(
}
);
#[cfg(not(feature = "x86_fsgsbase"))]
#[cfg(cpu_feature_never = "fsgsbase")]
macro_rules! restore_fsgsbase(
() => {
"
+1 -1
View File
@@ -146,7 +146,7 @@ pub unsafe fn switch_to(prev: &mut super::Context, next: &mut super::Context) {
// This is so much shorter in Rust!
if cfg!(feature = "x86_fsgsbase") {
if cfg!(cpu_feature_always = "fsgsbase") {
prev.arch.fsbase = rdfsbase() as usize;
wrfsbase(next.arch.fsbase as u64);
swapgs();
+4 -4
View File
@@ -421,14 +421,14 @@ impl ProcScheme {
#[cfg(target_arch = "x86_64")]
fn read_env_regs(&self, info: &Info) -> Result<EnvRegisters> {
let (fsbase, gsbase) = if info.pid == context::context_id() {
#[cfg(not(feature = "x86_fsgsbase"))]
#[cfg(cpu_feature_never = "fsgsbase")]
unsafe {
(
x86::msr::rdmsr(x86::msr::IA32_FS_BASE),
x86::msr::rdmsr(x86::msr::IA32_KERNEL_GSBASE),
)
}
#[cfg(feature = "x86_fsgsbase")]
#[cfg(cpu_feature_always = "fsgsbase")]
unsafe {
use x86::bits64::segmentation::*;
@@ -504,7 +504,7 @@ impl ProcScheme {
}
if info.pid == context::context_id() {
#[cfg(not(feature = "x86_fsgsbase"))]
#[cfg(cpu_feature_never = "fsgsbase")]
unsafe {
x86::msr::wrmsr(x86::msr::IA32_FS_BASE, regs.fsbase as u64);
// We have to write to KERNEL_GSBASE, because when the kernel returns to
@@ -518,7 +518,7 @@ impl ProcScheme {
}
}
}
#[cfg(feature = "x86_fsgsbase")]
#[cfg(cpu_feature_always = "fsgsbase")]
unsafe {
use x86::bits64::segmentation::*;