├── .gitignore ├── serial.h ├── mptable.h ├── vcpu.h ├── gdt.h ├── memory.h ├── ioeventfd.h ├── string.h ├── README.md ├── virtio-blk.h ├── iobus.h ├── virtqueue.h ├── global.h ├── pci.h ├── virtio-pci.h ├── Makefile ├── virtqueue.c ├── string.c ├── iobus.c ├── gdt.c ├── bootparams.h ├── ioeventfd.c ├── memory.c ├── list.h ├── mpspec_def.h ├── bootparams.c ├── virtio-blk.c ├── pci.c ├── mptable.c ├── main.c ├── virtio-pci.c ├── vcpu.c ├── serial.c └── config ├── busybox.config └── kernel.config /.gitignore: -------------------------------------------------------------------------------- 1 | *.o 2 | out 3 | microv 4 | -------------------------------------------------------------------------------- /serial.h: -------------------------------------------------------------------------------- 1 | #ifndef MICROV_SERIAL_H 2 | #define MICROV_SERIAL_H 3 | 4 | void create_serial_dev(int vmfd); 5 | 6 | #endif /* MICROV_SERIAL_H */ 7 | -------------------------------------------------------------------------------- /mptable.h: -------------------------------------------------------------------------------- 1 | #ifndef MICROV_MPTABLE_H 2 | #define MICROV_MPTABLE_H 3 | 4 | void setup_mptable(int num_cpus); 5 | void _test_mptable(); 6 | 7 | #endif /* MICROV_MPTABLE_H */ 8 | -------------------------------------------------------------------------------- /vcpu.h: -------------------------------------------------------------------------------- 1 | #ifndef MICROV_VCPU_H 2 | #define MICROV_VCPU_H 3 | 4 | void setup_vcpu(int kvm_fd, int vcpu_fd, int vcpu_count, int vcpu_id); 5 | void reset_vcpu(int kvm_fd, int vcpu_fd, int vcpu_count, int vcpu_id); 6 | 7 | #endif /* MICROV_VCPU_H */ 8 | -------------------------------------------------------------------------------- /gdt.h: -------------------------------------------------------------------------------- 1 | #ifndef MICROV_GDT_H 2 | #define MICROV_GDT_H 3 | #include 4 | 5 | void setup_gdt(); 6 | void setup_idt(); 7 | struct kvm_segment get_code_kvm_seg(); 8 | struct kvm_segment get_data_kvm_seg(); 9 | uint16_t get_gdt_limit(); 10 | uint16_t get_idt_limit(); 11 | void _test_gdt(); 12 | 13 | #endif /* MICROV_GDT_H */ 14 | -------------------------------------------------------------------------------- /memory.h: -------------------------------------------------------------------------------- 1 | #ifndef MICROV_MEMORY_H 2 | #define MICROV_MEMORY_H 3 | 4 | #include 5 | 6 | int init_memory_map(int vmfd, uint64_t ram_size); 7 | uint64_t get_gap_start(); 8 | uint64_t get_gap_end(); 9 | uint64_t get_ram_end(); 10 | void write_userspace_memory(void *src, uint64_t guest_addr, uint64_t len); 11 | uint64_t get_userspace_addr(uint64_t guest_addr); 12 | 13 | #endif /* MICROV_MEMORY_H */ 14 | -------------------------------------------------------------------------------- /ioeventfd.h: -------------------------------------------------------------------------------- 1 | #ifndef MICROV_IOEVENTFD_H 2 | #define MICROV_IOEVENTFD_H 3 | 4 | #include 5 | #include "list.h" 6 | 7 | struct ioevent { 8 | struct kvm_ioeventfd kvm_ioeventfd; 9 | void *fn_ptr; 10 | struct list_head list; 11 | void(*fn)(void *ptr); 12 | }; 13 | 14 | int ioeventfd_add_event(int vmfd, struct ioevent *ioevent); 15 | int ioeventfd_init(); 16 | int ioeventfd_exit(); 17 | 18 | #endif /* MICROV_IOEVENTFD_H */ 19 | -------------------------------------------------------------------------------- /string.h: -------------------------------------------------------------------------------- 1 | #ifndef MICROV_STRING_H 2 | #define MICROV_STRING_H 3 | 4 | #include 5 | #include 6 | 7 | unsigned long strlen(const char *buf); 8 | char *strcat(char *dest, const char *src); 9 | char *strcpy(char *dest, const char *src); 10 | int strcmp(const char *a, const char *b); 11 | char *strchr(const char *s, int c); 12 | char *strstr(const char *s1, const char *s2); 13 | int memcmp(const void *s1, const void *s2, size_t n); 14 | void *memmove(void *dest, const void *src, size_t n); 15 | void *memchr(const void *s, int c, size_t n); 16 | uint8_t csum8(uint8_t *buf, uint32_t len); 17 | 18 | #endif /* MICROV_STRING_H */ 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # microv介绍: 2 | 3 | 一个简易的KVM虚拟化hypervisor(目前支持X86)。 4 | 实现了一个能够引导linux操作系统的linux boot规范,或者说实现了无bios引导linux系统。 5 | 实现了KVM虚拟化的最基础CPU、内存、IO陷入陷出处理。 6 | 实现了一个串口设备,用以和操作系统交互。 7 | 实现了PCI总线。 8 | 实现了基于PCI总线的virtio-blk。 9 | 10 | # 作用: 11 | 12 | 用以KVM虚拟化和计算机体系结构的学习例子; 13 | 理解bios如何引导linux系统;理解X86的实模式和保护模式;理解KVM虚拟化的基本原理。 14 | 15 | # 参考: 16 | 17 | firecracker-microvm stratovirt 18 | 19 | # 编译: 20 | 21 | ```shell 22 | 编译代码、内核、initrd: 23 | cd microv; make all 24 | 只编译代码: 25 | cd microv; make 26 | ``` 27 | 28 | # 运行: 29 | 30 | ```shell 31 | ./microv -k ./out/vmlinux.bin -i ./out/initrd.img -d ./out/disk.img 32 | ``` 33 | 34 | ## END.如有交流请联系作者 35 | 36 | email:isclouder@163.com 37 | 微信:kvmvirt 38 | -------------------------------------------------------------------------------- /virtio-blk.h: -------------------------------------------------------------------------------- 1 | #ifndef MICROV_VIRTIO_BLK_H 2 | #define MICROV_VIRTIO_BLK_H 3 | 4 | #include 5 | #include "virtio-pci.h" 6 | 7 | #define VIRTIO_BLK_VIRTQUEUE_NUM 1 8 | 9 | struct diskimg { 10 | int fd; 11 | size_t size; 12 | }; 13 | 14 | struct virtio_blk_dev { 15 | struct virtio_pci_dev virtio_pci_dev; 16 | struct virtio_blk_config config; 17 | struct virtq vq[VIRTIO_BLK_VIRTQUEUE_NUM]; 18 | int irqfd; 19 | int irq_num; 20 | int ioevent_fd; 21 | pthread_t io_thread; 22 | struct diskimg *diskimg; 23 | }; 24 | 25 | struct virtio_blk_req { 26 | struct virtio_blk_outhdr hdr; 27 | uint8_t *data; 28 | }; 29 | 30 | int diskimg_init(struct diskimg *diskimg, const char *file_path); 31 | void diskimg_exit(struct diskimg *diskimg); 32 | 33 | void virtio_blk_exit(struct virtio_blk_dev *dev); 34 | void virtio_blk_init_pci(int vmfd, 35 | struct virtio_blk_dev *dev, 36 | struct diskimg *diskimg); 37 | 38 | #endif /* MICROV_VIRTIO_BLK_H */ 39 | -------------------------------------------------------------------------------- /iobus.h: -------------------------------------------------------------------------------- 1 | #ifndef MICROV_IOBUS_H 2 | #define MICROV_IOBUS_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | typedef void (*region_io_fn)(uint64_t offset, 9 | uint8_t size, 10 | void *data, 11 | uint8_t is_write, 12 | void *owner); 13 | 14 | struct region { 15 | struct bus *bus; 16 | uint64_t base; 17 | uint64_t len; 18 | void *owner; 19 | region_io_fn handle_io; 20 | struct region *next; 21 | }; 22 | 23 | struct bus { 24 | uint64_t region_count; 25 | struct region *head; 26 | }; 27 | 28 | struct region *iobus_find_region(struct bus *bus, uint64_t addr); 29 | void iobus_register_region(struct bus *bus, struct region *region); 30 | void iobus_deregister_region(struct region *region); 31 | void iobus_init(); 32 | void region_init(struct region *region, uint64_t base, 33 | uint64_t len, void *owner, region_io_fn do_io); 34 | void iobus_handle_pio(struct kvm_run *run); 35 | void iobus_handle_mmio(struct kvm_run *run); 36 | 37 | #endif /* MICROV_IOBUS_H */ 38 | -------------------------------------------------------------------------------- /virtqueue.h: -------------------------------------------------------------------------------- 1 | #ifndef MICROV_VIRTQUEUE_H 2 | #define MICROV_VIRTQUEUE_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | struct virtq; 9 | typedef void (*virtio_output_fn)(struct virtq *); 10 | 11 | struct virtq_info { 12 | uint16_t size; 13 | uint16_t msix_vector; 14 | uint16_t enable; 15 | uint16_t notify_off; 16 | uint64_t desc_addr; 17 | uint64_t driver_addr; 18 | uint64_t device_addr; 19 | } __attribute__((packed)); 20 | 21 | struct virtq { 22 | struct vring_packed_desc *desc_ring; 23 | struct vring_packed_desc_event *device_event; 24 | struct vring_packed_desc_event *guest_event; 25 | struct virtq_info info; 26 | void *dev; 27 | uint16_t next_avail_idx; 28 | bool used_wrap_count; 29 | virtio_output_fn handle_output; 30 | }; 31 | 32 | void virtq_notify(struct virtq *vq); 33 | void virtq_init(struct virtq *vq, void *dev, uint16_t queue_size, virtio_output_fn handle_output); 34 | void virtq_enable(struct virtq *vq); 35 | bool virtq_check_next(struct vring_packed_desc *desc); 36 | struct vring_packed_desc *virtq_get_avail(struct virtq *vq); 37 | void virtq_handle_avail(struct virtq *vq); 38 | 39 | 40 | #endif /* MICROV_VIRTQUEUE_H */ 41 | -------------------------------------------------------------------------------- /global.h: -------------------------------------------------------------------------------- 1 | #ifndef MICROV_GLOBAL_H 2 | #define MICROV_GLOBAL_H 3 | 4 | #include 5 | 6 | #define RAM_SIZE 0x20000000 7 | 8 | #define INITRD_ADDR_MAX 0x37ffffff 9 | 10 | #define APIC_DEFAULT_PHYS_BASE 0xfee00000 11 | #define IO_APIC_DEFAULT_PHYS_BASE 0xfec00000 12 | 13 | #define VMLINUX_START 0x01000000 14 | #define VMLINUX_RAM_START 0x00100000 15 | #define MB_BIOS_START 0x000f0000 16 | #define VGA_RAM_START 0x000a0000 17 | #define MPTABLE_START 0x0009fc00 18 | #define CMDLINE_START 0x00020000 19 | #define PDE_START 0x0000b000 20 | #define PDPTE_START 0x0000a000 21 | #define PML4_START 0x00009000 22 | #define BOOT_LOADER_SP 0x00008ff0 23 | #define ZERO_PAGE_START 0x00007000 24 | #define BOOT_IDT_START 0x00000520 25 | #define BOOT_GDT_START 0x00000500 26 | #define REAL_MODE_IVT_START 0x00000000 27 | 28 | //io space 29 | #define IO_PCI_CONFIG_DATA_START 0x00000CFC 30 | #define IO_PCI_CONFIG_DATA_SIZE 0x00000004 31 | #define IO_PCI_CONFIG_ADDR_START 0x00000CF8 32 | #define IO_PCI_CONFIG_ADDR_SIZE 0x00000004 33 | #define IO_SERIAL_START 0x000003f8 34 | #define IO_SERIAL_SIZE 0x00000008 35 | 36 | #endif /* MICROV_GLOBAL_H */ 37 | -------------------------------------------------------------------------------- /pci.h: -------------------------------------------------------------------------------- 1 | #ifndef MICROV_PCI_H 2 | #define MICROV_PCI_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | #include "iobus.h" 9 | 10 | union pci_config_address { 11 | struct { 12 | unsigned reg_offset : 2; 13 | unsigned reg_num : 6; 14 | unsigned func_num : 3; 15 | unsigned dev_num : 5; 16 | unsigned bus_num : 8; 17 | unsigned reserved : 7; 18 | unsigned enable_bit : 1; 19 | }; 20 | uint32_t value; 21 | }; 22 | 23 | #define PCI_HDR_READ(hdr, offset, width) (*((uint##width##_t *) (hdr + offset))) 24 | #define PCI_HDR_WRITE(hdr, offset, value, width) \ 25 | ((uint##width##_t *) (hdr + offset))[0] = value 26 | #define PCI_BAR_OFFSET(bar) (PCI_BASE_ADDRESS_0 + ((bar) << 2)) 27 | 28 | struct pci_dev { 29 | uint8_t cfg_space[PCI_CFG_SPACE_SIZE]; 30 | void *hdr; 31 | struct region config_region; 32 | struct region bar_region[PCI_STD_NUM_BARS]; 33 | uint32_t bar_size[PCI_STD_NUM_BARS]; 34 | bool bar_active[PCI_STD_NUM_BARS]; 35 | bool bar_is_io_space[PCI_STD_NUM_BARS]; 36 | }; 37 | 38 | void pcibus_init(); 39 | void pci_init_bar(struct pci_dev *dev, 40 | uint8_t bar, 41 | uint32_t bar_size, 42 | bool is_io_space, 43 | region_io_fn do_io); 44 | 45 | void pci_dev_init(struct pci_dev *dev); 46 | 47 | #endif /* MICROV_PCI_H */ 48 | -------------------------------------------------------------------------------- /virtio-pci.h: -------------------------------------------------------------------------------- 1 | #ifndef MICROV_VIRTIO_PCI_H 2 | #define MICROV_VIRTIO_PCI_H 3 | 4 | #include 5 | 6 | #include "pci.h" 7 | #include "virtqueue.h" 8 | 9 | struct virtio_pci_isr_cfg { 10 | uint32_t isr_status; 11 | }; 12 | 13 | struct virtio_pci_notify_cfg { 14 | uint16_t vqn; 15 | uint16_t next; 16 | } __attribute__((packed)); 17 | 18 | struct virtio_pci_config { 19 | struct virtio_pci_common_cfg common_cfg; 20 | struct virtio_pci_isr_cfg isr_cfg; 21 | struct virtio_pci_notify_cfg notify_cfg; 22 | void *dev_cfg; 23 | }; 24 | 25 | struct virtio_pci_dev { 26 | int vmfd; 27 | struct pci_dev pci_dev; 28 | struct virtio_pci_config config; 29 | uint64_t device_feature; 30 | uint64_t guest_feature; 31 | struct virtio_pci_notify_cap *notify_cap; 32 | struct virtio_pci_cap *dev_cfg_cap; 33 | struct virtq *vq; 34 | }; 35 | 36 | void virtio_pci_set_dev_cfg(struct virtio_pci_dev *virtio_pci_dev, 37 | void *dev_cfg, 38 | uint8_t len); 39 | void virtio_pci_set_virtq_cfg(struct virtio_pci_dev *dev, 40 | struct virtq *vq, 41 | uint16_t num_queues); 42 | void virtio_pci_enable(struct virtio_pci_dev *dev); 43 | void virtio_pci_init(int vmfd, 44 | struct virtio_pci_dev *dev, 45 | uint16_t device_id, 46 | uint32_t class, 47 | uint8_t irq_line); 48 | 49 | #endif /* MICROV_VIRTIO_PCI_H */ 50 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | TARGET = microv 2 | 3 | OBJECT = main.o 4 | OBJECT += memory.o 5 | OBJECT += mptable.o 6 | OBJECT += bootparams.o 7 | OBJECT += gdt.o 8 | OBJECT += vcpu.o 9 | OBJECT += serial.o 10 | OBJECT += string.o 11 | OBJECT += iobus.o 12 | OBJECT += pci.o 13 | OBJECT += virtio-pci.o 14 | OBJECT += virtio-blk.o 15 | OBJECT += virtqueue.o 16 | OBJECT += ioeventfd.o 17 | 18 | CC = gcc 19 | CXXFLAG = -Wno-int-to-pointer-cast 20 | LDFLAG = -lpthread 21 | 22 | PWD=$(shell pwd) 23 | CONFIG = ${PWD}/config 24 | OUT = ${PWD}/out 25 | 26 | LINUX_VER = 5.19.9 27 | LINUX_SRC_URL = https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-${LINUX_VER}.tar.xz 28 | LINUX_SRC = $(OUT)/linux-${LINUX_VER} 29 | 30 | BUSYBOX_VER = 1.34.1 31 | BUSYBOX_SRC_URL = https://busybox.net/downloads/busybox-${BUSYBOX_VER}.tar.bz2 32 | BUSYBOX_SRC = $(OUT)/busybox-${BUSYBOX_VER} 33 | 34 | $(TARGET):$(OBJECT) 35 | $(CC) $(CXXFLAG) $^ -o $@ $(LDFLAG) 36 | 37 | vmlinux.bin: 38 | mkdir -p ${OUT} 39 | wget -O ${OUT}/$(shell basename ${LINUX_SRC_URL}) --show-progress ${LINUX_SRC_URL} 40 | tar -xf ${OUT}/$(shell basename ${LINUX_SRC_URL}) -C ${OUT} 41 | cp -f ${CONFIG}/kernel.config ${LINUX_SRC}/.config 42 | cd ${LINUX_SRC} ; $(MAKE) ARCH=x86 bzImage 43 | objcopy -O binary ${LINUX_SRC}/vmlinux $(OUT)/$@ 44 | 45 | initrd.img: 46 | mkdir -p ${OUT} 47 | wget -O ${OUT}/$(shell basename ${BUSYBOX_SRC_URL}) --show-progress ${BUSYBOX_SRC_URL} 48 | tar -jxf ${OUT}/$(shell basename ${BUSYBOX_SRC_URL}) -C ${OUT} 49 | cp -f ${CONFIG}/busybox.config ${BUSYBOX_SRC}/.config 50 | cd ${BUSYBOX_SRC} ; $(MAKE) install 51 | cd ${BUSYBOX_SRC}/_install ; find . | cpio -o --format=newc > $(OUT)/$@ 52 | 53 | disk.img: 54 | mkdir -p ${OUT} 55 | dd if=/dev/zero of=$(OUT)/$@ bs=4k count=1024 56 | mkfs.ext4 -F $(OUT)/$@ 57 | 58 | all:$(TARGET) vmlinux.bin initrd.img disk.img 59 | 60 | clean: 61 | rm -rf *.o out microv 62 | 63 | -------------------------------------------------------------------------------- /virtqueue.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | #include "memory.h" 7 | #include "virtqueue.h" 8 | 9 | void virtq_notify(struct virtq *vq) 10 | { 11 | if (!vq->info.enable) 12 | return; 13 | vq->handle_output(vq); 14 | } 15 | 16 | void virtq_init(struct virtq *vq, void *dev, 17 | uint16_t queue_size, virtio_output_fn handle_output) 18 | { 19 | vq->info.size = queue_size; 20 | vq->info.notify_off = 0; 21 | vq->info.enable = 0; 22 | vq->next_avail_idx = 0; 23 | vq->used_wrap_count = 1; 24 | vq->dev = dev; 25 | vq->handle_output = handle_output; 26 | } 27 | 28 | void virtq_enable(struct virtq *vq) 29 | { 30 | if (vq->info.enable) 31 | return; 32 | vq->info.enable = true; 33 | 34 | vq->desc_ring = (struct vring_packed_desc *) get_userspace_addr( 35 | (uint64_t) vq->info.desc_addr); 36 | vq->guest_event = (struct vring_packed_desc_event *) get_userspace_addr( 37 | (uint64_t) vq->info.driver_addr); 38 | vq->device_event = (struct vring_packed_desc_event *) get_userspace_addr( 39 | (uint64_t) vq->info.device_addr); 40 | } 41 | 42 | bool virtq_check_next(struct vring_packed_desc *desc) 43 | { 44 | return desc->flags & VRING_DESC_F_NEXT; 45 | } 46 | 47 | struct vring_packed_desc *virtq_get_avail(struct virtq *vq) 48 | { 49 | struct vring_packed_desc *desc = &vq->desc_ring[vq->next_avail_idx]; 50 | uint16_t flags = desc->flags; 51 | bool avail = flags & (1ULL << VRING_PACKED_DESC_F_AVAIL); 52 | bool used = flags & (1ULL << VRING_PACKED_DESC_F_USED); 53 | 54 | if (avail != vq->used_wrap_count || used == vq->used_wrap_count) { 55 | return NULL; 56 | } 57 | vq->next_avail_idx++; 58 | if (vq->next_avail_idx >= vq->info.size) { 59 | vq->next_avail_idx -= vq->info.size; 60 | vq->used_wrap_count ^= 1; 61 | } 62 | return desc; 63 | } 64 | 65 | -------------------------------------------------------------------------------- /string.c: -------------------------------------------------------------------------------- 1 | #include "string.h" 2 | 3 | unsigned long strlen(const char *buf) 4 | { 5 | unsigned long len = 0; 6 | 7 | while (*buf++) 8 | ++len; 9 | return len; 10 | } 11 | 12 | char *strcat(char *dest, const char *src) 13 | { 14 | char *p = dest; 15 | 16 | while (*p) 17 | ++p; 18 | while ((*p++ = *src++) != 0) 19 | ; 20 | return dest; 21 | } 22 | 23 | char *strcpy(char *dest, const char *src) 24 | { 25 | *dest = 0; 26 | return strcat(dest, src); 27 | } 28 | 29 | int strcmp(const char *a, const char *b) 30 | { 31 | while (*a == *b) { 32 | if (*a == '\0') { 33 | break; 34 | } 35 | ++a, ++b; 36 | } 37 | return *a - *b; 38 | } 39 | 40 | char *strchr(const char *s, int c) 41 | { 42 | while (*s != (char)c) 43 | if (*s++ == '\0') 44 | return NULL; 45 | return (char *)s; 46 | } 47 | 48 | char *strstr(const char *s1, const char *s2) 49 | { 50 | size_t l1, l2; 51 | 52 | l2 = strlen(s2); 53 | if (!l2) 54 | return (char *)s1; 55 | l1 = strlen(s1); 56 | while (l1 >= l2) { 57 | l1--; 58 | if (!memcmp(s1, s2, l2)) 59 | return (char *)s1; 60 | s1++; 61 | } 62 | return NULL; 63 | } 64 | 65 | int memcmp(const void *s1, const void *s2, size_t n) 66 | { 67 | const unsigned char *a = s1, *b = s2; 68 | int ret = 0; 69 | 70 | while (n--) { 71 | ret = *a - *b; 72 | if (ret) 73 | break; 74 | ++a, ++b; 75 | } 76 | return ret; 77 | } 78 | 79 | void *memmove(void *dest, const void *src, size_t n) 80 | { 81 | const unsigned char *s = src; 82 | unsigned char *d = dest; 83 | 84 | if (d <= s) { 85 | while (n--) 86 | *d++ = *s++; 87 | } else { 88 | d += n, s += n; 89 | while (n--) 90 | *--d = *--s; 91 | } 92 | return dest; 93 | } 94 | 95 | void *memchr(const void *s, int c, size_t n) 96 | { 97 | const unsigned char *str = s, chr = (unsigned char)c; 98 | 99 | while (n--) 100 | if (*str++ == chr) 101 | return (void *)(str - 1); 102 | return NULL; 103 | } 104 | 105 | long atol(const char *ptr) 106 | { 107 | long acc = 0; 108 | const char *s = ptr; 109 | int neg, c; 110 | 111 | while (*s == ' ' || *s == '\t') 112 | s++; 113 | if (*s == '-'){ 114 | neg = 1; 115 | s++; 116 | } else { 117 | neg = 0; 118 | if (*s == '+') 119 | s++; 120 | } 121 | 122 | while (*s) { 123 | if (*s < '0' || *s > '9') 124 | break; 125 | c = *s - '0'; 126 | acc = acc * 10 + c; 127 | s++; 128 | } 129 | 130 | if (neg) 131 | acc = -acc; 132 | 133 | return acc; 134 | } 135 | 136 | uint8_t csum8(uint8_t *buf, uint32_t len) 137 | { 138 | uint32_t s = 0; 139 | while (len-- > 0) 140 | s += *buf++; 141 | return s; 142 | } 143 | -------------------------------------------------------------------------------- /iobus.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #include "global.h" 6 | #include "iobus.h" 7 | 8 | struct bus pio_bus; 9 | struct bus mmio_bus; 10 | 11 | struct region *iobus_find_region(struct bus *bus, uint64_t addr) 12 | { 13 | struct region **p; 14 | p = &(bus->head); 15 | 16 | for (; *p; p = &(*p)->next) { 17 | uint64_t start = (*p)->base; 18 | uint64_t end = start + (*p)->len - 1; 19 | if (addr >= start && addr <= end) 20 | return *p; 21 | } 22 | return NULL; 23 | } 24 | 25 | void iobus_register_region(struct bus *bus, struct region *region) 26 | { 27 | struct bus *p = bus; 28 | 29 | region->next = p->head; 30 | p->head = region; 31 | p->region_count++; 32 | 33 | region->bus = p; 34 | } 35 | 36 | void iobus_deregister_region(struct region *region) 37 | { 38 | if (region->bus == NULL) { 39 | return; 40 | } 41 | 42 | struct region **p = &(region->bus->head); 43 | 44 | while (*p != region && *p) { 45 | p = &(*p)->next; 46 | } 47 | 48 | if (*p) 49 | *p = (*p)->next; 50 | } 51 | 52 | void iobus_init() 53 | { 54 | pio_bus.region_count = 0; 55 | pio_bus.head = NULL; 56 | mmio_bus.region_count = 0; 57 | mmio_bus.head = NULL; 58 | } 59 | 60 | void region_init(struct region *region, 61 | uint64_t base, 62 | uint64_t len, 63 | void *owner, 64 | region_io_fn handle_io) 65 | { 66 | region->bus = NULL; 67 | region->base = base; 68 | region->len = len; 69 | region->owner = owner; 70 | region->handle_io = handle_io; 71 | region->next = NULL; 72 | } 73 | 74 | static void bus_handle_io(struct bus *bus, 75 | uint64_t addr, 76 | uint8_t size, 77 | void *data, 78 | uint8_t is_write) 79 | { 80 | struct region *region = iobus_find_region(bus, addr); 81 | 82 | if (region && addr + size - 1 <= region->base + region->len - 1) { 83 | region->handle_io(addr - region->base, size, data, is_write, region->owner); 84 | } 85 | } 86 | 87 | void iobus_handle_pio(struct kvm_run *run) 88 | { 89 | void *data = (void *) run + run->io.data_offset; 90 | bool is_write = run->io.direction == KVM_EXIT_IO_OUT; 91 | 92 | for (int i = 0; i < run->io.count; i++) { 93 | bus_handle_io(&pio_bus, 94 | run->io.port, 95 | run->io.size, 96 | data, 97 | is_write); 98 | data += run->io.size; 99 | } 100 | } 101 | 102 | void iobus_handle_mmio(struct kvm_run *run) 103 | { 104 | bus_handle_io(&mmio_bus, 105 | run->mmio.phys_addr, 106 | run->mmio.len, 107 | run->mmio.data, 108 | run->mmio.is_write); 109 | } 110 | 111 | -------------------------------------------------------------------------------- /gdt.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #include "global.h" 6 | #include "memory.h" 7 | #include "gdt.h" 8 | 9 | #define BOOT_GDT_MAX 4 10 | #define GDT_ENTRY_KERNEL_CS 2 11 | #define GDT_ENTRY_KERNEL_DS 3 12 | 13 | /* 8 byte segment descriptor */ 14 | struct desc_struct { 15 | uint16_t limit0; 16 | uint16_t base0; 17 | uint16_t base1: 8, type: 4, s: 1, dpl: 2, p: 1; 18 | uint16_t limit1: 4, avl: 1, l: 1, d: 1, g: 1, base2: 8; 19 | } __attribute__((packed)); 20 | 21 | #define GDT_ENTRY_INIT(flags, base, limit) \ 22 | { \ 23 | .limit0 = (uint16_t) (limit), \ 24 | .limit1 = ((limit) >> 16) & 0x0F, \ 25 | .base0 = (uint16_t) (base), \ 26 | .base1 = ((base) >> 16) & 0xFF, \ 27 | .base2 = ((base) >> 24) & 0xFF, \ 28 | .type = (flags & 0x0f), \ 29 | .s = (flags >> 4) & 0x01, \ 30 | .dpl = (flags >> 5) & 0x03, \ 31 | .p = (flags >> 7) & 0x01, \ 32 | .avl = (flags >> 12) & 0x01, \ 33 | .l = (flags >> 13) & 0x01, \ 34 | .d = (flags >> 14) & 0x01, \ 35 | .g = (flags >> 15) & 0x01, \ 36 | } 37 | 38 | static struct desc_struct STARTUP_GDT[BOOT_GDT_MAX] = { 39 | [0] = GDT_ENTRY_INIT(0, 0, 0), 40 | [1] = GDT_ENTRY_INIT(0, 0, 0), 41 | [GDT_ENTRY_KERNEL_CS] = GDT_ENTRY_INIT(0xa09b, 0, 0xfffff), 42 | [GDT_ENTRY_KERNEL_DS] = GDT_ENTRY_INIT(0xc093, 0, 0xfffff), 43 | }; 44 | 45 | struct kvm_segment entry_to_kvm_seg(uint64_t flags, uint64_t base, uint64_t limit) 46 | { 47 | struct kvm_segment seg; 48 | 49 | seg.base = base; 50 | seg.limit = limit; 51 | seg.type = (flags & 0xf); 52 | seg.present = ((flags >> (15 - 8)) & 0x1); 53 | seg.dpl = ((flags >> (13 - 8)) & 0x3); 54 | seg.db = ((flags >> (22 - 8)) & 0x1); 55 | seg.s = ((flags >> (12 - 8)) & 0x1); 56 | seg.l = ((flags >> (21 - 8)) & 0x1); 57 | seg.g = ((flags >> (23 - 8)) & 0x1); 58 | seg.avl = ((flags >> (20 - 8)) & 0x1); 59 | 60 | return seg; 61 | } 62 | 63 | void setup_gdt() 64 | { 65 | uint64_t boot_gdt_addr = BOOT_GDT_START; 66 | for(int i=0; i> 16 & 0x00ffffff) | (entry >> (56 - 24) & 0xff000000); 110 | uint64_t limit = (entry >> (48 - 16) & 0x000f0000) | (entry & 0x0000ffff); 111 | uint64_t flags = (entry >> 40) & 0x0000f0ff; 112 | */ 113 | fprintf(stderr, "gdt addr:%ld gdt size:%ld\n",BOOT_GDT_START, get_gdt_limit()); 114 | fprintf(stderr, "idt addr:%ld idt size:%ld\n",BOOT_IDT_START, get_idt_limit()); 115 | } 116 | 117 | -------------------------------------------------------------------------------- /bootparams.h: -------------------------------------------------------------------------------- 1 | #ifndef MICROV_BOOTPARAM_H 2 | #define MICROV_BOOTPARAM_H 3 | 4 | #include 5 | 6 | #define E820_MAX_ENTRIES_ZEROPAGE 0x80 7 | #define E820_RAM 1 8 | #define E820_RESERVED 2 9 | #define E820_ACPI 3 10 | #define E820_NVS 4 11 | #define E820_UNUSABLE 5 12 | 13 | struct boot_e820_entry { 14 | uint64_t addr; /* start of memory segment */ 15 | uint64_t size; /* size of memory segment */ 16 | uint32_t type; /* type of memory segment */ 17 | } __attribute__((packed)); 18 | 19 | struct setup_header { 20 | uint8_t setup_sects; 21 | uint16_t root_flags; 22 | uint32_t syssize; 23 | uint16_t ram_size; 24 | uint16_t vid_mode; 25 | uint16_t root_dev; 26 | uint16_t boot_flag; 27 | uint16_t jump; 28 | uint32_t header; 29 | uint16_t version; 30 | uint32_t realmode_swtch; 31 | uint16_t start_sys_seg; 32 | uint16_t kernel_version; 33 | uint8_t type_of_loader; 34 | uint8_t loadflags; 35 | uint16_t setup_move_size; 36 | uint32_t code32_start; 37 | uint32_t ramdisk_image; 38 | uint32_t ramdisk_size; 39 | uint32_t bootsect_kludge; 40 | uint16_t heap_end_ptr; 41 | uint8_t ext_loader_ver; 42 | uint8_t ext_loader_type; 43 | uint32_t cmd_line_ptr; 44 | uint32_t initrd_addr_max; 45 | uint32_t kernel_alignment; 46 | uint8_t relocatable_kernel; 47 | uint8_t min_alignment; 48 | uint16_t xloadflags; 49 | uint32_t cmdline_size; 50 | uint32_t hardware_subarch; 51 | uint64_t hardware_subarch_data; 52 | uint32_t payload_offset; 53 | uint32_t payload_length; 54 | uint64_t setup_data; 55 | uint64_t pref_address; 56 | uint32_t init_size; 57 | uint32_t handover_offset; 58 | uint32_t kernel_info_offset; 59 | } __attribute__((packed));; 60 | 61 | struct boot_params { 62 | uint8_t _pad_screen_info[0x40]; /* 0x000 */ 63 | uint8_t _pad_apm_bios_info[0x14]; /* 0x040 */ 64 | uint8_t _pad2[4]; /* 0x054 */ 65 | uint64_t tboot_addr; /* 0x058 */ 66 | uint8_t _pad_ist_info[0x10]; /* 0x060 */ 67 | uint64_t acpi_rsdp_addr; /* 0x070 */ 68 | uint8_t _pad3[8]; /* 0x078 */ 69 | uint8_t hd0_info[0x10]; /* obsolete! */ /* 0x080 */ 70 | uint8_t hd1_info[0x10]; /* obsolete! */ /* 0x090 */ 71 | uint8_t _pad_sys_desc_table[0x10]; /*obsolete!*/ /* 0x0a0 */ 72 | uint8_t _pad_olpc_ofw_header[0x10]; /* 0x0b0 */ 73 | uint32_t ext_ramdisk_image; /* 0x0c0 */ 74 | uint32_t ext_ramdisk_size; /* 0x0c4 */ 75 | uint32_t ext_cmd_line_ptr; /* 0x0c8 */ 76 | uint8_t _pad4[0x74]; /* 0x0cc */ 77 | uint8_t _pad_edid_info[0x80]; /* 0x140 */ 78 | uint8_t _pad_efi_info[0x20]; /* 0x1c0 */ 79 | uint32_t alt_mem_k; /* 0x1e0 */ 80 | uint32_t scratch; /* Scratch field! */ /* 0x1e4 */ 81 | uint8_t e820_entries; /* 0x1e8 */ 82 | uint8_t eddbuf_entries; /* 0x1e9 */ 83 | uint8_t edd_mbr_sig_buf_entries; /* 0x1ea */ 84 | uint8_t kbd_status; /* 0x1eb */ 85 | uint8_t secure_boot; /* 0x1ec */ 86 | uint8_t _pad5[2]; /* 0x1ed */ 87 | uint8_t sentinel; /* 0x1ef */ 88 | uint8_t _pad6; /* 0x1f0 */ 89 | struct setup_header hdr; /* setup header */ /* 0x1f1 */ 90 | uint8_t _pad7[0x290-0x1f1-sizeof(struct setup_header)]; 91 | uint8_t _pad_edd_mbr_sig_buffer[0x40]; /* 0x290 */ 92 | struct boot_e820_entry e820_table[E820_MAX_ENTRIES_ZEROPAGE]; /* 0x2d0 */ 93 | uint8_t _pad8[0x30]; /* 0xcd0 */ 94 | uint8_t _pad_edd_info[0x1ec]; /* 0xd00 */ 95 | uint8_t _pad9[276]; /* 0xeec */ 96 | } __attribute__((packed));; 97 | 98 | void setup_cmdline(); 99 | void setup_boot_params(const char *vmlinux_path, const char *initrd_path); 100 | void _test_boot_params(); 101 | 102 | #endif /* MICROV_BOOTPARAM_H */ 103 | -------------------------------------------------------------------------------- /ioeventfd.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #include "ioeventfd.h" 12 | 13 | #define IOEVENTFD_MAX_EVENTS 32 14 | 15 | static int init_ioeventfd = 0; 16 | static int epoll_fd, epoll_stop_fd; 17 | static struct epoll_event event_sets[IOEVENTFD_MAX_EVENTS]; 18 | static LIST_HEAD(used_ioevents); 19 | 20 | static void *ioeventfd_thread(void *param) 21 | { 22 | int i, nfds; 23 | uint64_t tmp = 1; 24 | 25 | for (;;) { 26 | nfds = epoll_wait(epoll_fd, event_sets, IOEVENTFD_MAX_EVENTS, -1); 27 | for (i = 0; i < nfds; i++) { 28 | struct ioevent *ioevent; 29 | 30 | if (event_sets[i].data.fd == epoll_stop_fd) { 31 | write(epoll_stop_fd, &tmp, sizeof(tmp)); 32 | return NULL; 33 | } 34 | 35 | ioevent = event_sets[i].data.ptr; 36 | if (read(ioevent->kvm_ioeventfd.fd, &tmp, sizeof(tmp)) < 0) { 37 | fprintf(stderr, "failed reading event.\n"); 38 | } 39 | 40 | ioevent->fn(ioevent->fn_ptr); 41 | } 42 | } 43 | 44 | return NULL; 45 | } 46 | 47 | int ioeventfd_add_event(int vmfd, struct ioevent *ioevent) 48 | { 49 | struct kvm_ioeventfd kvm_ioevent; 50 | struct epoll_event epoll_event; 51 | struct ioevent *new_ioevent; 52 | int event, ret; 53 | if(!init_ioeventfd) { 54 | fprintf(stderr, "ioevent has no inited.\n"); 55 | return -1; 56 | } 57 | 58 | //kvm ioeventfd 59 | ret = ioctl(vmfd, KVM_IOEVENTFD, &(ioevent->kvm_ioeventfd)); 60 | if (ret) { 61 | fprintf(stderr, "ioctl kvm ioeventfd failed.\n"); 62 | goto cleanup; 63 | } 64 | 65 | //add event to epoll 66 | new_ioevent = malloc(sizeof(*new_ioevent)); 67 | if (!new_ioevent) { 68 | fprintf(stderr, "malloc ioevent failed.\n"); 69 | return -1; 70 | } 71 | *new_ioevent = *ioevent; 72 | 73 | epoll_event = (struct epoll_event) { 74 | .events = EPOLLIN, 75 | .data.ptr = new_ioevent, 76 | }; 77 | 78 | ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, new_ioevent->kvm_ioeventfd.fd, &epoll_event); 79 | if (ret) { 80 | fprintf(stderr, "ctl epoll add failed.\n"); 81 | goto cleanup; 82 | } 83 | 84 | list_add_tail(&new_ioevent->list, &used_ioevents); 85 | 86 | return 0; 87 | 88 | cleanup: 89 | free(new_ioevent); 90 | return ret; 91 | } 92 | 93 | int ioeventfd_init(int vmfd) 94 | { 95 | int ret; 96 | pthread_t thread; 97 | struct epoll_event epoll_event = { .events = EPOLLIN }; 98 | 99 | if(ioctl(vmfd, KVM_CHECK_EXTENSION, KVM_CAP_IOEVENTFD) <= 0) { 100 | fprintf(stderr, "kvm not supportl ioevent fd\n"); 101 | return -1; 102 | } 103 | 104 | epoll_fd = epoll_create(IOEVENTFD_MAX_EVENTS); 105 | if (epoll_fd < 0) { 106 | fprintf(stderr, "create epoll failed\n"); 107 | return -1; 108 | } 109 | 110 | epoll_stop_fd = eventfd(0, 0); 111 | epoll_event.data.fd = epoll_stop_fd; 112 | 113 | ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, epoll_stop_fd, &epoll_event); 114 | if (ret < 0) 115 | goto epoll_err; 116 | 117 | ret = pthread_create(&thread, NULL, ioeventfd_thread, NULL); 118 | if (ret < 0) 119 | goto epoll_err; 120 | 121 | init_ioeventfd = 1; 122 | fprintf(stderr, "ioevent init done\n"); 123 | return 0; 124 | 125 | epoll_err: 126 | fprintf(stderr, "ioevent init failed\n"); 127 | close(epoll_stop_fd); 128 | close(epoll_fd); 129 | 130 | return ret; 131 | } 132 | 133 | int ioeventfd_exit() 134 | { 135 | int ret; 136 | uint64_t tmp = 1; 137 | 138 | if (!init_ioeventfd) 139 | return 0; 140 | 141 | ret = write(epoll_stop_fd, &tmp, sizeof(tmp)); 142 | if (ret < 0) 143 | return ret; 144 | 145 | ret = read(epoll_stop_fd, &tmp, sizeof(tmp)); 146 | if (ret < 0) 147 | return ret; 148 | 149 | close(epoll_fd); 150 | close(epoll_stop_fd); 151 | 152 | return 0; 153 | } 154 | -------------------------------------------------------------------------------- /memory.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | #include 7 | #include 8 | #include 9 | 10 | #include "global.h" 11 | #include "memory.h" 12 | #include "string.h" 13 | 14 | typedef struct KVMSlot 15 | { 16 | uint64_t start_addr; 17 | uint64_t memory_size; 18 | void *ram; 19 | int slot; 20 | int flags; 21 | } KVMSlot; 22 | 23 | enum MemLayoutType 24 | { 25 | MemBelow4g = 0, 26 | Mmio, 27 | IoApic, 28 | LocalApic, 29 | MemAbove4g, 30 | MemLayoutEnd 31 | }; 32 | 33 | const uint64_t MemLayout[MemLayoutEnd][2] = { 34 | {0, 0xC0000000 }, // MemBelow4g 35 | {0xF0100000, 0x200 }, // Mmio 36 | {IO_APIC_DEFAULT_PHYS_BASE, 0x100000 }, // IoApic 37 | {APIC_DEFAULT_PHYS_BASE, 0x100000 }, // LocalApic 38 | {0x100000000, 0x8000000000 } // MemAbove4g 39 | }; 40 | 41 | static uint64_t RamSize; 42 | static struct kvm_userspace_memory_region MemMapper[2]; 43 | 44 | int init_memory_map(int vmfd, uint64_t ram_size) 45 | { 46 | int ret; 47 | RamSize = ram_size; 48 | uint64_t rams[2][2] = {0}; 49 | uint64_t gap_start = MemLayout[MemBelow4g][0] + MemLayout[MemBelow4g][1]; 50 | 51 | rams[0][0] = 0; 52 | if(ram_size <= gap_start) { 53 | rams[0][1] = ram_size; 54 | } 55 | else { 56 | uint64_t gap_end = MemLayout[MemAbove4g][0]; 57 | rams[0][1] = gap_start; 58 | rams[1][0] = gap_end; 59 | rams[1][1] = ram_size - gap_start; 60 | } 61 | 62 | for(int i=0;i<2;i++) { 63 | if(rams[i][1]<=0) continue; 64 | struct KVMSlot *slot = malloc(sizeof(struct KVMSlot)); 65 | slot->memory_size = rams[i][1]; 66 | slot->start_addr = rams[i][0]; 67 | slot->slot = i; 68 | slot->flags = 0; 69 | slot->ram = mmap(NULL, slot->memory_size, PROT_READ | PROT_WRITE, 70 | MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, 71 | -1, 0); 72 | if ((void *)slot->ram == MAP_FAILED) { 73 | fprintf(stderr, "mmap vm ram failed\n"); 74 | return -1; 75 | } 76 | 77 | MemMapper[i].flags = slot->flags; 78 | MemMapper[i].slot = slot->slot; 79 | MemMapper[i].guest_phys_addr = slot->start_addr; 80 | MemMapper[i].memory_size = slot->memory_size; 81 | MemMapper[i].userspace_addr = (uint64_t)slot->ram; 82 | ret = ioctl(vmfd, KVM_SET_USER_MEMORY_REGION, &(MemMapper[i])); 83 | if (ret < 0) { 84 | fprintf(stderr, "set user memory region failed\n"); 85 | return -1; 86 | } 87 | } 88 | } 89 | 90 | uint64_t get_gap_start() 91 | { 92 | return MemLayout[MemBelow4g][0] + MemLayout[MemBelow4g][1]; 93 | } 94 | 95 | uint64_t get_gap_end() 96 | { 97 | return MemLayout[MemAbove4g][0]; 98 | } 99 | 100 | uint64_t get_ram_end() 101 | { 102 | uint64_t gap_start = MemLayout[MemBelow4g][0] + MemLayout[MemBelow4g][1]; 103 | 104 | if(RamSize <= MemLayout[MemBelow4g][1]) { 105 | return MemLayout[MemBelow4g][0] + RamSize; 106 | } 107 | else { 108 | return MemLayout[MemAbove4g][0] + (RamSize - MemLayout[MemBelow4g][1]); 109 | } 110 | } 111 | 112 | static int find_mapper_index(uint64_t guest_addr) 113 | { 114 | for(int i=0;i<2;i++) { 115 | if(guest_addr >= MemMapper[i].guest_phys_addr 116 | && guest_addr < MemMapper[i].guest_phys_addr + MemMapper[i].memory_size) { 117 | return i; 118 | } 119 | } 120 | fprintf(stderr, "get memory region failed\n"); 121 | return -1; 122 | } 123 | 124 | void write_userspace_memory(void *src, uint64_t guest_addr, uint64_t len) 125 | { 126 | int mapper_index = find_mapper_index(guest_addr); 127 | uint64_t offset = guest_addr - MemMapper[mapper_index].guest_phys_addr; 128 | memcpy((void *)(MemMapper[mapper_index].userspace_addr + offset), src, len); 129 | 130 | } 131 | 132 | uint64_t get_userspace_addr(uint64_t guest_addr) 133 | { 134 | int mapper_index = find_mapper_index(guest_addr); 135 | uint64_t offset = guest_addr - MemMapper[mapper_index].guest_phys_addr; 136 | return MemMapper[mapper_index].userspace_addr + offset; 137 | } 138 | -------------------------------------------------------------------------------- /list.h: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-2.0-only 2 | #ifndef _LINUX_LIST_H 3 | #define _LINUX_LIST_H 4 | 5 | struct list_head { 6 | struct list_head *next, *prev; 7 | }; 8 | 9 | #define LIST_HEAD_INIT(name) { &(name), &(name) } 10 | 11 | #define LIST_HEAD(name) \ 12 | struct list_head name = LIST_HEAD_INIT(name) 13 | 14 | static inline void INIT_LIST_HEAD(struct list_head *list) 15 | { 16 | list->next = list; 17 | list->prev = list; 18 | } 19 | 20 | static inline void __list_add(struct list_head *new, 21 | struct list_head *prev, 22 | struct list_head *next) 23 | { 24 | next->prev = new; 25 | new->next = next; 26 | new->prev = prev; 27 | prev->next = new; 28 | } 29 | 30 | /* 31 | * Delete a list entry by making the prev/next entries 32 | * point to each other. 33 | * 34 | * This is only for internal list manipulation where we know 35 | * the prev/next entries already! 36 | */ 37 | static inline void __list_del(struct list_head * prev, struct list_head * next) 38 | { 39 | next->prev = prev; 40 | prev->next = next; 41 | } 42 | 43 | /** 44 | * list_add_tail - add a new entry 45 | * @new: new entry to be added 46 | * @head: list head to add it before 47 | * 48 | * Insert a new entry before the specified head. 49 | * This is useful for implementing queues. 50 | */ 51 | static inline void list_add_tail(struct list_head *new, struct list_head *head) 52 | { 53 | __list_add(new, head->prev, head); 54 | } 55 | 56 | static inline void list_del(struct list_head *entry) 57 | { 58 | __list_del(entry->prev, entry->next); 59 | entry->next = NULL; 60 | entry->prev = NULL; 61 | } 62 | 63 | /** 64 | * list_empty - tests whether a list is empty 65 | * @head: the list to test. 66 | */ 67 | static inline int list_empty(const struct list_head *head) 68 | { 69 | return head->next == head; 70 | } 71 | 72 | static inline void __list_del_entry(struct list_head *entry) 73 | { 74 | __list_del(entry->prev, entry->next); 75 | } 76 | 77 | /** 78 | * list_del_init - deletes entry from list and reinitialize it. 79 | * @entry: the element to delete from the list. 80 | */ 81 | static inline void list_del_init(struct list_head *entry) 82 | { 83 | __list_del_entry(entry); 84 | INIT_LIST_HEAD(entry); 85 | } 86 | 87 | /** 88 | * list_entry - get the struct for this entry 89 | * @ptr: the &struct list_head pointer. 90 | * @type: the type of the struct this is embedded in. 91 | * @member: the name of the list_head within the struct. 92 | */ 93 | #define list_entry(ptr, type, member) \ 94 | container_of(ptr, type, member) 95 | 96 | /** 97 | * list_first_entry - get the first element from a list 98 | * @ptr: the list head to take the element from. 99 | * @type: the type of the struct this is embedded in. 100 | * @member: the name of the list_head within the struct. 101 | * 102 | * Note, that list is expected to be not empty. 103 | */ 104 | #define list_first_entry(ptr, type, member) \ 105 | list_entry((ptr)->next, type, member) 106 | 107 | /** 108 | * list_next_entry - get the next element in list 109 | * @pos: the type * to cursor 110 | * @member: the name of the list_head within the struct. 111 | */ 112 | #define list_next_entry(pos, member) \ 113 | list_entry((pos)->member.next, typeof(*(pos)), member) 114 | 115 | /** 116 | * list_for_each_entry - iterate over list of given type 117 | * @pos: the type * to use as a loop cursor. 118 | * @head: the head for your list. 119 | * @member: the name of the list_head within the struct. 120 | */ 121 | #define list_for_each_entry(pos, head, member) \ 122 | for (pos = list_first_entry(head, typeof(*pos), member); \ 123 | &pos->member != (head); \ 124 | pos = list_next_entry(pos, member)) 125 | 126 | /** 127 | * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry 128 | * @pos: the type * to use as a loop cursor. 129 | * @n: another type * to use as temporary storage 130 | * @head: the head for your list. 131 | * @member: the name of the list_head within the struct. 132 | */ 133 | #define list_for_each_entry_safe(pos, n, head, member) \ 134 | for (pos = list_first_entry(head, typeof(*pos), member), \ 135 | n = list_next_entry(pos, member); \ 136 | &pos->member != (head); \ 137 | pos = n, n = list_next_entry(n, member)) 138 | 139 | #endif 140 | -------------------------------------------------------------------------------- /mpspec_def.h: -------------------------------------------------------------------------------- 1 | #ifndef MICROV_MPSPEC_DEF_H 2 | #define MICROV_MPSPEC_DEF_H 3 | 4 | /* 5 | * Structure definitions for SMP machines following the 6 | * Intel Multiprocessing Specification 1.1 and 1.4. 7 | */ 8 | 9 | /* 10 | * This tag identifies where the SMP configuration 11 | * information is. 12 | */ 13 | 14 | #define SMP_MAGIC_IDENT (('_'<<24) | ('P'<<16) | ('M'<<8) | '_') 15 | 16 | #ifdef CONFIG_X86_32 17 | # define MAX_MPC_ENTRY 1024 18 | #endif 19 | 20 | /* Intel MP Floating Pointer Structure */ 21 | struct mpf_intel { 22 | unsigned char signature[4]; /* "_MP_" */ 23 | unsigned int physptr; /* Configuration table address */ 24 | unsigned char length; /* Our length (paragraphs) */ 25 | unsigned char specification; /* Specification version */ 26 | unsigned char checksum; /* Checksum (makes sum 0) */ 27 | unsigned char feature1; /* Standard or configuration ? */ 28 | unsigned char feature2; /* Bit7 set for IMCR|PIC */ 29 | unsigned char feature3; /* Unused (0) */ 30 | unsigned char feature4; /* Unused (0) */ 31 | unsigned char feature5; /* Unused (0) */ 32 | }; 33 | 34 | #define MPC_SIGNATURE "PCMP" 35 | 36 | struct mpc_table { 37 | unsigned char signature[4]; 38 | unsigned short length; /* Size of table */ 39 | unsigned char spec; /* 0x01 */ 40 | unsigned char checksum; 41 | unsigned char oem[8]; 42 | unsigned char productid[12]; 43 | unsigned int oemptr; /* 0 if not present */ 44 | unsigned short oemsize; /* 0 if not present */ 45 | unsigned short oemcount; 46 | unsigned int lapic; /* APIC address */ 47 | unsigned int reserved; 48 | }; 49 | 50 | /* Followed by entries */ 51 | 52 | #define MP_PROCESSOR 0 53 | #define MP_BUS 1 54 | #define MP_IOAPIC 2 55 | #define MP_INTSRC 3 56 | #define MP_LINTSRC 4 57 | /* Used by IBM NUMA-Q to describe node locality */ 58 | #define MP_TRANSLATION 192 59 | 60 | #define CPU_ENABLED 1 /* Processor is available */ 61 | #define CPU_BOOTPROCESSOR 2 /* Processor is the boot CPU */ 62 | 63 | #define CPU_STEPPING_MASK 0x000F 64 | #define CPU_MODEL_MASK 0x00F0 65 | #define CPU_FAMILY_MASK 0x0F00 66 | 67 | struct mpc_cpu { 68 | unsigned char type; 69 | unsigned char apicid; /* Local APIC number */ 70 | unsigned char apicver; /* Its versions */ 71 | unsigned char cpuflag; 72 | unsigned int cpufeature; 73 | unsigned int featureflag; /* CPUID feature value */ 74 | unsigned int reserved1; 75 | unsigned int reserved2; 76 | }; 77 | 78 | struct mpc_bus { 79 | unsigned char type; 80 | unsigned char busid; 81 | unsigned char bustype[6]; 82 | }; 83 | 84 | /* List of Bus Type string values, Intel MP Spec. */ 85 | #define BUSTYPE_EISA "EISA" 86 | #define BUSTYPE_ISA "ISA" 87 | #define BUSTYPE_INTERN "INTERN" /* Internal BUS */ 88 | #define BUSTYPE_MCA "MCA" /* Obsolete */ 89 | #define BUSTYPE_VL "VL" /* Local bus */ 90 | #define BUSTYPE_PCI "PCI" 91 | #define BUSTYPE_PCMCIA "PCMCIA" 92 | #define BUSTYPE_CBUS "CBUS" 93 | #define BUSTYPE_CBUSII "CBUSII" 94 | #define BUSTYPE_FUTURE "FUTURE" 95 | #define BUSTYPE_MBI "MBI" 96 | #define BUSTYPE_MBII "MBII" 97 | #define BUSTYPE_MPI "MPI" 98 | #define BUSTYPE_MPSA "MPSA" 99 | #define BUSTYPE_NUBUS "NUBUS" 100 | #define BUSTYPE_TC "TC" 101 | #define BUSTYPE_VME "VME" 102 | #define BUSTYPE_XPRESS "XPRESS" 103 | 104 | #define MPC_APIC_USABLE 0x01 105 | 106 | struct mpc_ioapic { 107 | unsigned char type; 108 | unsigned char apicid; 109 | unsigned char apicver; 110 | unsigned char flags; 111 | unsigned int apicaddr; 112 | }; 113 | 114 | struct mpc_intsrc { 115 | unsigned char type; 116 | unsigned char irqtype; 117 | unsigned short irqflag; 118 | unsigned char srcbus; 119 | unsigned char srcbusirq; 120 | unsigned char dstapic; 121 | unsigned char dstirq; 122 | }; 123 | 124 | enum mp_irq_source_types { 125 | mp_INT = 0, 126 | mp_NMI = 1, 127 | mp_SMI = 2, 128 | mp_ExtINT = 3 129 | }; 130 | 131 | #define MP_IRQPOL_DEFAULT 0x0 132 | #define MP_IRQPOL_ACTIVE_HIGH 0x1 133 | #define MP_IRQPOL_RESERVED 0x2 134 | #define MP_IRQPOL_ACTIVE_LOW 0x3 135 | #define MP_IRQPOL_MASK 0x3 136 | 137 | #define MP_IRQTRIG_DEFAULT 0x0 138 | #define MP_IRQTRIG_EDGE 0x4 139 | #define MP_IRQTRIG_RESERVED 0x8 140 | #define MP_IRQTRIG_LEVEL 0xc 141 | #define MP_IRQTRIG_MASK 0xc 142 | 143 | #define MP_APIC_ALL 0xFF 144 | 145 | struct mpc_lintsrc { 146 | unsigned char type; 147 | unsigned char irqtype; 148 | unsigned short irqflag; 149 | unsigned char srcbusid; 150 | unsigned char srcbusirq; 151 | unsigned char destapic; 152 | unsigned char destapiclint; 153 | }; 154 | 155 | #define MPC_OEM_SIGNATURE "_OEM" 156 | 157 | struct mpc_oemtable { 158 | char signature[4]; 159 | unsigned short length; /* Size of table */ 160 | char rev; /* 0x01 */ 161 | char checksum; 162 | char mpc[8]; 163 | }; 164 | 165 | /* 166 | * Default configurations 167 | * 168 | * 1 2 CPU ISA 82489DX 169 | * 2 2 CPU EISA 82489DX neither IRQ 0 timer nor IRQ 13 DMA chaining 170 | * 3 2 CPU EISA 82489DX 171 | * 4 2 CPU MCA 82489DX 172 | * 5 2 CPU ISA+PCI 173 | * 6 2 CPU EISA+PCI 174 | * 7 2 CPU MCA+PCI 175 | */ 176 | 177 | enum mp_bustype { 178 | MP_BUS_ISA = 1, 179 | MP_BUS_EISA, 180 | MP_BUS_PCI, 181 | }; 182 | #endif /* MICROV_MPSPEC_DEF_H */ 183 | -------------------------------------------------------------------------------- /bootparams.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "global.h" 5 | #include "bootparams.h" 6 | #include "memory.h" 7 | #include "string.h" 8 | 9 | #define BOOT_FLAG 0xAA55 10 | #define HDRS 0x53726448 11 | #define UNDEFINED_ID 0xFF 12 | 13 | uint64_t InitrdSize; 14 | uint64_t InitrdAddr; 15 | static const char CMDLINE[] = "console=ttyS0 pci=conf1 panic=1 reboot=k root=/dev/ram rdinit=/bin/sh"; 16 | 17 | static int file_len(FILE *fp) 18 | { 19 | int num; 20 | fseek(fp,0,SEEK_END); 21 | num=ftell(fp); 22 | fseek(fp,0,SEEK_SET); 23 | return num; 24 | } 25 | 26 | static void load_initrd(const char *initrd_path) 27 | { 28 | FILE *fp; 29 | int len; 30 | if((fp = fopen(initrd_path, "r")) == NULL) 31 | { 32 | printf("open file %s error.\n",initrd_path); 33 | exit(0); 34 | } 35 | 36 | InitrdSize = file_len(fp); 37 | uint64_t initrd_addr_max = INITRD_ADDR_MAX; 38 | if(initrd_addr_max > get_ram_end()) { 39 | initrd_addr_max = get_ram_end(); 40 | } 41 | InitrdAddr = (initrd_addr_max - InitrdSize) & ~(uint64_t)0xfff; 42 | 43 | fread((uint8_t *)get_userspace_addr(InitrdAddr), InitrdSize, 1, fp); 44 | fprintf(stderr, "load initrd at 0x%lx size: 0x%lx\n", InitrdAddr, InitrdSize); 45 | fclose(fp); 46 | } 47 | 48 | static void load_kernel(const char *vmlinux_path) 49 | { 50 | FILE *fp; 51 | int len; 52 | if((fp = fopen(vmlinux_path, "r")) == NULL) 53 | { 54 | printf("open file %s error.\n",vmlinux_path); 55 | exit(0); 56 | } 57 | len = file_len(fp); 58 | fread((uint8_t *)get_userspace_addr(VMLINUX_START), len, 1, fp); 59 | fprintf(stderr, "load kernel at 0x%lx size: 0x%lx\n", VMLINUX_START, len); 60 | fclose(fp); 61 | } 62 | 63 | static void setup_e820(struct boot_params *boot_params) 64 | { 65 | boot_params->e820_entries = 0; 66 | 67 | boot_params->e820_table[0] = (struct boot_e820_entry) 68 | { .addr = REAL_MODE_IVT_START, 69 | .size = MPTABLE_START - REAL_MODE_IVT_START, 70 | .type = E820_RAM 71 | }; 72 | boot_params->e820_table[1] = (struct boot_e820_entry) 73 | { .addr = MPTABLE_START, 74 | .size = VGA_RAM_START - MPTABLE_START, 75 | .type = E820_RESERVED 76 | }; 77 | boot_params->e820_table[2] = (struct boot_e820_entry) 78 | { .addr = MB_BIOS_START, 79 | .size = 0, 80 | .type = E820_RESERVED 81 | }; 82 | 83 | if(get_ram_end() <= get_gap_end()) { 84 | boot_params->e820_table[3] = (struct boot_e820_entry) 85 | { .addr = VMLINUX_RAM_START, 86 | .size = get_ram_end() - VMLINUX_RAM_START, 87 | .type = E820_RAM 88 | }; 89 | boot_params->e820_entries = 4; 90 | } else { 91 | boot_params->e820_table[3] = (struct boot_e820_entry) 92 | { .addr = VMLINUX_RAM_START, 93 | .size = get_gap_start() - VMLINUX_RAM_START, 94 | .type = E820_RAM 95 | }; 96 | boot_params->e820_table[4] = (struct boot_e820_entry) 97 | { .addr = get_gap_end(), 98 | .size = get_ram_end() - get_gap_end(), 99 | .type = E820_RAM 100 | }; 101 | boot_params->e820_entries = 5; 102 | 103 | } 104 | } 105 | 106 | static void setup_header_ramdisk(struct boot_params *boot_params) 107 | { 108 | //8 bytes aligned ramdisk_image addr 109 | boot_params->hdr.ramdisk_image = InitrdAddr; 110 | boot_params->hdr.ramdisk_size = InitrdSize; 111 | boot_params->hdr.boot_flag = BOOT_FLAG; 112 | boot_params->hdr.header = HDRS, 113 | boot_params->hdr.type_of_loader = UNDEFINED_ID; 114 | boot_params->hdr.cmd_line_ptr = CMDLINE_START; 115 | boot_params->hdr.cmdline_size = sizeof(CMDLINE) - 1; 116 | } 117 | 118 | void setup_cmdline() 119 | { 120 | write_userspace_memory((void *)CMDLINE, CMDLINE_START, sizeof(CMDLINE) - 1); 121 | } 122 | 123 | void setup_boot_params(const char *vmlinux_path, const char *initrd_path) 124 | { 125 | struct boot_params *boot_params = (struct boot_params *)get_userspace_addr(ZERO_PAGE_START); 126 | memset(boot_params, 0, sizeof(struct boot_params)); 127 | load_kernel(vmlinux_path); 128 | load_initrd(initrd_path); 129 | setup_e820(boot_params); 130 | setup_header_ramdisk(boot_params); 131 | } 132 | 133 | void _test_boot_params() 134 | { 135 | struct boot_params *boot_params = (struct boot_params *)get_userspace_addr(ZERO_PAGE_START); 136 | 137 | fprintf(stderr, "boot_params->hdr.ramdisk_image:0x%lx\n", boot_params->hdr.ramdisk_image); 138 | fprintf(stderr, "boot_params->hdr.cmdline_size:0x%lx\n", boot_params->hdr.cmdline_size); 139 | fprintf(stderr, "boot_params->e820_entries:0x%ld\n", boot_params->e820_entries); 140 | 141 | for(int i=0;ie820_entries;i++){ 142 | fprintf(stderr, "e820:0x%lx,0x%lx,0x%lx\n", 143 | boot_params->e820_table[i].addr, 144 | boot_params->e820_table[i].size, 145 | boot_params->e820_table[i].type); 146 | } 147 | 148 | char cmdline[1024] = {0}; 149 | memcpy(cmdline,(void *)get_userspace_addr(CMDLINE_START), sizeof(CMDLINE) - 1); 150 | fprintf(stderr, "cmdline:%s\n", cmdline); 151 | } 152 | -------------------------------------------------------------------------------- /virtio-blk.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #include "memory.h" 11 | #include "virtio-blk.h" 12 | 13 | #define VIRTIO_PCI_DEVICE_ID_BLK 0x1042 14 | #define VIRTIO_BLK_PCI_CLASS 0x018000 15 | #define VIRTIO_BLK_DEVICE_IRQ 15 16 | #define VIRTQUEUE_SIZE 128 17 | 18 | ssize_t diskimg_read(struct diskimg *diskimg, 19 | void *data, 20 | off_t offset, 21 | size_t size) 22 | { 23 | if(offset < diskimg->size) { 24 | lseek(diskimg->fd, offset, SEEK_SET); 25 | return read(diskimg->fd, data, size); 26 | } 27 | return -1; 28 | } 29 | 30 | ssize_t diskimg_write(struct diskimg *diskimg, 31 | void *data, 32 | off_t offset, 33 | size_t size) 34 | { 35 | if(offset < diskimg->size) { 36 | lseek(diskimg->fd, offset, SEEK_SET); 37 | return write(diskimg->fd, data, size); 38 | } 39 | return -1; 40 | } 41 | 42 | int diskimg_init(struct diskimg *diskimg, const char *file_path) 43 | { 44 | diskimg->fd = open(file_path, O_RDWR); 45 | if (diskimg->fd < 0) 46 | return -1; 47 | struct stat st; 48 | fstat(diskimg->fd, &st); 49 | diskimg->size = st.st_size; 50 | return 0; 51 | } 52 | 53 | void diskimg_exit(struct diskimg *diskimg) 54 | { 55 | close(diskimg->fd); 56 | } 57 | 58 | 59 | static ssize_t virtio_blk_write(struct virtio_blk_dev *dev, 60 | void *data, 61 | uint64_t sector, 62 | size_t size) 63 | { 64 | off_t offset = sector * 512; 65 | return diskimg_write(dev->diskimg, data, offset, size); 66 | } 67 | 68 | static ssize_t virtio_blk_read(struct virtio_blk_dev *dev, 69 | void *data, 70 | uint64_t sector, 71 | size_t size) 72 | { 73 | off_t offset = sector * 512; 74 | return diskimg_read(dev->diskimg, data, offset, size); 75 | } 76 | 77 | static void virtio_blk_handle_output(struct virtq *vq) 78 | { 79 | struct virtio_blk_dev *dev = (struct virtio_blk_dev *) vq->dev; 80 | uint8_t status; 81 | struct vring_packed_desc *desc; 82 | struct virtio_blk_req req; 83 | 84 | while ((desc = virtq_get_avail(vq))) { 85 | struct vring_packed_desc *used_desc = desc; 86 | ssize_t r = 0; 87 | 88 | memcpy(&req.hdr, (void *)get_userspace_addr((uint64_t) desc->addr), desc->len); 89 | if (req.hdr.type == VIRTIO_BLK_T_IN || req.hdr.type == VIRTIO_BLK_T_OUT) { 90 | if (!virtq_check_next(desc)) 91 | return; 92 | desc = virtq_get_avail(vq); 93 | req.data = (uint8_t *)get_userspace_addr((uint64_t) desc->addr); 94 | 95 | if (req.hdr.type == VIRTIO_BLK_T_IN) 96 | r = virtio_blk_read(dev, req.data, req.hdr.sector, desc->len); 97 | else 98 | r = virtio_blk_write(dev, req.data, req.hdr.sector, desc->len); 99 | 100 | status = r < 0 ? VIRTIO_BLK_S_IOERR : VIRTIO_BLK_S_OK; 101 | } else { 102 | status = VIRTIO_BLK_S_UNSUPP; 103 | } 104 | if (!virtq_check_next(desc)) 105 | return; 106 | desc = virtq_get_avail(vq); 107 | *(uint8_t *)get_userspace_addr((uint64_t) desc->addr) = status; 108 | 109 | used_desc->flags ^= (1ULL << VRING_PACKED_DESC_F_USED); 110 | used_desc->len = r; 111 | } 112 | 113 | if (vq->guest_event->flags == VRING_PACKED_EVENT_FLAG_ENABLE) { 114 | dev->virtio_pci_dev.config.isr_cfg.isr_status |= 1; 115 | uint64_t n = 1; 116 | if (write(dev->irqfd, &n, sizeof(n)) < 0) 117 | fprintf(stderr, "write irqfd failed\n"); 118 | } 119 | } 120 | 121 | static void virtio_blk_setup(struct virtio_blk_dev *dev, 122 | struct diskimg *diskimg) 123 | { 124 | dev->diskimg = diskimg; 125 | dev->config.capacity = diskimg->size/512; 126 | dev->irq_num = VIRTIO_BLK_DEVICE_IRQ; 127 | dev->irqfd = eventfd(0, EFD_CLOEXEC); 128 | dev->ioevent_fd = eventfd(0, EFD_CLOEXEC); 129 | 130 | for (int i = 0; i < VIRTIO_BLK_VIRTQUEUE_NUM; i++) { 131 | virtq_init(&dev->vq[i], dev, VIRTQUEUE_SIZE, virtio_blk_handle_output); 132 | } 133 | } 134 | 135 | void virtio_blk_init_pci(int vmfd, struct virtio_blk_dev *virtio_blk_dev, 136 | struct diskimg *diskimg) 137 | { 138 | memset(virtio_blk_dev, 0x00, sizeof(struct virtio_blk_dev)); 139 | virtio_blk_setup(virtio_blk_dev, diskimg); 140 | 141 | struct virtio_pci_dev *dev = &virtio_blk_dev->virtio_pci_dev; 142 | virtio_pci_init(vmfd, dev, 143 | VIRTIO_PCI_DEVICE_ID_BLK, 144 | VIRTIO_BLK_PCI_CLASS, 145 | virtio_blk_dev->irq_num); 146 | virtio_pci_set_dev_cfg(dev, &virtio_blk_dev->config, sizeof(virtio_blk_dev->config)); 147 | virtio_pci_set_virtq_cfg(dev, virtio_blk_dev->vq, VIRTIO_BLK_VIRTQUEUE_NUM); 148 | 149 | struct kvm_irqfd irqfd = { 150 | .fd = virtio_blk_dev->irqfd, 151 | .gsi = virtio_blk_dev->irq_num, 152 | .flags = 0, 153 | }; 154 | if (ioctl(dev->vmfd, KVM_IRQFD, &irqfd) < 0) { 155 | fprintf(stderr, "ioctl kvm irqfd failed\n"); 156 | } 157 | } 158 | 159 | void virtio_blk_exit(struct virtio_blk_dev *dev) 160 | { 161 | diskimg_exit(dev->diskimg); 162 | close(dev->irqfd); 163 | } 164 | -------------------------------------------------------------------------------- /pci.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #include "global.h" 6 | #include "pci.h" 7 | 8 | /*********************************************************************** 9 | pci bus 10 | ************************************************************************/ 11 | 12 | extern struct bus pio_bus; 13 | extern struct bus mmio_bus; 14 | struct bus pci_bus; 15 | 16 | struct region pci_addr_region; 17 | struct region pci_data_region; 18 | union pci_config_address pci_addr; 19 | 20 | static void pcibus_addr_io(uint64_t offset, uint8_t size, void *data, uint8_t is_write, void *owner) 21 | { 22 | void *p = (void *)&pci_addr + offset; 23 | if (is_write) 24 | memcpy(p, data, size); 25 | else 26 | memcpy(data, p, size); 27 | pci_addr.reg_offset = 0; 28 | } 29 | 30 | static void pcibus_data_io(uint64_t offset, uint8_t size, void *data, uint8_t is_write, void *owner) 31 | { 32 | uint64_t addr = pci_addr.value | offset; 33 | struct region *region = iobus_find_region(&pci_bus, addr); 34 | 35 | if (region && addr + size - 1 <= region->base + region->len - 1) { 36 | //io pci config space 37 | region->handle_io(addr - region->base, size, data, is_write, region->owner); 38 | } 39 | } 40 | 41 | void pcibus_init() 42 | { 43 | region_init(&pci_addr_region, IO_PCI_CONFIG_ADDR_START, IO_PCI_CONFIG_ADDR_SIZE, NULL, pcibus_addr_io); 44 | iobus_register_region(&pio_bus, &pci_addr_region); 45 | region_init(&pci_data_region, IO_PCI_CONFIG_DATA_START, IO_PCI_CONFIG_DATA_SIZE, NULL, pcibus_data_io); 46 | iobus_register_region(&pio_bus, &pci_data_region); 47 | pci_bus.region_count = 0; 48 | pci_bus.head = NULL; 49 | } 50 | 51 | static void pcibus_register_dev(struct pci_dev *dev, region_io_fn handle_io) 52 | { 53 | unsigned num = pci_bus.region_count; 54 | union pci_config_address addr = {.enable_bit = 1, 55 | .dev_num = num}; 56 | //register pci config space 57 | region_init(&dev->config_region, addr.value, PCI_CFG_SPACE_SIZE, dev, 58 | handle_io); 59 | iobus_register_region(&pci_bus, &dev->config_region); 60 | } 61 | 62 | /*********************************************************************** 63 | pci deb 64 | ************************************************************************/ 65 | 66 | static void pci_bar_command(struct pci_dev *dev) 67 | { 68 | bool enable_io = PCI_HDR_READ(dev->hdr, PCI_COMMAND, 16) & PCI_COMMAND_IO; 69 | bool enable_mem = 70 | PCI_HDR_READ(dev->hdr, PCI_COMMAND, 16) & PCI_COMMAND_MEMORY; 71 | for (int i = 0; i < PCI_STD_NUM_BARS; i++) { 72 | struct bus *bus = dev->bar_is_io_space[i] ? &pio_bus : &mmio_bus; 73 | bool enable = dev->bar_is_io_space[i] ? enable_io : enable_mem; 74 | 75 | if (enable) { 76 | uint32_t mask = ~(dev->bar_size[i] - 1); 77 | if (!dev->bar_active[i] && dev->bar_region[i].base & mask) 78 | iobus_register_region(bus, &dev->bar_region[i]); 79 | dev->bar_active[i] = true; 80 | } 81 | else { 82 | uint32_t mask = ~(dev->bar_size[i] - 1); 83 | if (dev->bar_active[i] && dev->bar_region[i].base & mask) 84 | iobus_deregister_region(&dev->bar_region[i]); 85 | dev->bar_active[i] = false; 86 | } 87 | } 88 | } 89 | 90 | static void pci_bar_config(struct pci_dev *dev, uint8_t bar) 91 | { 92 | uint32_t mask = ~(dev->bar_size[bar] - 1); 93 | uint32_t old_bar = PCI_HDR_READ(dev->hdr, PCI_BAR_OFFSET(bar), 32); 94 | uint32_t new_bar = (old_bar & mask) | dev->bar_is_io_space[bar]; 95 | PCI_HDR_WRITE(dev->hdr, PCI_BAR_OFFSET(bar), new_bar, 32); 96 | dev->bar_region[bar].base = new_bar; 97 | } 98 | 99 | static void pci_config_write(struct pci_dev *dev, 100 | void *data, 101 | uint64_t offset, 102 | uint8_t size) 103 | { 104 | void *p = dev->hdr + offset; 105 | 106 | memcpy(p, data, size); 107 | if (offset == PCI_COMMAND) { 108 | pci_bar_command(dev); 109 | } else if (offset >= PCI_BASE_ADDRESS_0 && offset <= PCI_BASE_ADDRESS_5) { 110 | uint8_t bar = (offset - PCI_BASE_ADDRESS_0) >> 2; 111 | pci_bar_config(dev, bar); 112 | } 113 | } 114 | 115 | static void pci_config_read(struct pci_dev *dev, 116 | void *data, 117 | uint64_t offset, 118 | uint8_t size) 119 | { 120 | void *p = dev->hdr + offset; 121 | memcpy(data, p, size); 122 | } 123 | 124 | static void pci_config_handle_io(uint64_t offset, 125 | uint8_t size, 126 | void *data, 127 | uint8_t is_write, 128 | void *owner) 129 | { 130 | struct pci_dev *dev = (struct pci_dev *) owner; 131 | if (is_write) 132 | pci_config_write(dev, data, offset, size); 133 | else 134 | pci_config_read(dev, data, offset, size); 135 | } 136 | 137 | void pci_init_bar(struct pci_dev *dev, 138 | uint8_t bar, 139 | uint32_t bar_size, 140 | bool is_io_space, 141 | region_io_fn handle_io) 142 | { 143 | PCI_HDR_WRITE(dev->hdr, PCI_BAR_OFFSET(bar), is_io_space, 32); 144 | dev->bar_size[bar] = bar_size; 145 | dev->bar_is_io_space[bar] = is_io_space; 146 | region_init(&dev->bar_region[bar], 0, bar_size, dev, handle_io); 147 | } 148 | 149 | void pci_dev_init(struct pci_dev *dev) 150 | { 151 | memset(dev, 0x00, sizeof(struct pci_dev)); 152 | dev->hdr = dev->cfg_space; 153 | pcibus_register_dev(dev, pci_config_handle_io); 154 | } 155 | 156 | -------------------------------------------------------------------------------- /mptable.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #include "mptable.h" 6 | #include "mpspec_def.h" 7 | #include "global.h" 8 | #include "memory.h" 9 | #include "string.h" 10 | 11 | #define APIC_VERSION 0x14 12 | #define MPC_SPEC 0x4 13 | 14 | #define MP_IRQDIR_DEFAULT 0 15 | #define MP_IRQDIR_HIGH 1 16 | #define MP_IRQDIR_LOW 3 17 | 18 | static const char MPC_OEM[] = "STRATSTR"; 19 | static const char MPC_PRODUCT_ID[] = "1.1.1.1.1.1."; 20 | static const char BUS_TYPE_ISA[] = "ISAISA"; 21 | 22 | static int mptable_checksum(char *buf, int size) 23 | { 24 | int i; 25 | unsigned char sum = 0; 26 | 27 | for (i = 0; i < size; i++) { 28 | sum += buf[i]; 29 | } 30 | 31 | return sum; 32 | } 33 | 34 | void setup_mptable(int num_cpus) 35 | { 36 | struct mpf_intel *mpf; 37 | struct mpc_table *table; 38 | struct mpc_cpu *cpu; 39 | struct mpc_bus *bus; 40 | struct mpc_ioapic *ioapic; 41 | struct mpc_intsrc *intsrc; 42 | struct mpc_lintsrc *lintsrc; 43 | const char mpc_signature[] = MPC_SIGNATURE; 44 | const char smp_magic_ident[] = "_MP_"; 45 | unsigned char checksum = 0; 46 | int offset = 0; 47 | int ssize; 48 | int i; 49 | 50 | //1.Intel MP Floating Pointer Structure 51 | ssize = sizeof(struct mpf_intel); 52 | 53 | mpf = (struct mpf_intel *)get_userspace_addr(MPTABLE_START); 54 | memset(mpf, 0, ssize); 55 | memcpy(mpf->signature, smp_magic_ident, sizeof(smp_magic_ident) - 1); 56 | mpf->length = 1; 57 | mpf->specification = 4; 58 | mpf->physptr = MPTABLE_START + ssize; 59 | mpf->checksum -= mptable_checksum((char *) mpf, ssize); 60 | 61 | //2.Intel MP Config Table Header Structure 62 | offset += ssize; 63 | ssize = sizeof(struct mpc_table); 64 | 65 | table = (struct mpc_table *)get_userspace_addr(MPTABLE_START + offset); 66 | memset(table, 0, ssize); 67 | memcpy(table->signature, mpc_signature, sizeof(mpc_signature) - 1); 68 | table->spec = MPC_SPEC; 69 | memcpy(table->oem, MPC_OEM, sizeof(MPC_OEM) - 1); 70 | memcpy(table->productid, MPC_PRODUCT_ID, sizeof(MPC_PRODUCT_ID) - 1); 71 | table->lapic = APIC_DEFAULT_PHYS_BASE; 72 | 73 | //3.Intel MP cpu 74 | offset += ssize; 75 | ssize = sizeof(struct mpc_cpu); 76 | 77 | for (i = 0; i < num_cpus; i++) { 78 | cpu = (struct mpc_cpu *)get_userspace_addr(MPTABLE_START + offset); 79 | memset(cpu, 0, ssize); 80 | cpu->type = MP_PROCESSOR; 81 | cpu->apicid = i; 82 | cpu->apicver = APIC_VERSION; 83 | cpu->cpuflag = CPU_ENABLED; 84 | if (i == 0) { 85 | cpu->cpuflag |= CPU_BOOTPROCESSOR; 86 | } 87 | cpu->cpufeature = 0x600; // Intel CPU Family Number: 0x6 88 | cpu->featureflag = 0x201; // APIC & FPU 89 | cpu->reserved1 = 0; 90 | cpu->reserved2 = 0; 91 | checksum += mptable_checksum((char *) cpu, ssize); 92 | offset += ssize; 93 | } 94 | 95 | //4.Intel MP bus 96 | ssize = sizeof(struct mpc_bus); 97 | 98 | bus = (struct mpc_bus *)get_userspace_addr(MPTABLE_START + offset); 99 | memset(bus, 0, ssize); 100 | bus->type = MP_BUS; 101 | bus->busid = 0; 102 | memcpy(bus->bustype, BUS_TYPE_ISA, sizeof(BUS_TYPE_ISA) - 1); 103 | checksum += mptable_checksum((char *) bus, ssize); 104 | 105 | //5.Intel MP ioapic 106 | offset += ssize; 107 | ssize = sizeof(struct mpc_ioapic); 108 | 109 | ioapic = (struct mpc_ioapic *)get_userspace_addr(MPTABLE_START + offset); 110 | memset(ioapic, 0, ssize); 111 | ioapic->type = MP_IOAPIC; 112 | ioapic->apicid = num_cpus + 1; 113 | ioapic->apicver = APIC_VERSION; 114 | ioapic->flags = MPC_APIC_USABLE; 115 | ioapic->apicaddr = IO_APIC_DEFAULT_PHYS_BASE; 116 | checksum += mptable_checksum((char *) ioapic, ssize); 117 | 118 | //6.Intel MP io interrupt 119 | offset += ssize; 120 | ssize = sizeof(struct mpc_intsrc); 121 | 122 | for (i = 0; i < 16; i++) { 123 | intsrc = (struct mpc_intsrc *)get_userspace_addr(MPTABLE_START + offset); 124 | memset(intsrc, 0, ssize); 125 | intsrc->type = MP_INTSRC; 126 | intsrc->irqtype = mp_INT; 127 | intsrc->irqflag = MP_IRQDIR_DEFAULT; 128 | intsrc->srcbus = 0; 129 | intsrc->srcbusirq = i; 130 | intsrc->dstapic = num_cpus + 1; 131 | intsrc->dstirq = i; 132 | checksum += mptable_checksum((char *) intsrc, ssize); 133 | offset += ssize; 134 | } 135 | 136 | //7.Intel MP local ext interrupt 137 | ssize = sizeof(struct mpc_lintsrc); 138 | 139 | lintsrc = (struct mpc_lintsrc *)get_userspace_addr(MPTABLE_START + offset); 140 | memset(lintsrc, 0, ssize); 141 | lintsrc->type = MP_LINTSRC; 142 | lintsrc->irqtype = mp_ExtINT; 143 | lintsrc->irqflag = MP_IRQDIR_DEFAULT; 144 | lintsrc->srcbusid = 0; 145 | lintsrc->srcbusirq = 0; 146 | lintsrc->destapic = num_cpus + 1; 147 | lintsrc->destapiclint = 0; 148 | checksum += mptable_checksum((char *) lintsrc, ssize); 149 | 150 | //8.Intel MP local nmi interrupt 151 | offset += ssize; 152 | 153 | lintsrc = (struct mpc_lintsrc *)get_userspace_addr(MPTABLE_START + offset); 154 | memset(lintsrc, 0, ssize); 155 | lintsrc->type = MP_LINTSRC; 156 | lintsrc->irqtype = mp_NMI; 157 | lintsrc->irqflag = MP_IRQDIR_DEFAULT; 158 | lintsrc->srcbusid = 0; 159 | lintsrc->srcbusirq = 0; 160 | lintsrc->destapic = 0xFF; 161 | lintsrc->destapiclint = 1; 162 | checksum += mptable_checksum((char *) lintsrc, ssize); 163 | 164 | offset += ssize; 165 | ssize = sizeof(struct mpc_table); 166 | 167 | table->length = offset - sizeof(struct mpf_intel); 168 | checksum += mptable_checksum((char *) table, ssize); 169 | table->checksum -= checksum; 170 | } 171 | 172 | void _test_mptable() 173 | { 174 | struct mpf_intel *mpf; 175 | mpf = (struct mpf_intel *)get_userspace_addr(MPTABLE_START); 176 | 177 | fprintf(stderr, "mpf->signature:"); 178 | for(int i=0;i<4;i++){ 179 | fprintf(stderr, "%c",mpf->signature[i]); 180 | } 181 | fprintf(stderr, "\n"); 182 | } 183 | -------------------------------------------------------------------------------- /main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | #include "global.h" 16 | #include "memory.h" 17 | #include "mptable.h" 18 | #include "bootparams.h" 19 | #include "gdt.h" 20 | #include "vcpu.h" 21 | #include "ioeventfd.h" 22 | #include "iobus.h" 23 | #include "serial.h" 24 | #include "pci.h" 25 | #include "virtio-blk.h" 26 | 27 | #define KVM_API_VERSION 12 28 | #define VCPU_ID 0 29 | #define VCPU_COUNT 1 30 | 31 | #define DPRINTF(fmt, ...) \ 32 | do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0) 33 | 34 | struct KVMState { 35 | int fd; 36 | int vmfd; 37 | struct diskimg diskimg; 38 | struct virtio_blk_dev virtio_blk_dev; 39 | }; 40 | 41 | typedef struct VCPUState { 42 | int vcpu_fd; 43 | struct kvm_run *kvm_run; 44 | } X86VCPUState; 45 | 46 | struct KVMState *kvm_state; 47 | 48 | char *kernel_file=NULL; 49 | char *initrd_file=NULL; 50 | char *disk_file = NULL; 51 | 52 | static void init_vcpu(struct VCPUState *vcpu) 53 | { 54 | long mmap_size; 55 | 56 | vcpu->vcpu_fd = ioctl(kvm_state->vmfd, KVM_CREATE_VCPU, VCPU_ID); 57 | if (vcpu->vcpu_fd < 0) { 58 | fprintf(stderr, "kvm_create_vcpu failed\n"); 59 | } 60 | mmap_size = ioctl(kvm_state->fd, KVM_GET_VCPU_MMAP_SIZE, 0); 61 | if (mmap_size < 0) { 62 | fprintf(stderr, "KVM_GET_VCPU_MMAP_SIZE failed\n"); 63 | } 64 | vcpu->kvm_run = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, 65 | vcpu->vcpu_fd, 0); 66 | if (vcpu->kvm_run == MAP_FAILED) { 67 | fprintf(stderr, "mmap'ing vcpu state failed\n"); 68 | } 69 | } 70 | 71 | static int destroy_vcpu(struct VCPUState *vcpu) 72 | { 73 | int ret = 0; 74 | long mmap_size; 75 | 76 | mmap_size = ioctl(kvm_state->fd, KVM_GET_VCPU_MMAP_SIZE, 0); 77 | if (mmap_size < 0) { 78 | fprintf(stderr, "KVM_GET_VCPU_MMAP_SIZE failed\n"); 79 | } 80 | ret = munmap(vcpu->kvm_run, mmap_size); 81 | if (ret < 0) { 82 | fprintf(stderr, "munmap vcpu state failed\n"); 83 | } 84 | } 85 | 86 | static int vcpu_exec(struct VCPUState *vcpu) 87 | { 88 | struct kvm_run *run = vcpu->kvm_run; 89 | int ret, run_ret; 90 | do{ 91 | //sleep(1); 92 | run_ret = ioctl(vcpu->vcpu_fd, KVM_RUN, 0); 93 | if (run_ret < 0) { 94 | fprintf(stderr, "error: kvm run failed %s\n", 95 | strerror(-run_ret)); 96 | ret = -1; 97 | break; 98 | } 99 | switch (run->exit_reason) { 100 | case KVM_EXIT_HLT: 101 | DPRINTF("hlt\n"); 102 | return 0; 103 | case KVM_EXIT_IO: 104 | iobus_handle_pio(run); 105 | ret = 0; 106 | break; 107 | case KVM_EXIT_MMIO: 108 | iobus_handle_mmio(run); 109 | ret = 0; 110 | break; 111 | case KVM_EXIT_IRQ_WINDOW_OPEN: 112 | DPRINTF("irq_window_open\n"); 113 | ret = -1; 114 | break; 115 | case KVM_EXIT_SHUTDOWN: 116 | DPRINTF("shutdown\n"); 117 | ret = -1; 118 | break; 119 | case KVM_EXIT_UNKNOWN: 120 | fprintf(stderr, "KVM: unknown exit, hardware reason %" PRIx64 "\n", 121 | (uint64_t)run->hw.hardware_exit_reason); 122 | ret = -1; 123 | break; 124 | case KVM_EXIT_INTERNAL_ERROR: 125 | DPRINTF("internal_error\n"); 126 | break; 127 | case KVM_EXIT_SYSTEM_EVENT: 128 | DPRINTF("system_event\n"); 129 | break; 130 | default: 131 | DPRINTF("kvm_arch_handle_exit:%d\n",run->exit_reason); 132 | break; 133 | } 134 | }while (ret == 0); 135 | return ret; 136 | } 137 | 138 | static void *vcpu_thread_fn(void *arg) 139 | { 140 | struct VCPUState *cpu = arg; 141 | vcpu_exec(cpu); 142 | destroy_vcpu(cpu); 143 | } 144 | 145 | static void setup_pagetable() { 146 | *(uint64_t *)get_userspace_addr(PML4_START) = PDPTE_START | 0x03; 147 | *(uint64_t *)get_userspace_addr(PDPTE_START) = PDE_START | 0x03; 148 | for (int i=0;i<512;i++) { 149 | *(uint64_t *)get_userspace_addr(PDE_START + i * 8) = (i << 21) + 0x83; 150 | } 151 | } 152 | 153 | static void init_linux_boot() { 154 | setup_pagetable(); 155 | setup_mptable(VCPU_COUNT); 156 | setup_cmdline(); 157 | setup_boot_params(kernel_file, initrd_file); 158 | setup_gdt(); 159 | setup_idt(); 160 | } 161 | 162 | static void create_base_dev() 163 | { 164 | int ret; 165 | ret = ioctl(kvm_state->vmfd, KVM_CREATE_IRQCHIP); 166 | if (ret < 0) { 167 | fprintf(stderr, "create irqchip failed\n"); 168 | } 169 | ret = ioctl(kvm_state->vmfd, KVM_SET_TSS_ADDR, 0xfffbc000+0x1000); 170 | if (ret < 0) { 171 | fprintf(stderr, "set tss addr failed\n"); 172 | } 173 | struct kvm_pit_config config = { 174 | .flags = KVM_PIT_SPEAKER_DUMMY, 175 | }; 176 | if (ioctl(kvm_state->vmfd, KVM_CHECK_EXTENSION, KVM_CAP_PIT2)) { 177 | ret = ioctl(kvm_state->vmfd, KVM_CREATE_PIT2, &config); 178 | } else { 179 | ret = ioctl(kvm_state->vmfd, KVM_CREATE_PIT); 180 | } 181 | if (ret < 0) { 182 | fprintf(stderr, "create pit failed\n"); 183 | } 184 | } 185 | 186 | #define print_option(args, help_msg) printf(" %s %s", args, help_msg) 187 | static void usage(const char *execpath) 188 | { 189 | printf("\nusage: %s [args]\n\n", execpath); 190 | printf("example: %s -k ./out/vmlinux.bin -i ./out/initrd.img -d ./out/disk.img \n\n", execpath); 191 | printf("args:\n"); 192 | print_option("-k, --kernel kernel_file", "input the kernel file\n"); 193 | print_option("-i, --initrd initrd_file", "input the initrd file\n"); 194 | print_option("-d, --disk disk_file", "input the disk file\n"); 195 | print_option("-h, --help", "Print help\n"); 196 | } 197 | 198 | int main(int argc, char **argv) { 199 | int ret; 200 | kvm_state = malloc(sizeof(struct KVMState)); 201 | struct VCPUState *vcpu = malloc(sizeof(struct VCPUState)); 202 | pthread_t vcpu_thread; 203 | 204 | int c; 205 | int option_index = 0; 206 | struct option opts[] = { 207 | {"kernel", required_argument, NULL, 'k'}, 208 | {"initrd", required_argument, NULL, 'i'}, 209 | {"disk", required_argument, NULL, 'd'}, 210 | {"help", no_argument, NULL, 'h'}, 211 | }; 212 | while ((c = getopt_long(argc, argv, "k:i:d:h", opts, &option_index)) != -1) { 213 | switch (c) { 214 | case 'k': 215 | kernel_file = optarg; 216 | break; 217 | case 'i': 218 | initrd_file = optarg; 219 | break; 220 | case 'd': 221 | disk_file = optarg; 222 | break; 223 | case 'h': 224 | usage(argv[0]); 225 | exit(1); 226 | default: 227 | break; 228 | } 229 | } 230 | if(!kernel_file || !initrd_file) { 231 | fprintf(stderr, "Must input kernel and initrd file\n"); 232 | return -1; 233 | } 234 | 235 | //open kvm device 236 | kvm_state->fd = open("/dev/kvm", O_RDWR); 237 | if (kvm_state->fd < 0) { 238 | fprintf(stderr, "Could not access KVM kernel module\n"); 239 | return -1; 240 | } 241 | 242 | //check api version 243 | if (ioctl(kvm_state->fd, KVM_GET_API_VERSION, 0) != KVM_API_VERSION) { 244 | fprintf(stderr, "kvm version not supported\n"); 245 | return -1; 246 | } 247 | 248 | //create vm 249 | do { 250 | ret = ioctl(kvm_state->fd, KVM_CREATE_VM, 0); 251 | } while (ret == -EINTR); 252 | if (ret < 0) { 253 | fprintf(stderr, "ioctl(KVM_CREATE_VM) failed: %d %s\n", -ret, 254 | strerror(-ret)); 255 | return -1; 256 | } 257 | kvm_state->vmfd = ret; 258 | 259 | //Init kvm_based vm devices 260 | create_base_dev(); 261 | 262 | //init ram 263 | init_memory_map(kvm_state->vmfd, RAM_SIZE); 264 | 265 | //init vcpu 266 | init_vcpu(vcpu); 267 | 268 | //run linux boot 269 | init_linux_boot(); 270 | 271 | //ioevent 272 | ioeventfd_init(kvm_state->vmfd); 273 | 274 | //ioregion 275 | iobus_init(); 276 | pcibus_init(); 277 | 278 | //create serial dev 279 | create_serial_dev(kvm_state->vmfd); 280 | 281 | //virio pci 282 | if(disk_file) { 283 | if (diskimg_init(&kvm_state->diskimg, disk_file) < 0) { 284 | fprintf(stderr, "load diskimg failed\n"); 285 | return -1; 286 | } 287 | fprintf(stderr, "load diskimg done\n"); 288 | virtio_blk_init_pci(kvm_state->vmfd, 289 | &kvm_state->virtio_blk_dev, 290 | &kvm_state->diskimg); 291 | } 292 | 293 | //vcpu run 294 | setup_vcpu(kvm_state->fd, vcpu->vcpu_fd, VCPU_COUNT, VCPU_ID); 295 | reset_vcpu(kvm_state->fd, vcpu->vcpu_fd, VCPU_COUNT, VCPU_ID); 296 | if (pthread_create(&(vcpu_thread), (const pthread_attr_t *)NULL, 297 | vcpu_thread_fn, vcpu) != 0) { 298 | fprintf(stderr, "can not create kvm cpu thread"); 299 | exit(1); 300 | } 301 | pthread_join(vcpu_thread, NULL); 302 | 303 | //exit 304 | close(vcpu->vcpu_fd); 305 | close(kvm_state->vmfd); 306 | close(kvm_state->fd); 307 | free(vcpu); 308 | free(kvm_state); 309 | } 310 | 311 | -------------------------------------------------------------------------------- /virtio-pci.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #include "pci.h" 10 | #include "virtio-pci.h" 11 | #include "ioeventfd.h" 12 | 13 | #define VIRTIO_PCI_VENDOR_ID 0x1AF4 14 | #define VIRTIO_PCI_CAP_NUM 5 15 | 16 | #define container_of(ptr, type, member) \ 17 | ({ \ 18 | void *__mptr = (void *) (ptr); \ 19 | ((type *) (__mptr - offsetof(type, member))); \ 20 | }) 21 | 22 | static void virtio_pci_ioevent_callback(void *virtq) 23 | { 24 | struct virtq *vq = virtq; 25 | virtq_notify(vq); 26 | } 27 | 28 | static void virtio_pci_init_ioeventfd(struct virtio_pci_dev *dev, uint16_t vqn) 29 | { 30 | uint64_t base = PCI_HDR_READ(dev->pci_dev.hdr, 31 | PCI_BAR_OFFSET(dev->notify_cap->cap.bar), 32); 32 | uint64_t offset = 33 | dev->notify_cap->cap.offset + 34 | dev->notify_cap->notify_off_multiplier * dev->vq[vqn].info.notify_off; 35 | 36 | int flags = KVM_IOEVENTFD_FLAG_DATAMATCH; 37 | struct ioevent ioevent = (struct ioevent) { 38 | .kvm_ioeventfd.datamatch = vqn, 39 | .kvm_ioeventfd.addr = base + offset, 40 | .kvm_ioeventfd.len = 2, 41 | .kvm_ioeventfd.fd = eventfd(0, 0), 42 | .kvm_ioeventfd.flags = flags, 43 | .fn = virtio_pci_ioevent_callback, 44 | .fn_ptr = &(dev->vq[vqn]), 45 | }; 46 | ioeventfd_add_event(dev->vmfd, &ioevent); 47 | } 48 | 49 | static void virtio_pci_cmd_select_device_feature(struct virtio_pci_dev *dev) 50 | { 51 | uint32_t select = dev->config.common_cfg.device_feature_select; 52 | uint64_t feature = dev->device_feature; 53 | 54 | switch (select) { 55 | case 0: 56 | dev->config.common_cfg.device_feature = feature; 57 | break; 58 | case 1: 59 | dev->config.common_cfg.device_feature = feature >> 32; 60 | break; 61 | default: 62 | dev->config.common_cfg.device_feature = 0; 63 | break; 64 | } 65 | } 66 | 67 | static void virtio_pci_cmd_write_guest_feature(struct virtio_pci_dev *dev) 68 | { 69 | uint32_t select = dev->config.common_cfg.guest_feature_select; 70 | uint32_t feature = dev->config.common_cfg.guest_feature; 71 | 72 | switch (select) { 73 | case 0: 74 | dev->guest_feature |= feature; 75 | break; 76 | case 1: 77 | dev->guest_feature |= (uint64_t) feature << 32; 78 | break; 79 | default: 80 | break; 81 | } 82 | } 83 | 84 | static void virtio_pci_cmd_select_virtq(struct virtio_pci_dev *dev) 85 | { 86 | uint16_t select = dev->config.common_cfg.queue_select; 87 | struct virtio_pci_common_cfg *config = &dev->config.common_cfg; 88 | 89 | if (select < config->num_queues) { 90 | uint64_t offset = offsetof(struct virtio_pci_common_cfg, queue_size); 91 | memcpy((void *) config + offset, &dev->vq[select].info, 92 | sizeof(struct virtq_info)); 93 | } else { 94 | config->queue_size = 0; 95 | } 96 | } 97 | 98 | static void virtio_pci_cmd_enable_virtq(struct virtio_pci_dev *dev) 99 | { 100 | uint16_t select = dev->config.common_cfg.queue_select; 101 | virtq_enable(&dev->vq[select]); 102 | virtio_pci_init_ioeventfd(dev, select); 103 | } 104 | 105 | static void virtio_pci_iospace_write(struct virtio_pci_dev *dev, 106 | void *data, 107 | uint64_t offset, 108 | uint8_t size) 109 | { 110 | //pci cfg 111 | if (offset < offsetof(struct virtio_pci_config, dev_cfg)) { 112 | memcpy((void *) &dev->config + offset, data, size); 113 | switch (offset) { 114 | case VIRTIO_PCI_COMMON_DFSELECT: 115 | virtio_pci_cmd_select_device_feature(dev); 116 | break; 117 | case VIRTIO_PCI_COMMON_GFSELECT: 118 | virtio_pci_cmd_write_guest_feature(dev); 119 | break; 120 | case VIRTIO_PCI_COMMON_Q_SELECT: 121 | virtio_pci_cmd_select_virtq(dev); 122 | break; 123 | case VIRTIO_PCI_COMMON_Q_ENABLE: 124 | if (dev->config.common_cfg.queue_enable) 125 | virtio_pci_cmd_enable_virtq(dev); 126 | else 127 | fprintf(stderr, "guest disable virtq\n"); 128 | break; 129 | default: 130 | if (offset >= VIRTIO_PCI_COMMON_Q_SIZE && 131 | offset <= VIRTIO_PCI_COMMON_Q_USEDHI) { 132 | uint16_t select = dev->config.common_cfg.queue_select; 133 | uint64_t info_offset = offset - VIRTIO_PCI_COMMON_Q_SIZE; 134 | if (select < dev->config.common_cfg.num_queues) { 135 | memcpy((void *) &dev->vq[select].info + info_offset, data, size); 136 | } 137 | } 138 | else if (offset == offsetof(struct virtio_pci_config, notify_cfg)) { 139 | virtq_notify(&dev->vq[dev->config.notify_cfg.vqn]); 140 | } 141 | break; 142 | } 143 | return; 144 | } 145 | 146 | //dev cfg 147 | uint64_t dev_offset = offset - offsetof(struct virtio_pci_config, dev_cfg); 148 | memcpy((void *) dev->config.dev_cfg + dev_offset, data, size); 149 | } 150 | 151 | static void virtio_pci_iospace_read(struct virtio_pci_dev *dev, 152 | void *data, 153 | uint64_t offset, 154 | uint8_t size) 155 | { 156 | if (offset < offsetof(struct virtio_pci_config, dev_cfg)) { 157 | memcpy(data, (void *) &dev->config + offset, size); 158 | if (offset == offsetof(struct virtio_pci_config, isr_cfg)) { 159 | dev->config.isr_cfg.isr_status = 0; 160 | } 161 | } else { 162 | /* dev config read */ 163 | uint64_t dev_offset = 164 | offset - offsetof(struct virtio_pci_config, dev_cfg); 165 | memcpy(data, (void *) dev->config.dev_cfg + dev_offset, size); 166 | } 167 | } 168 | 169 | static void virtio_pci_iospace_handle_io(uint64_t offset, 170 | uint8_t size, 171 | void *data, 172 | uint8_t is_write, 173 | void *owner) 174 | { 175 | struct virtio_pci_dev *virtio_pci_dev = 176 | container_of(owner, struct virtio_pci_dev, pci_dev); 177 | if (is_write) { 178 | virtio_pci_iospace_write(virtio_pci_dev, data, offset, size); 179 | } 180 | else { 181 | virtio_pci_iospace_read(virtio_pci_dev, data, offset, size); 182 | } 183 | } 184 | 185 | static void virtio_pci_set_cap(struct virtio_pci_dev *dev, uint8_t next) 186 | { 187 | struct virtio_pci_cap *caps[VIRTIO_PCI_CAP_NUM + 1]; 188 | 189 | for (int i = 1; i < VIRTIO_PCI_CAP_NUM + 1; i++) { 190 | caps[i] = dev->pci_dev.hdr + next; 191 | *caps[i] = (struct virtio_pci_cap){ 192 | .cap_vndr = PCI_CAP_ID_VNDR, 193 | .cfg_type = i, 194 | .cap_len = sizeof(struct virtio_pci_cap), 195 | .bar = 0, 196 | }; 197 | if (i == VIRTIO_PCI_CAP_NOTIFY_CFG || i == VIRTIO_PCI_CAP_PCI_CFG) 198 | caps[i]->cap_len += sizeof(uint32_t); 199 | next += caps[i]->cap_len; 200 | caps[i]->cap_next = next; 201 | } 202 | 203 | caps[VIRTIO_PCI_CAP_COMMON_CFG]->offset = 204 | offsetof(struct virtio_pci_config, common_cfg); 205 | caps[VIRTIO_PCI_CAP_COMMON_CFG]->length = 206 | sizeof(struct virtio_pci_common_cfg); 207 | 208 | caps[VIRTIO_PCI_CAP_NOTIFY_CFG]->offset = 209 | offsetof(struct virtio_pci_config, notify_cfg); 210 | caps[VIRTIO_PCI_CAP_NOTIFY_CFG]->length = 211 | sizeof(struct virtio_pci_notify_cfg); 212 | 213 | caps[VIRTIO_PCI_CAP_ISR_CFG]->offset = 214 | offsetof(struct virtio_pci_config, isr_cfg); 215 | caps[VIRTIO_PCI_CAP_ISR_CFG]->length = sizeof(struct virtio_pci_isr_cfg); 216 | 217 | caps[VIRTIO_PCI_CAP_DEVICE_CFG]->offset = 218 | offsetof(struct virtio_pci_config, dev_cfg); 219 | caps[VIRTIO_PCI_CAP_DEVICE_CFG]->length = 0; 220 | 221 | dev->notify_cap = 222 | (struct virtio_pci_notify_cap *) caps[VIRTIO_PCI_CAP_NOTIFY_CFG]; 223 | dev->dev_cfg_cap = caps[VIRTIO_PCI_CAP_DEVICE_CFG]; 224 | } 225 | 226 | void virtio_pci_set_dev_cfg(struct virtio_pci_dev *dev, 227 | void *dev_cfg, 228 | uint8_t len) 229 | { 230 | dev->config.dev_cfg = dev_cfg; 231 | dev->dev_cfg_cap->length = len; 232 | } 233 | 234 | void virtio_pci_set_virtq_cfg(struct virtio_pci_dev *dev, 235 | struct virtq *vq, 236 | uint16_t num_queues) 237 | { 238 | dev->config.common_cfg.num_queues = num_queues; 239 | dev->vq = vq; 240 | } 241 | 242 | void virtio_pci_init(int vmfd, 243 | struct virtio_pci_dev *dev, 244 | uint16_t device_id, 245 | uint32_t class, 246 | uint8_t irq_line) 247 | { 248 | uint8_t cap_list = 0x40; 249 | 250 | memset(dev, 0x00, sizeof(struct virtio_pci_dev)); 251 | dev->vmfd = vmfd; 252 | pci_dev_init(&dev->pci_dev); 253 | PCI_HDR_WRITE(dev->pci_dev.hdr, PCI_VENDOR_ID, VIRTIO_PCI_VENDOR_ID, 16); 254 | PCI_HDR_WRITE(dev->pci_dev.hdr, PCI_CAPABILITY_LIST, cap_list, 8); 255 | PCI_HDR_WRITE(dev->pci_dev.hdr, PCI_HEADER_TYPE, PCI_HEADER_TYPE_NORMAL, 8); 256 | PCI_HDR_WRITE(dev->pci_dev.hdr, PCI_INTERRUPT_PIN, 1, 8); 257 | PCI_HDR_WRITE(dev->pci_dev.hdr, PCI_STATUS, PCI_STATUS_CAP_LIST|PCI_STATUS_INTERRUPT, 16); 258 | PCI_HDR_WRITE(dev->pci_dev.hdr, PCI_DEVICE_ID, device_id, 16); 259 | PCI_HDR_WRITE(dev->pci_dev.hdr, PCI_CLASS_REVISION, class << 8, 32); 260 | PCI_HDR_WRITE(dev->pci_dev.hdr, PCI_INTERRUPT_LINE, irq_line, 8); 261 | pci_init_bar(&dev->pci_dev, 0, 0x100, PCI_BASE_ADDRESS_SPACE_MEMORY, 262 | virtio_pci_iospace_handle_io); 263 | virtio_pci_set_cap(dev, cap_list); 264 | dev->device_feature |= 265 | (1ULL << VIRTIO_F_RING_PACKED) | (1ULL << VIRTIO_F_VERSION_1); 266 | } 267 | 268 | -------------------------------------------------------------------------------- /vcpu.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | #include "global.h" 8 | #include "memory.h" 9 | #include "gdt.h" 10 | #define KVM_MAX_CPUID_ENTRIES 80 11 | 12 | #define X86_FEATURE_HYPERVISOR 31 13 | #define X86_FEATURE_TSC_DEADLINE_TIMER 24 14 | 15 | #define ECX_EPB_SHIFT 3 16 | 17 | //see kernel arch/x86/include/asm/apicdef.h 18 | #define APIC_LVT0 0x350 19 | #define APIC_LVT1 0x360 20 | #define APIC_MODE_NMI 0x4 21 | #define APIC_MODE_EXTINT 0x7 22 | 23 | //see kernel arch/x86/include/uapi/asm/processor-flags.h 24 | #define X86_CR0_PE 0x1 25 | #define X86_CR0_PG 0x80000000 26 | 27 | #define MSR_EFER_LME (1 << 8) 28 | #define MSR_EFER_LMA (1 << 10) 29 | 30 | #define X86_CR4_PAE 0x20 31 | #define MXCSR_DEFAULT 0x1f80 32 | 33 | //see kernel arch/x86/include/asm/msr-index.h 34 | #define MSR_IA32_TSC 0x0010 35 | #define MSR_IA32_SYSENTER_CS 0x0174 36 | #define MSR_IA32_SYSENTER_ESP 0x0175 37 | #define MSR_IA32_SYSENTER_EIP 0x0176 38 | #define MSR_IA32_MISC_ENABLE 0x01a0 39 | #define MSR_STAR 0xc0000081 40 | #define MSR_LSTAR 0xc0000082 41 | #define MSR_CSTAR 0xc0000083 42 | #define MSR_SYSCALL_MASK 0xc0000084 43 | #define MSR_KERNELGSBASE 0xc0000102 44 | 45 | #define SET_APIC_DELIVERY_MODE(x, y) (((x) & ~0x700) | ((y) << 8)) 46 | 47 | struct kvm_lapic_state kapic; 48 | struct kvm_mp_state mp_state; 49 | struct kvm_regs regs; 50 | struct kvm_sregs sregs; 51 | struct kvm_fpu fpu; 52 | struct { 53 | struct kvm_msrs info; 54 | struct kvm_msr_entry entries[100]; 55 | } msr_data; 56 | 57 | struct kvm_msr_entry *msrs = msr_data.entries; 58 | 59 | static void host_cpuid(uint32_t function, uint32_t count, 60 | uint32_t *eax, uint32_t *ebx, 61 | uint32_t *ecx, uint32_t *edx) 62 | { 63 | uint32_t vec[4]; 64 | 65 | asm volatile("cpuid" 66 | : "=a"(vec[0]), "=b"(vec[1]), 67 | "=c"(vec[2]), "=d"(vec[3]) 68 | : "0"(function), "c"(count) : "cc"); 69 | 70 | if (eax) 71 | *eax = vec[0]; 72 | if (ebx) 73 | *ebx = vec[1]; 74 | if (ecx) 75 | *ecx = vec[2]; 76 | if (edx) 77 | *edx = vec[3]; 78 | } 79 | 80 | static void setup_cpuid(int kvm_fd, int vcpu_fd, int vcpu_count, int vcpu_id) 81 | { 82 | int ret, size; 83 | struct kvm_cpuid2 *cpuid; 84 | uint32_t max = KVM_MAX_CPUID_ENTRIES; 85 | uint32_t apic_id = vcpu_id; 86 | 87 | size = sizeof(*cpuid) + max * sizeof(*cpuid->entries); 88 | cpuid = malloc(size); 89 | memset(cpuid, 0, size); 90 | cpuid->nent = max; 91 | ret = ioctl(kvm_fd, KVM_GET_SUPPORTED_CPUID, cpuid); 92 | if (ret < 0) { 93 | fprintf(stderr, "get kvm cpuid2 failed!\n"); 94 | } 95 | if (ret == 0 && cpuid->nent >= max) { 96 | fprintf(stderr, "get kvm cpuid2 failed!\n"); 97 | } 98 | 99 | for (int i = 0; i < cpuid->nent; i++) { 100 | struct kvm_cpuid_entry2 *entry = &(cpuid->entries[i]); 101 | switch (entry->function) { 102 | case 1: 103 | if(entry->index == 0) { 104 | entry->ecx |= 1 << X86_FEATURE_HYPERVISOR; 105 | entry->ecx |= 1 << X86_FEATURE_TSC_DEADLINE_TIMER; 106 | } 107 | break; 108 | case 2: 109 | host_cpuid( 110 | 2, 111 | 0, 112 | &entry->eax, 113 | &entry->ebx, 114 | &entry->ecx, 115 | &entry->edx 116 | ); 117 | break; 118 | case 4: 119 | host_cpuid( 120 | 4, 121 | entry->index, 122 | &entry->eax, 123 | &entry->ebx, 124 | &entry->ecx, 125 | &entry->edx 126 | ); 127 | entry->eax &= ~0xfc000000; 128 | if((entry->eax & 0x0001ffff) != 0 && vcpu_count > 1) { 129 | entry->eax |= (vcpu_count - 1) << 26; 130 | } 131 | break; 132 | case 6: 133 | entry->ecx &= ~(1 << ECX_EPB_SHIFT); 134 | break; 135 | case 10: 136 | if(entry->eax != 0) { 137 | uint32_t version_id = entry->eax & 0xff; 138 | uint32_t num_counters = entry->eax & 0xff00; 139 | if(version_id != 2 || num_counters == 0) { 140 | entry->eax = 0; 141 | } 142 | } 143 | break; 144 | case 0xb: 145 | entry->edx = apic_id; 146 | entry->ecx = entry->index & 0xff; 147 | switch(entry->index) { 148 | case 0: 149 | entry->eax = 0; 150 | entry->ebx = 1; 151 | entry->ecx |= 1 << 8; 152 | break; 153 | case 1: 154 | entry->eax = 32 - vcpu_count; 155 | entry->ebx = vcpu_count; 156 | entry->ecx |= 2 << 8; 157 | break; 158 | default: 159 | entry->ebx = 0xff; 160 | } 161 | entry->ebx &= 0xffff; 162 | break; 163 | case 0x80000002: 164 | case 0x80000003: 165 | case 0x80000004: 166 | host_cpuid( 167 | entry->function, 168 | entry->index, 169 | &entry->eax, 170 | &entry->ebx, 171 | &entry->ecx, 172 | &entry->edx 173 | ); 174 | break; 175 | } 176 | } 177 | 178 | ret = ioctl(vcpu_fd, KVM_SET_CPUID2, cpuid); 179 | if (ret < 0) { 180 | fprintf(stderr, "set kvm cpuid2 failed\n"); 181 | } 182 | } 183 | 184 | //see https://wiki.osdev.org/APIC 185 | static void setup_lapic(int vcpu_fd) 186 | { 187 | int ret = 0; 188 | char r; 189 | 190 | ret = ioctl(vcpu_fd, KVM_GET_LAPIC, &kapic); 191 | if (ret < 0) { 192 | fprintf(stderr, "get lapic failed\n"); 193 | } 194 | 195 | r = SET_APIC_DELIVERY_MODE(kapic.regs[APIC_LVT0], APIC_MODE_EXTINT); 196 | kapic.regs[APIC_LVT0] = r; 197 | r = SET_APIC_DELIVERY_MODE(kapic.regs[APIC_LVT1], APIC_MODE_NMI); 198 | kapic.regs[APIC_LVT1] = r; 199 | } 200 | 201 | static void setup_mpstate(int vcpu_fd, int vcpu_id) 202 | { 203 | if(vcpu_id == 0) { 204 | mp_state.mp_state = KVM_MP_STATE_RUNNABLE; 205 | } else { 206 | mp_state.mp_state = KVM_MP_STATE_UNINITIALIZED; 207 | } 208 | } 209 | 210 | static void setup_regs(int vcpu_fd) 211 | { 212 | memset(®s, 0, sizeof regs); 213 | regs.rflags = 0x0002; 214 | regs.rip = VMLINUX_START; 215 | regs.rsp = BOOT_LOADER_SP; 216 | regs.rbp = BOOT_LOADER_SP; 217 | regs.rsi = ZERO_PAGE_START; 218 | } 219 | 220 | //see kernel arch/x86/include/uapi/asm/processor-flags.h 221 | static void setup_sregs(int vcpu_fd) 222 | { 223 | int ret = 0; 224 | struct kvm_segment code_segment; 225 | struct kvm_segment data_segment; 226 | 227 | ret = ioctl(vcpu_fd, KVM_GET_SREGS, &sregs); 228 | if (ret < 0) { 229 | fprintf(stderr, "get sregs failed\n"); 230 | } 231 | 232 | code_segment = get_code_kvm_seg(); 233 | data_segment = get_data_kvm_seg(); 234 | sregs.cs = code_segment; 235 | sregs.ds = data_segment; 236 | sregs.es = data_segment; 237 | sregs.fs = data_segment; 238 | sregs.gs = data_segment; 239 | sregs.ss = data_segment; 240 | 241 | // Init gdt table, gdt table has loaded to Guest Memory Space 242 | sregs.gdt.base = BOOT_GDT_START; 243 | sregs.gdt.limit = get_gdt_limit(); 244 | 245 | // Init idt table, idt table has loaded to Guest Memory Space 246 | sregs.idt.base = BOOT_IDT_START; 247 | sregs.idt.limit = get_idt_limit(); 248 | 249 | // Open 64-bit protected mode, include 250 | // Protection enable, Long mode enable, Long mode active 251 | sregs.cr0 |= X86_CR0_PE; 252 | sregs.efer |= (MSR_EFER_LME | MSR_EFER_LMA); 253 | 254 | // Setup page table 255 | sregs.cr3 = PML4_START; 256 | sregs.cr4 |= X86_CR4_PAE; 257 | sregs.cr0 |= X86_CR0_PG; 258 | } 259 | 260 | static void setup_fpu(int vcpu_fd) 261 | { 262 | memset(&fpu, 0, sizeof fpu); 263 | fpu.fcw = 0x37f; 264 | fpu.mxcsr = MXCSR_DEFAULT; 265 | } 266 | 267 | static void setup_msr_entry(struct kvm_msr_entry *entry, 268 | uint32_t index, uint64_t value) 269 | { 270 | entry->index = index; 271 | entry->data = value; 272 | } 273 | 274 | static void setup_msr(int vcpu_fd) 275 | { 276 | int n = 0; 277 | 278 | setup_msr_entry(&msrs[n++], MSR_IA32_SYSENTER_CS, 0); 279 | setup_msr_entry(&msrs[n++], MSR_IA32_SYSENTER_ESP, 0); 280 | setup_msr_entry(&msrs[n++], MSR_IA32_SYSENTER_EIP, 0); 281 | 282 | setup_msr_entry(&msrs[n++], MSR_STAR, 0); 283 | setup_msr_entry(&msrs[n++], MSR_LSTAR, 0); 284 | setup_msr_entry(&msrs[n++], MSR_CSTAR, 0); 285 | 286 | setup_msr_entry(&msrs[n++], MSR_SYSCALL_MASK, 0); 287 | setup_msr_entry(&msrs[n++], MSR_KERNELGSBASE, 0); 288 | setup_msr_entry(&msrs[n++], MSR_IA32_TSC, 0); 289 | setup_msr_entry(&msrs[n++], MSR_IA32_MISC_ENABLE, 1); 290 | 291 | msr_data.info.nmsrs = n; 292 | } 293 | 294 | void setup_vcpu(int kvm_fd, int vcpu_fd, int vcpu_count, int vcpu_id) 295 | { 296 | setup_lapic(vcpu_fd); 297 | setup_mpstate(vcpu_fd, vcpu_id); 298 | setup_sregs(vcpu_fd); 299 | setup_regs(vcpu_fd); 300 | setup_fpu(vcpu_fd); 301 | setup_msr(vcpu_fd); 302 | } 303 | 304 | void reset_vcpu(int kvm_fd, int vcpu_fd, int vcpu_count, int vcpu_id) 305 | { 306 | int ret = 0; 307 | 308 | setup_cpuid(kvm_fd, vcpu_fd, vcpu_count, vcpu_id); 309 | 310 | ret = ioctl(vcpu_fd, KVM_SET_LAPIC, &kapic); 311 | if (ret < 0) { 312 | fprintf(stderr, "set lapic failed\n"); 313 | } 314 | 315 | ret = ioctl(vcpu_fd, KVM_SET_MP_STATE, &mp_state); 316 | if (ret < 0) { 317 | fprintf(stderr, "set mp state failed\n"); 318 | } 319 | 320 | ret = ioctl(vcpu_fd, KVM_SET_REGS, ®s); 321 | if (ret < 0) { 322 | fprintf(stderr, "set regs failed\n"); 323 | } 324 | 325 | ret = ioctl(vcpu_fd, KVM_SET_SREGS, &sregs); 326 | if (ret < 0) { 327 | fprintf(stderr, "set sregs failed\n"); 328 | } 329 | 330 | ret = ioctl(vcpu_fd, KVM_SET_FPU, &fpu); 331 | if (ret < 0) { 332 | fprintf(stderr, "set fpu failed\n"); 333 | } 334 | 335 | ret = ioctl(vcpu_fd, KVM_SET_MSRS, &msr_data); 336 | if (ret < 0) { 337 | fprintf(stderr, "set msrs failed\n"); 338 | } 339 | } 340 | -------------------------------------------------------------------------------- /serial.c: -------------------------------------------------------------------------------- 1 | /********************************************************************************* 2 | rs232 Table of Registers 3 | ---------------------------------------------------------------------------------- 4 | Base Address DLAB Read/Write Abr. Register Name 5 | ---------------------------------------------------------------------------------- 6 | + 0 =0 Write - Transmitter Holding Buffer 7 | =0 Read - Receiver Buffer 8 | =1 Read/Write - Divisor Latch Low Byte 9 | ---------------------------------------------------------------------------------- 10 | + 1 =0 Read/Write IER Interrupt Enable Register 11 | =1 Read/Write - Divisor Latch High Byte 12 | ---------------------------------------------------------------------------------- 13 | + 2 - Read IIR Interrupt Identification Register 14 | - Write FCR FIFO Control Register 15 | ---------------------------------------------------------------------------------- 16 | + 3 - Read/Write LCR Line Control Register 17 | ---------------------------------------------------------------------------------- 18 | + 4 - Read/Write MCR Modem Control Register 19 | ---------------------------------------------------------------------------------- 20 | + 5 - Read LSR Line Status Register 21 | ---------------------------------------------------------------------------------- 22 | + 6 - Read MSR Modem Status Register 23 | ---------------------------------------------------------------------------------- 24 | + 7 - Read/Write - Scratch Register 25 | ---------------------------------------------------------------------------------- 26 | *********************************************************************************/ 27 | 28 | #include 29 | #include 30 | #include 31 | #include 32 | #include 33 | #include 34 | 35 | #include 36 | #include 37 | #include 38 | #include 39 | 40 | #include "global.h" 41 | #include "iobus.h" 42 | #include "serial.h" 43 | 44 | #define MMIO_SERIAL_IRQ 4 45 | #define RECEIVER_BUFF_SIZE 1024 46 | 47 | #define UART_IER_RDI 0x01 48 | #define UART_IER_THRI 0x02 49 | #define UART_IIR_NO_INT 0x01 50 | #define UART_IIR_THRI 0x02 51 | #define UART_IIR_RDI 0x04 52 | #define UART_IIR_ID 0x06 53 | 54 | #define UART_LCR_DLAB 0x80 55 | #define UART_LSR_DR 0x01 56 | #define UART_LSR_OE 0x02 57 | #define UART_LSR_BI 0x10 58 | #define UART_LSR_THRE 0x20 59 | #define UART_LSR_TEMT 0x40 60 | 61 | #define UART_MCR_OUT2 0x08 62 | #define UART_MCR_LOOP 0x10 63 | #define UART_MSR_CTS 0x10 64 | #define UART_MSR_DSR 0x20 65 | #define UART_MSR_DCD 0x80 66 | 67 | #define UART_FIFO_LENGTH 16 /* 16550A Fifo Length */ 68 | 69 | struct SerialFIFO { 70 | uint8_t data[UART_FIFO_LENGTH]; 71 | uint8_t count; 72 | uint8_t itl; /* Interrupt Trigger Level */ 73 | uint8_t tail; 74 | uint8_t head; 75 | } typedef SerialFIFO; 76 | 77 | struct Serial { 78 | uint8_t rbr; 79 | uint8_t thr; 80 | 81 | uint8_t ier; 82 | 83 | uint8_t iir; 84 | uint8_t fcr; 85 | 86 | uint8_t lcr; 87 | uint8_t mcr; 88 | uint8_t lsr; 89 | uint8_t msr; 90 | uint8_t scr; 91 | 92 | uint16_t div; 93 | uint32_t thr_pending; 94 | uint32_t interrupt_evt; 95 | SerialFIFO recv_fifo; 96 | } Serial = { 97 | .ier = 0, 98 | .iir = UART_IIR_NO_INT, 99 | .lcr = 0x03, 100 | .mcr = UART_MCR_OUT2, 101 | .lsr = UART_LSR_TEMT | UART_LSR_THRE, 102 | .msr = UART_MSR_DCD | UART_MSR_DSR | UART_MSR_CTS, 103 | .scr = 0, 104 | .div = 0x0c, 105 | .thr_pending = 0, 106 | }; 107 | 108 | extern struct bus pio_bus; 109 | struct region io_region; 110 | 111 | static void fifo_clear() 112 | { 113 | SerialFIFO *f = &(Serial.recv_fifo); 114 | memset(f->data, 0, UART_FIFO_LENGTH); 115 | f->count = 0; 116 | f->head = 0; 117 | f->tail = 0; 118 | } 119 | 120 | static int fifo_put(uint8_t chr) 121 | { 122 | SerialFIFO *f = &(Serial.recv_fifo); 123 | f->data[f->head++] = chr; 124 | if (f->head == UART_FIFO_LENGTH) 125 | f->head = 0; 126 | f->count++; 127 | 128 | return 1; 129 | } 130 | 131 | static uint8_t fifo_get() 132 | { 133 | SerialFIFO *f = &(Serial.recv_fifo); 134 | uint8_t c; 135 | 136 | if(f->count == 0) 137 | return 0; 138 | 139 | c = f->data[f->tail++]; 140 | if (f->tail == UART_FIFO_LENGTH) 141 | f->tail = 0; 142 | f->count--; 143 | 144 | return c; 145 | } 146 | 147 | static void update_serial_iir() 148 | { 149 | uint8_t iir = UART_IIR_NO_INT; 150 | 151 | if((Serial.ier & UART_IER_RDI) != 0 && (Serial.lsr & UART_LSR_DR) != 0) { 152 | iir &= ~UART_IIR_NO_INT; 153 | iir |= UART_IIR_RDI; 154 | } else if((Serial.ier & UART_IER_THRI) != 0 && (Serial.thr_pending > 0)) { 155 | iir &= ~UART_IIR_NO_INT; 156 | iir |= UART_IIR_THRI; 157 | } 158 | 159 | Serial.iir = iir; 160 | 161 | if(iir != UART_IIR_NO_INT) { 162 | uint64_t u = 1; 163 | write(Serial.interrupt_evt, &u, sizeof(uint64_t)); 164 | } 165 | } 166 | 167 | static void receive_serial_input(uint8_t data) 168 | { 169 | if((Serial.mcr & UART_MCR_LOOP) == 0) { 170 | if(Serial.recv_fifo.count >= UART_FIFO_LENGTH) { 171 | fprintf(stderr, "Overflow UART_FIFO_LENGTH\n"); 172 | } 173 | 174 | fifo_put(data); 175 | Serial.lsr |= UART_LSR_DR; 176 | 177 | update_serial_iir(); 178 | } 179 | } 180 | 181 | static void *serial_thread_fn(void *arg) 182 | { 183 | //set stdin raw mode 184 | int fd = STDIN_FILENO; 185 | struct termios t; 186 | if (tcgetattr(fd, &t) < 0){ 187 | fprintf(stderr, "stdin tcgetattr failed\n"); 188 | } 189 | t.c_lflag &= ~ICANON; 190 | t.c_lflag &= ~ECHO; 191 | if (tcsetattr(fd, TCSANOW, &t) < 0){ 192 | fprintf(stderr, "stdin tcsetattr failed\n"); 193 | } 194 | 195 | //epoll stdin 196 | int epoll_fd = epoll_create(1024); 197 | struct epoll_event event; 198 | event.events = EPOLLIN; 199 | event.data.fd = fd; 200 | epoll_ctl(epoll_fd,EPOLL_CTL_ADD,fd,&event); 201 | struct epoll_event event_buf[16]; 202 | uint8_t read_buf[1]; 203 | while (1){ 204 | int cnt = epoll_wait(epoll_fd,event_buf,16,-1); 205 | if (cnt<0){ 206 | fprintf(stderr, "epoll failed\n"); 207 | }else{ 208 | for(int i=0;i> 8); 239 | } else { 240 | ret = Serial.ier; 241 | } 242 | break; 243 | case 2: 244 | ret = Serial.iir | 0xc0; 245 | Serial.thr_pending = 0; 246 | Serial.iir = UART_IIR_NO_INT; 247 | break; 248 | case 3: 249 | ret = Serial.lcr; 250 | break; 251 | case 4: 252 | ret = Serial.mcr; 253 | break; 254 | case 5: 255 | ret = Serial.lsr; 256 | break; 257 | case 6: 258 | if((Serial.mcr & UART_MCR_LOOP) != 0) { 259 | ret = (Serial.mcr & 0x0c) << 4; 260 | ret |= (Serial.mcr & 0x02) << 3; 261 | ret |= (Serial.mcr & 0x01) << 5; 262 | } else { 263 | ret = Serial.msr; 264 | } 265 | break; 266 | case 7: 267 | ret = Serial.scr; 268 | break; 269 | } 270 | return ret; 271 | } 272 | 273 | static void write_serial_reg(uint64_t port, uint8_t data) 274 | { 275 | uint64_t reg = port; 276 | 277 | switch (reg){ 278 | case 0: 279 | if((Serial.lcr & UART_LCR_DLAB) != 0) { 280 | Serial.div = (Serial.div & 0xff00) | (uint16_t)data; 281 | } else { 282 | Serial.thr_pending = 1; 283 | 284 | if((Serial.mcr & UART_MCR_LOOP) != 0){ 285 | if(Serial.recv_fifo.count >= UART_FIFO_LENGTH) { 286 | fprintf(stderr, "Overflow UART_FIFO_LENGTH\n"); 287 | } 288 | 289 | fifo_put(data); 290 | Serial.lsr |= UART_LSR_DR; 291 | } else { 292 | fprintf(stderr, "%c",data);//output 293 | } 294 | 295 | update_serial_iir(); 296 | } 297 | break; 298 | case 1: 299 | if((Serial.lcr & UART_LCR_DLAB) != 0) { 300 | Serial.div = (Serial.div & 0x00ff) | ((uint16_t)(data) << 8); 301 | } else { 302 | int changed = (Serial.ier ^ data) & 0x0f; 303 | Serial.ier = data & 0x0f; 304 | 305 | if(changed != 0) { 306 | update_serial_iir(); 307 | } 308 | } 309 | break; 310 | case 3: 311 | Serial.lcr = data; 312 | break; 313 | case 4: 314 | Serial.mcr = data; 315 | break; 316 | case 7: 317 | Serial.scr = data; 318 | break; 319 | } 320 | 321 | } 322 | 323 | static void serial_handle_io(uint64_t port, uint8_t size, void *data, uint8_t is_write, void *owner) 324 | { 325 | if(is_write) { 326 | write_serial_reg(port, *(uint8_t *)(data)); 327 | } else { 328 | *(uint8_t *)(data) = read_serial_reg(port); 329 | } 330 | } 331 | 332 | void create_serial_dev(int vmfd) 333 | { 334 | int ret; 335 | Serial.interrupt_evt = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 336 | 337 | struct kvm_irqfd irqfd = { 338 | .fd = Serial.interrupt_evt, 339 | .gsi = MMIO_SERIAL_IRQ, 340 | }; 341 | 342 | ret = ioctl(vmfd, KVM_IRQFD, &irqfd); 343 | if(ret<0){ 344 | fprintf(stderr, "register serial irq fd failed\n"); 345 | } 346 | 347 | region_init(&io_region, IO_SERIAL_START, IO_SERIAL_SIZE, NULL, serial_handle_io); 348 | iobus_register_region(&pio_bus, &io_region); 349 | 350 | pthread_t serial_thread; 351 | 352 | if (pthread_create(&(serial_thread), (const pthread_attr_t *)NULL, 353 | serial_thread_fn, NULL) != 0) { 354 | fprintf(stderr, "can not create serial thread"); 355 | } 356 | } 357 | -------------------------------------------------------------------------------- /config/busybox.config: -------------------------------------------------------------------------------- 1 | # 2 | # Automatically generated make config: don't edit 3 | # Busybox version: 1.34.1 4 | # Fri Nov 25 17:17:14 2022 5 | # 6 | CONFIG_HAVE_DOT_CONFIG=y 7 | 8 | # 9 | # Settings 10 | # 11 | CONFIG_DESKTOP=y 12 | # CONFIG_EXTRA_COMPAT is not set 13 | # CONFIG_FEDORA_COMPAT is not set 14 | CONFIG_INCLUDE_SUSv2=y 15 | CONFIG_LONG_OPTS=y 16 | CONFIG_SHOW_USAGE=y 17 | CONFIG_FEATURE_VERBOSE_USAGE=y 18 | CONFIG_FEATURE_COMPRESS_USAGE=y 19 | CONFIG_LFS=y 20 | # CONFIG_PAM is not set 21 | CONFIG_FEATURE_DEVPTS=y 22 | CONFIG_FEATURE_UTMP=y 23 | CONFIG_FEATURE_WTMP=y 24 | CONFIG_FEATURE_PIDFILE=y 25 | CONFIG_PID_FILE_PATH="/var/run" 26 | CONFIG_BUSYBOX=y 27 | CONFIG_FEATURE_SHOW_SCRIPT=y 28 | CONFIG_FEATURE_INSTALLER=y 29 | # CONFIG_INSTALL_NO_USR is not set 30 | CONFIG_FEATURE_SUID=y 31 | CONFIG_FEATURE_SUID_CONFIG=y 32 | CONFIG_FEATURE_SUID_CONFIG_QUIET=y 33 | # CONFIG_FEATURE_PREFER_APPLETS is not set 34 | CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" 35 | # CONFIG_SELINUX is not set 36 | # CONFIG_FEATURE_CLEAN_UP is not set 37 | CONFIG_FEATURE_SYSLOG_INFO=y 38 | CONFIG_FEATURE_SYSLOG=y 39 | 40 | # 41 | # Build Options 42 | # 43 | CONFIG_STATIC=y 44 | # CONFIG_PIE is not set 45 | # CONFIG_NOMMU is not set 46 | # CONFIG_BUILD_LIBBUSYBOX is not set 47 | # CONFIG_FEATURE_LIBBUSYBOX_STATIC is not set 48 | # CONFIG_FEATURE_INDIVIDUAL is not set 49 | # CONFIG_FEATURE_SHARED_BUSYBOX is not set 50 | CONFIG_CROSS_COMPILER_PREFIX="" 51 | CONFIG_SYSROOT="" 52 | CONFIG_EXTRA_CFLAGS="" 53 | CONFIG_EXTRA_LDFLAGS="" 54 | CONFIG_EXTRA_LDLIBS="" 55 | # CONFIG_USE_PORTABLE_CODE is not set 56 | CONFIG_STACK_OPTIMIZATION_386=y 57 | CONFIG_STATIC_LIBGCC=y 58 | 59 | # 60 | # Installation Options ("make install" behavior) 61 | # 62 | CONFIG_INSTALL_APPLET_SYMLINKS=y 63 | # CONFIG_INSTALL_APPLET_HARDLINKS is not set 64 | # CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set 65 | # CONFIG_INSTALL_APPLET_DONT is not set 66 | # CONFIG_INSTALL_SH_APPLET_SYMLINK is not set 67 | # CONFIG_INSTALL_SH_APPLET_HARDLINK is not set 68 | # CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set 69 | CONFIG_PREFIX="./_install" 70 | 71 | # 72 | # Debugging Options 73 | # 74 | # CONFIG_DEBUG is not set 75 | # CONFIG_DEBUG_PESSIMIZE is not set 76 | # CONFIG_DEBUG_SANITIZE is not set 77 | # CONFIG_UNIT_TEST is not set 78 | # CONFIG_WERROR is not set 79 | # CONFIG_WARN_SIMPLE_MSG is not set 80 | CONFIG_NO_DEBUG_LIB=y 81 | # CONFIG_DMALLOC is not set 82 | # CONFIG_EFENCE is not set 83 | 84 | # 85 | # Library Tuning 86 | # 87 | # CONFIG_FEATURE_USE_BSS_TAIL is not set 88 | CONFIG_FLOAT_DURATION=y 89 | CONFIG_FEATURE_RTMINMAX=y 90 | CONFIG_FEATURE_RTMINMAX_USE_LIBC_DEFINITIONS=y 91 | CONFIG_FEATURE_BUFFERS_USE_MALLOC=y 92 | # CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set 93 | # CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set 94 | CONFIG_PASSWORD_MINLEN=6 95 | CONFIG_MD5_SMALL=1 96 | CONFIG_SHA3_SMALL=1 97 | # CONFIG_FEATURE_FAST_TOP is not set 98 | # CONFIG_FEATURE_ETC_NETWORKS is not set 99 | # CONFIG_FEATURE_ETC_SERVICES is not set 100 | CONFIG_FEATURE_EDITING=y 101 | CONFIG_FEATURE_EDITING_MAX_LEN=1024 102 | # CONFIG_FEATURE_EDITING_VI is not set 103 | CONFIG_FEATURE_EDITING_HISTORY=255 104 | CONFIG_FEATURE_EDITING_SAVEHISTORY=y 105 | # CONFIG_FEATURE_EDITING_SAVE_ON_EXIT is not set 106 | CONFIG_FEATURE_REVERSE_SEARCH=y 107 | CONFIG_FEATURE_TAB_COMPLETION=y 108 | CONFIG_FEATURE_USERNAME_COMPLETION=y 109 | CONFIG_FEATURE_EDITING_FANCY_PROMPT=y 110 | CONFIG_FEATURE_EDITING_WINCH=y 111 | # CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set 112 | # CONFIG_LOCALE_SUPPORT is not set 113 | CONFIG_UNICODE_SUPPORT=y 114 | # CONFIG_UNICODE_USING_LOCALE is not set 115 | # CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set 116 | CONFIG_SUBST_WCHAR=63 117 | CONFIG_LAST_SUPPORTED_WCHAR=767 118 | # CONFIG_UNICODE_COMBINING_WCHARS is not set 119 | # CONFIG_UNICODE_WIDE_WCHARS is not set 120 | # CONFIG_UNICODE_BIDI_SUPPORT is not set 121 | # CONFIG_UNICODE_NEUTRAL_TABLE is not set 122 | # CONFIG_UNICODE_PRESERVE_BROKEN is not set 123 | CONFIG_FEATURE_NON_POSIX_CP=y 124 | # CONFIG_FEATURE_VERBOSE_CP_MESSAGE is not set 125 | CONFIG_FEATURE_USE_SENDFILE=y 126 | CONFIG_FEATURE_COPYBUF_KB=4 127 | CONFIG_FEATURE_SKIP_ROOTFS=y 128 | CONFIG_MONOTONIC_SYSCALL=y 129 | CONFIG_IOCTL_HEX2STR_ERROR=y 130 | CONFIG_FEATURE_HWIB=y 131 | 132 | # 133 | # Applets 134 | # 135 | 136 | # 137 | # Archival Utilities 138 | # 139 | CONFIG_FEATURE_SEAMLESS_XZ=y 140 | CONFIG_FEATURE_SEAMLESS_LZMA=y 141 | CONFIG_FEATURE_SEAMLESS_BZ2=y 142 | CONFIG_FEATURE_SEAMLESS_GZ=y 143 | # CONFIG_FEATURE_SEAMLESS_Z is not set 144 | # CONFIG_AR is not set 145 | # CONFIG_FEATURE_AR_LONG_FILENAMES is not set 146 | # CONFIG_FEATURE_AR_CREATE is not set 147 | # CONFIG_UNCOMPRESS is not set 148 | CONFIG_GUNZIP=y 149 | CONFIG_ZCAT=y 150 | CONFIG_FEATURE_GUNZIP_LONG_OPTIONS=y 151 | CONFIG_BUNZIP2=y 152 | CONFIG_BZCAT=y 153 | CONFIG_UNLZMA=y 154 | CONFIG_LZCAT=y 155 | CONFIG_LZMA=y 156 | CONFIG_UNXZ=y 157 | CONFIG_XZCAT=y 158 | CONFIG_XZ=y 159 | CONFIG_BZIP2=y 160 | CONFIG_BZIP2_SMALL=8 161 | CONFIG_FEATURE_BZIP2_DECOMPRESS=y 162 | CONFIG_CPIO=y 163 | CONFIG_FEATURE_CPIO_O=y 164 | CONFIG_FEATURE_CPIO_P=y 165 | CONFIG_DPKG=y 166 | CONFIG_DPKG_DEB=y 167 | CONFIG_GZIP=y 168 | CONFIG_FEATURE_GZIP_LONG_OPTIONS=y 169 | CONFIG_GZIP_FAST=0 170 | # CONFIG_FEATURE_GZIP_LEVELS is not set 171 | CONFIG_FEATURE_GZIP_DECOMPRESS=y 172 | CONFIG_LZOP=y 173 | # CONFIG_UNLZOP is not set 174 | # CONFIG_LZOPCAT is not set 175 | # CONFIG_LZOP_COMPR_HIGH is not set 176 | CONFIG_RPM=y 177 | CONFIG_RPM2CPIO=y 178 | CONFIG_TAR=y 179 | CONFIG_FEATURE_TAR_LONG_OPTIONS=y 180 | CONFIG_FEATURE_TAR_CREATE=y 181 | CONFIG_FEATURE_TAR_AUTODETECT=y 182 | CONFIG_FEATURE_TAR_FROM=y 183 | CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY=y 184 | CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY=y 185 | CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y 186 | CONFIG_FEATURE_TAR_TO_COMMAND=y 187 | CONFIG_FEATURE_TAR_UNAME_GNAME=y 188 | CONFIG_FEATURE_TAR_NOPRESERVE_TIME=y 189 | # CONFIG_FEATURE_TAR_SELINUX is not set 190 | CONFIG_UNZIP=y 191 | CONFIG_FEATURE_UNZIP_CDF=y 192 | CONFIG_FEATURE_UNZIP_BZIP2=y 193 | CONFIG_FEATURE_UNZIP_LZMA=y 194 | CONFIG_FEATURE_UNZIP_XZ=y 195 | # CONFIG_FEATURE_LZMA_FAST is not set 196 | 197 | # 198 | # Coreutils 199 | # 200 | CONFIG_BASENAME=y 201 | CONFIG_CAT=y 202 | CONFIG_FEATURE_CATN=y 203 | CONFIG_FEATURE_CATV=y 204 | CONFIG_CHGRP=y 205 | CONFIG_CHMOD=y 206 | CONFIG_CHOWN=y 207 | CONFIG_FEATURE_CHOWN_LONG_OPTIONS=y 208 | CONFIG_CHROOT=y 209 | CONFIG_CKSUM=y 210 | CONFIG_CRC32=y 211 | CONFIG_COMM=y 212 | CONFIG_CP=y 213 | CONFIG_FEATURE_CP_LONG_OPTIONS=y 214 | CONFIG_FEATURE_CP_REFLINK=y 215 | CONFIG_CUT=y 216 | CONFIG_FEATURE_CUT_REGEX=y 217 | CONFIG_DATE=y 218 | CONFIG_FEATURE_DATE_ISOFMT=y 219 | # CONFIG_FEATURE_DATE_NANO is not set 220 | CONFIG_FEATURE_DATE_COMPAT=y 221 | CONFIG_DD=y 222 | CONFIG_FEATURE_DD_SIGNAL_HANDLING=y 223 | CONFIG_FEATURE_DD_THIRD_STATUS_LINE=y 224 | CONFIG_FEATURE_DD_IBS_OBS=y 225 | CONFIG_FEATURE_DD_STATUS=y 226 | CONFIG_DF=y 227 | CONFIG_FEATURE_DF_FANCY=y 228 | CONFIG_DIRNAME=y 229 | CONFIG_DOS2UNIX=y 230 | CONFIG_UNIX2DOS=y 231 | CONFIG_DU=y 232 | CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y 233 | CONFIG_ECHO=y 234 | CONFIG_FEATURE_FANCY_ECHO=y 235 | CONFIG_ENV=y 236 | CONFIG_EXPAND=y 237 | CONFIG_UNEXPAND=y 238 | CONFIG_EXPR=y 239 | CONFIG_EXPR_MATH_SUPPORT_64=y 240 | CONFIG_FACTOR=y 241 | CONFIG_FALSE=y 242 | CONFIG_FOLD=y 243 | CONFIG_HEAD=y 244 | CONFIG_FEATURE_FANCY_HEAD=y 245 | CONFIG_HOSTID=y 246 | CONFIG_ID=y 247 | CONFIG_GROUPS=y 248 | CONFIG_INSTALL=y 249 | CONFIG_FEATURE_INSTALL_LONG_OPTIONS=y 250 | CONFIG_LINK=y 251 | CONFIG_LN=y 252 | CONFIG_LOGNAME=y 253 | CONFIG_LS=y 254 | CONFIG_FEATURE_LS_FILETYPES=y 255 | CONFIG_FEATURE_LS_FOLLOWLINKS=y 256 | CONFIG_FEATURE_LS_RECURSIVE=y 257 | CONFIG_FEATURE_LS_WIDTH=y 258 | CONFIG_FEATURE_LS_SORTFILES=y 259 | CONFIG_FEATURE_LS_TIMESTAMPS=y 260 | CONFIG_FEATURE_LS_USERNAME=y 261 | CONFIG_FEATURE_LS_COLOR=y 262 | CONFIG_FEATURE_LS_COLOR_IS_DEFAULT=y 263 | CONFIG_MD5SUM=y 264 | CONFIG_SHA1SUM=y 265 | CONFIG_SHA256SUM=y 266 | CONFIG_SHA512SUM=y 267 | CONFIG_SHA3SUM=y 268 | 269 | # 270 | # Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum 271 | # 272 | CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y 273 | CONFIG_MKDIR=y 274 | CONFIG_MKFIFO=y 275 | CONFIG_MKNOD=y 276 | CONFIG_MKTEMP=y 277 | CONFIG_MV=y 278 | CONFIG_NICE=y 279 | CONFIG_NL=y 280 | CONFIG_NOHUP=y 281 | CONFIG_NPROC=y 282 | CONFIG_OD=y 283 | CONFIG_PASTE=y 284 | CONFIG_PRINTENV=y 285 | CONFIG_PRINTF=y 286 | CONFIG_PWD=y 287 | CONFIG_READLINK=y 288 | CONFIG_FEATURE_READLINK_FOLLOW=y 289 | CONFIG_REALPATH=y 290 | CONFIG_RM=y 291 | CONFIG_RMDIR=y 292 | CONFIG_SEQ=y 293 | CONFIG_SHRED=y 294 | CONFIG_SHUF=y 295 | CONFIG_SLEEP=y 296 | CONFIG_FEATURE_FANCY_SLEEP=y 297 | CONFIG_SORT=y 298 | CONFIG_FEATURE_SORT_BIG=y 299 | # CONFIG_FEATURE_SORT_OPTIMIZE_MEMORY is not set 300 | CONFIG_SPLIT=y 301 | CONFIG_FEATURE_SPLIT_FANCY=y 302 | CONFIG_STAT=y 303 | CONFIG_FEATURE_STAT_FORMAT=y 304 | CONFIG_FEATURE_STAT_FILESYSTEM=y 305 | CONFIG_STTY=y 306 | CONFIG_SUM=y 307 | CONFIG_SYNC=y 308 | CONFIG_FEATURE_SYNC_FANCY=y 309 | CONFIG_FSYNC=y 310 | CONFIG_TAC=y 311 | CONFIG_TAIL=y 312 | CONFIG_FEATURE_FANCY_TAIL=y 313 | CONFIG_TEE=y 314 | CONFIG_FEATURE_TEE_USE_BLOCK_IO=y 315 | CONFIG_TEST=y 316 | CONFIG_TEST1=y 317 | CONFIG_TEST2=y 318 | CONFIG_FEATURE_TEST_64=y 319 | CONFIG_TIMEOUT=y 320 | CONFIG_TOUCH=y 321 | CONFIG_FEATURE_TOUCH_SUSV3=y 322 | CONFIG_TR=y 323 | CONFIG_FEATURE_TR_CLASSES=y 324 | CONFIG_FEATURE_TR_EQUIV=y 325 | CONFIG_TRUE=y 326 | CONFIG_TRUNCATE=y 327 | CONFIG_TTY=y 328 | CONFIG_UNAME=y 329 | CONFIG_UNAME_OSNAME="GNU/Linux" 330 | CONFIG_BB_ARCH=y 331 | CONFIG_UNIQ=y 332 | CONFIG_UNLINK=y 333 | CONFIG_USLEEP=y 334 | CONFIG_UUDECODE=y 335 | CONFIG_BASE32=y 336 | CONFIG_BASE64=y 337 | CONFIG_UUENCODE=y 338 | CONFIG_WC=y 339 | CONFIG_FEATURE_WC_LARGE=y 340 | CONFIG_WHO=y 341 | CONFIG_W=y 342 | CONFIG_USERS=y 343 | CONFIG_WHOAMI=y 344 | CONFIG_YES=y 345 | 346 | # 347 | # Common options 348 | # 349 | CONFIG_FEATURE_VERBOSE=y 350 | 351 | # 352 | # Common options for cp and mv 353 | # 354 | CONFIG_FEATURE_PRESERVE_HARDLINKS=y 355 | 356 | # 357 | # Common options for df, du, ls 358 | # 359 | CONFIG_FEATURE_HUMAN_READABLE=y 360 | 361 | # 362 | # Console Utilities 363 | # 364 | CONFIG_CHVT=y 365 | CONFIG_CLEAR=y 366 | CONFIG_DEALLOCVT=y 367 | CONFIG_DUMPKMAP=y 368 | CONFIG_FGCONSOLE=y 369 | CONFIG_KBD_MODE=y 370 | CONFIG_LOADFONT=y 371 | CONFIG_SETFONT=y 372 | CONFIG_FEATURE_SETFONT_TEXTUAL_MAP=y 373 | CONFIG_DEFAULT_SETFONT_DIR="" 374 | 375 | # 376 | # Common options for loadfont and setfont 377 | # 378 | CONFIG_FEATURE_LOADFONT_PSF2=y 379 | CONFIG_FEATURE_LOADFONT_RAW=y 380 | CONFIG_LOADKMAP=y 381 | CONFIG_OPENVT=y 382 | CONFIG_RESET=y 383 | CONFIG_RESIZE=y 384 | CONFIG_FEATURE_RESIZE_PRINT=y 385 | CONFIG_SETCONSOLE=y 386 | CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS=y 387 | CONFIG_SETKEYCODES=y 388 | CONFIG_SETLOGCONS=y 389 | CONFIG_SHOWKEY=y 390 | 391 | # 392 | # Debian Utilities 393 | # 394 | CONFIG_PIPE_PROGRESS=y 395 | CONFIG_RUN_PARTS=y 396 | CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS=y 397 | CONFIG_FEATURE_RUN_PARTS_FANCY=y 398 | CONFIG_START_STOP_DAEMON=y 399 | CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS=y 400 | CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y 401 | CONFIG_WHICH=y 402 | 403 | # 404 | # klibc-utils 405 | # 406 | # CONFIG_MINIPS is not set 407 | # CONFIG_NUKE is not set 408 | CONFIG_RESUME=y 409 | CONFIG_RUN_INIT=y 410 | 411 | # 412 | # Editors 413 | # 414 | CONFIG_AWK=y 415 | CONFIG_FEATURE_AWK_LIBM=y 416 | CONFIG_FEATURE_AWK_GNU_EXTENSIONS=y 417 | CONFIG_CMP=y 418 | CONFIG_DIFF=y 419 | CONFIG_FEATURE_DIFF_LONG_OPTIONS=y 420 | CONFIG_FEATURE_DIFF_DIR=y 421 | CONFIG_ED=y 422 | CONFIG_PATCH=y 423 | CONFIG_SED=y 424 | CONFIG_VI=y 425 | CONFIG_FEATURE_VI_MAX_LEN=4096 426 | # CONFIG_FEATURE_VI_8BIT is not set 427 | CONFIG_FEATURE_VI_COLON=y 428 | CONFIG_FEATURE_VI_COLON_EXPAND=y 429 | CONFIG_FEATURE_VI_YANKMARK=y 430 | CONFIG_FEATURE_VI_SEARCH=y 431 | # CONFIG_FEATURE_VI_REGEX_SEARCH is not set 432 | CONFIG_FEATURE_VI_USE_SIGNALS=y 433 | CONFIG_FEATURE_VI_DOT_CMD=y 434 | CONFIG_FEATURE_VI_READONLY=y 435 | CONFIG_FEATURE_VI_SETOPTS=y 436 | CONFIG_FEATURE_VI_SET=y 437 | CONFIG_FEATURE_VI_WIN_RESIZE=y 438 | CONFIG_FEATURE_VI_ASK_TERMINAL=y 439 | CONFIG_FEATURE_VI_UNDO=y 440 | CONFIG_FEATURE_VI_UNDO_QUEUE=y 441 | CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=256 442 | CONFIG_FEATURE_VI_VERBOSE_STATUS=y 443 | CONFIG_FEATURE_ALLOW_EXEC=y 444 | 445 | # 446 | # Finding Utilities 447 | # 448 | CONFIG_FIND=y 449 | CONFIG_FEATURE_FIND_PRINT0=y 450 | CONFIG_FEATURE_FIND_MTIME=y 451 | CONFIG_FEATURE_FIND_MMIN=y 452 | CONFIG_FEATURE_FIND_PERM=y 453 | CONFIG_FEATURE_FIND_TYPE=y 454 | CONFIG_FEATURE_FIND_EXECUTABLE=y 455 | CONFIG_FEATURE_FIND_XDEV=y 456 | CONFIG_FEATURE_FIND_MAXDEPTH=y 457 | CONFIG_FEATURE_FIND_NEWER=y 458 | CONFIG_FEATURE_FIND_INUM=y 459 | CONFIG_FEATURE_FIND_EXEC=y 460 | CONFIG_FEATURE_FIND_EXEC_PLUS=y 461 | CONFIG_FEATURE_FIND_USER=y 462 | CONFIG_FEATURE_FIND_GROUP=y 463 | CONFIG_FEATURE_FIND_NOT=y 464 | CONFIG_FEATURE_FIND_DEPTH=y 465 | CONFIG_FEATURE_FIND_PAREN=y 466 | CONFIG_FEATURE_FIND_SIZE=y 467 | CONFIG_FEATURE_FIND_PRUNE=y 468 | CONFIG_FEATURE_FIND_QUIT=y 469 | CONFIG_FEATURE_FIND_DELETE=y 470 | CONFIG_FEATURE_FIND_EMPTY=y 471 | CONFIG_FEATURE_FIND_PATH=y 472 | CONFIG_FEATURE_FIND_REGEX=y 473 | # CONFIG_FEATURE_FIND_CONTEXT is not set 474 | CONFIG_FEATURE_FIND_LINKS=y 475 | CONFIG_GREP=y 476 | CONFIG_EGREP=y 477 | CONFIG_FGREP=y 478 | CONFIG_FEATURE_GREP_CONTEXT=y 479 | CONFIG_XARGS=y 480 | CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION=y 481 | CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y 482 | CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y 483 | CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y 484 | CONFIG_FEATURE_XARGS_SUPPORT_REPL_STR=y 485 | CONFIG_FEATURE_XARGS_SUPPORT_PARALLEL=y 486 | CONFIG_FEATURE_XARGS_SUPPORT_ARGS_FILE=y 487 | 488 | # 489 | # Init Utilities 490 | # 491 | CONFIG_BOOTCHARTD=y 492 | CONFIG_FEATURE_BOOTCHARTD_BLOATED_HEADER=y 493 | CONFIG_FEATURE_BOOTCHARTD_CONFIG_FILE=y 494 | CONFIG_HALT=y 495 | CONFIG_POWEROFF=y 496 | CONFIG_REBOOT=y 497 | CONFIG_FEATURE_WAIT_FOR_INIT=y 498 | # CONFIG_FEATURE_CALL_TELINIT is not set 499 | CONFIG_TELINIT_PATH="" 500 | CONFIG_INIT=y 501 | CONFIG_LINUXRC=y 502 | CONFIG_FEATURE_USE_INITTAB=y 503 | # CONFIG_FEATURE_KILL_REMOVED is not set 504 | CONFIG_FEATURE_KILL_DELAY=0 505 | CONFIG_FEATURE_INIT_SCTTY=y 506 | CONFIG_FEATURE_INIT_SYSLOG=y 507 | CONFIG_FEATURE_INIT_QUIET=y 508 | # CONFIG_FEATURE_INIT_COREDUMPS is not set 509 | CONFIG_INIT_TERMINAL_TYPE="linux" 510 | CONFIG_FEATURE_INIT_MODIFY_CMDLINE=y 511 | 512 | # 513 | # Login/Password Management Utilities 514 | # 515 | CONFIG_FEATURE_SHADOWPASSWDS=y 516 | CONFIG_USE_BB_PWD_GRP=y 517 | CONFIG_USE_BB_SHADOW=y 518 | CONFIG_USE_BB_CRYPT=y 519 | CONFIG_USE_BB_CRYPT_SHA=y 520 | CONFIG_ADD_SHELL=y 521 | CONFIG_REMOVE_SHELL=y 522 | CONFIG_ADDGROUP=y 523 | CONFIG_FEATURE_ADDUSER_TO_GROUP=y 524 | CONFIG_ADDUSER=y 525 | # CONFIG_FEATURE_CHECK_NAMES is not set 526 | CONFIG_LAST_ID=60000 527 | CONFIG_FIRST_SYSTEM_ID=100 528 | CONFIG_LAST_SYSTEM_ID=999 529 | CONFIG_CHPASSWD=y 530 | CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="des" 531 | CONFIG_CRYPTPW=y 532 | CONFIG_MKPASSWD=y 533 | CONFIG_DELUSER=y 534 | CONFIG_DELGROUP=y 535 | CONFIG_FEATURE_DEL_USER_FROM_GROUP=y 536 | CONFIG_GETTY=y 537 | CONFIG_LOGIN=y 538 | # CONFIG_LOGIN_SESSION_AS_CHILD is not set 539 | CONFIG_LOGIN_SCRIPTS=y 540 | CONFIG_FEATURE_NOLOGIN=y 541 | CONFIG_FEATURE_SECURETTY=y 542 | CONFIG_PASSWD=y 543 | CONFIG_FEATURE_PASSWD_WEAK_CHECK=y 544 | CONFIG_SU=y 545 | CONFIG_FEATURE_SU_SYSLOG=y 546 | CONFIG_FEATURE_SU_CHECKS_SHELLS=y 547 | # CONFIG_FEATURE_SU_BLANK_PW_NEEDS_SECURE_TTY is not set 548 | CONFIG_SULOGIN=y 549 | CONFIG_VLOCK=y 550 | 551 | # 552 | # Linux Ext2 FS Progs 553 | # 554 | CONFIG_CHATTR=y 555 | CONFIG_FSCK=y 556 | CONFIG_LSATTR=y 557 | # CONFIG_TUNE2FS is not set 558 | 559 | # 560 | # Linux Module Utilities 561 | # 562 | CONFIG_MODPROBE_SMALL=y 563 | CONFIG_DEPMOD=y 564 | CONFIG_INSMOD=y 565 | CONFIG_LSMOD=y 566 | # CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set 567 | CONFIG_MODINFO=y 568 | CONFIG_MODPROBE=y 569 | # CONFIG_FEATURE_MODPROBE_BLACKLIST is not set 570 | CONFIG_RMMOD=y 571 | 572 | # 573 | # Options common to multiple modutils 574 | # 575 | CONFIG_FEATURE_CMDLINE_MODULE_OPTIONS=y 576 | CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED=y 577 | # CONFIG_FEATURE_2_4_MODULES is not set 578 | # CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set 579 | # CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set 580 | # CONFIG_FEATURE_INSMOD_LOADINKMEM is not set 581 | # CONFIG_FEATURE_INSMOD_LOAD_MAP is not set 582 | # CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set 583 | # CONFIG_FEATURE_CHECK_TAINTED_MODULE is not set 584 | # CONFIG_FEATURE_INSMOD_TRY_MMAP is not set 585 | # CONFIG_FEATURE_MODUTILS_ALIAS is not set 586 | # CONFIG_FEATURE_MODUTILS_SYMBOLS is not set 587 | CONFIG_DEFAULT_MODULES_DIR="/lib/modules" 588 | CONFIG_DEFAULT_DEPMOD_FILE="modules.dep" 589 | 590 | # 591 | # Linux System Utilities 592 | # 593 | CONFIG_ACPID=y 594 | CONFIG_FEATURE_ACPID_COMPAT=y 595 | CONFIG_BLKDISCARD=y 596 | CONFIG_BLKID=y 597 | CONFIG_FEATURE_BLKID_TYPE=y 598 | CONFIG_BLOCKDEV=y 599 | CONFIG_CAL=y 600 | CONFIG_CHRT=y 601 | CONFIG_DMESG=y 602 | CONFIG_FEATURE_DMESG_PRETTY=y 603 | CONFIG_EJECT=y 604 | CONFIG_FEATURE_EJECT_SCSI=y 605 | CONFIG_FALLOCATE=y 606 | CONFIG_FATATTR=y 607 | CONFIG_FBSET=y 608 | CONFIG_FEATURE_FBSET_FANCY=y 609 | CONFIG_FEATURE_FBSET_READMODE=y 610 | CONFIG_FDFORMAT=y 611 | CONFIG_FDISK=y 612 | # CONFIG_FDISK_SUPPORT_LARGE_DISKS is not set 613 | CONFIG_FEATURE_FDISK_WRITABLE=y 614 | # CONFIG_FEATURE_AIX_LABEL is not set 615 | # CONFIG_FEATURE_SGI_LABEL is not set 616 | # CONFIG_FEATURE_SUN_LABEL is not set 617 | # CONFIG_FEATURE_OSF_LABEL is not set 618 | # CONFIG_FEATURE_GPT_LABEL is not set 619 | CONFIG_FEATURE_FDISK_ADVANCED=y 620 | CONFIG_FINDFS=y 621 | CONFIG_FLOCK=y 622 | CONFIG_FDFLUSH=y 623 | CONFIG_FREERAMDISK=y 624 | CONFIG_FSCK_MINIX=y 625 | CONFIG_FSFREEZE=y 626 | CONFIG_FSTRIM=y 627 | CONFIG_GETOPT=y 628 | CONFIG_FEATURE_GETOPT_LONG=y 629 | CONFIG_HEXDUMP=y 630 | CONFIG_HD=y 631 | CONFIG_XXD=y 632 | CONFIG_HWCLOCK=y 633 | # CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS is not set 634 | CONFIG_IONICE=y 635 | CONFIG_IPCRM=y 636 | CONFIG_IPCS=y 637 | CONFIG_LAST=y 638 | CONFIG_FEATURE_LAST_FANCY=y 639 | CONFIG_LOSETUP=y 640 | CONFIG_LSPCI=y 641 | CONFIG_LSUSB=y 642 | CONFIG_MDEV=y 643 | CONFIG_FEATURE_MDEV_CONF=y 644 | CONFIG_FEATURE_MDEV_RENAME=y 645 | CONFIG_FEATURE_MDEV_RENAME_REGEXP=y 646 | CONFIG_FEATURE_MDEV_EXEC=y 647 | CONFIG_FEATURE_MDEV_LOAD_FIRMWARE=y 648 | CONFIG_FEATURE_MDEV_DAEMON=y 649 | CONFIG_MESG=y 650 | CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP=y 651 | CONFIG_MKE2FS=y 652 | CONFIG_MKFS_EXT2=y 653 | CONFIG_MKFS_MINIX=y 654 | CONFIG_FEATURE_MINIX2=y 655 | # CONFIG_MKFS_REISER is not set 656 | CONFIG_MKDOSFS=y 657 | CONFIG_MKFS_VFAT=y 658 | CONFIG_MKSWAP=y 659 | CONFIG_FEATURE_MKSWAP_UUID=y 660 | CONFIG_MORE=y 661 | CONFIG_MOUNT=y 662 | CONFIG_FEATURE_MOUNT_FAKE=y 663 | CONFIG_FEATURE_MOUNT_VERBOSE=y 664 | # CONFIG_FEATURE_MOUNT_HELPERS is not set 665 | CONFIG_FEATURE_MOUNT_LABEL=y 666 | # CONFIG_FEATURE_MOUNT_NFS is not set 667 | CONFIG_FEATURE_MOUNT_CIFS=y 668 | CONFIG_FEATURE_MOUNT_FLAGS=y 669 | CONFIG_FEATURE_MOUNT_FSTAB=y 670 | CONFIG_FEATURE_MOUNT_OTHERTAB=y 671 | CONFIG_MOUNTPOINT=y 672 | CONFIG_NOLOGIN=y 673 | # CONFIG_NOLOGIN_DEPENDENCIES is not set 674 | CONFIG_NSENTER=y 675 | CONFIG_PIVOT_ROOT=y 676 | CONFIG_RDATE=y 677 | CONFIG_RDEV=y 678 | CONFIG_READPROFILE=y 679 | CONFIG_RENICE=y 680 | CONFIG_REV=y 681 | CONFIG_RTCWAKE=y 682 | CONFIG_SCRIPT=y 683 | CONFIG_SCRIPTREPLAY=y 684 | CONFIG_SETARCH=y 685 | CONFIG_LINUX32=y 686 | CONFIG_LINUX64=y 687 | CONFIG_SETPRIV=y 688 | CONFIG_FEATURE_SETPRIV_DUMP=y 689 | CONFIG_FEATURE_SETPRIV_CAPABILITIES=y 690 | CONFIG_FEATURE_SETPRIV_CAPABILITY_NAMES=y 691 | CONFIG_SETSID=y 692 | CONFIG_SWAPON=y 693 | CONFIG_FEATURE_SWAPON_DISCARD=y 694 | CONFIG_FEATURE_SWAPON_PRI=y 695 | CONFIG_SWAPOFF=y 696 | CONFIG_FEATURE_SWAPONOFF_LABEL=y 697 | CONFIG_SWITCH_ROOT=y 698 | CONFIG_TASKSET=y 699 | CONFIG_FEATURE_TASKSET_FANCY=y 700 | CONFIG_FEATURE_TASKSET_CPULIST=y 701 | CONFIG_UEVENT=y 702 | CONFIG_UMOUNT=y 703 | CONFIG_FEATURE_UMOUNT_ALL=y 704 | CONFIG_UNSHARE=y 705 | CONFIG_WALL=y 706 | 707 | # 708 | # Common options for mount/umount 709 | # 710 | CONFIG_FEATURE_MOUNT_LOOP=y 711 | CONFIG_FEATURE_MOUNT_LOOP_CREATE=y 712 | # CONFIG_FEATURE_MTAB_SUPPORT is not set 713 | CONFIG_VOLUMEID=y 714 | 715 | # 716 | # Filesystem/Volume identification 717 | # 718 | CONFIG_FEATURE_VOLUMEID_BCACHE=y 719 | CONFIG_FEATURE_VOLUMEID_BTRFS=y 720 | CONFIG_FEATURE_VOLUMEID_CRAMFS=y 721 | CONFIG_FEATURE_VOLUMEID_EROFS=y 722 | CONFIG_FEATURE_VOLUMEID_EXFAT=y 723 | CONFIG_FEATURE_VOLUMEID_EXT=y 724 | CONFIG_FEATURE_VOLUMEID_F2FS=y 725 | CONFIG_FEATURE_VOLUMEID_FAT=y 726 | CONFIG_FEATURE_VOLUMEID_HFS=y 727 | CONFIG_FEATURE_VOLUMEID_ISO9660=y 728 | CONFIG_FEATURE_VOLUMEID_JFS=y 729 | CONFIG_FEATURE_VOLUMEID_LFS=y 730 | CONFIG_FEATURE_VOLUMEID_LINUXRAID=y 731 | CONFIG_FEATURE_VOLUMEID_LINUXSWAP=y 732 | CONFIG_FEATURE_VOLUMEID_LUKS=y 733 | CONFIG_FEATURE_VOLUMEID_MINIX=y 734 | CONFIG_FEATURE_VOLUMEID_NILFS=y 735 | CONFIG_FEATURE_VOLUMEID_NTFS=y 736 | CONFIG_FEATURE_VOLUMEID_OCFS2=y 737 | CONFIG_FEATURE_VOLUMEID_REISERFS=y 738 | CONFIG_FEATURE_VOLUMEID_ROMFS=y 739 | CONFIG_FEATURE_VOLUMEID_SQUASHFS=y 740 | CONFIG_FEATURE_VOLUMEID_SYSV=y 741 | CONFIG_FEATURE_VOLUMEID_UBIFS=y 742 | CONFIG_FEATURE_VOLUMEID_UDF=y 743 | CONFIG_FEATURE_VOLUMEID_XFS=y 744 | 745 | # 746 | # Miscellaneous Utilities 747 | # 748 | CONFIG_ADJTIMEX=y 749 | CONFIG_ASCII=y 750 | # CONFIG_BBCONFIG is not set 751 | # CONFIG_FEATURE_COMPRESS_BBCONFIG is not set 752 | CONFIG_BC=y 753 | CONFIG_DC=y 754 | CONFIG_FEATURE_DC_BIG=y 755 | # CONFIG_FEATURE_DC_LIBM is not set 756 | CONFIG_FEATURE_BC_INTERACTIVE=y 757 | CONFIG_FEATURE_BC_LONG_OPTIONS=y 758 | CONFIG_BEEP=y 759 | CONFIG_FEATURE_BEEP_FREQ=4000 760 | CONFIG_FEATURE_BEEP_LENGTH_MS=30 761 | CONFIG_CHAT=y 762 | CONFIG_FEATURE_CHAT_NOFAIL=y 763 | # CONFIG_FEATURE_CHAT_TTY_HIFI is not set 764 | CONFIG_FEATURE_CHAT_IMPLICIT_CR=y 765 | CONFIG_FEATURE_CHAT_SWALLOW_OPTS=y 766 | CONFIG_FEATURE_CHAT_SEND_ESCAPES=y 767 | CONFIG_FEATURE_CHAT_VAR_ABORT_LEN=y 768 | CONFIG_FEATURE_CHAT_CLR_ABORT=y 769 | CONFIG_CONSPY=y 770 | CONFIG_CROND=y 771 | CONFIG_FEATURE_CROND_D=y 772 | CONFIG_FEATURE_CROND_CALL_SENDMAIL=y 773 | CONFIG_FEATURE_CROND_SPECIAL_TIMES=y 774 | CONFIG_FEATURE_CROND_DIR="/var/spool/cron" 775 | CONFIG_CRONTAB=y 776 | # CONFIG_DEVFSD is not set 777 | # CONFIG_DEVFSD_MODLOAD is not set 778 | # CONFIG_DEVFSD_FG_NP is not set 779 | # CONFIG_DEVFSD_VERBOSE is not set 780 | # CONFIG_FEATURE_DEVFS is not set 781 | CONFIG_DEVMEM=y 782 | CONFIG_FBSPLASH=y 783 | # CONFIG_FLASH_ERASEALL is not set 784 | # CONFIG_FLASH_LOCK is not set 785 | # CONFIG_FLASH_UNLOCK is not set 786 | # CONFIG_FLASHCP is not set 787 | CONFIG_HDPARM=y 788 | CONFIG_FEATURE_HDPARM_GET_IDENTITY=y 789 | CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF=y 790 | CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF=y 791 | CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET=y 792 | CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF=y 793 | CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA=y 794 | CONFIG_HEXEDIT=y 795 | CONFIG_I2CGET=y 796 | CONFIG_I2CSET=y 797 | CONFIG_I2CDUMP=y 798 | CONFIG_I2CDETECT=y 799 | CONFIG_I2CTRANSFER=y 800 | # CONFIG_INOTIFYD is not set 801 | CONFIG_LESS=y 802 | CONFIG_FEATURE_LESS_MAXLINES=9999999 803 | CONFIG_FEATURE_LESS_BRACKETS=y 804 | CONFIG_FEATURE_LESS_FLAGS=y 805 | CONFIG_FEATURE_LESS_TRUNCATE=y 806 | CONFIG_FEATURE_LESS_MARKS=y 807 | CONFIG_FEATURE_LESS_REGEXP=y 808 | CONFIG_FEATURE_LESS_WINCH=y 809 | CONFIG_FEATURE_LESS_ASK_TERMINAL=y 810 | CONFIG_FEATURE_LESS_DASHCMD=y 811 | CONFIG_FEATURE_LESS_LINENUMS=y 812 | CONFIG_FEATURE_LESS_RAW=y 813 | CONFIG_FEATURE_LESS_ENV=y 814 | CONFIG_LSSCSI=y 815 | CONFIG_MAKEDEVS=y 816 | # CONFIG_FEATURE_MAKEDEVS_LEAF is not set 817 | CONFIG_FEATURE_MAKEDEVS_TABLE=y 818 | CONFIG_MAN=y 819 | CONFIG_MICROCOM=y 820 | CONFIG_MIM=y 821 | CONFIG_MT=y 822 | CONFIG_NANDWRITE=y 823 | CONFIG_NANDDUMP=y 824 | CONFIG_PARTPROBE=y 825 | CONFIG_RAIDAUTORUN=y 826 | CONFIG_READAHEAD=y 827 | # CONFIG_RFKILL is not set 828 | CONFIG_RUNLEVEL=y 829 | CONFIG_RX=y 830 | CONFIG_SETFATTR=y 831 | CONFIG_SETSERIAL=y 832 | CONFIG_STRINGS=y 833 | CONFIG_TIME=y 834 | CONFIG_TS=y 835 | CONFIG_TTYSIZE=y 836 | CONFIG_UBIATTACH=y 837 | CONFIG_UBIDETACH=y 838 | CONFIG_UBIMKVOL=y 839 | CONFIG_UBIRMVOL=y 840 | CONFIG_UBIRSVOL=y 841 | CONFIG_UBIUPDATEVOL=y 842 | CONFIG_UBIRENAME=y 843 | CONFIG_VOLNAME=y 844 | CONFIG_WATCHDOG=y 845 | # CONFIG_FEATURE_WATCHDOG_OPEN_TWICE is not set 846 | 847 | # 848 | # Networking Utilities 849 | # 850 | CONFIG_FEATURE_IPV6=y 851 | # CONFIG_FEATURE_UNIX_LOCAL is not set 852 | CONFIG_FEATURE_PREFER_IPV4_ADDRESS=y 853 | # CONFIG_VERBOSE_RESOLUTION_ERRORS is not set 854 | # CONFIG_FEATURE_TLS_SHA1 is not set 855 | CONFIG_ARP=y 856 | CONFIG_ARPING=y 857 | CONFIG_BRCTL=y 858 | CONFIG_FEATURE_BRCTL_FANCY=y 859 | CONFIG_FEATURE_BRCTL_SHOW=y 860 | CONFIG_DNSD=y 861 | CONFIG_ETHER_WAKE=y 862 | CONFIG_FTPD=y 863 | CONFIG_FEATURE_FTPD_WRITE=y 864 | CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST=y 865 | CONFIG_FEATURE_FTPD_AUTHENTICATION=y 866 | CONFIG_FTPGET=y 867 | CONFIG_FTPPUT=y 868 | CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS=y 869 | CONFIG_HOSTNAME=y 870 | CONFIG_DNSDOMAINNAME=y 871 | CONFIG_HTTPD=y 872 | CONFIG_FEATURE_HTTPD_RANGES=y 873 | CONFIG_FEATURE_HTTPD_SETUID=y 874 | CONFIG_FEATURE_HTTPD_BASIC_AUTH=y 875 | CONFIG_FEATURE_HTTPD_AUTH_MD5=y 876 | CONFIG_FEATURE_HTTPD_CGI=y 877 | CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR=y 878 | CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV=y 879 | CONFIG_FEATURE_HTTPD_ENCODE_URL_STR=y 880 | CONFIG_FEATURE_HTTPD_ERROR_PAGES=y 881 | CONFIG_FEATURE_HTTPD_PROXY=y 882 | CONFIG_FEATURE_HTTPD_GZIP=y 883 | CONFIG_FEATURE_HTTPD_ETAG=y 884 | CONFIG_FEATURE_HTTPD_LAST_MODIFIED=y 885 | CONFIG_FEATURE_HTTPD_DATE=y 886 | CONFIG_FEATURE_HTTPD_ACL_IP=y 887 | CONFIG_IFCONFIG=y 888 | CONFIG_FEATURE_IFCONFIG_STATUS=y 889 | CONFIG_FEATURE_IFCONFIG_SLIP=y 890 | CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ=y 891 | CONFIG_FEATURE_IFCONFIG_HW=y 892 | CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS=y 893 | CONFIG_IFENSLAVE=y 894 | CONFIG_IFPLUGD=y 895 | CONFIG_IFUP=y 896 | CONFIG_IFDOWN=y 897 | CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate" 898 | CONFIG_FEATURE_IFUPDOWN_IP=y 899 | CONFIG_FEATURE_IFUPDOWN_IPV4=y 900 | CONFIG_FEATURE_IFUPDOWN_IPV6=y 901 | CONFIG_FEATURE_IFUPDOWN_MAPPING=y 902 | # CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set 903 | CONFIG_INETD=y 904 | CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO=y 905 | CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD=y 906 | CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME=y 907 | CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME=y 908 | CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN=y 909 | # CONFIG_FEATURE_INETD_RPC is not set 910 | CONFIG_IP=y 911 | CONFIG_IPADDR=y 912 | CONFIG_IPLINK=y 913 | CONFIG_IPROUTE=y 914 | CONFIG_IPTUNNEL=y 915 | CONFIG_IPRULE=y 916 | CONFIG_IPNEIGH=y 917 | CONFIG_FEATURE_IP_ADDRESS=y 918 | CONFIG_FEATURE_IP_LINK=y 919 | CONFIG_FEATURE_IP_ROUTE=y 920 | CONFIG_FEATURE_IP_ROUTE_DIR="/etc/iproute2" 921 | CONFIG_FEATURE_IP_TUNNEL=y 922 | CONFIG_FEATURE_IP_RULE=y 923 | CONFIG_FEATURE_IP_NEIGH=y 924 | # CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set 925 | CONFIG_IPCALC=y 926 | CONFIG_FEATURE_IPCALC_LONG_OPTIONS=y 927 | CONFIG_FEATURE_IPCALC_FANCY=y 928 | CONFIG_FAKEIDENTD=y 929 | CONFIG_NAMEIF=y 930 | CONFIG_FEATURE_NAMEIF_EXTENDED=y 931 | CONFIG_NBDCLIENT=y 932 | CONFIG_NC=y 933 | # CONFIG_NETCAT is not set 934 | CONFIG_NC_SERVER=y 935 | CONFIG_NC_EXTRA=y 936 | CONFIG_NC_110_COMPAT=y 937 | CONFIG_NETSTAT=y 938 | CONFIG_FEATURE_NETSTAT_WIDE=y 939 | CONFIG_FEATURE_NETSTAT_PRG=y 940 | CONFIG_NSLOOKUP=y 941 | CONFIG_FEATURE_NSLOOKUP_BIG=y 942 | CONFIG_FEATURE_NSLOOKUP_LONG_OPTIONS=y 943 | CONFIG_NTPD=y 944 | CONFIG_FEATURE_NTPD_SERVER=y 945 | CONFIG_FEATURE_NTPD_CONF=y 946 | CONFIG_FEATURE_NTP_AUTH=y 947 | CONFIG_PING=y 948 | CONFIG_PING6=y 949 | CONFIG_FEATURE_FANCY_PING=y 950 | CONFIG_PSCAN=y 951 | CONFIG_ROUTE=y 952 | CONFIG_SLATTACH=y 953 | CONFIG_SSL_CLIENT=y 954 | CONFIG_TC=y 955 | CONFIG_FEATURE_TC_INGRESS=y 956 | CONFIG_TCPSVD=y 957 | CONFIG_UDPSVD=y 958 | CONFIG_TELNET=y 959 | CONFIG_FEATURE_TELNET_TTYPE=y 960 | CONFIG_FEATURE_TELNET_AUTOLOGIN=y 961 | CONFIG_FEATURE_TELNET_WIDTH=y 962 | CONFIG_TELNETD=y 963 | CONFIG_FEATURE_TELNETD_STANDALONE=y 964 | CONFIG_FEATURE_TELNETD_INETD_WAIT=y 965 | CONFIG_TFTP=y 966 | CONFIG_FEATURE_TFTP_PROGRESS_BAR=y 967 | CONFIG_FEATURE_TFTP_HPA_COMPAT=y 968 | CONFIG_TFTPD=y 969 | CONFIG_FEATURE_TFTP_GET=y 970 | CONFIG_FEATURE_TFTP_PUT=y 971 | CONFIG_FEATURE_TFTP_BLOCKSIZE=y 972 | # CONFIG_TFTP_DEBUG is not set 973 | CONFIG_TLS=y 974 | CONFIG_TRACEROUTE=y 975 | CONFIG_TRACEROUTE6=y 976 | CONFIG_FEATURE_TRACEROUTE_VERBOSE=y 977 | CONFIG_FEATURE_TRACEROUTE_USE_ICMP=y 978 | CONFIG_TUNCTL=y 979 | CONFIG_FEATURE_TUNCTL_UG=y 980 | CONFIG_VCONFIG=y 981 | CONFIG_WGET=y 982 | CONFIG_FEATURE_WGET_LONG_OPTIONS=y 983 | CONFIG_FEATURE_WGET_STATUSBAR=y 984 | CONFIG_FEATURE_WGET_FTP=y 985 | CONFIG_FEATURE_WGET_AUTHENTICATION=y 986 | CONFIG_FEATURE_WGET_TIMEOUT=y 987 | CONFIG_FEATURE_WGET_HTTPS=y 988 | CONFIG_FEATURE_WGET_OPENSSL=y 989 | CONFIG_WHOIS=y 990 | CONFIG_ZCIP=y 991 | CONFIG_UDHCPD=y 992 | # CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set 993 | CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY=y 994 | CONFIG_DHCPD_LEASES_FILE="/var/lib/misc/udhcpd.leases" 995 | CONFIG_DUMPLEASES=y 996 | CONFIG_DHCPRELAY=y 997 | CONFIG_UDHCPC=y 998 | CONFIG_FEATURE_UDHCPC_ARPING=y 999 | CONFIG_FEATURE_UDHCPC_SANITIZEOPT=y 1000 | CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script" 1001 | CONFIG_UDHCPC6=y 1002 | CONFIG_FEATURE_UDHCPC6_RFC3646=y 1003 | CONFIG_FEATURE_UDHCPC6_RFC4704=y 1004 | CONFIG_FEATURE_UDHCPC6_RFC4833=y 1005 | CONFIG_FEATURE_UDHCPC6_RFC5970=y 1006 | 1007 | # 1008 | # Common options for DHCP applets 1009 | # 1010 | CONFIG_UDHCPC_DEFAULT_INTERFACE="eth0" 1011 | # CONFIG_FEATURE_UDHCP_PORT is not set 1012 | CONFIG_UDHCP_DEBUG=2 1013 | CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 1014 | CONFIG_FEATURE_UDHCP_RFC3397=y 1015 | CONFIG_FEATURE_UDHCP_8021Q=y 1016 | CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -n" 1017 | 1018 | # 1019 | # Print Utilities 1020 | # 1021 | CONFIG_LPD=y 1022 | CONFIG_LPR=y 1023 | CONFIG_LPQ=y 1024 | 1025 | # 1026 | # Mail Utilities 1027 | # 1028 | CONFIG_MAKEMIME=y 1029 | CONFIG_POPMAILDIR=y 1030 | CONFIG_FEATURE_POPMAILDIR_DELIVERY=y 1031 | CONFIG_REFORMIME=y 1032 | CONFIG_FEATURE_REFORMIME_COMPAT=y 1033 | CONFIG_SENDMAIL=y 1034 | CONFIG_FEATURE_MIME_CHARSET="us-ascii" 1035 | 1036 | # 1037 | # Process Utilities 1038 | # 1039 | CONFIG_FREE=y 1040 | CONFIG_FUSER=y 1041 | CONFIG_IOSTAT=y 1042 | CONFIG_KILL=y 1043 | CONFIG_KILLALL=y 1044 | CONFIG_KILLALL5=y 1045 | CONFIG_LSOF=y 1046 | CONFIG_MPSTAT=y 1047 | CONFIG_NMETER=y 1048 | CONFIG_PGREP=y 1049 | CONFIG_PKILL=y 1050 | CONFIG_PIDOF=y 1051 | CONFIG_FEATURE_PIDOF_SINGLE=y 1052 | CONFIG_FEATURE_PIDOF_OMIT=y 1053 | CONFIG_PMAP=y 1054 | CONFIG_POWERTOP=y 1055 | CONFIG_FEATURE_POWERTOP_INTERACTIVE=y 1056 | CONFIG_PS=y 1057 | # CONFIG_FEATURE_PS_WIDE is not set 1058 | # CONFIG_FEATURE_PS_LONG is not set 1059 | CONFIG_FEATURE_PS_TIME=y 1060 | # CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set 1061 | CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS=y 1062 | CONFIG_PSTREE=y 1063 | CONFIG_PWDX=y 1064 | CONFIG_SMEMCAP=y 1065 | CONFIG_BB_SYSCTL=y 1066 | CONFIG_TOP=y 1067 | CONFIG_FEATURE_TOP_INTERACTIVE=y 1068 | CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y 1069 | CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y 1070 | CONFIG_FEATURE_TOP_SMP_CPU=y 1071 | CONFIG_FEATURE_TOP_DECIMALS=y 1072 | CONFIG_FEATURE_TOP_SMP_PROCESS=y 1073 | CONFIG_FEATURE_TOPMEM=y 1074 | CONFIG_UPTIME=y 1075 | CONFIG_FEATURE_UPTIME_UTMP_SUPPORT=y 1076 | CONFIG_WATCH=y 1077 | CONFIG_FEATURE_SHOW_THREADS=y 1078 | 1079 | # 1080 | # Runit Utilities 1081 | # 1082 | CONFIG_CHPST=y 1083 | CONFIG_SETUIDGID=y 1084 | CONFIG_ENVUIDGID=y 1085 | CONFIG_ENVDIR=y 1086 | CONFIG_SOFTLIMIT=y 1087 | CONFIG_RUNSV=y 1088 | CONFIG_RUNSVDIR=y 1089 | # CONFIG_FEATURE_RUNSVDIR_LOG is not set 1090 | CONFIG_SV=y 1091 | CONFIG_SV_DEFAULT_SERVICE_DIR="/var/service" 1092 | CONFIG_SVC=y 1093 | CONFIG_SVOK=y 1094 | CONFIG_SVLOGD=y 1095 | # CONFIG_CHCON is not set 1096 | # CONFIG_GETENFORCE is not set 1097 | # CONFIG_GETSEBOOL is not set 1098 | # CONFIG_LOAD_POLICY is not set 1099 | # CONFIG_MATCHPATHCON is not set 1100 | # CONFIG_RUNCON is not set 1101 | # CONFIG_SELINUXENABLED is not set 1102 | # CONFIG_SESTATUS is not set 1103 | # CONFIG_SETENFORCE is not set 1104 | # CONFIG_SETFILES is not set 1105 | # CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set 1106 | # CONFIG_RESTORECON is not set 1107 | # CONFIG_SETSEBOOL is not set 1108 | 1109 | # 1110 | # Shells 1111 | # 1112 | CONFIG_SH_IS_ASH=y 1113 | # CONFIG_SH_IS_HUSH is not set 1114 | # CONFIG_SH_IS_NONE is not set 1115 | # CONFIG_BASH_IS_ASH is not set 1116 | # CONFIG_BASH_IS_HUSH is not set 1117 | CONFIG_BASH_IS_NONE=y 1118 | CONFIG_SHELL_ASH=y 1119 | CONFIG_ASH=y 1120 | CONFIG_ASH_OPTIMIZE_FOR_SIZE=y 1121 | CONFIG_ASH_INTERNAL_GLOB=y 1122 | CONFIG_ASH_BASH_COMPAT=y 1123 | # CONFIG_ASH_BASH_SOURCE_CURDIR is not set 1124 | CONFIG_ASH_BASH_NOT_FOUND_HOOK=y 1125 | CONFIG_ASH_JOB_CONTROL=y 1126 | CONFIG_ASH_ALIAS=y 1127 | CONFIG_ASH_RANDOM_SUPPORT=y 1128 | CONFIG_ASH_EXPAND_PRMT=y 1129 | CONFIG_ASH_IDLE_TIMEOUT=y 1130 | CONFIG_ASH_MAIL=y 1131 | CONFIG_ASH_ECHO=y 1132 | CONFIG_ASH_PRINTF=y 1133 | CONFIG_ASH_TEST=y 1134 | CONFIG_ASH_HELP=y 1135 | CONFIG_ASH_GETOPTS=y 1136 | CONFIG_ASH_CMDCMD=y 1137 | CONFIG_CTTYHACK=y 1138 | CONFIG_HUSH=y 1139 | CONFIG_SHELL_HUSH=y 1140 | CONFIG_HUSH_BASH_COMPAT=y 1141 | CONFIG_HUSH_BRACE_EXPANSION=y 1142 | # CONFIG_HUSH_BASH_SOURCE_CURDIR is not set 1143 | CONFIG_HUSH_LINENO_VAR=y 1144 | CONFIG_HUSH_INTERACTIVE=y 1145 | CONFIG_HUSH_SAVEHISTORY=y 1146 | CONFIG_HUSH_JOB=y 1147 | CONFIG_HUSH_TICK=y 1148 | CONFIG_HUSH_IF=y 1149 | CONFIG_HUSH_LOOPS=y 1150 | CONFIG_HUSH_CASE=y 1151 | CONFIG_HUSH_FUNCTIONS=y 1152 | CONFIG_HUSH_LOCAL=y 1153 | CONFIG_HUSH_RANDOM_SUPPORT=y 1154 | CONFIG_HUSH_MODE_X=y 1155 | CONFIG_HUSH_ECHO=y 1156 | CONFIG_HUSH_PRINTF=y 1157 | CONFIG_HUSH_TEST=y 1158 | CONFIG_HUSH_HELP=y 1159 | CONFIG_HUSH_EXPORT=y 1160 | CONFIG_HUSH_EXPORT_N=y 1161 | CONFIG_HUSH_READONLY=y 1162 | CONFIG_HUSH_KILL=y 1163 | CONFIG_HUSH_WAIT=y 1164 | CONFIG_HUSH_COMMAND=y 1165 | CONFIG_HUSH_TRAP=y 1166 | CONFIG_HUSH_TYPE=y 1167 | CONFIG_HUSH_TIMES=y 1168 | CONFIG_HUSH_READ=y 1169 | CONFIG_HUSH_SET=y 1170 | CONFIG_HUSH_UNSET=y 1171 | CONFIG_HUSH_ULIMIT=y 1172 | CONFIG_HUSH_UMASK=y 1173 | CONFIG_HUSH_GETOPTS=y 1174 | # CONFIG_HUSH_MEMLEAK is not set 1175 | 1176 | # 1177 | # Options common to all shells 1178 | # 1179 | CONFIG_FEATURE_SH_MATH=y 1180 | CONFIG_FEATURE_SH_MATH_64=y 1181 | CONFIG_FEATURE_SH_MATH_BASE=y 1182 | CONFIG_FEATURE_SH_EXTRA_QUIET=y 1183 | # CONFIG_FEATURE_SH_STANDALONE is not set 1184 | # CONFIG_FEATURE_SH_NOFORK is not set 1185 | CONFIG_FEATURE_SH_READ_FRAC=y 1186 | CONFIG_FEATURE_SH_HISTFILESIZE=y 1187 | CONFIG_FEATURE_SH_EMBEDDED_SCRIPTS=y 1188 | 1189 | # 1190 | # System Logging Utilities 1191 | # 1192 | CONFIG_KLOGD=y 1193 | 1194 | # 1195 | # klogd should not be used together with syslog to kernel printk buffer 1196 | # 1197 | CONFIG_FEATURE_KLOGD_KLOGCTL=y 1198 | CONFIG_LOGGER=y 1199 | CONFIG_LOGREAD=y 1200 | CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y 1201 | CONFIG_SYSLOGD=y 1202 | CONFIG_FEATURE_ROTATE_LOGFILE=y 1203 | CONFIG_FEATURE_REMOTE_LOG=y 1204 | CONFIG_FEATURE_SYSLOGD_DUP=y 1205 | CONFIG_FEATURE_SYSLOGD_CFG=y 1206 | # CONFIG_FEATURE_SYSLOGD_PRECISE_TIMESTAMPS is not set 1207 | CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256 1208 | CONFIG_FEATURE_IPC_SYSLOG=y 1209 | CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16 1210 | CONFIG_FEATURE_KMSG_SYSLOG=y 1211 | -------------------------------------------------------------------------------- /config/kernel.config: -------------------------------------------------------------------------------- 1 | # 2 | # Automatically generated file; DO NOT EDIT. 3 | # Linux/x86 5.19.9 Kernel Configuration 4 | # 5 | CONFIG_CC_VERSION_TEXT="gcc (GCC) 10.3.1" 6 | CONFIG_CC_IS_GCC=y 7 | CONFIG_GCC_VERSION=100301 8 | CONFIG_CLANG_VERSION=0 9 | CONFIG_AS_IS_GNU=y 10 | CONFIG_AS_VERSION=23700 11 | CONFIG_LD_IS_BFD=y 12 | CONFIG_LD_VERSION=23700 13 | CONFIG_LLD_VERSION=0 14 | CONFIG_CC_CAN_LINK=y 15 | CONFIG_CC_CAN_LINK_STATIC=y 16 | CONFIG_CC_HAS_ASM_GOTO=y 17 | CONFIG_CC_HAS_ASM_INLINE=y 18 | CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y 19 | CONFIG_PAHOLE_VERSION=0 20 | CONFIG_IRQ_WORK=y 21 | CONFIG_BUILDTIME_TABLE_SORT=y 22 | CONFIG_THREAD_INFO_IN_TASK=y 23 | 24 | # 25 | # General setup 26 | # 27 | CONFIG_BROKEN_ON_SMP=y 28 | CONFIG_INIT_ENV_ARG_LIMIT=32 29 | # CONFIG_COMPILE_TEST is not set 30 | # CONFIG_WERROR is not set 31 | CONFIG_LOCALVERSION="" 32 | # CONFIG_LOCALVERSION_AUTO is not set 33 | CONFIG_BUILD_SALT="" 34 | CONFIG_HAVE_KERNEL_GZIP=y 35 | CONFIG_HAVE_KERNEL_BZIP2=y 36 | CONFIG_HAVE_KERNEL_LZMA=y 37 | CONFIG_HAVE_KERNEL_XZ=y 38 | CONFIG_HAVE_KERNEL_LZO=y 39 | CONFIG_HAVE_KERNEL_LZ4=y 40 | CONFIG_HAVE_KERNEL_ZSTD=y 41 | # CONFIG_KERNEL_GZIP is not set 42 | # CONFIG_KERNEL_BZIP2 is not set 43 | # CONFIG_KERNEL_LZMA is not set 44 | CONFIG_KERNEL_XZ=y 45 | # CONFIG_KERNEL_LZO is not set 46 | # CONFIG_KERNEL_LZ4 is not set 47 | # CONFIG_KERNEL_ZSTD is not set 48 | CONFIG_DEFAULT_INIT="" 49 | CONFIG_DEFAULT_HOSTNAME="(none)" 50 | # CONFIG_SYSVIPC is not set 51 | # CONFIG_WATCH_QUEUE is not set 52 | # CONFIG_CROSS_MEMORY_ATTACH is not set 53 | # CONFIG_USELIB is not set 54 | CONFIG_HAVE_ARCH_AUDITSYSCALL=y 55 | 56 | # 57 | # IRQ subsystem 58 | # 59 | CONFIG_GENERIC_IRQ_PROBE=y 60 | CONFIG_GENERIC_IRQ_SHOW=y 61 | CONFIG_HARDIRQS_SW_RESEND=y 62 | CONFIG_IRQ_DOMAIN=y 63 | CONFIG_IRQ_DOMAIN_HIERARCHY=y 64 | CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y 65 | CONFIG_GENERIC_IRQ_RESERVATION_MODE=y 66 | CONFIG_IRQ_FORCED_THREADING=y 67 | CONFIG_SPARSE_IRQ=y 68 | # end of IRQ subsystem 69 | 70 | CONFIG_CLOCKSOURCE_WATCHDOG=y 71 | CONFIG_ARCH_CLOCKSOURCE_INIT=y 72 | CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y 73 | CONFIG_GENERIC_TIME_VSYSCALL=y 74 | CONFIG_GENERIC_CLOCKEVENTS=y 75 | CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y 76 | CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y 77 | CONFIG_GENERIC_CMOS_UPDATE=y 78 | CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y 79 | 80 | # 81 | # Timers subsystem 82 | # 83 | CONFIG_HZ_PERIODIC=y 84 | # CONFIG_NO_HZ_IDLE is not set 85 | # CONFIG_NO_HZ is not set 86 | # CONFIG_HIGH_RES_TIMERS is not set 87 | CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 88 | # end of Timers subsystem 89 | 90 | CONFIG_HAVE_EBPF_JIT=y 91 | CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y 92 | 93 | # 94 | # BPF subsystem 95 | # 96 | # CONFIG_BPF_SYSCALL is not set 97 | # end of BPF subsystem 98 | 99 | CONFIG_PREEMPT_NONE_BUILD=y 100 | CONFIG_PREEMPT_NONE=y 101 | # CONFIG_PREEMPT_VOLUNTARY is not set 102 | # CONFIG_PREEMPT is not set 103 | # CONFIG_PREEMPT_DYNAMIC is not set 104 | 105 | # 106 | # CPU/Task time and stats accounting 107 | # 108 | CONFIG_TICK_CPU_ACCOUNTING=y 109 | # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set 110 | # CONFIG_IRQ_TIME_ACCOUNTING is not set 111 | # CONFIG_PSI is not set 112 | # end of CPU/Task time and stats accounting 113 | 114 | # 115 | # RCU Subsystem 116 | # 117 | CONFIG_TINY_RCU=y 118 | # CONFIG_RCU_EXPERT is not set 119 | CONFIG_SRCU=y 120 | CONFIG_TINY_SRCU=y 121 | # end of RCU Subsystem 122 | 123 | # CONFIG_IKCONFIG is not set 124 | # CONFIG_IKHEADERS is not set 125 | CONFIG_LOG_BUF_SHIFT=17 126 | CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 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_GCC12_NO_ARRAY_BOUNDS=y 139 | CONFIG_ARCH_SUPPORTS_INT128=y 140 | # CONFIG_CGROUPS is not set 141 | # CONFIG_CHECKPOINT_RESTORE is not set 142 | # CONFIG_SCHED_AUTOGROUP is not set 143 | # CONFIG_SYSFS_DEPRECATED is not set 144 | # CONFIG_RELAY is not set 145 | CONFIG_BLK_DEV_INITRD=y 146 | CONFIG_INITRAMFS_SOURCE="" 147 | # CONFIG_RD_GZIP is not set 148 | # CONFIG_RD_BZIP2 is not set 149 | # CONFIG_RD_LZMA is not set 150 | # CONFIG_RD_XZ is not set 151 | # CONFIG_RD_LZO is not set 152 | # CONFIG_RD_LZ4 is not set 153 | # CONFIG_RD_ZSTD is not set 154 | # CONFIG_BOOT_CONFIG is not set 155 | CONFIG_INITRAMFS_PRESERVE_MTIME=y 156 | # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set 157 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y 158 | CONFIG_LD_ORPHAN_WARN=y 159 | CONFIG_SYSCTL=y 160 | CONFIG_SYSCTL_EXCEPTION_TRACE=y 161 | CONFIG_HAVE_PCSPKR_PLATFORM=y 162 | CONFIG_EXPERT=y 163 | # CONFIG_MULTIUSER is not set 164 | # CONFIG_SGETMASK_SYSCALL is not set 165 | # CONFIG_SYSFS_SYSCALL is not set 166 | # CONFIG_FHANDLE is not set 167 | # CONFIG_POSIX_TIMERS is not set 168 | CONFIG_PRINTK=y 169 | # CONFIG_BUG is not set 170 | # CONFIG_PCSPKR_PLATFORM is not set 171 | # CONFIG_BASE_FULL is not set 172 | # CONFIG_FUTEX is not set 173 | # CONFIG_EPOLL is not set 174 | # CONFIG_SIGNALFD is not set 175 | # CONFIG_TIMERFD is not set 176 | # CONFIG_EVENTFD is not set 177 | # CONFIG_SHMEM is not set 178 | # CONFIG_AIO is not set 179 | # CONFIG_IO_URING is not set 180 | # CONFIG_ADVISE_SYSCALLS is not set 181 | # CONFIG_MEMBARRIER is not set 182 | # CONFIG_KALLSYMS is not set 183 | CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y 184 | # CONFIG_KCMP is not set 185 | # CONFIG_RSEQ is not set 186 | CONFIG_EMBEDDED=y 187 | CONFIG_HAVE_PERF_EVENTS=y 188 | # CONFIG_PC104 is not set 189 | 190 | # 191 | # Kernel Performance Events And Counters 192 | # 193 | CONFIG_PERF_EVENTS=y 194 | # CONFIG_DEBUG_PERF_USE_VMALLOC is not set 195 | # end of Kernel Performance Events And Counters 196 | 197 | # CONFIG_PROFILING is not set 198 | # end of General setup 199 | 200 | CONFIG_64BIT=y 201 | CONFIG_X86_64=y 202 | CONFIG_X86=y 203 | CONFIG_INSTRUCTION_DECODER=y 204 | CONFIG_OUTPUT_FORMAT="elf64-x86-64" 205 | CONFIG_LOCKDEP_SUPPORT=y 206 | CONFIG_STACKTRACE_SUPPORT=y 207 | CONFIG_MMU=y 208 | CONFIG_ARCH_MMAP_RND_BITS_MIN=28 209 | CONFIG_ARCH_MMAP_RND_BITS_MAX=32 210 | CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8 211 | CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 212 | CONFIG_GENERIC_CALIBRATE_DELAY=y 213 | CONFIG_ARCH_HAS_CPU_RELAX=y 214 | CONFIG_ARCH_HIBERNATION_POSSIBLE=y 215 | CONFIG_ARCH_NR_GPIO=1024 216 | CONFIG_ARCH_SUSPEND_POSSIBLE=y 217 | CONFIG_AUDIT_ARCH=y 218 | CONFIG_ARCH_SUPPORTS_UPROBES=y 219 | CONFIG_FIX_EARLYCON_MEM=y 220 | CONFIG_PGTABLE_LEVELS=4 221 | CONFIG_CC_HAS_SANE_STACKPROTECTOR=y 222 | 223 | # 224 | # Processor type and features 225 | # 226 | # CONFIG_SMP is not set 227 | CONFIG_X86_FEATURE_NAMES=y 228 | CONFIG_X86_MPPARSE=y 229 | # CONFIG_GOLDFISH is not set 230 | # CONFIG_X86_CPU_RESCTRL is not set 231 | # CONFIG_X86_EXTENDED_PLATFORM is not set 232 | # CONFIG_IOSF_MBI is not set 233 | # CONFIG_SCHED_OMIT_FRAME_POINTER is not set 234 | # CONFIG_HYPERVISOR_GUEST is not set 235 | # CONFIG_MK8 is not set 236 | # CONFIG_MPSC is not set 237 | # CONFIG_MCORE2 is not set 238 | # CONFIG_MATOM is not set 239 | CONFIG_GENERIC_CPU=y 240 | CONFIG_X86_INTERNODE_CACHE_SHIFT=6 241 | CONFIG_X86_L1_CACHE_SHIFT=6 242 | CONFIG_X86_TSC=y 243 | CONFIG_X86_CMPXCHG64=y 244 | CONFIG_X86_CMOV=y 245 | CONFIG_X86_MINIMUM_CPU_FAMILY=64 246 | CONFIG_X86_DEBUGCTLMSR=y 247 | CONFIG_IA32_FEAT_CTL=y 248 | CONFIG_X86_VMX_FEATURE_NAMES=y 249 | # CONFIG_PROCESSOR_SELECT is not set 250 | CONFIG_CPU_SUP_INTEL=y 251 | CONFIG_CPU_SUP_AMD=y 252 | CONFIG_CPU_SUP_HYGON=y 253 | CONFIG_CPU_SUP_CENTAUR=y 254 | CONFIG_CPU_SUP_ZHAOXIN=y 255 | CONFIG_HPET_TIMER=y 256 | # CONFIG_DMI is not set 257 | # CONFIG_GART_IOMMU is not set 258 | CONFIG_NR_CPUS_RANGE_BEGIN=1 259 | CONFIG_NR_CPUS_RANGE_END=1 260 | CONFIG_NR_CPUS_DEFAULT=1 261 | CONFIG_NR_CPUS=1 262 | CONFIG_UP_LATE_INIT=y 263 | CONFIG_X86_LOCAL_APIC=y 264 | CONFIG_X86_IO_APIC=y 265 | # CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set 266 | # CONFIG_X86_MCE is not set 267 | 268 | # 269 | # Performance monitoring 270 | # 271 | # CONFIG_PERF_EVENTS_INTEL_UNCORE is not set 272 | # CONFIG_PERF_EVENTS_INTEL_RAPL is not set 273 | # CONFIG_PERF_EVENTS_INTEL_CSTATE is not set 274 | # CONFIG_PERF_EVENTS_AMD_POWER is not set 275 | # CONFIG_PERF_EVENTS_AMD_UNCORE is not set 276 | # CONFIG_PERF_EVENTS_AMD_BRS is not set 277 | # end of Performance monitoring 278 | 279 | # CONFIG_X86_VSYSCALL_EMULATION is not set 280 | # CONFIG_X86_IOPL_IOPERM is not set 281 | # CONFIG_MICROCODE is not set 282 | # CONFIG_X86_MSR is not set 283 | # CONFIG_X86_CPUID is not set 284 | # CONFIG_X86_5LEVEL is not set 285 | CONFIG_X86_DIRECT_GBPAGES=y 286 | # CONFIG_AMD_MEM_ENCRYPT is not set 287 | CONFIG_ARCH_SPARSEMEM_ENABLE=y 288 | CONFIG_ARCH_SPARSEMEM_DEFAULT=y 289 | CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 290 | # CONFIG_X86_PMEM_LEGACY is not set 291 | # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set 292 | # CONFIG_MTRR is not set 293 | # CONFIG_ARCH_RANDOM is not set 294 | # CONFIG_X86_UMIP is not set 295 | CONFIG_CC_HAS_IBT=y 296 | # CONFIG_X86_KERNEL_IBT is not set 297 | # CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set 298 | CONFIG_X86_INTEL_TSX_MODE_OFF=y 299 | # CONFIG_X86_INTEL_TSX_MODE_ON is not set 300 | # CONFIG_X86_INTEL_TSX_MODE_AUTO is not set 301 | # CONFIG_HZ_100 is not set 302 | CONFIG_HZ_250=y 303 | # CONFIG_HZ_300 is not set 304 | # CONFIG_HZ_1000 is not set 305 | CONFIG_HZ=250 306 | # CONFIG_KEXEC is not set 307 | # CONFIG_CRASH_DUMP is not set 308 | CONFIG_PHYSICAL_START=0x1000000 309 | # CONFIG_RELOCATABLE is not set 310 | CONFIG_PHYSICAL_ALIGN=0x200000 311 | # CONFIG_LEGACY_VSYSCALL_XONLY is not set 312 | CONFIG_LEGACY_VSYSCALL_NONE=y 313 | # CONFIG_CMDLINE_BOOL is not set 314 | # CONFIG_MODIFY_LDT_SYSCALL is not set 315 | # CONFIG_STRICT_SIGALTSTACK_SIZE is not set 316 | CONFIG_HAVE_LIVEPATCH=y 317 | # end of Processor type and features 318 | 319 | CONFIG_CC_HAS_RETURN_THUNK=y 320 | # CONFIG_SPECULATION_MITIGATIONS is not set 321 | CONFIG_ARCH_HAS_ADD_PAGES=y 322 | CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y 323 | 324 | # 325 | # Power management and ACPI options 326 | # 327 | # CONFIG_SUSPEND is not set 328 | # CONFIG_PM is not set 329 | CONFIG_ARCH_SUPPORTS_ACPI=y 330 | # CONFIG_ACPI is not set 331 | 332 | # 333 | # CPU Frequency scaling 334 | # 335 | # CONFIG_CPU_FREQ is not set 336 | # end of CPU Frequency scaling 337 | 338 | # 339 | # CPU Idle 340 | # 341 | # CONFIG_CPU_IDLE is not set 342 | # end of CPU Idle 343 | # end of Power management and ACPI options 344 | 345 | # 346 | # Bus options (PCI etc.) 347 | # 348 | CONFIG_PCI_DIRECT=y 349 | # CONFIG_PCI_CNB20LE_QUIRK is not set 350 | # CONFIG_ISA_BUS is not set 351 | # CONFIG_ISA_DMA_API is not set 352 | CONFIG_AMD_NB=y 353 | # end of Bus options (PCI etc.) 354 | 355 | # 356 | # Binary Emulations 357 | # 358 | # CONFIG_IA32_EMULATION is not set 359 | # CONFIG_X86_X32_ABI is not set 360 | # end of Binary Emulations 361 | 362 | CONFIG_HAVE_KVM=y 363 | # CONFIG_VIRTUALIZATION is not set 364 | CONFIG_AS_AVX512=y 365 | CONFIG_AS_SHA1_NI=y 366 | CONFIG_AS_SHA256_NI=y 367 | CONFIG_AS_TPAUSE=y 368 | 369 | # 370 | # General architecture-dependent options 371 | # 372 | CONFIG_GENERIC_ENTRY=y 373 | CONFIG_JUMP_LABEL=y 374 | # CONFIG_STATIC_KEYS_SELFTEST is not set 375 | # CONFIG_STATIC_CALL_SELFTEST is not set 376 | CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y 377 | CONFIG_ARCH_USE_BUILTIN_BSWAP=y 378 | CONFIG_HAVE_IOREMAP_PROT=y 379 | CONFIG_HAVE_KPROBES=y 380 | CONFIG_HAVE_KRETPROBES=y 381 | CONFIG_HAVE_OPTPROBES=y 382 | CONFIG_HAVE_KPROBES_ON_FTRACE=y 383 | CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y 384 | CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y 385 | CONFIG_HAVE_NMI=y 386 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y 387 | CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y 388 | CONFIG_HAVE_ARCH_TRACEHOOK=y 389 | CONFIG_HAVE_DMA_CONTIGUOUS=y 390 | CONFIG_GENERIC_SMP_IDLE_THREAD=y 391 | CONFIG_ARCH_HAS_FORTIFY_SOURCE=y 392 | CONFIG_ARCH_HAS_SET_MEMORY=y 393 | CONFIG_ARCH_HAS_SET_DIRECT_MAP=y 394 | CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y 395 | CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y 396 | CONFIG_ARCH_WANTS_NO_INSTR=y 397 | CONFIG_HAVE_ASM_MODVERSIONS=y 398 | CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y 399 | CONFIG_HAVE_RSEQ=y 400 | CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y 401 | CONFIG_HAVE_HW_BREAKPOINT=y 402 | CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y 403 | CONFIG_HAVE_USER_RETURN_NOTIFIER=y 404 | CONFIG_HAVE_PERF_EVENTS_NMI=y 405 | CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y 406 | CONFIG_HAVE_PERF_REGS=y 407 | CONFIG_HAVE_PERF_USER_STACK_DUMP=y 408 | CONFIG_HAVE_ARCH_JUMP_LABEL=y 409 | CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y 410 | CONFIG_MMU_GATHER_MERGE_VMAS=y 411 | CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y 412 | CONFIG_HAVE_CMPXCHG_LOCAL=y 413 | CONFIG_HAVE_CMPXCHG_DOUBLE=y 414 | CONFIG_HAVE_ARCH_SECCOMP=y 415 | CONFIG_HAVE_ARCH_SECCOMP_FILTER=y 416 | # CONFIG_SECCOMP is not set 417 | CONFIG_HAVE_ARCH_STACKLEAK=y 418 | CONFIG_HAVE_STACKPROTECTOR=y 419 | # CONFIG_STACKPROTECTOR is not set 420 | CONFIG_ARCH_SUPPORTS_LTO_CLANG=y 421 | CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y 422 | CONFIG_LTO_NONE=y 423 | CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y 424 | CONFIG_HAVE_CONTEXT_TRACKING=y 425 | CONFIG_HAVE_CONTEXT_TRACKING_OFFSTACK=y 426 | CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y 427 | CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y 428 | CONFIG_HAVE_MOVE_PUD=y 429 | CONFIG_HAVE_MOVE_PMD=y 430 | CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y 431 | CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y 432 | CONFIG_HAVE_ARCH_HUGE_VMAP=y 433 | CONFIG_HAVE_ARCH_HUGE_VMALLOC=y 434 | CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y 435 | CONFIG_HAVE_ARCH_SOFT_DIRTY=y 436 | CONFIG_HAVE_MOD_ARCH_SPECIFIC=y 437 | CONFIG_MODULES_USE_ELF_RELA=y 438 | CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y 439 | CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y 440 | CONFIG_ARCH_HAS_ELF_RANDOMIZE=y 441 | CONFIG_HAVE_ARCH_MMAP_RND_BITS=y 442 | CONFIG_HAVE_EXIT_THREAD=y 443 | CONFIG_ARCH_MMAP_RND_BITS=28 444 | CONFIG_PAGE_SIZE_LESS_THAN_64KB=y 445 | CONFIG_PAGE_SIZE_LESS_THAN_256KB=y 446 | CONFIG_HAVE_OBJTOOL=y 447 | CONFIG_HAVE_JUMP_LABEL_HACK=y 448 | CONFIG_HAVE_NOINSTR_HACK=y 449 | CONFIG_HAVE_NOINSTR_VALIDATION=y 450 | CONFIG_HAVE_UACCESS_VALIDATION=y 451 | CONFIG_HAVE_STACK_VALIDATION=y 452 | # CONFIG_COMPAT_32BIT_TIME is not set 453 | CONFIG_HAVE_ARCH_VMAP_STACK=y 454 | # CONFIG_VMAP_STACK is not set 455 | CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y 456 | # CONFIG_RANDOMIZE_KSTACK_OFFSET is not set 457 | CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y 458 | CONFIG_STRICT_KERNEL_RWX=y 459 | CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y 460 | CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y 461 | CONFIG_ARCH_HAS_MEM_ENCRYPT=y 462 | CONFIG_HAVE_STATIC_CALL=y 463 | CONFIG_HAVE_STATIC_CALL_INLINE=y 464 | CONFIG_HAVE_PREEMPT_DYNAMIC=y 465 | CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y 466 | CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y 467 | CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y 468 | CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y 469 | CONFIG_ARCH_HAS_ELFCORE_COMPAT=y 470 | CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y 471 | CONFIG_DYNAMIC_SIGFRAME=y 472 | 473 | # 474 | # GCOV-based kernel profiling 475 | # 476 | CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y 477 | # end of GCOV-based kernel profiling 478 | 479 | CONFIG_HAVE_GCC_PLUGINS=y 480 | # end of General architecture-dependent options 481 | 482 | CONFIG_BASE_SMALL=1 483 | # CONFIG_MODULES is not set 484 | CONFIG_MODULES_TREE_LOOKUP=y 485 | CONFIG_BLOCK=y 486 | CONFIG_BLOCK_LEGACY_AUTOLOAD=y 487 | # CONFIG_BLK_DEV_BSGLIB is not set 488 | # CONFIG_BLK_DEV_INTEGRITY is not set 489 | # CONFIG_BLK_DEV_ZONED is not set 490 | # CONFIG_BLK_WBT is not set 491 | # CONFIG_BLK_SED_OPAL is not set 492 | # CONFIG_BLK_INLINE_ENCRYPTION is not set 493 | 494 | # 495 | # Partition Types 496 | # 497 | # CONFIG_PARTITION_ADVANCED is not set 498 | CONFIG_MSDOS_PARTITION=y 499 | CONFIG_EFI_PARTITION=y 500 | # end of Partition Types 501 | 502 | CONFIG_BLK_MQ_PCI=y 503 | CONFIG_BLK_MQ_VIRTIO=y 504 | 505 | # 506 | # IO Schedulers 507 | # 508 | # CONFIG_MQ_IOSCHED_DEADLINE is not set 509 | # CONFIG_MQ_IOSCHED_KYBER is not set 510 | # CONFIG_IOSCHED_BFQ is not set 511 | # end of IO Schedulers 512 | 513 | CONFIG_INLINE_SPIN_UNLOCK_IRQ=y 514 | CONFIG_INLINE_READ_UNLOCK=y 515 | CONFIG_INLINE_READ_UNLOCK_IRQ=y 516 | CONFIG_INLINE_WRITE_UNLOCK=y 517 | CONFIG_INLINE_WRITE_UNLOCK_IRQ=y 518 | CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y 519 | CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y 520 | CONFIG_ARCH_USE_QUEUED_RWLOCKS=y 521 | CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y 522 | CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE=y 523 | CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y 524 | 525 | # 526 | # Executable file formats 527 | # 528 | CONFIG_BINFMT_ELF=y 529 | CONFIG_ELFCORE=y 530 | CONFIG_BINFMT_SCRIPT=y 531 | # CONFIG_BINFMT_MISC is not set 532 | # CONFIG_COREDUMP is not set 533 | # end of Executable file formats 534 | 535 | # 536 | # Memory Management options 537 | # 538 | # CONFIG_SWAP is not set 539 | 540 | # 541 | # SLAB allocator options 542 | # 543 | # CONFIG_SLAB is not set 544 | # CONFIG_SLUB is not set 545 | CONFIG_SLOB=y 546 | # end of SLAB allocator options 547 | 548 | # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set 549 | # CONFIG_COMPAT_BRK is not set 550 | CONFIG_SPARSEMEM=y 551 | CONFIG_SPARSEMEM_EXTREME=y 552 | CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y 553 | CONFIG_SPARSEMEM_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_SPLIT_PTLOCK_CPUS=4 559 | CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y 560 | # CONFIG_COMPACTION is not set 561 | # CONFIG_PAGE_REPORTING is not set 562 | CONFIG_PHYS_ADDR_T_64BIT=y 563 | CONFIG_VIRT_TO_BUS=y 564 | # CONFIG_KSM is not set 565 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 566 | CONFIG_ARCH_WANT_GENERAL_HUGETLB=y 567 | CONFIG_ARCH_WANTS_THP_SWAP=y 568 | # CONFIG_TRANSPARENT_HUGEPAGE is not set 569 | CONFIG_NEED_PER_CPU_KM=y 570 | CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y 571 | CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y 572 | CONFIG_HAVE_SETUP_PER_CPU_AREA=y 573 | # CONFIG_CMA is not set 574 | CONFIG_GENERIC_EARLY_IOREMAP=y 575 | # CONFIG_IDLE_PAGE_TRACKING is not set 576 | CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y 577 | CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y 578 | CONFIG_ARCH_HAS_VM_GET_PAGE_PROT=y 579 | CONFIG_ARCH_HAS_PTE_DEVMAP=y 580 | CONFIG_ARCH_HAS_ZONE_DMA_SET=y 581 | # CONFIG_ZONE_DMA is not set 582 | CONFIG_ZONE_DMA32=y 583 | # CONFIG_VM_EVENT_COUNTERS is not set 584 | # CONFIG_PERCPU_STATS is not set 585 | 586 | # 587 | # GUP_TEST needs to have DEBUG_FS enabled 588 | # 589 | CONFIG_ARCH_HAS_PTE_SPECIAL=y 590 | # CONFIG_USERFAULTFD is not set 591 | 592 | # 593 | # Data Access Monitoring 594 | # 595 | # CONFIG_DAMON is not set 596 | # end of Data Access Monitoring 597 | # end of Memory Management options 598 | 599 | # CONFIG_NET is not set 600 | 601 | # 602 | # Device Drivers 603 | # 604 | CONFIG_HAVE_EISA=y 605 | # CONFIG_EISA is not set 606 | CONFIG_HAVE_PCI=y 607 | CONFIG_PCI=y 608 | CONFIG_PCI_DOMAINS=y 609 | # CONFIG_PCIEPORTBUS is not set 610 | # CONFIG_PCIEASPM is not set 611 | # CONFIG_PCIE_PTM is not set 612 | # CONFIG_PCI_MSI is not set 613 | # CONFIG_PCI_QUIRKS is not set 614 | # CONFIG_PCI_DEBUG is not set 615 | # CONFIG_PCI_STUB is not set 616 | CONFIG_PCI_LOCKLESS_CONFIG=y 617 | # CONFIG_PCI_IOV is not set 618 | # CONFIG_PCI_PRI is not set 619 | # CONFIG_PCI_PASID is not set 620 | # CONFIG_PCIE_BUS_TUNE_OFF is not set 621 | CONFIG_PCIE_BUS_DEFAULT=y 622 | # CONFIG_PCIE_BUS_SAFE is not set 623 | # CONFIG_PCIE_BUS_PERFORMANCE is not set 624 | # CONFIG_PCIE_BUS_PEER2PEER is not set 625 | # CONFIG_VGA_ARB is not set 626 | # CONFIG_HOTPLUG_PCI is not set 627 | 628 | # 629 | # PCI controller drivers 630 | # 631 | 632 | # 633 | # DesignWare PCI Core Support 634 | # 635 | # end of DesignWare PCI Core Support 636 | 637 | # 638 | # Mobiveil PCIe Core Support 639 | # 640 | # end of Mobiveil PCIe Core Support 641 | 642 | # 643 | # Cadence PCIe controllers support 644 | # 645 | # end of Cadence PCIe controllers support 646 | # end of PCI controller drivers 647 | 648 | # 649 | # PCI Endpoint 650 | # 651 | # CONFIG_PCI_ENDPOINT is not set 652 | # end of PCI Endpoint 653 | 654 | # 655 | # PCI switch controller drivers 656 | # 657 | # CONFIG_PCI_SW_SWITCHTEC is not set 658 | # end of PCI switch controller drivers 659 | 660 | # CONFIG_CXL_BUS is not set 661 | # CONFIG_PCCARD is not set 662 | # CONFIG_RAPIDIO is not set 663 | 664 | # 665 | # Generic Driver Options 666 | # 667 | # CONFIG_UEVENT_HELPER is not set 668 | CONFIG_DEVTMPFS=y 669 | CONFIG_DEVTMPFS_MOUNT=y 670 | # CONFIG_DEVTMPFS_SAFE is not set 671 | # CONFIG_STANDALONE is not set 672 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set 673 | 674 | # 675 | # Firmware loader 676 | # 677 | # CONFIG_FW_LOADER is not set 678 | # end of Firmware loader 679 | 680 | # CONFIG_ALLOW_DEV_COREDUMP is not set 681 | # CONFIG_DEBUG_DRIVER is not set 682 | # CONFIG_DEBUG_DEVRES is not set 683 | # CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set 684 | CONFIG_GENERIC_CPU_AUTOPROBE=y 685 | CONFIG_GENERIC_CPU_VULNERABILITIES=y 686 | # end of Generic Driver Options 687 | 688 | # 689 | # Bus devices 690 | # 691 | # CONFIG_MHI_BUS is not set 692 | # CONFIG_MHI_BUS_EP is not set 693 | # end of Bus devices 694 | 695 | # 696 | # Firmware Drivers 697 | # 698 | 699 | # 700 | # ARM System Control and Management Interface Protocol 701 | # 702 | # end of ARM System Control and Management Interface Protocol 703 | 704 | # CONFIG_EDD is not set 705 | # CONFIG_FIRMWARE_MEMMAP is not set 706 | # CONFIG_FW_CFG_SYSFS is not set 707 | # CONFIG_SYSFB_SIMPLEFB is not set 708 | # CONFIG_GOOGLE_FIRMWARE is not set 709 | 710 | # 711 | # Tegra firmware driver 712 | # 713 | # end of Tegra firmware driver 714 | # end of Firmware Drivers 715 | 716 | # CONFIG_GNSS is not set 717 | # CONFIG_MTD is not set 718 | # CONFIG_OF is not set 719 | CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y 720 | # CONFIG_PARPORT is not set 721 | CONFIG_BLK_DEV=y 722 | # CONFIG_BLK_DEV_NULL_BLK is not set 723 | # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set 724 | # CONFIG_BLK_DEV_LOOP is not set 725 | 726 | # 727 | # DRBD disabled because PROC_FS or INET not selected 728 | # 729 | # CONFIG_BLK_DEV_SX8 is not set 730 | # CONFIG_BLK_DEV_RAM is not set 731 | CONFIG_VIRTIO_BLK=y 732 | 733 | # 734 | # NVME Support 735 | # 736 | # CONFIG_BLK_DEV_NVME is not set 737 | # CONFIG_NVME_FC is not set 738 | # end of NVME Support 739 | 740 | # 741 | # Misc devices 742 | # 743 | # CONFIG_DUMMY_IRQ is not set 744 | # CONFIG_IBM_ASM is not set 745 | # CONFIG_PHANTOM is not set 746 | # CONFIG_TIFM_CORE is not set 747 | # CONFIG_ENCLOSURE_SERVICES is not set 748 | # CONFIG_HP_ILO is not set 749 | # CONFIG_SRAM is not set 750 | # CONFIG_DW_XDATA_PCIE is not set 751 | # CONFIG_PCI_ENDPOINT_TEST is not set 752 | # CONFIG_XILINX_SDFEC is not set 753 | # CONFIG_C2PORT is not set 754 | 755 | # 756 | # EEPROM support 757 | # 758 | # CONFIG_EEPROM_93CX6 is not set 759 | # end of EEPROM support 760 | 761 | # CONFIG_CB710_CORE is not set 762 | 763 | # 764 | # Texas Instruments shared transport line discipline 765 | # 766 | # end of Texas Instruments shared transport line discipline 767 | 768 | # 769 | # Altera FPGA firmware download module (requires I2C) 770 | # 771 | # CONFIG_INTEL_MEI is not set 772 | # CONFIG_INTEL_MEI_ME is not set 773 | # CONFIG_INTEL_MEI_TXE is not set 774 | # CONFIG_VMWARE_VMCI is not set 775 | # CONFIG_GENWQE is not set 776 | # CONFIG_ECHO is not set 777 | # CONFIG_MISC_ALCOR_PCI is not set 778 | # CONFIG_MISC_RTSX_PCI is not set 779 | # CONFIG_HABANA_AI is not set 780 | # CONFIG_PVPANIC is not set 781 | # end of Misc devices 782 | 783 | # 784 | # SCSI device support 785 | # 786 | CONFIG_SCSI_MOD=y 787 | # CONFIG_RAID_ATTRS is not set 788 | # CONFIG_SCSI is not set 789 | # end of SCSI device support 790 | 791 | # CONFIG_ATA is not set 792 | # CONFIG_MD is not set 793 | # CONFIG_TARGET_CORE is not set 794 | # CONFIG_FUSION is not set 795 | 796 | # 797 | # IEEE 1394 (FireWire) support 798 | # 799 | # CONFIG_FIREWIRE is not set 800 | # CONFIG_FIREWIRE_NOSY is not set 801 | # end of IEEE 1394 (FireWire) support 802 | 803 | # CONFIG_MACINTOSH_DRIVERS is not set 804 | 805 | # 806 | # Input device support 807 | # 808 | CONFIG_INPUT=y 809 | # CONFIG_INPUT_FF_MEMLESS is not set 810 | # CONFIG_INPUT_SPARSEKMAP is not set 811 | # CONFIG_INPUT_MATRIXKMAP is not set 812 | CONFIG_INPUT_VIVALDIFMAP=y 813 | 814 | # 815 | # Userland interfaces 816 | # 817 | # CONFIG_INPUT_MOUSEDEV is not set 818 | # CONFIG_INPUT_JOYDEV is not set 819 | # CONFIG_INPUT_EVDEV is not set 820 | # CONFIG_INPUT_EVBUG is not set 821 | 822 | # 823 | # Input Device Drivers 824 | # 825 | CONFIG_INPUT_KEYBOARD=y 826 | CONFIG_KEYBOARD_ATKBD=y 827 | # CONFIG_KEYBOARD_LKKBD is not set 828 | # CONFIG_KEYBOARD_NEWTON is not set 829 | # CONFIG_KEYBOARD_OPENCORES is not set 830 | # CONFIG_KEYBOARD_SAMSUNG is not set 831 | # CONFIG_KEYBOARD_STOWAWAY is not set 832 | # CONFIG_KEYBOARD_SUNKBD is not set 833 | # CONFIG_KEYBOARD_XTKBD is not set 834 | CONFIG_INPUT_MOUSE=y 835 | CONFIG_MOUSE_PS2=y 836 | CONFIG_MOUSE_PS2_ALPS=y 837 | CONFIG_MOUSE_PS2_BYD=y 838 | CONFIG_MOUSE_PS2_LOGIPS2PP=y 839 | CONFIG_MOUSE_PS2_SYNAPTICS=y 840 | CONFIG_MOUSE_PS2_CYPRESS=y 841 | CONFIG_MOUSE_PS2_TRACKPOINT=y 842 | # CONFIG_MOUSE_PS2_ELANTECH is not set 843 | # CONFIG_MOUSE_PS2_SENTELIC is not set 844 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set 845 | CONFIG_MOUSE_PS2_FOCALTECH=y 846 | # CONFIG_MOUSE_SERIAL is not set 847 | # CONFIG_MOUSE_VSXXXAA is not set 848 | # CONFIG_INPUT_JOYSTICK is not set 849 | # CONFIG_INPUT_TABLET is not set 850 | # CONFIG_INPUT_TOUCHSCREEN is not set 851 | # CONFIG_INPUT_MISC is not set 852 | # CONFIG_RMI4_CORE is not set 853 | 854 | # 855 | # Hardware I/O ports 856 | # 857 | CONFIG_SERIO=y 858 | CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y 859 | CONFIG_SERIO_I8042=y 860 | CONFIG_SERIO_SERPORT=y 861 | # CONFIG_SERIO_CT82C710 is not set 862 | # CONFIG_SERIO_PCIPS2 is not set 863 | CONFIG_SERIO_LIBPS2=y 864 | # CONFIG_SERIO_RAW is not set 865 | # CONFIG_SERIO_ALTERA_PS2 is not set 866 | # CONFIG_SERIO_PS2MULT is not set 867 | # CONFIG_SERIO_ARC_PS2 is not set 868 | # CONFIG_USERIO is not set 869 | # CONFIG_GAMEPORT is not set 870 | # end of Hardware I/O ports 871 | # end of Input device support 872 | 873 | # 874 | # Character devices 875 | # 876 | CONFIG_TTY=y 877 | CONFIG_VT=y 878 | CONFIG_CONSOLE_TRANSLATIONS=y 879 | CONFIG_VT_CONSOLE=y 880 | CONFIG_HW_CONSOLE=y 881 | # CONFIG_VT_HW_CONSOLE_BINDING is not set 882 | CONFIG_UNIX98_PTYS=y 883 | CONFIG_LEGACY_PTYS=y 884 | CONFIG_LEGACY_PTY_COUNT=256 885 | CONFIG_LDISC_AUTOLOAD=y 886 | 887 | # 888 | # Serial drivers 889 | # 890 | CONFIG_SERIAL_EARLYCON=y 891 | CONFIG_SERIAL_8250=y 892 | CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y 893 | # CONFIG_SERIAL_8250_16550A_VARIANTS is not set 894 | # CONFIG_SERIAL_8250_FINTEK is not set 895 | CONFIG_SERIAL_8250_CONSOLE=y 896 | # CONFIG_SERIAL_8250_PCI is not set 897 | CONFIG_SERIAL_8250_NR_UARTS=4 898 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 899 | # CONFIG_SERIAL_8250_EXTENDED is not set 900 | # CONFIG_SERIAL_8250_DW is not set 901 | # CONFIG_SERIAL_8250_RT288X is not set 902 | # CONFIG_SERIAL_8250_LPSS is not set 903 | # CONFIG_SERIAL_8250_MID is not set 904 | CONFIG_SERIAL_8250_PERICOM=y 905 | 906 | # 907 | # Non-8250 serial port support 908 | # 909 | # CONFIG_SERIAL_UARTLITE is not set 910 | CONFIG_SERIAL_CORE=y 911 | CONFIG_SERIAL_CORE_CONSOLE=y 912 | # CONFIG_SERIAL_JSM is not set 913 | # CONFIG_SERIAL_LANTIQ is not set 914 | # CONFIG_SERIAL_SCCNXP is not set 915 | # CONFIG_SERIAL_ALTERA_JTAGUART is not set 916 | # CONFIG_SERIAL_ALTERA_UART is not set 917 | # CONFIG_SERIAL_ARC is not set 918 | # CONFIG_SERIAL_RP2 is not set 919 | # CONFIG_SERIAL_FSL_LPUART is not set 920 | # CONFIG_SERIAL_FSL_LINFLEXUART is not set 921 | # CONFIG_SERIAL_SPRD is not set 922 | # end of Serial drivers 923 | 924 | # CONFIG_SERIAL_NONSTANDARD is not set 925 | # CONFIG_NOZOMI is not set 926 | # CONFIG_NULL_TTY is not set 927 | # CONFIG_SERIAL_DEV_BUS is not set 928 | # CONFIG_TTY_PRINTK is not set 929 | # CONFIG_VIRTIO_CONSOLE is not set 930 | # CONFIG_IPMI_HANDLER is not set 931 | # CONFIG_HW_RANDOM is not set 932 | # CONFIG_APPLICOM is not set 933 | # CONFIG_MWAVE is not set 934 | # CONFIG_DEVMEM is not set 935 | # CONFIG_NVRAM is not set 936 | CONFIG_DEVPORT=y 937 | # CONFIG_HANGCHECK_TIMER is not set 938 | # CONFIG_TCG_TPM is not set 939 | # CONFIG_TELCLOCK is not set 940 | # CONFIG_XILLYBUS is not set 941 | # CONFIG_RANDOM_TRUST_BOOTLOADER is not set 942 | # end of Character devices 943 | 944 | # 945 | # I2C support 946 | # 947 | # CONFIG_I2C is not set 948 | # end of I2C support 949 | 950 | # CONFIG_I3C is not set 951 | # CONFIG_SPI is not set 952 | # CONFIG_SPMI is not set 953 | # CONFIG_HSI is not set 954 | # CONFIG_PPS is not set 955 | 956 | # 957 | # PTP clock support 958 | # 959 | CONFIG_PTP_1588_CLOCK_OPTIONAL=y 960 | 961 | # 962 | # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. 963 | # 964 | # end of PTP clock support 965 | 966 | # CONFIG_PINCTRL is not set 967 | # CONFIG_GPIOLIB is not set 968 | # CONFIG_W1 is not set 969 | # CONFIG_POWER_RESET is not set 970 | # CONFIG_POWER_SUPPLY is not set 971 | # CONFIG_HWMON is not set 972 | # CONFIG_THERMAL is not set 973 | # CONFIG_WATCHDOG is not set 974 | CONFIG_SSB_POSSIBLE=y 975 | # CONFIG_SSB is not set 976 | CONFIG_BCMA_POSSIBLE=y 977 | # CONFIG_BCMA is not set 978 | 979 | # 980 | # Multifunction device drivers 981 | # 982 | # CONFIG_MFD_MADERA is not set 983 | # CONFIG_HTC_PASIC3 is not set 984 | # CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set 985 | # CONFIG_LPC_ICH is not set 986 | # CONFIG_LPC_SCH is not set 987 | # CONFIG_MFD_INTEL_LPSS_PCI is not set 988 | # CONFIG_MFD_JANZ_CMODIO is not set 989 | # CONFIG_MFD_KEMPLD is not set 990 | # CONFIG_MFD_MT6397 is not set 991 | # CONFIG_MFD_RDC321X is not set 992 | # CONFIG_MFD_SM501 is not set 993 | # CONFIG_MFD_SYSCON is not set 994 | # CONFIG_MFD_TI_AM335X_TSCADC is not set 995 | # CONFIG_MFD_TQMX86 is not set 996 | # CONFIG_MFD_VX855 is not set 997 | # end of Multifunction device drivers 998 | 999 | # CONFIG_REGULATOR is not set 1000 | # CONFIG_RC_CORE is not set 1001 | 1002 | # 1003 | # CEC support 1004 | # 1005 | # CONFIG_MEDIA_CEC_SUPPORT is not set 1006 | # end of CEC support 1007 | 1008 | # CONFIG_MEDIA_SUPPORT is not set 1009 | 1010 | # 1011 | # Graphics support 1012 | # 1013 | # CONFIG_AGP is not set 1014 | # CONFIG_DRM is not set 1015 | # CONFIG_DRM_DEBUG_MODESET_LOCK is not set 1016 | 1017 | # 1018 | # ARM devices 1019 | # 1020 | # end of ARM devices 1021 | 1022 | # 1023 | # Frame buffer Devices 1024 | # 1025 | # CONFIG_FB is not set 1026 | # end of Frame buffer Devices 1027 | 1028 | # 1029 | # Backlight & LCD device support 1030 | # 1031 | # CONFIG_LCD_CLASS_DEVICE is not set 1032 | # CONFIG_BACKLIGHT_CLASS_DEVICE is not set 1033 | # end of Backlight & LCD device support 1034 | 1035 | # 1036 | # Console display driver support 1037 | # 1038 | # CONFIG_VGA_CONSOLE is not set 1039 | CONFIG_DUMMY_CONSOLE=y 1040 | CONFIG_DUMMY_CONSOLE_COLUMNS=80 1041 | CONFIG_DUMMY_CONSOLE_ROWS=25 1042 | # end of Console display driver support 1043 | # end of Graphics support 1044 | 1045 | # CONFIG_SOUND is not set 1046 | 1047 | # 1048 | # HID support 1049 | # 1050 | CONFIG_HID=y 1051 | # CONFIG_HID_BATTERY_STRENGTH is not set 1052 | # CONFIG_HIDRAW is not set 1053 | # CONFIG_UHID is not set 1054 | CONFIG_HID_GENERIC=y 1055 | 1056 | # 1057 | # Special HID drivers 1058 | # 1059 | # CONFIG_HID_A4TECH is not set 1060 | # CONFIG_HID_ACRUX is not set 1061 | # CONFIG_HID_AUREAL is not set 1062 | # CONFIG_HID_BELKIN is not set 1063 | # CONFIG_HID_CHERRY is not set 1064 | # CONFIG_HID_COUGAR is not set 1065 | # CONFIG_HID_MACALLY is not set 1066 | # CONFIG_HID_CMEDIA is not set 1067 | # CONFIG_HID_CYPRESS is not set 1068 | # CONFIG_HID_DRAGONRISE is not set 1069 | # CONFIG_HID_EMS_FF is not set 1070 | # CONFIG_HID_ELECOM is not set 1071 | # CONFIG_HID_EZKEY is not set 1072 | # CONFIG_HID_GEMBIRD is not set 1073 | # CONFIG_HID_GFRM is not set 1074 | # CONFIG_HID_GLORIOUS is not set 1075 | # CONFIG_HID_VIVALDI is not set 1076 | # CONFIG_HID_KEYTOUCH is not set 1077 | # CONFIG_HID_KYE is not set 1078 | # CONFIG_HID_WALTOP is not set 1079 | # CONFIG_HID_VIEWSONIC is not set 1080 | # CONFIG_HID_XIAOMI is not set 1081 | # CONFIG_HID_GYRATION is not set 1082 | # CONFIG_HID_ICADE is not set 1083 | # CONFIG_HID_ITE is not set 1084 | # CONFIG_HID_JABRA is not set 1085 | # CONFIG_HID_TWINHAN is not set 1086 | # CONFIG_HID_KENSINGTON is not set 1087 | # CONFIG_HID_LCPOWER is not set 1088 | # CONFIG_HID_LENOVO is not set 1089 | # CONFIG_HID_MAGICMOUSE is not set 1090 | # CONFIG_HID_MALTRON is not set 1091 | # CONFIG_HID_MAYFLASH is not set 1092 | # CONFIG_HID_REDRAGON is not set 1093 | # CONFIG_HID_MICROSOFT is not set 1094 | # CONFIG_HID_MONTEREY is not set 1095 | # CONFIG_HID_MULTITOUCH is not set 1096 | # CONFIG_HID_NTI is not set 1097 | # CONFIG_HID_ORTEK is not set 1098 | # CONFIG_HID_PANTHERLORD is not set 1099 | # CONFIG_HID_PETALYNX is not set 1100 | # CONFIG_HID_PICOLCD is not set 1101 | # CONFIG_HID_PLANTRONICS is not set 1102 | # CONFIG_HID_RAZER is not set 1103 | # CONFIG_HID_PRIMAX is not set 1104 | # CONFIG_HID_SAITEK is not set 1105 | # CONFIG_HID_SEMITEK is not set 1106 | # CONFIG_HID_SPEEDLINK is not set 1107 | # CONFIG_HID_STEAM is not set 1108 | # CONFIG_HID_STEELSERIES is not set 1109 | # CONFIG_HID_SUNPLUS is not set 1110 | # CONFIG_HID_RMI is not set 1111 | # CONFIG_HID_GREENASIA is not set 1112 | # CONFIG_HID_SMARTJOYPLUS is not set 1113 | # CONFIG_HID_TIVO is not set 1114 | # CONFIG_HID_TOPSEED is not set 1115 | # CONFIG_HID_UDRAW_PS3 is not set 1116 | # CONFIG_HID_XINMO is not set 1117 | # CONFIG_HID_ZEROPLUS is not set 1118 | # CONFIG_HID_ZYDACRON is not set 1119 | # CONFIG_HID_SENSOR_HUB is not set 1120 | # CONFIG_HID_ALPS is not set 1121 | # end of Special HID drivers 1122 | 1123 | # 1124 | # Intel ISH HID support 1125 | # 1126 | # CONFIG_INTEL_ISH_HID is not set 1127 | # end of Intel ISH HID support 1128 | 1129 | # 1130 | # AMD SFH HID Support 1131 | # 1132 | # CONFIG_AMD_SFH_HID is not set 1133 | # end of AMD SFH HID Support 1134 | # end of HID support 1135 | 1136 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y 1137 | # CONFIG_USB_SUPPORT is not set 1138 | # CONFIG_MMC is not set 1139 | # CONFIG_MEMSTICK is not set 1140 | # CONFIG_NEW_LEDS is not set 1141 | # CONFIG_ACCESSIBILITY is not set 1142 | CONFIG_EDAC_ATOMIC_SCRUB=y 1143 | CONFIG_EDAC_SUPPORT=y 1144 | CONFIG_RTC_LIB=y 1145 | CONFIG_RTC_MC146818_LIB=y 1146 | # CONFIG_RTC_CLASS is not set 1147 | # CONFIG_DMADEVICES is not set 1148 | 1149 | # 1150 | # DMABUF options 1151 | # 1152 | # CONFIG_SYNC_FILE is not set 1153 | # CONFIG_DMABUF_HEAPS is not set 1154 | # end of DMABUF options 1155 | 1156 | # CONFIG_AUXDISPLAY is not set 1157 | # CONFIG_UIO is not set 1158 | # CONFIG_VFIO is not set 1159 | # CONFIG_VIRT_DRIVERS is not set 1160 | CONFIG_VIRTIO_ANCHOR=y 1161 | CONFIG_VIRTIO=y 1162 | CONFIG_VIRTIO_PCI_LIB=y 1163 | CONFIG_VIRTIO_MENU=y 1164 | CONFIG_VIRTIO_PCI=y 1165 | # CONFIG_VIRTIO_PCI_LEGACY is not set 1166 | # CONFIG_VIRTIO_BALLOON is not set 1167 | # CONFIG_VIRTIO_INPUT is not set 1168 | # CONFIG_VIRTIO_MMIO is not set 1169 | # CONFIG_VHOST_MENU is not set 1170 | 1171 | # 1172 | # Microsoft Hyper-V guest support 1173 | # 1174 | # end of Microsoft Hyper-V guest support 1175 | 1176 | # CONFIG_GREYBUS is not set 1177 | # CONFIG_COMEDI is not set 1178 | # CONFIG_STAGING is not set 1179 | # CONFIG_X86_PLATFORM_DEVICES is not set 1180 | CONFIG_PMC_ATOM=y 1181 | # CONFIG_CHROME_PLATFORMS is not set 1182 | # CONFIG_MELLANOX_PLATFORM is not set 1183 | # CONFIG_SURFACE_PLATFORMS is not set 1184 | CONFIG_HAVE_CLK=y 1185 | CONFIG_HAVE_CLK_PREPARE=y 1186 | CONFIG_COMMON_CLK=y 1187 | # CONFIG_XILINX_VCU is not set 1188 | # CONFIG_HWSPINLOCK is not set 1189 | 1190 | # 1191 | # Clock Source drivers 1192 | # 1193 | CONFIG_CLKEVT_I8253=y 1194 | CONFIG_CLKBLD_I8253=y 1195 | # end of Clock Source drivers 1196 | 1197 | # CONFIG_MAILBOX is not set 1198 | # CONFIG_IOMMU_SUPPORT is not set 1199 | 1200 | # 1201 | # Remoteproc drivers 1202 | # 1203 | # CONFIG_REMOTEPROC is not set 1204 | # end of Remoteproc drivers 1205 | 1206 | # 1207 | # Rpmsg drivers 1208 | # 1209 | # CONFIG_RPMSG_VIRTIO is not set 1210 | # end of Rpmsg drivers 1211 | 1212 | # 1213 | # SOC (System On Chip) specific Drivers 1214 | # 1215 | 1216 | # 1217 | # Amlogic SoC drivers 1218 | # 1219 | # end of Amlogic SoC drivers 1220 | 1221 | # 1222 | # Broadcom SoC drivers 1223 | # 1224 | # end of Broadcom SoC drivers 1225 | 1226 | # 1227 | # NXP/Freescale QorIQ SoC drivers 1228 | # 1229 | # end of NXP/Freescale QorIQ SoC drivers 1230 | 1231 | # 1232 | # i.MX SoC drivers 1233 | # 1234 | # end of i.MX SoC drivers 1235 | 1236 | # 1237 | # Enable LiteX SoC Builder specific drivers 1238 | # 1239 | # end of Enable LiteX SoC Builder specific drivers 1240 | 1241 | # 1242 | # Qualcomm SoC drivers 1243 | # 1244 | # end of Qualcomm SoC drivers 1245 | 1246 | # CONFIG_SOC_TI is not set 1247 | 1248 | # 1249 | # Xilinx SoC drivers 1250 | # 1251 | # end of Xilinx SoC drivers 1252 | # end of SOC (System On Chip) specific Drivers 1253 | 1254 | # CONFIG_PM_DEVFREQ is not set 1255 | # CONFIG_EXTCON is not set 1256 | # CONFIG_MEMORY is not set 1257 | # CONFIG_IIO is not set 1258 | # CONFIG_NTB is not set 1259 | # CONFIG_VME_BUS is not set 1260 | # CONFIG_PWM is not set 1261 | 1262 | # 1263 | # IRQ chip support 1264 | # 1265 | # end of IRQ chip support 1266 | 1267 | # CONFIG_IPACK_BUS is not set 1268 | # CONFIG_RESET_CONTROLLER is not set 1269 | 1270 | # 1271 | # PHY Subsystem 1272 | # 1273 | # CONFIG_GENERIC_PHY is not set 1274 | # CONFIG_PHY_CAN_TRANSCEIVER is not set 1275 | 1276 | # 1277 | # PHY drivers for Broadcom platforms 1278 | # 1279 | # CONFIG_BCM_KONA_USB2_PHY is not set 1280 | # end of PHY drivers for Broadcom platforms 1281 | 1282 | # CONFIG_PHY_PXA_28NM_HSIC is not set 1283 | # CONFIG_PHY_PXA_28NM_USB2 is not set 1284 | # CONFIG_PHY_INTEL_LGM_EMMC is not set 1285 | # end of PHY Subsystem 1286 | 1287 | # CONFIG_POWERCAP is not set 1288 | # CONFIG_MCB is not set 1289 | 1290 | # 1291 | # Performance monitor support 1292 | # 1293 | # end of Performance monitor support 1294 | 1295 | # CONFIG_RAS is not set 1296 | # CONFIG_USB4 is not set 1297 | 1298 | # 1299 | # Android 1300 | # 1301 | # CONFIG_ANDROID is not set 1302 | # end of Android 1303 | 1304 | # CONFIG_LIBNVDIMM is not set 1305 | # CONFIG_DAX is not set 1306 | # CONFIG_NVMEM is not set 1307 | 1308 | # 1309 | # HW tracing support 1310 | # 1311 | # CONFIG_STM is not set 1312 | # CONFIG_INTEL_TH is not set 1313 | # end of HW tracing support 1314 | 1315 | # CONFIG_FPGA is not set 1316 | # CONFIG_TEE is not set 1317 | # CONFIG_SIOX is not set 1318 | # CONFIG_SLIMBUS is not set 1319 | # CONFIG_INTERCONNECT is not set 1320 | # CONFIG_COUNTER is not set 1321 | # CONFIG_PECI is not set 1322 | # CONFIG_HTE is not set 1323 | # end of Device Drivers 1324 | 1325 | # 1326 | # File systems 1327 | # 1328 | CONFIG_DCACHE_WORD_ACCESS=y 1329 | # CONFIG_VALIDATE_FS_PARSER is not set 1330 | CONFIG_FS_IOMAP=y 1331 | # CONFIG_EXT2_FS is not set 1332 | # CONFIG_EXT3_FS is not set 1333 | CONFIG_EXT4_FS=y 1334 | # CONFIG_EXT4_USE_FOR_EXT2 is not set 1335 | # CONFIG_EXT4_FS_POSIX_ACL is not set 1336 | # CONFIG_EXT4_FS_SECURITY is not set 1337 | # CONFIG_EXT4_DEBUG is not set 1338 | CONFIG_JBD2=y 1339 | # CONFIG_JBD2_DEBUG is not set 1340 | CONFIG_FS_MBCACHE=y 1341 | # CONFIG_REISERFS_FS is not set 1342 | # CONFIG_JFS_FS is not set 1343 | # CONFIG_XFS_FS is not set 1344 | # CONFIG_GFS2_FS is not set 1345 | # CONFIG_BTRFS_FS is not set 1346 | # CONFIG_NILFS2_FS is not set 1347 | # CONFIG_F2FS_FS is not set 1348 | # CONFIG_EXPORTFS_BLOCK_OPS is not set 1349 | # CONFIG_FILE_LOCKING is not set 1350 | # CONFIG_FS_ENCRYPTION is not set 1351 | # CONFIG_FS_VERITY is not set 1352 | # CONFIG_DNOTIFY is not set 1353 | # CONFIG_INOTIFY_USER is not set 1354 | # CONFIG_FANOTIFY is not set 1355 | # CONFIG_QUOTA is not set 1356 | # CONFIG_AUTOFS4_FS is not set 1357 | # CONFIG_AUTOFS_FS is not set 1358 | # CONFIG_FUSE_FS is not set 1359 | # CONFIG_OVERLAY_FS is not set 1360 | 1361 | # 1362 | # Caches 1363 | # 1364 | # CONFIG_FSCACHE is not set 1365 | # end of Caches 1366 | 1367 | # 1368 | # CD-ROM/DVD Filesystems 1369 | # 1370 | # CONFIG_ISO9660_FS is not set 1371 | # CONFIG_UDF_FS is not set 1372 | # end of CD-ROM/DVD Filesystems 1373 | 1374 | # 1375 | # DOS/FAT/EXFAT/NT Filesystems 1376 | # 1377 | # CONFIG_MSDOS_FS is not set 1378 | # CONFIG_VFAT_FS is not set 1379 | # CONFIG_EXFAT_FS is not set 1380 | # CONFIG_NTFS_FS is not set 1381 | # CONFIG_NTFS3_FS is not set 1382 | # end of DOS/FAT/EXFAT/NT Filesystems 1383 | 1384 | # 1385 | # Pseudo filesystems 1386 | # 1387 | CONFIG_PROC_FS=y 1388 | # CONFIG_PROC_KCORE is not set 1389 | CONFIG_PROC_SYSCTL=y 1390 | CONFIG_PROC_PAGE_MONITOR=y 1391 | # CONFIG_PROC_CHILDREN is not set 1392 | CONFIG_PROC_PID_ARCH_STATUS=y 1393 | CONFIG_KERNFS=y 1394 | CONFIG_SYSFS=y 1395 | # CONFIG_HUGETLBFS is not set 1396 | CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y 1397 | CONFIG_ARCH_HAS_GIGANTIC_PAGE=y 1398 | # CONFIG_CONFIGFS_FS is not set 1399 | # end of Pseudo filesystems 1400 | 1401 | # CONFIG_MISC_FILESYSTEMS is not set 1402 | # CONFIG_NLS is not set 1403 | # CONFIG_UNICODE is not set 1404 | # end of File systems 1405 | 1406 | # 1407 | # Security options 1408 | # 1409 | # CONFIG_KEYS is not set 1410 | # CONFIG_SECURITY_DMESG_RESTRICT is not set 1411 | # CONFIG_SECURITYFS is not set 1412 | # CONFIG_FORTIFY_SOURCE is not set 1413 | # CONFIG_STATIC_USERMODEHELPER is not set 1414 | CONFIG_DEFAULT_SECURITY_DAC=y 1415 | CONFIG_LSM="landlock,lockdown,yama,loadpin,safesetid,integrity,bpf" 1416 | 1417 | # 1418 | # Kernel hardening options 1419 | # 1420 | 1421 | # 1422 | # Memory initialization 1423 | # 1424 | CONFIG_INIT_STACK_NONE=y 1425 | # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set 1426 | # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set 1427 | # end of Memory initialization 1428 | 1429 | CONFIG_RANDSTRUCT_NONE=y 1430 | # end of Kernel hardening options 1431 | # end of Security options 1432 | 1433 | CONFIG_CRYPTO=y 1434 | 1435 | # 1436 | # Crypto core or helper 1437 | # 1438 | CONFIG_CRYPTO_ALGAPI=y 1439 | CONFIG_CRYPTO_ALGAPI2=y 1440 | CONFIG_CRYPTO_HASH=y 1441 | CONFIG_CRYPTO_HASH2=y 1442 | # CONFIG_CRYPTO_MANAGER is not set 1443 | CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y 1444 | # CONFIG_CRYPTO_NULL is not set 1445 | # CONFIG_CRYPTO_CRYPTD is not set 1446 | # CONFIG_CRYPTO_AUTHENC is not set 1447 | # CONFIG_CRYPTO_TEST is not set 1448 | 1449 | # 1450 | # Public-key cryptography 1451 | # 1452 | # CONFIG_CRYPTO_RSA is not set 1453 | # CONFIG_CRYPTO_DH is not set 1454 | # CONFIG_CRYPTO_ECDH is not set 1455 | # CONFIG_CRYPTO_ECDSA is not set 1456 | # CONFIG_CRYPTO_ECRDSA is not set 1457 | # CONFIG_CRYPTO_SM2 is not set 1458 | # CONFIG_CRYPTO_CURVE25519 is not set 1459 | # CONFIG_CRYPTO_CURVE25519_X86 is not set 1460 | 1461 | # 1462 | # Authenticated Encryption with Associated Data 1463 | # 1464 | # CONFIG_CRYPTO_CCM is not set 1465 | # CONFIG_CRYPTO_GCM is not set 1466 | # CONFIG_CRYPTO_CHACHA20POLY1305 is not set 1467 | # CONFIG_CRYPTO_AEGIS128 is not set 1468 | # CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set 1469 | # CONFIG_CRYPTO_SEQIV is not set 1470 | # CONFIG_CRYPTO_ECHAINIV is not set 1471 | 1472 | # 1473 | # Block modes 1474 | # 1475 | # CONFIG_CRYPTO_CBC is not set 1476 | # CONFIG_CRYPTO_CFB is not set 1477 | # CONFIG_CRYPTO_CTR is not set 1478 | # CONFIG_CRYPTO_CTS is not set 1479 | # CONFIG_CRYPTO_ECB is not set 1480 | # CONFIG_CRYPTO_LRW is not set 1481 | # CONFIG_CRYPTO_OFB is not set 1482 | # CONFIG_CRYPTO_PCBC is not set 1483 | # CONFIG_CRYPTO_XTS is not set 1484 | # CONFIG_CRYPTO_KEYWRAP is not set 1485 | # CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set 1486 | # CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set 1487 | # CONFIG_CRYPTO_ADIANTUM is not set 1488 | # CONFIG_CRYPTO_ESSIV is not set 1489 | 1490 | # 1491 | # Hash modes 1492 | # 1493 | # CONFIG_CRYPTO_CMAC is not set 1494 | # CONFIG_CRYPTO_HMAC is not set 1495 | # CONFIG_CRYPTO_XCBC is not set 1496 | # CONFIG_CRYPTO_VMAC is not set 1497 | 1498 | # 1499 | # Digest 1500 | # 1501 | CONFIG_CRYPTO_CRC32C=y 1502 | # CONFIG_CRYPTO_CRC32C_INTEL is not set 1503 | # CONFIG_CRYPTO_CRC32 is not set 1504 | # CONFIG_CRYPTO_CRC32_PCLMUL is not set 1505 | # CONFIG_CRYPTO_XXHASH is not set 1506 | # CONFIG_CRYPTO_BLAKE2B is not set 1507 | # CONFIG_CRYPTO_BLAKE2S_X86 is not set 1508 | # CONFIG_CRYPTO_CRCT10DIF is not set 1509 | # CONFIG_CRYPTO_GHASH is not set 1510 | # CONFIG_CRYPTO_POLY1305 is not set 1511 | # CONFIG_CRYPTO_POLY1305_X86_64 is not set 1512 | # CONFIG_CRYPTO_MD4 is not set 1513 | # CONFIG_CRYPTO_MD5 is not set 1514 | # CONFIG_CRYPTO_MICHAEL_MIC is not set 1515 | # CONFIG_CRYPTO_RMD160 is not set 1516 | # CONFIG_CRYPTO_SHA1 is not set 1517 | # CONFIG_CRYPTO_SHA1_SSSE3 is not set 1518 | # CONFIG_CRYPTO_SHA256_SSSE3 is not set 1519 | # CONFIG_CRYPTO_SHA512_SSSE3 is not set 1520 | # CONFIG_CRYPTO_SHA256 is not set 1521 | # CONFIG_CRYPTO_SHA512 is not set 1522 | # CONFIG_CRYPTO_SHA3 is not set 1523 | # CONFIG_CRYPTO_SM3_GENERIC is not set 1524 | # CONFIG_CRYPTO_SM3_AVX_X86_64 is not set 1525 | # CONFIG_CRYPTO_STREEBOG is not set 1526 | # CONFIG_CRYPTO_WP512 is not set 1527 | # CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set 1528 | 1529 | # 1530 | # Ciphers 1531 | # 1532 | # CONFIG_CRYPTO_AES is not set 1533 | # CONFIG_CRYPTO_AES_TI is not set 1534 | # CONFIG_CRYPTO_AES_NI_INTEL is not set 1535 | # CONFIG_CRYPTO_BLOWFISH is not set 1536 | # CONFIG_CRYPTO_BLOWFISH_X86_64 is not set 1537 | # CONFIG_CRYPTO_CAMELLIA is not set 1538 | # CONFIG_CRYPTO_CAMELLIA_X86_64 is not set 1539 | # CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set 1540 | # CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set 1541 | # CONFIG_CRYPTO_CAST5 is not set 1542 | # CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set 1543 | # CONFIG_CRYPTO_CAST6 is not set 1544 | # CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set 1545 | # CONFIG_CRYPTO_DES is not set 1546 | # CONFIG_CRYPTO_DES3_EDE_X86_64 is not set 1547 | # CONFIG_CRYPTO_FCRYPT is not set 1548 | # CONFIG_CRYPTO_CHACHA20 is not set 1549 | # CONFIG_CRYPTO_CHACHA20_X86_64 is not set 1550 | # CONFIG_CRYPTO_SERPENT is not set 1551 | # CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set 1552 | # CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set 1553 | # CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set 1554 | # CONFIG_CRYPTO_SM4_GENERIC is not set 1555 | # CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set 1556 | # CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set 1557 | # CONFIG_CRYPTO_TWOFISH is not set 1558 | # CONFIG_CRYPTO_TWOFISH_X86_64 is not set 1559 | # CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set 1560 | # CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set 1561 | 1562 | # 1563 | # Compression 1564 | # 1565 | # CONFIG_CRYPTO_DEFLATE is not set 1566 | # CONFIG_CRYPTO_LZO is not set 1567 | # CONFIG_CRYPTO_842 is not set 1568 | # CONFIG_CRYPTO_LZ4 is not set 1569 | # CONFIG_CRYPTO_LZ4HC is not set 1570 | # CONFIG_CRYPTO_ZSTD is not set 1571 | 1572 | # 1573 | # Random Number Generation 1574 | # 1575 | # CONFIG_CRYPTO_ANSI_CPRNG is not set 1576 | # CONFIG_CRYPTO_DRBG_MENU is not set 1577 | # CONFIG_CRYPTO_JITTERENTROPY is not set 1578 | # CONFIG_CRYPTO_HW is not set 1579 | 1580 | # 1581 | # Certificates for signature checking 1582 | # 1583 | # end of Certificates for signature checking 1584 | 1585 | # 1586 | # Library routines 1587 | # 1588 | # CONFIG_PACKING is not set 1589 | CONFIG_BITREVERSE=y 1590 | CONFIG_GENERIC_STRNCPY_FROM_USER=y 1591 | CONFIG_GENERIC_STRNLEN_USER=y 1592 | # CONFIG_CORDIC is not set 1593 | # CONFIG_PRIME_NUMBERS is not set 1594 | CONFIG_RATIONAL=y 1595 | CONFIG_GENERIC_PCI_IOMAP=y 1596 | CONFIG_GENERIC_IOMAP=y 1597 | CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y 1598 | CONFIG_ARCH_HAS_FAST_MULTIPLIER=y 1599 | CONFIG_ARCH_USE_SYM_ANNOTATIONS=y 1600 | 1601 | # 1602 | # Crypto library routines 1603 | # 1604 | CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y 1605 | # CONFIG_CRYPTO_LIB_CHACHA is not set 1606 | # CONFIG_CRYPTO_LIB_CURVE25519 is not set 1607 | CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 1608 | # CONFIG_CRYPTO_LIB_POLY1305 is not set 1609 | # CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set 1610 | # end of Crypto library routines 1611 | 1612 | CONFIG_LIB_MEMNEQ=y 1613 | # CONFIG_CRC_CCITT is not set 1614 | CONFIG_CRC16=y 1615 | # CONFIG_CRC_T10DIF is not set 1616 | # CONFIG_CRC64_ROCKSOFT is not set 1617 | # CONFIG_CRC_ITU_T is not set 1618 | CONFIG_CRC32=y 1619 | # CONFIG_CRC32_SELFTEST is not set 1620 | CONFIG_CRC32_SLICEBY8=y 1621 | # CONFIG_CRC32_SLICEBY4 is not set 1622 | # CONFIG_CRC32_SARWATE is not set 1623 | # CONFIG_CRC32_BIT is not set 1624 | # CONFIG_CRC64 is not set 1625 | # CONFIG_CRC4 is not set 1626 | # CONFIG_CRC7 is not set 1627 | # CONFIG_LIBCRC32C is not set 1628 | # CONFIG_CRC8 is not set 1629 | # CONFIG_RANDOM32_SELFTEST is not set 1630 | # CONFIG_XZ_DEC is not set 1631 | CONFIG_HAS_IOMEM=y 1632 | CONFIG_HAS_IOPORT_MAP=y 1633 | CONFIG_HAS_DMA=y 1634 | CONFIG_NEED_SG_DMA_LENGTH=y 1635 | CONFIG_NEED_DMA_MAP_STATE=y 1636 | CONFIG_ARCH_DMA_ADDR_T_64BIT=y 1637 | CONFIG_SWIOTLB=y 1638 | # CONFIG_DMA_API_DEBUG is not set 1639 | # CONFIG_IRQ_POLL is not set 1640 | CONFIG_HAVE_GENERIC_VDSO=y 1641 | CONFIG_GENERIC_GETTIMEOFDAY=y 1642 | CONFIG_GENERIC_VDSO_TIME_NS=y 1643 | CONFIG_SG_POOL=y 1644 | CONFIG_ARCH_HAS_PMEM_API=y 1645 | CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y 1646 | CONFIG_ARCH_HAS_COPY_MC=y 1647 | CONFIG_ARCH_STACKWALK=y 1648 | CONFIG_SBITMAP=y 1649 | # end of Library routines 1650 | 1651 | # 1652 | # Kernel hacking 1653 | # 1654 | 1655 | # 1656 | # printk and dmesg options 1657 | # 1658 | # CONFIG_PRINTK_TIME is not set 1659 | # CONFIG_PRINTK_CALLER is not set 1660 | # CONFIG_STACKTRACE_BUILD_ID is not set 1661 | CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 1662 | CONFIG_CONSOLE_LOGLEVEL_QUIET=4 1663 | CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 1664 | # CONFIG_BOOT_PRINTK_DELAY is not set 1665 | # CONFIG_DYNAMIC_DEBUG is not set 1666 | # CONFIG_DYNAMIC_DEBUG_CORE is not set 1667 | CONFIG_SYMBOLIC_ERRNAME=y 1668 | # end of printk and dmesg options 1669 | 1670 | CONFIG_DEBUG_KERNEL=y 1671 | # CONFIG_DEBUG_MISC is not set 1672 | 1673 | # 1674 | # Compile-time checks and compiler options 1675 | # 1676 | CONFIG_DEBUG_INFO_NONE=y 1677 | # CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set 1678 | # CONFIG_DEBUG_INFO_DWARF4 is not set 1679 | # CONFIG_DEBUG_INFO_DWARF5 is not set 1680 | CONFIG_FRAME_WARN=1024 1681 | # CONFIG_STRIP_ASM_SYMS is not set 1682 | # CONFIG_READABLE_ASM is not set 1683 | # CONFIG_HEADERS_INSTALL is not set 1684 | # CONFIG_DEBUG_SECTION_MISMATCH is not set 1685 | # CONFIG_SECTION_MISMATCH_WARN_ONLY is not set 1686 | # CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set 1687 | CONFIG_OBJTOOL=y 1688 | # CONFIG_VMLINUX_MAP is not set 1689 | # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set 1690 | # end of Compile-time checks and compiler options 1691 | 1692 | # 1693 | # Generic Kernel Debugging Instruments 1694 | # 1695 | # CONFIG_MAGIC_SYSRQ is not set 1696 | # CONFIG_DEBUG_FS is not set 1697 | CONFIG_HAVE_ARCH_KGDB=y 1698 | # CONFIG_KGDB is not set 1699 | CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y 1700 | # CONFIG_UBSAN is not set 1701 | CONFIG_HAVE_ARCH_KCSAN=y 1702 | # end of Generic Kernel Debugging Instruments 1703 | 1704 | # 1705 | # Networking Debugging 1706 | # 1707 | # CONFIG_NET_DEV_REFCNT_TRACKER is not set 1708 | # CONFIG_NET_NS_REFCNT_TRACKER is not set 1709 | # end of Networking Debugging 1710 | 1711 | # 1712 | # Memory Debugging 1713 | # 1714 | # CONFIG_PAGE_EXTENSION is not set 1715 | # CONFIG_DEBUG_PAGEALLOC is not set 1716 | # CONFIG_PAGE_OWNER is not set 1717 | # CONFIG_PAGE_TABLE_CHECK is not set 1718 | # CONFIG_PAGE_POISONING is not set 1719 | # CONFIG_DEBUG_RODATA_TEST is not set 1720 | CONFIG_ARCH_HAS_DEBUG_WX=y 1721 | # CONFIG_DEBUG_WX is not set 1722 | CONFIG_GENERIC_PTDUMP=y 1723 | # CONFIG_DEBUG_OBJECTS is not set 1724 | CONFIG_HAVE_DEBUG_KMEMLEAK=y 1725 | # CONFIG_DEBUG_KMEMLEAK is not set 1726 | # CONFIG_DEBUG_STACK_USAGE is not set 1727 | # CONFIG_SCHED_STACK_END_CHECK is not set 1728 | CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y 1729 | # CONFIG_DEBUG_VM is not set 1730 | # CONFIG_DEBUG_VM_PGTABLE is not set 1731 | CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y 1732 | # CONFIG_DEBUG_VIRTUAL is not set 1733 | # CONFIG_DEBUG_MEMORY_INIT is not set 1734 | CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y 1735 | # CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set 1736 | CONFIG_HAVE_ARCH_KASAN=y 1737 | CONFIG_HAVE_ARCH_KASAN_VMALLOC=y 1738 | CONFIG_CC_HAS_KASAN_GENERIC=y 1739 | CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y 1740 | CONFIG_HAVE_ARCH_KFENCE=y 1741 | # end of Memory Debugging 1742 | 1743 | # CONFIG_DEBUG_SHIRQ is not set 1744 | 1745 | # 1746 | # Debug Oops, Lockups and Hangs 1747 | # 1748 | # CONFIG_PANIC_ON_OOPS is not set 1749 | CONFIG_PANIC_ON_OOPS_VALUE=0 1750 | CONFIG_PANIC_TIMEOUT=0 1751 | # CONFIG_SOFTLOCKUP_DETECTOR is not set 1752 | CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y 1753 | # CONFIG_HARDLOCKUP_DETECTOR is not set 1754 | # CONFIG_DETECT_HUNG_TASK is not set 1755 | # CONFIG_WQ_WATCHDOG is not set 1756 | # end of Debug Oops, Lockups and Hangs 1757 | 1758 | # 1759 | # Scheduler Debugging 1760 | # 1761 | CONFIG_SCHED_DEBUG=y 1762 | # CONFIG_SCHEDSTATS is not set 1763 | # end of Scheduler Debugging 1764 | 1765 | # CONFIG_DEBUG_TIMEKEEPING is not set 1766 | 1767 | # 1768 | # Lock Debugging (spinlocks, mutexes, etc...) 1769 | # 1770 | CONFIG_LOCK_DEBUGGING_SUPPORT=y 1771 | # CONFIG_PROVE_LOCKING is not set 1772 | # CONFIG_LOCK_STAT is not set 1773 | # CONFIG_DEBUG_SPINLOCK is not set 1774 | # CONFIG_DEBUG_MUTEXES is not set 1775 | # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set 1776 | # CONFIG_DEBUG_RWSEMS is not set 1777 | # CONFIG_DEBUG_LOCK_ALLOC is not set 1778 | # CONFIG_DEBUG_ATOMIC_SLEEP is not set 1779 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set 1780 | # CONFIG_LOCK_TORTURE_TEST is not set 1781 | # CONFIG_WW_MUTEX_SELFTEST is not set 1782 | # CONFIG_SCF_TORTURE_TEST is not set 1783 | # CONFIG_CSD_LOCK_WAIT_DEBUG is not set 1784 | # end of Lock Debugging (spinlocks, mutexes, etc...) 1785 | 1786 | # CONFIG_DEBUG_IRQFLAGS is not set 1787 | # CONFIG_STACKTRACE is not set 1788 | # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set 1789 | # CONFIG_DEBUG_KOBJECT is not set 1790 | 1791 | # 1792 | # Debug kernel data structures 1793 | # 1794 | # CONFIG_DEBUG_LIST is not set 1795 | # CONFIG_DEBUG_PLIST is not set 1796 | # CONFIG_DEBUG_SG is not set 1797 | # CONFIG_DEBUG_NOTIFIERS is not set 1798 | # CONFIG_BUG_ON_DATA_CORRUPTION is not set 1799 | # end of Debug kernel data structures 1800 | 1801 | # CONFIG_DEBUG_CREDENTIALS is not set 1802 | 1803 | # 1804 | # RCU Debugging 1805 | # 1806 | # CONFIG_RCU_SCALE_TEST is not set 1807 | # CONFIG_RCU_TORTURE_TEST is not set 1808 | # CONFIG_RCU_REF_SCALE_TEST is not set 1809 | # CONFIG_RCU_TRACE is not set 1810 | # CONFIG_RCU_EQS_DEBUG is not set 1811 | # end of RCU Debugging 1812 | 1813 | # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set 1814 | # CONFIG_LATENCYTOP is not set 1815 | CONFIG_USER_STACKTRACE_SUPPORT=y 1816 | CONFIG_HAVE_RETHOOK=y 1817 | CONFIG_HAVE_FUNCTION_TRACER=y 1818 | CONFIG_HAVE_DYNAMIC_FTRACE=y 1819 | CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y 1820 | CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y 1821 | CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y 1822 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y 1823 | CONFIG_HAVE_SYSCALL_TRACEPOINTS=y 1824 | CONFIG_HAVE_FENTRY=y 1825 | CONFIG_HAVE_OBJTOOL_MCOUNT=y 1826 | CONFIG_HAVE_C_RECORDMCOUNT=y 1827 | CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y 1828 | CONFIG_TRACING_SUPPORT=y 1829 | # CONFIG_FTRACE is not set 1830 | # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set 1831 | # CONFIG_SAMPLES is not set 1832 | CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y 1833 | CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y 1834 | CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y 1835 | 1836 | # 1837 | # x86 Debugging 1838 | # 1839 | # CONFIG_X86_VERBOSE_BOOTUP is not set 1840 | # CONFIG_EARLY_PRINTK is not set 1841 | # CONFIG_DEBUG_TLBFLUSH is not set 1842 | CONFIG_HAVE_MMIOTRACE_SUPPORT=y 1843 | # CONFIG_X86_DECODER_SELFTEST is not set 1844 | CONFIG_IO_DELAY_0X80=y 1845 | # CONFIG_IO_DELAY_0XED is not set 1846 | # CONFIG_IO_DELAY_UDELAY is not set 1847 | # CONFIG_IO_DELAY_NONE is not set 1848 | # CONFIG_CPA_DEBUG is not set 1849 | # CONFIG_DEBUG_ENTRY is not set 1850 | # CONFIG_DEBUG_NMI_SELFTEST is not set 1851 | # CONFIG_X86_DEBUG_FPU is not set 1852 | # CONFIG_PUNIT_ATOM_DEBUG is not set 1853 | # CONFIG_UNWINDER_ORC is not set 1854 | # CONFIG_UNWINDER_FRAME_POINTER is not set 1855 | CONFIG_UNWINDER_GUESS=y 1856 | # end of x86 Debugging 1857 | 1858 | # 1859 | # Kernel Testing and Coverage 1860 | # 1861 | # CONFIG_KUNIT is not set 1862 | # CONFIG_NOTIFIER_ERROR_INJECTION is not set 1863 | # CONFIG_FAULT_INJECTION is not set 1864 | CONFIG_ARCH_HAS_KCOV=y 1865 | CONFIG_CC_HAS_SANCOV_TRACE_PC=y 1866 | # CONFIG_KCOV is not set 1867 | # CONFIG_RUNTIME_TESTING_MENU is not set 1868 | CONFIG_ARCH_USE_MEMTEST=y 1869 | # CONFIG_MEMTEST is not set 1870 | # end of Kernel Testing and Coverage 1871 | # end of Kernel hacking 1872 | --------------------------------------------------------------------------------