├── .gitignore ├── src ├── lib.rs ├── constants.rs ├── util.rs ├── linux_loader.rs ├── main.rs └── kvm.rs ├── Cargo.toml ├── contrib ├── init.c └── config-6.8.6 ├── README.md ├── Cargo.lock └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate nix; 3 | 4 | #[allow(unused)] 5 | #[allow(non_camel_case_types)] 6 | #[allow(non_snake_case)] 7 | #[allow(non_upper_case_globals)] 8 | #[allow(clippy::missing_safety_doc)] 9 | pub mod bootparam { 10 | include!(concat!(env!("OUT_DIR"), "/bootparam.rs")); 11 | } 12 | 13 | pub mod constants; 14 | pub mod kvm; 15 | pub mod linux_loader; 16 | pub mod util; 17 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "vmm" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | kvm-bindings = { version = "0.6.0", features = ["fam-wrappers"] } 10 | nix = { version = "0.27.1", features = ["fs", "mman", "ioctl"] } 11 | 12 | [build-dependencies] 13 | bindgen = "0.69.2" 14 | -------------------------------------------------------------------------------- /contrib/init.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | int main(void) { 10 | char msg[4096] = "Hello from userspace!"; 11 | size_t idx = 0; 12 | 13 | if (mount("dev", "/dev", "devtmpfs", 0, NULL) == -1) { 14 | return EXIT_FAILURE; 15 | } 16 | 17 | int kmsg = open("/dev/kmsg", O_WRONLY | O_APPEND); 18 | if (kmsg == -1) { 19 | return EXIT_FAILURE; 20 | } 21 | 22 | DIR *dir = opendir("/dev"); 23 | if (!dir) { 24 | return EXIT_FAILURE; 25 | } 26 | 27 | // Write the original message once before overwriting it 28 | if (write(kmsg, msg, strlen(msg)) == -1) { 29 | return EXIT_FAILURE; 30 | } 31 | 32 | for (struct dirent *dp = NULL; (dp = readdir(dir)) != NULL;) { 33 | for (char *name = dp->d_name; *name != '\0'; name++) { 34 | msg[idx++] = *name; 35 | } 36 | 37 | msg[idx++] = ' '; 38 | } 39 | 40 | msg[idx++] = '\0'; 41 | 42 | if (write(kmsg, msg, idx) == -1) { 43 | return EXIT_FAILURE; 44 | } 45 | 46 | closedir(dir); 47 | close(kmsg); 48 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vmm 2 | 3 | Tiny VMM that boots Linux 4 | 5 | ## Usage 6 | 7 | A sample kernel config and init is present in the `contrib` directory. An initramfs can be created like so: 8 | 9 | ```sh 10 | $ cc contrib/init.c -o init -static 11 | # cpio takes the file list from stdin 12 | $ echo init | cpio -o -H newc > initramfs 13 | ``` 14 | 15 | **NOTE:** By default, the code prints out every byte received on the serial ports, which can be suppressed by redirecting stderr to `/dev/null` 16 | 17 | `cargo run ` 18 | 19 | ## Resources 20 | 21 | - https://lwn.net/Articles/658511 22 | 23 | - https://github.com/firecracker-microvm/firecracker 24 | 25 | - https://crosvm.dev/book 26 | 27 | - https://katacontainers.io 28 | 29 | - https://david942j.blogspot.com/2018/10/note-learning-kvm-implement-your-own.html 30 | 31 | - https://github.com/dpw/kvm-hello-world 32 | 33 | - https://mergeboard.com/blog/2-qemu-microvm-docker 34 | 35 | - https://github.com/naoki9911/zig-vmm 36 | 37 | - https://github.com/bobuhiro11/gokvm 38 | 39 | - https://github.com/b0bleet/zvisor 40 | 41 | - https://zserge.com/posts/kvm 42 | 43 | - https://github.com/sysprog21/kvm-host 44 | 45 | - https://github.com/18AX/blackhv 46 | 47 | - https://gist.github.com/zserge/ae9098a75b2b83a1299d19b79b5fe488 48 | -------------------------------------------------------------------------------- /src/constants.rs: -------------------------------------------------------------------------------- 1 | /// Page Table Addresses 2 | #[allow(non_snake_case)] 3 | pub mod PageTables { 4 | /// Page Map Level 4 Table 5 | pub const PML4: usize = 0x1000; 6 | /// Page Directory Pointer Table 7 | pub const PDPT: usize = 0x2000; 8 | /// Page Directory 9 | pub const PD: usize = 0x3000; 10 | } 11 | 12 | /// Paging 13 | #[allow(non_snake_case)] 14 | pub mod PageFlags { 15 | /// The page is present in physical memory 16 | pub const PRESENT: u64 = 1 << 0; 17 | /// The page is read/write 18 | pub const READ_WRITE: u64 = 1 << 1; 19 | /// Make PDE map to a 4MiB page, Page Size Extension must be enabled 20 | pub const PAGE_SIZE: u64 = 1 << 7; 21 | } 22 | 23 | /// Control Register 0 24 | #[allow(non_snake_case)] 25 | pub mod Cr0Flags { 26 | /// Enable protected mode 27 | pub const PE: u64 = 1 << 0; 28 | /// Enable paging 29 | pub const PG: u64 = 1 << 31; 30 | } 31 | 32 | /// Control Register 4 33 | #[allow(non_snake_case)] 34 | pub mod Cr4Flags { 35 | /// Page Size Extension 36 | pub const PSE: u64 = 1 << 4; 37 | /// Physical Address Extension, size of large pages is reduced from 38 | /// 4MiB to 2MiB and PSE is enabled regardless of the PSE bit 39 | pub const PAE: u64 = 1 << 5; 40 | } 41 | 42 | /// Extended Feature Enable Register 43 | #[allow(non_snake_case)] 44 | pub mod EferFlags { 45 | /// Long Mode Enable 46 | pub const LME: u64 = 1 << 8; 47 | /// Long Mode Active 48 | pub const LMA: u64 = 1 << 10; 49 | } 50 | 51 | /// Code/Data Segment flags 52 | /// Read permission & Data Segment is implied 53 | /// Code Segment is implicitly executable 54 | #[allow(non_snake_case)] 55 | pub mod SegmentFlags { 56 | /// Read permissions for Code Segment 57 | pub const CODE_READ: u8 = 1 << 1; 58 | /// Indicate that this is a Code Segment 59 | pub const CODE_SEGMENT: u8 = 1 << 3; 60 | /// Write permissions for Data Segment 61 | pub const DATA_WRITE: u8 = 1 << 1; 62 | } 63 | -------------------------------------------------------------------------------- /src/util.rs: -------------------------------------------------------------------------------- 1 | use crate::{ 2 | constants::{Cr0Flags, Cr4Flags, EferFlags, PageFlags, PageTables}, 3 | linux_loader::{CODE_SEGMENT, DATA_SEGMENT}, 4 | }; 5 | use kvm_bindings::{kvm_dtable, kvm_regs, kvm_segment, kvm_sregs}; 6 | use std::{ 7 | mem, 8 | mem::ManuallyDrop, 9 | ops::{Deref, DerefMut}, 10 | }; 11 | 12 | /// Wrap a value, executing the `cleanup` callback when it's dropped 13 | pub struct WrappedAutoFree { 14 | val: ManuallyDrop, 15 | cleanup: ManuallyDrop, 16 | } 17 | 18 | impl WrappedAutoFree { 19 | pub fn new(val: T, cleanup: F) -> Self { 20 | Self { 21 | val: ManuallyDrop::new(val), 22 | cleanup: ManuallyDrop::new(cleanup), 23 | } 24 | } 25 | } 26 | 27 | impl Deref for WrappedAutoFree { 28 | type Target = T; 29 | 30 | fn deref(&self) -> &T { 31 | &self.val 32 | } 33 | } 34 | 35 | impl DerefMut for WrappedAutoFree { 36 | fn deref_mut(&mut self) -> &mut T { 37 | &mut self.val 38 | } 39 | } 40 | 41 | impl Drop for WrappedAutoFree { 42 | fn drop(&mut self) { 43 | let (cleanup, val) = unsafe { 44 | ( 45 | (ManuallyDrop::<_>::take(&mut self.cleanup)), 46 | (ManuallyDrop::<_>::take(&mut self.val)), 47 | ) 48 | }; 49 | 50 | (cleanup)(val); 51 | } 52 | } 53 | 54 | /// Packs a `kvm_segment` into a 64-bit value 55 | pub fn pack_segment(segment: &kvm_segment) -> u64 { 56 | // We don't need to set a base address 57 | assert_eq!(segment.base, 0); 58 | 59 | // Bits 8 (Segment Type) .. 15 (P) 60 | let lo_flags = 61 | // 8 .. 11 (Segment Type) 62 | segment.type_ 63 | // 12 (S, Descriptor Type) 64 | // It is set to indicate a code/data segment 65 | | (segment.s << 4) 66 | // 13 .. 14 (Descriptor Privilege Level) 67 | // Leave it as zeroes for ring 0 68 | | (segment.dpl << 5) 69 | // 15 (P, Segment-Present) 70 | // The segment is present (duh) 71 | | (segment.present << 7); 72 | 73 | // Bits 20 (AVL) .. 23 (G) 74 | let hi_flags = 75 | // 20 (AVL) 76 | // Available for use by system software, undesirable in our case 77 | segment.avl 78 | // 21 (L) 79 | // Code segment is executed in 64-bit mode 80 | // For DS, L bit must not be set 81 | | (segment.l << 1) 82 | // 22 (D/B) 83 | // Indicates 32-bit, must only be set for DS 84 | // For CS, if the L-bit is set, then the D-bit must be cleared 85 | | (segment.db << 2) 86 | // 23 (G, Granularity) 87 | // Scales the limit to 4-KByte units, so we can set the limit to 4GB 88 | // while just occupying 20 bits overall 89 | // (0xFFFFF * (1024 * 4)) == ((1 << 20) << 12) == (1 << 32) == 4GB 90 | | (segment.g << 3); 91 | 92 | let packed = 93 | // 0 .. 8 (Base Addr, zero) 94 | // 8 .. 15 95 | ((lo_flags as u64) << 8) 96 | // 16 .. 19 (Top 4 bits of limit) 97 | // Can also be written as `segment.limit & 0xF0000` 98 | | ((segment.limit as u64 & 0xF) << 16) 99 | // 20 .. 23 100 | | ((hi_flags as u64) << 20); 101 | 102 | // 24 .. 31, 32 .. 46 (Base Addr, zero) 103 | // 47 .. 64 (Bottom 16 bits of limit) 104 | (packed << 32) | (segment.limit as u64 >> 16) 105 | } 106 | 107 | /// Sets up the GDT according to the boot protocol 108 | pub fn setup_gdt(memory: &mut [u64]) { 109 | // CS (0x10) 110 | memory[2] = pack_segment(&CODE_SEGMENT); 111 | // DS (0x18) 112 | memory[3] = pack_segment(&DATA_SEGMENT); 113 | } 114 | 115 | /// Sets up paging with identity mapping 116 | pub fn setup_paging(memory: &mut [u64]) { 117 | let entry_size = mem::size_of::(); 118 | 119 | memory[PageTables::PML4 / entry_size] = 120 | PageFlags::PRESENT | PageFlags::READ_WRITE | PageTables::PDPT as u64; 121 | memory[PageTables::PDPT / entry_size] = 122 | PageFlags::PRESENT | PageFlags::READ_WRITE | PageTables::PD as u64; 123 | 124 | let pd = &mut memory[(PageTables::PD / entry_size)..][..512]; 125 | 126 | // Identity Mapping 127 | for (n, entry) in pd.iter_mut().enumerate() { 128 | *entry = 129 | PageFlags::PRESENT | PageFlags::READ_WRITE | PageFlags::PAGE_SIZE | ((n as u64) << 21); 130 | } 131 | } 132 | 133 | /// Setup the KVM segment registers in accordance with our paging & GDT setup 134 | pub fn setup_sregs() -> kvm_sregs { 135 | kvm_sregs { 136 | // https://wiki.osdev.org/Setting_Up_Long_Mode 137 | cr3: PageTables::PML4 as u64, 138 | cr4: Cr4Flags::PAE, 139 | cr0: Cr0Flags::PE | Cr0Flags::PG, 140 | efer: EferFlags::LMA | EferFlags::LME, 141 | // `limit` is not required 142 | // The GDT starts at address 0 143 | // CS is at 16 (0x10), DS is at 24 (0x18) 144 | gdt: kvm_dtable { 145 | base: 0, 146 | ..Default::default() 147 | }, 148 | cs: CODE_SEGMENT, 149 | ds: DATA_SEGMENT, 150 | es: DATA_SEGMENT, 151 | fs: DATA_SEGMENT, 152 | gs: DATA_SEGMENT, 153 | ss: DATA_SEGMENT, 154 | ..Default::default() 155 | } 156 | } 157 | 158 | /// Setup the KVM CPU registers in accordance with the Linux boot protocol 159 | pub fn setup_regs(code64_start: u64, boot_params_addr: u64) -> kvm_regs { 160 | kvm_regs { 161 | // Just set the reserved bit, leave all other bits off 162 | // This turns off interrupts as well 163 | rflags: 1 << 1, 164 | // The instruction pointer should point to the start of the 64-bit kernel code 165 | rip: code64_start, 166 | // The `rsi` register must contain the address of the `boot_params` struct 167 | rsi: boot_params_addr, 168 | ..Default::default() 169 | } 170 | } 171 | -------------------------------------------------------------------------------- /src/linux_loader.rs: -------------------------------------------------------------------------------- 1 | use crate::{ 2 | bootparam::{boot_e820_entry, boot_params, CAN_USE_HEAP, LOADED_HIGH}, 3 | constants::SegmentFlags, 4 | }; 5 | use kvm_bindings::kvm_segment; 6 | use std::{mem, ptr}; 7 | 8 | pub struct BzImage<'a> { 9 | bz_image: &'a [u8], 10 | boot_params: boot_params, 11 | } 12 | 13 | #[derive(Debug)] 14 | pub enum LoaderError { 15 | /// Image is not large enough relative to what it's metadata claims 16 | ImageTooSmall, 17 | /// Corrupt image, mismatched magic bytes / other metadata 18 | InvalidImage, 19 | /// Too many E820 entries 20 | TooManyEntries, 21 | } 22 | 23 | /// CS, placed at 0x10 24 | /// See `pack_segment` for more details 25 | pub const CODE_SEGMENT: kvm_segment = kvm_segment { 26 | base: 0, 27 | limit: 0xFFFFFFFF, 28 | selector: 0x10, 29 | type_: SegmentFlags::CODE_SEGMENT | SegmentFlags::CODE_READ, 30 | present: 1, 31 | dpl: 0, 32 | db: 0, 33 | s: 1, 34 | l: 1, 35 | g: 1, 36 | avl: 0, 37 | unusable: 0, 38 | padding: 0, 39 | }; 40 | 41 | /// DS, placed at 0x18 42 | /// See `pack_segment` for more details 43 | pub const DATA_SEGMENT: kvm_segment = kvm_segment { 44 | base: 0, 45 | limit: 0xFFFFFFFF, 46 | selector: 0x18, 47 | type_: SegmentFlags::DATA_WRITE, 48 | present: 1, 49 | dpl: 0, 50 | db: 1, 51 | s: 1, 52 | l: 0, 53 | g: 1, 54 | avl: 0, 55 | unusable: 0, 56 | padding: 0, 57 | }; 58 | 59 | /// Start offset of the 32-bit (non-real-mode) kernel 60 | fn kernel_byte_offset(boot_params: &boot_params) -> usize { 61 | (match boot_params.hdr.setup_sects as usize { 62 | 0 => 4, 63 | sects => sects, 64 | } + 1) 65 | * 512 66 | } 67 | 68 | impl<'a> BzImage<'a> { 69 | pub fn new( 70 | bz_image: &'a [u8], 71 | cmdline_addr: u32, 72 | initramfs_addr: Option, 73 | initramfs_size: Option, 74 | e820_entries: &[boot_e820_entry], 75 | ) -> Result, LoaderError> { 76 | // The setup_header is located at offset 0x1f1 (`hdr` field) from the start 77 | // of `boot_params` (which is also the start of the kernel image) 78 | let mut boot_params = boot_params::default(); 79 | 80 | // Ref: 1.3. Details of Header Fields 81 | // We just need to modify a few fields here to tell the kernel about 82 | // the environment we're setting up. Rest of the information is already 83 | // filled in the struct (embedded in the bz_image) 84 | 85 | if bz_image.len() < mem::size_of_val(&boot_params) { 86 | return Err(LoaderError::ImageTooSmall); 87 | } 88 | 89 | unsafe { 90 | ptr::copy_nonoverlapping(bz_image.as_ptr().cast(), &mut boot_params, 1); 91 | } 92 | 93 | // `boot_flag` and `header` are magic values documented in the boot protocol 94 | // > Then, the setup header at offset 0x01f1 of kernel image on should be 95 | // > loaded into struct boot_params and examined. The end of setup header 96 | // > can be calculated as follows: 0x0202 + byte value at offset 0x0201 97 | // 0x0201 refers to the 16 bit `jump` field of the `setup_header` struct 98 | // Contains an x86 jump instruction, 0xEB followed by a signed offset relative to byte 0x202 99 | // So we just read a byte out of it, i.e. the offset from the header (0x0202) 100 | // It should always be 106 unless a field after `kernel_info_offset` is added 101 | if boot_params.hdr.boot_flag != 0xAA55 102 | || boot_params.hdr.header != 0x53726448 103 | || (boot_params.hdr.jump >> 8) != 106 104 | { 105 | return Err(LoaderError::InvalidImage); 106 | } 107 | 108 | if bz_image.len() < kernel_byte_offset(&boot_params) { 109 | return Err(LoaderError::ImageTooSmall); 110 | } 111 | 112 | // VGA display 113 | boot_params.hdr.vid_mode = 0xFFFF; 114 | 115 | // "Undefined" Bootloader ID 116 | boot_params.hdr.type_of_loader = 0xFF; 117 | 118 | // LOADED_HIGH: the protected-mode code is loaded at 0x100000 119 | // CAN_USE_HEAP: Self explanatory 120 | boot_params.hdr.loadflags |= (LOADED_HIGH | CAN_USE_HEAP) as u8; 121 | 122 | boot_params.hdr.ramdisk_image = initramfs_addr.unwrap_or(0); 123 | boot_params.hdr.ramdisk_size = initramfs_size.unwrap_or(0); 124 | 125 | // https://www.kernel.org/doc/html/latest/arch/x86/boot.html#sample-boot-configuration 126 | // 0xe000 - 0x200 127 | boot_params.hdr.heap_end_ptr = 0xde00; 128 | // The command line parameters can be located anywhere in 64-bit mode 129 | // Must be NUL terminated 130 | boot_params.hdr.cmd_line_ptr = cmdline_addr; 131 | boot_params.ext_cmd_line_ptr = 0; 132 | 133 | boot_params.e820_entries = e820_entries 134 | .len() 135 | .try_into() 136 | .map_err(|_| LoaderError::TooManyEntries)?; 137 | boot_params.e820_table[..e820_entries.len()].copy_from_slice(e820_entries); 138 | 139 | Ok(Self { 140 | bz_image, 141 | boot_params, 142 | }) 143 | } 144 | 145 | /// Get the boot parameters 146 | pub fn boot_params(&self) -> boot_params { 147 | self.boot_params 148 | } 149 | 150 | /// Get a slice to the image, pointing to the 32-bit startup code 151 | pub fn kernel32_slice(&self) -> &'a [u8] { 152 | &self.bz_image[kernel_byte_offset(&self.boot_params)..] 153 | } 154 | } 155 | 156 | #[cfg(test)] 157 | mod tests { 158 | use crate::{ 159 | linux_loader::{CODE_SEGMENT, DATA_SEGMENT}, 160 | util::pack_segment, 161 | }; 162 | 163 | #[test] 164 | fn pack_cs() { 165 | assert_eq!( 166 | pack_segment(&CODE_SEGMENT), 167 | 0b10101111100110100000000000000000000000001111111111111111 168 | ); 169 | } 170 | 171 | #[test] 172 | fn pack_ds() { 173 | assert_eq!( 174 | pack_segment(&DATA_SEGMENT), 175 | 0b11001111100100100000000000000000000000001111111111111111 176 | ); 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use kvm_bindings::{KVM_EXIT_DEBUG, KVM_EXIT_HLT, KVM_EXIT_IO}; 2 | use nix::sys::{mman, mman::MapFlags, mman::ProtFlags}; 3 | use std::{env, fs::File, io::Read, num::NonZeroUsize, os::fd::BorrowedFd, slice}; 4 | use vmm::{ 5 | bootparam::boot_e820_entry, kvm::Kvm, linux_loader::BzImage, util, util::WrappedAutoFree, 6 | }; 7 | 8 | const MAPPING_SIZE: usize = 1 << 30; 9 | 10 | const CMDLINE: &[u8] = b"console=ttyS0 earlyprintk=ttyS0 rdinit=/init\0"; 11 | 12 | const ADDR_BOOT_PARAMS: usize = 0x10000; 13 | const ADDR_CMDLINE: usize = 0x20000; 14 | const ADDR_KERNEL32: usize = 0x100000; 15 | const ADDR_INITRAMFS: usize = 0xf000000; 16 | 17 | fn main() -> Result<(), Box> { 18 | let kvm = Kvm::new()?; 19 | let mut bz_image = Vec::new(); 20 | 21 | File::open(env::args().nth(1).expect("no bzImage passed!")) 22 | .expect("failed to open bzImage!") 23 | .read_to_end(&mut bz_image) 24 | .expect("failed to read!"); 25 | 26 | let mut initramfs = Vec::new(); 27 | 28 | File::open(env::args().nth(2).expect("no initramfs passed!")) 29 | .expect("failed to open initramfs") 30 | .read_to_end(&mut initramfs) 31 | .expect("failed to read!"); 32 | 33 | let loader = BzImage::new( 34 | &bz_image, 35 | ADDR_CMDLINE.try_into().expect("cmdline address too large!"), 36 | Some( 37 | ADDR_INITRAMFS 38 | .try_into() 39 | .expect("initramfs address too large!"), 40 | ), 41 | Some(initramfs.len().try_into().expect("initramfs too big")), 42 | &[ 43 | // Memory before the EBDA entry 44 | boot_e820_entry { 45 | addr: 0, 46 | size: 0x9fc00, 47 | // E820_RAM 48 | type_: 1, 49 | }, 50 | // Reserved EBDA entry 51 | boot_e820_entry { 52 | addr: 0x9fc00, 53 | size: 1 << 10, 54 | // E820_RESERVED, 55 | type_: 2, 56 | }, 57 | // Memory after the beginning of the kernel image 58 | boot_e820_entry { 59 | addr: 0x100000, 60 | size: MAPPING_SIZE as u64 - 0x100000, 61 | type_: 1, 62 | }, 63 | ], 64 | ) 65 | .expect("failed to construct loader!"); 66 | 67 | // Create a mapping for the "user" memory region where we'll copy the 68 | // startup code into 69 | let wrapped_mapping = WrappedAutoFree::new( 70 | unsafe { 71 | mman::mmap( 72 | None, 73 | NonZeroUsize::new(MAPPING_SIZE).expect("unreachable, passed > 0"), 74 | ProtFlags::PROT_READ | ProtFlags::PROT_WRITE, 75 | MapFlags::MAP_ANONYMOUS | MapFlags::MAP_SHARED, 76 | None::, 77 | 0, 78 | )? 79 | }, 80 | |map| unsafe { 81 | mman::munmap(map, MAPPING_SIZE).expect("failed to unmap user memory region!"); 82 | }, 83 | ); 84 | 85 | let mapped_slice = unsafe { slice::from_raw_parts_mut(*wrapped_mapping as _, MAPPING_SIZE) }; 86 | 87 | unsafe { 88 | std::ptr::copy_nonoverlapping( 89 | &loader.boot_params(), 90 | wrapped_mapping.add(ADDR_BOOT_PARAMS) as *mut _, 91 | 1, 92 | ); 93 | let kernel32 = loader.kernel32_slice(); 94 | std::ptr::copy_nonoverlapping( 95 | kernel32.as_ptr(), 96 | wrapped_mapping.add(ADDR_KERNEL32) as *mut _, 97 | kernel32.len(), 98 | ); 99 | std::ptr::copy_nonoverlapping( 100 | CMDLINE.as_ptr(), 101 | wrapped_mapping.add(ADDR_CMDLINE) as *mut _, 102 | CMDLINE.len(), 103 | ); 104 | std::ptr::copy_nonoverlapping( 105 | initramfs.as_ptr(), 106 | wrapped_mapping.add(ADDR_INITRAMFS) as *mut _, 107 | initramfs.len(), 108 | ); 109 | } 110 | 111 | util::setup_gdt(mapped_slice); 112 | util::setup_paging(mapped_slice); 113 | 114 | kvm.set_user_memory_region(0x0, MAPPING_SIZE as u64, *wrapped_mapping as u64)?; 115 | kvm.set_vcpu_regs(&util::setup_regs( 116 | // 64-bit code is located 512 bytes ahead of the 32-bit code 117 | ADDR_KERNEL32 as u64 + 0x200, 118 | // boot params are stored in rsi 119 | ADDR_BOOT_PARAMS as u64, 120 | ))?; 121 | kvm.set_vcpu_sregs(&util::setup_sregs())?; 122 | kvm.set_tss_addr(0xFFFFD000)?; 123 | kvm.setup_cpuid()?; 124 | 125 | let mut buffer = String::new(); 126 | 127 | loop { 128 | let kvm_run = kvm.run()?; 129 | 130 | unsafe { 131 | match (*kvm_run).exit_reason { 132 | KVM_EXIT_HLT => { 133 | eprintln!("KVM_EXIT_HLT"); 134 | break; 135 | } 136 | KVM_EXIT_DEBUG => { 137 | eprintln!( 138 | "{:#?}\n{:#?}", 139 | kvm.get_vcpu_regs(), 140 | (*kvm_run).__bindgen_anon_1.debug 141 | ); 142 | } 143 | // TODO abstract out this struct so we don't have to write hacky 144 | // C-style code here 145 | KVM_EXIT_IO => { 146 | let port = (*kvm_run).__bindgen_anon_1.io.port; 147 | let byte = *((kvm_run as u64 + (*kvm_run).__bindgen_anon_1.io.data_offset) 148 | as *const u8); 149 | 150 | if port == 0x3f8 { 151 | match byte { 152 | b'\r' | b'\n' => { 153 | println!("{buffer}"); 154 | buffer.clear(); 155 | } 156 | c => { 157 | buffer.push(c as char); 158 | } 159 | } 160 | } 161 | 162 | eprintln!("IO for port {port}: {byte:#X}"); 163 | 164 | // `in` instruction, tell it that we're ready to receive data (XMTRDY) 165 | // arch/x86/boot/tty.c 166 | if (*kvm_run).__bindgen_anon_1.io.direction == 0 { 167 | *((kvm_run as *mut u8) 168 | .add((*kvm_run).__bindgen_anon_1.io.data_offset as usize)) = 0x20; 169 | } 170 | } 171 | reason => { 172 | eprintln!("Unhandled exit reason: {reason}"); 173 | break; 174 | } 175 | } 176 | } 177 | } 178 | 179 | Ok(()) 180 | } 181 | -------------------------------------------------------------------------------- /src/kvm.rs: -------------------------------------------------------------------------------- 1 | use crate::util::WrappedAutoFree; 2 | use core::num::NonZeroUsize; 3 | use kvm_bindings::{ 4 | kvm_cpuid2, kvm_enable_cap, kvm_guest_debug, kvm_pit_config, kvm_regs, kvm_run as kvm_run_t, 5 | kvm_sregs, kvm_userspace_memory_region, kvm_vcpu_events, CpuId, KVMIO, KVM_GUESTDBG_ENABLE, 6 | KVM_GUESTDBG_SINGLESTEP, 7 | }; 8 | use nix::{ 9 | errno::Errno, 10 | fcntl, 11 | fcntl::OFlag, 12 | libc, 13 | sys::{mman, mman::MapFlags, mman::ProtFlags, stat::Mode}, 14 | }; 15 | use std::{ 16 | ffi::c_int, 17 | os::fd::{AsRawFd, FromRawFd, OwnedFd}, 18 | }; 19 | 20 | ioctl_write_int_bad!(kvm_create_vm, request_code_none!(KVMIO, 0x01)); 21 | ioctl_write_int_bad!(kvm_get_vcpu_mmap_size, request_code_none!(KVMIO, 0x04)); 22 | ioctl_write_int_bad!(kvm_run, request_code_none!(KVMIO, 0x80)); 23 | ioctl_write_int_bad!(kvm_create_vcpu, request_code_none!(KVMIO, 0x41)); 24 | ioctl_write_ptr!( 25 | kvm_set_user_memory_region, 26 | KVMIO, 27 | 0x46, 28 | kvm_userspace_memory_region 29 | ); 30 | ioctl_read!(kvm_get_regs, KVMIO, 0x81, kvm_regs); 31 | ioctl_write_ptr!(kvm_set_regs, KVMIO, 0x82, kvm_regs); 32 | ioctl_read!(kvm_get_sregs, KVMIO, 0x83, kvm_sregs); 33 | ioctl_write_ptr!(kvm_set_sregs, KVMIO, 0x84, kvm_sregs); 34 | ioctl_none!(kvm_create_irqchip, KVMIO, 0x60); 35 | ioctl_write_ptr!(kvm_create_pit2, KVMIO, 0x77, kvm_pit_config); 36 | ioctl_write_ptr!(kvm_set_guest_debug, KVMIO, 0x9b, kvm_guest_debug); 37 | ioctl_write_ptr!(kvm_enable_capability, KVMIO, 0xa3, kvm_enable_cap); 38 | ioctl_read!(kvm_get_vcpu_events, KVMIO, 0x9f, kvm_vcpu_events); 39 | ioctl_readwrite!(kvm_get_supported_cpuid, KVMIO, 0x05, kvm_cpuid2); 40 | ioctl_write_ptr!(kvm_set_cpuid2, KVMIO, 0x90, kvm_cpuid2); 41 | /* 42 | Blocked on https://github.com/nix-rust/nix/pull/2233 43 | ioctl_write_int_bad!(kvm_set_tss_addr, request_code_none!(KVMIO, 0x47)); 44 | */ 45 | 46 | ioctl_write_ptr!(kvm_set_identity_map_addr, KVMIO, 0x48, u64); 47 | 48 | unsafe fn kvm_set_tss_addr(fd: c_int, data: u64) -> nix::Result { 49 | Errno::result(libc::ioctl(fd, request_code_none!(KVMIO, 0x47), data)) 50 | } 51 | 52 | pub struct Kvm { 53 | kvm: OwnedFd, 54 | vm: OwnedFd, 55 | vcpu: OwnedFd, 56 | kvm_run: WrappedAutoFree<*mut kvm_run_t, Box>, 57 | } 58 | 59 | impl Kvm { 60 | pub fn new() -> Result { 61 | let kvm = 62 | unsafe { OwnedFd::from_raw_fd(fcntl::open("/dev/kvm", OFlag::O_RDWR, Mode::empty())?) }; 63 | let vm = unsafe { OwnedFd::from_raw_fd(kvm_create_vm(kvm.as_raw_fd(), 0)?) }; 64 | 65 | // TODO refactor this, it should be done outside `new` 66 | unsafe { 67 | kvm_create_irqchip(vm.as_raw_fd())?; 68 | kvm_create_pit2(vm.as_raw_fd(), &kvm_pit_config::default())?; 69 | 70 | let idmap_addr = 0xFFFFC000; 71 | kvm_set_identity_map_addr(vm.as_raw_fd(), &idmap_addr)?; 72 | }; 73 | 74 | let vcpu = unsafe { OwnedFd::from_raw_fd(kvm_create_vcpu(vm.as_raw_fd(), 0)?) }; 75 | 76 | let mmap_size = NonZeroUsize::new(unsafe { 77 | kvm_get_vcpu_mmap_size(kvm.as_raw_fd(), 0)? 78 | .try_into() 79 | .expect("KVM provided mmap_size doesn't fit usize!") 80 | }) 81 | .expect("KVM provided zero usize!"); 82 | 83 | let kvm_run = WrappedAutoFree::new( 84 | unsafe { 85 | mman::mmap( 86 | None, 87 | mmap_size, 88 | ProtFlags::PROT_READ | ProtFlags::PROT_WRITE, 89 | MapFlags::MAP_SHARED, 90 | Some(&vcpu), 91 | 0, 92 | )? as *mut kvm_run_t 93 | }, 94 | Box::new(move |map: *mut kvm_run_t| unsafe { 95 | mman::munmap(map as _, mmap_size.get()).expect("failed to unmap kvm_run!"); 96 | }) as _, 97 | ); 98 | 99 | Ok(Self { 100 | kvm, 101 | vm, 102 | vcpu, 103 | kvm_run, 104 | }) 105 | } 106 | 107 | pub fn set_user_memory_region( 108 | &self, 109 | guest_phys_addr: u64, 110 | memory_size: u64, 111 | userspace_addr: u64, 112 | ) -> Result<(), std::io::Error> { 113 | unsafe { 114 | kvm_set_user_memory_region( 115 | self.vm.as_raw_fd(), 116 | &kvm_userspace_memory_region { 117 | slot: 0, 118 | flags: 0, 119 | guest_phys_addr, 120 | memory_size, 121 | userspace_addr, 122 | }, 123 | )?; 124 | } 125 | 126 | Ok(()) 127 | } 128 | 129 | pub fn get_vcpu_sregs(&self) -> Result { 130 | let mut sregs = kvm_sregs::default(); 131 | unsafe { kvm_get_sregs(self.vcpu.as_raw_fd(), &mut sregs)? }; 132 | 133 | Ok(sregs) 134 | } 135 | 136 | pub fn set_vcpu_sregs(&self, sregs: *const kvm_sregs) -> Result<(), std::io::Error> { 137 | unsafe { kvm_set_sregs(self.vcpu.as_raw_fd(), sregs)? }; 138 | 139 | Ok(()) 140 | } 141 | 142 | pub fn get_vcpu_regs(&self) -> Result { 143 | let mut regs = kvm_regs::default(); 144 | unsafe { kvm_get_regs(self.vcpu.as_raw_fd(), &mut regs)? }; 145 | 146 | Ok(regs) 147 | } 148 | 149 | pub fn set_vcpu_regs(&self, regs: *const kvm_regs) -> Result<(), std::io::Error> { 150 | unsafe { kvm_set_regs(self.vcpu.as_raw_fd(), regs)? }; 151 | 152 | Ok(()) 153 | } 154 | 155 | pub fn set_tss_addr(&self, addr: u64) -> Result<(), std::io::Error> { 156 | unsafe { kvm_set_tss_addr(self.vm.as_raw_fd(), addr)? }; 157 | 158 | Ok(()) 159 | } 160 | 161 | pub fn enable_debug(&mut self) -> Result<(), std::io::Error> { 162 | let mut dbg = kvm_guest_debug { 163 | control: KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP, 164 | ..Default::default() 165 | }; 166 | 167 | dbg.arch.debugreg[7] = 0x00000400; 168 | 169 | unsafe { 170 | kvm_set_guest_debug(self.vcpu.as_raw_fd(), &dbg)?; 171 | } 172 | 173 | unsafe { 174 | kvm_enable_capability( 175 | self.vm.as_raw_fd(), 176 | &kvm_enable_cap { 177 | // KVM_CAP_X86_TRIPLE_FAULT_EVENT 178 | cap: 218, 179 | ..Default::default() 180 | }, 181 | )?; 182 | 183 | (*(*self.kvm_run)).kvm_valid_regs = 7; 184 | } 185 | 186 | Ok(()) 187 | } 188 | 189 | pub fn get_vcpu_events(&self) -> Result { 190 | let mut events = kvm_vcpu_events::default(); 191 | 192 | unsafe { 193 | kvm_get_vcpu_events(self.vcpu.as_raw_fd(), &mut events)?; 194 | } 195 | 196 | Ok(events) 197 | } 198 | 199 | pub fn setup_cpuid(&self) -> Result<(), std::io::Error> { 200 | let mut cpuid2 = CpuId::new(80).expect("should not fail to construct CpuId!"); 201 | 202 | unsafe { 203 | kvm_get_supported_cpuid(self.kvm.as_raw_fd(), cpuid2.as_mut_fam_struct_ptr())?; 204 | kvm_set_cpuid2(self.vcpu.as_raw_fd(), cpuid2.as_fam_struct_ptr())?; 205 | }; 206 | 207 | Ok(()) 208 | } 209 | 210 | pub fn run(&self) -> Result<*const kvm_run_t, std::io::Error> { 211 | unsafe { 212 | kvm_run(self.vcpu.as_raw_fd(), 0)?; 213 | } 214 | 215 | // The `kvm_run` struct is filled with new data as it was associated 216 | // with the `vcpu` FD in the mmap() call 217 | Ok(*self.kvm_run as *const kvm_run_t) 218 | } 219 | } 220 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "aho-corasick" 7 | version = "1.1.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" 10 | dependencies = [ 11 | "memchr", 12 | ] 13 | 14 | [[package]] 15 | name = "bindgen" 16 | version = "0.69.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "a4c69fae65a523209d34240b60abe0c42d33d1045d445c0839d8a4894a736e2d" 19 | dependencies = [ 20 | "bitflags 2.4.1", 21 | "cexpr", 22 | "clang-sys", 23 | "lazy_static", 24 | "lazycell", 25 | "log", 26 | "peeking_take_while", 27 | "prettyplease", 28 | "proc-macro2", 29 | "quote", 30 | "regex", 31 | "rustc-hash", 32 | "shlex", 33 | "syn", 34 | "which", 35 | ] 36 | 37 | [[package]] 38 | name = "bitflags" 39 | version = "1.3.2" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 42 | 43 | [[package]] 44 | name = "bitflags" 45 | version = "2.4.1" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" 48 | 49 | [[package]] 50 | name = "cexpr" 51 | version = "0.6.0" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 54 | dependencies = [ 55 | "nom", 56 | ] 57 | 58 | [[package]] 59 | name = "cfg-if" 60 | version = "1.0.0" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 63 | 64 | [[package]] 65 | name = "clang-sys" 66 | version = "1.7.0" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" 69 | dependencies = [ 70 | "glob", 71 | "libc", 72 | "libloading", 73 | ] 74 | 75 | [[package]] 76 | name = "either" 77 | version = "1.9.0" 78 | source = "registry+https://github.com/rust-lang/crates.io-index" 79 | checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" 80 | 81 | [[package]] 82 | name = "errno" 83 | version = "0.3.8" 84 | source = "registry+https://github.com/rust-lang/crates.io-index" 85 | checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" 86 | dependencies = [ 87 | "libc", 88 | "windows-sys 0.52.0", 89 | ] 90 | 91 | [[package]] 92 | name = "glob" 93 | version = "0.3.1" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" 96 | 97 | [[package]] 98 | name = "home" 99 | version = "0.5.9" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" 102 | dependencies = [ 103 | "windows-sys 0.52.0", 104 | ] 105 | 106 | [[package]] 107 | name = "kvm-bindings" 108 | version = "0.6.0" 109 | source = "registry+https://github.com/rust-lang/crates.io-index" 110 | checksum = "efe70e65a5b092161d17f5005b66e5eefe7a94a70c332e755036fc4af78c4e79" 111 | dependencies = [ 112 | "vmm-sys-util", 113 | ] 114 | 115 | [[package]] 116 | name = "lazy_static" 117 | version = "1.4.0" 118 | source = "registry+https://github.com/rust-lang/crates.io-index" 119 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 120 | 121 | [[package]] 122 | name = "lazycell" 123 | version = "1.3.0" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" 126 | 127 | [[package]] 128 | name = "libc" 129 | version = "0.2.149" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" 132 | 133 | [[package]] 134 | name = "libloading" 135 | version = "0.8.1" 136 | source = "registry+https://github.com/rust-lang/crates.io-index" 137 | checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" 138 | dependencies = [ 139 | "cfg-if", 140 | "windows-sys 0.48.0", 141 | ] 142 | 143 | [[package]] 144 | name = "linux-raw-sys" 145 | version = "0.4.13" 146 | source = "registry+https://github.com/rust-lang/crates.io-index" 147 | checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" 148 | 149 | [[package]] 150 | name = "log" 151 | version = "0.4.20" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 154 | 155 | [[package]] 156 | name = "memchr" 157 | version = "2.7.1" 158 | source = "registry+https://github.com/rust-lang/crates.io-index" 159 | checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" 160 | 161 | [[package]] 162 | name = "minimal-lexical" 163 | version = "0.2.1" 164 | source = "registry+https://github.com/rust-lang/crates.io-index" 165 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 166 | 167 | [[package]] 168 | name = "nix" 169 | version = "0.27.1" 170 | source = "registry+https://github.com/rust-lang/crates.io-index" 171 | checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" 172 | dependencies = [ 173 | "bitflags 2.4.1", 174 | "cfg-if", 175 | "libc", 176 | ] 177 | 178 | [[package]] 179 | name = "nom" 180 | version = "7.1.3" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 183 | dependencies = [ 184 | "memchr", 185 | "minimal-lexical", 186 | ] 187 | 188 | [[package]] 189 | name = "once_cell" 190 | version = "1.19.0" 191 | source = "registry+https://github.com/rust-lang/crates.io-index" 192 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 193 | 194 | [[package]] 195 | name = "peeking_take_while" 196 | version = "0.1.2" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" 199 | 200 | [[package]] 201 | name = "prettyplease" 202 | version = "0.2.16" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" 205 | dependencies = [ 206 | "proc-macro2", 207 | "syn", 208 | ] 209 | 210 | [[package]] 211 | name = "proc-macro2" 212 | version = "1.0.76" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" 215 | dependencies = [ 216 | "unicode-ident", 217 | ] 218 | 219 | [[package]] 220 | name = "quote" 221 | version = "1.0.35" 222 | source = "registry+https://github.com/rust-lang/crates.io-index" 223 | checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" 224 | dependencies = [ 225 | "proc-macro2", 226 | ] 227 | 228 | [[package]] 229 | name = "regex" 230 | version = "1.10.2" 231 | source = "registry+https://github.com/rust-lang/crates.io-index" 232 | checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" 233 | dependencies = [ 234 | "aho-corasick", 235 | "memchr", 236 | "regex-automata", 237 | "regex-syntax", 238 | ] 239 | 240 | [[package]] 241 | name = "regex-automata" 242 | version = "0.4.3" 243 | source = "registry+https://github.com/rust-lang/crates.io-index" 244 | checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" 245 | dependencies = [ 246 | "aho-corasick", 247 | "memchr", 248 | "regex-syntax", 249 | ] 250 | 251 | [[package]] 252 | name = "regex-syntax" 253 | version = "0.8.2" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" 256 | 257 | [[package]] 258 | name = "rustc-hash" 259 | version = "1.1.0" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 262 | 263 | [[package]] 264 | name = "rustix" 265 | version = "0.38.21" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" 268 | dependencies = [ 269 | "bitflags 2.4.1", 270 | "errno", 271 | "libc", 272 | "linux-raw-sys", 273 | "windows-sys 0.48.0", 274 | ] 275 | 276 | [[package]] 277 | name = "shlex" 278 | version = "1.2.0" 279 | source = "registry+https://github.com/rust-lang/crates.io-index" 280 | checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" 281 | 282 | [[package]] 283 | name = "syn" 284 | version = "2.0.48" 285 | source = "registry+https://github.com/rust-lang/crates.io-index" 286 | checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" 287 | dependencies = [ 288 | "proc-macro2", 289 | "quote", 290 | "unicode-ident", 291 | ] 292 | 293 | [[package]] 294 | name = "unicode-ident" 295 | version = "1.0.12" 296 | source = "registry+https://github.com/rust-lang/crates.io-index" 297 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 298 | 299 | [[package]] 300 | name = "vmm" 301 | version = "0.1.0" 302 | dependencies = [ 303 | "bindgen", 304 | "kvm-bindings", 305 | "nix", 306 | ] 307 | 308 | [[package]] 309 | name = "vmm-sys-util" 310 | version = "0.11.2" 311 | source = "registry+https://github.com/rust-lang/crates.io-index" 312 | checksum = "48b7b084231214f7427041e4220d77dfe726897a6d41fddee450696e66ff2a29" 313 | dependencies = [ 314 | "bitflags 1.3.2", 315 | "libc", 316 | ] 317 | 318 | [[package]] 319 | name = "which" 320 | version = "4.4.2" 321 | source = "registry+https://github.com/rust-lang/crates.io-index" 322 | checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" 323 | dependencies = [ 324 | "either", 325 | "home", 326 | "once_cell", 327 | "rustix", 328 | ] 329 | 330 | [[package]] 331 | name = "windows-sys" 332 | version = "0.48.0" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 335 | dependencies = [ 336 | "windows-targets 0.48.5", 337 | ] 338 | 339 | [[package]] 340 | name = "windows-sys" 341 | version = "0.52.0" 342 | source = "registry+https://github.com/rust-lang/crates.io-index" 343 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 344 | dependencies = [ 345 | "windows-targets 0.52.0", 346 | ] 347 | 348 | [[package]] 349 | name = "windows-targets" 350 | version = "0.48.5" 351 | source = "registry+https://github.com/rust-lang/crates.io-index" 352 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 353 | dependencies = [ 354 | "windows_aarch64_gnullvm 0.48.5", 355 | "windows_aarch64_msvc 0.48.5", 356 | "windows_i686_gnu 0.48.5", 357 | "windows_i686_msvc 0.48.5", 358 | "windows_x86_64_gnu 0.48.5", 359 | "windows_x86_64_gnullvm 0.48.5", 360 | "windows_x86_64_msvc 0.48.5", 361 | ] 362 | 363 | [[package]] 364 | name = "windows-targets" 365 | version = "0.52.0" 366 | source = "registry+https://github.com/rust-lang/crates.io-index" 367 | checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" 368 | dependencies = [ 369 | "windows_aarch64_gnullvm 0.52.0", 370 | "windows_aarch64_msvc 0.52.0", 371 | "windows_i686_gnu 0.52.0", 372 | "windows_i686_msvc 0.52.0", 373 | "windows_x86_64_gnu 0.52.0", 374 | "windows_x86_64_gnullvm 0.52.0", 375 | "windows_x86_64_msvc 0.52.0", 376 | ] 377 | 378 | [[package]] 379 | name = "windows_aarch64_gnullvm" 380 | version = "0.48.5" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 383 | 384 | [[package]] 385 | name = "windows_aarch64_gnullvm" 386 | version = "0.52.0" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" 389 | 390 | [[package]] 391 | name = "windows_aarch64_msvc" 392 | version = "0.48.5" 393 | source = "registry+https://github.com/rust-lang/crates.io-index" 394 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 395 | 396 | [[package]] 397 | name = "windows_aarch64_msvc" 398 | version = "0.52.0" 399 | source = "registry+https://github.com/rust-lang/crates.io-index" 400 | checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" 401 | 402 | [[package]] 403 | name = "windows_i686_gnu" 404 | version = "0.48.5" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 407 | 408 | [[package]] 409 | name = "windows_i686_gnu" 410 | version = "0.52.0" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" 413 | 414 | [[package]] 415 | name = "windows_i686_msvc" 416 | version = "0.48.5" 417 | source = "registry+https://github.com/rust-lang/crates.io-index" 418 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 419 | 420 | [[package]] 421 | name = "windows_i686_msvc" 422 | version = "0.52.0" 423 | source = "registry+https://github.com/rust-lang/crates.io-index" 424 | checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" 425 | 426 | [[package]] 427 | name = "windows_x86_64_gnu" 428 | version = "0.48.5" 429 | source = "registry+https://github.com/rust-lang/crates.io-index" 430 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 431 | 432 | [[package]] 433 | name = "windows_x86_64_gnu" 434 | version = "0.52.0" 435 | source = "registry+https://github.com/rust-lang/crates.io-index" 436 | checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" 437 | 438 | [[package]] 439 | name = "windows_x86_64_gnullvm" 440 | version = "0.48.5" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 443 | 444 | [[package]] 445 | name = "windows_x86_64_gnullvm" 446 | version = "0.52.0" 447 | source = "registry+https://github.com/rust-lang/crates.io-index" 448 | checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" 449 | 450 | [[package]] 451 | name = "windows_x86_64_msvc" 452 | version = "0.48.5" 453 | source = "registry+https://github.com/rust-lang/crates.io-index" 454 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 455 | 456 | [[package]] 457 | name = "windows_x86_64_msvc" 458 | version = "0.52.0" 459 | source = "registry+https://github.com/rust-lang/crates.io-index" 460 | checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" 461 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 2.1, February 1999 3 | 4 | Copyright (C) 1991, 1999 Free Software Foundation, Inc. 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | [This is the first released version of the Lesser GPL. It also counts 10 | as the successor of the GNU Library Public License, version 2, hence 11 | the version number 2.1.] 12 | 13 | Preamble 14 | 15 | The licenses for most software are designed to take away your 16 | freedom to share and change it. By contrast, the GNU General Public 17 | Licenses are intended to guarantee your freedom to share and change 18 | free software--to make sure the software is free for all its users. 19 | 20 | This license, the Lesser General Public License, applies to some 21 | specially designated software packages--typically libraries--of the 22 | Free Software Foundation and other authors who decide to use it. You 23 | can use it too, but we suggest you first think carefully about whether 24 | this license or the ordinary General Public License is the better 25 | strategy to use in any particular case, based on the explanations below. 26 | 27 | When we speak of free software, we are referring to freedom of use, 28 | not price. Our General Public Licenses are designed to make sure that 29 | you have the freedom to distribute copies of free software (and charge 30 | for this service if you wish); that you receive source code or can get 31 | it if you want it; that you can change the software and use pieces of 32 | it in new free programs; and that you are informed that you can do 33 | these things. 34 | 35 | To protect your rights, we need to make restrictions that forbid 36 | distributors to deny you these rights or to ask you to surrender these 37 | rights. These restrictions translate to certain responsibilities for 38 | you if you distribute copies of the library or if you modify it. 39 | 40 | For example, if you distribute copies of the library, whether gratis 41 | or for a fee, you must give the recipients all the rights that we gave 42 | you. You must make sure that they, too, receive or can get the source 43 | code. If you link other code with the library, you must provide 44 | complete object files to the recipients, so that they can relink them 45 | with the library after making changes to the library and recompiling 46 | it. And you must show them these terms so they know their rights. 47 | 48 | We protect your rights with a two-step method: (1) we copyright the 49 | library, and (2) we offer you this license, which gives you legal 50 | permission to copy, distribute and/or modify the library. 51 | 52 | To protect each distributor, we want to make it very clear that 53 | there is no warranty for the free library. Also, if the library is 54 | modified by someone else and passed on, the recipients should know 55 | that what they have is not the original version, so that the original 56 | author's reputation will not be affected by problems that might be 57 | introduced by others. 58 | 59 | Finally, software patents pose a constant threat to the existence of 60 | any free program. We wish to make sure that a company cannot 61 | effectively restrict the users of a free program by obtaining a 62 | restrictive license from a patent holder. Therefore, we insist that 63 | any patent license obtained for a version of the library must be 64 | consistent with the full freedom of use specified in this license. 65 | 66 | Most GNU software, including some libraries, is covered by the 67 | ordinary GNU General Public License. This license, the GNU Lesser 68 | General Public License, applies to certain designated libraries, and 69 | is quite different from the ordinary General Public License. We use 70 | this license for certain libraries in order to permit linking those 71 | libraries into non-free programs. 72 | 73 | When a program is linked with a library, whether statically or using 74 | a shared library, the combination of the two is legally speaking a 75 | combined work, a derivative of the original library. The ordinary 76 | General Public License therefore permits such linking only if the 77 | entire combination fits its criteria of freedom. The Lesser General 78 | Public License permits more lax criteria for linking other code with 79 | the library. 80 | 81 | We call this license the "Lesser" General Public License because it 82 | does Less to protect the user's freedom than the ordinary General 83 | Public License. It also provides other free software developers Less 84 | of an advantage over competing non-free programs. These disadvantages 85 | are the reason we use the ordinary General Public License for many 86 | libraries. However, the Lesser license provides advantages in certain 87 | special circumstances. 88 | 89 | For example, on rare occasions, there may be a special need to 90 | encourage the widest possible use of a certain library, so that it becomes 91 | a de-facto standard. To achieve this, non-free programs must be 92 | allowed to use the library. A more frequent case is that a free 93 | library does the same job as widely used non-free libraries. In this 94 | case, there is little to gain by limiting the free library to free 95 | software only, so we use the Lesser General Public License. 96 | 97 | In other cases, permission to use a particular library in non-free 98 | programs enables a greater number of people to use a large body of 99 | free software. For example, permission to use the GNU C Library in 100 | non-free programs enables many more people to use the whole GNU 101 | operating system, as well as its variant, the GNU/Linux operating 102 | system. 103 | 104 | Although the Lesser General Public License is Less protective of the 105 | users' freedom, it does ensure that the user of a program that is 106 | linked with the Library has the freedom and the wherewithal to run 107 | that program using a modified version of the Library. 108 | 109 | The precise terms and conditions for copying, distribution and 110 | modification follow. Pay close attention to the difference between a 111 | "work based on the library" and a "work that uses the library". The 112 | former contains code derived from the library, whereas the latter must 113 | be combined with the library in order to run. 114 | 115 | GNU LESSER GENERAL PUBLIC LICENSE 116 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 117 | 118 | 0. This License Agreement applies to any software library or other 119 | program which contains a notice placed by the copyright holder or 120 | other authorized party saying it may be distributed under the terms of 121 | this Lesser General Public License (also called "this License"). 122 | Each licensee is addressed as "you". 123 | 124 | A "library" means a collection of software functions and/or data 125 | prepared so as to be conveniently linked with application programs 126 | (which use some of those functions and data) to form executables. 127 | 128 | The "Library", below, refers to any such software library or work 129 | which has been distributed under these terms. A "work based on the 130 | Library" means either the Library or any derivative work under 131 | copyright law: that is to say, a work containing the Library or a 132 | portion of it, either verbatim or with modifications and/or translated 133 | straightforwardly into another language. (Hereinafter, translation is 134 | included without limitation in the term "modification".) 135 | 136 | "Source code" for a work means the preferred form of the work for 137 | making modifications to it. For a library, complete source code means 138 | all the source code for all modules it contains, plus any associated 139 | interface definition files, plus the scripts used to control compilation 140 | and installation of the library. 141 | 142 | Activities other than copying, distribution and modification are not 143 | covered by this License; they are outside its scope. The act of 144 | running a program using the Library is not restricted, and output from 145 | such a program is covered only if its contents constitute a work based 146 | on the Library (independent of the use of the Library in a tool for 147 | writing it). Whether that is true depends on what the Library does 148 | and what the program that uses the Library does. 149 | 150 | 1. You may copy and distribute verbatim copies of the Library's 151 | complete source code as you receive it, in any medium, provided that 152 | you conspicuously and appropriately publish on each copy an 153 | appropriate copyright notice and disclaimer of warranty; keep intact 154 | all the notices that refer to this License and to the absence of any 155 | warranty; and distribute a copy of this License along with the 156 | Library. 157 | 158 | You may charge a fee for the physical act of transferring a copy, 159 | and you may at your option offer warranty protection in exchange for a 160 | fee. 161 | 162 | 2. You may modify your copy or copies of the Library or any portion 163 | of it, thus forming a work based on the Library, and copy and 164 | distribute such modifications or work under the terms of Section 1 165 | above, provided that you also meet all of these conditions: 166 | 167 | a) The modified work must itself be a software library. 168 | 169 | b) You must cause the files modified to carry prominent notices 170 | stating that you changed the files and the date of any change. 171 | 172 | c) You must cause the whole of the work to be licensed at no 173 | charge to all third parties under the terms of this License. 174 | 175 | d) If a facility in the modified Library refers to a function or a 176 | table of data to be supplied by an application program that uses 177 | the facility, other than as an argument passed when the facility 178 | is invoked, then you must make a good faith effort to ensure that, 179 | in the event an application does not supply such function or 180 | table, the facility still operates, and performs whatever part of 181 | its purpose remains meaningful. 182 | 183 | (For example, a function in a library to compute square roots has 184 | a purpose that is entirely well-defined independent of the 185 | application. Therefore, Subsection 2d requires that any 186 | application-supplied function or table used by this function must 187 | be optional: if the application does not supply it, the square 188 | root function must still compute square roots.) 189 | 190 | These requirements apply to the modified work as a whole. If 191 | identifiable sections of that work are not derived from the Library, 192 | and can be reasonably considered independent and separate works in 193 | themselves, then this License, and its terms, do not apply to those 194 | sections when you distribute them as separate works. But when you 195 | distribute the same sections as part of a whole which is a work based 196 | on the Library, the distribution of the whole must be on the terms of 197 | this License, whose permissions for other licensees extend to the 198 | entire whole, and thus to each and every part regardless of who wrote 199 | it. 200 | 201 | Thus, it is not the intent of this section to claim rights or contest 202 | your rights to work written entirely by you; rather, the intent is to 203 | exercise the right to control the distribution of derivative or 204 | collective works based on the Library. 205 | 206 | In addition, mere aggregation of another work not based on the Library 207 | with the Library (or with a work based on the Library) on a volume of 208 | a storage or distribution medium does not bring the other work under 209 | the scope of this License. 210 | 211 | 3. You may opt to apply the terms of the ordinary GNU General Public 212 | License instead of this License to a given copy of the Library. To do 213 | this, you must alter all the notices that refer to this License, so 214 | that they refer to the ordinary GNU General Public License, version 2, 215 | instead of to this License. (If a newer version than version 2 of the 216 | ordinary GNU General Public License has appeared, then you can specify 217 | that version instead if you wish.) Do not make any other change in 218 | these notices. 219 | 220 | Once this change is made in a given copy, it is irreversible for 221 | that copy, so the ordinary GNU General Public License applies to all 222 | subsequent copies and derivative works made from that copy. 223 | 224 | This option is useful when you wish to copy part of the code of 225 | the Library into a program that is not a library. 226 | 227 | 4. You may copy and distribute the Library (or a portion or 228 | derivative of it, under Section 2) in object code or executable form 229 | under the terms of Sections 1 and 2 above provided that you accompany 230 | it with the complete corresponding machine-readable source code, which 231 | must be distributed under the terms of Sections 1 and 2 above on a 232 | medium customarily used for software interchange. 233 | 234 | If distribution of object code is made by offering access to copy 235 | from a designated place, then offering equivalent access to copy the 236 | source code from the same place satisfies the requirement to 237 | distribute the source code, even though third parties are not 238 | compelled to copy the source along with the object code. 239 | 240 | 5. A program that contains no derivative of any portion of the 241 | Library, but is designed to work with the Library by being compiled or 242 | linked with it, is called a "work that uses the Library". Such a 243 | work, in isolation, is not a derivative work of the Library, and 244 | therefore falls outside the scope of this License. 245 | 246 | However, linking a "work that uses the Library" with the Library 247 | creates an executable that is a derivative of the Library (because it 248 | contains portions of the Library), rather than a "work that uses the 249 | library". The executable is therefore covered by this License. 250 | Section 6 states terms for distribution of such executables. 251 | 252 | When a "work that uses the Library" uses material from a header file 253 | that is part of the Library, the object code for the work may be a 254 | derivative work of the Library even though the source code is not. 255 | Whether this is true is especially significant if the work can be 256 | linked without the Library, or if the work is itself a library. The 257 | threshold for this to be true is not precisely defined by law. 258 | 259 | If such an object file uses only numerical parameters, data 260 | structure layouts and accessors, and small macros and small inline 261 | functions (ten lines or less in length), then the use of the object 262 | file is unrestricted, regardless of whether it is legally a derivative 263 | work. (Executables containing this object code plus portions of the 264 | Library will still fall under Section 6.) 265 | 266 | Otherwise, if the work is a derivative of the Library, you may 267 | distribute the object code for the work under the terms of Section 6. 268 | Any executables containing that work also fall under Section 6, 269 | whether or not they are linked directly with the Library itself. 270 | 271 | 6. As an exception to the Sections above, you may also combine or 272 | link a "work that uses the Library" with the Library to produce a 273 | work containing portions of the Library, and distribute that work 274 | under terms of your choice, provided that the terms permit 275 | modification of the work for the customer's own use and reverse 276 | engineering for debugging such modifications. 277 | 278 | You must give prominent notice with each copy of the work that the 279 | Library is used in it and that the Library and its use are covered by 280 | this License. You must supply a copy of this License. If the work 281 | during execution displays copyright notices, you must include the 282 | copyright notice for the Library among them, as well as a reference 283 | directing the user to the copy of this License. Also, you must do one 284 | of these things: 285 | 286 | a) Accompany the work with the complete corresponding 287 | machine-readable source code for the Library including whatever 288 | changes were used in the work (which must be distributed under 289 | Sections 1 and 2 above); and, if the work is an executable linked 290 | with the Library, with the complete machine-readable "work that 291 | uses the Library", as object code and/or source code, so that the 292 | user can modify the Library and then relink to produce a modified 293 | executable containing the modified Library. (It is understood 294 | that the user who changes the contents of definitions files in the 295 | Library will not necessarily be able to recompile the application 296 | to use the modified definitions.) 297 | 298 | b) Use a suitable shared library mechanism for linking with the 299 | Library. A suitable mechanism is one that (1) uses at run time a 300 | copy of the library already present on the user's computer system, 301 | rather than copying library functions into the executable, and (2) 302 | will operate properly with a modified version of the library, if 303 | the user installs one, as long as the modified version is 304 | interface-compatible with the version that the work was made with. 305 | 306 | c) Accompany the work with a written offer, valid for at 307 | least three years, to give the same user the materials 308 | specified in Subsection 6a, above, for a charge no more 309 | than the cost of performing this distribution. 310 | 311 | d) If distribution of the work is made by offering access to copy 312 | from a designated place, offer equivalent access to copy the above 313 | specified materials from the same place. 314 | 315 | e) Verify that the user has already received a copy of these 316 | materials or that you have already sent this user a copy. 317 | 318 | For an executable, the required form of the "work that uses the 319 | Library" must include any data and utility programs needed for 320 | reproducing the executable from it. However, as a special exception, 321 | the materials to be distributed need not include anything that is 322 | normally distributed (in either source or binary form) with the major 323 | components (compiler, kernel, and so on) of the operating system on 324 | which the executable runs, unless that component itself accompanies 325 | the executable. 326 | 327 | It may happen that this requirement contradicts the license 328 | restrictions of other proprietary libraries that do not normally 329 | accompany the operating system. Such a contradiction means you cannot 330 | use both them and the Library together in an executable that you 331 | distribute. 332 | 333 | 7. You may place library facilities that are a work based on the 334 | Library side-by-side in a single library together with other library 335 | facilities not covered by this License, and distribute such a combined 336 | library, provided that the separate distribution of the work based on 337 | the Library and of the other library facilities is otherwise 338 | permitted, and provided that you do these two things: 339 | 340 | a) Accompany the combined library with a copy of the same work 341 | based on the Library, uncombined with any other library 342 | facilities. This must be distributed under the terms of the 343 | Sections above. 344 | 345 | b) Give prominent notice with the combined library of the fact 346 | that part of it is a work based on the Library, and explaining 347 | where to find the accompanying uncombined form of the same work. 348 | 349 | 8. You may not copy, modify, sublicense, link with, or distribute 350 | the Library except as expressly provided under this License. Any 351 | attempt otherwise to copy, modify, sublicense, link with, or 352 | distribute the Library is void, and will automatically terminate your 353 | rights under this License. However, parties who have received copies, 354 | or rights, from you under this License will not have their licenses 355 | terminated so long as such parties remain in full compliance. 356 | 357 | 9. You are not required to accept this License, since you have not 358 | signed it. However, nothing else grants you permission to modify or 359 | distribute the Library or its derivative works. These actions are 360 | prohibited by law if you do not accept this License. Therefore, by 361 | modifying or distributing the Library (or any work based on the 362 | Library), you indicate your acceptance of this License to do so, and 363 | all its terms and conditions for copying, distributing or modifying 364 | the Library or works based on it. 365 | 366 | 10. Each time you redistribute the Library (or any work based on the 367 | Library), the recipient automatically receives a license from the 368 | original licensor to copy, distribute, link with or modify the Library 369 | subject to these terms and conditions. You may not impose any further 370 | restrictions on the recipients' exercise of the rights granted herein. 371 | You are not responsible for enforcing compliance by third parties with 372 | this License. 373 | 374 | 11. If, as a consequence of a court judgment or allegation of patent 375 | infringement or for any other reason (not limited to patent issues), 376 | conditions are imposed on you (whether by court order, agreement or 377 | otherwise) that contradict the conditions of this License, they do not 378 | excuse you from the conditions of this License. If you cannot 379 | distribute so as to satisfy simultaneously your obligations under this 380 | License and any other pertinent obligations, then as a consequence you 381 | may not distribute the Library at all. For example, if a patent 382 | license would not permit royalty-free redistribution of the Library by 383 | all those who receive copies directly or indirectly through you, then 384 | the only way you could satisfy both it and this License would be to 385 | refrain entirely from distribution of the Library. 386 | 387 | If any portion of this section is held invalid or unenforceable under any 388 | particular circumstance, the balance of the section is intended to apply, 389 | and the section as a whole is intended to apply in other circumstances. 390 | 391 | It is not the purpose of this section to induce you to infringe any 392 | patents or other property right claims or to contest validity of any 393 | such claims; this section has the sole purpose of protecting the 394 | integrity of the free software distribution system which is 395 | implemented by public license practices. Many people have made 396 | generous contributions to the wide range of software distributed 397 | through that system in reliance on consistent application of that 398 | system; it is up to the author/donor to decide if he or she is willing 399 | to distribute software through any other system and a licensee cannot 400 | impose that choice. 401 | 402 | This section is intended to make thoroughly clear what is believed to 403 | be a consequence of the rest of this License. 404 | 405 | 12. If the distribution and/or use of the Library is restricted in 406 | certain countries either by patents or by copyrighted interfaces, the 407 | original copyright holder who places the Library under this License may add 408 | an explicit geographical distribution limitation excluding those countries, 409 | so that distribution is permitted only in or among countries not thus 410 | excluded. In such case, this License incorporates the limitation as if 411 | written in the body of this License. 412 | 413 | 13. The Free Software Foundation may publish revised and/or new 414 | versions of the Lesser General Public License from time to time. 415 | Such new versions will be similar in spirit to the present version, 416 | but may differ in detail to address new problems or concerns. 417 | 418 | Each version is given a distinguishing version number. If the Library 419 | specifies a version number of this License which applies to it and 420 | "any later version", you have the option of following the terms and 421 | conditions either of that version or of any later version published by 422 | the Free Software Foundation. If the Library does not specify a 423 | license version number, you may choose any version ever published by 424 | the Free Software Foundation. 425 | 426 | 14. If you wish to incorporate parts of the Library into other free 427 | programs whose distribution conditions are incompatible with these, 428 | write to the author to ask for permission. For software which is 429 | copyrighted by the Free Software Foundation, write to the Free 430 | Software Foundation; we sometimes make exceptions for this. Our 431 | decision will be guided by the two goals of preserving the free status 432 | of all derivatives of our free software and of promoting the sharing 433 | and reuse of software generally. 434 | 435 | NO WARRANTY 436 | 437 | 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO 438 | WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. 439 | EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR 440 | OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY 441 | KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE 442 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 443 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE 444 | LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME 445 | THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 446 | 447 | 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN 448 | WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY 449 | AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU 450 | FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR 451 | CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE 452 | LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING 453 | RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A 454 | FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF 455 | SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 456 | DAMAGES. 457 | 458 | END OF TERMS AND CONDITIONS 459 | 460 | How to Apply These Terms to Your New Libraries 461 | 462 | If you develop a new library, and you want it to be of the greatest 463 | possible use to the public, we recommend making it free software that 464 | everyone can redistribute and change. You can do so by permitting 465 | redistribution under these terms (or, alternatively, under the terms of the 466 | ordinary General Public License). 467 | 468 | To apply these terms, attach the following notices to the library. It is 469 | safest to attach them to the start of each source file to most effectively 470 | convey the exclusion of warranty; and each file should have at least the 471 | "copyright" line and a pointer to where the full notice is found. 472 | 473 | 474 | Copyright (C) 475 | 476 | This library is free software; you can redistribute it and/or 477 | modify it under the terms of the GNU Lesser General Public 478 | License as published by the Free Software Foundation; either 479 | version 2.1 of the License, or (at your option) any later version. 480 | 481 | This library is distributed in the hope that it will be useful, 482 | but WITHOUT ANY WARRANTY; without even the implied warranty of 483 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 484 | Lesser General Public License for more details. 485 | 486 | You should have received a copy of the GNU Lesser General Public 487 | License along with this library; if not, write to the Free Software 488 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 489 | USA 490 | 491 | Also add information on how to contact you by electronic and paper mail. 492 | 493 | You should also get your employer (if you work as a programmer) or your 494 | school, if any, to sign a "copyright disclaimer" for the library, if 495 | necessary. Here is a sample; alter the names: 496 | 497 | Yoyodyne, Inc., hereby disclaims all copyright interest in the 498 | library `Frob' (a library for tweaking knobs) written by James Random 499 | Hacker. 500 | 501 | , 1 April 1990 502 | Ty Coon, President of Vice 503 | 504 | That's all there is to it! 505 | -------------------------------------------------------------------------------- /contrib/config-6.8.6: -------------------------------------------------------------------------------- 1 | # 2 | # Automatically generated file; DO NOT EDIT. 3 | # Linux/x86 6.8.6 Kernel Configuration 4 | # 5 | CONFIG_CC_VERSION_TEXT="gcc (GCC) 13.2.0" 6 | CONFIG_CC_IS_GCC=y 7 | CONFIG_GCC_VERSION=130200 8 | CONFIG_CLANG_VERSION=0 9 | CONFIG_AS_IS_GNU=y 10 | CONFIG_AS_VERSION=24200 11 | CONFIG_LD_IS_BFD=y 12 | CONFIG_LD_VERSION=24200 13 | CONFIG_LLD_VERSION=0 14 | CONFIG_CC_CAN_LINK=y 15 | CONFIG_CC_CAN_LINK_STATIC=y 16 | CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y 17 | CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y 18 | CONFIG_GCC_ASM_GOTO_OUTPUT_WORKAROUND=y 19 | CONFIG_TOOLS_SUPPORT_RELR=y 20 | CONFIG_CC_HAS_ASM_INLINE=y 21 | CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y 22 | CONFIG_PAHOLE_VERSION=0 23 | CONFIG_IRQ_WORK=y 24 | CONFIG_BUILDTIME_TABLE_SORT=y 25 | CONFIG_THREAD_INFO_IN_TASK=y 26 | 27 | # 28 | # General setup 29 | # 30 | CONFIG_BROKEN_ON_SMP=y 31 | CONFIG_INIT_ENV_ARG_LIMIT=32 32 | # CONFIG_COMPILE_TEST is not set 33 | # CONFIG_WERROR is not set 34 | CONFIG_LOCALVERSION="" 35 | # CONFIG_LOCALVERSION_AUTO is not set 36 | CONFIG_BUILD_SALT="" 37 | CONFIG_HAVE_KERNEL_GZIP=y 38 | CONFIG_HAVE_KERNEL_BZIP2=y 39 | CONFIG_HAVE_KERNEL_LZMA=y 40 | CONFIG_HAVE_KERNEL_XZ=y 41 | CONFIG_HAVE_KERNEL_LZO=y 42 | CONFIG_HAVE_KERNEL_LZ4=y 43 | CONFIG_HAVE_KERNEL_ZSTD=y 44 | # CONFIG_KERNEL_GZIP is not set 45 | # CONFIG_KERNEL_BZIP2 is not set 46 | # CONFIG_KERNEL_LZMA is not set 47 | CONFIG_KERNEL_XZ=y 48 | # CONFIG_KERNEL_LZO is not set 49 | # CONFIG_KERNEL_LZ4 is not set 50 | # CONFIG_KERNEL_ZSTD is not set 51 | CONFIG_DEFAULT_INIT="" 52 | CONFIG_DEFAULT_HOSTNAME="(none)" 53 | # CONFIG_SYSVIPC is not set 54 | # CONFIG_WATCH_QUEUE is not set 55 | # CONFIG_CROSS_MEMORY_ATTACH is not set 56 | # CONFIG_USELIB is not set 57 | CONFIG_HAVE_ARCH_AUDITSYSCALL=y 58 | 59 | # 60 | # IRQ subsystem 61 | # 62 | CONFIG_GENERIC_IRQ_PROBE=y 63 | CONFIG_GENERIC_IRQ_SHOW=y 64 | CONFIG_HARDIRQS_SW_RESEND=y 65 | CONFIG_IRQ_DOMAIN=y 66 | CONFIG_IRQ_DOMAIN_HIERARCHY=y 67 | CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y 68 | CONFIG_GENERIC_IRQ_RESERVATION_MODE=y 69 | CONFIG_IRQ_FORCED_THREADING=y 70 | CONFIG_SPARSE_IRQ=y 71 | # end of IRQ subsystem 72 | 73 | CONFIG_CLOCKSOURCE_WATCHDOG=y 74 | CONFIG_ARCH_CLOCKSOURCE_INIT=y 75 | CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y 76 | CONFIG_GENERIC_TIME_VSYSCALL=y 77 | CONFIG_GENERIC_CLOCKEVENTS=y 78 | CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y 79 | CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y 80 | CONFIG_GENERIC_CMOS_UPDATE=y 81 | CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y 82 | 83 | # 84 | # Timers subsystem 85 | # 86 | CONFIG_HZ_PERIODIC=y 87 | # CONFIG_NO_HZ_IDLE is not set 88 | # CONFIG_NO_HZ is not set 89 | # CONFIG_HIGH_RES_TIMERS is not set 90 | CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=125 91 | # end of Timers subsystem 92 | 93 | CONFIG_HAVE_EBPF_JIT=y 94 | CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y 95 | 96 | # 97 | # BPF subsystem 98 | # 99 | # CONFIG_BPF_SYSCALL is not set 100 | # end of BPF subsystem 101 | 102 | CONFIG_PREEMPT_NONE_BUILD=y 103 | CONFIG_PREEMPT_NONE=y 104 | # CONFIG_PREEMPT_VOLUNTARY is not set 105 | # CONFIG_PREEMPT is not set 106 | # CONFIG_PREEMPT_DYNAMIC is not set 107 | 108 | # 109 | # CPU/Task time and stats accounting 110 | # 111 | CONFIG_TICK_CPU_ACCOUNTING=y 112 | # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set 113 | # CONFIG_IRQ_TIME_ACCOUNTING is not set 114 | # CONFIG_PSI is not set 115 | # end of CPU/Task time and stats accounting 116 | 117 | # 118 | # RCU Subsystem 119 | # 120 | CONFIG_TINY_RCU=y 121 | # CONFIG_RCU_EXPERT is not set 122 | CONFIG_TINY_SRCU=y 123 | # end of RCU Subsystem 124 | 125 | # CONFIG_IKCONFIG is not set 126 | CONFIG_LOG_BUF_SHIFT=17 127 | CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y 128 | 129 | # 130 | # Scheduler features 131 | # 132 | # end of Scheduler features 133 | 134 | CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y 135 | CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y 136 | CONFIG_CC_HAS_INT128=y 137 | CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" 138 | CONFIG_GCC10_NO_ARRAY_BOUNDS=y 139 | CONFIG_CC_NO_ARRAY_BOUNDS=y 140 | CONFIG_GCC_NO_STRINGOP_OVERFLOW=y 141 | CONFIG_CC_NO_STRINGOP_OVERFLOW=y 142 | CONFIG_ARCH_SUPPORTS_INT128=y 143 | # CONFIG_CGROUPS is not set 144 | # CONFIG_SCHED_AUTOGROUP is not set 145 | # CONFIG_RELAY is not set 146 | CONFIG_BLK_DEV_INITRD=y 147 | CONFIG_INITRAMFS_SOURCE="" 148 | CONFIG_RD_GZIP=y 149 | CONFIG_RD_BZIP2=y 150 | CONFIG_RD_LZMA=y 151 | CONFIG_RD_XZ=y 152 | CONFIG_RD_LZO=y 153 | CONFIG_RD_LZ4=y 154 | CONFIG_RD_ZSTD=y 155 | # CONFIG_BOOT_CONFIG is not set 156 | # CONFIG_INITRAMFS_PRESERVE_MTIME is not set 157 | # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set 158 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y 159 | CONFIG_LD_ORPHAN_WARN=y 160 | CONFIG_LD_ORPHAN_WARN_LEVEL="warn" 161 | CONFIG_SYSCTL_EXCEPTION_TRACE=y 162 | CONFIG_HAVE_PCSPKR_PLATFORM=y 163 | CONFIG_EXPERT=y 164 | # CONFIG_MULTIUSER is not set 165 | # CONFIG_SGETMASK_SYSCALL is not set 166 | # CONFIG_SYSFS_SYSCALL is not set 167 | # CONFIG_FHANDLE is not set 168 | # CONFIG_POSIX_TIMERS is not set 169 | CONFIG_PRINTK=y 170 | # CONFIG_BUG is not set 171 | # CONFIG_PCSPKR_PLATFORM is not set 172 | # CONFIG_BASE_FULL is not set 173 | # CONFIG_FUTEX is not set 174 | # CONFIG_EPOLL is not set 175 | # CONFIG_SIGNALFD is not set 176 | # CONFIG_TIMERFD is not set 177 | # CONFIG_EVENTFD is not set 178 | # CONFIG_SHMEM is not set 179 | # CONFIG_AIO is not set 180 | # CONFIG_IO_URING is not set 181 | # CONFIG_ADVISE_SYSCALLS is not set 182 | # CONFIG_MEMBARRIER is not set 183 | # CONFIG_KCMP is not set 184 | # CONFIG_RSEQ is not set 185 | # CONFIG_CACHESTAT_SYSCALL is not set 186 | # CONFIG_PC104 is not set 187 | # CONFIG_KALLSYMS is not set 188 | CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y 189 | CONFIG_HAVE_PERF_EVENTS=y 190 | 191 | # 192 | # Kernel Performance Events And Counters 193 | # 194 | CONFIG_PERF_EVENTS=y 195 | # CONFIG_DEBUG_PERF_USE_VMALLOC is not set 196 | # end of Kernel Performance Events And Counters 197 | 198 | # CONFIG_PROFILING is not set 199 | 200 | # 201 | # Kexec and crash features 202 | # 203 | # CONFIG_KEXEC is not set 204 | # CONFIG_KEXEC_FILE is not set 205 | # CONFIG_CRASH_DUMP is not set 206 | # end of Kexec and crash features 207 | # end of General setup 208 | 209 | CONFIG_64BIT=y 210 | CONFIG_X86_64=y 211 | CONFIG_X86=y 212 | CONFIG_INSTRUCTION_DECODER=y 213 | CONFIG_OUTPUT_FORMAT="elf64-x86-64" 214 | CONFIG_LOCKDEP_SUPPORT=y 215 | CONFIG_STACKTRACE_SUPPORT=y 216 | CONFIG_MMU=y 217 | CONFIG_ARCH_MMAP_RND_BITS_MIN=28 218 | CONFIG_ARCH_MMAP_RND_BITS_MAX=32 219 | CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8 220 | CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 221 | CONFIG_GENERIC_ISA_DMA=y 222 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y 223 | CONFIG_GENERIC_CALIBRATE_DELAY=y 224 | CONFIG_ARCH_HAS_CPU_RELAX=y 225 | CONFIG_ARCH_HIBERNATION_POSSIBLE=y 226 | CONFIG_ARCH_SUSPEND_POSSIBLE=y 227 | CONFIG_AUDIT_ARCH=y 228 | CONFIG_ARCH_SUPPORTS_UPROBES=y 229 | CONFIG_FIX_EARLYCON_MEM=y 230 | CONFIG_PGTABLE_LEVELS=5 231 | CONFIG_CC_HAS_SANE_STACKPROTECTOR=y 232 | 233 | # 234 | # Processor type and features 235 | # 236 | # CONFIG_SMP is not set 237 | CONFIG_X86_MPPARSE=y 238 | # CONFIG_GOLDFISH is not set 239 | # CONFIG_X86_CPU_RESCTRL is not set 240 | # CONFIG_X86_EXTENDED_PLATFORM is not set 241 | # CONFIG_SCHED_OMIT_FRAME_POINTER is not set 242 | # CONFIG_HYPERVISOR_GUEST is not set 243 | # CONFIG_MK8 is not set 244 | # CONFIG_MPSC is not set 245 | # CONFIG_MCORE2 is not set 246 | # CONFIG_MATOM is not set 247 | CONFIG_GENERIC_CPU=y 248 | CONFIG_X86_INTERNODE_CACHE_SHIFT=6 249 | CONFIG_X86_L1_CACHE_SHIFT=6 250 | CONFIG_X86_TSC=y 251 | CONFIG_X86_HAVE_PAE=y 252 | CONFIG_X86_CMPXCHG64=y 253 | CONFIG_X86_CMOV=y 254 | CONFIG_X86_MINIMUM_CPU_FAMILY=64 255 | CONFIG_X86_DEBUGCTLMSR=y 256 | CONFIG_IA32_FEAT_CTL=y 257 | CONFIG_X86_VMX_FEATURE_NAMES=y 258 | # CONFIG_PROCESSOR_SELECT is not set 259 | CONFIG_CPU_SUP_INTEL=y 260 | CONFIG_CPU_SUP_AMD=y 261 | CONFIG_CPU_SUP_HYGON=y 262 | CONFIG_CPU_SUP_CENTAUR=y 263 | CONFIG_CPU_SUP_ZHAOXIN=y 264 | CONFIG_HPET_TIMER=y 265 | # CONFIG_DMI is not set 266 | CONFIG_NR_CPUS_RANGE_BEGIN=1 267 | CONFIG_NR_CPUS_RANGE_END=1 268 | CONFIG_NR_CPUS_DEFAULT=1 269 | CONFIG_NR_CPUS=1 270 | CONFIG_UP_LATE_INIT=y 271 | CONFIG_X86_LOCAL_APIC=y 272 | CONFIG_X86_IO_APIC=y 273 | # CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set 274 | # CONFIG_X86_MCE is not set 275 | 276 | # 277 | # Performance monitoring 278 | # 279 | # CONFIG_PERF_EVENTS_AMD_POWER is not set 280 | # CONFIG_PERF_EVENTS_AMD_UNCORE is not set 281 | # CONFIG_PERF_EVENTS_AMD_BRS is not set 282 | # end of Performance monitoring 283 | 284 | CONFIG_X86_VSYSCALL_EMULATION=y 285 | # CONFIG_X86_IOPL_IOPERM is not set 286 | CONFIG_MICROCODE=y 287 | # CONFIG_X86_MSR is not set 288 | # CONFIG_X86_CPUID is not set 289 | CONFIG_X86_5LEVEL=y 290 | CONFIG_X86_DIRECT_GBPAGES=y 291 | CONFIG_ARCH_SPARSEMEM_ENABLE=y 292 | CONFIG_ARCH_SPARSEMEM_DEFAULT=y 293 | CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 294 | # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set 295 | # CONFIG_MTRR is not set 296 | # CONFIG_X86_UMIP is not set 297 | CONFIG_CC_HAS_IBT=y 298 | CONFIG_X86_CET=y 299 | CONFIG_X86_KERNEL_IBT=y 300 | CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS=y 301 | CONFIG_X86_INTEL_TSX_MODE_OFF=y 302 | # CONFIG_X86_INTEL_TSX_MODE_ON is not set 303 | # CONFIG_X86_INTEL_TSX_MODE_AUTO is not set 304 | # CONFIG_X86_USER_SHADOW_STACK is not set 305 | # CONFIG_HZ_100 is not set 306 | CONFIG_HZ_250=y 307 | # CONFIG_HZ_300 is not set 308 | # CONFIG_HZ_1000 is not set 309 | CONFIG_HZ=250 310 | CONFIG_ARCH_SUPPORTS_KEXEC=y 311 | CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y 312 | CONFIG_ARCH_SUPPORTS_KEXEC_PURGATORY=y 313 | CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y 314 | CONFIG_ARCH_SUPPORTS_KEXEC_SIG_FORCE=y 315 | CONFIG_ARCH_SUPPORTS_KEXEC_BZIMAGE_VERIFY_SIG=y 316 | CONFIG_ARCH_SUPPORTS_KEXEC_JUMP=y 317 | CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y 318 | CONFIG_ARCH_SUPPORTS_CRASH_HOTPLUG=y 319 | CONFIG_PHYSICAL_START=0x1000000 320 | # CONFIG_RELOCATABLE is not set 321 | CONFIG_PHYSICAL_ALIGN=0x200000 322 | CONFIG_DYNAMIC_MEMORY_LAYOUT=y 323 | # CONFIG_ADDRESS_MASKING is not set 324 | CONFIG_LEGACY_VSYSCALL_XONLY=y 325 | # CONFIG_LEGACY_VSYSCALL_NONE is not set 326 | # CONFIG_CMDLINE_BOOL is not set 327 | # CONFIG_MODIFY_LDT_SYSCALL is not set 328 | # CONFIG_STRICT_SIGALTSTACK_SIZE is not set 329 | CONFIG_HAVE_LIVEPATCH=y 330 | # end of Processor type and features 331 | 332 | CONFIG_CC_HAS_SLS=y 333 | CONFIG_CC_HAS_RETURN_THUNK=y 334 | CONFIG_CC_HAS_ENTRY_PADDING=y 335 | CONFIG_FUNCTION_PADDING_CFI=11 336 | CONFIG_FUNCTION_PADDING_BYTES=16 337 | # CONFIG_SPECULATION_MITIGATIONS is not set 338 | CONFIG_ARCH_HAS_ADD_PAGES=y 339 | 340 | # 341 | # Power management and ACPI options 342 | # 343 | # CONFIG_SUSPEND is not set 344 | # CONFIG_PM is not set 345 | CONFIG_ARCH_SUPPORTS_ACPI=y 346 | # CONFIG_ACPI is not set 347 | 348 | # 349 | # CPU Frequency scaling 350 | # 351 | # CONFIG_CPU_FREQ is not set 352 | # end of CPU Frequency scaling 353 | 354 | # 355 | # CPU Idle 356 | # 357 | # CONFIG_CPU_IDLE is not set 358 | # end of CPU Idle 359 | # end of Power management and ACPI options 360 | 361 | # 362 | # Bus options (PCI etc.) 363 | # 364 | # CONFIG_ISA_BUS is not set 365 | CONFIG_ISA_DMA_API=y 366 | # end of Bus options (PCI etc.) 367 | 368 | # 369 | # Binary Emulations 370 | # 371 | # CONFIG_IA32_EMULATION is not set 372 | # CONFIG_X86_X32_ABI is not set 373 | # end of Binary Emulations 374 | 375 | CONFIG_HAVE_KVM=y 376 | # CONFIG_VIRTUALIZATION is not set 377 | CONFIG_AS_AVX512=y 378 | CONFIG_AS_SHA1_NI=y 379 | CONFIG_AS_SHA256_NI=y 380 | CONFIG_AS_TPAUSE=y 381 | CONFIG_AS_GFNI=y 382 | CONFIG_AS_WRUSS=y 383 | 384 | # 385 | # General architecture-dependent options 386 | # 387 | CONFIG_GENERIC_ENTRY=y 388 | # CONFIG_JUMP_LABEL is not set 389 | # CONFIG_STATIC_CALL_SELFTEST is not set 390 | CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y 391 | CONFIG_ARCH_USE_BUILTIN_BSWAP=y 392 | CONFIG_HAVE_IOREMAP_PROT=y 393 | CONFIG_HAVE_KPROBES=y 394 | CONFIG_HAVE_KRETPROBES=y 395 | CONFIG_HAVE_OPTPROBES=y 396 | CONFIG_HAVE_KPROBES_ON_FTRACE=y 397 | CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y 398 | CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y 399 | CONFIG_HAVE_NMI=y 400 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y 401 | CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y 402 | CONFIG_HAVE_ARCH_TRACEHOOK=y 403 | CONFIG_HAVE_DMA_CONTIGUOUS=y 404 | CONFIG_GENERIC_SMP_IDLE_THREAD=y 405 | CONFIG_ARCH_HAS_FORTIFY_SOURCE=y 406 | CONFIG_ARCH_HAS_SET_MEMORY=y 407 | CONFIG_ARCH_HAS_SET_DIRECT_MAP=y 408 | CONFIG_ARCH_HAS_CPU_FINALIZE_INIT=y 409 | CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y 410 | CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y 411 | CONFIG_ARCH_WANTS_NO_INSTR=y 412 | CONFIG_HAVE_ASM_MODVERSIONS=y 413 | CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y 414 | CONFIG_HAVE_RSEQ=y 415 | CONFIG_HAVE_RUST=y 416 | CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y 417 | CONFIG_HAVE_HW_BREAKPOINT=y 418 | CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y 419 | CONFIG_HAVE_USER_RETURN_NOTIFIER=y 420 | CONFIG_HAVE_PERF_EVENTS_NMI=y 421 | CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y 422 | CONFIG_HAVE_PERF_REGS=y 423 | CONFIG_HAVE_PERF_USER_STACK_DUMP=y 424 | CONFIG_HAVE_ARCH_JUMP_LABEL=y 425 | CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y 426 | CONFIG_MMU_GATHER_MERGE_VMAS=y 427 | CONFIG_MMU_LAZY_TLB_REFCOUNT=y 428 | CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y 429 | CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS=y 430 | CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y 431 | CONFIG_HAVE_CMPXCHG_LOCAL=y 432 | CONFIG_HAVE_CMPXCHG_DOUBLE=y 433 | CONFIG_HAVE_ARCH_SECCOMP=y 434 | CONFIG_HAVE_ARCH_SECCOMP_FILTER=y 435 | # CONFIG_SECCOMP is not set 436 | CONFIG_HAVE_ARCH_STACKLEAK=y 437 | CONFIG_HAVE_STACKPROTECTOR=y 438 | # CONFIG_STACKPROTECTOR is not set 439 | CONFIG_ARCH_SUPPORTS_LTO_CLANG=y 440 | CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y 441 | CONFIG_LTO_NONE=y 442 | CONFIG_ARCH_SUPPORTS_CFI_CLANG=y 443 | CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y 444 | CONFIG_HAVE_CONTEXT_TRACKING_USER=y 445 | CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y 446 | CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y 447 | CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y 448 | CONFIG_HAVE_MOVE_PUD=y 449 | CONFIG_HAVE_MOVE_PMD=y 450 | CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y 451 | CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y 452 | CONFIG_HAVE_ARCH_HUGE_VMAP=y 453 | CONFIG_HAVE_ARCH_HUGE_VMALLOC=y 454 | CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y 455 | CONFIG_HAVE_ARCH_SOFT_DIRTY=y 456 | CONFIG_HAVE_MOD_ARCH_SPECIFIC=y 457 | CONFIG_MODULES_USE_ELF_RELA=y 458 | CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y 459 | CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y 460 | CONFIG_SOFTIRQ_ON_OWN_STACK=y 461 | CONFIG_ARCH_HAS_ELF_RANDOMIZE=y 462 | CONFIG_HAVE_ARCH_MMAP_RND_BITS=y 463 | CONFIG_HAVE_EXIT_THREAD=y 464 | CONFIG_ARCH_MMAP_RND_BITS=28 465 | CONFIG_PAGE_SIZE_LESS_THAN_64KB=y 466 | CONFIG_PAGE_SIZE_LESS_THAN_256KB=y 467 | CONFIG_HAVE_OBJTOOL=y 468 | CONFIG_HAVE_JUMP_LABEL_HACK=y 469 | CONFIG_HAVE_NOINSTR_HACK=y 470 | CONFIG_HAVE_NOINSTR_VALIDATION=y 471 | CONFIG_HAVE_UACCESS_VALIDATION=y 472 | CONFIG_HAVE_STACK_VALIDATION=y 473 | # CONFIG_COMPAT_32BIT_TIME is not set 474 | CONFIG_HAVE_ARCH_VMAP_STACK=y 475 | CONFIG_VMAP_STACK=y 476 | CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y 477 | # CONFIG_RANDOMIZE_KSTACK_OFFSET is not set 478 | CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y 479 | CONFIG_STRICT_KERNEL_RWX=y 480 | CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y 481 | CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y 482 | CONFIG_ARCH_HAS_MEM_ENCRYPT=y 483 | CONFIG_HAVE_STATIC_CALL=y 484 | CONFIG_HAVE_STATIC_CALL_INLINE=y 485 | CONFIG_HAVE_PREEMPT_DYNAMIC=y 486 | CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y 487 | CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y 488 | CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y 489 | CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y 490 | CONFIG_ARCH_HAS_ELFCORE_COMPAT=y 491 | CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y 492 | CONFIG_DYNAMIC_SIGFRAME=y 493 | CONFIG_ARCH_HAS_HW_PTE_YOUNG=y 494 | CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y 495 | 496 | # 497 | # GCOV-based kernel profiling 498 | # 499 | CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y 500 | # end of GCOV-based kernel profiling 501 | 502 | CONFIG_HAVE_GCC_PLUGINS=y 503 | # CONFIG_GCC_PLUGINS is not set 504 | CONFIG_FUNCTION_ALIGNMENT_4B=y 505 | CONFIG_FUNCTION_ALIGNMENT_16B=y 506 | CONFIG_FUNCTION_ALIGNMENT=16 507 | # end of General architecture-dependent options 508 | 509 | CONFIG_BASE_SMALL=1 510 | # CONFIG_MODULES is not set 511 | # CONFIG_BLOCK is not set 512 | CONFIG_INLINE_SPIN_UNLOCK_IRQ=y 513 | CONFIG_INLINE_READ_UNLOCK=y 514 | CONFIG_INLINE_READ_UNLOCK_IRQ=y 515 | CONFIG_INLINE_WRITE_UNLOCK=y 516 | CONFIG_INLINE_WRITE_UNLOCK_IRQ=y 517 | CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y 518 | CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y 519 | CONFIG_ARCH_USE_QUEUED_RWLOCKS=y 520 | CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y 521 | CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE=y 522 | CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y 523 | 524 | # 525 | # Executable file formats 526 | # 527 | CONFIG_BINFMT_ELF=y 528 | CONFIG_ELFCORE=y 529 | # CONFIG_BINFMT_SCRIPT is not set 530 | # CONFIG_BINFMT_MISC is not set 531 | # CONFIG_COREDUMP is not set 532 | # end of Executable file formats 533 | 534 | # 535 | # Memory Management options 536 | # 537 | 538 | # 539 | # Slab allocator options 540 | # 541 | CONFIG_SLUB=y 542 | CONFIG_SLUB_TINY=y 543 | CONFIG_SLAB_MERGE_DEFAULT=y 544 | # end of Slab allocator options 545 | 546 | # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set 547 | # CONFIG_COMPAT_BRK is not set 548 | CONFIG_SPARSEMEM=y 549 | CONFIG_SPARSEMEM_EXTREME=y 550 | CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y 551 | CONFIG_SPARSEMEM_VMEMMAP=y 552 | CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP=y 553 | CONFIG_ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP=y 554 | CONFIG_HAVE_FAST_GUP=y 555 | CONFIG_EXCLUSIVE_SYSTEM_RAM=y 556 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y 557 | # CONFIG_MEMORY_HOTPLUG is not set 558 | CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y 559 | CONFIG_SPLIT_PTLOCK_CPUS=4 560 | CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y 561 | # CONFIG_COMPACTION is not set 562 | # CONFIG_PAGE_REPORTING is not set 563 | CONFIG_PCP_BATCH_SCALE_MAX=5 564 | CONFIG_PHYS_ADDR_T_64BIT=y 565 | # CONFIG_KSM is not set 566 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 567 | CONFIG_ARCH_WANT_GENERAL_HUGETLB=y 568 | CONFIG_ARCH_WANTS_THP_SWAP=y 569 | # CONFIG_TRANSPARENT_HUGEPAGE is not set 570 | CONFIG_NEED_PER_CPU_KM=y 571 | CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y 572 | CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y 573 | CONFIG_HAVE_SETUP_PER_CPU_AREA=y 574 | # CONFIG_CMA is not set 575 | CONFIG_GENERIC_EARLY_IOREMAP=y 576 | CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y 577 | CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y 578 | CONFIG_ARCH_HAS_PTE_DEVMAP=y 579 | CONFIG_ARCH_HAS_ZONE_DMA_SET=y 580 | # CONFIG_ZONE_DMA is not set 581 | CONFIG_ZONE_DMA32=y 582 | CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y 583 | CONFIG_ARCH_HAS_PKEYS=y 584 | # CONFIG_VM_EVENT_COUNTERS is not set 585 | # CONFIG_PERCPU_STATS is not set 586 | 587 | # 588 | # GUP_TEST needs to have DEBUG_FS enabled 589 | # 590 | # CONFIG_DMAPOOL_TEST is not set 591 | CONFIG_ARCH_HAS_PTE_SPECIAL=y 592 | # CONFIG_MEMFD_CREATE is not set 593 | # CONFIG_SECRETMEM is not set 594 | # CONFIG_USERFAULTFD is not set 595 | # CONFIG_LRU_GEN is not set 596 | CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y 597 | CONFIG_LOCK_MM_AND_FIND_VMA=y 598 | 599 | # 600 | # Data Access Monitoring 601 | # 602 | # CONFIG_DAMON is not set 603 | # end of Data Access Monitoring 604 | # end of Memory Management options 605 | 606 | # CONFIG_NET is not set 607 | 608 | # 609 | # Device Drivers 610 | # 611 | CONFIG_HAVE_EISA=y 612 | # CONFIG_EISA is not set 613 | CONFIG_HAVE_PCI=y 614 | # CONFIG_PCI is not set 615 | # CONFIG_PCCARD is not set 616 | 617 | # 618 | # Generic Driver Options 619 | # 620 | # CONFIG_UEVENT_HELPER is not set 621 | CONFIG_DEVTMPFS=y 622 | # CONFIG_DEVTMPFS_MOUNT is not set 623 | # CONFIG_DEVTMPFS_SAFE is not set 624 | # CONFIG_STANDALONE is not set 625 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set 626 | 627 | # 628 | # Firmware loader 629 | # 630 | # CONFIG_FW_LOADER is not set 631 | # end of Firmware loader 632 | 633 | # CONFIG_ALLOW_DEV_COREDUMP is not set 634 | # CONFIG_DEBUG_DRIVER is not set 635 | # CONFIG_DEBUG_DEVRES is not set 636 | # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set 637 | CONFIG_GENERIC_CPU_DEVICES=y 638 | CONFIG_GENERIC_CPU_AUTOPROBE=y 639 | CONFIG_GENERIC_CPU_VULNERABILITIES=y 640 | # CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set 641 | # end of Generic Driver Options 642 | 643 | # 644 | # Bus devices 645 | # 646 | # CONFIG_MHI_BUS is not set 647 | # CONFIG_MHI_BUS_EP is not set 648 | # end of Bus devices 649 | 650 | # 651 | # Cache Drivers 652 | # 653 | # end of Cache Drivers 654 | 655 | # 656 | # Firmware Drivers 657 | # 658 | 659 | # 660 | # ARM System Control and Management Interface Protocol 661 | # 662 | # end of ARM System Control and Management Interface Protocol 663 | 664 | # CONFIG_EDD is not set 665 | # CONFIG_FIRMWARE_MEMMAP is not set 666 | # CONFIG_SYSFB_SIMPLEFB is not set 667 | # CONFIG_GOOGLE_FIRMWARE is not set 668 | 669 | # 670 | # Qualcomm firmware drivers 671 | # 672 | # end of Qualcomm firmware drivers 673 | 674 | # 675 | # Tegra firmware driver 676 | # 677 | # end of Tegra firmware driver 678 | # end of Firmware Drivers 679 | 680 | # CONFIG_GNSS is not set 681 | # CONFIG_MTD is not set 682 | # CONFIG_OF is not set 683 | CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y 684 | # CONFIG_PARPORT is not set 685 | 686 | # 687 | # NVME Support 688 | # 689 | # end of NVME Support 690 | 691 | # 692 | # Misc devices 693 | # 694 | # CONFIG_DUMMY_IRQ is not set 695 | # CONFIG_ENCLOSURE_SERVICES is not set 696 | # CONFIG_SRAM is not set 697 | # CONFIG_XILINX_SDFEC is not set 698 | # CONFIG_C2PORT is not set 699 | 700 | # 701 | # EEPROM support 702 | # 703 | # CONFIG_EEPROM_93CX6 is not set 704 | # end of EEPROM support 705 | 706 | # 707 | # Texas Instruments shared transport line discipline 708 | # 709 | # end of Texas Instruments shared transport line discipline 710 | 711 | # 712 | # Altera FPGA firmware download module (requires I2C) 713 | # 714 | # CONFIG_ECHO is not set 715 | # CONFIG_PVPANIC is not set 716 | # end of Misc devices 717 | 718 | # 719 | # SCSI device support 720 | # 721 | # end of SCSI device support 722 | 723 | # CONFIG_MACINTOSH_DRIVERS is not set 724 | 725 | # 726 | # Input device support 727 | # 728 | # CONFIG_INPUT is not set 729 | 730 | # 731 | # Hardware I/O ports 732 | # 733 | # CONFIG_SERIO is not set 734 | CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y 735 | # CONFIG_GAMEPORT is not set 736 | # end of Hardware I/O ports 737 | # end of Input device support 738 | 739 | # 740 | # Character devices 741 | # 742 | # CONFIG_TTY is not set 743 | # CONFIG_SERIAL_DEV_BUS is not set 744 | # CONFIG_IPMI_HANDLER is not set 745 | # CONFIG_HW_RANDOM is not set 746 | # CONFIG_DEVMEM is not set 747 | # CONFIG_NVRAM is not set 748 | # CONFIG_DEVPORT is not set 749 | # CONFIG_HANGCHECK_TIMER is not set 750 | # CONFIG_TCG_TPM is not set 751 | # CONFIG_TELCLOCK is not set 752 | # end of Character devices 753 | 754 | # 755 | # I2C support 756 | # 757 | # CONFIG_I2C is not set 758 | # end of I2C support 759 | 760 | # CONFIG_I3C is not set 761 | # CONFIG_SPI is not set 762 | # CONFIG_SPMI is not set 763 | # CONFIG_HSI is not set 764 | # CONFIG_PPS is not set 765 | 766 | # 767 | # PTP clock support 768 | # 769 | CONFIG_PTP_1588_CLOCK_OPTIONAL=y 770 | 771 | # 772 | # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. 773 | # 774 | # end of PTP clock support 775 | 776 | # CONFIG_PINCTRL is not set 777 | # CONFIG_GPIOLIB is not set 778 | # CONFIG_W1 is not set 779 | # CONFIG_POWER_RESET is not set 780 | # CONFIG_POWER_SUPPLY is not set 781 | # CONFIG_HWMON is not set 782 | # CONFIG_THERMAL is not set 783 | # CONFIG_WATCHDOG is not set 784 | CONFIG_SSB_POSSIBLE=y 785 | # CONFIG_SSB is not set 786 | CONFIG_BCMA_POSSIBLE=y 787 | # CONFIG_BCMA is not set 788 | 789 | # 790 | # Multifunction device drivers 791 | # 792 | # CONFIG_MFD_MADERA is not set 793 | # CONFIG_MFD_KEMPLD is not set 794 | # CONFIG_MFD_MT6397 is not set 795 | # CONFIG_MFD_SM501 is not set 796 | # CONFIG_MFD_SYSCON is not set 797 | # CONFIG_MFD_TQMX86 is not set 798 | # end of Multifunction device drivers 799 | 800 | # CONFIG_REGULATOR is not set 801 | 802 | # 803 | # CEC support 804 | # 805 | # CONFIG_MEDIA_CEC_SUPPORT is not set 806 | # end of CEC support 807 | 808 | # CONFIG_MEDIA_SUPPORT is not set 809 | 810 | # 811 | # Graphics support 812 | # 813 | # CONFIG_AUXDISPLAY is not set 814 | # CONFIG_DRM is not set 815 | # CONFIG_DRM_DEBUG_MODESET_LOCK is not set 816 | 817 | # 818 | # Frame buffer Devices 819 | # 820 | # CONFIG_FB is not set 821 | # end of Frame buffer Devices 822 | 823 | # 824 | # Backlight & LCD device support 825 | # 826 | # CONFIG_LCD_CLASS_DEVICE is not set 827 | # CONFIG_BACKLIGHT_CLASS_DEVICE is not set 828 | # end of Backlight & LCD device support 829 | # end of Graphics support 830 | 831 | # CONFIG_SOUND is not set 832 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y 833 | # CONFIG_USB_SUPPORT is not set 834 | # CONFIG_MMC is not set 835 | # CONFIG_MEMSTICK is not set 836 | # CONFIG_NEW_LEDS is not set 837 | # CONFIG_ACCESSIBILITY is not set 838 | CONFIG_EDAC_ATOMIC_SCRUB=y 839 | CONFIG_EDAC_SUPPORT=y 840 | CONFIG_RTC_LIB=y 841 | CONFIG_RTC_MC146818_LIB=y 842 | # CONFIG_RTC_CLASS is not set 843 | # CONFIG_DMADEVICES is not set 844 | 845 | # 846 | # DMABUF options 847 | # 848 | # CONFIG_SYNC_FILE is not set 849 | # CONFIG_DMABUF_HEAPS is not set 850 | # end of DMABUF options 851 | 852 | # CONFIG_UIO is not set 853 | # CONFIG_VFIO is not set 854 | # CONFIG_VIRT_DRIVERS is not set 855 | # CONFIG_VIRTIO_MENU is not set 856 | # CONFIG_VHOST_MENU is not set 857 | 858 | # 859 | # Microsoft Hyper-V guest support 860 | # 861 | # end of Microsoft Hyper-V guest support 862 | 863 | # CONFIG_COMEDI is not set 864 | # CONFIG_STAGING is not set 865 | # CONFIG_CHROME_PLATFORMS is not set 866 | # CONFIG_MELLANOX_PLATFORM is not set 867 | # CONFIG_SURFACE_PLATFORMS is not set 868 | # CONFIG_X86_PLATFORM_DEVICES is not set 869 | # CONFIG_COMMON_CLK is not set 870 | # CONFIG_HWSPINLOCK is not set 871 | 872 | # 873 | # Clock Source drivers 874 | # 875 | CONFIG_CLKEVT_I8253=y 876 | CONFIG_CLKBLD_I8253=y 877 | # end of Clock Source drivers 878 | 879 | # CONFIG_MAILBOX is not set 880 | # CONFIG_IOMMU_SUPPORT is not set 881 | 882 | # 883 | # Remoteproc drivers 884 | # 885 | # CONFIG_REMOTEPROC is not set 886 | # end of Remoteproc drivers 887 | 888 | # 889 | # Rpmsg drivers 890 | # 891 | # CONFIG_RPMSG_VIRTIO is not set 892 | # end of Rpmsg drivers 893 | 894 | # 895 | # SOC (System On Chip) specific Drivers 896 | # 897 | 898 | # 899 | # Amlogic SoC drivers 900 | # 901 | # end of Amlogic SoC drivers 902 | 903 | # 904 | # Broadcom SoC drivers 905 | # 906 | # end of Broadcom SoC drivers 907 | 908 | # 909 | # NXP/Freescale QorIQ SoC drivers 910 | # 911 | # end of NXP/Freescale QorIQ SoC drivers 912 | 913 | # 914 | # fujitsu SoC drivers 915 | # 916 | # end of fujitsu SoC drivers 917 | 918 | # 919 | # i.MX SoC drivers 920 | # 921 | # end of i.MX SoC drivers 922 | 923 | # 924 | # Enable LiteX SoC Builder specific drivers 925 | # 926 | # end of Enable LiteX SoC Builder specific drivers 927 | 928 | # CONFIG_WPCM450_SOC is not set 929 | 930 | # 931 | # Qualcomm SoC drivers 932 | # 933 | # end of Qualcomm SoC drivers 934 | 935 | # CONFIG_SOC_TI is not set 936 | 937 | # 938 | # Xilinx SoC drivers 939 | # 940 | # end of Xilinx SoC drivers 941 | # end of SOC (System On Chip) specific Drivers 942 | 943 | # 944 | # PM Domains 945 | # 946 | 947 | # 948 | # Amlogic PM Domains 949 | # 950 | # end of Amlogic PM Domains 951 | 952 | # 953 | # Broadcom PM Domains 954 | # 955 | # end of Broadcom PM Domains 956 | 957 | # 958 | # i.MX PM Domains 959 | # 960 | # end of i.MX PM Domains 961 | 962 | # 963 | # Qualcomm PM Domains 964 | # 965 | # end of Qualcomm PM Domains 966 | # end of PM Domains 967 | 968 | # CONFIG_PM_DEVFREQ is not set 969 | # CONFIG_EXTCON is not set 970 | # CONFIG_MEMORY is not set 971 | # CONFIG_IIO is not set 972 | # CONFIG_PWM is not set 973 | 974 | # 975 | # IRQ chip support 976 | # 977 | # end of IRQ chip support 978 | 979 | # CONFIG_IPACK_BUS is not set 980 | # CONFIG_RESET_CONTROLLER is not set 981 | 982 | # 983 | # PHY Subsystem 984 | # 985 | # CONFIG_GENERIC_PHY is not set 986 | # CONFIG_PHY_CAN_TRANSCEIVER is not set 987 | 988 | # 989 | # PHY drivers for Broadcom platforms 990 | # 991 | # CONFIG_BCM_KONA_USB2_PHY is not set 992 | # end of PHY drivers for Broadcom platforms 993 | 994 | # CONFIG_PHY_PXA_28NM_HSIC is not set 995 | # CONFIG_PHY_PXA_28NM_USB2 is not set 996 | # CONFIG_PHY_INTEL_LGM_EMMC is not set 997 | # end of PHY Subsystem 998 | 999 | # CONFIG_POWERCAP is not set 1000 | # CONFIG_MCB is not set 1001 | 1002 | # 1003 | # Performance monitor support 1004 | # 1005 | # end of Performance monitor support 1006 | 1007 | # CONFIG_RAS is not set 1008 | 1009 | # 1010 | # Android 1011 | # 1012 | # CONFIG_ANDROID_BINDER_IPC is not set 1013 | # end of Android 1014 | 1015 | # CONFIG_DAX is not set 1016 | # CONFIG_NVMEM is not set 1017 | 1018 | # 1019 | # HW tracing support 1020 | # 1021 | # CONFIG_STM is not set 1022 | # CONFIG_INTEL_TH is not set 1023 | # end of HW tracing support 1024 | 1025 | # CONFIG_FPGA is not set 1026 | # CONFIG_TEE is not set 1027 | # CONFIG_SIOX is not set 1028 | # CONFIG_SLIMBUS is not set 1029 | # CONFIG_INTERCONNECT is not set 1030 | # CONFIG_COUNTER is not set 1031 | # CONFIG_PECI is not set 1032 | # CONFIG_HTE is not set 1033 | # end of Device Drivers 1034 | 1035 | # 1036 | # File systems 1037 | # 1038 | CONFIG_DCACHE_WORD_ACCESS=y 1039 | # CONFIG_VALIDATE_FS_PARSER is not set 1040 | # CONFIG_EXPORTFS_BLOCK_OPS is not set 1041 | # CONFIG_FILE_LOCKING is not set 1042 | # CONFIG_FS_ENCRYPTION is not set 1043 | # CONFIG_FS_VERITY is not set 1044 | # CONFIG_DNOTIFY is not set 1045 | # CONFIG_INOTIFY_USER is not set 1046 | # CONFIG_FANOTIFY is not set 1047 | # CONFIG_QUOTA is not set 1048 | # CONFIG_AUTOFS_FS is not set 1049 | # CONFIG_FUSE_FS is not set 1050 | # CONFIG_OVERLAY_FS is not set 1051 | 1052 | # 1053 | # Caches 1054 | # 1055 | # end of Caches 1056 | 1057 | # 1058 | # Pseudo filesystems 1059 | # 1060 | # CONFIG_PROC_FS is not set 1061 | # CONFIG_SYSFS is not set 1062 | CONFIG_ARCH_HAS_GIGANTIC_PAGE=y 1063 | # CONFIG_CONFIGFS_FS is not set 1064 | # end of Pseudo filesystems 1065 | 1066 | # CONFIG_MISC_FILESYSTEMS is not set 1067 | # CONFIG_NLS is not set 1068 | # CONFIG_UNICODE is not set 1069 | # end of File systems 1070 | 1071 | # 1072 | # Security options 1073 | # 1074 | # CONFIG_KEYS is not set 1075 | # CONFIG_SECURITY_DMESG_RESTRICT is not set 1076 | # CONFIG_SECURITYFS is not set 1077 | # CONFIG_HARDENED_USERCOPY is not set 1078 | # CONFIG_FORTIFY_SOURCE is not set 1079 | # CONFIG_STATIC_USERMODEHELPER is not set 1080 | CONFIG_DEFAULT_SECURITY_DAC=y 1081 | CONFIG_LSM="landlock,lockdown,yama,loadpin,safesetid,bpf" 1082 | 1083 | # 1084 | # Kernel hardening options 1085 | # 1086 | 1087 | # 1088 | # Memory initialization 1089 | # 1090 | CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y 1091 | CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y 1092 | CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y 1093 | # CONFIG_INIT_STACK_NONE is not set 1094 | # CONFIG_INIT_STACK_ALL_PATTERN is not set 1095 | CONFIG_INIT_STACK_ALL_ZERO=y 1096 | # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set 1097 | # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set 1098 | CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y 1099 | # CONFIG_ZERO_CALL_USED_REGS is not set 1100 | # end of Memory initialization 1101 | 1102 | # 1103 | # Hardening of kernel data structures 1104 | # 1105 | # CONFIG_LIST_HARDENED is not set 1106 | # CONFIG_BUG_ON_DATA_CORRUPTION is not set 1107 | # end of Hardening of kernel data structures 1108 | 1109 | CONFIG_RANDSTRUCT_NONE=y 1110 | # end of Kernel hardening options 1111 | # end of Security options 1112 | 1113 | # CONFIG_CRYPTO is not set 1114 | 1115 | # 1116 | # Library routines 1117 | # 1118 | # CONFIG_PACKING is not set 1119 | CONFIG_BITREVERSE=y 1120 | CONFIG_GENERIC_STRNCPY_FROM_USER=y 1121 | CONFIG_GENERIC_STRNLEN_USER=y 1122 | # CONFIG_CORDIC is not set 1123 | # CONFIG_PRIME_NUMBERS is not set 1124 | CONFIG_GENERIC_PCI_IOMAP=y 1125 | CONFIG_GENERIC_IOMAP=y 1126 | CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y 1127 | CONFIG_ARCH_HAS_FAST_MULTIPLIER=y 1128 | CONFIG_ARCH_USE_SYM_ANNOTATIONS=y 1129 | 1130 | # 1131 | # Crypto library routines 1132 | # 1133 | CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y 1134 | # CONFIG_CRYPTO_LIB_CHACHA is not set 1135 | # CONFIG_CRYPTO_LIB_CURVE25519 is not set 1136 | CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 1137 | # CONFIG_CRYPTO_LIB_POLY1305 is not set 1138 | # end of Crypto library routines 1139 | 1140 | # CONFIG_CRC_CCITT is not set 1141 | # CONFIG_CRC16 is not set 1142 | # CONFIG_CRC_T10DIF is not set 1143 | # CONFIG_CRC64_ROCKSOFT is not set 1144 | # CONFIG_CRC_ITU_T is not set 1145 | CONFIG_CRC32=y 1146 | # CONFIG_CRC32_SELFTEST is not set 1147 | CONFIG_CRC32_SLICEBY8=y 1148 | # CONFIG_CRC32_SLICEBY4 is not set 1149 | # CONFIG_CRC32_SARWATE is not set 1150 | # CONFIG_CRC32_BIT is not set 1151 | # CONFIG_CRC64 is not set 1152 | # CONFIG_CRC4 is not set 1153 | # CONFIG_CRC7 is not set 1154 | # CONFIG_LIBCRC32C is not set 1155 | # CONFIG_CRC8 is not set 1156 | CONFIG_XXHASH=y 1157 | # CONFIG_RANDOM32_SELFTEST is not set 1158 | CONFIG_ZLIB_INFLATE=y 1159 | CONFIG_LZO_DECOMPRESS=y 1160 | CONFIG_LZ4_DECOMPRESS=y 1161 | CONFIG_ZSTD_COMMON=y 1162 | CONFIG_ZSTD_DECOMPRESS=y 1163 | CONFIG_XZ_DEC=y 1164 | CONFIG_XZ_DEC_X86=y 1165 | CONFIG_XZ_DEC_POWERPC=y 1166 | CONFIG_XZ_DEC_ARM=y 1167 | CONFIG_XZ_DEC_ARMTHUMB=y 1168 | CONFIG_XZ_DEC_SPARC=y 1169 | # CONFIG_XZ_DEC_MICROLZMA is not set 1170 | CONFIG_XZ_DEC_BCJ=y 1171 | # CONFIG_XZ_DEC_TEST is not set 1172 | CONFIG_DECOMPRESS_GZIP=y 1173 | CONFIG_DECOMPRESS_BZIP2=y 1174 | CONFIG_DECOMPRESS_LZMA=y 1175 | CONFIG_DECOMPRESS_XZ=y 1176 | CONFIG_DECOMPRESS_LZO=y 1177 | CONFIG_DECOMPRESS_LZ4=y 1178 | CONFIG_DECOMPRESS_ZSTD=y 1179 | CONFIG_HAS_IOMEM=y 1180 | CONFIG_HAS_IOPORT=y 1181 | CONFIG_HAS_IOPORT_MAP=y 1182 | CONFIG_HAS_DMA=y 1183 | CONFIG_NEED_SG_DMA_LENGTH=y 1184 | CONFIG_NEED_DMA_MAP_STATE=y 1185 | CONFIG_ARCH_DMA_ADDR_T_64BIT=y 1186 | CONFIG_SWIOTLB=y 1187 | # CONFIG_SWIOTLB_DYNAMIC is not set 1188 | # CONFIG_DMA_API_DEBUG is not set 1189 | # CONFIG_IRQ_POLL is not set 1190 | CONFIG_HAVE_GENERIC_VDSO=y 1191 | CONFIG_GENERIC_GETTIMEOFDAY=y 1192 | CONFIG_GENERIC_VDSO_TIME_NS=y 1193 | CONFIG_ARCH_HAS_PMEM_API=y 1194 | CONFIG_ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION=y 1195 | CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y 1196 | CONFIG_ARCH_HAS_COPY_MC=y 1197 | CONFIG_ARCH_STACKWALK=y 1198 | # CONFIG_LWQ_TEST is not set 1199 | # end of Library routines 1200 | 1201 | # 1202 | # Kernel hacking 1203 | # 1204 | 1205 | # 1206 | # printk and dmesg options 1207 | # 1208 | CONFIG_PRINTK_TIME=y 1209 | # CONFIG_PRINTK_CALLER is not set 1210 | # CONFIG_STACKTRACE_BUILD_ID is not set 1211 | CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 1212 | CONFIG_CONSOLE_LOGLEVEL_QUIET=4 1213 | CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 1214 | # CONFIG_BOOT_PRINTK_DELAY is not set 1215 | # CONFIG_SYMBOLIC_ERRNAME is not set 1216 | # end of printk and dmesg options 1217 | 1218 | CONFIG_DEBUG_KERNEL=y 1219 | # CONFIG_DEBUG_MISC is not set 1220 | 1221 | # 1222 | # Compile-time checks and compiler options 1223 | # 1224 | CONFIG_AS_HAS_NON_CONST_ULEB128=y 1225 | CONFIG_DEBUG_INFO_NONE=y 1226 | # CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set 1227 | # CONFIG_DEBUG_INFO_DWARF4 is not set 1228 | # CONFIG_DEBUG_INFO_DWARF5 is not set 1229 | CONFIG_FRAME_WARN=1024 1230 | # CONFIG_STRIP_ASM_SYMS is not set 1231 | # CONFIG_READABLE_ASM is not set 1232 | # CONFIG_HEADERS_INSTALL is not set 1233 | # CONFIG_DEBUG_SECTION_MISMATCH is not set 1234 | # CONFIG_SECTION_MISMATCH_WARN_ONLY is not set 1235 | # CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set 1236 | CONFIG_OBJTOOL=y 1237 | # CONFIG_VMLINUX_MAP is not set 1238 | # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set 1239 | # end of Compile-time checks and compiler options 1240 | 1241 | # 1242 | # Generic Kernel Debugging Instruments 1243 | # 1244 | # CONFIG_MAGIC_SYSRQ is not set 1245 | # CONFIG_DEBUG_FS is not set 1246 | CONFIG_HAVE_ARCH_KGDB=y 1247 | # CONFIG_KGDB is not set 1248 | CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y 1249 | # CONFIG_UBSAN is not set 1250 | CONFIG_HAVE_ARCH_KCSAN=y 1251 | CONFIG_HAVE_KCSAN_COMPILER=y 1252 | # CONFIG_KCSAN is not set 1253 | # end of Generic Kernel Debugging Instruments 1254 | 1255 | # 1256 | # Networking Debugging 1257 | # 1258 | # end of Networking Debugging 1259 | 1260 | # 1261 | # Memory Debugging 1262 | # 1263 | # CONFIG_PAGE_EXTENSION is not set 1264 | # CONFIG_DEBUG_PAGEALLOC is not set 1265 | # CONFIG_PAGE_OWNER is not set 1266 | # CONFIG_PAGE_TABLE_CHECK is not set 1267 | # CONFIG_PAGE_POISONING is not set 1268 | # CONFIG_DEBUG_RODATA_TEST is not set 1269 | CONFIG_ARCH_HAS_DEBUG_WX=y 1270 | # CONFIG_DEBUG_WX is not set 1271 | CONFIG_GENERIC_PTDUMP=y 1272 | CONFIG_HAVE_DEBUG_KMEMLEAK=y 1273 | # CONFIG_DEBUG_KMEMLEAK is not set 1274 | # CONFIG_DEBUG_OBJECTS is not set 1275 | # CONFIG_DEBUG_STACK_USAGE is not set 1276 | # CONFIG_SCHED_STACK_END_CHECK is not set 1277 | CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y 1278 | # CONFIG_DEBUG_VM is not set 1279 | # CONFIG_DEBUG_VM_PGTABLE is not set 1280 | CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y 1281 | # CONFIG_DEBUG_VIRTUAL is not set 1282 | # CONFIG_DEBUG_MEMORY_INIT is not set 1283 | CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y 1284 | # CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set 1285 | CONFIG_HAVE_ARCH_KASAN=y 1286 | CONFIG_HAVE_ARCH_KASAN_VMALLOC=y 1287 | CONFIG_CC_HAS_KASAN_GENERIC=y 1288 | CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y 1289 | CONFIG_HAVE_ARCH_KFENCE=y 1290 | # CONFIG_KFENCE is not set 1291 | CONFIG_HAVE_ARCH_KMSAN=y 1292 | # end of Memory Debugging 1293 | 1294 | # CONFIG_DEBUG_SHIRQ is not set 1295 | 1296 | # 1297 | # Debug Oops, Lockups and Hangs 1298 | # 1299 | # CONFIG_PANIC_ON_OOPS is not set 1300 | CONFIG_PANIC_ON_OOPS_VALUE=0 1301 | CONFIG_PANIC_TIMEOUT=0 1302 | # CONFIG_SOFTLOCKUP_DETECTOR is not set 1303 | # CONFIG_HARDLOCKUP_DETECTOR is not set 1304 | CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y 1305 | # CONFIG_DETECT_HUNG_TASK is not set 1306 | # CONFIG_WQ_WATCHDOG is not set 1307 | # CONFIG_WQ_CPU_INTENSIVE_REPORT is not set 1308 | # end of Debug Oops, Lockups and Hangs 1309 | 1310 | # 1311 | # Scheduler Debugging 1312 | # 1313 | # end of Scheduler Debugging 1314 | 1315 | # CONFIG_DEBUG_TIMEKEEPING is not set 1316 | 1317 | # 1318 | # Lock Debugging (spinlocks, mutexes, etc...) 1319 | # 1320 | CONFIG_LOCK_DEBUGGING_SUPPORT=y 1321 | # CONFIG_PROVE_LOCKING is not set 1322 | # CONFIG_LOCK_STAT is not set 1323 | # CONFIG_DEBUG_SPINLOCK is not set 1324 | # CONFIG_DEBUG_MUTEXES is not set 1325 | # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set 1326 | # CONFIG_DEBUG_RWSEMS is not set 1327 | # CONFIG_DEBUG_LOCK_ALLOC is not set 1328 | # CONFIG_DEBUG_ATOMIC_SLEEP is not set 1329 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set 1330 | # CONFIG_LOCK_TORTURE_TEST is not set 1331 | # CONFIG_WW_MUTEX_SELFTEST is not set 1332 | # CONFIG_SCF_TORTURE_TEST is not set 1333 | # CONFIG_CSD_LOCK_WAIT_DEBUG is not set 1334 | # end of Lock Debugging (spinlocks, mutexes, etc...) 1335 | 1336 | # CONFIG_NMI_CHECK_CPU is not set 1337 | # CONFIG_DEBUG_IRQFLAGS is not set 1338 | # CONFIG_STACKTRACE is not set 1339 | # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set 1340 | # CONFIG_DEBUG_KOBJECT is not set 1341 | 1342 | # 1343 | # Debug kernel data structures 1344 | # 1345 | # CONFIG_DEBUG_LIST is not set 1346 | # CONFIG_DEBUG_PLIST is not set 1347 | # CONFIG_DEBUG_SG is not set 1348 | # CONFIG_DEBUG_NOTIFIERS is not set 1349 | # CONFIG_DEBUG_MAPLE_TREE is not set 1350 | # end of Debug kernel data structures 1351 | 1352 | # 1353 | # RCU Debugging 1354 | # 1355 | # CONFIG_RCU_SCALE_TEST is not set 1356 | # CONFIG_RCU_TORTURE_TEST is not set 1357 | # CONFIG_RCU_REF_SCALE_TEST is not set 1358 | # CONFIG_RCU_TRACE is not set 1359 | # CONFIG_RCU_EQS_DEBUG is not set 1360 | # end of RCU Debugging 1361 | 1362 | # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set 1363 | CONFIG_USER_STACKTRACE_SUPPORT=y 1364 | CONFIG_HAVE_RETHOOK=y 1365 | CONFIG_HAVE_FUNCTION_TRACER=y 1366 | CONFIG_HAVE_DYNAMIC_FTRACE=y 1367 | CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y 1368 | CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y 1369 | CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y 1370 | CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y 1371 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y 1372 | CONFIG_HAVE_SYSCALL_TRACEPOINTS=y 1373 | CONFIG_HAVE_FENTRY=y 1374 | CONFIG_HAVE_OBJTOOL_MCOUNT=y 1375 | CONFIG_HAVE_OBJTOOL_NOP_MCOUNT=y 1376 | CONFIG_HAVE_C_RECORDMCOUNT=y 1377 | CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y 1378 | CONFIG_TRACING_SUPPORT=y 1379 | # CONFIG_FTRACE is not set 1380 | # CONFIG_SAMPLES is not set 1381 | CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y 1382 | CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y 1383 | CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y 1384 | 1385 | # 1386 | # x86 Debugging 1387 | # 1388 | CONFIG_X86_VERBOSE_BOOTUP=y 1389 | CONFIG_EARLY_PRINTK=y 1390 | # CONFIG_DEBUG_TLBFLUSH is not set 1391 | CONFIG_HAVE_MMIOTRACE_SUPPORT=y 1392 | # CONFIG_X86_DECODER_SELFTEST is not set 1393 | CONFIG_IO_DELAY_0X80=y 1394 | # CONFIG_IO_DELAY_0XED is not set 1395 | # CONFIG_IO_DELAY_UDELAY is not set 1396 | # CONFIG_IO_DELAY_NONE is not set 1397 | # CONFIG_CPA_DEBUG is not set 1398 | # CONFIG_DEBUG_ENTRY is not set 1399 | # CONFIG_DEBUG_NMI_SELFTEST is not set 1400 | # CONFIG_X86_DEBUG_FPU is not set 1401 | # CONFIG_UNWINDER_ORC is not set 1402 | # CONFIG_UNWINDER_FRAME_POINTER is not set 1403 | CONFIG_UNWINDER_GUESS=y 1404 | # end of x86 Debugging 1405 | 1406 | # 1407 | # Kernel Testing and Coverage 1408 | # 1409 | # CONFIG_KUNIT is not set 1410 | # CONFIG_NOTIFIER_ERROR_INJECTION is not set 1411 | # CONFIG_FAULT_INJECTION is not set 1412 | CONFIG_ARCH_HAS_KCOV=y 1413 | CONFIG_CC_HAS_SANCOV_TRACE_PC=y 1414 | # CONFIG_KCOV is not set 1415 | # CONFIG_RUNTIME_TESTING_MENU is not set 1416 | CONFIG_ARCH_USE_MEMTEST=y 1417 | # CONFIG_MEMTEST is not set 1418 | # end of Kernel Testing and Coverage 1419 | 1420 | # 1421 | # Rust hacking 1422 | # 1423 | # end of Rust hacking 1424 | # end of Kernel hacking 1425 | --------------------------------------------------------------------------------