From bbe505d726f20d73eedafea24703cdd081f3b19f Mon Sep 17 00:00:00 2001 From: vadik likholetov Date: Mon, 8 Apr 2024 11:20:41 +0300 Subject: [PATCH] Create README.md and draft PR --- W/README.md | 1 + W/ivshmem-server/cmd | 5 + W/ivshmem-server/cmd.huge | 4 + W/ivshmem-server/cmd.no_mem | 5 + W/ivshmem-server/cmd.orig | 4 + W/ivshmem-server/cmd_jk | 4 + W/p2p/Makefile | 8 + W/p2p/Module.symvers | 0 W/p2p/modules.order | 1 + W/p2p/p2pnet.c | 103 ++ W/p2p/p2pnet.mod | 1 + W/p2p/p2pnet.mod.c | 51 + W/shmsockproxy/0001-ivshmem-driver.patch | 764 +++++++++++ W/shmsockproxy/LICENSE | 201 +++ W/shmsockproxy/README.md | 21 + W/shmsockproxy/app/Makefile | 11 + W/shmsockproxy/app/client.bash | 23 + W/shmsockproxy/app/memsocket.c | 793 +++++++++++ W/shmsockproxy/app/server.bash | 25 + W/shmsockproxy/app/test/Makefile | 9 + W/shmsockproxy/app/test/memtest.c | 223 +++ W/shmsockproxy/drivers/char/Kconfig | 426 ++++++ W/shmsockproxy/drivers/char/Makefile | 1 + .../drivers/char/ivshmem/.Module.symvers.cmd | 1 + .../drivers/char/ivshmem/.kvm_ivshmem.ko.cmd | 1 + .../drivers/char/ivshmem/.kvm_ivshmem.mod.cmd | 1 + .../char/ivshmem/.kvm_ivshmem.mod.o.cmd | 963 +++++++++++++ .../drivers/char/ivshmem/.kvm_ivshmem.o.cmd | 1191 +++++++++++++++++ .../drivers/char/ivshmem/.modules.order.cmd | 1 + W/shmsockproxy/drivers/char/ivshmem/Kconfig | 6 + W/shmsockproxy/drivers/char/ivshmem/Makefile | 9 + .../drivers/char/ivshmem/Module.symvers | 0 .../drivers/char/ivshmem/kvm_ivshmem.c | 667 +++++++++ .../drivers/char/ivshmem/kvm_ivshmem.h | 25 + .../drivers/char/ivshmem/kvm_ivshmem.ko | Bin 0 -> 24736 bytes .../drivers/char/ivshmem/kvm_ivshmem.mod | 1 + .../drivers/char/ivshmem/kvm_ivshmem.mod.c | 82 ++ .../drivers/char/ivshmem/kvm_ivshmem.mod.o | Bin 0 -> 6008 bytes .../drivers/char/ivshmem/kvm_ivshmem.o | Bin 0 -> 19488 bytes .../drivers/char/ivshmem/modules.order | 1 + .../generate_kernel_patch_for_drivers.sh | 18 + W/shmsockproxy/module/Makefile | 20 + W/tiny-vm-tools/host-build.py | 346 +++++ W/tiny-vm-tools/make-tiny-image.py | 263 ++++ W/tiny-vm-tools/run-vm-usb.sh | 3 + W/tiny-vm-tools/run-vm.sh | 3 + 46 files changed, 6286 insertions(+) create mode 100644 W/README.md create mode 100755 W/ivshmem-server/cmd create mode 100755 W/ivshmem-server/cmd.huge create mode 100755 W/ivshmem-server/cmd.no_mem create mode 100755 W/ivshmem-server/cmd.orig create mode 100755 W/ivshmem-server/cmd_jk create mode 100644 W/p2p/Makefile create mode 100644 W/p2p/Module.symvers create mode 100644 W/p2p/modules.order create mode 100644 W/p2p/p2pnet.c create mode 100644 W/p2p/p2pnet.mod create mode 100644 W/p2p/p2pnet.mod.c create mode 100644 W/shmsockproxy/0001-ivshmem-driver.patch create mode 100644 W/shmsockproxy/LICENSE create mode 100644 W/shmsockproxy/README.md create mode 100644 W/shmsockproxy/app/Makefile create mode 100755 W/shmsockproxy/app/client.bash create mode 100644 W/shmsockproxy/app/memsocket.c create mode 100755 W/shmsockproxy/app/server.bash create mode 100644 W/shmsockproxy/app/test/Makefile create mode 100644 W/shmsockproxy/app/test/memtest.c create mode 100644 W/shmsockproxy/drivers/char/Kconfig create mode 100644 W/shmsockproxy/drivers/char/Makefile create mode 100644 W/shmsockproxy/drivers/char/ivshmem/.Module.symvers.cmd create mode 100644 W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.ko.cmd create mode 100644 W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.mod.cmd create mode 100644 W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.mod.o.cmd create mode 100644 W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.o.cmd create mode 100644 W/shmsockproxy/drivers/char/ivshmem/.modules.order.cmd create mode 100644 W/shmsockproxy/drivers/char/ivshmem/Kconfig create mode 100644 W/shmsockproxy/drivers/char/ivshmem/Makefile create mode 100644 W/shmsockproxy/drivers/char/ivshmem/Module.symvers create mode 100644 W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.c create mode 100644 W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.h create mode 100644 W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.ko create mode 100644 W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod create mode 100644 W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.c create mode 100644 W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.o create mode 100644 W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.o create mode 100644 W/shmsockproxy/drivers/char/ivshmem/modules.order create mode 100755 W/shmsockproxy/generate_kernel_patch_for_drivers.sh create mode 100644 W/shmsockproxy/module/Makefile create mode 100755 W/tiny-vm-tools/host-build.py create mode 100755 W/tiny-vm-tools/make-tiny-image.py create mode 100755 W/tiny-vm-tools/run-vm-usb.sh create mode 100755 W/tiny-vm-tools/run-vm.sh diff --git a/W/README.md b/W/README.md new file mode 100644 index 000000000..b13bc946d --- /dev/null +++ b/W/README.md @@ -0,0 +1 @@ +Shared memory networking and sockets drivers WIP diff --git a/W/ivshmem-server/cmd b/W/ivshmem-server/cmd new file mode 100755 index 000000000..4e74f19fb --- /dev/null +++ b/W/ivshmem-server/cmd @@ -0,0 +1,5 @@ +sudo ./ivshmem-server -vF -n 10 -M shM -l 16M& +sleep 3 +sudo chmod a+rwx /tmp/ivsh* +sudo chmod a+rwx /dev/shm/* +sudo ./ivshmem-client -v diff --git a/W/ivshmem-server/cmd.huge b/W/ivshmem-server/cmd.huge new file mode 100755 index 000000000..66b0b7ee1 --- /dev/null +++ b/W/ivshmem-server/cmd.huge @@ -0,0 +1,4 @@ +sudo ./ivshmem-server -vF -n 10 -m /dev/hugepages -l 16M & +sleep 3 +sudo chmod a+rwx /tmp/ivsh* +sudo ./ivshmem-client -v diff --git a/W/ivshmem-server/cmd.no_mem b/W/ivshmem-server/cmd.no_mem new file mode 100755 index 000000000..223a9607f --- /dev/null +++ b/W/ivshmem-server/cmd.no_mem @@ -0,0 +1,5 @@ +sudo ./ivshmem-server -vF -n 10 & +sleep 3 +sudo chmod a+rwx /tmp/ivsh* +sudo chmod a+rwx /dev/shm/* +sudo ./ivshmem-client -v diff --git a/W/ivshmem-server/cmd.orig b/W/ivshmem-server/cmd.orig new file mode 100755 index 000000000..1a0c7bea9 --- /dev/null +++ b/W/ivshmem-server/cmd.orig @@ -0,0 +1,4 @@ +sudo ./ivshmem-server -vF -n 10 -m /dev/shm -l 16M& +sleep 3 +sudo chmod a+rwx /tmp/ivsh* +sudo ./ivshmem-client -v diff --git a/W/ivshmem-server/cmd_jk b/W/ivshmem-server/cmd_jk new file mode 100755 index 000000000..ff0fe504e --- /dev/null +++ b/W/ivshmem-server/cmd_jk @@ -0,0 +1,4 @@ +./ivshmem-server -vF -n 10 -M shM -l 16M& +sleep 3 +chmod a+rwx /tmp/ivsh* +./ivshmem-client -v diff --git a/W/p2p/Makefile b/W/p2p/Makefile new file mode 100644 index 000000000..8b6e1404e --- /dev/null +++ b/W/p2p/Makefile @@ -0,0 +1,8 @@ +obj-m += p2pnet.o + +all: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules + +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean + diff --git a/W/p2p/Module.symvers b/W/p2p/Module.symvers new file mode 100644 index 000000000..e69de29bb diff --git a/W/p2p/modules.order b/W/p2p/modules.order new file mode 100644 index 000000000..4cc3e6338 --- /dev/null +++ b/W/p2p/modules.order @@ -0,0 +1 @@ +/home/vadikas/W/p2p/p2pnet.o diff --git a/W/p2p/p2pnet.c b/W/p2p/p2pnet.c new file mode 100644 index 000000000..39eb27e47 --- /dev/null +++ b/W/p2p/p2pnet.c @@ -0,0 +1,103 @@ +#include +#include +#include // For alloc_etherdev and ethernet operations + +#define DRV_NAME "p2pnet" + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Your Name"); +MODULE_DESCRIPTION("A simple Linux network driver for P2P networking"); +MODULE_VERSION("0.1"); + +static struct net_device *p2p_net_dev; + +// Function prototypes +static int p2p_open(struct net_device *dev); +static int p2p_stop(struct net_device *dev); +static netdev_tx_t p2p_start_xmit(struct sk_buff *skb, struct net_device *dev); +static int p2p_config(struct net_device *dev, struct ifmap *map); +static void p2p_tx_timeout(struct net_device *dev, unsigned int i); + +// The net_device_ops structure +static const struct net_device_ops p2p_netdev_ops = { + .ndo_open = p2p_open, + .ndo_stop = p2p_stop, + .ndo_start_xmit = p2p_start_xmit, + .ndo_set_config = p2p_config, + .ndo_tx_timeout = p2p_tx_timeout, +}; + +// This function is called to open the device +static int p2p_open(struct net_device *dev) { + netif_start_queue(dev); + printk(KERN_INFO "%s: device opened\n", DRV_NAME); + return 0; // success +} + +// This function is called to stop the device +static int p2p_stop(struct net_device *dev) { + netif_stop_queue(dev); + printk(KERN_INFO "%s: device stopped\n", DRV_NAME); + return 0; // success +} + +// This function is called when a packet needs to be transmitted +static netdev_tx_t p2p_start_xmit(struct sk_buff *skb, struct net_device *dev) { + // Packet transmission code here + // For P2P, you might want to handle packet routing to the correct peer here + + dev_kfree_skb(skb); // Free the skb memory + return NETDEV_TX_OK; +} + +// This function is called to configure the device +static int p2p_config(struct net_device *dev, struct ifmap *map) { + printk(KERN_INFO "%s: device config \n", DRV_NAME); + if (dev->flags & IFF_UP) { + return -EBUSY; + } + // Config code here + return 0; +} + +// This function is called on transmission timeout +static void p2p_tx_timeout(struct net_device *dev,unsigned int i) { + printk(KERN_WARNING "%s: transmit timeout\n", DRV_NAME); + // Timeout handling code here +} + +// Module initialization function +static int __init p2p_init_module(void) { + // Allocate the net_device structure + p2p_net_dev = alloc_etherdev(0); + if (!p2p_net_dev) { + return -ENOMEM; + } + + // Set the interface name + strncpy(p2p_net_dev->name, "p2p%d", IFNAMSIZ); + + // Set the net_device_ops structure + p2p_net_dev->netdev_ops = &p2p_netdev_ops; + + // Register the network device + if (register_netdev(p2p_net_dev)) { + printk(KERN_ALERT "%s: error registering net device\n", DRV_NAME); + free_netdev(p2p_net_dev); + return -ENODEV; + } + + printk(KERN_INFO "%s: P2P network device registered\n", DRV_NAME); + return 0; +} + +// Module cleanup function +static void __exit p2p_cleanup_module(void) { + unregister_netdev(p2p_net_dev); + free_netdev(p2p_net_dev); + printk(KERN_INFO "%s: P2P network device unregistered\n", DRV_NAME); +} + +module_init(p2p_init_module); +module_exit(p2p_cleanup_module); + diff --git a/W/p2p/p2pnet.mod b/W/p2p/p2pnet.mod new file mode 100644 index 000000000..4cc3e6338 --- /dev/null +++ b/W/p2p/p2pnet.mod @@ -0,0 +1 @@ +/home/vadikas/W/p2p/p2pnet.o diff --git a/W/p2p/p2pnet.mod.c b/W/p2p/p2pnet.mod.c new file mode 100644 index 000000000..a0ffe73c5 --- /dev/null +++ b/W/p2p/p2pnet.mod.c @@ -0,0 +1,51 @@ +#include +#define INCLUDE_VERMAGIC +#include +#include +#include +#include +#include + +#ifdef CONFIG_UNWINDER_ORC +#include +ORC_HEADER; +#endif + +BUILD_SALT; +BUILD_LTO_INFO; + +MODULE_INFO(vermagic, VERMAGIC_STRING); +MODULE_INFO(name, KBUILD_MODNAME); + +__visible struct module __this_module +__section(".gnu.linkonce.this_module") = { + .name = KBUILD_MODNAME, + .init = init_module, +#ifdef CONFIG_MODULE_UNLOAD + .exit = cleanup_module, +#endif + .arch = MODULE_ARCH_INIT, +}; + +#ifdef CONFIG_RETPOLINE +MODULE_INFO(retpoline, "Y"); +#endif + + + +static const struct modversion_info ____versions[] +__used __section("__versions") = { + { 0x122c3a7e, "_printk" }, + { 0xa2c54569, "consume_skb" }, + { 0x4d0decbc, "alloc_etherdev_mqs" }, + { 0x7e722be1, "register_netdev" }, + { 0xf5617bc3, "free_netdev" }, + { 0xa08af381, "unregister_netdev" }, + { 0xa65c6def, "alt_cb_patch_nops" }, + { 0xb0bb5523, "module_layout" }, +}; + +MODULE_INFO(depends, ""); + + +MODULE_INFO(srcversion, "6520547521D5AAA3151D66E"); diff --git a/W/shmsockproxy/0001-ivshmem-driver.patch b/W/shmsockproxy/0001-ivshmem-driver.patch new file mode 100644 index 000000000..e3a99cd78 --- /dev/null +++ b/W/shmsockproxy/0001-ivshmem-driver.patch @@ -0,0 +1,764 @@ +From 32c280a2f43d48369a306ab83c556cdaa8e4297b Mon Sep 17 00:00:00 2001 +From: Jaroslaw Kurowski +Date: Tue, 27 Feb 2024 12:46:52 +0400 +Subject: ivshmem driver + +--- + drivers/char/Kconfig | 2 + + drivers/char/Makefile | 1 + + drivers/char/ivshmem/Kconfig | 6 + + drivers/char/ivshmem/Makefile | 1 + + drivers/char/ivshmem/kvm_ivshmem.c | 667 +++++++++++++++++++++++++++++ + drivers/char/ivshmem/kvm_ivshmem.h | 25 ++ + 6 files changed, 702 insertions(+) + create mode 100644 drivers/char/ivshmem/Kconfig + create mode 100644 drivers/char/ivshmem/Makefile + create mode 100644 drivers/char/ivshmem/kvm_ivshmem.c + create mode 100644 drivers/char/ivshmem/kvm_ivshmem.h + +diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig +index 801d6c83f..e93d4265a 100644 +--- a/drivers/char/Kconfig ++++ b/drivers/char/Kconfig +@@ -421,4 +421,6 @@ config ADI + and SSM (Silicon Secured Memory). Intended consumers of this + driver include crash and makedumpfile. + ++source "drivers/char/ivshmem/Kconfig" ++ + endmenu +diff --git a/drivers/char/Makefile b/drivers/char/Makefile +index c5f532e41..fc17a75f3 100644 +--- a/drivers/char/Makefile ++++ b/drivers/char/Makefile +@@ -44,3 +44,4 @@ obj-$(CONFIG_PS3_FLASH) += ps3flash.o + obj-$(CONFIG_XILLYBUS_CLASS) += xillybus/ + obj-$(CONFIG_POWERNV_OP_PANEL) += powernv-op-panel.o + obj-$(CONFIG_ADI) += adi.o ++obj-y += ivshmem/ +diff --git a/drivers/char/ivshmem/Kconfig b/drivers/char/ivshmem/Kconfig +new file mode 100644 +index 000000000..f0f75200c +--- /dev/null ++++ b/drivers/char/ivshmem/Kconfig +@@ -0,0 +1,6 @@ ++# Copyright 2022-2024 TII (SSRC) and the Ghaf contributors ++# SPDX-License-Identifier: Apache-2.0 ++ ++config KVM_IVSHMEM_VM_COUNT ++ int "Application VMs count" ++ default 5 +diff --git a/drivers/char/ivshmem/Makefile b/drivers/char/ivshmem/Makefile +new file mode 100644 +index 000000000..0a850b05e +--- /dev/null ++++ b/drivers/char/ivshmem/Makefile +@@ -0,0 +1 @@ ++obj-y += kvm_ivshmem.o +diff --git a/drivers/char/ivshmem/kvm_ivshmem.c b/drivers/char/ivshmem/kvm_ivshmem.c +new file mode 100644 +index 000000000..03bb5732b +--- /dev/null ++++ b/drivers/char/ivshmem/kvm_ivshmem.c +@@ -0,0 +1,667 @@ ++/* drivers/char/kvm_ivshmem.c - driver for KVM Inter-VM shared memory PCI device ++ ++* Copyright 2022-2024 TII (SSRC) and the Ghaf contributors ++* SPDX-License-Identifier: Apache-2.0 ++* ++* Copyright 2009 Cam Macdonell ++* ++* Based on cirrusfb.c and 8139cp.c: ++* Copyright 1999-2001 Jeff Garzik ++* Copyright 2001-2004 Jeff Garzik ++* ++*/ ++ ++#include "kvm_ivshmem.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#ifndef CONFIG_KVM_IVSHMEM_VM_COUNT ++#warning CONFIG_KVM_IVSHMEM_VM_COUNT not defined. Assuming 5. ++#define CONFIG_KVM_IVSHMEM_VM_COUNT (5) ++#endif ++ ++DEFINE_SPINLOCK(rawhide_irq_lock); ++#define VM_COUNT (CONFIG_KVM_IVSHMEM_VM_COUNT) ++#define VECTORS_COUNT (2 * VM_COUNT) ++ ++// #define DEBUG ++#ifdef DEBUG ++#define KVM_IVSHMEM_DPRINTK(fmt, ...) \ ++ do { \ ++ printk(KERN_INFO "KVM_IVSHMEM: " fmt "\n", ##__VA_ARGS__); \ ++ } while (0) ++#else ++#define KVM_IVSHMEM_DPRINTK(fmt, ...) \ ++ {} ++#endif ++ ++enum { ++ /* KVM Inter-VM shared memory device register offsets */ ++ IntrMask = 0x00, /* Interrupt Mask */ ++ IntrStatus = 0x04, /* Interrupt Status */ ++ IVPosition = 0x08, /* VM ID */ ++ Doorbell = 0x0c, /* Doorbell */ ++}; ++ ++typedef struct kvm_ivshmem_device { ++ void __iomem *regs; ++ ++ void *base_addr; ++ ++ unsigned int regaddr; ++ unsigned int reg_size; ++ ++ unsigned int ioaddr; ++ unsigned int ioaddr_size; ++ unsigned int irq; ++ ++ struct pci_dev *dev; ++ char (*msix_names)[256]; ++ struct msix_entry *msix_entries; ++ int nvectors; ++} kvm_ivshmem_device; ++ ++static int irq_incoming_data[VM_COUNT]; ++static int irq_ack[VM_COUNT]; ++static int local_resource_count[VM_COUNT]; ++static int peer_resource_count[VM_COUNT]; ++static wait_queue_head_t local_data_ready_wait_queue[VM_COUNT]; ++static wait_queue_head_t peer_data_ready_wait_queue[VM_COUNT]; ++ ++static kvm_ivshmem_device kvm_ivshmem_dev; ++ ++static long kvm_ivshmem_ioctl(struct file *, unsigned int, unsigned long); ++static int kvm_ivshmem_mmap(struct file *, struct vm_area_struct *); ++static int kvm_ivshmem_open(struct inode *, struct file *); ++static int kvm_ivshmem_release(struct inode *, struct file *); ++static ssize_t kvm_ivshmem_read(struct file *, char *, size_t, loff_t *); ++static ssize_t kvm_ivshmem_write(struct file *, const char *, size_t, loff_t *); ++static loff_t kvm_ivshmem_lseek(struct file *filp, loff_t offset, int origin); ++static unsigned kvm_ivshmem_poll(struct file *filp, ++ struct poll_table_struct *wait); ++static const struct file_operations kvm_ivshmem_ops = { ++ .owner = THIS_MODULE, ++ .open = kvm_ivshmem_open, ++ .mmap = kvm_ivshmem_mmap, ++ .read = kvm_ivshmem_read, ++ .unlocked_ioctl = kvm_ivshmem_ioctl, ++ .write = kvm_ivshmem_write, ++ .llseek = kvm_ivshmem_lseek, ++ .release = kvm_ivshmem_release, ++ .poll = kvm_ivshmem_poll, ++}; ++ ++static struct pci_device_id kvm_ivshmem_id_table[] = { ++ {0x1af4, 0x1110, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, ++ {0}, ++}; ++ ++static struct miscdevice kvm_ivshmem_misc_dev = { ++ .minor = MISC_DYNAMIC_MINOR, ++ .name = "ivshmem", ++ .fops = &kvm_ivshmem_ops, ++}; ++ ++// TODO: debug ++static int in_counter = 0, out_counter = 0; ++ ++MODULE_DEVICE_TABLE(pci, kvm_ivshmem_id_table); ++ ++static void kvm_ivshmem_remove_device(struct pci_dev *pdev); ++static int kvm_ivshmem_probe_device(struct pci_dev *pdev, ++ const struct pci_device_id *ent); ++ ++static struct pci_driver kvm_ivshmem_pci_driver = { ++ .name = "kvm-shmem", ++ .id_table = kvm_ivshmem_id_table, ++ .probe = kvm_ivshmem_probe_device, ++ .remove = kvm_ivshmem_remove_device, ++}; ++ ++static long kvm_ivshmem_ioctl(struct file *filp, unsigned int cmd, ++ unsigned long arg) { ++ ++ ++ int rv = 0; ++ unsigned long flags; ++ uint32_t msg; ++ struct ioctl_data ioctl_data; ++ ++ KVM_IVSHMEM_DPRINTK("%ld ioctl: cmd=0x%x args is 0x%lx", ++ (unsigned long int)filp->private_data, cmd, arg); ++ if ((unsigned long int)filp->private_data >= VM_COUNT && ++ cmd != SHMEM_IOCSETINSTANCENO) { ++ printk(KERN_ERR "KVM_IVSHMEM: ioctl: invalid instance id %ld > VM_COUNT=%d", ++ (unsigned long int)filp->private_data, VM_COUNT); ++ return -EINVAL; ++ } ++ switch (cmd) { ++ case SHMEM_IOCIVPOSN: ++ msg = readl(kvm_ivshmem_dev.regs + IVPosition); ++ KVM_IVSHMEM_DPRINTK("%ld my vmid is 0x%08x", ++ (unsigned long int)filp->private_data, msg); ++ rv = copy_to_user((void __user *)arg, &msg, sizeof(msg)); ++ break; ++ ++ case SHMEM_IOCDORBELL: ++ unsigned int vec; ++ ++ if (copy_from_user(&ioctl_data, (void __user *)arg, sizeof(ioctl_data))) { ++ printk(KERN_ERR ++ "KVM_IVSHMEM: SHMEM_IOCDORBELL: %ld invalid argument 0x%lx", ++ (unsigned long int)filp->private_data, arg); ++ rv = -EINVAL; ++ break; ++ } ++ ++ vec = ioctl_data.int_no & 0xffff; ++#ifdef DEBUG_IOCTL ++ KVM_IVSHMEM_DPRINTK("%ld ioctl cmd=%d fd=%d len=%d int_no=0x%x", ++ (unsigned long int)filp->private_data, ioctl_data.cmd, ++ ioctl_data.fd, ioctl_data.len, ioctl_data.int_no); ++#endif ++ KVM_IVSHMEM_DPRINTK("%ld ringing doorbell id=0x%x on vector 0x%x", ++ (unsigned long int)filp->private_data, ++ (ioctl_data.int_no >> 16), vec); ++ spin_lock_irqsave(&rawhide_irq_lock, flags); ++ if (vec & LOCAL_RESOURCE_READY_INT_VEC) { ++ local_resource_count[(unsigned long int)filp->private_data] = 0; ++ } else { ++ peer_resource_count[(unsigned long int)filp->private_data] = 0; ++ } ++ spin_unlock_irqrestore(&rawhide_irq_lock, flags); ++ writel(ioctl_data.int_no, kvm_ivshmem_dev.regs + Doorbell); ++ break; ++ ++ case SHMEM_IOCSET: ++ spin_lock_irqsave(&rawhide_irq_lock, flags); ++ if ((arg >> 8) == LOCAL_RESOURCE_READY_INT_VEC) ++ local_resource_count[(unsigned long int)filp->private_data] = arg & 0xff; ++ else if ((arg >> 8) == PEER_RESOURCE_CONSUMED_INT_VEC) ++ peer_resource_count[(unsigned long int)filp->private_data] = arg & 0xff; ++ else { ++ rv = -EINVAL; ++ printk(KERN_ERR "KVM_IVSHMEM: SHMEM_IOCSET: invalid arg %ld", arg); ++ } ++ spin_unlock_irqrestore(&rawhide_irq_lock, flags); ++ break; ++ ++ case SHMEM_IOCSETINSTANCENO: ++ spin_lock_irqsave(&rawhide_irq_lock, flags); ++ if (arg >= VM_COUNT) { ++ printk(KERN_ERR "KVM_IVSHMEM: ioctl: invalid instance id %ld", arg); ++ rv = -EINVAL; ++ goto unlock; ++ } ++ filp->private_data = (void *)arg; ++ printk(KERN_INFO ++ "KVM_IVSHMEM: SHMEM_IOCSETINSTANCENO: set instance id 0x%lx", ++ arg); ++ ++ init_waitqueue_head(&local_data_ready_wait_queue[arg]); ++ init_waitqueue_head(&peer_data_ready_wait_queue[arg]); ++ local_resource_count[arg] = 1; ++ peer_resource_count[arg] = 0; ++ unlock: ++ spin_unlock_irqrestore(&rawhide_irq_lock, flags); ++ break; ++ ++ case SHMEM_IOCNOP: ++ unsigned int tmp; ++ ++ if (copy_from_user(&tmp, (void __user *)arg, sizeof(tmp))) { ++ printk(KERN_ERR "KVM_IVSHMEM: SHMEM_IOCWLOCAL: %ld invalid argument", ++ (unsigned long int)filp->private_data); ++ } ++ KVM_IVSHMEM_DPRINTK( ++ "%ld %x local %d counter=%d: peer:%d counter=%d", ++ (unsigned long int)filp->private_data, tmp, ++ local_resource_count[(unsigned long int)filp->private_data], in_counter, ++ peer_resource_count[(unsigned long int)filp->private_data], ++ out_counter); ++ ++ tmp = ((unsigned)out_counter) << 16 | (unsigned)(in_counter & 0xffff); ++ rv = copy_to_user((void __user *)arg, &tmp, sizeof(tmp)); ++ break; ++ ++ default: ++ KVM_IVSHMEM_DPRINTK("%ld bad ioctl (0x%08x)", ++ (unsigned long int)filp->private_data, cmd); ++ return -EINVAL; ++ } ++ ++ return rv; ++} ++ ++static unsigned kvm_ivshmem_poll(struct file *filp, ++ struct poll_table_struct *wait) { ++ __poll_t mask = 0; ++ __poll_t req_events = poll_requested_events(wait); ++ ++ if (req_events & EPOLLIN) { ++ poll_wait( ++ filp, ++ &peer_data_ready_wait_queue[(unsigned long int)filp->private_data], ++ wait); ++ ++ if (peer_resource_count[(unsigned long int)filp->private_data]) { ++ KVM_IVSHMEM_DPRINTK( ++ "%ld poll: in: peer_resource_count=%d", ++ (unsigned long int)filp->private_data, ++ peer_resource_count[(unsigned long int)filp->private_data]); ++ mask |= (POLLIN | POLLRDNORM); ++ } ++ } ++ ++ if (req_events & EPOLLOUT) { ++ poll_wait( ++ filp, ++ &local_data_ready_wait_queue[(unsigned long int)filp->private_data], ++ wait); ++ ++ if (local_resource_count[(unsigned long int)filp->private_data]) { ++ KVM_IVSHMEM_DPRINTK( ++ "%ld poll: out: local_resource_count=%d", ++ (unsigned long int)filp->private_data, ++ local_resource_count[(unsigned long int)filp->private_data]); ++ ++ mask |= (POLLOUT | POLLWRNORM); ++ } ++ } ++ ++#ifdef DEBUG ++ if (!mask) { ++ printk(KERN_ERR "KVM_IVSHMEM: poll: timeout: query for events 0x%x", ++ req_events); ++ } ++#endif ++ return mask; ++} ++ ++static ssize_t kvm_ivshmem_read(struct file *filp, char *buffer, size_t len, ++ loff_t *poffset) { ++ ++ int bytes_read = 0; ++ unsigned long offset; ++ ++ offset = *poffset; ++ ++ if (!kvm_ivshmem_dev.base_addr) { ++ printk(KERN_ERR "KVM_IVSHMEM: cannot read from ioaddr (NULL)"); ++ return 0; ++ } ++ ++ if (len > kvm_ivshmem_dev.ioaddr_size - offset) { ++ len = kvm_ivshmem_dev.ioaddr_size - offset; ++ } ++ ++ if (len == 0) ++ return 0; ++ ++ bytes_read = copy_to_user(buffer, kvm_ivshmem_dev.base_addr + offset, len); ++ if (bytes_read > 0) { ++ return -EFAULT; ++ } ++ ++ *poffset += len; ++ return len; ++} ++ ++static loff_t kvm_ivshmem_lseek(struct file *filp, loff_t offset, int origin) { ++ ++ loff_t retval = -1; ++ ++ switch (origin) { ++ case SEEK_CUR: ++ offset += filp->f_pos; ++ __attribute__((__fallthrough__)); ++ case SEEK_SET: ++ retval = offset; ++ if (offset > kvm_ivshmem_dev.ioaddr_size) { ++ offset = kvm_ivshmem_dev.ioaddr_size; ++ } ++ filp->f_pos = offset; ++ break; ++ case SEEK_END: ++ retval = kvm_ivshmem_dev.ioaddr_size; ++ filp->f_pos = kvm_ivshmem_dev.ioaddr_size; ++ } ++ ++ return retval; ++} ++ ++static ssize_t kvm_ivshmem_write(struct file *filp, const char *buffer, ++ size_t len, loff_t *poffset) { ++ ++ int bytes_written = 0; ++ unsigned long offset; ++ ++ offset = *poffset; ++ ++ KVM_IVSHMEM_DPRINTK("%ld KVM_IVSHMEM: trying to write", ++ (unsigned long int)filp->private_data); ++ if (!kvm_ivshmem_dev.base_addr) { ++ printk(KERN_ERR "KVM_IVSHMEM: %ld cannot write to ioaddr (NULL)", ++ (unsigned long int)filp->private_data); ++ return 0; ++ } ++ ++ if (len > kvm_ivshmem_dev.ioaddr_size - offset) { ++ len = kvm_ivshmem_dev.ioaddr_size - offset; ++ } ++ ++ KVM_IVSHMEM_DPRINTK("%ld KVM_IVSHMEM: len is %u", ++ (unsigned long int)filp->private_data, (unsigned)len); ++ if (len == 0) ++ return 0; ++ ++ bytes_written = ++ copy_from_user(kvm_ivshmem_dev.base_addr + offset, buffer, len); ++ if (bytes_written > 0) { ++ return -EFAULT; ++ } ++ ++ KVM_IVSHMEM_DPRINTK("%ld KVM_IVSHMEM: wrote %u bytes at offset %lu", ++ (unsigned long int)filp->private_data, (unsigned)len, ++ offset); ++ *poffset += len; ++ return len; ++} ++ ++static irqreturn_t kvm_ivshmem_interrupt(int irq, void *dev_instance) { ++ struct kvm_ivshmem_device *dev = dev_instance; ++ int i; ++ ++ if (unlikely(dev == NULL)) { ++ KVM_IVSHMEM_DPRINTK("return IRQ_NONE"); ++ return IRQ_NONE; ++ } ++ ++ KVM_IVSHMEM_DPRINTK("irq %d", irq); ++ for (i = 0; i < VM_COUNT; i++) { ++ if (irq == irq_incoming_data[i]) { ++ out_counter++; ++ KVM_IVSHMEM_DPRINTK("%d wake up peer_data_ready_wait_queue count=%d", i, ++ out_counter); ++ if (peer_resource_count[i]) { ++ KVM_IVSHMEM_DPRINTK("%d WARNING: peer_resource_count>0!: %d", i, ++ peer_resource_count[i]); ++ } ++ spin_lock(&rawhide_irq_lock); ++ peer_resource_count[i] = 1; ++ smp_mb(); ++ spin_unlock(&rawhide_irq_lock); ++ wake_up_interruptible(&peer_data_ready_wait_queue[i]); ++ return IRQ_HANDLED; ++ } ++ if (irq == irq_ack[i]) { ++ in_counter++; ++ KVM_IVSHMEM_DPRINTK("%d wake up local_data_ready_wait_queue count=%d", i, ++ in_counter); ++ if (local_resource_count[i]) { ++ KVM_IVSHMEM_DPRINTK("%d WARNING: local_resource_count>0!: %d", i, ++ local_resource_count[i]); ++ } ++ spin_lock(&rawhide_irq_lock); ++ local_resource_count[i] = 1; ++ smp_mb(); ++ spin_unlock(&rawhide_irq_lock); ++ wake_up_interruptible(&local_data_ready_wait_queue[i]); ++ return IRQ_HANDLED; ++ } ++ } ++ ++ printk(KERN_ERR "KVM_IVSHMEM: irq %d not handled", irq); ++ return IRQ_NONE; ++} ++ ++static int request_msix_vectors(struct kvm_ivshmem_device *ivs_info, ++ int nvectors) { ++ int i, n, err; ++ const char *name = "ivshmem"; ++ ++ KVM_IVSHMEM_DPRINTK("KVM_IVSHMEM: devname is %s", name); ++ ivs_info->nvectors = nvectors; ++ ++ ivs_info->msix_entries = ++ kmalloc(nvectors * sizeof *ivs_info->msix_entries, GFP_KERNEL); ++ ivs_info->msix_names = ++ kmalloc(nvectors * sizeof *ivs_info->msix_names, GFP_KERNEL); ++ ++ for (i = 0; i < nvectors; i++) ++ ivs_info->msix_entries[i].entry = i; ++ ++ n = pci_alloc_irq_vectors(ivs_info->dev, nvectors, nvectors, PCI_IRQ_MSIX); ++ if (n < 0) { ++ printk(KERN_ERR "KVM_IVSHMEM: pci_alloc_irq_vectors i=%d: error %d", i, n); ++ return n; ++ } ++ ++ for (i = 0; i < nvectors; i++) { ++ ++ snprintf(ivs_info->msix_names[i], sizeof *ivs_info->msix_names, "%s-config", ++ name); ++ ++ n = pci_irq_vector(ivs_info->dev, i); ++ err = request_irq(n, kvm_ivshmem_interrupt, IRQF_SHARED, ++ ivs_info->msix_names[i], ivs_info); ++ ++ if (err) { ++ printk(KERN_ERR "KVM_IVSHMEM: couldn't allocate irq for msi-x entry %d " ++ "with vector %d", ++ i, n); ++ return -ENOSPC; ++ } else { ++ printk(KERN_INFO "KVM_IVSHMEM: allocated irq #%d", n); ++ } ++ // vector 1 is used for data sending ++ if (i & LOCAL_RESOURCE_READY_INT_VEC) { ++ irq_incoming_data[i >> 1] = n; ++ KVM_IVSHMEM_DPRINTK("Using interrupt #%d for incoming data for vm %d", n, ++ i >> 1); ++ // vector 0 is used for for sending acknowledgments ++ } else { ++ irq_ack[i >> 1] = n; ++ KVM_IVSHMEM_DPRINTK("Using interrupt #%d for ACKs for vm %d", n, i >> 1); ++ } ++ } ++ ++ pci_set_master(ivs_info->dev); ++ return 0; ++} ++ ++static int kvm_ivshmem_probe_device(struct pci_dev *pdev, ++ const struct pci_device_id *ent) { ++ ++ int result; ++ ++ KVM_IVSHMEM_DPRINTK("Probing for KVM_IVSHMEM Device"); ++ ++ result = pci_enable_device(pdev); ++ if (result) { ++ printk(KERN_ERR "KVM_IVSHMEM: Cannot probe KVM_IVSHMEM device %s: error %d", ++ pci_name(pdev), result); ++ return result; ++ } ++ ++ result = pci_request_regions(pdev, "kvm_ivshmem"); ++ if (result < 0) { ++ printk(KERN_ERR "KVM_IVSHMEM: cannot request regions"); ++ goto pci_disable; ++ } else ++ printk(KERN_ERR "KVM_IVSHMEM: pci_request_regions(): result is %d", result); ++ ++ kvm_ivshmem_dev.ioaddr = pci_resource_start(pdev, 2); ++ kvm_ivshmem_dev.ioaddr_size = pci_resource_len(pdev, 2); ++ ++ kvm_ivshmem_dev.base_addr = pci_iomap(pdev, 2, 0); ++ printk(KERN_INFO "KVM_IVSHMEM: iomap base = 0x%p", kvm_ivshmem_dev.base_addr); ++ ++ if (!kvm_ivshmem_dev.base_addr) { ++ printk(KERN_ERR "KVM_IVSHMEM: cannot iomap region of size %d", ++ kvm_ivshmem_dev.ioaddr_size); ++ goto pci_release; ++ } ++ ++ printk(KERN_INFO "KVM_IVSHMEM: ioaddr = 0x%x ioaddr_size = 0x%x", ++ kvm_ivshmem_dev.ioaddr, kvm_ivshmem_dev.ioaddr_size); ++ ++ /* Clear the the shared memory*/ ++ memset_io(kvm_ivshmem_dev.base_addr, kvm_ivshmem_dev.ioaddr_size, 0); ++ ++ kvm_ivshmem_dev.regaddr = pci_resource_start(pdev, 0); ++ kvm_ivshmem_dev.reg_size = pci_resource_len(pdev, 0); ++ kvm_ivshmem_dev.regs = pci_iomap(pdev, 0, 0x100); ++ ++ kvm_ivshmem_dev.dev = pdev; ++ ++ if (!kvm_ivshmem_dev.regs) { ++ printk(KERN_ERR "KVM_IVSHMEM: cannot ioremap registers of size %d", ++ kvm_ivshmem_dev.reg_size); ++ goto reg_release; ++ } ++ ++ if (request_msix_vectors(&kvm_ivshmem_dev, VECTORS_COUNT) != 0) { ++ printk(KERN_ERR ++ "KVM_IVSHMEM: Check ivshmem and qemu configured interrupts number"); ++ goto reg_release; ++ } else { ++ printk(KERN_INFO "KVM_IVSHMEM: MSI-X enabled"); ++ } ++ ++ /* set all masks to on */ ++ writel(0xffffffff, kvm_ivshmem_dev.regs + IntrMask); ++ ++ return 0; ++ ++reg_release: ++ pci_iounmap(pdev, kvm_ivshmem_dev.base_addr); ++pci_release: ++ pci_release_regions(pdev); ++pci_disable: ++ pci_disable_device(pdev); ++ return -EBUSY; ++} ++ ++static void kvm_ivshmem_remove_device(struct pci_dev *pdev) { ++ int i, n; ++ ++ printk(KERN_INFO "KVM_IVSHMEM: Unregister kvm_ivshmem device."); ++ for (i = 0; i < VECTORS_COUNT; i++) { ++ n = pci_irq_vector(pdev, i); ++ KVM_IVSHMEM_DPRINTK("Freeing irq# %d", n); ++ disable_irq(n); ++ free_irq(n, &kvm_ivshmem_dev); ++ } ++ pci_free_irq_vectors(pdev); ++ pci_iounmap(pdev, kvm_ivshmem_dev.regs); ++ pci_iounmap(pdev, kvm_ivshmem_dev.base_addr); ++ pci_release_regions(pdev); ++ pci_disable_device(pdev); ++} ++ ++static void __exit kvm_ivshmem_cleanup_module(void) { ++ pci_unregister_driver(&kvm_ivshmem_pci_driver); ++ misc_deregister(&kvm_ivshmem_misc_dev); ++} ++ ++static int __init kvm_ivshmem_init_module(void) { ++ ++ int err = -ENOMEM, i; ++ ++ /* Register device node ops. */ ++ err = misc_register(&kvm_ivshmem_misc_dev); ++ if (err < 0) { ++ printk(KERN_ERR "KVM_IVSHMEM: Unable to register kvm_ivshmem_misc device"); ++ return err; ++ } ++ KVM_IVSHMEM_DPRINTK("Registered the /dev/%s device ", ++ kvm_ivshmem_misc_dev.name); ++ ++ err = pci_register_driver(&kvm_ivshmem_pci_driver); ++ if (err < 0) { ++ goto error; ++ } ++ ++ for (i = 0; i < VM_COUNT; i++) { ++ init_waitqueue_head(&local_data_ready_wait_queue[i]); ++ init_waitqueue_head(&peer_data_ready_wait_queue[i]); ++ local_resource_count[i] = 1; ++ peer_resource_count[i] = 0; ++ } ++ return 0; ++ ++error: ++ misc_deregister(&kvm_ivshmem_misc_dev); ++ return err; ++} ++ ++static int kvm_ivshmem_open(struct inode *inode, struct file *filp) { ++ printk(KERN_INFO "KVM_IVSHMEM: Opening kvm_ivshmem device"); ++ filp->private_data = (void *)(unsigned long)-1; ++ return 0; ++} ++ ++static int kvm_ivshmem_release(struct inode *inode, struct file *filp) { ++ return 0; ++} ++ ++static int kvm_ivshmem_mmap(struct file *filp, struct vm_area_struct *vma) { ++ ++ unsigned long len; ++ unsigned long off; ++ unsigned long start; ++ ++ off = vma->vm_pgoff << PAGE_SHIFT; ++ start = kvm_ivshmem_dev.ioaddr; ++ ++ len = PAGE_ALIGN((start & ~PAGE_MASK) + kvm_ivshmem_dev.ioaddr_size); ++ start &= PAGE_MASK; ++ ++ printk(KERN_INFO ++ "KVM_IVSHMEM: mmap: vma->vm_start=0x%lx vma->vm_end=0x%lx off=0x%lx", ++ vma->vm_start, vma->vm_end, off); ++ printk( ++ KERN_INFO ++ "KVM_IVSHMEM: mmap: vma->vm_end - vma->vm_start + off=0x%lx > len=0x%lx", ++ (vma->vm_end - vma->vm_start + off), len); ++ ++ if ((vma->vm_end - vma->vm_start + off) > len) ++ return -EINVAL; ++ ++ off += start; ++ vma->vm_pgoff = off >> PAGE_SHIFT; ++ #if LINUX_VERSION_CODE >= KERNEL_VERSION(6,3,0) ++ vm_flags_mod(vma, VM_SHARED, 0); ++ #else ++ vma->vm_flags |= VM_SHARED; ++ #endif ++ ++ if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT, ++ vma->vm_end - vma->vm_start, vma->vm_page_prot)) { ++ KVM_IVSHMEM_DPRINTK("%ld mmap failed", ++ (unsigned long int)filp->private_data); ++ return -ENXIO; ++ } ++ ++ return 0; ++} ++ ++module_init(kvm_ivshmem_init_module); ++module_exit(kvm_ivshmem_cleanup_module); ++ ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Cam Macdonell "); ++MODULE_DESCRIPTION("KVM inter-VM shared memory module"); ++MODULE_VERSION("1.0"); +diff --git a/drivers/char/ivshmem/kvm_ivshmem.h b/drivers/char/ivshmem/kvm_ivshmem.h +new file mode 100644 +index 000000000..aacd7f73e +--- /dev/null ++++ b/drivers/char/ivshmem/kvm_ivshmem.h +@@ -0,0 +1,25 @@ ++/* Copyright 2022-2023 TII (SSRC) and the Ghaf contributors ++ SPDX-License-Identifier: Apache-2.0 ++*/ ++ ++#define PEER_RESOURCE_CONSUMED_INT_VEC (0) ++#define LOCAL_RESOURCE_READY_INT_VEC (1) ++ ++#define SHMEM_IOC_MAGIC 's' ++ ++#define SHMEM_IOCWLOCAL _IOR(SHMEM_IOC_MAGIC, 1, int) ++#define SHMEM_IOCWPEER _IOR(SHMEM_IOC_MAGIC, 2, int) ++#define SHMEM_IOCIVPOSN _IOW(SHMEM_IOC_MAGIC, 3, int) ++#define SHMEM_IOCSETINSTANCENO _IOR(SHMEM_IOC_MAGIC, 4, int) ++#define SHMEM_IOCSET _IOR(SHMEM_IOC_MAGIC, 5, int) ++#define SHMEM_IOCDORBELL _IOR(SHMEM_IOC_MAGIC, 6, int) ++#define SHMEM_IOCNOP _IOR(SHMEM_IOC_MAGIC, 7, int) ++ ++// #define DEBUG_IOCTL ++struct ioctl_data { ++ int peer_vm_id; ++ unsigned int int_no; ++ int fd; ++ int cmd; ++ int len; ++}; +-- +2.43.2 + diff --git a/W/shmsockproxy/LICENSE b/W/shmsockproxy/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/W/shmsockproxy/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/W/shmsockproxy/README.md b/W/shmsockproxy/README.md new file mode 100644 index 000000000..c7a156c5e --- /dev/null +++ b/W/shmsockproxy/README.md @@ -0,0 +1,21 @@ +# About +TII SSRC Secure Technologies: Shared Memory Socket Forwarder +The Shared Memory Sockets Proxy (shmsockproxy) is a communication mechanism between guest virtual machines. + +This tool forwards socket connections between two guest VMs to enable Waypipe communication. + +It listens for incoming connections on one VM's socket, creates a connection to the other VM's socket, and forwards +data in both directions. +On the server (application) VM side, it creates a socket that Waypipe connects to. All data coming from/to the Waypipe socket +is forwarded to/from the client VM side using a shared memory mechanism. +On the client (display) VM side, the shmsockproxy connects to Waypipe's existing socket and forwards data to/from the +connected server (application) VM side. + +The tool consists of: +- A shared memory kernel driver (ivshmem.c), which creates the /dev/ivshmem device and handles typical I/O functions (open, + close, ioctl, mmap, read, write). +- A socket forwarding application. + +# Building + +# Usage diff --git a/W/shmsockproxy/app/Makefile b/W/shmsockproxy/app/Makefile new file mode 100644 index 000000000..a248c228c --- /dev/null +++ b/W/shmsockproxy/app/Makefile @@ -0,0 +1,11 @@ +# Copyright 2022-2023 TII (SSRC) and the Ghaf contributors +# SPDX-License-Identifier: Apache-2.0 + +CPPFLAGS = -Wformat-extra-args -Wformat-overflow -Wformat + +memsocket: memsocket.c + +memsocket.c: ../drivers/char/ivshmem/kvm_ivshmem.h + +clean: + -rm memsocket diff --git a/W/shmsockproxy/app/client.bash b/W/shmsockproxy/app/client.bash new file mode 100755 index 000000000..3cc35169b --- /dev/null +++ b/W/shmsockproxy/app/client.bash @@ -0,0 +1,23 @@ +#!/bin/sh + +SOCKET=./client.sock +DEVICE=/dev/ivshmem +MODDIR=~ghaf/shmsockproxy/module + +kill $(ps | grep memsocket | awk '{print $1}') +sudo rmmod kvm_ivshmem + +if test -e $SOCKET; then + echo "Removing $SOCKET" + rm "$SOCKET" +fi + +sudo rmmod kvm_ivshmem +if test ! -e "$DEVICE"; then +echo "Loading shared memory module" +sudo rmmod kvm_ivshmem ; sudo insmod $MODDIR/kvm_ivshmem.ko; sudo chmod a+rwx /dev/ivshmem +fi + +./memsocket -c "$SOCKET" & +echo "Starting waypipe" +waypipe -s "$SOCKET" client diff --git a/W/shmsockproxy/app/memsocket.c b/W/shmsockproxy/app/memsocket.c new file mode 100644 index 000000000..2dac01a8d --- /dev/null +++ b/W/shmsockproxy/app/memsocket.c @@ -0,0 +1,793 @@ +/* Copyright 2022-2024 TII (SSRC) and the Ghaf contributors + SPDX-License-Identifier: Apache-2.0 +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../drivers/char/ivshmem/kvm_ivshmem.h" + +#ifndef VM_COUNT +#define VM_COUNT (5) +#endif + +#define SHM_DEVICE_FN "/dev/ivshmem" + +#define MAX_EVENTS (1024) +#define MAX_CLIENTS (10) +#define BUFFER_SIZE (1024000) +#define SHMEM_POLL_TIMEOUT (3000) +#define SHMEM_BUFFER_SIZE (1024000) +#define UNKNOWN_PEER (-1) +#define CLOSE_FD (1) +#define IGNORE_ERROR (1) +#define PAGE_SIZE (32) + +#define DBG(fmt, ...) \ + { \ + char tmp1[512], tmp2[256]; \ + sprintf(tmp2, fmt, __VA_ARGS__); \ + sprintf(tmp1, "[%d] %s:%d: %s\n", instance_no, __FUNCTION__, __LINE__, \ + tmp2); \ + errno = 0; \ + report(tmp1, 0); \ + } + +#ifndef DEBUG_ON +#define DEBUG(fmt, ...) \ + {} +#else +#define DEBUG DBG +#endif + +#ifndef DEBUG_ON +#define INFO(fmt, ...) \ + {} +#else +#define INFO(fmt, ...) \ + { \ + char tmp1[512], tmp2[256]; \ + sprintf(tmp2, fmt, __VA_ARGS__); \ + sprintf(tmp1, "[%d] [%s:%d] %s\n", instance_no, __FUNCTION__, __LINE__, \ + tmp2); \ + errno = 0; \ + report(tmp1, 0); \ + } +#endif + +#define ERROR0(msg) \ + { \ + char tmp[512]; \ + sprintf(tmp, "[%d] [%s:%d] %s\n", instance_no, __FUNCTION__, __LINE__, \ + msg); \ + report(tmp, 0); \ + } + +#define ERROR(fmt, ...) \ + { \ + char tmp1[512], tmp2[256]; \ + sprintf(tmp2, fmt, __VA_ARGS__); \ + sprintf(tmp1, "[%d] [%s:%d] %s\n", instance_no, __FUNCTION__, __LINE__, \ + tmp2); \ + report(tmp1, 0); \ + } + +#define FATAL(msg) \ + { \ + char tmp1[512], tmp2[256]; \ + sprintf(tmp2, msg); \ + sprintf(tmp1, "[%d] [%s:%d]: %s\n", instance_no, __FUNCTION__, __LINE__, \ + tmp2); \ + report(tmp1, 1); \ + } + +enum { CMD_LOGIN, CMD_CONNECT, CMD_DATA, CMD_CLOSE, CMD_DATA_CLOSE }; +#define FD_MAP_COUNT (sizeof(fd_map) / sizeof(fd_map[0])) +struct { + int my_fd; + int remote_fd; +} fd_map[VM_COUNT][MAX_CLIENTS]; + +typedef struct { + volatile int server_vmid; + volatile int cmd; + volatile int fd; + volatile int len; + volatile unsigned char data[SHMEM_BUFFER_SIZE]; +} vm_data; + +int epollfd_full[VM_COUNT], epollfd_limited[VM_COUNT]; +char *socket_path; +int server_socket = -1, shmem_fd[VM_COUNT]; +volatile int *my_vmid = NULL; +vm_data *my_shm_data[VM_COUNT], *peer_shm_data[VM_COUNT]; +int run_as_server = 0; +int local_rr_int_no[VM_COUNT], remote_rc_int_no[VM_COUNT]; +pthread_t server_threads[VM_COUNT]; +struct { + volatile int client_vmid; + vm_data client_data[VM_COUNT]; + vm_data server_data[VM_COUNT]; +} *vm_control; + +static const char usage_string[] = "Usage: memsocket [-c|-s] socket_path " + "{instance number (server mode only)}\n"; + +void report(const char *msg, int terminate) { + + if (errno) + perror(msg); + else + fprintf(stderr, "%s", msg); + + if (terminate) + exit(-1); +} + +int get_shmem_size(int instance_no) { + + int res; + + res = lseek(shmem_fd[instance_no], 0, SEEK_END); + if (res < 0) { + FATAL("seek"); + } + lseek(shmem_fd[instance_no], 0, SEEK_SET); + return res; +} + +void fd_map_clear(int instance_no) { + + int i; + + for (i = 0; i < MAX_CLIENTS; i++) { + fd_map[instance_no][i].my_fd = -1; + fd_map[instance_no][i].remote_fd = -1; + } +} + +void server_init(int instance_no) { + + struct sockaddr_un socket_name; + struct epoll_event ev; + + /* Remove socket file if exists */ + if (access(socket_path, F_OK) == 0) { + remove(socket_path); + } + + server_socket = socket(AF_UNIX, SOCK_STREAM, 0); + if (server_socket < 0) { + FATAL("server socket"); + } + + DEBUG("server socket: %d", server_socket); + + memset(&socket_name, 0, sizeof(socket_name)); + socket_name.sun_family = AF_UNIX; + strncpy(socket_name.sun_path, socket_path, sizeof(socket_name.sun_path) - 1); + if (bind(server_socket, (struct sockaddr *)&socket_name, + sizeof(socket_name)) < 0) { + FATAL("bind"); + } + + if (listen(server_socket, MAX_EVENTS) < 0) + FATAL("listen"); + + ev.events = EPOLLIN; + ev.data.fd = server_socket; + if (epoll_ctl(epollfd_full[instance_no], EPOLL_CTL_ADD, server_socket, &ev) == + -1) { + FATAL("server_init: epoll_ctl: server_socket"); + } + + INFO("server initialized", ""); +} + +int wayland_connect(int instance_no) { + + struct sockaddr_un socket_name; + struct epoll_event ev; + int wayland_fd; + + wayland_fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (wayland_fd < 0) { + FATAL("wayland socket"); + } + + DEBUG("wayland socket: %d", wayland_fd); + + memset(&socket_name, 0, sizeof(socket_name)); + socket_name.sun_family = AF_UNIX; + strncpy(socket_name.sun_path, socket_path, sizeof(socket_name.sun_path) - 1); + if (connect(wayland_fd, (struct sockaddr *)&socket_name, + sizeof(socket_name)) < 0) { + FATAL("connect"); + } + + ev.events = EPOLLIN; + ev.data.fd = wayland_fd; + if (epoll_ctl(epollfd_full[instance_no], EPOLL_CTL_ADD, wayland_fd, &ev) == + -1) { + FATAL("epoll_ctl: wayland_fd"); + } + + INFO("client initialized", ""); + return wayland_fd; +} + +void make_wayland_connection(int instance_no, int peer_fd) { + + int i; + + for (i = 0; i < MAX_CLIENTS; i++) { + if (fd_map[instance_no][i].my_fd == -1) { + fd_map[instance_no][i].my_fd = wayland_connect(instance_no); + fd_map[instance_no][i].remote_fd = peer_fd; + return; + } + } + ERROR("FAILED fd#%d", peer_fd); + FATAL("fd_map table full"); +} + +int map_peer_fd(int instance_no, int peer_fd, int close_fd) { + + int i, rv; + + for (i = 0; i < MAX_CLIENTS; i++) { + if (fd_map[instance_no][i].remote_fd == peer_fd) { + rv = fd_map[instance_no][i].my_fd; + if (close_fd) + fd_map[instance_no][i].my_fd = -1; + return rv; + } + } + ERROR("FAILED on mapping remote fd#%d", peer_fd); + return -1; +} + +int get_remote_socket(int instance_no, int my_fd, int close_fd, + int ignore_error) { + + int i; + + for (i = 0; i < MAX_CLIENTS; i++) { + if (fd_map[instance_no][i].my_fd == my_fd) { + if (close_fd) + fd_map[instance_no][i].my_fd = -1; + return fd_map[instance_no][i].remote_fd; + } + } + if (ignore_error) + return -1; + + FATAL("my fd not found"); + return -1; +} + +void shmem_init(int instance_no) { + + int res = -1, vm_id; + struct epoll_event ev; + long int shmem_size; + + /* Open shared memory */ + shmem_fd[instance_no] = open(SHM_DEVICE_FN, O_RDWR); + if (shmem_fd[instance_no] < 0) { + FATAL("Open " SHM_DEVICE_FN); + } + INFO("shared memory fd: %d", shmem_fd[instance_no]); + /* Store instance number inside driver */ + ioctl(shmem_fd[instance_no], SHMEM_IOCSETINSTANCENO, instance_no); + + /* Get shared memory */ + shmem_size = get_shmem_size(instance_no); + if (shmem_size <= 0) { + FATAL("No shared memory detected"); + } + if (shmem_size < sizeof(*vm_control)) { + ERROR("Shared memory too small: %ld bytes allocated whereas %ld needed", + shmem_size, sizeof(*vm_control)); + FATAL("Exiting"); + } + vm_control = mmap(NULL, shmem_size, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_NORESERVE, shmem_fd[instance_no], 0); + if (!vm_control) { + FATAL("Got NULL pointer from mmap"); + } + DEBUG("Shared memory at address %p 0x%lx bytes", vm_control, shmem_size); + + if (run_as_server) { + my_shm_data[instance_no] = &vm_control->server_data[instance_no]; + peer_shm_data[instance_no] = &vm_control->client_data[instance_no]; + } else { + my_shm_data[instance_no] = &vm_control->client_data[instance_no]; + peer_shm_data[instance_no] = &vm_control->server_data[instance_no]; + } + + /* get my VM Id */ + res = ioctl(shmem_fd[instance_no], SHMEM_IOCIVPOSN, &vm_id); + if (res < 0) { + FATAL("ioctl SHMEM_IOCIVPOSN failed"); + } + vm_id = vm_id << 16; + if (run_as_server) { + my_vmid = &vm_control->server_data[instance_no].server_vmid; + } else { + my_vmid = &vm_control->client_vmid; + vm_control->server_data[instance_no].server_vmid = UNKNOWN_PEER; + } + *my_vmid = vm_id; + INFO("My VM id = 0x%x. Running as a ", *my_vmid); + if (run_as_server) { + INFO("server", ""); + } else { + INFO("client", ""); + } + + ev.events = EPOLLIN | EPOLLOUT; + ev.data.fd = shmem_fd[instance_no]; + if (epoll_ctl(epollfd_full[instance_no], EPOLL_CTL_ADD, shmem_fd[instance_no], + &ev) == -1) { + FATAL("epoll_ctl: -1"); + } + ev.events = EPOLLIN | EPOLLOUT; + ev.data.fd = shmem_fd[instance_no]; + if (epoll_ctl(epollfd_limited[instance_no], EPOLL_CTL_ADD, + shmem_fd[instance_no], &ev) == -1) { + FATAL("epoll_ctl: -1"); + } + /* Set output buffer it's available */ + ioctl(shmem_fd[instance_no], SHMEM_IOCSET, + (LOCAL_RESOURCE_READY_INT_VEC << 8) + 1); + + INFO("shared memory initialized", ""); +} + +void thread_init(int instance_no) { + + int res; + struct ioctl_data ioctl_data; + + fd_map_clear(instance_no); + + epollfd_full[instance_no] = epoll_create1(0); + if (epollfd_full[instance_no] == -1) { + FATAL("server_init: epoll_create1"); + } + epollfd_limited[instance_no] = epoll_create1(0); + if (epollfd_limited[instance_no] == -1) { + FATAL("server_init: epoll_create1"); + } + + shmem_init(instance_no); + + if (run_as_server) { + /* Create socket that waypipe can write to + * Add the socket fd to the epollfd_full + */ + server_init(instance_no); + local_rr_int_no[instance_no] = vm_control->client_vmid | + (instance_no << 1) | + LOCAL_RESOURCE_READY_INT_VEC; + remote_rc_int_no[instance_no] = vm_control->client_vmid | + (instance_no << 1) | + PEER_RESOURCE_CONSUMED_INT_VEC; + /* + * Send LOGIN cmd to the client. Supply my_vmid + */ + my_shm_data[instance_no]->cmd = CMD_LOGIN; + my_shm_data[instance_no]->fd = *my_vmid; + my_shm_data[instance_no]->len = 0; + + ioctl_data.int_no = local_rr_int_no[instance_no]; + +#ifdef DEBUG_IOCTL + ioctl_data.cmd = my_shm_data[instance_no]->cmd; + ioctl_data.fd = my_shm_data[instance_no]->fd; + ioctl_data.len = my_shm_data[instance_no]->len; +#endif + + res = ioctl(shmem_fd[instance_no], SHMEM_IOCDORBELL, &ioctl_data); + DEBUG("Client #%d: sent login vmid: 0x%x ioctl result=%d client vm_id=0x%x", + instance_no, *my_vmid, res, vm_control->client_vmid); + } +} + +void close_peer_vm(int instance_no) { + int i; + + for (i = 0; i < MAX_CLIENTS; i++) { + if (fd_map[instance_no][i].my_fd != -1) + close(fd_map[instance_no][i].my_fd); + } + fd_map_clear(instance_no); +} + +int wait_shmem_ready(int instance_no, struct pollfd *my_buffer_fds) { + int rv; + + rv = poll(my_buffer_fds, 1, SHMEM_POLL_TIMEOUT); + if (rv < 0) { + ERROR("poll failed fd=%d poll=%d", my_buffer_fds->fd, rv); + return -1; + } + + if (rv == 0 || (my_buffer_fds->revents & ~POLLOUT)) { + ERROR("unexpected event or timeout on shmem_fd %d: poll=%d fd=%d " + "revents=0x%x " + "events=0x%x", + shmem_fd[instance_no], rv, my_buffer_fds->fd, my_buffer_fds->revents, + my_buffer_fds->events); + return 0; + } + + return rv; +} + +int cksum(unsigned char *buf, int len) { + int i, res = 0; + for (i = 0; i < len; i++) + res += buf[i]; + return res; +} + +void *run(void *arg) { + + int instance_no = (intptr_t)arg; + int conn_fd, rv, nfds, n, read_count; + struct sockaddr_un caddr; /* client address */ + socklen_t len = sizeof(caddr); /* address length could change */ + struct pollfd my_buffer_fds = {.events = POLLOUT}; + struct epoll_event ev, *current_event; + struct epoll_event events[MAX_EVENTS]; + struct ioctl_data ioctl_data; + unsigned int tmp, data_chunk; + int epollfd; + vm_data *peer_shm, *my_shm; + + thread_init(instance_no); + peer_shm = peer_shm_data[instance_no]; + my_shm = my_shm_data[instance_no]; + my_buffer_fds.fd = shmem_fd[instance_no]; + epollfd = epollfd_full[instance_no]; + + while (1) { +#ifdef DEBUG_ON + if (epollfd == epollfd_full[instance_no]) { + DEBUG("Waiting for all events", ""); + } else { + DEBUG("Waiting for ACK", ""); + } +#endif + nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1); + if (nfds == -1) { + FATAL("epoll_wait"); + } + + for (n = 0; n < nfds; n++) { + current_event = &events[n]; +#ifdef DEBUG_ON + ioctl(my_buffer_fds.fd, SHMEM_IOCNOP, &tmp); + DBG("Event index=%d 0x%x on fd %d inout=%d-%d", n, current_event->events, + current_event->data.fd, tmp & 0xffff, tmp >> 16); +#endif + if (current_event->events & EPOLLOUT && + current_event->data.fd == my_buffer_fds.fd) { + DEBUG("Remote ACK", ""); + /* Set the local buffer is consumed and ready for use */ + ioctl(my_buffer_fds.fd, SHMEM_IOCSET, + (LOCAL_RESOURCE_READY_INT_VEC << 8) + 0); + epollfd = epollfd_full[instance_no]; + } + + /* Handle the new connection on the socket */ + if (current_event->events & EPOLLIN) { + if (run_as_server && current_event->data.fd == server_socket) { + conn_fd = accept(server_socket, (struct sockaddr *)&caddr, &len); + if (conn_fd == -1) { + FATAL("accept"); + } + ev.events = EPOLLIN | EPOLLET | EPOLLHUP; + ev.data.fd = conn_fd; + if (epoll_ctl(epollfd_full[instance_no], EPOLL_CTL_ADD, conn_fd, + &ev) == -1) { + FATAL("epoll_ctl: conn_fd"); + } + /* Send the connect request to the wayland peer */ + my_shm->cmd = CMD_CONNECT; + my_shm->fd = conn_fd; + my_shm->len = 0; + ioctl_data.int_no = local_rr_int_no[instance_no]; +#ifdef DEBUG_IOCTL + ioctl_data.cmd = my_shm->cmd; + ioctl_data.fd = my_shm->fd; + ioctl_data.len = my_shm->len; +#endif + epollfd = epollfd_limited[instance_no]; + ioctl(my_buffer_fds.fd, SHMEM_IOCDORBELL, &ioctl_data); + DEBUG("Executed ioctl to add the client on fd %d", conn_fd); + } + + /* Both sides: Received data from the peer via shared memory - EPOLLIN + */ + else if (current_event->data.fd == my_buffer_fds.fd) { + DEBUG( + "shmem_fd=%d event: 0x%x cmd: 0x%x remote fd: %d remote len: %d", + my_buffer_fds.fd, current_event->events, + peer_shm->cmd, peer_shm->fd, + peer_shm->len); + + switch (peer_shm->cmd) { + case CMD_LOGIN: + DEBUG("Received login request from 0x%x", + peer_shm->fd); + /* If the peer VM starts again, close all opened file handles */ + close_peer_vm(instance_no); + + local_rr_int_no[instance_no] = peer_shm->fd | + (instance_no << 1) | + LOCAL_RESOURCE_READY_INT_VEC; + remote_rc_int_no[instance_no] = peer_shm->fd | + (instance_no << 1) | + PEER_RESOURCE_CONSUMED_INT_VEC; + + peer_shm->fd = -1; + break; + case CMD_DATA: + case CMD_DATA_CLOSE: + conn_fd = run_as_server + ? peer_shm->fd + : map_peer_fd(instance_no, + peer_shm->fd, 0); + DEBUG("shmem: received %d bytes for %d cksum=0x%x", + peer_shm->len, conn_fd, + cksum((unsigned char *)peer_shm->data, + peer_shm->len)); + for (tmp = 0; tmp < peer_shm->len; tmp += PAGE_SIZE) { + + data_chunk = ((peer_shm->len - tmp) / PAGE_SIZE) ? PAGE_SIZE:peer_shm->len - tmp; + + rv = send(conn_fd, (void *)&peer_shm->data[tmp], + data_chunk, 0); + if (rv != data_chunk) { + ERROR("Sent %d out of %d bytes on fd#%d", rv, + data_chunk, conn_fd); + } + } + DEBUG("Received data has been sent", ""); + + if (peer_shm->cmd == CMD_DATA) { + break; + } + /* no break if we need to the the fd */ + case CMD_CLOSE: + if (run_as_server) { + conn_fd = peer_shm->fd; + DEBUG("Closing %d", conn_fd); + } else { + conn_fd = + map_peer_fd(instance_no, peer_shm->fd, 1); + DEBUG("Closing %d peer fd=%d", conn_fd, + peer_shm->fd); + } + if (conn_fd > 0) { + if (epoll_ctl(epollfd_full[instance_no], EPOLL_CTL_DEL, conn_fd, + NULL) == -1) { + ERROR0("epoll_ctl: EPOLL_CTL_DEL"); + } + close(conn_fd); + } + break; + case CMD_CONNECT: + make_wayland_connection(instance_no, + peer_shm->fd); + break; + default: + ERROR("Invalid CMD 0x%x from peer!", + peer_shm->cmd); + break; + } /* switch peer_shm->cmd */ + + /* Signal the other side that its buffer has been processed */ + DEBUG("Exec ioctl REMOTE_RESOURCE_CONSUMED_INT_VEC", ""); + peer_shm->cmd = -1; + + ioctl_data.int_no = remote_rc_int_no[instance_no]; +#ifdef DEBUG_IOCTL + ioctl_data.cmd = -1; + ioctl_data.fd = 0; + ioctl_data.len = 0; +#endif + ioctl(my_buffer_fds.fd, SHMEM_IOCDORBELL, &ioctl_data); + } /* End of "data arrived from the peer via shared memory" */ + + /* Received data from Wayland or from waypipe. It needs to + be sent to the peer */ + else { + if (!run_as_server) { + conn_fd = get_remote_socket(instance_no, current_event->data.fd, 0, + IGNORE_ERROR); + DEBUG("get_remote_socket: %d", conn_fd); + } else { + conn_fd = current_event->data.fd; + } + DEBUG("Reading from wayland/waypipe socket", ""); + read_count = + read(current_event->data.fd, (void *)my_shm->data, + sizeof(my_shm->data)); + + if (read_count <= 0) { + if (read_count < 0) + ERROR("read from wayland/waypipe socket failed fd=%d", + current_event->data.fd); + /* Release output buffer */ + ioctl(my_buffer_fds.fd, SHMEM_IOCSET, + (LOCAL_RESOURCE_READY_INT_VEC << 8) + 1); + + } else { /* read_count > 0 */ + DEBUG("Read & sent %d bytes on fd#%d sent to %d checksum=0x%x", + read_count, current_event->data.fd, conn_fd, + cksum((unsigned char *)my_shm->data, + read_count)); + + if (current_event->events & EPOLLHUP) { + my_shm->cmd = CMD_DATA_CLOSE; + current_event->events &= ~EPOLLHUP; + + /* unmap local fd */ + if (!run_as_server) + get_remote_socket(instance_no, current_event->data.fd, CLOSE_FD, + IGNORE_ERROR); + /* close local fd*/ + close(current_event->data.fd); + } else + my_shm->cmd = CMD_DATA; + + my_shm->fd = conn_fd; + my_shm->len = read_count; + + ioctl_data.int_no = local_rr_int_no[instance_no]; +#ifdef DEBUG_IOCTL + ioctl_data.cmd = my_shm->cmd; + ioctl_data.fd = my_shm->fd; + ioctl_data.len = my_shm->len; +#endif + DEBUG("Exec ioctl DATA/DATA_CLOSE cmd=%d fd=%d len=%d", + my_shm->cmd, my_shm->fd, + my_shm->len); + epollfd = epollfd_limited[instance_no]; + ioctl(my_buffer_fds.fd, SHMEM_IOCDORBELL, &ioctl_data); + break; + } + } /* received data from Wayland/waypipe server */ + } /* current_event->events & EPOLLIN */ + + /* Handling connection close */ + if (current_event->events & (EPOLLHUP | EPOLLERR)) { + DEBUG("Closing fd#%d", current_event->data.fd); + my_shm->cmd = CMD_CLOSE; + if (run_as_server) + my_shm->fd = current_event->data.fd; + else { + DEBUG("get_remote_socket: %d", + get_remote_socket(instance_no, current_event->data.fd, 0, + IGNORE_ERROR)); + my_shm->fd = get_remote_socket( + instance_no, current_event->data.fd, CLOSE_FD, IGNORE_ERROR); + } + if (my_shm->fd > 0) { + DEBUG("ioctl ending close request for %d", + my_shm->fd); + + ioctl_data.int_no = local_rr_int_no[instance_no]; +#ifdef DEBUG_IOCTL + ioctl_data.cmd = my_shm->cmd; + ioctl_data.fd = my_shm->fd; + ioctl_data.len = my_shm->len; +#endif + /* Output buffer is busy. Accept only the interrupts + that don't use it */ + epollfd = epollfd_limited[instance_no]; + ioctl(my_buffer_fds.fd, SHMEM_IOCDORBELL, &ioctl_data); + + } else { /* unlock output buffer */ + ERROR("Attempt to close invalid fd %d", current_event->data.fd); + ioctl(my_buffer_fds.fd, SHMEM_IOCSET, + (LOCAL_RESOURCE_READY_INT_VEC << 8) + 1); + } + if (epoll_ctl(epollfd_full[instance_no], EPOLL_CTL_DEL, + current_event->data.fd, NULL) == -1) { + ERROR("epoll_ctl: EPOLL_CTL_DEL on fd %d", current_event->data.fd); + } + close(current_event->data.fd); + /* If the buffer is busy, don't proceed any further events */ + if (epollfd == epollfd_limited[instance_no]) + break; + } /* Handling connection close */ + } + } /* while(1) */ + return 0; +} + +void print_usage_and_exit() { + fprintf(stderr, usage_string); + exit(1); +} + +int main(int argc, char **argv) { + + int i, res = -1; + int instance_no = 0; + pthread_t threads[VM_COUNT]; + + if (argc <= 2) + goto wrong_args; + if (strcmp(argv[1], "-c") == 0) { + run_as_server = 0; + } else if (strcmp(argv[1], "-s") == 0) { + run_as_server = 1; + } else + goto wrong_args; + + if ((run_as_server && argc != 4) || (!run_as_server && argc != 3)) + goto wrong_args; + + socket_path = argv[2]; + if (!strlen(socket_path)) + goto wrong_args; + + if (run_as_server) { + if (strlen(argv[3])) { + instance_no = atoi(argv[3]); + } else { + goto wrong_args; + } + } + for (i = 0; i < VM_COUNT; i++) { + my_shm_data[i] = NULL; + peer_shm_data[i] = NULL; + shmem_fd[i] = -1; + } + + /* On client site start thread for each display VM */ + if (run_as_server == 0) { + for (i = 0; i < VM_COUNT; i++) { + res = pthread_create(&threads[i], NULL, run, (void *)(intptr_t)i); + if (res) { + ERROR("Thread id=%d", i); + FATAL("Cannot create a thread"); + } + } + + for (i = 0; i < VM_COUNT; i++) { + res = pthread_join(threads[i], NULL); + if (res) { + ERROR("error %d waiting for the thread #%d", res, i); + } + } + } else { /* server mode - run only one instance */ + run((void *)(intptr_t)instance_no); + } + + return 0; +wrong_args: + print_usage_and_exit(); + return 1; +} diff --git a/W/shmsockproxy/app/server.bash b/W/shmsockproxy/app/server.bash new file mode 100755 index 000000000..1b43fffeb --- /dev/null +++ b/W/shmsockproxy/app/server.bash @@ -0,0 +1,25 @@ +#!/bin/sh + +SOCKET=./server.sock +DEVICE=/dev/ivshmem +MODDIR=~ghaf/shmsockproxy/module + +kill $(ps | grep memsocket | awk '{print $1}') +sudo rmmod kvm_ivshmem + +if test -e "$SOCKET"; then + echo "Removing $SOCKET" + rm "$SOCKET" +fi + +sudo rmmod kvm_ivshmem + +if test ! -e "$DEVICE"; then +echo "Loading shared memory module" +sudo rmmod kvm_ivshmem ; sudo insmod $MODDIR/kvm_ivshmem.ko; sudo chmod a+rwx /dev/ivshmem +fi + +./memsocket -s "$SOCKET" 2 & +sleep 3 +echo "Executing 'waypipe -d -s $SOCKET server -- firefox'" +waypipe -s "$SOCKET" server -- firefox diff --git a/W/shmsockproxy/app/test/Makefile b/W/shmsockproxy/app/test/Makefile new file mode 100644 index 000000000..01e7076d5 --- /dev/null +++ b/W/shmsockproxy/app/test/Makefile @@ -0,0 +1,9 @@ +# Copyright 2022-2023 TII (SSRC) and the Ghaf contributors +# SPDX-License-Identifier: Apache-2.0 + +CPPFLAGS = -Wformat-extra-args -Wformat-overflow -Wformat + +memtest: memtest.c + +clean: + -rm memtest diff --git a/W/shmsockproxy/app/test/memtest.c b/W/shmsockproxy/app/test/memtest.c new file mode 100644 index 000000000..b45604a87 --- /dev/null +++ b/W/shmsockproxy/app/test/memtest.c @@ -0,0 +1,223 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define LISTEN_BACKLOG 50 +#define BUFFER_SIZE (10240) +#define handle_error(msg) \ + do { \ + perror(msg); \ + exit(EXIT_FAILURE); \ + } while (0) +#define CRC8_RESIDUE (0xea) + +static unsigned char const crc8_table[] = { + 0xea, 0xd4, 0x96, 0xa8, 0x12, 0x2c, 0x6e, 0x50, 0x7f, 0x41, 0x03, 0x3d, + 0x87, 0xb9, 0xfb, 0xc5, 0xa5, 0x9b, 0xd9, 0xe7, 0x5d, 0x63, 0x21, 0x1f, + 0x30, 0x0e, 0x4c, 0x72, 0xc8, 0xf6, 0xb4, 0x8a, 0x74, 0x4a, 0x08, 0x36, + 0x8c, 0xb2, 0xf0, 0xce, 0xe1, 0xdf, 0x9d, 0xa3, 0x19, 0x27, 0x65, 0x5b, + 0x3b, 0x05, 0x47, 0x79, 0xc3, 0xfd, 0xbf, 0x81, 0xae, 0x90, 0xd2, 0xec, + 0x56, 0x68, 0x2a, 0x14, 0xb3, 0x8d, 0xcf, 0xf1, 0x4b, 0x75, 0x37, 0x09, + 0x26, 0x18, 0x5a, 0x64, 0xde, 0xe0, 0xa2, 0x9c, 0xfc, 0xc2, 0x80, 0xbe, + 0x04, 0x3a, 0x78, 0x46, 0x69, 0x57, 0x15, 0x2b, 0x91, 0xaf, 0xed, 0xd3, + 0x2d, 0x13, 0x51, 0x6f, 0xd5, 0xeb, 0xa9, 0x97, 0xb8, 0x86, 0xc4, 0xfa, + 0x40, 0x7e, 0x3c, 0x02, 0x62, 0x5c, 0x1e, 0x20, 0x9a, 0xa4, 0xe6, 0xd8, + 0xf7, 0xc9, 0x8b, 0xb5, 0x0f, 0x31, 0x73, 0x4d, 0x58, 0x66, 0x24, 0x1a, + 0xa0, 0x9e, 0xdc, 0xe2, 0xcd, 0xf3, 0xb1, 0x8f, 0x35, 0x0b, 0x49, 0x77, + 0x17, 0x29, 0x6b, 0x55, 0xef, 0xd1, 0x93, 0xad, 0x82, 0xbc, 0xfe, 0xc0, + 0x7a, 0x44, 0x06, 0x38, 0xc6, 0xf8, 0xba, 0x84, 0x3e, 0x00, 0x42, 0x7c, + 0x53, 0x6d, 0x2f, 0x11, 0xab, 0x95, 0xd7, 0xe9, 0x89, 0xb7, 0xf5, 0xcb, + 0x71, 0x4f, 0x0d, 0x33, 0x1c, 0x22, 0x60, 0x5e, 0xe4, 0xda, 0x98, 0xa6, + 0x01, 0x3f, 0x7d, 0x43, 0xf9, 0xc7, 0x85, 0xbb, 0x94, 0xaa, 0xe8, 0xd6, + 0x6c, 0x52, 0x10, 0x2e, 0x4e, 0x70, 0x32, 0x0c, 0xb6, 0x88, 0xca, 0xf4, + 0xdb, 0xe5, 0xa7, 0x99, 0x23, 0x1d, 0x5f, 0x61, 0x9f, 0xa1, 0xe3, 0xdd, + 0x67, 0x59, 0x1b, 0x25, 0x0a, 0x34, 0x76, 0x48, 0xf2, 0xcc, 0x8e, 0xb0, + 0xd0, 0xee, 0xac, 0x92, 0x28, 0x16, 0x54, 0x6a, 0x45, 0x7b, 0x39, 0x07, + 0xbd, 0x83, 0xc1, 0xff}; + +unsigned crc8(unsigned crc, unsigned char const *data, size_t len) { + if (data == NULL) + return 0; + crc &= 0xff; + unsigned char const *end = data + len; + while (data < end) + crc = crc8_table[crc ^ *data++]; + return crc; +} + +void time_report(struct tms *start, struct tms *end, clock_t c_start, clock_t c_end, long int sent_bytes) +{ + double time_elapsed = c_end - c_start; + double real_time = (double)(c_end - c_start) / sysconf(_SC_CLK_TCK); + double bytes_per_sec = (double) sent_bytes / real_time; + double u_time = (double)(end->tms_utime - start->tms_utime) / sysconf(_SC_CLK_TCK); + double s_time = (double)(end->tms_stime - start->tms_stime) / sysconf(_SC_CLK_TCK); + + printf("Sent/received %ld bytes %.0f Mbytes/sec\n", sent_bytes, bytes_per_sec/1024/1024); + printf("real %.3fs\nuser %.3fs\nsys %.3fs\n", real_time, u_time, s_time); +} + +void receive_file(char *socket_path) { + + int sfd, cfd; + socklen_t peer_addr_size; + struct sockaddr_un my_addr, peer_addr; + unsigned char buff[BUFFER_SIZE]; + int res, rv, read_count; + unsigned int crc; + struct tms time_start, time_end; + clock_t r_time_start, r_time_end; + + sfd = socket(AF_UNIX, SOCK_STREAM, 0); + if (sfd == -1) + handle_error("socket"); + + memset(&my_addr, 0, sizeof(my_addr)); + my_addr.sun_family = AF_UNIX; + strncpy(my_addr.sun_path, socket_path, sizeof(my_addr.sun_path) - 1); + + unlink(socket_path); + if (bind(sfd, (struct sockaddr *)&my_addr, sizeof(my_addr)) == -1) + handle_error("bind"); + printf("Waiting for a connection.\n"); + while (1) { + if (listen(sfd, LISTEN_BACKLOG) == -1) + handle_error("listen"); + + /* Now we can accept incoming connections one + at a time using accept(2). */ + + peer_addr_size = sizeof(peer_addr); + cfd = accept(sfd, (struct sockaddr *)&peer_addr, &peer_addr_size); + + if (cfd == -1) + handle_error("accept"); + printf("Connected...\n"); + read_count = 0; + crc = 0; + r_time_start = times(&time_start); + while (1) { + rv = read(cfd, buff, sizeof(buff)); + if (rv < 0) + handle_error("read"); + if (rv == 0) + break; + read_count += rv; + crc = crc8(crc, buff, rv); + }; + r_time_end = times(&time_end); + time_report(&time_start, &time_end, r_time_start, r_time_end, read_count+1); + printf("Read %d bytes.", read_count); + if (crc == CRC8_RESIDUE) + printf(" CRC OK\n"); + else + printf(" BAD CRC!\n"); + if (close(cfd) == -1) + handle_error("close"); + } +} + +void send_file(char *socket_path, char *input_file, int size, int error) { + int in_fd, out_fd; + struct sockaddr_un socket_name; + long int sent_bytes = 0, rv, wv; + unsigned char buff[BUFFER_SIZE]; + unsigned crc; + struct tms time_start, time_end; + clock_t r_time_start, r_time_end; + + out_fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (out_fd < 0) { + handle_error("socket"); + } + + memset(&socket_name, 0, sizeof(socket_name)); + socket_name.sun_family = AF_UNIX; + strncpy(socket_name.sun_path, socket_path, sizeof(socket_name.sun_path) - 1); + if (connect(out_fd, (struct sockaddr *)&socket_name, sizeof(socket_name)) < + 0) { + handle_error("connect"); + } + + in_fd = open(input_file, O_RDONLY); + if (in_fd <= 0) { + handle_error("open in"); + } + + crc = 0; + r_time_start = times(&time_start); + while(1) { + rv = read(in_fd, buff, sizeof(buff)); + if (rv < 0) + handle_error("read"); + if (!rv) + break; + wv = write(out_fd, buff, rv); + if (wv <= 0) + handle_error("write"); + + crc = crc8(crc, buff, rv); + sent_bytes += rv; + if(size && sent_bytes >=size) + break; + }; + buff[0] = crc & 0xff; + if (error) + buff[0]--; + wv = write(out_fd, buff, 1); + + r_time_end = times(&time_end); + time_report(&time_start, &time_end, r_time_start, r_time_end, sent_bytes+1); + if (wv <= 0) + handle_error("write"); +} + +void usage(char *cmd) { + printf("Usage: %s socket_path for receiving.\n%s socket_path input_file [size CRC_error]" + " for sending.\nBefore using stop the memsocket service: 'systemctl stop --user memsocket.service'.\n" + "For receiving run e.g.: 'memsocket -c ./test.sock &; %s ./test.sock'.\n" + "To send a file run on other VM: 'memsocket -s ./test.sock 3 &; %s ./test.sock /dev/random 10M.'\n" + "To force wrong CRC on sending: '%s ./test.sock /dev/random 10M xxx\n'" + , + cmd, cmd, cmd, cmd, cmd); + exit(0); +} + +int main(int argc, char **argv) { + + long int size = 0; + int m = 1; + char c; + char socket_path[100], file_path[100]; + + if (argc < 2) { + usage(argv[0]); + } + strcpy(socket_path, argv[1]); + if (argc == 2) { + receive_file(socket_path); + } else { + strcpy(file_path, argv[2]); + if (argc >= 4) { + c = toupper(argv[3][strlen(argv[3]) - 1]); + if (c == 'K') + m = 1024; + else if (c == 'M') + m = 1024 * 1024; + else if (c == 'G') + m = 1024 * 1024 * 1024; + size = m * atoi(argv[3]); + // printf("size=%ld\n", size); + } + + // printf(">>%d\n", __LINE__); + send_file(socket_path, file_path, size, argc ==5 ); + } +} diff --git a/W/shmsockproxy/drivers/char/Kconfig b/W/shmsockproxy/drivers/char/Kconfig new file mode 100644 index 000000000..e93d4265a --- /dev/null +++ b/W/shmsockproxy/drivers/char/Kconfig @@ -0,0 +1,426 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Character device configuration +# + +menu "Character devices" + +source "drivers/tty/Kconfig" + +config TTY_PRINTK + tristate "TTY driver to output user messages via printk" + depends on EXPERT && TTY + default n + help + If you say Y here, the support for writing user messages (i.e. + console messages) via printk is available. + + The feature is useful to inline user messages with kernel + messages. + In order to use this feature, you should output user messages + to /dev/ttyprintk or redirect console to this TTY, or boot + the kernel with console=ttyprintk. + + If unsure, say N. + +config TTY_PRINTK_LEVEL + depends on TTY_PRINTK + int "ttyprintk log level (1-7)" + range 1 7 + default "6" + help + Printk log level to use for ttyprintk messages. + +config PRINTER + tristate "Parallel printer support" + depends on PARPORT + help + If you intend to attach a printer to the parallel port of your Linux + box (as opposed to using a serial printer; if the connector at the + printer has 9 or 25 holes ["female"], then it's serial), say Y. + Also read the Printing-HOWTO, available from + . + + It is possible to share one parallel port among several devices + (e.g. printer and ZIP drive) and it is safe to compile the + corresponding drivers into the kernel. + + To compile this driver as a module, choose M here and read + . The module will be called lp. + + If you have several parallel ports, you can specify which ports to + use with the "lp" kernel command line option. (Try "man bootparam" + or see the documentation of your boot loader (lilo or loadlin) about + how to pass options to the kernel at boot time.) The syntax of the + "lp" command line option can be found in . + + If you have more than 8 printers, you need to increase the LP_NO + macro in lp.c and the PARPORT_MAX macro in parport.h. + +config LP_CONSOLE + bool "Support for console on line printer" + depends on PRINTER + help + If you want kernel messages to be printed out as they occur, you + can have a console on the printer. This option adds support for + doing that; to actually get it to happen you need to pass the + option "console=lp0" to the kernel at boot time. + + If the printer is out of paper (or off, or unplugged, or too + busy..) the kernel will stall until the printer is ready again. + By defining CONSOLE_LP_STRICT to 0 (at your own risk) you + can make the kernel continue when this happens, + but it'll lose the kernel messages. + + If unsure, say N. + +config PPDEV + tristate "Support for user-space parallel port device drivers" + depends on PARPORT + help + Saying Y to this adds support for /dev/parport device nodes. This + is needed for programs that want portable access to the parallel + port, for instance deviceid (which displays Plug-and-Play device + IDs). + + This is the parallel port equivalent of SCSI generic support (sg). + It is safe to say N to this -- it is not needed for normal printing + or parallel port CD-ROM/disk support. + + To compile this driver as a module, choose M here: the + module will be called ppdev. + + If unsure, say N. + +config VIRTIO_CONSOLE + tristate "Virtio console" + depends on TTY + select HVC_DRIVER + select VIRTIO + help + Virtio console for use with hypervisors. + + Also serves as a general-purpose serial device for data + transfer between the guest and host. Character devices at + /dev/vportNpn will be created when corresponding ports are + found, where N is the device number and n is the port number + within that device. If specified by the host, a sysfs + attribute called 'name' will be populated with a name for + the port which can be used by udev scripts to create a + symlink to the device. + +config IBM_BSR + tristate "IBM POWER Barrier Synchronization Register support" + depends on PPC_PSERIES + help + This devices exposes a hardware mechanism for fast synchronization + of threads across a large system which avoids bouncing a cacheline + between several cores on a system + +config POWERNV_OP_PANEL + tristate "IBM POWERNV Operator Panel Display support" + depends on PPC_POWERNV + default m + help + If you say Y here, a special character device node, /dev/op_panel, + will be created which exposes the operator panel display on IBM + Power Systems machines with FSPs. + + If you don't require access to the operator panel display from user + space, say N. + + If unsure, say M here to build it as a module called powernv-op-panel. + +source "drivers/char/ipmi/Kconfig" + +config DS1620 + tristate "NetWinder thermometer support" + depends on ARCH_NETWINDER + help + Say Y here to include support for the thermal management hardware + found in the NetWinder. This driver allows the user to control the + temperature set points and to read the current temperature. + + It is also possible to say M here to build it as a module (ds1620) + It is recommended to be used on a NetWinder, but it is not a + necessity. + +config NWBUTTON + tristate "NetWinder Button" + depends on ARCH_NETWINDER + help + If you say Y here and create a character device node /dev/nwbutton + with major and minor numbers 10 and 158 ("man mknod"), then every + time the orange button is pressed a number of times, the number of + times the button was pressed will be written to that device. + + This is most useful for applications, as yet unwritten, which + perform actions based on how many times the button is pressed in a + row. + + Do not hold the button down for too long, as the driver does not + alter the behaviour of the hardware reset circuitry attached to the + button; it will still execute a hard reset if the button is held + down for longer than approximately five seconds. + + To compile this driver as a module, choose M here: the + module will be called nwbutton. + + Most people will answer Y to this question and "Reboot Using Button" + below to be able to initiate a system shutdown from the button. + +config NWBUTTON_REBOOT + bool "Reboot Using Button" + depends on NWBUTTON + help + If you say Y here, then you will be able to initiate a system + shutdown and reboot by pressing the orange button a number of times. + The number of presses to initiate the shutdown is two by default, + but this can be altered by modifying the value of NUM_PRESSES_REBOOT + in nwbutton.h and recompiling the driver or, if you compile the + driver as a module, you can specify the number of presses at load + time with "insmod button reboot_count=". + +config NWFLASH + tristate "NetWinder flash support" + depends on ARCH_NETWINDER + help + If you say Y here and create a character device /dev/flash with + major 10 and minor 160 you can manipulate the flash ROM containing + the NetWinder firmware. Be careful as accidentally overwriting the + flash contents can render your computer unbootable. On no account + allow random users access to this device. :-) + + To compile this driver as a module, choose M here: the + module will be called nwflash. + + If you're not sure, say N. + +source "drivers/char/hw_random/Kconfig" + +config DTLK + tristate "Double Talk PC internal speech card support" + depends on ISA + help + This driver is for the DoubleTalk PC, a speech synthesizer + manufactured by RC Systems (). It is also + called the `internal DoubleTalk'. + + To compile this driver as a module, choose M here: the + module will be called dtlk. + +config XILINX_HWICAP + tristate "Xilinx HWICAP Support" + depends on MICROBLAZE + help + This option enables support for Xilinx Internal Configuration + Access Port (ICAP) driver. The ICAP is used on Xilinx Virtex + FPGA platforms to partially reconfigure the FPGA at runtime. + + If unsure, say N. + +config APPLICOM + tristate "Applicom intelligent fieldbus card support" + depends on PCI + help + This driver provides the kernel-side support for the intelligent + fieldbus cards made by Applicom International. More information + about these cards can be found on the WWW at the address + , or by email from David Woodhouse + . + + To compile this driver as a module, choose M here: the + module will be called applicom. + + If unsure, say N. + +config SONYPI + tristate "Sony Vaio Programmable I/O Control Device support" + depends on X86_32 && PCI && INPUT + help + This driver enables access to the Sony Programmable I/O Control + Device which can be found in many (all ?) Sony Vaio laptops. + + If you have one of those laptops, read + , and say Y or M here. + + To compile this driver as a module, choose M here: the + module will be called sonypi. + +config MWAVE + tristate "ACP Modem (Mwave) support" + depends on X86 && TTY + select SERIAL_8250 + help + The ACP modem (Mwave) for Linux is a WinModem. It is composed of a + kernel driver and a user level application. Together these components + support direct attachment to public switched telephone networks (PSTNs) + and support selected world wide countries. + + This version of the ACP Modem driver supports the IBM Thinkpad 600E, + 600, and 770 that include on board ACP modem hardware. + + The modem also supports the standard communications port interface + (ttySx) and is compatible with the Hayes AT Command Set. + + The user level application needed to use this driver can be found at + the IBM Linux Technology Center (LTC) web site: + . + + If you own one of the above IBM Thinkpads which has the Mwave chipset + in it, say Y. + + To compile this driver as a module, choose M here: the + module will be called mwave. + +config SCx200_GPIO + tristate "NatSemi SCx200 GPIO Support" + depends on SCx200 + select NSC_GPIO + help + Give userspace access to the GPIO pins on the National + Semiconductor SCx200 processors. + + If compiled as a module, it will be called scx200_gpio. + +config PC8736x_GPIO + tristate "NatSemi PC8736x GPIO Support" + depends on X86_32 && !UML + default SCx200_GPIO # mostly N + select NSC_GPIO # needed for support routines + help + Give userspace access to the GPIO pins on the National + Semiconductor PC-8736x (x=[03456]) SuperIO chip. The chip + has multiple functional units, inc several managed by + hwmon/pc87360 driver. Tested with PC-87366 + + If compiled as a module, it will be called pc8736x_gpio. + +config NSC_GPIO + tristate "NatSemi Base GPIO Support" + depends on X86_32 + # selected by SCx200_GPIO and PC8736x_GPIO + # what about 2 selectors differing: m != y + help + Common support used (and needed) by scx200_gpio and + pc8736x_gpio drivers. If those drivers are built as + modules, this one will be too, named nsc_gpio + +config DEVMEM + bool "/dev/mem virtual device support" + default y + help + Say Y here if you want to support the /dev/mem device. + The /dev/mem device is used to access areas of physical + memory. + When in doubt, say "Y". + +config NVRAM + tristate "/dev/nvram support" + depends on X86 || HAVE_ARCH_NVRAM_OPS + default M68K || PPC + help + If you say Y here and create a character special file /dev/nvram + with major number 10 and minor number 144 using mknod ("man mknod"), + you get read and write access to the non-volatile memory. + + /dev/nvram may be used to view settings in NVRAM or to change them + (with some utility). It could also be used to frequently + save a few bits of very important data that may not be lost over + power-off and for which writing to disk is too insecure. Note + however that most NVRAM space in a PC belongs to the BIOS and you + should NEVER idly tamper with it. See Ralf Brown's interrupt list + for a guide to the use of CMOS bytes by your BIOS. + + This memory is conventionally called "NVRAM" on PowerPC machines, + "CMOS RAM" on PCs, "NVRAM" on Ataris and "PRAM" on Macintoshes. + + To compile this driver as a module, choose M here: the + module will be called nvram. + +config DEVPORT + bool "/dev/port character device" + depends on ISA || PCI + default y + help + Say Y here if you want to support the /dev/port device. The /dev/port + device is similar to /dev/mem, but for I/O ports. + +config HPET + bool "HPET - High Precision Event Timer" if (X86 || IA64) + default n + depends on ACPI + help + If you say Y here, you will have a miscdevice named "/dev/hpet/". Each + open selects one of the timers supported by the HPET. The timers are + non-periodic and/or periodic. + +config HPET_MMAP + bool "Allow mmap of HPET" + default y + depends on HPET + help + If you say Y here, user applications will be able to mmap + the HPET registers. + +config HPET_MMAP_DEFAULT + bool "Enable HPET MMAP access by default" + default y + depends on HPET_MMAP + help + In some hardware implementations, the page containing HPET + registers may also contain other things that shouldn't be + exposed to the user. This option selects the default (if + kernel parameter hpet_mmap is not set) user access to the + registers for applications that require it. + +config HANGCHECK_TIMER + tristate "Hangcheck timer" + depends on X86 || IA64 || PPC64 || S390 + help + The hangcheck-timer module detects when the system has gone + out to lunch past a certain margin. It can reboot the system + or merely print a warning. + +config UV_MMTIMER + tristate "UV_MMTIMER Memory mapped RTC for SGI UV" + depends on X86_UV + default m + help + The uv_mmtimer device allows direct userspace access to the + UV system timer. + +source "drivers/char/tpm/Kconfig" + +config TELCLOCK + tristate "Telecom clock driver for ATCA SBC" + depends on X86 + default n + help + The telecom clock device is specific to the MPCBL0010 and MPCBL0050 + ATCA computers and allows direct userspace access to the + configuration of the telecom clock configuration settings. This + device is used for hardware synchronization across the ATCA backplane + fabric. Upon loading, the driver exports a sysfs directory, + /sys/devices/platform/telco_clock, with a number of files for + controlling the behavior of this hardware. + +source "drivers/s390/char/Kconfig" + +source "drivers/char/xillybus/Kconfig" + +config ADI + tristate "SPARC Privileged ADI driver" + depends on SPARC64 + default m + help + SPARC M7 and newer processors utilize ADI (Application Data + Integrity) to version and protect memory. This driver provides + read/write access to the ADI versions for privileged processes. + This feature is also known as MCD (Memory Corruption Detection) + and SSM (Silicon Secured Memory). Intended consumers of this + driver include crash and makedumpfile. + +source "drivers/char/ivshmem/Kconfig" + +endmenu diff --git a/W/shmsockproxy/drivers/char/Makefile b/W/shmsockproxy/drivers/char/Makefile new file mode 100644 index 000000000..e9db61d33 --- /dev/null +++ b/W/shmsockproxy/drivers/char/Makefile @@ -0,0 +1 @@ +obj-y += ivshmem/ diff --git a/W/shmsockproxy/drivers/char/ivshmem/.Module.symvers.cmd b/W/shmsockproxy/drivers/char/ivshmem/.Module.symvers.cmd new file mode 100644 index 000000000..769eeec07 --- /dev/null +++ b/W/shmsockproxy/drivers/char/ivshmem/.Module.symvers.cmd @@ -0,0 +1 @@ +savedcmd_/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/Module.symvers := scripts/mod/modpost -M -m -o /home/vadikas/W/shmsockproxy/drivers/char/ivshmem/Module.symvers -n -T /home/vadikas/W/shmsockproxy/drivers/char/ivshmem/modules.order -i Module.symvers -e diff --git a/W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.ko.cmd b/W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.ko.cmd new file mode 100644 index 000000000..852af9c17 --- /dev/null +++ b/W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.ko.cmd @@ -0,0 +1 @@ +savedcmd_/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.ko := ld -r -EL -maarch64elf -z noexecstack --build-id=sha1 -T scripts/module.lds -o /home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.ko /home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.o /home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.o diff --git a/W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.mod.cmd b/W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.mod.cmd new file mode 100644 index 000000000..34850f9ec --- /dev/null +++ b/W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.mod.cmd @@ -0,0 +1 @@ +savedcmd_/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod := printf '%s\n' kvm_ivshmem.o | awk '!x[$$0]++ { print("/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/"$$0) }' > /home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod diff --git a/W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.mod.o.cmd b/W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.mod.o.cmd new file mode 100644 index 000000000..daacb80c8 --- /dev/null +++ b/W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.mod.o.cmd @@ -0,0 +1,963 @@ +savedcmd_/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.o := gcc -Wp,-MMD,/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.mod.o.d -nostdinc -I./arch/arm64/include -I./arch/arm64/include/generated -I./include -I./arch/arm64/include/uapi -I./arch/arm64/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/compiler-version.h -include ./include/linux/kconfig.h -include ./include/linux/compiler_types.h -D__KERNEL__ -mlittle-endian -DCC_USING_PATCHABLE_FUNCTION_ENTRY -DKASAN_SHADOW_SCALE_SHIFT= -fmacro-prefix-map=./= -std=gnu11 -fshort-wchar -funsigned-char -fno-common -fno-PIE -fno-strict-aliasing -mgeneral-regs-only -DCONFIG_CC_HAS_K_CONSTRAINT=1 -Wno-psabi -mabi=lp64 -fno-asynchronous-unwind-tables -fno-unwind-tables -mbranch-protection=pac-ret -Wa,-march=armv8.5-a -DARM64_ASM_ARCH='"armv8.5-a"' -DKASAN_SHADOW_SCALE_SHIFT= -fno-delete-null-pointer-checks -O2 -fno-allow-store-data-races -fstack-protector-strong -fno-omit-frame-pointer -fno-optimize-sibling-calls -ftrivial-auto-var-init=zero -fno-stack-clash-protection -fpatchable-function-entry=4,2 -falign-functions=8 -fno-strict-overflow -fno-stack-check -fconserve-stack -Wall -Wundef -Werror=implicit-function-declaration -Werror=implicit-int -Werror=return-type -Werror=strict-prototypes -Wno-format-security -Wno-trigraphs -Wno-frame-address -Wno-address-of-packed-member -Wframe-larger-than=2048 -Wno-main -Wno-unused-but-set-variable -Wno-unused-const-variable -Wno-dangling-pointer -Wvla -Wno-pointer-sign -Wcast-function-type -Wno-array-bounds -Wno-alloc-size-larger-than -Wimplicit-fallthrough=5 -Werror=date-time -Werror=incompatible-pointer-types -Werror=designated-init -Wenum-conversion -Wno-unused-but-set-variable -Wno-unused-const-variable -Wno-restrict -Wno-packed-not-aligned -Wno-format-overflow -Wno-format-truncation -Wno-stringop-overflow -Wno-stringop-truncation -Wno-missing-field-initializers -Wno-type-limits -Wno-shift-negative-value -Wno-maybe-uninitialized -Wno-sign-compare -mstack-protector-guard=sysreg -mstack-protector-guard-reg=sp_el0 -mstack-protector-guard-offset=1416 -DMODULE -DKBUILD_BASENAME='"kvm_ivshmem.mod"' -DKBUILD_MODNAME='"kvm_ivshmem"' -D__KBUILD_MODNAME=kmod_kvm_ivshmem -c -o /home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.o /home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.c + +source_/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.o := /home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.c + +deps_/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.o := \ + $(wildcard include/config/UNWINDER_ORC) \ + $(wildcard include/config/MODULE_UNLOAD) \ + $(wildcard include/config/RETPOLINE) \ + include/linux/compiler-version.h \ + $(wildcard include/config/CC_VERSION_TEXT) \ + include/linux/kconfig.h \ + $(wildcard include/config/CPU_BIG_ENDIAN) \ + $(wildcard include/config/BOOGER) \ + $(wildcard include/config/FOO) \ + include/linux/compiler_types.h \ + $(wildcard include/config/DEBUG_INFO_BTF) \ + $(wildcard include/config/PAHOLE_HAS_BTF_TAG) \ + $(wildcard include/config/FUNCTION_ALIGNMENT) \ + $(wildcard include/config/CC_IS_GCC) \ + $(wildcard include/config/X86_64) \ + $(wildcard include/config/ARM64) \ + $(wildcard include/config/HAVE_ARCH_COMPILER_H) \ + $(wildcard include/config/CC_HAS_ASM_INLINE) \ + include/linux/compiler_attributes.h \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/GCC_ASM_GOTO_OUTPUT_WORKAROUND) \ + $(wildcard include/config/ARCH_USE_BUILTIN_BSWAP) \ + $(wildcard include/config/SHADOW_CALL_STACK) \ + $(wildcard include/config/KCOV) \ + arch/arm64/include/asm/compiler.h \ + $(wildcard include/config/ARM64_PTR_AUTH_KERNEL) \ + $(wildcard include/config/ARM64_PTR_AUTH) \ + $(wildcard include/config/BUILTIN_RETURN_ADDRESS_STRIPS_PAC) \ + include/linux/module.h \ + $(wildcard include/config/MODULES) \ + $(wildcard include/config/SYSFS) \ + $(wildcard include/config/MODULES_TREE_LOOKUP) \ + $(wildcard include/config/LIVEPATCH) \ + $(wildcard include/config/STACKTRACE_BUILD_ID) \ + $(wildcard include/config/ARCH_USES_CFI_TRAPS) \ + $(wildcard include/config/MODULE_SIG) \ + $(wildcard include/config/GENERIC_BUG) \ + $(wildcard include/config/KALLSYMS) \ + $(wildcard include/config/SMP) \ + $(wildcard include/config/TRACEPOINTS) \ + $(wildcard include/config/TREE_SRCU) \ + $(wildcard include/config/BPF_EVENTS) \ + $(wildcard include/config/DEBUG_INFO_BTF_MODULES) \ + $(wildcard include/config/JUMP_LABEL) \ + $(wildcard include/config/TRACING) \ + $(wildcard include/config/EVENT_TRACING) \ + $(wildcard include/config/FTRACE_MCOUNT_RECORD) \ + $(wildcard include/config/KPROBES) \ + $(wildcard include/config/HAVE_STATIC_CALL_INLINE) \ + $(wildcard include/config/KUNIT) \ + $(wildcard include/config/PRINTK_INDEX) \ + $(wildcard include/config/CONSTRUCTORS) \ + $(wildcard include/config/FUNCTION_ERROR_INJECTION) \ + $(wildcard include/config/DYNAMIC_DEBUG_CORE) \ + include/linux/list.h \ + $(wildcard include/config/LIST_HARDENED) \ + $(wildcard include/config/DEBUG_LIST) \ + include/linux/container_of.h \ + include/linux/build_bug.h \ + include/linux/compiler.h \ + $(wildcard include/config/TRACE_BRANCH_PROFILING) \ + $(wildcard include/config/PROFILE_ALL_BRANCHES) \ + $(wildcard include/config/OBJTOOL) \ + arch/arm64/include/asm/rwonce.h \ + $(wildcard include/config/LTO) \ + $(wildcard include/config/AS_HAS_LDAPR) \ + include/asm-generic/rwonce.h \ + include/linux/kasan-checks.h \ + $(wildcard include/config/KASAN_GENERIC) \ + $(wildcard include/config/KASAN_SW_TAGS) \ + include/linux/types.h \ + $(wildcard include/config/HAVE_UID16) \ + $(wildcard include/config/UID16) \ + $(wildcard include/config/ARCH_DMA_ADDR_T_64BIT) \ + $(wildcard include/config/PHYS_ADDR_T_64BIT) \ + $(wildcard include/config/64BIT) \ + $(wildcard include/config/ARCH_32BIT_USTAT_F_TINODE) \ + include/uapi/linux/types.h \ + arch/arm64/include/generated/uapi/asm/types.h \ + include/uapi/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + include/uapi/asm-generic/int-ll64.h \ + arch/arm64/include/uapi/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/uapi/asm-generic/bitsperlong.h \ + include/uapi/linux/posix_types.h \ + include/linux/stddef.h \ + include/uapi/linux/stddef.h \ + arch/arm64/include/uapi/asm/posix_types.h \ + include/uapi/asm-generic/posix_types.h \ + include/linux/kcsan-checks.h \ + $(wildcard include/config/KCSAN) \ + $(wildcard include/config/KCSAN_WEAK_MEMORY) \ + $(wildcard include/config/KCSAN_IGNORE_ATOMICS) \ + include/linux/poison.h \ + $(wildcard include/config/ILLEGAL_POINTER_VALUE) \ + include/linux/const.h \ + include/vdso/const.h \ + include/uapi/linux/const.h \ + arch/arm64/include/asm/barrier.h \ + $(wildcard include/config/ARM64_PSEUDO_NMI) \ + arch/arm64/include/asm/alternative-macros.h \ + include/vdso/bits.h \ + arch/arm64/include/asm/cpucaps.h \ + $(wildcard include/config/ARM64_PAN) \ + $(wildcard include/config/ARM64_EPAN) \ + $(wildcard include/config/ARM64_SVE) \ + $(wildcard include/config/ARM64_SME) \ + $(wildcard include/config/ARM64_CNP) \ + $(wildcard include/config/ARM64_MTE) \ + $(wildcard include/config/ARM64_BTI) \ + $(wildcard include/config/ARM64_TLB_RANGE) \ + $(wildcard include/config/UNMAP_KERNEL_AT_EL0) \ + $(wildcard include/config/ARM64_ERRATUM_843419) \ + $(wildcard include/config/ARM64_ERRATUM_1742098) \ + $(wildcard include/config/ARM64_ERRATUM_2645198) \ + $(wildcard include/config/ARM64_ERRATUM_2658417) \ + $(wildcard include/config/CAVIUM_ERRATUM_23154) \ + $(wildcard include/config/NVIDIA_CARMEL_CNP_ERRATUM) \ + $(wildcard include/config/ARM64_WORKAROUND_REPEAT_TLBI) \ + arch/arm64/include/generated/asm/cpucap-defs.h \ + arch/arm64/include/asm/insn-def.h \ + arch/arm64/include/asm/brk-imm.h \ + include/linux/stringify.h \ + include/asm-generic/barrier.h \ + include/linux/stat.h \ + arch/arm64/include/asm/stat.h \ + $(wildcard include/config/COMPAT) \ + arch/arm64/include/generated/uapi/asm/stat.h \ + include/uapi/asm-generic/stat.h \ + include/linux/time.h \ + $(wildcard include/config/POSIX_TIMERS) \ + include/linux/cache.h \ + $(wildcard include/config/ARCH_HAS_CACHE_LINE_SIZE) \ + include/uapi/linux/kernel.h \ + include/uapi/linux/sysinfo.h \ + arch/arm64/include/asm/cache.h \ + $(wildcard include/config/KASAN_HW_TAGS) \ + include/linux/bitops.h \ + include/linux/bits.h \ + include/linux/typecheck.h \ + include/asm-generic/bitops/generic-non-atomic.h \ + arch/arm64/include/asm/bitops.h \ + include/asm-generic/bitops/builtin-__ffs.h \ + include/asm-generic/bitops/builtin-ffs.h \ + include/asm-generic/bitops/builtin-__fls.h \ + include/asm-generic/bitops/builtin-fls.h \ + include/asm-generic/bitops/ffz.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/atomic.h \ + include/linux/atomic.h \ + arch/arm64/include/asm/atomic.h \ + arch/arm64/include/asm/cmpxchg.h \ + arch/arm64/include/asm/lse.h \ + $(wildcard include/config/ARM64_LSE_ATOMICS) \ + arch/arm64/include/asm/atomic_ll_sc.h \ + $(wildcard include/config/CC_HAS_K_CONSTRAINT) \ + include/linux/export.h \ + $(wildcard include/config/MODVERSIONS) \ + include/linux/linkage.h \ + $(wildcard include/config/ARCH_USE_SYM_ANNOTATIONS) \ + arch/arm64/include/asm/linkage.h \ + arch/arm64/include/asm/alternative.h \ + include/linux/init.h \ + $(wildcard include/config/HAVE_ARCH_PREL32_RELOCATIONS) \ + $(wildcard include/config/STRICT_KERNEL_RWX) \ + $(wildcard include/config/STRICT_MODULE_RWX) \ + $(wildcard include/config/LTO_CLANG) \ + arch/arm64/include/asm/atomic_lse.h \ + include/linux/atomic/atomic-arch-fallback.h \ + $(wildcard include/config/GENERIC_ATOMIC64) \ + include/linux/atomic/atomic-long.h \ + include/linux/atomic/atomic-instrumented.h \ + include/linux/instrumented.h \ + include/linux/kmsan-checks.h \ + $(wildcard include/config/KMSAN) \ + include/asm-generic/bitops/instrumented-atomic.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/instrumented-lock.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/non-instrumented-non-atomic.h \ + include/asm-generic/bitops/le.h \ + arch/arm64/include/uapi/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/uapi/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + include/uapi/linux/swab.h \ + arch/arm64/include/generated/uapi/asm/swab.h \ + include/uapi/asm-generic/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/kasan-enabled.h \ + $(wildcard include/config/KASAN) \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/HAVE_ARCH_JUMP_LABEL_RELATIVE) \ + arch/arm64/include/asm/jump_label.h \ + arch/arm64/include/asm/insn.h \ + arch/arm64/include/asm/cputype.h \ + arch/arm64/include/asm/sysreg.h \ + $(wildcard include/config/BROKEN_GAS_INST) \ + $(wildcard include/config/ARM64_PA_BITS_52) \ + $(wildcard include/config/ARM64_4K_PAGES) \ + $(wildcard include/config/ARM64_16K_PAGES) \ + $(wildcard include/config/ARM64_64K_PAGES) \ + include/linux/kasan-tags.h \ + arch/arm64/include/asm/gpr-num.h \ + arch/arm64/include/generated/asm/sysreg-defs.h \ + include/linux/bitfield.h \ + arch/arm64/include/asm/mte-def.h \ + include/linux/math64.h \ + $(wildcard include/config/ARCH_SUPPORTS_INT128) \ + include/linux/math.h \ + arch/arm64/include/generated/asm/div64.h \ + include/asm-generic/div64.h \ + include/vdso/math64.h \ + include/linux/time64.h \ + include/vdso/time64.h \ + include/uapi/linux/time.h \ + include/uapi/linux/time_types.h \ + include/linux/time32.h \ + include/linux/timex.h \ + include/uapi/linux/timex.h \ + include/uapi/linux/param.h \ + arch/arm64/include/uapi/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/HZ) \ + include/uapi/asm-generic/param.h \ + arch/arm64/include/asm/timex.h \ + arch/arm64/include/asm/arch_timer.h \ + $(wildcard include/config/ARM_ARCH_TIMER_OOL_WORKAROUND) \ + arch/arm64/include/asm/hwcap.h \ + arch/arm64/include/uapi/asm/hwcap.h \ + arch/arm64/include/asm/cpufeature.h \ + $(wildcard include/config/ARM64_SW_TTBR0_PAN) \ + $(wildcard include/config/ARM64_DEBUG_PRIORITY_MASKING) \ + $(wildcard include/config/ARM64_BTI_KERNEL) \ + $(wildcard include/config/ARM64_PA_BITS) \ + $(wildcard include/config/ARM64_HW_AFDBM) \ + $(wildcard include/config/ARM64_AMU_EXTN) \ + include/linux/bug.h \ + $(wildcard include/config/BUG_ON_DATA_CORRUPTION) \ + arch/arm64/include/asm/bug.h \ + arch/arm64/include/asm/asm-bug.h \ + $(wildcard include/config/DEBUG_BUGVERBOSE) \ + include/asm-generic/bug.h \ + $(wildcard include/config/BUG) \ + $(wildcard include/config/GENERIC_BUG_RELATIVE_POINTERS) \ + include/linux/instrumentation.h \ + $(wildcard include/config/NOINSTR_VALIDATION) \ + include/linux/once_lite.h \ + include/linux/panic.h \ + $(wildcard include/config/PANIC_TIMEOUT) \ + include/linux/printk.h \ + $(wildcard include/config/MESSAGE_LOGLEVEL_DEFAULT) \ + $(wildcard include/config/CONSOLE_LOGLEVEL_DEFAULT) \ + $(wildcard include/config/CONSOLE_LOGLEVEL_QUIET) \ + $(wildcard include/config/EARLY_PRINTK) \ + $(wildcard include/config/PRINTK) \ + $(wildcard include/config/DYNAMIC_DEBUG) \ + include/linux/stdarg.h \ + include/linux/kern_levels.h \ + include/linux/ratelimit_types.h \ + include/linux/spinlock_types_raw.h \ + $(wildcard include/config/DEBUG_SPINLOCK) \ + $(wildcard include/config/DEBUG_LOCK_ALLOC) \ + arch/arm64/include/asm/spinlock_types.h \ + include/asm-generic/qspinlock_types.h \ + $(wildcard include/config/NR_CPUS) \ + include/asm-generic/qrwlock_types.h \ + include/linux/lockdep_types.h \ + $(wildcard include/config/PROVE_RAW_LOCK_NESTING) \ + $(wildcard include/config/LOCKDEP) \ + $(wildcard include/config/LOCK_STAT) \ + include/linux/dynamic_debug.h \ + include/linux/kernel.h \ + $(wildcard include/config/PREEMPT_VOLUNTARY_BUILD) \ + $(wildcard include/config/PREEMPT_DYNAMIC) \ + $(wildcard include/config/HAVE_PREEMPT_DYNAMIC_CALL) \ + $(wildcard include/config/HAVE_PREEMPT_DYNAMIC_KEY) \ + $(wildcard include/config/PREEMPT_) \ + $(wildcard include/config/DEBUG_ATOMIC_SLEEP) \ + $(wildcard include/config/MMU) \ + $(wildcard include/config/PROVE_LOCKING) \ + include/linux/align.h \ + include/linux/array_size.h \ + include/linux/limits.h \ + include/uapi/linux/limits.h \ + include/vdso/limits.h \ + include/linux/hex.h \ + include/linux/kstrtox.h \ + include/linux/log2.h \ + $(wildcard include/config/ARCH_HAS_ILOG2_U32) \ + $(wildcard include/config/ARCH_HAS_ILOG2_U64) \ + include/linux/minmax.h \ + include/linux/sprintf.h \ + include/linux/static_call_types.h \ + $(wildcard include/config/HAVE_STATIC_CALL) \ + include/linux/instruction_pointer.h \ + include/linux/cpumask.h \ + $(wildcard include/config/FORCE_NR_CPUS) \ + $(wildcard include/config/HOTPLUG_CPU) \ + $(wildcard include/config/DEBUG_PER_CPU_MAPS) \ + $(wildcard include/config/CPUMASK_OFFSTACK) \ + include/linux/threads.h \ + $(wildcard include/config/BASE_SMALL) \ + include/linux/bitmap.h \ + include/linux/errno.h \ + include/uapi/linux/errno.h \ + arch/arm64/include/generated/uapi/asm/errno.h \ + include/uapi/asm-generic/errno.h \ + include/uapi/asm-generic/errno-base.h \ + include/linux/find.h \ + include/linux/string.h \ + $(wildcard include/config/BINARY_PRINTF) \ + $(wildcard include/config/FORTIFY_SOURCE) \ + include/linux/err.h \ + include/linux/overflow.h \ + include/uapi/linux/string.h \ + arch/arm64/include/asm/string.h \ + $(wildcard include/config/ARCH_HAS_UACCESS_FLUSHCACHE) \ + include/linux/fortify-string.h \ + include/linux/bitmap-str.h \ + include/linux/gfp_types.h \ + include/linux/numa.h \ + $(wildcard include/config/NODES_SHIFT) \ + $(wildcard include/config/NUMA_KEEP_MEMINFO) \ + $(wildcard include/config/NUMA) \ + $(wildcard include/config/HAVE_ARCH_NODE_DEV_GROUP) \ + arch/arm64/include/asm/sparsemem.h \ + include/linux/smp.h \ + $(wildcard include/config/UP_LATE_INIT) \ + $(wildcard include/config/DEBUG_PREEMPT) \ + include/linux/smp_types.h \ + include/linux/llist.h \ + $(wildcard include/config/ARCH_HAVE_NMI_SAFE_CMPXCHG) \ + include/linux/preempt.h \ + $(wildcard include/config/PREEMPT_RT) \ + $(wildcard include/config/PREEMPT_COUNT) \ + $(wildcard include/config/TRACE_PREEMPT_TOGGLE) \ + $(wildcard include/config/PREEMPTION) \ + $(wildcard include/config/PREEMPT_NOTIFIERS) \ + include/linux/cleanup.h \ + arch/arm64/include/asm/preempt.h \ + include/linux/thread_info.h \ + $(wildcard include/config/THREAD_INFO_IN_TASK) \ + $(wildcard include/config/GENERIC_ENTRY) \ + $(wildcard include/config/HAVE_ARCH_WITHIN_STACK_FRAMES) \ + $(wildcard include/config/HARDENED_USERCOPY) \ + $(wildcard include/config/SH) \ + include/linux/restart_block.h \ + arch/arm64/include/asm/current.h \ + arch/arm64/include/asm/thread_info.h \ + arch/arm64/include/asm/memory.h \ + $(wildcard include/config/ARM64_VA_BITS) \ + $(wildcard include/config/KASAN_SHADOW_OFFSET) \ + $(wildcard include/config/VMAP_STACK) \ + $(wildcard include/config/RANDOMIZE_BASE) \ + $(wildcard include/config/DEBUG_VIRTUAL) \ + $(wildcard include/config/EFI) \ + $(wildcard include/config/ARM_GIC_V3_ITS) \ + include/linux/sizes.h \ + arch/arm64/include/asm/page-def.h \ + $(wildcard include/config/ARM64_PAGE_SHIFT) \ + include/linux/mmdebug.h \ + $(wildcard include/config/DEBUG_VM) \ + $(wildcard include/config/DEBUG_VM_IRQSOFF) \ + $(wildcard include/config/DEBUG_VM_PGFLAGS) \ + arch/arm64/include/asm/boot.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/FLATMEM) \ + $(wildcard include/config/SPARSEMEM_VMEMMAP) \ + $(wildcard include/config/SPARSEMEM) \ + include/linux/pfn.h \ + arch/arm64/include/asm/stack_pointer.h \ + arch/arm64/include/asm/smp.h \ + $(wildcard include/config/ARM64_ACPI_PARKING_PROTOCOL) \ + arch/arm64/include/asm/percpu.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/HAVE_SETUP_PER_CPU_AREA) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/DEBUG_FORCE_WEAK_PER_CPU) \ + $(wildcard include/config/AMD_MEM_ENCRYPT) \ + include/clocksource/arm_arch_timer.h \ + $(wildcard include/config/ARM_ARCH_TIMER) \ + include/linux/timecounter.h \ + include/asm-generic/timex.h \ + include/vdso/time32.h \ + include/vdso/time.h \ + arch/arm64/include/asm/compat.h \ + include/asm-generic/compat.h \ + $(wildcard include/config/COMPAT_FOR_U64_ALIGNMENT) \ + include/linux/sched.h \ + $(wildcard include/config/VIRT_CPU_ACCOUNTING_NATIVE) \ + $(wildcard include/config/SCHED_INFO) \ + $(wildcard include/config/SCHEDSTATS) \ + $(wildcard include/config/SCHED_CORE) \ + $(wildcard include/config/FAIR_GROUP_SCHED) \ + $(wildcard include/config/RT_GROUP_SCHED) \ + $(wildcard include/config/RT_MUTEXES) \ + $(wildcard include/config/UCLAMP_TASK) \ + $(wildcard include/config/UCLAMP_BUCKETS_COUNT) \ + $(wildcard include/config/KMAP_LOCAL) \ + $(wildcard include/config/CGROUP_SCHED) \ + $(wildcard include/config/BLK_DEV_IO_TRACE) \ + $(wildcard include/config/PREEMPT_RCU) \ + $(wildcard include/config/TASKS_RCU) \ + $(wildcard include/config/TASKS_TRACE_RCU) \ + $(wildcard include/config/MEMCG) \ + $(wildcard include/config/LRU_GEN) \ + $(wildcard include/config/COMPAT_BRK) \ + $(wildcard include/config/CGROUPS) \ + $(wildcard include/config/BLK_CGROUP) \ + $(wildcard include/config/PSI) \ + $(wildcard include/config/PAGE_OWNER) \ + $(wildcard include/config/EVENTFD) \ + $(wildcard include/config/IOMMU_SVA) \ + $(wildcard include/config/CPU_SUP_INTEL) \ + $(wildcard include/config/TASK_DELAY_ACCT) \ + $(wildcard include/config/STACKPROTECTOR) \ + $(wildcard include/config/ARCH_HAS_SCALED_CPUTIME) \ + $(wildcard include/config/VIRT_CPU_ACCOUNTING_GEN) \ + $(wildcard include/config/NO_HZ_FULL) \ + $(wildcard include/config/POSIX_CPUTIMERS) \ + $(wildcard include/config/POSIX_CPU_TIMERS_TASK_WORK) \ + $(wildcard include/config/KEYS) \ + $(wildcard include/config/SYSVIPC) \ + $(wildcard include/config/DETECT_HUNG_TASK) \ + $(wildcard include/config/IO_URING) \ + $(wildcard include/config/AUDIT) \ + $(wildcard include/config/AUDITSYSCALL) \ + $(wildcard include/config/DEBUG_MUTEXES) \ + $(wildcard include/config/TRACE_IRQFLAGS) \ + $(wildcard include/config/UBSAN) \ + $(wildcard include/config/UBSAN_TRAP) \ + $(wildcard include/config/COMPACTION) \ + $(wildcard include/config/TASK_XACCT) \ + $(wildcard include/config/CPUSETS) \ + $(wildcard include/config/X86_CPU_RESCTRL) \ + $(wildcard include/config/FUTEX) \ + $(wildcard include/config/PERF_EVENTS) \ + $(wildcard include/config/NUMA_BALANCING) \ + $(wildcard include/config/RSEQ) \ + $(wildcard include/config/SCHED_MM_CID) \ + $(wildcard include/config/FAULT_INJECTION) \ + $(wildcard include/config/LATENCYTOP) \ + $(wildcard include/config/FUNCTION_GRAPH_TRACER) \ + $(wildcard include/config/MEMCG_KMEM) \ + $(wildcard include/config/UPROBES) \ + $(wildcard include/config/BCACHE) \ + $(wildcard include/config/SECURITY) \ + $(wildcard include/config/BPF_SYSCALL) \ + $(wildcard include/config/GCC_PLUGIN_STACKLEAK) \ + $(wildcard include/config/X86_MCE) \ + $(wildcard include/config/KRETPROBES) \ + $(wildcard include/config/RETHOOK) \ + $(wildcard include/config/ARCH_HAS_PARANOID_L1D_FLUSH) \ + $(wildcard include/config/RV) \ + $(wildcard include/config/USER_EVENTS) \ + $(wildcard include/config/ARCH_TASK_STRUCT_ON_STACK) \ + $(wildcard include/config/PREEMPT_NONE) \ + $(wildcard include/config/PREEMPT_VOLUNTARY) \ + $(wildcard include/config/PREEMPT) \ + $(wildcard include/config/DEBUG_RSEQ) \ + include/uapi/linux/sched.h \ + include/linux/pid.h \ + include/linux/rculist.h \ + $(wildcard include/config/PROVE_RCU_LIST) \ + include/linux/rcupdate.h \ + $(wildcard include/config/TINY_RCU) \ + $(wildcard include/config/RCU_STRICT_GRACE_PERIOD) \ + $(wildcard include/config/RCU_LAZY) \ + $(wildcard include/config/TASKS_RCU_GENERIC) \ + $(wildcard include/config/RCU_STALL_COMMON) \ + $(wildcard include/config/KVM_XFER_TO_GUEST_WORK) \ + $(wildcard include/config/RCU_NOCB_CPU) \ + $(wildcard include/config/TASKS_RUDE_RCU) \ + $(wildcard include/config/TREE_RCU) \ + $(wildcard include/config/DEBUG_OBJECTS_RCU_HEAD) \ + $(wildcard include/config/PROVE_RCU) \ + $(wildcard include/config/ARCH_WEAK_RELEASE_ACQUIRE) \ + include/linux/irqflags.h \ + $(wildcard include/config/IRQSOFF_TRACER) \ + $(wildcard include/config/PREEMPT_TRACER) \ + $(wildcard include/config/DEBUG_IRQFLAGS) \ + $(wildcard include/config/TRACE_IRQFLAGS_SUPPORT) \ + arch/arm64/include/asm/irqflags.h \ + arch/arm64/include/asm/ptrace.h \ + arch/arm64/include/uapi/asm/ptrace.h \ + arch/arm64/include/uapi/asm/sve_context.h \ + include/linux/bottom_half.h \ + include/linux/lockdep.h \ + $(wildcard include/config/DEBUG_LOCKING_API_SELFTESTS) \ + arch/arm64/include/asm/processor.h \ + $(wildcard include/config/KUSER_HELPERS) \ + $(wildcard include/config/ARM64_FORCE_52BIT) \ + $(wildcard include/config/HAVE_HW_BREAKPOINT) \ + $(wildcard include/config/ARM64_TAGGED_ADDR_ABI) \ + include/vdso/processor.h \ + arch/arm64/include/asm/vdso/processor.h \ + arch/arm64/include/asm/hw_breakpoint.h \ + $(wildcard include/config/CPU_PM) \ + arch/arm64/include/asm/virt.h \ + $(wildcard include/config/KVM) \ + arch/arm64/include/asm/sections.h \ + include/asm-generic/sections.h \ + $(wildcard include/config/HAVE_FUNCTION_DESCRIPTORS) \ + arch/arm64/include/asm/kasan.h \ + arch/arm64/include/asm/mte-kasan.h \ + arch/arm64/include/asm/pgtable-types.h \ + $(wildcard include/config/PGTABLE_LEVELS) \ + include/asm-generic/pgtable-nop4d.h \ + arch/arm64/include/asm/pgtable-hwdef.h \ + $(wildcard include/config/ARM64_CONT_PTE_SHIFT) \ + $(wildcard include/config/ARM64_CONT_PMD_SHIFT) \ + $(wildcard include/config/ARM64_VA_BITS_52) \ + arch/arm64/include/asm/pointer_auth.h \ + include/uapi/linux/prctl.h \ + include/linux/random.h \ + $(wildcard include/config/VMGENID) \ + include/uapi/linux/random.h \ + include/uapi/linux/ioctl.h \ + arch/arm64/include/generated/uapi/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + include/uapi/asm-generic/ioctl.h \ + include/linux/irqnr.h \ + include/uapi/linux/irqnr.h \ + include/linux/prandom.h \ + include/linux/once.h \ + include/linux/percpu.h \ + $(wildcard include/config/RANDOM_KMALLOC_CACHES) \ + $(wildcard include/config/NEED_PER_CPU_PAGE_FIRST_CHUNK) \ + arch/arm64/include/asm/spectre.h \ + arch/arm64/include/asm/fpsimd.h \ + arch/arm64/include/uapi/asm/sigcontext.h \ + include/linux/context_tracking_irq.h \ + $(wildcard include/config/CONTEXT_TRACKING_IDLE) \ + include/linux/rcutree.h \ + include/linux/wait.h \ + include/linux/spinlock.h \ + arch/arm64/include/generated/asm/mmiowb.h \ + include/asm-generic/mmiowb.h \ + $(wildcard include/config/MMIOWB) \ + include/linux/spinlock_types.h \ + include/linux/rwlock_types.h \ + arch/arm64/include/asm/spinlock.h \ + arch/arm64/include/generated/asm/qspinlock.h \ + include/asm-generic/qspinlock.h \ + arch/arm64/include/generated/asm/qrwlock.h \ + include/asm-generic/qrwlock.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_smp.h \ + $(wildcard include/config/INLINE_SPIN_LOCK) \ + $(wildcard include/config/INLINE_SPIN_LOCK_BH) \ + $(wildcard include/config/INLINE_SPIN_LOCK_IRQ) \ + $(wildcard include/config/INLINE_SPIN_LOCK_IRQSAVE) \ + $(wildcard include/config/INLINE_SPIN_TRYLOCK) \ + $(wildcard include/config/INLINE_SPIN_TRYLOCK_BH) \ + $(wildcard include/config/UNINLINE_SPIN_UNLOCK) \ + $(wildcard include/config/INLINE_SPIN_UNLOCK_BH) \ + $(wildcard include/config/INLINE_SPIN_UNLOCK_IRQ) \ + $(wildcard include/config/INLINE_SPIN_UNLOCK_IRQRESTORE) \ + $(wildcard include/config/GENERIC_LOCKBREAK) \ + include/linux/rwlock_api_smp.h \ + $(wildcard include/config/INLINE_READ_LOCK) \ + $(wildcard include/config/INLINE_WRITE_LOCK) \ + $(wildcard include/config/INLINE_READ_LOCK_BH) \ + $(wildcard include/config/INLINE_WRITE_LOCK_BH) \ + $(wildcard include/config/INLINE_READ_LOCK_IRQ) \ + $(wildcard include/config/INLINE_WRITE_LOCK_IRQ) \ + $(wildcard include/config/INLINE_READ_LOCK_IRQSAVE) \ + $(wildcard include/config/INLINE_WRITE_LOCK_IRQSAVE) \ + $(wildcard include/config/INLINE_READ_TRYLOCK) \ + $(wildcard include/config/INLINE_WRITE_TRYLOCK) \ + $(wildcard include/config/INLINE_READ_UNLOCK) \ + $(wildcard include/config/INLINE_WRITE_UNLOCK) \ + $(wildcard include/config/INLINE_READ_UNLOCK_BH) \ + $(wildcard include/config/INLINE_WRITE_UNLOCK_BH) \ + $(wildcard include/config/INLINE_READ_UNLOCK_IRQ) \ + $(wildcard include/config/INLINE_WRITE_UNLOCK_IRQ) \ + $(wildcard include/config/INLINE_READ_UNLOCK_IRQRESTORE) \ + $(wildcard include/config/INLINE_WRITE_UNLOCK_IRQRESTORE) \ + include/uapi/linux/wait.h \ + include/linux/refcount.h \ + include/linux/sem.h \ + include/uapi/linux/sem.h \ + include/linux/ipc.h \ + include/linux/uidgid.h \ + $(wildcard include/config/MULTIUSER) \ + $(wildcard include/config/USER_NS) \ + include/linux/highuid.h \ + include/linux/rhashtable-types.h \ + include/linux/mutex.h \ + $(wildcard include/config/MUTEX_SPIN_ON_OWNER) \ + include/linux/osq_lock.h \ + include/linux/debug_locks.h \ + include/linux/workqueue.h \ + $(wildcard include/config/DEBUG_OBJECTS_WORK) \ + $(wildcard include/config/FREEZER) \ + $(wildcard include/config/WQ_WATCHDOG) \ + include/linux/timer.h \ + $(wildcard include/config/DEBUG_OBJECTS_TIMERS) \ + include/linux/ktime.h \ + include/linux/jiffies.h \ + include/vdso/jiffies.h \ + include/generated/timeconst.h \ + include/vdso/ktime.h \ + include/linux/timekeeping.h \ + $(wildcard include/config/GENERIC_CMOS_UPDATE) \ + include/linux/clocksource_ids.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/DEBUG_OBJECTS) \ + $(wildcard include/config/DEBUG_OBJECTS_FREE) \ + include/uapi/linux/ipc.h \ + arch/arm64/include/generated/uapi/asm/ipcbuf.h \ + include/uapi/asm-generic/ipcbuf.h \ + arch/arm64/include/generated/uapi/asm/sembuf.h \ + include/uapi/asm-generic/sembuf.h \ + include/linux/shm.h \ + arch/arm64/include/asm/page.h \ + include/linux/personality.h \ + include/uapi/linux/personality.h \ + include/asm-generic/getorder.h \ + include/uapi/linux/shm.h \ + include/uapi/asm-generic/hugetlb_encode.h \ + arch/arm64/include/generated/uapi/asm/shmbuf.h \ + include/uapi/asm-generic/shmbuf.h \ + arch/arm64/include/asm/shmparam.h \ + include/asm-generic/shmparam.h \ + include/linux/kmsan_types.h \ + include/linux/plist.h \ + $(wildcard include/config/DEBUG_PLIST) \ + include/linux/hrtimer.h \ + $(wildcard include/config/HIGH_RES_TIMERS) \ + $(wildcard include/config/TIME_LOW_RES) \ + $(wildcard include/config/TIMERFD) \ + include/linux/hrtimer_defs.h \ + include/linux/rbtree.h \ + include/linux/rbtree_types.h \ + include/linux/seqlock.h \ + include/linux/timerqueue.h \ + include/linux/seccomp.h \ + $(wildcard include/config/SECCOMP) \ + $(wildcard include/config/HAVE_ARCH_SECCOMP_FILTER) \ + $(wildcard include/config/SECCOMP_FILTER) \ + $(wildcard include/config/CHECKPOINT_RESTORE) \ + $(wildcard include/config/SECCOMP_CACHE_DEBUG) \ + include/uapi/linux/seccomp.h \ + arch/arm64/include/asm/seccomp.h \ + arch/arm64/include/asm/unistd.h \ + arch/arm64/include/uapi/asm/unistd.h \ + include/uapi/asm-generic/unistd.h \ + include/asm-generic/seccomp.h \ + include/uapi/linux/unistd.h \ + include/linux/nodemask.h \ + $(wildcard include/config/HIGHMEM) \ + include/linux/resource.h \ + include/uapi/linux/resource.h \ + arch/arm64/include/generated/uapi/asm/resource.h \ + include/asm-generic/resource.h \ + include/uapi/asm-generic/resource.h \ + include/linux/latencytop.h \ + include/linux/sched/prio.h \ + include/linux/sched/types.h \ + include/linux/signal_types.h \ + $(wildcard include/config/OLD_SIGACTION) \ + include/uapi/linux/signal.h \ + arch/arm64/include/asm/signal.h \ + arch/arm64/include/uapi/asm/signal.h \ + include/asm-generic/signal.h \ + include/uapi/asm-generic/signal.h \ + include/uapi/asm-generic/signal-defs.h \ + arch/arm64/include/generated/uapi/asm/siginfo.h \ + include/uapi/asm-generic/siginfo.h \ + include/linux/syscall_user_dispatch.h \ + include/linux/mm_types_task.h \ + $(wildcard include/config/ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH) \ + $(wildcard include/config/SPLIT_PTLOCK_CPUS) \ + $(wildcard include/config/ARCH_ENABLE_SPLIT_PMD_PTLOCK) \ + arch/arm64/include/asm/tlbbatch.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/TASK_IO_ACCOUNTING) \ + include/linux/posix-timers.h \ + include/linux/alarmtimer.h \ + $(wildcard include/config/RTC_CLASS) \ + include/uapi/linux/rseq.h \ + include/linux/kcsan.h \ + include/linux/rv.h \ + $(wildcard include/config/RV_REACTORS) \ + include/linux/livepatch_sched.h \ + arch/arm64/include/generated/asm/kmap_size.h \ + include/asm-generic/kmap_size.h \ + $(wildcard include/config/DEBUG_KMAP_LOCAL) \ + include/linux/sched/task_stack.h \ + $(wildcard include/config/STACK_GROWSUP) \ + $(wildcard include/config/DEBUG_STACK_USAGE) \ + include/uapi/linux/magic.h \ + include/uapi/linux/stat.h \ + include/linux/buildid.h \ + $(wildcard include/config/CRASH_CORE) \ + include/linux/kmod.h \ + include/linux/umh.h \ + include/linux/gfp.h \ + $(wildcard include/config/ZONE_DMA) \ + $(wildcard include/config/ZONE_DMA32) \ + $(wildcard include/config/ZONE_DEVICE) \ + $(wildcard include/config/CONTIG_ALLOC) \ + include/linux/mmzone.h \ + $(wildcard include/config/ARCH_FORCE_MAX_ORDER) \ + $(wildcard include/config/CMA) \ + $(wildcard include/config/MEMORY_ISOLATION) \ + $(wildcard include/config/ZSMALLOC) \ + $(wildcard include/config/UNACCEPTED_MEMORY) \ + $(wildcard include/config/SWAP) \ + $(wildcard include/config/TRANSPARENT_HUGEPAGE) \ + $(wildcard include/config/LRU_GEN_STATS) \ + $(wildcard include/config/MEMORY_HOTPLUG) \ + $(wildcard include/config/MEMORY_FAILURE) \ + $(wildcard include/config/PAGE_EXTENSION) \ + $(wildcard include/config/DEFERRED_STRUCT_PAGE_INIT) \ + $(wildcard include/config/HAVE_MEMORYLESS_NODES) \ + $(wildcard include/config/SPARSEMEM_EXTREME) \ + $(wildcard include/config/HAVE_ARCH_PFN_VALID) \ + include/linux/list_nulls.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/HUGETLB_PAGE) \ + $(wildcard include/config/HUGETLB_PAGE_SIZE_VARIABLE) \ + include/linux/page-flags-layout.h \ + include/generated/bounds.h \ + include/linux/mm_types.h \ + $(wildcard include/config/HAVE_ALIGNED_STRUCT_PAGE) \ + $(wildcard include/config/USERFAULTFD) \ + $(wildcard include/config/ANON_VMA_NAME) \ + $(wildcard include/config/PER_VMA_LOCK) \ + $(wildcard include/config/HAVE_ARCH_COMPAT_MMAP_BASES) \ + $(wildcard include/config/MEMBARRIER) \ + $(wildcard include/config/AIO) \ + $(wildcard include/config/MMU_NOTIFIER) \ + $(wildcard include/config/KSM) \ + include/linux/auxvec.h \ + include/uapi/linux/auxvec.h \ + arch/arm64/include/uapi/asm/auxvec.h \ + include/linux/kref.h \ + include/linux/maple_tree.h \ + $(wildcard include/config/MAPLE_RCU_DISABLED) \ + $(wildcard include/config/DEBUG_MAPLE_TREE) \ + include/linux/rwsem.h \ + $(wildcard include/config/RWSEM_SPIN_ON_OWNER) \ + $(wildcard include/config/DEBUG_RWSEMS) \ + include/linux/completion.h \ + include/linux/swait.h \ + include/linux/uprobes.h \ + arch/arm64/include/asm/uprobes.h \ + arch/arm64/include/asm/debug-monitors.h \ + arch/arm64/include/asm/esr.h \ + arch/arm64/include/asm/probes.h \ + include/linux/percpu_counter.h \ + arch/arm64/include/asm/mmu.h \ + include/linux/page-flags.h \ + $(wildcard include/config/ARCH_USES_PG_UNCACHED) \ + $(wildcard include/config/PAGE_IDLE_FLAG) \ + $(wildcard include/config/ARCH_USES_PG_ARCH_X) \ + $(wildcard include/config/HUGETLB_PAGE_OPTIMIZE_VMEMMAP) \ + include/linux/local_lock.h \ + include/linux/local_lock_internal.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/HAVE_ARCH_NODEDATA_EXTENSION) \ + $(wildcard include/config/ARCH_HAS_ADD_PAGES) \ + $(wildcard include/config/MEMORY_HOTREMOVE) \ + include/linux/notifier.h \ + include/linux/srcu.h \ + $(wildcard include/config/TINY_SRCU) \ + $(wildcard include/config/NEED_SRCU_NMI_SAFE) \ + include/linux/rcu_segcblist.h \ + include/linux/srcutree.h \ + include/linux/rcu_node_tree.h \ + $(wildcard include/config/RCU_FANOUT) \ + $(wildcard include/config/RCU_FANOUT_LEAF) \ + arch/arm64/include/asm/mmzone.h \ + arch/arm64/include/asm/numa.h \ + arch/arm64/include/asm/topology.h \ + $(wildcard include/config/ACPI_CPPC_LIB) \ + include/linux/arch_topology.h \ + $(wildcard include/config/GENERIC_ARCH_TOPOLOGY) \ + include/asm-generic/topology.h \ + include/asm-generic/numa.h \ + include/linux/topology.h \ + $(wildcard include/config/USE_PERCPU_NUMA_NODE_ID) \ + $(wildcard include/config/SCHED_SMT) \ + include/linux/sysctl.h \ + $(wildcard include/config/SYSCTL) \ + include/uapi/linux/sysctl.h \ + include/linux/elf.h \ + $(wildcard include/config/ARCH_USE_GNU_PROPERTY) \ + $(wildcard include/config/ARCH_HAVE_ELF_PROT) \ + arch/arm64/include/asm/elf.h \ + $(wildcard include/config/COMPAT_VDSO) \ + arch/arm64/include/generated/asm/user.h \ + include/asm-generic/user.h \ + include/uapi/linux/elf.h \ + include/uapi/linux/elf-em.h \ + include/linux/fs.h \ + $(wildcard include/config/READ_ONLY_THP_FOR_FS) \ + $(wildcard include/config/FS_POSIX_ACL) \ + $(wildcard include/config/CGROUP_WRITEBACK) \ + $(wildcard include/config/IMA) \ + $(wildcard include/config/FILE_LOCKING) \ + $(wildcard include/config/FSNOTIFY) \ + $(wildcard include/config/FS_ENCRYPTION) \ + $(wildcard include/config/FS_VERITY) \ + $(wildcard include/config/EPOLL) \ + $(wildcard include/config/UNICODE) \ + $(wildcard include/config/QUOTA) \ + $(wildcard include/config/FS_DAX) \ + $(wildcard include/config/BLOCK) \ + include/linux/wait_bit.h \ + include/linux/kdev_t.h \ + include/uapi/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/rculist_bl.h \ + include/linux/list_bl.h \ + include/linux/bit_spinlock.h \ + include/linux/lockref.h \ + $(wildcard include/config/ARCH_USE_CMPXCHG_LOCKREF) \ + include/linux/stringhash.h \ + $(wildcard include/config/DCACHE_WORD_ACCESS) \ + include/linux/hash.h \ + $(wildcard include/config/HAVE_ARCH_HASH) \ + include/linux/path.h \ + include/linux/list_lru.h \ + include/linux/shrinker.h \ + $(wildcard include/config/SHRINKER_DEBUG) \ + include/linux/xarray.h \ + $(wildcard include/config/XARRAY_MULTI) \ + include/linux/sched/mm.h \ + $(wildcard include/config/MMU_LAZY_TLB_REFCOUNT) \ + $(wildcard include/config/ARCH_HAS_MEMBARRIER_CALLBACKS) \ + include/linux/sync_core.h \ + $(wildcard include/config/ARCH_HAS_SYNC_CORE_BEFORE_USERMODE) \ + include/linux/radix-tree.h \ + include/linux/capability.h \ + include/uapi/linux/capability.h \ + include/linux/semaphore.h \ + include/linux/fcntl.h \ + $(wildcard include/config/ARCH_32BIT_OFF_T) \ + include/uapi/linux/fcntl.h \ + arch/arm64/include/uapi/asm/fcntl.h \ + include/uapi/asm-generic/fcntl.h \ + include/uapi/linux/openat2.h \ + include/linux/migrate_mode.h \ + include/linux/percpu-rwsem.h \ + include/linux/rcuwait.h \ + include/linux/sched/signal.h \ + $(wildcard include/config/SCHED_AUTOGROUP) \ + $(wildcard include/config/BSD_PROCESS_ACCT) \ + $(wildcard include/config/TASKSTATS) \ + include/linux/signal.h \ + $(wildcard include/config/DYNAMIC_SIGFRAME) \ + $(wildcard include/config/PROC_FS) \ + include/linux/sched/jobctl.h \ + include/linux/sched/task.h \ + $(wildcard include/config/HAVE_EXIT_THREAD) \ + $(wildcard include/config/ARCH_WANTS_DYNAMIC_TASK_STRUCT) \ + $(wildcard include/config/HAVE_ARCH_THREAD_STRUCT_WHITELIST) \ + include/linux/uaccess.h \ + $(wildcard include/config/ARCH_HAS_SUBPAGE_FAULTS) \ + include/linux/fault-inject-usercopy.h \ + $(wildcard include/config/FAULT_INJECTION_USERCOPY) \ + arch/arm64/include/asm/uaccess.h \ + arch/arm64/include/asm/kernel-pgtable.h \ + arch/arm64/include/asm/asm-extable.h \ + arch/arm64/include/asm/mte.h \ + arch/arm64/include/asm/extable.h \ + $(wildcard include/config/BPF_JIT) \ + include/asm-generic/access_ok.h \ + $(wildcard include/config/ALTERNATE_USER_ADDRESS_SPACE) \ + include/linux/cred.h \ + include/linux/key.h \ + $(wildcard include/config/KEY_NOTIFICATIONS) \ + $(wildcard include/config/NET) \ + include/linux/assoc_array.h \ + $(wildcard include/config/ASSOCIATIVE_ARRAY) \ + include/linux/sched/user.h \ + $(wildcard include/config/VFIO_PCI_ZDEV_KVM) \ + $(wildcard include/config/IOMMUFD) \ + $(wildcard include/config/WATCH_QUEUE) \ + include/linux/ratelimit.h \ + include/linux/rcu_sync.h \ + include/linux/delayed_call.h \ + include/linux/uuid.h \ + include/linux/errseq.h \ + include/linux/ioprio.h \ + include/linux/sched/rt.h \ + include/linux/iocontext.h \ + $(wildcard include/config/BLK_ICQ) \ + include/uapi/linux/ioprio.h \ + include/linux/fs_types.h \ + include/linux/mount.h \ + include/linux/mnt_idmapping.h \ + include/linux/slab.h \ + $(wildcard include/config/DEBUG_SLAB) \ + $(wildcard include/config/SLUB_TINY) \ + $(wildcard include/config/FAILSLAB) \ + $(wildcard include/config/KFENCE) \ + $(wildcard include/config/SLAB) \ + $(wildcard include/config/SLUB) \ + include/linux/percpu-refcount.h \ + include/linux/kasan.h \ + $(wildcard include/config/KASAN_STACK) \ + $(wildcard include/config/KASAN_VMALLOC) \ + include/uapi/linux/fs.h \ + include/linux/quota.h \ + $(wildcard include/config/QUOTA_NETLINK_INTERFACE) \ + include/uapi/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/projid.h \ + include/uapi/linux/quota.h \ + include/linux/kobject.h \ + $(wildcard include/config/UEVENT_HELPER) \ + $(wildcard include/config/DEBUG_KOBJECT_RELEASE) \ + include/linux/sysfs.h \ + include/linux/kernfs.h \ + $(wildcard include/config/KERNFS) \ + include/linux/idr.h \ + include/linux/kobject_ns.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/ALPHA) \ + $(wildcard include/config/PPC64) \ + include/linux/rbtree_latch.h \ + include/linux/error-injection.h \ + include/asm-generic/error-injection.h \ + include/linux/tracepoint-defs.h \ + arch/arm64/include/asm/module.h \ + $(wildcard include/config/DYNAMIC_FTRACE) \ + include/asm-generic/module.h \ + $(wildcard include/config/HAVE_MOD_ARCH_SPECIFIC) \ + $(wildcard include/config/MODULES_USE_ELF_REL) \ + $(wildcard include/config/MODULES_USE_ELF_RELA) \ + include/linux/build-salt.h \ + $(wildcard include/config/BUILD_SALT) \ + include/linux/elfnote.h \ + include/linux/elfnote-lto.h \ + include/linux/export-internal.h \ + $(wildcard include/config/PARISC) \ + include/linux/vermagic.h \ + $(wildcard include/config/PREEMPT_BUILD) \ + include/generated/utsrelease.h \ + arch/arm64/include/asm/vermagic.h \ + +/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.o: $(deps_/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.o) + +$(deps_/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.o): diff --git a/W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.o.cmd b/W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.o.cmd new file mode 100644 index 000000000..dffe42c9f --- /dev/null +++ b/W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.o.cmd @@ -0,0 +1,1191 @@ +savedcmd_/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.o := gcc -Wp,-MMD,/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/.kvm_ivshmem.o.d -nostdinc -I./arch/arm64/include -I./arch/arm64/include/generated -I./include -I./arch/arm64/include/uapi -I./arch/arm64/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/compiler-version.h -include ./include/linux/kconfig.h -include ./include/linux/compiler_types.h -D__KERNEL__ -mlittle-endian -DCC_USING_PATCHABLE_FUNCTION_ENTRY -DKASAN_SHADOW_SCALE_SHIFT= -fmacro-prefix-map=./= -std=gnu11 -fshort-wchar -funsigned-char -fno-common -fno-PIE -fno-strict-aliasing -mgeneral-regs-only -DCONFIG_CC_HAS_K_CONSTRAINT=1 -Wno-psabi -mabi=lp64 -fno-asynchronous-unwind-tables -fno-unwind-tables -mbranch-protection=pac-ret -Wa,-march=armv8.5-a -DARM64_ASM_ARCH='"armv8.5-a"' -DKASAN_SHADOW_SCALE_SHIFT= -fno-delete-null-pointer-checks -O2 -fno-allow-store-data-races -fstack-protector-strong -fno-omit-frame-pointer -fno-optimize-sibling-calls -ftrivial-auto-var-init=zero -fno-stack-clash-protection -fpatchable-function-entry=4,2 -falign-functions=8 -fno-strict-overflow -fno-stack-check -fconserve-stack -Wall -Wundef -Werror=implicit-function-declaration -Werror=implicit-int -Werror=return-type -Werror=strict-prototypes -Wno-format-security -Wno-trigraphs -Wno-frame-address -Wno-address-of-packed-member -Wframe-larger-than=2048 -Wno-main -Wno-unused-but-set-variable -Wno-unused-const-variable -Wno-dangling-pointer -Wvla -Wno-pointer-sign -Wcast-function-type -Wno-array-bounds -Wno-alloc-size-larger-than -Wimplicit-fallthrough=5 -Werror=date-time -Werror=incompatible-pointer-types -Werror=designated-init -Wenum-conversion -Wno-unused-but-set-variable -Wno-unused-const-variable -Wno-restrict -Wno-packed-not-aligned -Wno-format-overflow -Wno-format-truncation -Wno-stringop-overflow -Wno-stringop-truncation -Wno-missing-field-initializers -Wno-type-limits -Wno-shift-negative-value -Wno-maybe-uninitialized -Wno-sign-compare -mstack-protector-guard=sysreg -mstack-protector-guard-reg=sp_el0 -mstack-protector-guard-offset=1416 -DMODULE -DKBUILD_BASENAME='"kvm_ivshmem"' -DKBUILD_MODNAME='"kvm_ivshmem"' -D__KBUILD_MODNAME=kmod_kvm_ivshmem -c -o /home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.o /home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.c + +source_/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.o := /home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.c + +deps_/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.o := \ + $(wildcard include/config/KVM_IVSHMEM_VM_COUNT) \ + include/linux/compiler-version.h \ + $(wildcard include/config/CC_VERSION_TEXT) \ + include/linux/kconfig.h \ + $(wildcard include/config/CPU_BIG_ENDIAN) \ + $(wildcard include/config/BOOGER) \ + $(wildcard include/config/FOO) \ + include/linux/compiler_types.h \ + $(wildcard include/config/DEBUG_INFO_BTF) \ + $(wildcard include/config/PAHOLE_HAS_BTF_TAG) \ + $(wildcard include/config/FUNCTION_ALIGNMENT) \ + $(wildcard include/config/CC_IS_GCC) \ + $(wildcard include/config/X86_64) \ + $(wildcard include/config/ARM64) \ + $(wildcard include/config/HAVE_ARCH_COMPILER_H) \ + $(wildcard include/config/CC_HAS_ASM_INLINE) \ + include/linux/compiler_attributes.h \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/RETPOLINE) \ + $(wildcard include/config/GCC_ASM_GOTO_OUTPUT_WORKAROUND) \ + $(wildcard include/config/ARCH_USE_BUILTIN_BSWAP) \ + $(wildcard include/config/SHADOW_CALL_STACK) \ + $(wildcard include/config/KCOV) \ + arch/arm64/include/asm/compiler.h \ + $(wildcard include/config/ARM64_PTR_AUTH_KERNEL) \ + $(wildcard include/config/ARM64_PTR_AUTH) \ + $(wildcard include/config/BUILTIN_RETURN_ADDRESS_STRIPS_PAC) \ + /home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.h \ + include/linux/fcntl.h \ + $(wildcard include/config/ARCH_32BIT_OFF_T) \ + include/linux/stat.h \ + arch/arm64/include/asm/stat.h \ + $(wildcard include/config/COMPAT) \ + arch/arm64/include/generated/uapi/asm/stat.h \ + include/uapi/asm-generic/stat.h \ + arch/arm64/include/uapi/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + $(wildcard include/config/64BIT) \ + include/uapi/asm-generic/bitsperlong.h \ + include/linux/time.h \ + $(wildcard include/config/POSIX_TIMERS) \ + include/linux/cache.h \ + $(wildcard include/config/SMP) \ + $(wildcard include/config/ARCH_HAS_CACHE_LINE_SIZE) \ + include/uapi/linux/kernel.h \ + include/uapi/linux/sysinfo.h \ + include/linux/types.h \ + $(wildcard include/config/HAVE_UID16) \ + $(wildcard include/config/UID16) \ + $(wildcard include/config/ARCH_DMA_ADDR_T_64BIT) \ + $(wildcard include/config/PHYS_ADDR_T_64BIT) \ + $(wildcard include/config/ARCH_32BIT_USTAT_F_TINODE) \ + include/uapi/linux/types.h \ + arch/arm64/include/generated/uapi/asm/types.h \ + include/uapi/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + include/uapi/asm-generic/int-ll64.h \ + include/uapi/linux/posix_types.h \ + include/linux/stddef.h \ + include/uapi/linux/stddef.h \ + arch/arm64/include/uapi/asm/posix_types.h \ + include/uapi/asm-generic/posix_types.h \ + include/linux/const.h \ + include/vdso/const.h \ + include/uapi/linux/const.h \ + arch/arm64/include/asm/cache.h \ + $(wildcard include/config/KASAN_SW_TAGS) \ + $(wildcard include/config/KASAN_HW_TAGS) \ + include/linux/bitops.h \ + include/linux/bits.h \ + include/vdso/bits.h \ + include/linux/build_bug.h \ + include/linux/compiler.h \ + $(wildcard include/config/TRACE_BRANCH_PROFILING) \ + $(wildcard include/config/PROFILE_ALL_BRANCHES) \ + $(wildcard include/config/OBJTOOL) \ + arch/arm64/include/asm/rwonce.h \ + $(wildcard include/config/LTO) \ + $(wildcard include/config/AS_HAS_LDAPR) \ + include/asm-generic/rwonce.h \ + include/linux/kasan-checks.h \ + $(wildcard include/config/KASAN_GENERIC) \ + include/linux/kcsan-checks.h \ + $(wildcard include/config/KCSAN) \ + $(wildcard include/config/KCSAN_WEAK_MEMORY) \ + $(wildcard include/config/KCSAN_IGNORE_ATOMICS) \ + include/linux/typecheck.h \ + include/asm-generic/bitops/generic-non-atomic.h \ + arch/arm64/include/asm/barrier.h \ + $(wildcard include/config/ARM64_PSEUDO_NMI) \ + arch/arm64/include/asm/alternative-macros.h \ + arch/arm64/include/asm/cpucaps.h \ + $(wildcard include/config/ARM64_PAN) \ + $(wildcard include/config/ARM64_EPAN) \ + $(wildcard include/config/ARM64_SVE) \ + $(wildcard include/config/ARM64_SME) \ + $(wildcard include/config/ARM64_CNP) \ + $(wildcard include/config/ARM64_MTE) \ + $(wildcard include/config/ARM64_BTI) \ + $(wildcard include/config/ARM64_TLB_RANGE) \ + $(wildcard include/config/UNMAP_KERNEL_AT_EL0) \ + $(wildcard include/config/ARM64_ERRATUM_843419) \ + $(wildcard include/config/ARM64_ERRATUM_1742098) \ + $(wildcard include/config/ARM64_ERRATUM_2645198) \ + $(wildcard include/config/ARM64_ERRATUM_2658417) \ + $(wildcard include/config/CAVIUM_ERRATUM_23154) \ + $(wildcard include/config/NVIDIA_CARMEL_CNP_ERRATUM) \ + $(wildcard include/config/ARM64_WORKAROUND_REPEAT_TLBI) \ + arch/arm64/include/generated/asm/cpucap-defs.h \ + arch/arm64/include/asm/insn-def.h \ + arch/arm64/include/asm/brk-imm.h \ + include/linux/stringify.h \ + include/asm-generic/barrier.h \ + arch/arm64/include/asm/bitops.h \ + include/asm-generic/bitops/builtin-__ffs.h \ + include/asm-generic/bitops/builtin-ffs.h \ + include/asm-generic/bitops/builtin-__fls.h \ + include/asm-generic/bitops/builtin-fls.h \ + include/asm-generic/bitops/ffz.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/atomic.h \ + include/linux/atomic.h \ + arch/arm64/include/asm/atomic.h \ + arch/arm64/include/asm/cmpxchg.h \ + arch/arm64/include/asm/lse.h \ + $(wildcard include/config/ARM64_LSE_ATOMICS) \ + arch/arm64/include/asm/atomic_ll_sc.h \ + $(wildcard include/config/CC_HAS_K_CONSTRAINT) \ + include/linux/export.h \ + $(wildcard include/config/MODVERSIONS) \ + include/linux/linkage.h \ + $(wildcard include/config/ARCH_USE_SYM_ANNOTATIONS) \ + arch/arm64/include/asm/linkage.h \ + arch/arm64/include/asm/alternative.h \ + $(wildcard include/config/MODULES) \ + include/linux/init.h \ + $(wildcard include/config/HAVE_ARCH_PREL32_RELOCATIONS) \ + $(wildcard include/config/STRICT_KERNEL_RWX) \ + $(wildcard include/config/STRICT_MODULE_RWX) \ + $(wildcard include/config/LTO_CLANG) \ + arch/arm64/include/asm/atomic_lse.h \ + include/linux/atomic/atomic-arch-fallback.h \ + $(wildcard include/config/GENERIC_ATOMIC64) \ + include/linux/atomic/atomic-long.h \ + include/linux/atomic/atomic-instrumented.h \ + include/linux/instrumented.h \ + include/linux/kmsan-checks.h \ + $(wildcard include/config/KMSAN) \ + include/asm-generic/bitops/instrumented-atomic.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/instrumented-lock.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/non-instrumented-non-atomic.h \ + include/asm-generic/bitops/le.h \ + arch/arm64/include/uapi/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/uapi/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + include/uapi/linux/swab.h \ + arch/arm64/include/generated/uapi/asm/swab.h \ + include/uapi/asm-generic/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/kasan-enabled.h \ + $(wildcard include/config/KASAN) \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/JUMP_LABEL) \ + $(wildcard include/config/HAVE_ARCH_JUMP_LABEL_RELATIVE) \ + arch/arm64/include/asm/jump_label.h \ + arch/arm64/include/asm/insn.h \ + arch/arm64/include/asm/cputype.h \ + arch/arm64/include/asm/sysreg.h \ + $(wildcard include/config/BROKEN_GAS_INST) \ + $(wildcard include/config/ARM64_PA_BITS_52) \ + $(wildcard include/config/ARM64_4K_PAGES) \ + $(wildcard include/config/ARM64_16K_PAGES) \ + $(wildcard include/config/ARM64_64K_PAGES) \ + include/linux/kasan-tags.h \ + arch/arm64/include/asm/gpr-num.h \ + arch/arm64/include/generated/asm/sysreg-defs.h \ + include/linux/bitfield.h \ + arch/arm64/include/asm/mte-def.h \ + include/linux/math64.h \ + $(wildcard include/config/ARCH_SUPPORTS_INT128) \ + include/linux/math.h \ + arch/arm64/include/generated/asm/div64.h \ + include/asm-generic/div64.h \ + include/vdso/math64.h \ + include/linux/time64.h \ + include/vdso/time64.h \ + include/uapi/linux/time.h \ + include/uapi/linux/time_types.h \ + include/linux/time32.h \ + include/linux/timex.h \ + include/uapi/linux/timex.h \ + include/uapi/linux/param.h \ + arch/arm64/include/uapi/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/HZ) \ + include/uapi/asm-generic/param.h \ + arch/arm64/include/asm/timex.h \ + arch/arm64/include/asm/arch_timer.h \ + $(wildcard include/config/ARM_ARCH_TIMER_OOL_WORKAROUND) \ + arch/arm64/include/asm/hwcap.h \ + arch/arm64/include/uapi/asm/hwcap.h \ + arch/arm64/include/asm/cpufeature.h \ + $(wildcard include/config/ARM64_SW_TTBR0_PAN) \ + $(wildcard include/config/ARM64_DEBUG_PRIORITY_MASKING) \ + $(wildcard include/config/ARM64_BTI_KERNEL) \ + $(wildcard include/config/ARM64_PA_BITS) \ + $(wildcard include/config/ARM64_HW_AFDBM) \ + $(wildcard include/config/ARM64_AMU_EXTN) \ + include/linux/bug.h \ + $(wildcard include/config/GENERIC_BUG) \ + $(wildcard include/config/BUG_ON_DATA_CORRUPTION) \ + arch/arm64/include/asm/bug.h \ + arch/arm64/include/asm/asm-bug.h \ + $(wildcard include/config/DEBUG_BUGVERBOSE) \ + include/asm-generic/bug.h \ + $(wildcard include/config/BUG) \ + $(wildcard include/config/GENERIC_BUG_RELATIVE_POINTERS) \ + include/linux/instrumentation.h \ + $(wildcard include/config/NOINSTR_VALIDATION) \ + include/linux/once_lite.h \ + include/linux/panic.h \ + $(wildcard include/config/PANIC_TIMEOUT) \ + include/linux/printk.h \ + $(wildcard include/config/MESSAGE_LOGLEVEL_DEFAULT) \ + $(wildcard include/config/CONSOLE_LOGLEVEL_DEFAULT) \ + $(wildcard include/config/CONSOLE_LOGLEVEL_QUIET) \ + $(wildcard include/config/EARLY_PRINTK) \ + $(wildcard include/config/PRINTK) \ + $(wildcard include/config/PRINTK_INDEX) \ + $(wildcard include/config/DYNAMIC_DEBUG) \ + $(wildcard include/config/DYNAMIC_DEBUG_CORE) \ + include/linux/stdarg.h \ + include/linux/kern_levels.h \ + include/linux/ratelimit_types.h \ + include/linux/spinlock_types_raw.h \ + $(wildcard include/config/DEBUG_SPINLOCK) \ + $(wildcard include/config/DEBUG_LOCK_ALLOC) \ + arch/arm64/include/asm/spinlock_types.h \ + include/asm-generic/qspinlock_types.h \ + $(wildcard include/config/NR_CPUS) \ + include/asm-generic/qrwlock_types.h \ + include/linux/lockdep_types.h \ + $(wildcard include/config/PROVE_RAW_LOCK_NESTING) \ + $(wildcard include/config/LOCKDEP) \ + $(wildcard include/config/LOCK_STAT) \ + include/linux/dynamic_debug.h \ + include/linux/kernel.h \ + $(wildcard include/config/PREEMPT_VOLUNTARY_BUILD) \ + $(wildcard include/config/PREEMPT_DYNAMIC) \ + $(wildcard include/config/HAVE_PREEMPT_DYNAMIC_CALL) \ + $(wildcard include/config/HAVE_PREEMPT_DYNAMIC_KEY) \ + $(wildcard include/config/PREEMPT_) \ + $(wildcard include/config/DEBUG_ATOMIC_SLEEP) \ + $(wildcard include/config/MMU) \ + $(wildcard include/config/PROVE_LOCKING) \ + $(wildcard include/config/TRACING) \ + $(wildcard include/config/FTRACE_MCOUNT_RECORD) \ + include/linux/align.h \ + include/linux/array_size.h \ + include/linux/limits.h \ + include/uapi/linux/limits.h \ + include/vdso/limits.h \ + include/linux/container_of.h \ + include/linux/hex.h \ + include/linux/kstrtox.h \ + include/linux/log2.h \ + $(wildcard include/config/ARCH_HAS_ILOG2_U32) \ + $(wildcard include/config/ARCH_HAS_ILOG2_U64) \ + include/linux/minmax.h \ + include/linux/sprintf.h \ + include/linux/static_call_types.h \ + $(wildcard include/config/HAVE_STATIC_CALL) \ + $(wildcard include/config/HAVE_STATIC_CALL_INLINE) \ + include/linux/instruction_pointer.h \ + include/linux/cpumask.h \ + $(wildcard include/config/FORCE_NR_CPUS) \ + $(wildcard include/config/HOTPLUG_CPU) \ + $(wildcard include/config/DEBUG_PER_CPU_MAPS) \ + $(wildcard include/config/CPUMASK_OFFSTACK) \ + include/linux/threads.h \ + $(wildcard include/config/BASE_SMALL) \ + include/linux/bitmap.h \ + include/linux/errno.h \ + include/uapi/linux/errno.h \ + arch/arm64/include/generated/uapi/asm/errno.h \ + include/uapi/asm-generic/errno.h \ + include/uapi/asm-generic/errno-base.h \ + include/linux/find.h \ + include/linux/string.h \ + $(wildcard include/config/BINARY_PRINTF) \ + $(wildcard include/config/FORTIFY_SOURCE) \ + include/linux/err.h \ + include/linux/overflow.h \ + include/uapi/linux/string.h \ + arch/arm64/include/asm/string.h \ + $(wildcard include/config/ARCH_HAS_UACCESS_FLUSHCACHE) \ + include/linux/fortify-string.h \ + include/linux/bitmap-str.h \ + include/linux/gfp_types.h \ + include/linux/numa.h \ + $(wildcard include/config/NODES_SHIFT) \ + $(wildcard include/config/NUMA_KEEP_MEMINFO) \ + $(wildcard include/config/NUMA) \ + $(wildcard include/config/HAVE_ARCH_NODE_DEV_GROUP) \ + arch/arm64/include/asm/sparsemem.h \ + include/linux/smp.h \ + $(wildcard include/config/UP_LATE_INIT) \ + $(wildcard include/config/DEBUG_PREEMPT) \ + include/linux/list.h \ + $(wildcard include/config/LIST_HARDENED) \ + $(wildcard include/config/DEBUG_LIST) \ + include/linux/poison.h \ + $(wildcard include/config/ILLEGAL_POINTER_VALUE) \ + include/linux/smp_types.h \ + include/linux/llist.h \ + $(wildcard include/config/ARCH_HAVE_NMI_SAFE_CMPXCHG) \ + include/linux/preempt.h \ + $(wildcard include/config/PREEMPT_RT) \ + $(wildcard include/config/PREEMPT_COUNT) \ + $(wildcard include/config/TRACE_PREEMPT_TOGGLE) \ + $(wildcard include/config/PREEMPTION) \ + $(wildcard include/config/PREEMPT_NOTIFIERS) \ + include/linux/cleanup.h \ + arch/arm64/include/asm/preempt.h \ + include/linux/thread_info.h \ + $(wildcard include/config/THREAD_INFO_IN_TASK) \ + $(wildcard include/config/GENERIC_ENTRY) \ + $(wildcard include/config/HAVE_ARCH_WITHIN_STACK_FRAMES) \ + $(wildcard include/config/HARDENED_USERCOPY) \ + $(wildcard include/config/SH) \ + include/linux/restart_block.h \ + arch/arm64/include/asm/current.h \ + arch/arm64/include/asm/thread_info.h \ + arch/arm64/include/asm/memory.h \ + $(wildcard include/config/ARM64_VA_BITS) \ + $(wildcard include/config/KASAN_SHADOW_OFFSET) \ + $(wildcard include/config/VMAP_STACK) \ + $(wildcard include/config/RANDOMIZE_BASE) \ + $(wildcard include/config/DEBUG_VIRTUAL) \ + $(wildcard include/config/EFI) \ + $(wildcard include/config/ARM_GIC_V3_ITS) \ + include/linux/sizes.h \ + arch/arm64/include/asm/page-def.h \ + $(wildcard include/config/ARM64_PAGE_SHIFT) \ + include/linux/mmdebug.h \ + $(wildcard include/config/DEBUG_VM) \ + $(wildcard include/config/DEBUG_VM_IRQSOFF) \ + $(wildcard include/config/DEBUG_VM_PGFLAGS) \ + arch/arm64/include/asm/boot.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/FLATMEM) \ + $(wildcard include/config/SPARSEMEM_VMEMMAP) \ + $(wildcard include/config/SPARSEMEM) \ + include/linux/pfn.h \ + arch/arm64/include/asm/stack_pointer.h \ + arch/arm64/include/asm/smp.h \ + $(wildcard include/config/ARM64_ACPI_PARKING_PROTOCOL) \ + arch/arm64/include/asm/percpu.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/HAVE_SETUP_PER_CPU_AREA) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/DEBUG_FORCE_WEAK_PER_CPU) \ + $(wildcard include/config/AMD_MEM_ENCRYPT) \ + include/clocksource/arm_arch_timer.h \ + $(wildcard include/config/ARM_ARCH_TIMER) \ + include/linux/timecounter.h \ + include/asm-generic/timex.h \ + include/vdso/time32.h \ + include/vdso/time.h \ + arch/arm64/include/asm/compat.h \ + include/asm-generic/compat.h \ + $(wildcard include/config/COMPAT_FOR_U64_ALIGNMENT) \ + include/linux/sched.h \ + $(wildcard include/config/VIRT_CPU_ACCOUNTING_NATIVE) \ + $(wildcard include/config/SCHED_INFO) \ + $(wildcard include/config/SCHEDSTATS) \ + $(wildcard include/config/SCHED_CORE) \ + $(wildcard include/config/FAIR_GROUP_SCHED) \ + $(wildcard include/config/RT_GROUP_SCHED) \ + $(wildcard include/config/RT_MUTEXES) \ + $(wildcard include/config/UCLAMP_TASK) \ + $(wildcard include/config/UCLAMP_BUCKETS_COUNT) \ + $(wildcard include/config/KMAP_LOCAL) \ + $(wildcard include/config/CGROUP_SCHED) \ + $(wildcard include/config/BLK_DEV_IO_TRACE) \ + $(wildcard include/config/PREEMPT_RCU) \ + $(wildcard include/config/TASKS_RCU) \ + $(wildcard include/config/TASKS_TRACE_RCU) \ + $(wildcard include/config/MEMCG) \ + $(wildcard include/config/LRU_GEN) \ + $(wildcard include/config/COMPAT_BRK) \ + $(wildcard include/config/CGROUPS) \ + $(wildcard include/config/BLK_CGROUP) \ + $(wildcard include/config/PSI) \ + $(wildcard include/config/PAGE_OWNER) \ + $(wildcard include/config/EVENTFD) \ + $(wildcard include/config/IOMMU_SVA) \ + $(wildcard include/config/CPU_SUP_INTEL) \ + $(wildcard include/config/TASK_DELAY_ACCT) \ + $(wildcard include/config/STACKPROTECTOR) \ + $(wildcard include/config/ARCH_HAS_SCALED_CPUTIME) \ + $(wildcard include/config/VIRT_CPU_ACCOUNTING_GEN) \ + $(wildcard include/config/NO_HZ_FULL) \ + $(wildcard include/config/POSIX_CPUTIMERS) \ + $(wildcard include/config/POSIX_CPU_TIMERS_TASK_WORK) \ + $(wildcard include/config/KEYS) \ + $(wildcard include/config/SYSVIPC) \ + $(wildcard include/config/DETECT_HUNG_TASK) \ + $(wildcard include/config/IO_URING) \ + $(wildcard include/config/AUDIT) \ + $(wildcard include/config/AUDITSYSCALL) \ + $(wildcard include/config/DEBUG_MUTEXES) \ + $(wildcard include/config/TRACE_IRQFLAGS) \ + $(wildcard include/config/UBSAN) \ + $(wildcard include/config/UBSAN_TRAP) \ + $(wildcard include/config/COMPACTION) \ + $(wildcard include/config/TASK_XACCT) \ + $(wildcard include/config/CPUSETS) \ + $(wildcard include/config/X86_CPU_RESCTRL) \ + $(wildcard include/config/FUTEX) \ + $(wildcard include/config/PERF_EVENTS) \ + $(wildcard include/config/NUMA_BALANCING) \ + $(wildcard include/config/RSEQ) \ + $(wildcard include/config/SCHED_MM_CID) \ + $(wildcard include/config/FAULT_INJECTION) \ + $(wildcard include/config/LATENCYTOP) \ + $(wildcard include/config/KUNIT) \ + $(wildcard include/config/FUNCTION_GRAPH_TRACER) \ + $(wildcard include/config/MEMCG_KMEM) \ + $(wildcard include/config/UPROBES) \ + $(wildcard include/config/BCACHE) \ + $(wildcard include/config/LIVEPATCH) \ + $(wildcard include/config/SECURITY) \ + $(wildcard include/config/BPF_SYSCALL) \ + $(wildcard include/config/GCC_PLUGIN_STACKLEAK) \ + $(wildcard include/config/X86_MCE) \ + $(wildcard include/config/KRETPROBES) \ + $(wildcard include/config/RETHOOK) \ + $(wildcard include/config/ARCH_HAS_PARANOID_L1D_FLUSH) \ + $(wildcard include/config/RV) \ + $(wildcard include/config/USER_EVENTS) \ + $(wildcard include/config/ARCH_TASK_STRUCT_ON_STACK) \ + $(wildcard include/config/PREEMPT_NONE) \ + $(wildcard include/config/PREEMPT_VOLUNTARY) \ + $(wildcard include/config/PREEMPT) \ + $(wildcard include/config/DEBUG_RSEQ) \ + include/uapi/linux/sched.h \ + include/linux/pid.h \ + include/linux/rculist.h \ + $(wildcard include/config/PROVE_RCU_LIST) \ + include/linux/rcupdate.h \ + $(wildcard include/config/TINY_RCU) \ + $(wildcard include/config/RCU_STRICT_GRACE_PERIOD) \ + $(wildcard include/config/RCU_LAZY) \ + $(wildcard include/config/TASKS_RCU_GENERIC) \ + $(wildcard include/config/RCU_STALL_COMMON) \ + $(wildcard include/config/KVM_XFER_TO_GUEST_WORK) \ + $(wildcard include/config/RCU_NOCB_CPU) \ + $(wildcard include/config/TASKS_RUDE_RCU) \ + $(wildcard include/config/TREE_RCU) \ + $(wildcard include/config/DEBUG_OBJECTS_RCU_HEAD) \ + $(wildcard include/config/PROVE_RCU) \ + $(wildcard include/config/ARCH_WEAK_RELEASE_ACQUIRE) \ + include/linux/irqflags.h \ + $(wildcard include/config/IRQSOFF_TRACER) \ + $(wildcard include/config/PREEMPT_TRACER) \ + $(wildcard include/config/DEBUG_IRQFLAGS) \ + $(wildcard include/config/TRACE_IRQFLAGS_SUPPORT) \ + arch/arm64/include/asm/irqflags.h \ + arch/arm64/include/asm/ptrace.h \ + arch/arm64/include/uapi/asm/ptrace.h \ + arch/arm64/include/uapi/asm/sve_context.h \ + include/linux/bottom_half.h \ + include/linux/lockdep.h \ + $(wildcard include/config/DEBUG_LOCKING_API_SELFTESTS) \ + arch/arm64/include/asm/processor.h \ + $(wildcard include/config/KUSER_HELPERS) \ + $(wildcard include/config/ARM64_FORCE_52BIT) \ + $(wildcard include/config/HAVE_HW_BREAKPOINT) \ + $(wildcard include/config/ARM64_TAGGED_ADDR_ABI) \ + include/vdso/processor.h \ + arch/arm64/include/asm/vdso/processor.h \ + arch/arm64/include/asm/hw_breakpoint.h \ + $(wildcard include/config/CPU_PM) \ + arch/arm64/include/asm/virt.h \ + $(wildcard include/config/KVM) \ + arch/arm64/include/asm/sections.h \ + include/asm-generic/sections.h \ + $(wildcard include/config/HAVE_FUNCTION_DESCRIPTORS) \ + arch/arm64/include/asm/kasan.h \ + arch/arm64/include/asm/mte-kasan.h \ + arch/arm64/include/asm/pgtable-types.h \ + $(wildcard include/config/PGTABLE_LEVELS) \ + include/asm-generic/pgtable-nop4d.h \ + arch/arm64/include/asm/pgtable-hwdef.h \ + $(wildcard include/config/ARM64_CONT_PTE_SHIFT) \ + $(wildcard include/config/ARM64_CONT_PMD_SHIFT) \ + $(wildcard include/config/ARM64_VA_BITS_52) \ + arch/arm64/include/asm/pointer_auth.h \ + include/uapi/linux/prctl.h \ + include/linux/random.h \ + $(wildcard include/config/VMGENID) \ + include/uapi/linux/random.h \ + include/uapi/linux/ioctl.h \ + arch/arm64/include/generated/uapi/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + include/uapi/asm-generic/ioctl.h \ + include/linux/irqnr.h \ + include/uapi/linux/irqnr.h \ + include/linux/prandom.h \ + include/linux/once.h \ + include/linux/percpu.h \ + $(wildcard include/config/RANDOM_KMALLOC_CACHES) \ + $(wildcard include/config/NEED_PER_CPU_PAGE_FIRST_CHUNK) \ + arch/arm64/include/asm/spectre.h \ + arch/arm64/include/asm/fpsimd.h \ + arch/arm64/include/uapi/asm/sigcontext.h \ + include/linux/context_tracking_irq.h \ + $(wildcard include/config/CONTEXT_TRACKING_IDLE) \ + include/linux/rcutree.h \ + include/linux/wait.h \ + include/linux/spinlock.h \ + arch/arm64/include/generated/asm/mmiowb.h \ + include/asm-generic/mmiowb.h \ + $(wildcard include/config/MMIOWB) \ + include/linux/spinlock_types.h \ + include/linux/rwlock_types.h \ + arch/arm64/include/asm/spinlock.h \ + arch/arm64/include/generated/asm/qspinlock.h \ + include/asm-generic/qspinlock.h \ + arch/arm64/include/generated/asm/qrwlock.h \ + include/asm-generic/qrwlock.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_smp.h \ + $(wildcard include/config/INLINE_SPIN_LOCK) \ + $(wildcard include/config/INLINE_SPIN_LOCK_BH) \ + $(wildcard include/config/INLINE_SPIN_LOCK_IRQ) \ + $(wildcard include/config/INLINE_SPIN_LOCK_IRQSAVE) \ + $(wildcard include/config/INLINE_SPIN_TRYLOCK) \ + $(wildcard include/config/INLINE_SPIN_TRYLOCK_BH) \ + $(wildcard include/config/UNINLINE_SPIN_UNLOCK) \ + $(wildcard include/config/INLINE_SPIN_UNLOCK_BH) \ + $(wildcard include/config/INLINE_SPIN_UNLOCK_IRQ) \ + $(wildcard include/config/INLINE_SPIN_UNLOCK_IRQRESTORE) \ + $(wildcard include/config/GENERIC_LOCKBREAK) \ + include/linux/rwlock_api_smp.h \ + $(wildcard include/config/INLINE_READ_LOCK) \ + $(wildcard include/config/INLINE_WRITE_LOCK) \ + $(wildcard include/config/INLINE_READ_LOCK_BH) \ + $(wildcard include/config/INLINE_WRITE_LOCK_BH) \ + $(wildcard include/config/INLINE_READ_LOCK_IRQ) \ + $(wildcard include/config/INLINE_WRITE_LOCK_IRQ) \ + $(wildcard include/config/INLINE_READ_LOCK_IRQSAVE) \ + $(wildcard include/config/INLINE_WRITE_LOCK_IRQSAVE) \ + $(wildcard include/config/INLINE_READ_TRYLOCK) \ + $(wildcard include/config/INLINE_WRITE_TRYLOCK) \ + $(wildcard include/config/INLINE_READ_UNLOCK) \ + $(wildcard include/config/INLINE_WRITE_UNLOCK) \ + $(wildcard include/config/INLINE_READ_UNLOCK_BH) \ + $(wildcard include/config/INLINE_WRITE_UNLOCK_BH) \ + $(wildcard include/config/INLINE_READ_UNLOCK_IRQ) \ + $(wildcard include/config/INLINE_WRITE_UNLOCK_IRQ) \ + $(wildcard include/config/INLINE_READ_UNLOCK_IRQRESTORE) \ + $(wildcard include/config/INLINE_WRITE_UNLOCK_IRQRESTORE) \ + include/uapi/linux/wait.h \ + include/linux/refcount.h \ + include/linux/sem.h \ + include/uapi/linux/sem.h \ + include/linux/ipc.h \ + include/linux/uidgid.h \ + $(wildcard include/config/MULTIUSER) \ + $(wildcard include/config/USER_NS) \ + include/linux/highuid.h \ + include/linux/rhashtable-types.h \ + include/linux/mutex.h \ + $(wildcard include/config/MUTEX_SPIN_ON_OWNER) \ + include/linux/osq_lock.h \ + include/linux/debug_locks.h \ + include/linux/workqueue.h \ + $(wildcard include/config/DEBUG_OBJECTS_WORK) \ + $(wildcard include/config/FREEZER) \ + $(wildcard include/config/SYSFS) \ + $(wildcard include/config/WQ_WATCHDOG) \ + include/linux/timer.h \ + $(wildcard include/config/DEBUG_OBJECTS_TIMERS) \ + include/linux/ktime.h \ + include/linux/jiffies.h \ + include/vdso/jiffies.h \ + include/generated/timeconst.h \ + include/vdso/ktime.h \ + include/linux/timekeeping.h \ + $(wildcard include/config/GENERIC_CMOS_UPDATE) \ + include/linux/clocksource_ids.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/DEBUG_OBJECTS) \ + $(wildcard include/config/DEBUG_OBJECTS_FREE) \ + include/uapi/linux/ipc.h \ + arch/arm64/include/generated/uapi/asm/ipcbuf.h \ + include/uapi/asm-generic/ipcbuf.h \ + arch/arm64/include/generated/uapi/asm/sembuf.h \ + include/uapi/asm-generic/sembuf.h \ + include/linux/shm.h \ + arch/arm64/include/asm/page.h \ + include/linux/personality.h \ + include/uapi/linux/personality.h \ + include/asm-generic/getorder.h \ + include/uapi/linux/shm.h \ + include/uapi/asm-generic/hugetlb_encode.h \ + arch/arm64/include/generated/uapi/asm/shmbuf.h \ + include/uapi/asm-generic/shmbuf.h \ + arch/arm64/include/asm/shmparam.h \ + include/asm-generic/shmparam.h \ + include/linux/kmsan_types.h \ + include/linux/plist.h \ + $(wildcard include/config/DEBUG_PLIST) \ + include/linux/hrtimer.h \ + $(wildcard include/config/HIGH_RES_TIMERS) \ + $(wildcard include/config/TIME_LOW_RES) \ + $(wildcard include/config/TIMERFD) \ + include/linux/hrtimer_defs.h \ + include/linux/rbtree.h \ + include/linux/rbtree_types.h \ + include/linux/seqlock.h \ + include/linux/timerqueue.h \ + include/linux/seccomp.h \ + $(wildcard include/config/SECCOMP) \ + $(wildcard include/config/HAVE_ARCH_SECCOMP_FILTER) \ + $(wildcard include/config/SECCOMP_FILTER) \ + $(wildcard include/config/CHECKPOINT_RESTORE) \ + $(wildcard include/config/SECCOMP_CACHE_DEBUG) \ + include/uapi/linux/seccomp.h \ + arch/arm64/include/asm/seccomp.h \ + arch/arm64/include/asm/unistd.h \ + arch/arm64/include/uapi/asm/unistd.h \ + include/uapi/asm-generic/unistd.h \ + include/asm-generic/seccomp.h \ + include/uapi/linux/unistd.h \ + include/linux/nodemask.h \ + $(wildcard include/config/HIGHMEM) \ + include/linux/resource.h \ + include/uapi/linux/resource.h \ + arch/arm64/include/generated/uapi/asm/resource.h \ + include/asm-generic/resource.h \ + include/uapi/asm-generic/resource.h \ + include/linux/latencytop.h \ + include/linux/sched/prio.h \ + include/linux/sched/types.h \ + include/linux/signal_types.h \ + $(wildcard include/config/OLD_SIGACTION) \ + include/uapi/linux/signal.h \ + arch/arm64/include/asm/signal.h \ + arch/arm64/include/uapi/asm/signal.h \ + include/asm-generic/signal.h \ + include/uapi/asm-generic/signal.h \ + include/uapi/asm-generic/signal-defs.h \ + arch/arm64/include/generated/uapi/asm/siginfo.h \ + include/uapi/asm-generic/siginfo.h \ + include/linux/syscall_user_dispatch.h \ + include/linux/mm_types_task.h \ + $(wildcard include/config/ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH) \ + $(wildcard include/config/SPLIT_PTLOCK_CPUS) \ + $(wildcard include/config/ARCH_ENABLE_SPLIT_PMD_PTLOCK) \ + arch/arm64/include/asm/tlbbatch.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/TASK_IO_ACCOUNTING) \ + include/linux/posix-timers.h \ + include/linux/alarmtimer.h \ + $(wildcard include/config/RTC_CLASS) \ + include/uapi/linux/rseq.h \ + include/linux/kcsan.h \ + include/linux/rv.h \ + $(wildcard include/config/RV_REACTORS) \ + include/linux/livepatch_sched.h \ + arch/arm64/include/generated/asm/kmap_size.h \ + include/asm-generic/kmap_size.h \ + $(wildcard include/config/DEBUG_KMAP_LOCAL) \ + include/linux/sched/task_stack.h \ + $(wildcard include/config/STACK_GROWSUP) \ + $(wildcard include/config/DEBUG_STACK_USAGE) \ + include/uapi/linux/magic.h \ + include/uapi/linux/stat.h \ + include/uapi/linux/fcntl.h \ + arch/arm64/include/uapi/asm/fcntl.h \ + include/uapi/asm-generic/fcntl.h \ + include/uapi/linux/openat2.h \ + include/linux/file.h \ + include/linux/interrupt.h \ + $(wildcard include/config/IRQ_FORCED_THREADING) \ + $(wildcard include/config/GENERIC_IRQ_PROBE) \ + $(wildcard include/config/PROC_FS) \ + $(wildcard include/config/IRQ_TIMINGS) \ + include/linux/irqreturn.h \ + include/linux/hardirq.h \ + include/linux/context_tracking_state.h \ + $(wildcard include/config/CONTEXT_TRACKING_USER) \ + $(wildcard include/config/CONTEXT_TRACKING) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/HWLAT_TRACER) \ + $(wildcard include/config/OSNOISE_TRACER) \ + include/linux/vtime.h \ + $(wildcard include/config/VIRT_CPU_ACCOUNTING) \ + $(wildcard include/config/IRQ_TIME_ACCOUNTING) \ + arch/arm64/include/asm/hardirq.h \ + arch/arm64/include/asm/irq.h \ + include/asm-generic/irq.h \ + arch/arm64/include/asm/kvm_arm.h \ + arch/arm64/include/asm/esr.h \ + include/asm-generic/hardirq.h \ + include/linux/irq.h \ + $(wildcard include/config/GENERIC_IRQ_EFFECTIVE_AFF_MASK) \ + $(wildcard include/config/GENERIC_IRQ_IPI) \ + $(wildcard include/config/IRQ_DOMAIN_HIERARCHY) \ + $(wildcard include/config/DEPRECATED_IRQ_CPU_ONOFFLINE) \ + $(wildcard include/config/GENERIC_IRQ_MIGRATION) \ + $(wildcard include/config/GENERIC_PENDING_IRQ) \ + $(wildcard include/config/HARDIRQS_SW_RESEND) \ + $(wildcard include/config/GENERIC_IRQ_LEGACY) \ + $(wildcard include/config/GENERIC_IRQ_MULTI_HANDLER) \ + include/linux/irqhandler.h \ + include/linux/topology.h \ + $(wildcard include/config/USE_PERCPU_NUMA_NODE_ID) \ + $(wildcard include/config/HAVE_MEMORYLESS_NODES) \ + $(wildcard include/config/SCHED_SMT) \ + include/linux/arch_topology.h \ + $(wildcard include/config/ACPI_CPPC_LIB) \ + $(wildcard include/config/GENERIC_ARCH_TOPOLOGY) \ + include/linux/mmzone.h \ + $(wildcard include/config/ARCH_FORCE_MAX_ORDER) \ + $(wildcard include/config/CMA) \ + $(wildcard include/config/MEMORY_ISOLATION) \ + $(wildcard include/config/ZSMALLOC) \ + $(wildcard include/config/UNACCEPTED_MEMORY) \ + $(wildcard include/config/SWAP) \ + $(wildcard include/config/TRANSPARENT_HUGEPAGE) \ + $(wildcard include/config/LRU_GEN_STATS) \ + $(wildcard include/config/ZONE_DMA) \ + $(wildcard include/config/ZONE_DMA32) \ + $(wildcard include/config/ZONE_DEVICE) \ + $(wildcard include/config/MEMORY_HOTPLUG) \ + $(wildcard include/config/MEMORY_FAILURE) \ + $(wildcard include/config/PAGE_EXTENSION) \ + $(wildcard include/config/DEFERRED_STRUCT_PAGE_INIT) \ + $(wildcard include/config/SPARSEMEM_EXTREME) \ + $(wildcard include/config/HAVE_ARCH_PFN_VALID) \ + include/linux/list_nulls.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/HUGETLB_PAGE) \ + $(wildcard include/config/HUGETLB_PAGE_SIZE_VARIABLE) \ + include/linux/page-flags-layout.h \ + include/generated/bounds.h \ + include/linux/mm_types.h \ + $(wildcard include/config/HAVE_ALIGNED_STRUCT_PAGE) \ + $(wildcard include/config/USERFAULTFD) \ + $(wildcard include/config/ANON_VMA_NAME) \ + $(wildcard include/config/PER_VMA_LOCK) \ + $(wildcard include/config/HAVE_ARCH_COMPAT_MMAP_BASES) \ + $(wildcard include/config/MEMBARRIER) \ + $(wildcard include/config/AIO) \ + $(wildcard include/config/MMU_NOTIFIER) \ + $(wildcard include/config/KSM) \ + include/linux/auxvec.h \ + include/uapi/linux/auxvec.h \ + arch/arm64/include/uapi/asm/auxvec.h \ + include/linux/kref.h \ + include/linux/maple_tree.h \ + $(wildcard include/config/MAPLE_RCU_DISABLED) \ + $(wildcard include/config/DEBUG_MAPLE_TREE) \ + include/linux/rwsem.h \ + $(wildcard include/config/RWSEM_SPIN_ON_OWNER) \ + $(wildcard include/config/DEBUG_RWSEMS) \ + include/linux/completion.h \ + include/linux/swait.h \ + include/linux/uprobes.h \ + arch/arm64/include/asm/uprobes.h \ + arch/arm64/include/asm/debug-monitors.h \ + arch/arm64/include/asm/probes.h \ + $(wildcard include/config/KPROBES) \ + include/linux/percpu_counter.h \ + arch/arm64/include/asm/mmu.h \ + include/linux/page-flags.h \ + $(wildcard include/config/ARCH_USES_PG_UNCACHED) \ + $(wildcard include/config/PAGE_IDLE_FLAG) \ + $(wildcard include/config/ARCH_USES_PG_ARCH_X) \ + $(wildcard include/config/HUGETLB_PAGE_OPTIMIZE_VMEMMAP) \ + include/linux/local_lock.h \ + include/linux/local_lock_internal.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/HAVE_ARCH_NODEDATA_EXTENSION) \ + $(wildcard include/config/ARCH_HAS_ADD_PAGES) \ + $(wildcard include/config/MEMORY_HOTREMOVE) \ + include/linux/notifier.h \ + $(wildcard include/config/TREE_SRCU) \ + include/linux/srcu.h \ + $(wildcard include/config/TINY_SRCU) \ + $(wildcard include/config/NEED_SRCU_NMI_SAFE) \ + include/linux/rcu_segcblist.h \ + include/linux/srcutree.h \ + include/linux/rcu_node_tree.h \ + $(wildcard include/config/RCU_FANOUT) \ + $(wildcard include/config/RCU_FANOUT_LEAF) \ + arch/arm64/include/asm/mmzone.h \ + arch/arm64/include/asm/numa.h \ + arch/arm64/include/asm/topology.h \ + include/asm-generic/topology.h \ + include/asm-generic/numa.h \ + include/linux/io.h \ + $(wildcard include/config/HAS_IOPORT_MAP) \ + $(wildcard include/config/PCI) \ + arch/arm64/include/asm/io.h \ + include/linux/pgtable.h \ + $(wildcard include/config/HIGHPTE) \ + $(wildcard include/config/ARCH_HAS_NONLEAF_PMD_YOUNG) \ + $(wildcard include/config/GUP_GET_PXX_LOW_HIGH) \ + $(wildcard include/config/ARCH_WANT_PMD_MKWRITE) \ + $(wildcard include/config/HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD) \ + $(wildcard include/config/HAVE_ARCH_SOFT_DIRTY) \ + $(wildcard include/config/ARCH_ENABLE_THP_MIGRATION) \ + $(wildcard include/config/ARCH_HAS_PTE_DEVMAP) \ + $(wildcard include/config/HAVE_ARCH_HUGE_VMAP) \ + $(wildcard include/config/X86_ESPFIX64) \ + arch/arm64/include/asm/pgtable.h \ + $(wildcard include/config/PAGE_TABLE_CHECK) \ + arch/arm64/include/asm/proc-fns.h \ + arch/arm64/include/asm/mte.h \ + arch/arm64/include/asm/pgtable-prot.h \ + arch/arm64/include/asm/tlbflush.h \ + include/linux/mmu_notifier.h \ + include/linux/mmap_lock.h \ + include/linux/tracepoint-defs.h \ + $(wildcard include/config/TRACEPOINTS) \ + include/linux/interval_tree.h \ + arch/arm64/include/asm/fixmap.h \ + $(wildcard include/config/ACPI_APEI_GHES) \ + $(wildcard include/config/ARM_SDE_INTERFACE) \ + $(wildcard include/config/RELOCATABLE) \ + include/asm-generic/fixmap.h \ + include/linux/page_table_check.h \ + include/asm-generic/pgtable_uffd.h \ + $(wildcard include/config/HAVE_ARCH_USERFAULTFD_WP) \ + arch/arm64/include/generated/asm/early_ioremap.h \ + include/asm-generic/early_ioremap.h \ + $(wildcard include/config/GENERIC_EARLY_IOREMAP) \ + include/asm-generic/io.h \ + $(wildcard include/config/GENERIC_IOMAP) \ + $(wildcard include/config/TRACE_MMIO_ACCESS) \ + $(wildcard include/config/GENERIC_IOREMAP) \ + include/asm-generic/pci_iomap.h \ + $(wildcard include/config/NO_GENERIC_PCI_IOPORT_MAP) \ + $(wildcard include/config/GENERIC_PCI_IOMAP) \ + include/linux/logic_pio.h \ + $(wildcard include/config/INDIRECT_PIO) \ + include/linux/fwnode.h \ + include/linux/vmalloc.h \ + $(wildcard include/config/KASAN_VMALLOC) \ + $(wildcard include/config/HAVE_ARCH_HUGE_VMALLOC) \ + arch/arm64/include/asm/vmalloc.h \ + $(wildcard include/config/PTDUMP_DEBUGFS) \ + include/linux/slab.h \ + $(wildcard include/config/DEBUG_SLAB) \ + $(wildcard include/config/SLUB_TINY) \ + $(wildcard include/config/FAILSLAB) \ + $(wildcard include/config/KFENCE) \ + $(wildcard include/config/SLAB) \ + $(wildcard include/config/SLUB) \ + include/linux/gfp.h \ + $(wildcard include/config/CONTIG_ALLOC) \ + include/linux/percpu-refcount.h \ + include/linux/hash.h \ + $(wildcard include/config/HAVE_ARCH_HASH) \ + include/linux/kasan.h \ + $(wildcard include/config/KASAN_STACK) \ + arch/arm64/include/generated/asm/irq_regs.h \ + include/asm-generic/irq_regs.h \ + include/linux/irqdesc.h \ + $(wildcard include/config/PM_SLEEP) \ + $(wildcard include/config/GENERIC_IRQ_DEBUGFS) \ + $(wildcard include/config/SPARSE_IRQ) \ + $(wildcard include/config/IRQ_DOMAIN) \ + include/linux/kobject.h \ + $(wildcard include/config/UEVENT_HELPER) \ + $(wildcard include/config/DEBUG_KOBJECT_RELEASE) \ + include/linux/sysfs.h \ + include/linux/kernfs.h \ + $(wildcard include/config/KERNFS) \ + include/linux/idr.h \ + include/linux/radix-tree.h \ + include/linux/xarray.h \ + $(wildcard include/config/XARRAY_MULTI) \ + include/linux/sched/mm.h \ + $(wildcard include/config/MMU_LAZY_TLB_REFCOUNT) \ + $(wildcard include/config/ARCH_HAS_MEMBARRIER_CALLBACKS) \ + include/linux/sync_core.h \ + $(wildcard include/config/ARCH_HAS_SYNC_CORE_BEFORE_USERMODE) \ + include/linux/kobject_ns.h \ + arch/arm64/include/generated/asm/hw_irq.h \ + include/asm-generic/hw_irq.h \ + include/linux/miscdevice.h \ + include/uapi/linux/major.h \ + include/linux/device.h \ + $(wildcard include/config/HAS_IOMEM) \ + $(wildcard include/config/GENERIC_MSI_IRQ) \ + $(wildcard include/config/ENERGY_MODEL) \ + $(wildcard include/config/PINCTRL) \ + $(wildcard include/config/DMA_OPS) \ + $(wildcard include/config/DMA_DECLARE_COHERENT) \ + $(wildcard include/config/DMA_CMA) \ + $(wildcard include/config/SWIOTLB) \ + $(wildcard include/config/SWIOTLB_DYNAMIC) \ + $(wildcard include/config/ARCH_HAS_SYNC_DMA_FOR_DEVICE) \ + $(wildcard include/config/ARCH_HAS_SYNC_DMA_FOR_CPU) \ + $(wildcard include/config/ARCH_HAS_SYNC_DMA_FOR_CPU_ALL) \ + $(wildcard include/config/DMA_OPS_BYPASS) \ + $(wildcard include/config/OF) \ + $(wildcard include/config/DEVTMPFS) \ + include/linux/dev_printk.h \ + include/linux/ratelimit.h \ + include/linux/energy_model.h \ + include/linux/sched/cpufreq.h \ + $(wildcard include/config/CPU_FREQ) \ + include/linux/sched/topology.h \ + $(wildcard include/config/SCHED_DEBUG) \ + $(wildcard include/config/SCHED_CLUSTER) \ + $(wildcard include/config/SCHED_MC) \ + $(wildcard include/config/CPU_FREQ_GOV_SCHEDUTIL) \ + include/linux/sched/idle.h \ + include/linux/sched/sd_flags.h \ + include/linux/ioport.h \ + include/linux/klist.h \ + include/linux/pm.h \ + $(wildcard include/config/VT_CONSOLE_SLEEP) \ + $(wildcard include/config/CXL_SUSPEND) \ + $(wildcard include/config/PM) \ + $(wildcard include/config/PM_CLK) \ + $(wildcard include/config/PM_GENERIC_DOMAINS) \ + include/linux/device/bus.h \ + $(wildcard include/config/ACPI) \ + include/linux/device/class.h \ + include/linux/device/driver.h \ + include/linux/module.h \ + $(wildcard include/config/MODULES_TREE_LOOKUP) \ + $(wildcard include/config/STACKTRACE_BUILD_ID) \ + $(wildcard include/config/ARCH_USES_CFI_TRAPS) \ + $(wildcard include/config/MODULE_SIG) \ + $(wildcard include/config/KALLSYMS) \ + $(wildcard include/config/BPF_EVENTS) \ + $(wildcard include/config/DEBUG_INFO_BTF_MODULES) \ + $(wildcard include/config/EVENT_TRACING) \ + $(wildcard include/config/MODULE_UNLOAD) \ + $(wildcard include/config/CONSTRUCTORS) \ + $(wildcard include/config/FUNCTION_ERROR_INJECTION) \ + include/linux/buildid.h \ + $(wildcard include/config/CRASH_CORE) \ + include/linux/kmod.h \ + include/linux/umh.h \ + include/linux/sysctl.h \ + $(wildcard include/config/SYSCTL) \ + include/uapi/linux/sysctl.h \ + include/linux/elf.h \ + $(wildcard include/config/ARCH_USE_GNU_PROPERTY) \ + $(wildcard include/config/ARCH_HAVE_ELF_PROT) \ + arch/arm64/include/asm/elf.h \ + $(wildcard include/config/COMPAT_VDSO) \ + arch/arm64/include/generated/asm/user.h \ + include/asm-generic/user.h \ + include/uapi/linux/elf.h \ + include/uapi/linux/elf-em.h \ + include/linux/fs.h \ + $(wildcard include/config/READ_ONLY_THP_FOR_FS) \ + $(wildcard include/config/FS_POSIX_ACL) \ + $(wildcard include/config/CGROUP_WRITEBACK) \ + $(wildcard include/config/IMA) \ + $(wildcard include/config/FILE_LOCKING) \ + $(wildcard include/config/FSNOTIFY) \ + $(wildcard include/config/FS_ENCRYPTION) \ + $(wildcard include/config/FS_VERITY) \ + $(wildcard include/config/EPOLL) \ + $(wildcard include/config/UNICODE) \ + $(wildcard include/config/QUOTA) \ + $(wildcard include/config/FS_DAX) \ + $(wildcard include/config/BLOCK) \ + include/linux/wait_bit.h \ + include/linux/kdev_t.h \ + include/uapi/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/rculist_bl.h \ + include/linux/list_bl.h \ + include/linux/bit_spinlock.h \ + include/linux/lockref.h \ + $(wildcard include/config/ARCH_USE_CMPXCHG_LOCKREF) \ + include/linux/stringhash.h \ + $(wildcard include/config/DCACHE_WORD_ACCESS) \ + include/linux/path.h \ + include/linux/list_lru.h \ + include/linux/shrinker.h \ + $(wildcard include/config/SHRINKER_DEBUG) \ + include/linux/capability.h \ + include/uapi/linux/capability.h \ + include/linux/semaphore.h \ + include/linux/migrate_mode.h \ + include/linux/percpu-rwsem.h \ + include/linux/rcuwait.h \ + include/linux/sched/signal.h \ + $(wildcard include/config/SCHED_AUTOGROUP) \ + $(wildcard include/config/BSD_PROCESS_ACCT) \ + $(wildcard include/config/TASKSTATS) \ + include/linux/signal.h \ + $(wildcard include/config/DYNAMIC_SIGFRAME) \ + include/linux/sched/jobctl.h \ + include/linux/sched/task.h \ + $(wildcard include/config/HAVE_EXIT_THREAD) \ + $(wildcard include/config/ARCH_WANTS_DYNAMIC_TASK_STRUCT) \ + $(wildcard include/config/HAVE_ARCH_THREAD_STRUCT_WHITELIST) \ + include/linux/uaccess.h \ + $(wildcard include/config/ARCH_HAS_SUBPAGE_FAULTS) \ + include/linux/fault-inject-usercopy.h \ + $(wildcard include/config/FAULT_INJECTION_USERCOPY) \ + arch/arm64/include/asm/uaccess.h \ + arch/arm64/include/asm/kernel-pgtable.h \ + arch/arm64/include/asm/asm-extable.h \ + arch/arm64/include/asm/extable.h \ + $(wildcard include/config/BPF_JIT) \ + include/asm-generic/access_ok.h \ + $(wildcard include/config/ALTERNATE_USER_ADDRESS_SPACE) \ + include/linux/cred.h \ + include/linux/key.h \ + $(wildcard include/config/KEY_NOTIFICATIONS) \ + $(wildcard include/config/NET) \ + include/linux/assoc_array.h \ + $(wildcard include/config/ASSOCIATIVE_ARRAY) \ + include/linux/sched/user.h \ + $(wildcard include/config/VFIO_PCI_ZDEV_KVM) \ + $(wildcard include/config/IOMMUFD) \ + $(wildcard include/config/WATCH_QUEUE) \ + include/linux/rcu_sync.h \ + include/linux/delayed_call.h \ + include/linux/uuid.h \ + include/linux/errseq.h \ + include/linux/ioprio.h \ + include/linux/sched/rt.h \ + include/linux/iocontext.h \ + $(wildcard include/config/BLK_ICQ) \ + include/uapi/linux/ioprio.h \ + include/linux/fs_types.h \ + include/linux/mount.h \ + include/linux/mnt_idmapping.h \ + include/uapi/linux/fs.h \ + include/linux/quota.h \ + $(wildcard include/config/QUOTA_NETLINK_INTERFACE) \ + include/uapi/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/projid.h \ + include/uapi/linux/quota.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/ALPHA) \ + $(wildcard include/config/PPC64) \ + include/linux/rbtree_latch.h \ + include/linux/error-injection.h \ + include/asm-generic/error-injection.h \ + arch/arm64/include/asm/module.h \ + $(wildcard include/config/DYNAMIC_FTRACE) \ + include/asm-generic/module.h \ + $(wildcard include/config/HAVE_MOD_ARCH_SPECIFIC) \ + $(wildcard include/config/MODULES_USE_ELF_REL) \ + $(wildcard include/config/MODULES_USE_ELF_RELA) \ + arch/arm64/include/asm/device.h \ + include/linux/pm_wakeup.h \ + include/linux/pci.h \ + $(wildcard include/config/PCI_IOV) \ + $(wildcard include/config/PCIEAER) \ + $(wildcard include/config/PCIEPORTBUS) \ + $(wildcard include/config/PCIEASPM) \ + $(wildcard include/config/HOTPLUG_PCI_PCIE) \ + $(wildcard include/config/PCIE_PTM) \ + $(wildcard include/config/PCI_MSI) \ + $(wildcard include/config/PCIE_DPC) \ + $(wildcard include/config/PCI_ATS) \ + $(wildcard include/config/PCI_PRI) \ + $(wildcard include/config/PCI_PASID) \ + $(wildcard include/config/PCI_P2PDMA) \ + $(wildcard include/config/PCI_DOE) \ + $(wildcard include/config/PCI_DOMAINS_GENERIC) \ + $(wildcard include/config/PCI_DOMAINS) \ + $(wildcard include/config/PCI_QUIRKS) \ + $(wildcard include/config/PCI_MMCONFIG) \ + $(wildcard include/config/ACPI_MCFG) \ + $(wildcard include/config/HOTPLUG_PCI) \ + $(wildcard include/config/EEH) \ + include/linux/args.h \ + include/linux/mod_devicetable.h \ + include/uapi/linux/mei.h \ + include/uapi/linux/mei_uuid.h \ + include/linux/resource_ext.h \ + include/linux/msi_api.h \ + include/uapi/linux/pci.h \ + include/uapi/linux/pci_regs.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + $(wildcard include/config/HAS_DMA) \ + include/linux/scatterlist.h \ + $(wildcard include/config/NEED_SG_DMA_LENGTH) \ + $(wildcard include/config/NEED_SG_DMA_FLAGS) \ + $(wildcard include/config/DEBUG_SG) \ + $(wildcard include/config/SGL_ALLOC) \ + $(wildcard include/config/ARCH_NO_SG_CHAIN) \ + $(wildcard include/config/SG_POOL) \ + include/linux/mm.h \ + $(wildcard include/config/HAVE_ARCH_MMAP_RND_BITS) \ + $(wildcard include/config/HAVE_ARCH_MMAP_RND_COMPAT_BITS) \ + $(wildcard include/config/MEM_SOFT_DIRTY) \ + $(wildcard include/config/ARCH_USES_HIGH_VMA_FLAGS) \ + $(wildcard include/config/ARCH_HAS_PKEYS) \ + $(wildcard include/config/PPC) \ + $(wildcard include/config/X86_USER_SHADOW_STACK) \ + $(wildcard include/config/X86) \ + $(wildcard include/config/PARISC) \ + $(wildcard include/config/SPARC64) \ + $(wildcard include/config/HAVE_ARCH_USERFAULTFD_MINOR) \ + $(wildcard include/config/SHMEM) \ + $(wildcard include/config/MIGRATION) \ + $(wildcard include/config/ARCH_HAS_PTE_SPECIAL) \ + $(wildcard include/config/DEBUG_VM_RB) \ + $(wildcard include/config/PAGE_POISONING) \ + $(wildcard include/config/INIT_ON_ALLOC_DEFAULT_ON) \ + $(wildcard include/config/INIT_ON_FREE_DEFAULT_ON) \ + $(wildcard include/config/DEBUG_PAGEALLOC) \ + $(wildcard include/config/ARCH_WANT_OPTIMIZE_DAX_VMEMMAP) \ + $(wildcard include/config/HUGETLBFS) \ + $(wildcard include/config/MAPPING_DIRTY_HELPERS) \ + include/linux/range.h \ + include/linux/page_ext.h \ + include/linux/stacktrace.h \ + $(wildcard include/config/ARCH_STACKWALK) \ + $(wildcard include/config/STACKTRACE) \ + $(wildcard include/config/HAVE_RELIABLE_STACKTRACE) \ + include/linux/stackdepot.h \ + $(wildcard include/config/STACKDEPOT_ALWAYS_INIT) \ + $(wildcard include/config/STACKDEPOT) \ + include/linux/page_ref.h \ + $(wildcard include/config/DEBUG_PAGE_REF) \ + include/linux/memremap.h \ + $(wildcard include/config/DEVICE_PRIVATE) \ + include/linux/huge_mm.h \ + include/linux/sched/coredump.h \ + $(wildcard include/config/CORE_DUMP_DEFAULT_ELF_HEADERS) \ + include/linux/vmstat.h \ + $(wildcard include/config/VM_EVENT_COUNTERS) \ + $(wildcard include/config/DEBUG_TLBFLUSH) \ + $(wildcard include/config/PER_VMA_LOCK_STATS) \ + include/linux/vm_event_item.h \ + $(wildcard include/config/MEMORY_BALLOON) \ + $(wildcard include/config/BALLOON_COMPACTION) \ + $(wildcard include/config/ZSWAP) \ + arch/arm64/include/asm/pci.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/DMA_API_DEBUG) \ + $(wildcard include/config/NEED_DMA_MAP_STATE) \ + include/linux/dma-direction.h \ + include/linux/mem_encrypt.h \ + $(wildcard include/config/ARCH_HAS_MEM_ENCRYPT) \ + include/asm-generic/pci.h \ + include/linux/poll.h \ + include/uapi/linux/poll.h \ + arch/arm64/include/generated/uapi/asm/poll.h \ + include/uapi/asm-generic/poll.h \ + include/uapi/linux/eventpoll.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/PROC_PID_ARCH_STATUS) \ + include/linux/uio.h \ + $(wildcard include/config/ARCH_HAS_COPY_MC) \ + include/uapi/linux/uio.h \ + include/generated/uapi/linux/version.h \ + +/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.o: $(deps_/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.o) + +$(deps_/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.o): diff --git a/W/shmsockproxy/drivers/char/ivshmem/.modules.order.cmd b/W/shmsockproxy/drivers/char/ivshmem/.modules.order.cmd new file mode 100644 index 000000000..3c6ebb58d --- /dev/null +++ b/W/shmsockproxy/drivers/char/ivshmem/.modules.order.cmd @@ -0,0 +1 @@ +savedcmd_/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/modules.order := { echo /home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.o; :; } > /home/vadikas/W/shmsockproxy/drivers/char/ivshmem/modules.order diff --git a/W/shmsockproxy/drivers/char/ivshmem/Kconfig b/W/shmsockproxy/drivers/char/ivshmem/Kconfig new file mode 100644 index 000000000..f0f75200c --- /dev/null +++ b/W/shmsockproxy/drivers/char/ivshmem/Kconfig @@ -0,0 +1,6 @@ +# Copyright 2022-2024 TII (SSRC) and the Ghaf contributors +# SPDX-License-Identifier: Apache-2.0 + +config KVM_IVSHMEM_VM_COUNT + int "Application VMs count" + default 5 diff --git a/W/shmsockproxy/drivers/char/ivshmem/Makefile b/W/shmsockproxy/drivers/char/ivshmem/Makefile new file mode 100644 index 000000000..6172f5fe2 --- /dev/null +++ b/W/shmsockproxy/drivers/char/ivshmem/Makefile @@ -0,0 +1,9 @@ +obj-m += kvm_ivshmem.o + +all: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules + +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean + + diff --git a/W/shmsockproxy/drivers/char/ivshmem/Module.symvers b/W/shmsockproxy/drivers/char/ivshmem/Module.symvers new file mode 100644 index 000000000..e69de29bb diff --git a/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.c b/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.c new file mode 100644 index 000000000..03bb5732b --- /dev/null +++ b/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.c @@ -0,0 +1,667 @@ +/* drivers/char/kvm_ivshmem.c - driver for KVM Inter-VM shared memory PCI device + +* Copyright 2022-2024 TII (SSRC) and the Ghaf contributors +* SPDX-License-Identifier: Apache-2.0 +* +* Copyright 2009 Cam Macdonell +* +* Based on cirrusfb.c and 8139cp.c: +* Copyright 1999-2001 Jeff Garzik +* Copyright 2001-2004 Jeff Garzik +* +*/ + +#include "kvm_ivshmem.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef CONFIG_KVM_IVSHMEM_VM_COUNT +#warning CONFIG_KVM_IVSHMEM_VM_COUNT not defined. Assuming 5. +#define CONFIG_KVM_IVSHMEM_VM_COUNT (5) +#endif + +DEFINE_SPINLOCK(rawhide_irq_lock); +#define VM_COUNT (CONFIG_KVM_IVSHMEM_VM_COUNT) +#define VECTORS_COUNT (2 * VM_COUNT) + +// #define DEBUG +#ifdef DEBUG +#define KVM_IVSHMEM_DPRINTK(fmt, ...) \ + do { \ + printk(KERN_INFO "KVM_IVSHMEM: " fmt "\n", ##__VA_ARGS__); \ + } while (0) +#else +#define KVM_IVSHMEM_DPRINTK(fmt, ...) \ + {} +#endif + +enum { + /* KVM Inter-VM shared memory device register offsets */ + IntrMask = 0x00, /* Interrupt Mask */ + IntrStatus = 0x04, /* Interrupt Status */ + IVPosition = 0x08, /* VM ID */ + Doorbell = 0x0c, /* Doorbell */ +}; + +typedef struct kvm_ivshmem_device { + void __iomem *regs; + + void *base_addr; + + unsigned int regaddr; + unsigned int reg_size; + + unsigned int ioaddr; + unsigned int ioaddr_size; + unsigned int irq; + + struct pci_dev *dev; + char (*msix_names)[256]; + struct msix_entry *msix_entries; + int nvectors; +} kvm_ivshmem_device; + +static int irq_incoming_data[VM_COUNT]; +static int irq_ack[VM_COUNT]; +static int local_resource_count[VM_COUNT]; +static int peer_resource_count[VM_COUNT]; +static wait_queue_head_t local_data_ready_wait_queue[VM_COUNT]; +static wait_queue_head_t peer_data_ready_wait_queue[VM_COUNT]; + +static kvm_ivshmem_device kvm_ivshmem_dev; + +static long kvm_ivshmem_ioctl(struct file *, unsigned int, unsigned long); +static int kvm_ivshmem_mmap(struct file *, struct vm_area_struct *); +static int kvm_ivshmem_open(struct inode *, struct file *); +static int kvm_ivshmem_release(struct inode *, struct file *); +static ssize_t kvm_ivshmem_read(struct file *, char *, size_t, loff_t *); +static ssize_t kvm_ivshmem_write(struct file *, const char *, size_t, loff_t *); +static loff_t kvm_ivshmem_lseek(struct file *filp, loff_t offset, int origin); +static unsigned kvm_ivshmem_poll(struct file *filp, + struct poll_table_struct *wait); +static const struct file_operations kvm_ivshmem_ops = { + .owner = THIS_MODULE, + .open = kvm_ivshmem_open, + .mmap = kvm_ivshmem_mmap, + .read = kvm_ivshmem_read, + .unlocked_ioctl = kvm_ivshmem_ioctl, + .write = kvm_ivshmem_write, + .llseek = kvm_ivshmem_lseek, + .release = kvm_ivshmem_release, + .poll = kvm_ivshmem_poll, +}; + +static struct pci_device_id kvm_ivshmem_id_table[] = { + {0x1af4, 0x1110, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0}, +}; + +static struct miscdevice kvm_ivshmem_misc_dev = { + .minor = MISC_DYNAMIC_MINOR, + .name = "ivshmem", + .fops = &kvm_ivshmem_ops, +}; + +// TODO: debug +static int in_counter = 0, out_counter = 0; + +MODULE_DEVICE_TABLE(pci, kvm_ivshmem_id_table); + +static void kvm_ivshmem_remove_device(struct pci_dev *pdev); +static int kvm_ivshmem_probe_device(struct pci_dev *pdev, + const struct pci_device_id *ent); + +static struct pci_driver kvm_ivshmem_pci_driver = { + .name = "kvm-shmem", + .id_table = kvm_ivshmem_id_table, + .probe = kvm_ivshmem_probe_device, + .remove = kvm_ivshmem_remove_device, +}; + +static long kvm_ivshmem_ioctl(struct file *filp, unsigned int cmd, + unsigned long arg) { + + + int rv = 0; + unsigned long flags; + uint32_t msg; + struct ioctl_data ioctl_data; + + KVM_IVSHMEM_DPRINTK("%ld ioctl: cmd=0x%x args is 0x%lx", + (unsigned long int)filp->private_data, cmd, arg); + if ((unsigned long int)filp->private_data >= VM_COUNT && + cmd != SHMEM_IOCSETINSTANCENO) { + printk(KERN_ERR "KVM_IVSHMEM: ioctl: invalid instance id %ld > VM_COUNT=%d", + (unsigned long int)filp->private_data, VM_COUNT); + return -EINVAL; + } + switch (cmd) { + case SHMEM_IOCIVPOSN: + msg = readl(kvm_ivshmem_dev.regs + IVPosition); + KVM_IVSHMEM_DPRINTK("%ld my vmid is 0x%08x", + (unsigned long int)filp->private_data, msg); + rv = copy_to_user((void __user *)arg, &msg, sizeof(msg)); + break; + + case SHMEM_IOCDORBELL: + unsigned int vec; + + if (copy_from_user(&ioctl_data, (void __user *)arg, sizeof(ioctl_data))) { + printk(KERN_ERR + "KVM_IVSHMEM: SHMEM_IOCDORBELL: %ld invalid argument 0x%lx", + (unsigned long int)filp->private_data, arg); + rv = -EINVAL; + break; + } + + vec = ioctl_data.int_no & 0xffff; +#ifdef DEBUG_IOCTL + KVM_IVSHMEM_DPRINTK("%ld ioctl cmd=%d fd=%d len=%d int_no=0x%x", + (unsigned long int)filp->private_data, ioctl_data.cmd, + ioctl_data.fd, ioctl_data.len, ioctl_data.int_no); +#endif + KVM_IVSHMEM_DPRINTK("%ld ringing doorbell id=0x%x on vector 0x%x", + (unsigned long int)filp->private_data, + (ioctl_data.int_no >> 16), vec); + spin_lock_irqsave(&rawhide_irq_lock, flags); + if (vec & LOCAL_RESOURCE_READY_INT_VEC) { + local_resource_count[(unsigned long int)filp->private_data] = 0; + } else { + peer_resource_count[(unsigned long int)filp->private_data] = 0; + } + spin_unlock_irqrestore(&rawhide_irq_lock, flags); + writel(ioctl_data.int_no, kvm_ivshmem_dev.regs + Doorbell); + break; + + case SHMEM_IOCSET: + spin_lock_irqsave(&rawhide_irq_lock, flags); + if ((arg >> 8) == LOCAL_RESOURCE_READY_INT_VEC) + local_resource_count[(unsigned long int)filp->private_data] = arg & 0xff; + else if ((arg >> 8) == PEER_RESOURCE_CONSUMED_INT_VEC) + peer_resource_count[(unsigned long int)filp->private_data] = arg & 0xff; + else { + rv = -EINVAL; + printk(KERN_ERR "KVM_IVSHMEM: SHMEM_IOCSET: invalid arg %ld", arg); + } + spin_unlock_irqrestore(&rawhide_irq_lock, flags); + break; + + case SHMEM_IOCSETINSTANCENO: + spin_lock_irqsave(&rawhide_irq_lock, flags); + if (arg >= VM_COUNT) { + printk(KERN_ERR "KVM_IVSHMEM: ioctl: invalid instance id %ld", arg); + rv = -EINVAL; + goto unlock; + } + filp->private_data = (void *)arg; + printk(KERN_INFO + "KVM_IVSHMEM: SHMEM_IOCSETINSTANCENO: set instance id 0x%lx", + arg); + + init_waitqueue_head(&local_data_ready_wait_queue[arg]); + init_waitqueue_head(&peer_data_ready_wait_queue[arg]); + local_resource_count[arg] = 1; + peer_resource_count[arg] = 0; + unlock: + spin_unlock_irqrestore(&rawhide_irq_lock, flags); + break; + + case SHMEM_IOCNOP: + unsigned int tmp; + + if (copy_from_user(&tmp, (void __user *)arg, sizeof(tmp))) { + printk(KERN_ERR "KVM_IVSHMEM: SHMEM_IOCWLOCAL: %ld invalid argument", + (unsigned long int)filp->private_data); + } + KVM_IVSHMEM_DPRINTK( + "%ld %x local %d counter=%d: peer:%d counter=%d", + (unsigned long int)filp->private_data, tmp, + local_resource_count[(unsigned long int)filp->private_data], in_counter, + peer_resource_count[(unsigned long int)filp->private_data], + out_counter); + + tmp = ((unsigned)out_counter) << 16 | (unsigned)(in_counter & 0xffff); + rv = copy_to_user((void __user *)arg, &tmp, sizeof(tmp)); + break; + + default: + KVM_IVSHMEM_DPRINTK("%ld bad ioctl (0x%08x)", + (unsigned long int)filp->private_data, cmd); + return -EINVAL; + } + + return rv; +} + +static unsigned kvm_ivshmem_poll(struct file *filp, + struct poll_table_struct *wait) { + __poll_t mask = 0; + __poll_t req_events = poll_requested_events(wait); + + if (req_events & EPOLLIN) { + poll_wait( + filp, + &peer_data_ready_wait_queue[(unsigned long int)filp->private_data], + wait); + + if (peer_resource_count[(unsigned long int)filp->private_data]) { + KVM_IVSHMEM_DPRINTK( + "%ld poll: in: peer_resource_count=%d", + (unsigned long int)filp->private_data, + peer_resource_count[(unsigned long int)filp->private_data]); + mask |= (POLLIN | POLLRDNORM); + } + } + + if (req_events & EPOLLOUT) { + poll_wait( + filp, + &local_data_ready_wait_queue[(unsigned long int)filp->private_data], + wait); + + if (local_resource_count[(unsigned long int)filp->private_data]) { + KVM_IVSHMEM_DPRINTK( + "%ld poll: out: local_resource_count=%d", + (unsigned long int)filp->private_data, + local_resource_count[(unsigned long int)filp->private_data]); + + mask |= (POLLOUT | POLLWRNORM); + } + } + +#ifdef DEBUG + if (!mask) { + printk(KERN_ERR "KVM_IVSHMEM: poll: timeout: query for events 0x%x", + req_events); + } +#endif + return mask; +} + +static ssize_t kvm_ivshmem_read(struct file *filp, char *buffer, size_t len, + loff_t *poffset) { + + int bytes_read = 0; + unsigned long offset; + + offset = *poffset; + + if (!kvm_ivshmem_dev.base_addr) { + printk(KERN_ERR "KVM_IVSHMEM: cannot read from ioaddr (NULL)"); + return 0; + } + + if (len > kvm_ivshmem_dev.ioaddr_size - offset) { + len = kvm_ivshmem_dev.ioaddr_size - offset; + } + + if (len == 0) + return 0; + + bytes_read = copy_to_user(buffer, kvm_ivshmem_dev.base_addr + offset, len); + if (bytes_read > 0) { + return -EFAULT; + } + + *poffset += len; + return len; +} + +static loff_t kvm_ivshmem_lseek(struct file *filp, loff_t offset, int origin) { + + loff_t retval = -1; + + switch (origin) { + case SEEK_CUR: + offset += filp->f_pos; + __attribute__((__fallthrough__)); + case SEEK_SET: + retval = offset; + if (offset > kvm_ivshmem_dev.ioaddr_size) { + offset = kvm_ivshmem_dev.ioaddr_size; + } + filp->f_pos = offset; + break; + case SEEK_END: + retval = kvm_ivshmem_dev.ioaddr_size; + filp->f_pos = kvm_ivshmem_dev.ioaddr_size; + } + + return retval; +} + +static ssize_t kvm_ivshmem_write(struct file *filp, const char *buffer, + size_t len, loff_t *poffset) { + + int bytes_written = 0; + unsigned long offset; + + offset = *poffset; + + KVM_IVSHMEM_DPRINTK("%ld KVM_IVSHMEM: trying to write", + (unsigned long int)filp->private_data); + if (!kvm_ivshmem_dev.base_addr) { + printk(KERN_ERR "KVM_IVSHMEM: %ld cannot write to ioaddr (NULL)", + (unsigned long int)filp->private_data); + return 0; + } + + if (len > kvm_ivshmem_dev.ioaddr_size - offset) { + len = kvm_ivshmem_dev.ioaddr_size - offset; + } + + KVM_IVSHMEM_DPRINTK("%ld KVM_IVSHMEM: len is %u", + (unsigned long int)filp->private_data, (unsigned)len); + if (len == 0) + return 0; + + bytes_written = + copy_from_user(kvm_ivshmem_dev.base_addr + offset, buffer, len); + if (bytes_written > 0) { + return -EFAULT; + } + + KVM_IVSHMEM_DPRINTK("%ld KVM_IVSHMEM: wrote %u bytes at offset %lu", + (unsigned long int)filp->private_data, (unsigned)len, + offset); + *poffset += len; + return len; +} + +static irqreturn_t kvm_ivshmem_interrupt(int irq, void *dev_instance) { + struct kvm_ivshmem_device *dev = dev_instance; + int i; + + if (unlikely(dev == NULL)) { + KVM_IVSHMEM_DPRINTK("return IRQ_NONE"); + return IRQ_NONE; + } + + KVM_IVSHMEM_DPRINTK("irq %d", irq); + for (i = 0; i < VM_COUNT; i++) { + if (irq == irq_incoming_data[i]) { + out_counter++; + KVM_IVSHMEM_DPRINTK("%d wake up peer_data_ready_wait_queue count=%d", i, + out_counter); + if (peer_resource_count[i]) { + KVM_IVSHMEM_DPRINTK("%d WARNING: peer_resource_count>0!: %d", i, + peer_resource_count[i]); + } + spin_lock(&rawhide_irq_lock); + peer_resource_count[i] = 1; + smp_mb(); + spin_unlock(&rawhide_irq_lock); + wake_up_interruptible(&peer_data_ready_wait_queue[i]); + return IRQ_HANDLED; + } + if (irq == irq_ack[i]) { + in_counter++; + KVM_IVSHMEM_DPRINTK("%d wake up local_data_ready_wait_queue count=%d", i, + in_counter); + if (local_resource_count[i]) { + KVM_IVSHMEM_DPRINTK("%d WARNING: local_resource_count>0!: %d", i, + local_resource_count[i]); + } + spin_lock(&rawhide_irq_lock); + local_resource_count[i] = 1; + smp_mb(); + spin_unlock(&rawhide_irq_lock); + wake_up_interruptible(&local_data_ready_wait_queue[i]); + return IRQ_HANDLED; + } + } + + printk(KERN_ERR "KVM_IVSHMEM: irq %d not handled", irq); + return IRQ_NONE; +} + +static int request_msix_vectors(struct kvm_ivshmem_device *ivs_info, + int nvectors) { + int i, n, err; + const char *name = "ivshmem"; + + KVM_IVSHMEM_DPRINTK("KVM_IVSHMEM: devname is %s", name); + ivs_info->nvectors = nvectors; + + ivs_info->msix_entries = + kmalloc(nvectors * sizeof *ivs_info->msix_entries, GFP_KERNEL); + ivs_info->msix_names = + kmalloc(nvectors * sizeof *ivs_info->msix_names, GFP_KERNEL); + + for (i = 0; i < nvectors; i++) + ivs_info->msix_entries[i].entry = i; + + n = pci_alloc_irq_vectors(ivs_info->dev, nvectors, nvectors, PCI_IRQ_MSIX); + if (n < 0) { + printk(KERN_ERR "KVM_IVSHMEM: pci_alloc_irq_vectors i=%d: error %d", i, n); + return n; + } + + for (i = 0; i < nvectors; i++) { + + snprintf(ivs_info->msix_names[i], sizeof *ivs_info->msix_names, "%s-config", + name); + + n = pci_irq_vector(ivs_info->dev, i); + err = request_irq(n, kvm_ivshmem_interrupt, IRQF_SHARED, + ivs_info->msix_names[i], ivs_info); + + if (err) { + printk(KERN_ERR "KVM_IVSHMEM: couldn't allocate irq for msi-x entry %d " + "with vector %d", + i, n); + return -ENOSPC; + } else { + printk(KERN_INFO "KVM_IVSHMEM: allocated irq #%d", n); + } + // vector 1 is used for data sending + if (i & LOCAL_RESOURCE_READY_INT_VEC) { + irq_incoming_data[i >> 1] = n; + KVM_IVSHMEM_DPRINTK("Using interrupt #%d for incoming data for vm %d", n, + i >> 1); + // vector 0 is used for for sending acknowledgments + } else { + irq_ack[i >> 1] = n; + KVM_IVSHMEM_DPRINTK("Using interrupt #%d for ACKs for vm %d", n, i >> 1); + } + } + + pci_set_master(ivs_info->dev); + return 0; +} + +static int kvm_ivshmem_probe_device(struct pci_dev *pdev, + const struct pci_device_id *ent) { + + int result; + + KVM_IVSHMEM_DPRINTK("Probing for KVM_IVSHMEM Device"); + + result = pci_enable_device(pdev); + if (result) { + printk(KERN_ERR "KVM_IVSHMEM: Cannot probe KVM_IVSHMEM device %s: error %d", + pci_name(pdev), result); + return result; + } + + result = pci_request_regions(pdev, "kvm_ivshmem"); + if (result < 0) { + printk(KERN_ERR "KVM_IVSHMEM: cannot request regions"); + goto pci_disable; + } else + printk(KERN_ERR "KVM_IVSHMEM: pci_request_regions(): result is %d", result); + + kvm_ivshmem_dev.ioaddr = pci_resource_start(pdev, 2); + kvm_ivshmem_dev.ioaddr_size = pci_resource_len(pdev, 2); + + kvm_ivshmem_dev.base_addr = pci_iomap(pdev, 2, 0); + printk(KERN_INFO "KVM_IVSHMEM: iomap base = 0x%p", kvm_ivshmem_dev.base_addr); + + if (!kvm_ivshmem_dev.base_addr) { + printk(KERN_ERR "KVM_IVSHMEM: cannot iomap region of size %d", + kvm_ivshmem_dev.ioaddr_size); + goto pci_release; + } + + printk(KERN_INFO "KVM_IVSHMEM: ioaddr = 0x%x ioaddr_size = 0x%x", + kvm_ivshmem_dev.ioaddr, kvm_ivshmem_dev.ioaddr_size); + + /* Clear the the shared memory*/ + memset_io(kvm_ivshmem_dev.base_addr, kvm_ivshmem_dev.ioaddr_size, 0); + + kvm_ivshmem_dev.regaddr = pci_resource_start(pdev, 0); + kvm_ivshmem_dev.reg_size = pci_resource_len(pdev, 0); + kvm_ivshmem_dev.regs = pci_iomap(pdev, 0, 0x100); + + kvm_ivshmem_dev.dev = pdev; + + if (!kvm_ivshmem_dev.regs) { + printk(KERN_ERR "KVM_IVSHMEM: cannot ioremap registers of size %d", + kvm_ivshmem_dev.reg_size); + goto reg_release; + } + + if (request_msix_vectors(&kvm_ivshmem_dev, VECTORS_COUNT) != 0) { + printk(KERN_ERR + "KVM_IVSHMEM: Check ivshmem and qemu configured interrupts number"); + goto reg_release; + } else { + printk(KERN_INFO "KVM_IVSHMEM: MSI-X enabled"); + } + + /* set all masks to on */ + writel(0xffffffff, kvm_ivshmem_dev.regs + IntrMask); + + return 0; + +reg_release: + pci_iounmap(pdev, kvm_ivshmem_dev.base_addr); +pci_release: + pci_release_regions(pdev); +pci_disable: + pci_disable_device(pdev); + return -EBUSY; +} + +static void kvm_ivshmem_remove_device(struct pci_dev *pdev) { + int i, n; + + printk(KERN_INFO "KVM_IVSHMEM: Unregister kvm_ivshmem device."); + for (i = 0; i < VECTORS_COUNT; i++) { + n = pci_irq_vector(pdev, i); + KVM_IVSHMEM_DPRINTK("Freeing irq# %d", n); + disable_irq(n); + free_irq(n, &kvm_ivshmem_dev); + } + pci_free_irq_vectors(pdev); + pci_iounmap(pdev, kvm_ivshmem_dev.regs); + pci_iounmap(pdev, kvm_ivshmem_dev.base_addr); + pci_release_regions(pdev); + pci_disable_device(pdev); +} + +static void __exit kvm_ivshmem_cleanup_module(void) { + pci_unregister_driver(&kvm_ivshmem_pci_driver); + misc_deregister(&kvm_ivshmem_misc_dev); +} + +static int __init kvm_ivshmem_init_module(void) { + + int err = -ENOMEM, i; + + /* Register device node ops. */ + err = misc_register(&kvm_ivshmem_misc_dev); + if (err < 0) { + printk(KERN_ERR "KVM_IVSHMEM: Unable to register kvm_ivshmem_misc device"); + return err; + } + KVM_IVSHMEM_DPRINTK("Registered the /dev/%s device ", + kvm_ivshmem_misc_dev.name); + + err = pci_register_driver(&kvm_ivshmem_pci_driver); + if (err < 0) { + goto error; + } + + for (i = 0; i < VM_COUNT; i++) { + init_waitqueue_head(&local_data_ready_wait_queue[i]); + init_waitqueue_head(&peer_data_ready_wait_queue[i]); + local_resource_count[i] = 1; + peer_resource_count[i] = 0; + } + return 0; + +error: + misc_deregister(&kvm_ivshmem_misc_dev); + return err; +} + +static int kvm_ivshmem_open(struct inode *inode, struct file *filp) { + printk(KERN_INFO "KVM_IVSHMEM: Opening kvm_ivshmem device"); + filp->private_data = (void *)(unsigned long)-1; + return 0; +} + +static int kvm_ivshmem_release(struct inode *inode, struct file *filp) { + return 0; +} + +static int kvm_ivshmem_mmap(struct file *filp, struct vm_area_struct *vma) { + + unsigned long len; + unsigned long off; + unsigned long start; + + off = vma->vm_pgoff << PAGE_SHIFT; + start = kvm_ivshmem_dev.ioaddr; + + len = PAGE_ALIGN((start & ~PAGE_MASK) + kvm_ivshmem_dev.ioaddr_size); + start &= PAGE_MASK; + + printk(KERN_INFO + "KVM_IVSHMEM: mmap: vma->vm_start=0x%lx vma->vm_end=0x%lx off=0x%lx", + vma->vm_start, vma->vm_end, off); + printk( + KERN_INFO + "KVM_IVSHMEM: mmap: vma->vm_end - vma->vm_start + off=0x%lx > len=0x%lx", + (vma->vm_end - vma->vm_start + off), len); + + if ((vma->vm_end - vma->vm_start + off) > len) + return -EINVAL; + + off += start; + vma->vm_pgoff = off >> PAGE_SHIFT; + #if LINUX_VERSION_CODE >= KERNEL_VERSION(6,3,0) + vm_flags_mod(vma, VM_SHARED, 0); + #else + vma->vm_flags |= VM_SHARED; + #endif + + if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT, + vma->vm_end - vma->vm_start, vma->vm_page_prot)) { + KVM_IVSHMEM_DPRINTK("%ld mmap failed", + (unsigned long int)filp->private_data); + return -ENXIO; + } + + return 0; +} + +module_init(kvm_ivshmem_init_module); +module_exit(kvm_ivshmem_cleanup_module); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Cam Macdonell "); +MODULE_DESCRIPTION("KVM inter-VM shared memory module"); +MODULE_VERSION("1.0"); diff --git a/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.h b/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.h new file mode 100644 index 000000000..aacd7f73e --- /dev/null +++ b/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.h @@ -0,0 +1,25 @@ +/* Copyright 2022-2023 TII (SSRC) and the Ghaf contributors + SPDX-License-Identifier: Apache-2.0 +*/ + +#define PEER_RESOURCE_CONSUMED_INT_VEC (0) +#define LOCAL_RESOURCE_READY_INT_VEC (1) + +#define SHMEM_IOC_MAGIC 's' + +#define SHMEM_IOCWLOCAL _IOR(SHMEM_IOC_MAGIC, 1, int) +#define SHMEM_IOCWPEER _IOR(SHMEM_IOC_MAGIC, 2, int) +#define SHMEM_IOCIVPOSN _IOW(SHMEM_IOC_MAGIC, 3, int) +#define SHMEM_IOCSETINSTANCENO _IOR(SHMEM_IOC_MAGIC, 4, int) +#define SHMEM_IOCSET _IOR(SHMEM_IOC_MAGIC, 5, int) +#define SHMEM_IOCDORBELL _IOR(SHMEM_IOC_MAGIC, 6, int) +#define SHMEM_IOCNOP _IOR(SHMEM_IOC_MAGIC, 7, int) + +// #define DEBUG_IOCTL +struct ioctl_data { + int peer_vm_id; + unsigned int int_no; + int fd; + int cmd; + int len; +}; diff --git a/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.ko b/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.ko new file mode 100644 index 0000000000000000000000000000000000000000..58bdaf93cc4c0e5c19c418a2ca22d9e52e39b4fd GIT binary patch literal 24736 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 literal 0 HcmV?d00001 diff --git a/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod b/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod new file mode 100644 index 000000000..ae0baa3ce --- /dev/null +++ b/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod @@ -0,0 +1 @@ +/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.o diff --git a/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.c b/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.c new file mode 100644 index 000000000..c5c5918e6 --- /dev/null +++ b/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.c @@ -0,0 +1,82 @@ +#include +#define INCLUDE_VERMAGIC +#include +#include +#include +#include +#include + +#ifdef CONFIG_UNWINDER_ORC +#include +ORC_HEADER; +#endif + +BUILD_SALT; +BUILD_LTO_INFO; + +MODULE_INFO(vermagic, VERMAGIC_STRING); +MODULE_INFO(name, KBUILD_MODNAME); + +__visible struct module __this_module +__section(".gnu.linkonce.this_module") = { + .name = KBUILD_MODNAME, + .init = init_module, +#ifdef CONFIG_MODULE_UNLOAD + .exit = cleanup_module, +#endif + .arch = MODULE_ARCH_INIT, +}; + +#ifdef CONFIG_RETPOLINE +MODULE_INFO(retpoline, "Y"); +#endif + + + +static const struct modversion_info ____versions[] +__used __section("__versions") = { + { 0x122c3a7e, "_printk" }, + { 0x5b40b26d, "misc_register" }, + { 0x86cd716f, "__pci_register_driver" }, + { 0xd9a5ea54, "__init_waitqueue_head" }, + { 0xc7062395, "misc_deregister" }, + { 0x4789539b, "pci_irq_vector" }, + { 0x3ce4ca6f, "disable_irq" }, + { 0xc1514a3b, "free_irq" }, + { 0xfec8e386, "pci_free_irq_vectors" }, + { 0x52abe0fe, "pci_iounmap" }, + { 0x7c4a4bb8, "pci_release_regions" }, + { 0x1d8e31d, "pci_disable_device" }, + { 0xba8fbd64, "_raw_spin_lock" }, + { 0xb5b54b34, "_raw_spin_unlock" }, + { 0xe2964344, "__wake_up" }, + { 0x57bc19d2, "down_write" }, + { 0xce807a25, "up_write" }, + { 0x353e08dc, "remap_pfn_range" }, + { 0x76bbad0f, "pci_unregister_driver" }, + { 0x62ced28d, "pci_enable_device" }, + { 0xe3cfd2dc, "pci_request_regions" }, + { 0x6310d399, "pci_iomap" }, + { 0x18b48e28, "__memset_io" }, + { 0x702174d, "kmalloc_caches" }, + { 0x55a468f3, "kmalloc_trace" }, + { 0x18fd4447, "pci_alloc_irq_vectors" }, + { 0x656e4a6e, "snprintf" }, + { 0x92d5838e, "request_threaded_irq" }, + { 0x76b3e0d0, "pci_set_master" }, + { 0x88db9f48, "__check_object_size" }, + { 0x6cbbfc54, "__arch_copy_to_user" }, + { 0x12a4e128, "__arch_copy_from_user" }, + { 0xdcb764ad, "memset" }, + { 0x34db050b, "_raw_spin_lock_irqsave" }, + { 0xd35cce70, "_raw_spin_unlock_irqrestore" }, + { 0xf0fdf6cb, "__stack_chk_fail" }, + { 0xcbd4898c, "fortify_panic" }, + { 0xb0bb5523, "module_layout" }, +}; + +MODULE_INFO(depends, ""); + +MODULE_ALIAS("pci:v00001AF4d00001110sv*sd*bc*sc*i*"); + +MODULE_INFO(srcversion, "3F7BC6CA76BDFC7548C007E"); diff --git a/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.o b/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.mod.o new file mode 100644 index 0000000000000000000000000000000000000000..62c54e0e0f2f3873cdc015501d5d9375649547b4 GIT binary patch literal 6008 zcmeHKO^g&p6s~0eQB?jC6^+RlG~xoC9cS4^bj`r*kNif2jR#4J-tL;6a;AUi>Y3do zMoBaT62)lZ|G^8!1Ckh(KwM4qq>+dOG||8T#giwDi6=qdtFD^u=^fY}P9F9p-S5?_ z_r0omRrRXsg@LVub2>VRrVes~OqH~jkdw=%v8$_hfS6Toiay`s>+4-W zxebHewiI%?E>Z6kcISxIDXdQ3No?jb*A{)mH67L$&w{^XX;&uM(Xs>~Ejt^&_Z)jYZP($8{fWBWRWHmh@sH8pe1g8k*IpJOEr z%rPo_?$WAfwXqGlw;Vs-jK>|C-a~)!&EF&*mTra7T6@tW44iUDs{@yva*wT3JwY&NWS$X)gyAV$)+=K-SDfh6Lnzr3J z=O#3+IA#^r9kooW%+hTg*~VYxBg1ig7?^3dj>Hf3Uy=RC`HOlml?Bsu!`P}L{xJNG+1>&6#QWzDV*8Xr+^q`rMxKQe zfC|1Z-5%KW&tx^i<0(!p&!3>7M{6S0=?ClQ*CR`l_)_3GX+0dXPh3EJwE9qLj~325 z4>ylw{>11Dvz{UZ{^{N4n(R z^y4YCDS1K2OB2*LT`o8DOh8q?VtDdn6yZWvgX6nuPI$F2C03dZ6^rY$D~GlZKa|Zq zY~+lt2#oi*#qiC84=Pdl73$`obRELOa4z}t-&Q7>mM?cgGS~2$ftps7k+;m|nq{(x zJ)BM%c{6R+-vPyrn0|$-#^Ix0msctMfYNVQ<(n1Xt@QE`1bK>$dH9v zZ1BkcbUhkmNX)51d{0pz`@gnrh_3DW6~0q*PC&e7?6yjSr@LzNbm2-%R=ZT0&hfWHi?hy1|mdMOHrD z1QfzD7c|P1Zq2B2x8k`LGvd9%@Nu`~5d+6!L@&757!1pE9Oi;cSr1uZ zjm&wfjDG#V^H~s1#5;In@;v~q9D#@%wG z_#9xb*S=owx)%j4D83pvPI*C9fe+UcFG^S~C+Vf)kaH70bRqY-QT zljGk7HJFW(_>UA`x33)}Gw&X#Xx08jg^%YM^r8EYGExOT#3$R?vj}T-zKmr2>;7ww zXP}m+tOyYbAJ?Irw0#M5t;RpD@L2@KDA|AXmy8{nzpd~GRpo7IRP>_47EE%8yJCU3>CC?@g$0To9Z?f?J) literal 0 HcmV?d00001 diff --git a/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.o b/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.o new file mode 100644 index 0000000000000000000000000000000000000000..1edb4ae05aba8539873aa9e54acdf6f85279a324 GIT binary patch literal 19488 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

n-^WeDq@P8$h8m27|CdmZ zq`q87a98rC;DcP>#3=8UodRGIaJT&pT;HNfMw0dmM11bLbg!N3$LQe=>C^bpK2z#T m|IwV}jvYYi6fG=B-{$9Br!?MvTHcD)4|4y_b~V^lRR0YDgHk^L literal 0 HcmV?d00001 diff --git a/W/shmsockproxy/drivers/char/ivshmem/modules.order b/W/shmsockproxy/drivers/char/ivshmem/modules.order new file mode 100644 index 000000000..ae0baa3ce --- /dev/null +++ b/W/shmsockproxy/drivers/char/ivshmem/modules.order @@ -0,0 +1 @@ +/home/vadikas/W/shmsockproxy/drivers/char/ivshmem/kvm_ivshmem.o diff --git a/W/shmsockproxy/generate_kernel_patch_for_drivers.sh b/W/shmsockproxy/generate_kernel_patch_for_drivers.sh new file mode 100755 index 000000000..0484508c6 --- /dev/null +++ b/W/shmsockproxy/generate_kernel_patch_for_drivers.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +set -euo pipefail + +[[ ! -d linux ]] && git clone https://github.com/torvalds/linux.git --branch v6.4 --depth 1 + +pushd linux + git reset --hard 6995e2de6891c724bfeb2db33d7b87775f913ad1 + git clean -xdf + + cp -Rv ../drivers/char/ivshmem ./drivers/char + cp -v ../drivers/char/Kconfig ./drivers/char + cat ../drivers/char/Makefile >> drivers/char/Makefile + + git add . + git commit -m "ivshmem driver" + git format-patch -k -1 -o .. +popd diff --git a/W/shmsockproxy/module/Makefile b/W/shmsockproxy/module/Makefile new file mode 100644 index 000000000..ff849717a --- /dev/null +++ b/W/shmsockproxy/module/Makefile @@ -0,0 +1,20 @@ +# Copyright 2022-2023 TII (SSRC) and the Ghaf contributors +# SPDX-License-Identifier: Apache-2.0 + +obj-m := kvm_ivshmem.o + +# KDIR definition to be used under NixOS +KDIR := /run/current-system/sw/lib/modules/$(shell uname -r)/build/ +#KDIR := /lib/modules/$(shell uname -r)/build/ +PWD := $(shell pwd) + +default: + cp ../drivers/char/ivshmem/kvm_ivshmem.c . + cp ../drivers/char/ivshmem/kvm_ivshmem.h . + $(MAKE) -C $(KDIR) M=$(PWD) modules + +install: + cp kvm_ivshmem.ko /lib/modules/$(shell uname -r)/kernel/drivers/char + +clean: + rm -f *.ko *.o kvm_ivshmem.mod.c Module.symvers diff --git a/W/tiny-vm-tools/host-build.py b/W/tiny-vm-tools/host-build.py new file mode 100755 index 000000000..1c0a71eaa --- /dev/null +++ b/W/tiny-vm-tools/host-build.py @@ -0,0 +1,346 @@ +#!/usr/bin/python3 +# +# Copyright (C) 2020 Red Hat, Inc. +# +# SPDX-License-Identifier: GPL-2.0-or-later + +import os +import subprocess + +BLACK=30 +RED=31 +GREEN=32 +YELLOW=33 +BLUE=34 +MAGENTA=35 +CYAN=36 +WHITE=37 + +art = """ + .,-;-;-,. /'_\\\\ + _/_/_/_|_\\\\_\\\\) / + '-<_><_><_><_>=/\\\\ +jgs \\`/_/====/_/-'\\\\_\\\\ + ^^ ^^ ^^ +""" + +archinfo = { + "i686": { + #"container": "cd15c63975fb11ff264c2500fcac9b66ebcd2309e0d74ea7b1ba427750377b67", + "container": "a2ae6f152f46ed4430a9c4127dec83fec480ab74f95755816663f86bd18b67e3", + "kerneltarget": "686", + "kernelargs": "console=ttyS0", + "qemupkg": "x86", + "qemutarget": "i386", + "qemumachine": "pc", + "qemucpu": "qemu32", + "qemuassets": [ + "/usr/share/seabios/bios-256k.bin", + "/usr/share/qemu/linuxboot.bin", + "/usr/share/qemu/linuxboot_dma.bin", + ], + "color": BLUE, + "banner": """ +─╔═══╦═══╦═══╗ +─║╔══╣╔═╗║╔══╝ +╔╣╚══╣╚═╝║╚══╗ +╠╣╔═╗║╔═╗║╔═╗║ +║║╚═╝║╚═╝║╚═╝║ +╚╩═══╩═══╩═══╝ +""" + }, + "amd64": { + #"container": "3d72f336b2ee7a4c4a525b766b9d3b95c3c68b2272cf96f88b365855350f1d47", + "container": "a51a734b35ddc64bcf466ca98db22b796ba35d952995ff74890aa8b1f9c67886", + "kerneltarget": "amd64", + "kernelargs": "console=ttyS0", + "qemupkg": "x86", + "qemutarget": "x86_64", + "qemumachine": "pc", + "qemucpu": "qemu64", + "qemuassets": [ + "/usr/share/seabios/bios-256k.bin", + "/usr/share/qemu/linuxboot.bin", + "/usr/share/qemu/linuxboot_dma.bin", + ], + "color": RED, + "banner": """ +────────╔╦═══╦╗─╔╗ +────────║║╔══╣║─║║ +╔══╦╗╔╦═╝║╚══╣╚═╝║ +║╔╗║╚╝║╔╗║╔═╗╠══╗║ +║╔╗║║║║╚╝║╚═╝║──║║ +╚╝╚╩╩╩╩══╩═══╝──╚╝ +""" + }, + "armhf": { + #"container": "dd09cd400f78c4b617b662d567f7cfc0a0326b15f9acab66397b6acaca75b97a", + "container": "8b663a34fd062c0f426b72eb6b36528568a1e1a687bf82b1d3bb007b05f596d2", + "kerneltarget": "armmp", + "kernelargs": "", + "qemupkg": "arm", + "qemutarget": "arm", + "qemumachine": "virt", + "qemucpu": "cortex-a15", + "color": GREEN, + "banner": """ +────────╔╗──╔═╗ +────────║║──║╔╝ +╔══╦═╦╗╔╣╚═╦╝╚╗ +║╔╗║╔╣╚╝║╔╗╠╗╔╝ +║╔╗║║║║║║║║║║║ +╚╝╚╩╝╚╩╩╩╝╚╝╚╝ +""" + }, + "arm64": { + #"container": "911d2a333f9840e1d154e1a76234a44b6527ce01ca0f4ab562b2b93cd19851a4", + "container": "ea21828556b6940031d17d9729a028c0c7ee5460c41f83a5a00b966728cdcdb8", + "kerneltarget": "arm64", + "kernelargs": "", + "qemupkg": "arm", + "qemutarget": "aarch64", + "qemumachine": "virt", + "qemucpu": "cortex-a57", + "color": WHITE, + "banner": """ +────────╔═══╦╗─╔╗ +────────║╔══╣║─║║ +╔══╦═╦╗╔╣╚══╣╚═╝║ +║╔╗║╔╣╚╝║╔═╗╠══╗║ +║╔╗║║║║║║╚═╝║──║║ +╚╝╚╩╝╚╩╩╩═══╝──╚╝ +""" + }, + "mips64el": { + #"container": "75344a99047639a8ed43f0b44516acb6618d28f8615608aae5c58c33b075f216", + "container": "22e147a931c6ad0d71adabfefd0eb0021f7e9b2e0d5857d93e61268ca5606ba4", + "kerneltarget": "5kc-malta", + "kernelargs": "console=ttyS0", + "qemupkg": "mips", + "qemutarget": "mips64el", + "qemumachine": "malta", + "qemucpu": "5KEc", + "color": MAGENTA, + "banner": """ +──────────╔═══╦╗─╔╗──╔╗ +──────────║╔══╣║─║║──║║ +╔╗╔╦╦══╦══╣╚══╣╚═╝╠══╣║ +║╚╝╠╣╔╗║══╣╔═╗╠══╗║║═╣║ +║║║║║╚╝╠══║╚═╝║──║║║═╣╚╗ +╚╩╩╩╣╔═╩══╩═══╝──╚╩══╩═╝ +────║║ +────╚╝ +""" + }, + "ppc64el": { + #"container": "b72b33901ef0eb2dbefc1c8c3a1d91e3151834106507398826fcf8f6a7e07f1c", + "container": "742e74c0f54117b2b73e6112a76d18f7a2c22f6c2320f2b2a5be44eb23b117d4", + "kerneltarget": "powerpc64le", + "kernelargs": "", + "qemupkg": "ppc", + "qemutarget": "ppc64", + "qemumachine": "pseries", + "qemucpu": "power9_v2.0", + "color": YELLOW, + "banner": """ +─────────╔═══╦╗─╔╦╗ +─────────║╔══╣║─║║║ +╔══╦══╦══╣╚══╣╚═╝║║╔══╗ +║╔╗║╔╗║╔═╣╔═╗╠══╗║║║║═╣ +║╚╝║╚╝║╚═╣╚═╝║──║║╚╣║═╣ +║╔═╣╔═╩══╩═══╝──╚╩═╩══╝ +║║─║║ +╚╝─╚╝ +""" + }, + "s390x": { + #"container": "c455376d64c043d8b64ff4f46549c098fa6715d6138db88ac42510b741b33ca9", + "container": "26f472a4919725ba4bdb5796e1fd609db9d34fa0e175778502f19cc9ea220288", + "kerneltarget": "s390x", + "kernelargs": "", + "qemupkg": "misc", + "qemutarget": "s390x", + "qemumachine": "s390-ccw-virtio", + "qemucpu": "qemu", + "qemuassets": [ + "/usr/share/qemu/s390-ccw.img" + ], + "color": CYAN, + "banner": """ +───╔═══╦═══╦═══╗ +───║╔═╗║╔═╗║╔═╗║ +╔══╬╝╔╝║╚═╝║║║║╠╗╔╗ +║══╬╗╚╗╠══╗║║║║╠╬╬╝ +╠══║╚═╝╠══╝║╚═╝╠╬╬╗ +╚══╩═══╩═══╩═══╩╝╚╝ +""" + }, +} + + +def qemu_cmd(arch, kernel, initrd, ram): + qemutarget = archinfo[arch]["qemutarget"] + qemumachine = archinfo[arch]["qemumachine"] + qemucpu = archinfo[arch]["qemucpu"] + kernelargs = archinfo[arch]["kernelargs"] + return """qemu-system-%(target)s -machine %(machine)s -kernel %(kernel)s -initrd %(initrd)s -append "%(kernelargs)s quiet" -nodefaults -nographic -cpu %(cpu)s -m %(ram)s -serial stdio""" % { + "target": qemutarget, + "machine": qemumachine, + "cpu": qemucpu, + "kernelargs": kernelargs, + "kernel": kernel, + "initrd": initrd, + "ram": ram, + } + + +def make_initrd(arch, next_arch, chain, ram): + + initrdout = "initrd-" + arch + kernelout = "vmlinux-" + arch + + if chain is not None: + initrdout += "-" + chain + + container = archinfo[arch]["container"] + + kernelpkg = "linux-image-%s" % archinfo[arch]["kerneltarget"] + packages = [kernelpkg, "busybox-static", "python3", "cpio"] + + for otherarch in archinfo.keys(): + qemupkg = "qemu-system-%s" % archinfo[otherarch]["qemupkg"] + packages.append(qemupkg) + + here = os.getcwd() + + dockerfile = "bootstrap-%s.docker" % arch + with open(dockerfile, "w") as fp: + print(""" +FROM docker.io/library/debian@sha256:%(container)s + +RUN apt-get update && \ + rm -f /usr/bin/chfn && \ + cp /bin/true /usr/bin/chfn && \ + apt-get install -y %(packages)s +""" % { + "container": container, + "packages": " ".join(packages), + }, file=fp) + + subprocess.run(["podman", "build", "--tag", "bootstrap-%s" % arch, "-f", dockerfile, "."]) + + podmanargs = ["podman", "run", "--rm", + "--volume", here + ":/nested", "-it", + "bootstrap-%s" % arch, + "bash", "/nested/build-nested.sh"] + print(" ".join(podmanargs)) + + with open("doinit.sh", "w") as fp: + banner = archinfo[arch]["banner"] + color = archinfo[arch]["color"] + print("""#!/bin/sh +printf "\\033[40;%(color)sm" +echo "Running in %(arch)s..." +echo +cat < (/[^ ]+)", line) + if m is not None: + deps.append(m.group(1)) + else: + m = re.match("\s*(/[^ ]+)\s+\(.*\)\s*$", line) + if m is not None: + deps.append(m.group(1)) + return deps + except subprocess.CalledProcessError as ex: + out = ex.output.decode("utf8") + if "not a dynamic executable" in out: + return [] + raise + + + +def install_deps(tmpdir, binaries, verbose): + seen = {} + libs = [] + + for binary in binaries: + src = which(binary) + libs.extend(get_deps(src)) + + while len(libs): + todo = libs + libs = [] + for lib in todo: + if lib in seen: + continue + + dir = os.path.dirname(lib) + libdir = os.path.join(tmpdir, dir[1:]) + os.makedirs(libdir, exist_ok=True) + dst = os.path.join(tmpdir, lib[1:]) + copy(lib, dst) + if verbose: + print("Copy lib %s -> %s"% (lib, dst)) + seen[lib] = True + libs.extend(get_deps(lib)) + +def make_binaries(tmpdir, binaries, verbose): + bindir = os.path.join(tmpdir, "bin") + + for binary in binaries: + src = which(binary) + dst = os.path.join(tmpdir, "bin", os.path.basename(src)) + if os.path.exists(dst): + os.unlink(dst) + dstdir = os.path.dirname(dst) + if not os.path.exists(dstdir): + os.makedirs(dstdir) + + if verbose: + print("Copy bin %s -> %s" % (src, dst)) + copy(src, dst) + + install_deps(tmpdir, binaries, verbose) + + +def kmod_deps(modfile): + out = subprocess.check_output(["modinfo", modfile], stderr=subprocess.STDOUT).decode("utf8") + for line in out.split("\n"): + if line.startswith("depends: "): + deps = line[8:].strip() + if deps == "": + return [] + return [a.replace("-", "_") for a in deps.split(",")] + + +def copy_kmod(tmpdir, kmoddir, allmods, mod, verbose): + src = os.path.join(kmoddir, allmods[mod]) + dstdir = os.path.join(tmpdir, "lib", "modules") + if not os.path.exists(dstdir): + os.makedirs(dstdir) + dst = os.path.join(dstdir, os.path.basename(allmods[mod])) + if os.path.exists(dst): + return + if verbose: + print("Copy kmod %s -> %s" % (src, dst)) + copy(src, dst) + + loadmods = [] + for depmod in kmod_deps(src): + loadmods.extend(copy_kmod(tmpdir, kmoddir, allmods, depmod, verbose)) + + loadmods.append(os.path.join("/lib", "modules", + os.path.basename(allmods[mod]))) + return loadmods + + +def make_kmods(tmpdir, kmods, kver, verbose): + print(kver) + kmoddir = os.path.join("/lib", "modules", kver, "kernel") + if not os.path.exists(kmoddir): + raise Exception("kmod dir '%s' does not exist" % kmoddir) + + allmods = {} + for path in glob.glob(kmoddir + "/**/*.ko*", recursive=True): + mod = os.path.basename(path).split(".")[0] + mod = mod.replace("-", "_") + allmods[mod] = path + + loadmods = [] + for mod in kmods: + if mod not in allmods: + raise Exception("kmod '%s' does not exist" % mod) + loadmods.extend(copy_kmod(tmpdir, kmoddir, allmods, mod, verbose)) + return loadmods + +def make_image(tmpdir, output, copyfiles, kmods, kver, binaries, runcmd, blockdevs, verbose): + loadmods = make_kmods(tmpdir, kmods, kver, verbose) + make_busybox(tmpdir, runcmd, loadmods, blockdevs, verbose) + if len(loadmods) > 0 and "insmod" not in binaries: + binaries.append("insmod") + make_binaries(tmpdir, binaries, verbose) + + for copyfileglob in copyfiles: + for copyfile in glob.glob(copyfileglob, recursive=True): + bits = copyfile.split("=") + src = bits[0] + if len(bits) == 1: + dst = os.path.join(tmpdir, bits[0][1:]) + else: + dst = os.path.join(tmpdir, bits[1][1:]) + dstdir = os.path.dirname(dst) + os.makedirs(dstdir, exist_ok=True) + print("Copy extra %s -> %s" % (src, dst)) + copy(src, dst) + + files = glob.iglob(tmpdir + "/**", recursive=True) + prefix=len(tmpdir) + 1 + files = [f[prefix:] for f in files] + files = files[1:] + filelist = "\n".join(files).encode("utf8") + + with open(output, "w") as fh: + subprocess.run(["cpio", "--quiet", "-o", "-H", "newc"], + cwd=tmpdir, input=filelist, stdout=fh) + +parser = argparse.ArgumentParser(description='Build a tiny initrd image') +parser.add_argument('--output', default="tiny-initrd.img", + help='Filename of output file') +parser.add_argument('--run', default="setsid cttyhack /bin/sh", + help='Command to execute in guest (default: "setsid cttyhack /bin/sh")') +parser.add_argument('--copy', action="append", default=[], + help='Extra files to copy /src=/dst') +parser.add_argument('--kmod', action="append", default=[], + help='Kernel modules to load') +parser.add_argument('--kver', default=os.uname().release, + help='Kernel version to add modules for') +parser.add_argument('--blockdevs', action='store_true', + help='Wait for block devices and create /dev nodes') +parser.add_argument('--verbose', action='store_true', + help='Display information about contents of initrd') +parser.add_argument('binary', nargs="*", + help='List of binaries to include') + +args = parser.parse_args() + +if args.verbose: + print("Creating %s" % args.output) + +with TemporaryDirectory(prefix="make-tiny-image") as tmpdir: + make_image(tmpdir, args.output, args.copy, + args.kmod, args.kver, args.binary, args.run, + args.blockdevs, args.verbose) diff --git a/W/tiny-vm-tools/run-vm-usb.sh b/W/tiny-vm-tools/run-vm-usb.sh new file mode 100755 index 000000000..f01b15e7c --- /dev/null +++ b/W/tiny-vm-tools/run-vm-usb.sh @@ -0,0 +1,3 @@ +#!/bin/bash +#time qemu-system-aarch64 -machine virt -cpu cortex-a53 -kernel ../k/dst/linux-x86-allnoconfig/arch/arm64/boot/Image -initrd tiny-initrd.img -m 1000 -display none -serial stdio -audiodev id=none,driver=none +time ../qemu-8.2/build/qemu-system-aarch64 -machine virt -cpu cortex-a53 -kernel /boot/vmlinux -initrd tiny-initrd.img -m 1000 -display none -serial stdio -audiodev id=none,driver=none -usb -device nec-usb-xhci,id=xhci -device u2f-passthru,hidraw=/dev/hidraw5 -device usb-ccid -device ccid-card-emulated,backend=nss-emulated,id=smartcard0 diff --git a/W/tiny-vm-tools/run-vm.sh b/W/tiny-vm-tools/run-vm.sh new file mode 100755 index 000000000..e62d3bc2d --- /dev/null +++ b/W/tiny-vm-tools/run-vm.sh @@ -0,0 +1,3 @@ +#!/bin/bash +#time qemu-system-aarch64 -machine virt -cpu cortex-a53 -kernel ../k/dst/linux-x86-allnoconfig/arch/arm64/boot/Image -initrd tiny-initrd.img -m 1000 -display none -serial stdio -audiodev id=none,driver=none +time qemu-system-aarch64 -machine virt -cpu cortex-a53 -kernel /boot/vmlinux -initrd tiny-initrd.img -m 1000 -display none -serial stdio -audiodev id=none,driver=none