From 3edec0c6ca0932a583a0ed45d388303e3dc4fc11 Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Fri, 11 Feb 2022 14:56:09 +0100 Subject: [PATCH] pc: new usb host driver based on Linux 5.14.21 Original commit by Josef Soentgen. Ref genodelabs/genode#4416 --- .../pc/recipes/src/pc_usb_host_drv/content.mk | 18 + repos/pc/recipes/src/pc_usb_host_drv/hash | 1 + .../pc/recipes/src/pc_usb_host_drv/used_apis | 8 + repos/pc/src/drivers/usb_host/pc/dep.list | 1004 +++++++++++++++++ repos/pc/src/drivers/usb_host/pc/dummies.c | 463 ++++++++ .../drivers/usb_host/pc/generated_dummies.c | 678 +++++++++++ repos/pc/src/drivers/usb_host/pc/lx_emul.c | 205 ++++ repos/pc/src/drivers/usb_host/pc/lx_emul.h | 33 + .../usb_host/pc/lx_emul/initcall_order.h | 166 +++ .../drivers/usb_host/pc/lx_emul/pci_fixups.h | 22 + repos/pc/src/drivers/usb_host/pc/main.cc | 113 ++ repos/pc/src/drivers/usb_host/pc/misc.cc | 20 + .../drivers/usb_host/pc/spec/x86_32/dep.list | 14 + .../usb_host/pc/spec/x86_32/source.list | 116 ++ .../drivers/usb_host/pc/spec/x86_32/target.mk | 5 + .../drivers/usb_host/pc/spec/x86_64/dep.list | 14 + .../usb_host/pc/spec/x86_64/source.list | 117 ++ .../drivers/usb_host/pc/spec/x86_64/target.mk | 3 + repos/pc/src/drivers/usb_host/pc/target.inc | 28 + repos/pc/src/drivers/usb_host/pc/time.cc | 25 + repos/pc/src/drivers/usb_host/pc/usb.c | 573 ++++++++++ repos/pc/src/drivers/usb_host/pc/usb.h | 32 + repos/pc/src/lib/pc/lx_emul/common_dummies.c | 62 + 23 files changed, 3720 insertions(+) create mode 100644 repos/pc/recipes/src/pc_usb_host_drv/content.mk create mode 100644 repos/pc/recipes/src/pc_usb_host_drv/hash create mode 100644 repos/pc/recipes/src/pc_usb_host_drv/used_apis create mode 100644 repos/pc/src/drivers/usb_host/pc/dep.list create mode 100644 repos/pc/src/drivers/usb_host/pc/dummies.c create mode 100644 repos/pc/src/drivers/usb_host/pc/generated_dummies.c create mode 100644 repos/pc/src/drivers/usb_host/pc/lx_emul.c create mode 100644 repos/pc/src/drivers/usb_host/pc/lx_emul.h create mode 100644 repos/pc/src/drivers/usb_host/pc/lx_emul/initcall_order.h create mode 100644 repos/pc/src/drivers/usb_host/pc/lx_emul/pci_fixups.h create mode 100644 repos/pc/src/drivers/usb_host/pc/main.cc create mode 100644 repos/pc/src/drivers/usb_host/pc/misc.cc create mode 100644 repos/pc/src/drivers/usb_host/pc/spec/x86_32/dep.list create mode 100644 repos/pc/src/drivers/usb_host/pc/spec/x86_32/source.list create mode 100644 repos/pc/src/drivers/usb_host/pc/spec/x86_32/target.mk create mode 100644 repos/pc/src/drivers/usb_host/pc/spec/x86_64/dep.list create mode 100644 repos/pc/src/drivers/usb_host/pc/spec/x86_64/source.list create mode 100644 repos/pc/src/drivers/usb_host/pc/spec/x86_64/target.mk create mode 100644 repos/pc/src/drivers/usb_host/pc/target.inc create mode 100644 repos/pc/src/drivers/usb_host/pc/time.cc create mode 100644 repos/pc/src/drivers/usb_host/pc/usb.c create mode 100644 repos/pc/src/drivers/usb_host/pc/usb.h create mode 100644 repos/pc/src/lib/pc/lx_emul/common_dummies.c diff --git a/repos/pc/recipes/src/pc_usb_host_drv/content.mk b/repos/pc/recipes/src/pc_usb_host_drv/content.mk new file mode 100644 index 0000000000..f6878d7871 --- /dev/null +++ b/repos/pc/recipes/src/pc_usb_host_drv/content.mk @@ -0,0 +1,18 @@ +MIRROR_FROM_REP_DIR := src/drivers/usb_host/pc \ + src/lib/pc/lx_emul +MIRROR_FROM_OS_DIR := src/lib/genode_c_api/usb.cc + +content: $(MIRROR_FROM_REP_DIR) $(MIRROR_FROM_OS_DIR) + +$(MIRROR_FROM_REP_DIR): + $(mirror_from_rep_dir) + +$(MIRROR_FROM_OS_DIR): + mkdir -p $(dir $@) + cp -r $(GENODE_DIR)/repos/os/$@ $@ + +PORT_DIR := $(call port_dir,$(GENODE_DIR)/repos/dde_linux/ports/linux) + +content: LICENSE +LICENSE: + cp $(PORT_DIR)/src/linux/COPYING $@ diff --git a/repos/pc/recipes/src/pc_usb_host_drv/hash b/repos/pc/recipes/src/pc_usb_host_drv/hash new file mode 100644 index 0000000000..023d890834 --- /dev/null +++ b/repos/pc/recipes/src/pc_usb_host_drv/hash @@ -0,0 +1 @@ +2022-02-11-k 8f4071962fba9898b47db526132e3c11456d890c diff --git a/repos/pc/recipes/src/pc_usb_host_drv/used_apis b/repos/pc/recipes/src/pc_usb_host_drv/used_apis new file mode 100644 index 0000000000..afb8da2145 --- /dev/null +++ b/repos/pc/recipes/src/pc_usb_host_drv/used_apis @@ -0,0 +1,8 @@ +base +os +platform_session +timer_session +usb_session +report_session +genode_c_api +pc_linux diff --git a/repos/pc/src/drivers/usb_host/pc/dep.list b/repos/pc/src/drivers/usb_host/pc/dep.list new file mode 100644 index 0000000000..a5a33b5e1e --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/dep.list @@ -0,0 +1,1004 @@ +arch/x86/include/asm/alternative.h +arch/x86/include/asm/apicdef.h +arch/x86/include/asm/arch_hweight.h +arch/x86/include/asm/asm.h +arch/x86/include/asm/atomic.h +arch/x86/include/asm/barrier.h +arch/x86/include/asm/bitops.h +arch/x86/include/asm/bug.h +arch/x86/include/asm/cache.h +arch/x86/include/asm/cacheflush.h +arch/x86/include/asm/checksum.h +arch/x86/include/asm/clocksource.h +arch/x86/include/asm/cmpxchg.h +arch/x86/include/asm/compat.h +arch/x86/include/asm/cpu_entry_area.h +arch/x86/include/asm/cpufeatures.h +arch/x86/include/asm/cpumask.h +arch/x86/include/asm/delay.h +arch/x86/include/asm/desc.h +arch/x86/include/asm/desc_defs.h +arch/x86/include/asm/device.h +arch/x86/include/asm/disabled-features.h +arch/x86/include/asm/div64.h +arch/x86/include/asm/dma.h +arch/x86/include/asm/elf.h +arch/x86/include/asm/emergency-restart.h +arch/x86/include/asm/exec.h +arch/x86/include/asm/extable.h +arch/x86/include/asm/fixmap.h +arch/x86/include/asm/fpu/types.h +arch/x86/include/asm/fsgsbase.h +arch/x86/include/asm/ftrace.h +arch/x86/include/asm/hardirq.h +arch/x86/include/asm/hw_breakpoint.h +arch/x86/include/asm/hw_irq.h +arch/x86/include/asm/intel_ds.h +arch/x86/include/asm/invpcid.h +arch/x86/include/asm/io.h +arch/x86/include/asm/irq.h +arch/x86/include/asm/irq_vectors.h +arch/x86/include/asm/irq_work.h +arch/x86/include/asm/irqdomain.h +arch/x86/include/asm/ist.h +arch/x86/include/asm/jailhouse_para.h +arch/x86/include/asm/kdebug.h +arch/x86/include/asm/kgdb.h +arch/x86/include/asm/kprobes.h +arch/x86/include/asm/kvm_para.h +arch/x86/include/asm/linkage.h +arch/x86/include/asm/local.h +arch/x86/include/asm/math_emu.h +arch/x86/include/asm/mem_encrypt.h +arch/x86/include/asm/memtype.h +arch/x86/include/asm/mmu.h +arch/x86/include/asm/mmu_context.h +arch/x86/include/asm/module.h +arch/x86/include/asm/msi.h +arch/x86/include/asm/msr-index.h +arch/x86/include/asm/msr.h +arch/x86/include/asm/nops.h +arch/x86/include/asm/orc_types.h +arch/x86/include/asm/page_types.h +arch/x86/include/asm/paravirt.h +arch/x86/include/asm/pci.h +arch/x86/include/asm/pci_x86.h +arch/x86/include/asm/percpu.h +arch/x86/include/asm/perf_event.h +arch/x86/include/asm/pgtable_areas.h +arch/x86/include/asm/pgtable_types.h +arch/x86/include/asm/posix_types.h +arch/x86/include/asm/preempt.h +arch/x86/include/asm/processor-flags.h +arch/x86/include/asm/processor.h +arch/x86/include/asm/proto.h +arch/x86/include/asm/pti.h +arch/x86/include/asm/ptrace.h +arch/x86/include/asm/required-features.h +arch/x86/include/asm/rmwcc.h +arch/x86/include/asm/segment.h +arch/x86/include/asm/set_memory.h +arch/x86/include/asm/shmparam.h +arch/x86/include/asm/signal.h +arch/x86/include/asm/smap.h +arch/x86/include/asm/smp.h +arch/x86/include/asm/special_insns.h +arch/x86/include/asm/stacktrace.h +arch/x86/include/asm/static_call.h +arch/x86/include/asm/string.h +arch/x86/include/asm/syscall_wrapper.h +arch/x86/include/asm/text-patching.h +arch/x86/include/asm/thread_info.h +arch/x86/include/asm/timex.h +arch/x86/include/asm/tlb.h +arch/x86/include/asm/tlbbatch.h +arch/x86/include/asm/tlbflush.h +arch/x86/include/asm/topology.h +arch/x86/include/asm/trace_clock.h +arch/x86/include/asm/tsc.h +arch/x86/include/asm/uaccess.h +arch/x86/include/asm/unistd.h +arch/x86/include/asm/unwind_hints.h +arch/x86/include/asm/user.h +arch/x86/include/asm/user32.h +arch/x86/include/asm/vdso.h +arch/x86/include/asm/vdso/clocksource.h +arch/x86/include/asm/vdso/processor.h +arch/x86/include/asm/vga.h +arch/x86/include/asm/vmalloc.h +arch/x86/include/asm/vmxfeatures.h +arch/x86/include/asm/word-at-a-time.h +arch/x86/include/asm/x86_init.h +arch/x86/include/uapi/asm/auxvec.h +arch/x86/include/uapi/asm/bitsperlong.h +arch/x86/include/uapi/asm/bootparam.h +arch/x86/include/uapi/asm/byteorder.h +arch/x86/include/uapi/asm/hw_breakpoint.h +arch/x86/include/uapi/asm/ist.h +arch/x86/include/uapi/asm/kvm_para.h +arch/x86/include/uapi/asm/ldt.h +arch/x86/include/uapi/asm/mman.h +arch/x86/include/uapi/asm/msr.h +arch/x86/include/uapi/asm/perf_regs.h +arch/x86/include/uapi/asm/processor-flags.h +arch/x86/include/uapi/asm/ptrace-abi.h +arch/x86/include/uapi/asm/ptrace.h +arch/x86/include/uapi/asm/sembuf.h +arch/x86/include/uapi/asm/shmbuf.h +arch/x86/include/uapi/asm/sigcontext.h +arch/x86/include/uapi/asm/siginfo.h +arch/x86/include/uapi/asm/signal.h +arch/x86/include/uapi/asm/stat.h +arch/x86/include/uapi/asm/swab.h +arch/x86/include/uapi/asm/unistd.h +drivers/base/base.h +drivers/base/power/power.h +drivers/base/trace.h +drivers/pci/pci.h +drivers/pci/pcie/portdrv.h +drivers/usb/common/common.h +drivers/usb/core/hub.h +drivers/usb/core/otg_productlist.h +drivers/usb/core/phy.h +drivers/usb/core/usb.h +drivers/usb/host/ehci-dbg.c +drivers/usb/host/ehci-hub.c +drivers/usb/host/ehci-mem.c +drivers/usb/host/ehci-q.c +drivers/usb/host/ehci-sched.c +drivers/usb/host/ehci-sysfs.c +drivers/usb/host/ehci-timer.c +drivers/usb/host/ehci.h +drivers/usb/host/ohci-dbg.c +drivers/usb/host/ohci-hub.c +drivers/usb/host/ohci-mem.c +drivers/usb/host/ohci-q.c +drivers/usb/host/ohci.h +drivers/usb/host/pci-quirks.h +drivers/usb/host/xhci-dbgcap.h +drivers/usb/host/xhci-debugfs.h +drivers/usb/host/xhci-ext-caps.h +drivers/usb/host/xhci-pci.h +drivers/usb/host/xhci-trace.h +drivers/usb/host/xhci.h +include/acpi/acbuffer.h +include/acpi/acconfig.h +include/acpi/acexcep.h +include/acpi/acnames.h +include/acpi/acoutput.h +include/acpi/acpi.h +include/acpi/acpi_numa.h +include/acpi/acpiosxf.h +include/acpi/acpixf.h +include/acpi/acrestyp.h +include/acpi/actbl.h +include/acpi/actbl1.h +include/acpi/actbl2.h +include/acpi/actbl3.h +include/acpi/actypes.h +include/acpi/platform/acenv.h +include/acpi/platform/acenvex.h +include/acpi/platform/acgcc.h +include/acpi/platform/acgccex.h +include/acpi/platform/aclinux.h +include/acpi/platform/aclinuxex.h +include/asm-generic/atomic-instrumented.h +include/asm-generic/atomic-long.h +include/asm-generic/barrier.h +include/asm-generic/bitops/const_hweight.h +include/asm-generic/bitops/ext2-atomic-setbit.h +include/asm-generic/bitops/find.h +include/asm-generic/bitops/instrumented-atomic.h +include/asm-generic/bitops/instrumented-lock.h +include/asm-generic/bitops/instrumented-non-atomic.h +include/asm-generic/bitops/le.h +include/asm-generic/bitops/sched.h +include/asm-generic/bitsperlong.h +include/asm-generic/bug.h +include/asm-generic/cacheflush.h +include/asm-generic/compat.h +include/asm-generic/delay.h +include/asm-generic/early_ioremap.h +include/asm-generic/error-injection.h +include/asm-generic/fixmap.h +include/asm-generic/getorder.h +include/asm-generic/int-ll64.h +include/asm-generic/io.h +include/asm-generic/ioctl.h +include/asm-generic/iomap.h +include/asm-generic/irq_regs.h +include/asm-generic/kmap_size.h +include/asm-generic/kprobes.h +include/asm-generic/local64.h +include/asm-generic/logic_io.h +include/asm-generic/mmiowb.h +include/asm-generic/mmu_context.h +include/asm-generic/module.h +include/asm-generic/param.h +include/asm-generic/pci.h +include/asm-generic/pci_iomap.h +include/asm-generic/percpu.h +include/asm-generic/pgtable-nop4d.h +include/asm-generic/resource.h +include/asm-generic/rwonce.h +include/asm-generic/sections.h +include/asm-generic/set_memory.h +include/asm-generic/termios.h +include/asm-generic/tlb.h +include/asm-generic/topology.h +include/asm-generic/unaligned.h +include/crypto/sha1.h +include/linux/acpi.h +include/linux/acpi_iort.h +include/linux/aer.h +include/linux/alarmtimer.h +include/linux/align.h +include/linux/apm_bios.h +include/linux/arch_topology.h +include/linux/assoc_array.h +include/linux/async.h +include/linux/atomic-arch-fallback.h +include/linux/atomic.h +include/linux/audit.h +include/linux/auxvec.h +include/linux/backing-dev-defs.h +include/linux/bcd.h +include/linux/binfmts.h +include/linux/bio.h +include/linux/bit_spinlock.h +include/linux/bitfield.h +include/linux/bitmap.h +include/linux/bitops.h +include/linux/bitrev.h +include/linux/bits.h +include/linux/blk-cgroup.h +include/linux/blk_types.h +include/linux/blkdev.h +include/linux/bottom_half.h +include/linux/bpf-cgroup.h +include/linux/bpf-netns.h +include/linux/bpf.h +include/linux/bpfptr.h +include/linux/bsg.h +include/linux/bug.h +include/linux/build_bug.h +include/linux/buildid.h +include/linux/bvec.h +include/linux/byteorder/generic.h +include/linux/byteorder/little_endian.h +include/linux/cache.h +include/linux/capability.h +include/linux/cc_platform.h +include/linux/cdev.h +include/linux/cfi.h +include/linux/cgroup-defs.h +include/linux/cgroup.h +include/linux/clk-provider.h +include/linux/clk.h +include/linux/clk/clk-conf.h +include/linux/clockchips.h +include/linux/clocksource.h +include/linux/clocksource_ids.h +include/linux/compat.h +include/linux/compiler-gcc.h +include/linux/compiler.h +include/linux/compiler_attributes.h +include/linux/compiler_types.h +include/linux/completion.h +include/linux/component.h +include/linux/console.h +include/linux/console_struct.h +include/linux/consolemap.h +include/linux/const.h +include/linux/context_tracking.h +include/linux/context_tracking_state.h +include/linux/cpu.h +include/linux/cpufreq.h +include/linux/cpuhotplug.h +include/linux/cpuidle.h +include/linux/cpumask.h +include/linux/cpuset.h +include/linux/crash_core.h +include/linux/crc32.h +include/linux/crc32poly.h +include/linux/cred.h +include/linux/ctype.h +include/linux/dax.h +include/linux/dcache.h +include/linux/debug_locks.h +include/linux/debugfs.h +include/linux/debugobjects.h +include/linux/delay.h +include/linux/delayacct.h +include/linux/delayed_call.h +include/linux/dev_printk.h +include/linux/device.h +include/linux/device/bus.h +include/linux/device/class.h +include/linux/device/driver.h +include/linux/dma-direction.h +include/linux/dma-map-ops.h +include/linux/dma-mapping.h +include/linux/dmapool.h +include/linux/dmi.h +include/linux/dqblk_qtree.h +include/linux/dqblk_v1.h +include/linux/dqblk_v2.h +include/linux/dynamic_queue_limits.h +include/linux/edd.h +include/linux/elevator.h +include/linux/elf-randomize.h +include/linux/elf.h +include/linux/elfcore.h +include/linux/energy_model.h +include/linux/err.h +include/linux/errname.h +include/linux/errno.h +include/linux/error-injection.h +include/linux/errseq.h +include/linux/etherdevice.h +include/linux/ethtool.h +include/linux/eventfd.h +include/linux/export.h +include/linux/extcon.h +include/linux/fault-inject-usercopy.h +include/linux/fault-inject.h +include/linux/fcntl.h +include/linux/file.h +include/linux/filter.h +include/linux/flex_proportions.h +include/linux/freelist.h +include/linux/freezer.h +include/linux/fs.h +include/linux/fs_context.h +include/linux/fs_types.h +include/linux/ftrace.h +include/linux/ftrace_irq.h +include/linux/fwnode.h +include/linux/genalloc.h +include/linux/genhd.h +include/linux/gfp.h +include/linux/gpio/consumer.h +include/linux/hardirq.h +include/linux/hash.h +include/linux/hashtable.h +include/linux/highmem-internal.h +include/linux/highmem.h +include/linux/highuid.h +include/linux/hrtimer.h +include/linux/hrtimer_defs.h +include/linux/huge_mm.h +include/linux/hugetlb.h +include/linux/hugetlb_inline.h +include/linux/hypervisor.h +include/linux/icmpv6.h +include/linux/idr.h +include/linux/if_arp.h +include/linux/if_ether.h +include/linux/if_link.h +include/linux/if_vlan.h +include/linux/in.h +include/linux/in6.h +include/linux/indirect_call_wrapper.h +include/linux/init.h +include/linux/init_task.h +include/linux/instrumentation.h +include/linux/instrumented.h +include/linux/interrupt.h +include/linux/interval_tree.h +include/linux/io-64-nonatomic-lo-hi.h +include/linux/io.h +include/linux/iocontext.h +include/linux/iopoll.h +include/linux/ioport.h +include/linux/ioprio.h +include/linux/ipc.h +include/linux/ipv6.h +include/linux/irq.h +include/linux/irq_work.h +include/linux/irqchip.h +include/linux/irqdesc.h +include/linux/irqdomain.h +include/linux/irqflags.h +include/linux/irqhandler.h +include/linux/irqnr.h +include/linux/irqreturn.h +include/linux/jhash.h +include/linux/jiffies.h +include/linux/jump_label.h +include/linux/jump_label_ratelimit.h +include/linux/kallsyms.h +include/linux/kasan-checks.h +include/linux/kasan.h +include/linux/kconfig.h +include/linux/kcov.h +include/linux/kcsan-checks.h +include/linux/kcsan.h +include/linux/kdebug.h +include/linux/kdev_t.h +include/linux/kern_levels.h +include/linux/kernel.h +include/linux/kernel_read_file.h +include/linux/kernel_stat.h +include/linux/kernfs.h +include/linux/kexec.h +include/linux/key.h +include/linux/kfifo.h +include/linux/kgdb.h +include/linux/klist.h +include/linux/kmemleak.h +include/linux/kmod.h +include/linux/kmsg_dump.h +include/linux/kobject.h +include/linux/kobject_ns.h +include/linux/kprobes.h +include/linux/kref.h +include/linux/kstrtox.h +include/linux/kthread.h +include/linux/ktime.h +include/linux/kvm_para.h +include/linux/latencytop.h +include/linux/limits.h +include/linux/linkage.h +include/linux/linkmode.h +include/linux/list.h +include/linux/list_bl.h +include/linux/list_lru.h +include/linux/list_nulls.h +include/linux/list_sort.h +include/linux/livepatch.h +include/linux/llist.h +include/linux/local_lock.h +include/linux/local_lock_internal.h +include/linux/lockdep.h +include/linux/lockdep_types.h +include/linux/lockref.h +include/linux/log2.h +include/linux/logic_pio.h +include/linux/math.h +include/linux/math64.h +include/linux/mdio.h +include/linux/mem_encrypt.h +include/linux/memblock.h +include/linux/memcontrol.h +include/linux/memory_hotplug.h +include/linux/mempolicy.h +include/linux/mempool.h +include/linux/memremap.h +include/linux/migrate.h +include/linux/migrate_mode.h +include/linux/mii.h +include/linux/mii_timestamper.h +include/linux/minmax.h +include/linux/mm.h +include/linux/mm_types.h +include/linux/mm_types_task.h +include/linux/mman.h +include/linux/mmap_lock.h +include/linux/mmdebug.h +include/linux/mmu_context.h +include/linux/mmu_notifier.h +include/linux/mmzone.h +include/linux/mod_devicetable.h +include/linux/module.h +include/linux/moduleparam.h +include/linux/mount.h +include/linux/msi.h +include/linux/mutex.h +include/linux/net.h +include/linux/netdev_features.h +include/linux/netdevice.h +include/linux/netfilter_defs.h +include/linux/netlink.h +include/linux/nfs_fs_i.h +include/linux/nls.h +include/linux/nmi.h +include/linux/node.h +include/linux/nodemask.h +include/linux/notifier.h +include/linux/ns_common.h +include/linux/nsproxy.h +include/linux/numa.h +include/linux/nvmem-provider.h +include/linux/objtool.h +include/linux/of.h +include/linux/of_address.h +include/linux/of_clk.h +include/linux/of_device.h +include/linux/of_fdt.h +include/linux/of_graph.h +include/linux/of_irq.h +include/linux/of_pci.h +include/linux/of_platform.h +include/linux/once.h +include/linux/once_lite.h +include/linux/osq_lock.h +include/linux/overflow.h +include/linux/page-flags-layout.h +include/linux/page-flags.h +include/linux/page_counter.h +include/linux/page_ext.h +include/linux/page_ref.h +include/linux/pageblock-flags.h +include/linux/pagemap.h +include/linux/panic.h +include/linux/panic_notifier.h +include/linux/path.h +include/linux/pci-dma-compat.h +include/linux/pci.h +include/linux/pci_hotplug.h +include/linux/pci_ids.h +include/linux/percpu-defs.h +include/linux/percpu-refcount.h +include/linux/percpu-rwsem.h +include/linux/percpu.h +include/linux/percpu_counter.h +include/linux/perf_event.h +include/linux/perf_regs.h +include/linux/personality.h +include/linux/pfn.h +include/linux/phy.h +include/linux/phy/phy-dp.h +include/linux/phy/phy-mipi-dphy.h +include/linux/phy/phy.h +include/linux/pid.h +include/linux/pid_namespace.h +include/linux/pinctrl/devinfo.h +include/linux/pipe_fs_i.h +include/linux/pkeys.h +include/linux/platform_device.h +include/linux/plist.h +include/linux/pm.h +include/linux/pm_domain.h +include/linux/pm_qos.h +include/linux/pm_runtime.h +include/linux/pm_wakeup.h +include/linux/poison.h +include/linux/poll.h +include/linux/posix-timers.h +include/linux/prandom.h +include/linux/preempt.h +include/linux/prefetch.h +include/linux/printk.h +include/linux/proc_fs.h +include/linux/processor.h +include/linux/profile.h +include/linux/projid.h +include/linux/property.h +include/linux/pseudo_fs.h +include/linux/psi.h +include/linux/psi_types.h +include/linux/ptr_ring.h +include/linux/ptrace.h +include/linux/pvclock_gtod.h +include/linux/quota.h +include/linux/radix-tree.h +include/linux/random.h +include/linux/range.h +include/linux/ratelimit.h +include/linux/ratelimit_types.h +include/linux/rbtree.h +include/linux/rbtree_augmented.h +include/linux/rbtree_latch.h +include/linux/rcu_segcblist.h +include/linux/rcu_sync.h +include/linux/rculist.h +include/linux/rculist_bl.h +include/linux/rculist_nulls.h +include/linux/rcupdate.h +include/linux/rcupdate_wait.h +include/linux/rcutiny.h +include/linux/rcuwait.h +include/linux/reboot.h +include/linux/refcount.h +include/linux/regulator/consumer.h +include/linux/reset.h +include/linux/resource.h +include/linux/resource_ext.h +include/linux/restart_block.h +include/linux/rhashtable-types.h +include/linux/ring_buffer.h +include/linux/rtc.h +include/linux/rtnetlink.h +include/linux/rwlock.h +include/linux/rwlock_types.h +include/linux/rwsem.h +include/linux/sbitmap.h +include/linux/scatterlist.h +include/linux/sched.h +include/linux/sched/autogroup.h +include/linux/sched/clock.h +include/linux/sched/coredump.h +include/linux/sched/cpufreq.h +include/linux/sched/cputime.h +include/linux/sched/deadline.h +include/linux/sched/debug.h +include/linux/sched/hotplug.h +include/linux/sched/idle.h +include/linux/sched/init.h +include/linux/sched/isolation.h +include/linux/sched/jobctl.h +include/linux/sched/loadavg.h +include/linux/sched/mm.h +include/linux/sched/nohz.h +include/linux/sched/numa_balancing.h +include/linux/sched/prio.h +include/linux/sched/rt.h +include/linux/sched/signal.h +include/linux/sched/smt.h +include/linux/sched/stat.h +include/linux/sched/sysctl.h +include/linux/sched/task.h +include/linux/sched/task_stack.h +include/linux/sched/topology.h +include/linux/sched/types.h +include/linux/sched/user.h +include/linux/sched/wake_q.h +include/linux/sched/xacct.h +include/linux/sched_clock.h +include/linux/screen_info.h +include/linux/seccomp.h +include/linux/securebits.h +include/linux/security.h +include/linux/sem.h +include/linux/semaphore.h +include/linux/seq_buf.h +include/linux/seq_file.h +include/linux/seq_file_net.h +include/linux/seqlock.h +include/linux/set_memory.h +include/linux/shm.h +include/linux/shrinker.h +include/linux/signal.h +include/linux/signal_types.h +include/linux/siphash.h +include/linux/sizes.h +include/linux/skbuff.h +include/linux/slab.h +include/linux/smp.h +include/linux/smp_types.h +include/linux/smpboot.h +include/linux/socket.h +include/linux/sockptr.h +include/linux/sort.h +include/linux/spinlock.h +include/linux/spinlock_api_up.h +include/linux/spinlock_types.h +include/linux/spinlock_types_up.h +include/linux/spinlock_up.h +include/linux/splice.h +include/linux/srcu.h +include/linux/srcutiny.h +include/linux/stackdepot.h +include/linux/stacktrace.h +include/linux/stat.h +include/linux/static_call.h +include/linux/static_call_types.h +include/linux/static_key.h +include/linux/stddef.h +include/linux/stop_machine.h +include/linux/string.h +include/linux/string_helpers.h +include/linux/stringhash.h +include/linux/stringify.h +include/linux/suspend.h +include/linux/swab.h +include/linux/swait.h +include/linux/swap.h +include/linux/sync_core.h +include/linux/syscall_user_dispatch.h +include/linux/syscalls.h +include/linux/syscore_ops.h +include/linux/sysctl.h +include/linux/sysfs.h +include/linux/sysrq.h +include/linux/task_io_accounting.h +include/linux/task_work.h +include/linux/tcp.h +include/linux/textsearch.h +include/linux/thread_info.h +include/linux/threads.h +include/linux/tick.h +include/linux/time.h +include/linux/time32.h +include/linux/time64.h +include/linux/timecounter.h +include/linux/timekeeper_internal.h +include/linux/timekeeping.h +include/linux/timer.h +include/linux/timerqueue.h +include/linux/timex.h +include/linux/topology.h +include/linux/trace_clock.h +include/linux/trace_events.h +include/linux/trace_recursion.h +include/linux/trace_seq.h +include/linux/tracepoint-defs.h +include/linux/tracepoint.h +include/linux/tsacct_kern.h +include/linux/tty.h +include/linux/tty_driver.h +include/linux/tty_ldisc.h +include/linux/typecheck.h +include/linux/types.h +include/linux/u64_stats_sync.h +include/linux/uaccess.h +include/linux/udp.h +include/linux/uidgid.h +include/linux/uio.h +include/linux/umh.h +include/linux/unaligned/packed_struct.h +include/linux/uprobes.h +include/linux/usb.h +include/linux/usb/cdc.h +include/linux/usb/ch9.h +include/linux/usb/ehci-dbgp.h +include/linux/usb/ehci_def.h +include/linux/usb/hcd.h +include/linux/usb/of.h +include/linux/usb/otg.h +include/linux/usb/phy.h +include/linux/usb/quirks.h +include/linux/usbdevice_fs.h +include/linux/user.h +include/linux/user_namespace.h +include/linux/userfaultfd_k.h +include/linux/utsname.h +include/linux/uuid.h +include/linux/vgaarb.h +include/linux/vm_event_item.h +include/linux/vmalloc.h +include/linux/vmpressure.h +include/linux/vmstat.h +include/linux/vt.h +include/linux/vt_kern.h +include/linux/vtime.h +include/linux/wait.h +include/linux/wait_bit.h +include/linux/win_minmax.h +include/linux/workqueue.h +include/linux/writeback.h +include/linux/ww_mutex.h +include/linux/xarray.h +include/net/addrconf.h +include/net/checksum.h +include/net/dst.h +include/net/dst_ops.h +include/net/fib_notifier.h +include/net/fib_rules.h +include/net/flow.h +include/net/flow_dissector.h +include/net/flow_offload.h +include/net/gen_stats.h +include/net/if_inet6.h +include/net/inet_connection_sock.h +include/net/inet_frag.h +include/net/inet_sock.h +include/net/inet_timewait_sock.h +include/net/ipv6.h +include/net/ipv6_stubs.h +include/net/l3mdev.h +include/net/ndisc.h +include/net/neighbour.h +include/net/net_namespace.h +include/net/netlink.h +include/net/netns/bpf.h +include/net/netns/can.h +include/net/netns/core.h +include/net/netns/hash.h +include/net/netns/ieee802154_6lowpan.h +include/net/netns/ipv4.h +include/net/netns/ipv6.h +include/net/netns/mib.h +include/net/netns/mpls.h +include/net/netns/netfilter.h +include/net/netns/nexthop.h +include/net/netns/nftables.h +include/net/netns/packet.h +include/net/netns/sctp.h +include/net/netns/smc.h +include/net/netns/unix.h +include/net/netns/x_tables.h +include/net/netns/xdp.h +include/net/netns/xfrm.h +include/net/netprio_cgroup.h +include/net/page_pool.h +include/net/request_sock.h +include/net/rtnetlink.h +include/net/sch_generic.h +include/net/scm.h +include/net/snmp.h +include/net/sock.h +include/net/tcp_states.h +include/net/timewait_sock.h +include/net/xdp.h +include/trace/define_trace.h +include/trace/events/irq.h +include/trace/events/power.h +include/trace/events/sched.h +include/trace/events/timer.h +include/trace/events/tlb.h +include/trace/events/workqueue.h +include/trace/syscall.h +include/uapi/asm-generic/bitsperlong.h +include/uapi/asm-generic/bpf_perf_event.h +include/uapi/asm-generic/errno-base.h +include/uapi/asm-generic/errno.h +include/uapi/asm-generic/fcntl.h +include/uapi/asm-generic/hugetlb_encode.h +include/uapi/asm-generic/int-ll64.h +include/uapi/asm-generic/ioctl.h +include/uapi/asm-generic/ioctls.h +include/uapi/asm-generic/ipcbuf.h +include/uapi/asm-generic/mman-common.h +include/uapi/asm-generic/mman.h +include/uapi/asm-generic/param.h +include/uapi/asm-generic/poll.h +include/uapi/asm-generic/posix_types.h +include/uapi/asm-generic/resource.h +include/uapi/asm-generic/shmbuf.h +include/uapi/asm-generic/siginfo.h +include/uapi/asm-generic/signal-defs.h +include/uapi/asm-generic/socket.h +include/uapi/asm-generic/sockios.h +include/uapi/asm-generic/termbits.h +include/uapi/asm-generic/termios.h +include/uapi/asm-generic/types.h +include/uapi/linux/aio_abi.h +include/uapi/linux/apm_bios.h +include/uapi/linux/audit.h +include/uapi/linux/auxvec.h +include/uapi/linux/binfmts.h +include/uapi/linux/blkzoned.h +include/uapi/linux/bpf.h +include/uapi/linux/bpf_common.h +include/uapi/linux/bpf_perf_event.h +include/uapi/linux/bsg.h +include/uapi/linux/byteorder/little_endian.h +include/uapi/linux/capability.h +include/uapi/linux/cgroupstats.h +include/uapi/linux/const.h +include/uapi/linux/dqblk_xfs.h +include/uapi/linux/edd.h +include/uapi/linux/elf-em.h +include/uapi/linux/elf.h +include/uapi/linux/errno.h +include/uapi/linux/ethtool.h +include/uapi/linux/eventpoll.h +include/uapi/linux/fcntl.h +include/uapi/linux/fib_rules.h +include/uapi/linux/filter.h +include/uapi/linux/fs.h +include/uapi/linux/gen_stats.h +include/uapi/linux/hdlc/ioctl.h +include/uapi/linux/icmpv6.h +include/uapi/linux/if.h +include/uapi/linux/if_addr.h +include/uapi/linux/if_arp.h +include/uapi/linux/if_bonding.h +include/uapi/linux/if_ether.h +include/uapi/linux/if_link.h +include/uapi/linux/if_packet.h +include/uapi/linux/if_vlan.h +include/uapi/linux/in.h +include/uapi/linux/in6.h +include/uapi/linux/ioctl.h +include/uapi/linux/ipc.h +include/uapi/linux/ipv6.h +include/uapi/linux/irqnr.h +include/uapi/linux/kcov.h +include/uapi/linux/kd.h +include/uapi/linux/kdev_t.h +include/uapi/linux/kernel.h +include/uapi/linux/kexec.h +include/uapi/linux/kvm_para.h +include/uapi/linux/libc-compat.h +include/uapi/linux/limits.h +include/uapi/linux/magic.h +include/uapi/linux/major.h +include/uapi/linux/mdio.h +include/uapi/linux/membarrier.h +include/uapi/linux/mempolicy.h +include/uapi/linux/mii.h +include/uapi/linux/mman.h +include/uapi/linux/neighbour.h +include/uapi/linux/net.h +include/uapi/linux/net_tstamp.h +include/uapi/linux/netdevice.h +include/uapi/linux/netfilter.h +include/uapi/linux/netfilter/nf_tables.h +include/uapi/linux/netlink.h +include/uapi/linux/openat2.h +include/uapi/linux/param.h +include/uapi/linux/pci.h +include/uapi/linux/pci_regs.h +include/uapi/linux/perf_event.h +include/uapi/linux/personality.h +include/uapi/linux/pkt_cls.h +include/uapi/linux/pkt_sched.h +include/uapi/linux/poll.h +include/uapi/linux/posix_types.h +include/uapi/linux/ptrace.h +include/uapi/linux/quota.h +include/uapi/linux/random.h +include/uapi/linux/reboot.h +include/uapi/linux/resource.h +include/uapi/linux/rseq.h +include/uapi/linux/rtc.h +include/uapi/linux/rtnetlink.h +include/uapi/linux/sched.h +include/uapi/linux/sched/types.h +include/uapi/linux/screen_info.h +include/uapi/linux/seccomp.h +include/uapi/linux/securebits.h +include/uapi/linux/sem.h +include/uapi/linux/shm.h +include/uapi/linux/signal.h +include/uapi/linux/snmp.h +include/uapi/linux/socket.h +include/uapi/linux/sockios.h +include/uapi/linux/stat.h +include/uapi/linux/stddef.h +include/uapi/linux/string.h +include/uapi/linux/swab.h +include/uapi/linux/sysctl.h +include/uapi/linux/sysinfo.h +include/uapi/linux/taskstats.h +include/uapi/linux/tcp.h +include/uapi/linux/termios.h +include/uapi/linux/time.h +include/uapi/linux/time_types.h +include/uapi/linux/timex.h +include/uapi/linux/tty.h +include/uapi/linux/tty_flags.h +include/uapi/linux/types.h +include/uapi/linux/udp.h +include/uapi/linux/uio.h +include/uapi/linux/unistd.h +include/uapi/linux/usb/audio.h +include/uapi/linux/usb/cdc.h +include/uapi/linux/usb/ch11.h +include/uapi/linux/usb/ch9.h +include/uapi/linux/usb/charger.h +include/uapi/linux/usbdevice_fs.h +include/uapi/linux/utsname.h +include/uapi/linux/uuid.h +include/uapi/linux/vt.h +include/uapi/linux/wait.h +include/uapi/linux/xfrm.h +include/uapi/video/edid.h +include/vdso/bits.h +include/vdso/clocksource.h +include/vdso/const.h +include/vdso/jiffies.h +include/vdso/ktime.h +include/vdso/limits.h +include/vdso/math64.h +include/vdso/time.h +include/vdso/time32.h +include/vdso/time64.h +include/video/edid.h +include/video/vga.h +kernel/irq/debug.h +kernel/irq/internals.h +kernel/irq/settings.h +kernel/locking/lock_events.h +kernel/locking/lock_events_list.h +kernel/locking/mutex.h +kernel/sched/autogroup.h +kernel/sched/cpudeadline.h +kernel/sched/cpupri.h +kernel/sched/features.h +kernel/sched/sched.h +kernel/sched/stats.h +kernel/smpboot.h +kernel/time/ntp_internal.h +kernel/time/tick-internal.h +kernel/time/tick-sched.h +kernel/time/timekeeping.h +kernel/time/timekeeping_internal.h +kernel/workqueue_internal.h +lib/crc32defs.h +lib/kstrtox.h +mm/internal.h +mm/slab.h diff --git a/repos/pc/src/drivers/usb_host/pc/dummies.c b/repos/pc/src/drivers/usb_host/pc/dummies.c new file mode 100644 index 0000000000..cd7174c5d6 --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/dummies.c @@ -0,0 +1,463 @@ +/* + * \brief Dummy definitions of Linux Kernel functions - handled manually + * \author Josef Soentgen + * \date 2022-01-10 + */ + +/* + * Copyright (C) 2021 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +#include + +#include + +int __cpuhp_setup_state(enum cpuhp_state state,const char * name,bool invoke,int (* startup)(unsigned int cpu),int (* teardown)(unsigned int cpu),bool multi_instance) +{ + lx_emul_trace(__func__); + return 0; +} + + +#include + +void update_vsyscall(struct timekeeper * tk) +{ + lx_emul_trace(__func__); +} + + +#include + +void clocksource_arch_init(struct clocksource * cs) +{ + lx_emul_trace(__func__); +} + + +#include + +void ignore_signals(struct task_struct * t) +{ + lx_emul_trace(__func__); +} + + +#include + +void calc_global_load(void) +{ + lx_emul_trace(__func__); +} + + +#include + +void account_process_tick(struct task_struct * p,int user_tick) +{ + lx_emul_trace(__func__); +} + + +#include + +unsigned long lpj_fine = 0; + + +#include + +void rcu_sched_clock_irq(int user) +{ + lx_emul_trace(__func__); +} + + +#include + +int sysfs_create_bin_file(struct kobject * kobj,const struct bin_attribute * attr) +{ + lx_emul_trace(__func__); + return 0; +} + + +#include + +int sysfs_create_dir_ns(struct kobject * kobj,const void * ns) +{ + lx_emul_trace(__func__); + return 0; +} + + +#include + +int sysfs_create_file_ns(struct kobject * kobj,const struct attribute * attr,const void * ns) +{ + lx_emul_trace(__func__); + return 0; +} + + +#include + +int sysfs_create_groups(struct kobject * kobj,const struct attribute_group ** groups) +{ + lx_emul_trace(__func__); + return 0; +} + + +#include + +int sysfs_create_group(struct kobject * kobj,const struct attribute_group * grp) +{ + lx_emul_trace(__func__); + return 0; +} + + +#include + +int sysfs_create_link(struct kobject * kobj,struct kobject * target,const char * name) +{ + lx_emul_trace(__func__); + return 0; +} + + +#include + +void sysfs_remove_link(struct kobject * kobj,const char * name) +{ + lx_emul_trace(__func__); +} + + +#include + +void sysfs_remove_file_ns(struct kobject * kobj,const struct attribute * attr,const void * ns) +{ + lx_emul_trace(__func__); +} + + +#include + +void sysfs_remove_groups(struct kobject * kobj,const struct attribute_group ** groups) +{ + lx_emul_trace(__func__); +} + + +#include + +void sysfs_remove_dir(struct kobject * kobj) +{ + lx_emul_trace(__func__); +} + + +#include + +void sysfs_remove_bin_file(struct kobject * kobj,const struct bin_attribute * attr) +{ + lx_emul_trace(__func__); +} + + +#include + +void kernfs_get(struct kernfs_node * kn) +{ + lx_emul_trace(__func__); +} + + +#include + +void kernfs_put(struct kernfs_node * kn) +{ + lx_emul_trace(__func__); +} + + +#include + +int kobject_uevent(struct kobject * kobj,enum kobject_action action) +{ + lx_emul_trace(__func__); + return 0; +} + + +#include + +int __must_check get_random_bytes_arch(void * buf,int nbytes) +{ + lx_emul_trace(__func__); + printk("%s: leaving buffer unmodified!\n", __func__); + return 0; +} + + +#include + +void get_random_bytes(void * buf,int nbytes) +{ + lx_emul_trace(__func__); + printk("%s: leaving buffer unmodified!\n", __func__); +} + + +#include + +int add_random_ready_callback(struct random_ready_callback * rdy) +{ + lx_emul_trace(__func__); + return 0; +} + + +#include + +void add_device_randomness(const void * buf,unsigned int size) +{ + lx_emul_trace(__func__); +} + + +#include + +void add_interrupt_randomness(int irq,int irq_flags) +{ + lx_emul_trace(__func__); +} + + +extern bool irq_wait_for_poll(struct irq_desc * desc); +bool irq_wait_for_poll(struct irq_desc * desc) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void note_interrupt(struct irq_desc * desc,irqreturn_t action_ret) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int __register_chrdev(unsigned int major,unsigned int baseminor,unsigned int count,const char * name,const struct file_operations * fops) +{ + lx_emul_trace(__func__); + return 0; +} + + +#include + +int register_chrdev_region(dev_t from,unsigned count,const char * name) +{ + lx_emul_trace(__func__); + return 0; +} + + +extern void register_handler_proc(unsigned int irq,struct irqaction * action); +void register_handler_proc(unsigned int irq,struct irqaction * action) +{ + lx_emul_trace(__func__); +} + + +extern void register_irq_proc(unsigned int irq,struct irq_desc * desc); +void register_irq_proc(unsigned int irq,struct irq_desc * desc) +{ + lx_emul_trace(__func__); +} + + +#include + +void cdev_init(struct cdev * cdev,const struct file_operations * fops) +{ + lx_emul_trace(__func__); +} + + +#include + +int cdev_add(struct cdev * p,dev_t dev,unsigned count) +{ + lx_emul_trace(__func__); + return 0; +} + + +#include + +void cdev_del(struct cdev * p) +{ + lx_emul_trace(__func__); +} + + +#include + +void register_syscore_ops(struct syscore_ops * ops) +{ + lx_emul_trace(__func__); +} + + +#include + +struct proc_dir_entry { int dummy; }; + +struct proc_dir_entry * proc_create_seq_private(const char * name,umode_t mode,struct proc_dir_entry * parent,const struct seq_operations * ops,unsigned int state_size,void * data) +{ + static struct proc_dir_entry ret; + lx_emul_trace(__func__); + return &ret; +} + + +#include + +int software_node_notify(struct device * dev,unsigned long action) +{ + lx_emul_trace(__func__); + return 0; +} + + +#include +#include + +struct user_namespace init_user_ns; + +struct uts_namespace init_uts_ns; + + + +/* + * linux/seq_file.h depends on user_namespace being defined, add + * all dummies pulling in this header below here + */ + + +#include + +void seq_vprintf(struct seq_file * m,const char * f,va_list args) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void unblank_screen(void) +{ + lx_emul_trace_and_stop(__func__); +} + + +extern void pci_allocate_vc_save_buffers(struct pci_dev * dev); +void pci_allocate_vc_save_buffers(struct pci_dev * dev) +{ + lx_emul_trace(__func__); +} + + +extern void pci_vpd_init(struct pci_dev * dev); +void pci_vpd_init(struct pci_dev * dev) +{ + lx_emul_trace(__func__); +} + + +extern int pci_proc_attach_device(struct pci_dev * dev); +int pci_proc_attach_device(struct pci_dev * dev) +{ + lx_emul_trace(__func__); + return 0; +} + + +#include + +bool parse_option_str(const char * str,const char * option) +{ + lx_emul_trace(__func__); + return false; +} + + +extern bool pat_enabled(void); +bool pat_enabled(void) +{ + lx_emul_trace(__func__); + return false; +} + + +#include + +bool is_vmalloc_addr(const void * x) +{ + lx_emul_trace(__func__); + return false; +} + + +unsigned long init_stack[THREAD_SIZE / sizeof(unsigned long)]; + + +extern int pci_dev_specific_acs_enabled(struct pci_dev * dev,u16 acs_flags); +int pci_dev_specific_acs_enabled(struct pci_dev * dev,u16 acs_flags) +{ + lx_emul_trace(__func__); + return 0; +} + + +extern int pci_dev_specific_disable_acs_redir(struct pci_dev * dev); +int pci_dev_specific_disable_acs_redir(struct pci_dev * dev) +{ + lx_emul_trace(__func__); + return 0; +} + + +extern int pci_dev_specific_enable_acs(struct pci_dev * dev); +int pci_dev_specific_enable_acs(struct pci_dev * dev) +{ + lx_emul_trace(__func__); + return 0; +} + + +extern int pci_dev_specific_reset(struct pci_dev * dev,int probe); +int pci_dev_specific_reset(struct pci_dev * dev,int probe) +{ + lx_emul_trace(__func__); + return 0; +} + + +#include + +void pci_fixup_device(enum pci_fixup_pass pass,struct pci_dev * dev) +{ + lx_emul_trace(__func__); +} + + diff --git a/repos/pc/src/drivers/usb_host/pc/generated_dummies.c b/repos/pc/src/drivers/usb_host/pc/generated_dummies.c new file mode 100644 index 0000000000..807fc8d670 --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/generated_dummies.c @@ -0,0 +1,678 @@ +/* + * \brief Dummy definitions of Linux Kernel functions + * \author Automatically generated file - do no edit + * \date 2022-02-03 + */ + +#include + + +#include + +void * PDE_DATA(const struct inode * inode) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int ___ratelimit(struct ratelimit_state * rs,const char * func) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +const char * __clk_get_name(const struct clk * clk) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +unsigned long __get_free_pages(gfp_t gfp_mask,unsigned int order) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int __printk_ratelimit(const char * func) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void __put_cred(struct cred * cred) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void __put_task_struct(struct task_struct * tsk) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void __srcu_read_unlock(struct srcu_struct * ssp,int idx) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void __unregister_chrdev(unsigned int major,unsigned int baseminor,unsigned int count,const char * name) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +unsigned long _copy_from_user(void * to,const void __user * from,unsigned long n) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +unsigned long _copy_to_user(void __user * to,const void * from,unsigned long n) +{ + lx_emul_trace_and_stop(__func__); +} + + +extern void ack_bad_irq(unsigned int irq); +void ack_bad_irq(unsigned int irq) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int add_uevent_var(struct kobj_uevent_env * env,const char * format,...) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +async_cookie_t async_schedule_node(async_func_t func,void * data,int node) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void async_synchronize_full(void) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +struct timespec64 current_time(struct inode * inode) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int device_create_managed_software_node(struct device * dev,const struct property_entry * properties,const struct software_node * parent) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int dma_mmap_attrs(struct device * dev,struct vm_area_struct * vma,void * cpu_addr,dma_addr_t dma_addr,size_t size,unsigned long attrs) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void dma_pool_destroy(struct dma_pool * pool) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +asmlinkage __visible void dump_stack(void) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +bool file_ns_capable(const struct file * file,struct user_namespace * ns,int cap) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void free_pages(unsigned long addr,unsigned int order) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void fwnode_remove_software_node(struct fwnode_handle * fwnode) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void * gen_pool_dma_alloc(struct gen_pool * pool,size_t size,dma_addr_t * dma) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void * gen_pool_dma_alloc_align(struct gen_pool * pool,size_t size,dma_addr_t * dma,int align) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void * gen_pool_dma_zalloc_align(struct gen_pool * pool,size_t size,dma_addr_t * dma,int align) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void gen_pool_free_owner(struct gen_pool * pool,unsigned long addr,size_t size,void ** owner) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int get_option(char ** str,int * pint) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +const u8 guid_index[16] = {}; + + +#include + +struct pseudo_fs_context * init_pseudo(struct fs_context * fc,unsigned long magic) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +bool initcall_debug; + + +#include + +void io_schedule_finish(int token) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int io_schedule_prepare(void) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +long __sched io_schedule_timeout(long timeout) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void irq_work_tick(void) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +bool is_software_node(const struct fwnode_handle * fwnode) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +struct kobject *kernel_kobj; + + +#include + +void kill_anon_super(struct super_block * sb) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int kill_pid_usb_asyncio(int sig,int errno,sigval_t addr,struct pid * pid,const struct cred * cred) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int kobject_synth_uevent(struct kobject * kobj,const char * buf,size_t count) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int kobject_uevent_env(struct kobject * kobj,enum kobject_action action,char * envp_ext[]) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void memcpy_fromio(void * to,const volatile void __iomem * from,size_t n) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +unsigned long long memparse(const char * ptr,char ** retptr) +{ + lx_emul_trace_and_stop(__func__); +} + + +extern void native_io_delay(void); +void native_io_delay(void) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +struct irq_chip no_irq_chip; + + +#include + +loff_t no_seek_end_llseek(struct file * file,loff_t offset,int whence) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +loff_t noop_llseek(struct file * file,loff_t offset,int whence) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int param_set_copystring(const char * val,const struct kernel_param * kp) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void pci_assign_unassigned_bridge_resources(struct pci_dev * bridge) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void pci_assign_unassigned_bus_resources(struct pci_bus * bus) +{ + lx_emul_trace_and_stop(__func__); +} + + +extern unsigned long pci_cardbus_resource_alignment(struct resource * res); +unsigned long pci_cardbus_resource_alignment(struct resource * res) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +unsigned int pci_flags; + + +extern int pci_idt_bus_quirk(struct pci_bus * bus,int devfn,u32 * l,int timeout); +int pci_idt_bus_quirk(struct pci_bus * bus,int devfn,u32 * l,int timeout) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int pci_mmap_resource_range(struct pci_dev * pdev,int bar,struct vm_area_struct * vma,enum pci_mmap_state mmap_state,int write_combine) +{ + lx_emul_trace_and_stop(__func__); +} + + +extern void __init pci_realloc_get_opt(char * str); +void __init pci_realloc_get_opt(char * str) +{ + lx_emul_trace_and_stop(__func__); +} + + +extern void pci_restore_vc_state(struct pci_dev * dev); +void pci_restore_vc_state(struct pci_dev * dev) +{ + lx_emul_trace_and_stop(__func__); +} + + +extern int pci_save_vc_state(struct pci_dev * dev); +int pci_save_vc_state(struct pci_dev * dev) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void pci_stop_and_remove_bus_device_locked(struct pci_dev * dev) +{ + lx_emul_trace_and_stop(__func__); +} + + +extern void pci_vpd_release(struct pci_dev * dev); +void pci_vpd_release(struct pci_dev * dev) +{ + lx_emul_trace_and_stop(__func__); +} + + +extern unsigned int pcibios_assign_all_busses(void); +unsigned int pcibios_assign_all_busses(void) +{ + lx_emul_trace_and_stop(__func__); +} + + +extern void pcie_aspm_init_link_state(struct pci_dev * pdev); +void pcie_aspm_init_link_state(struct pci_dev * pdev) +{ + lx_emul_trace_and_stop(__func__); +} + + +extern void pcie_aspm_pm_state_change(struct pci_dev * pdev); +void pcie_aspm_pm_state_change(struct pci_dev * pdev) +{ + lx_emul_trace_and_stop(__func__); +} + + +extern void pcie_aspm_powersave_config_link(struct pci_dev * pdev); +void pcie_aspm_powersave_config_link(struct pci_dev * pdev) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int printk_deferred(const char * fmt,...) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void put_pid(struct pid * pid) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int raw_pci_read(unsigned int domain,unsigned int bus,unsigned int devfn,int reg,int len,u32 * val) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +bool refcount_dec_not_one(refcount_t * r) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void refcount_warn_saturate(refcount_t * r,enum refcount_saturation_type t) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int remap_pfn_range(struct vm_area_struct * vma,unsigned long addr,unsigned long pfn,unsigned long size,pgprot_t prot) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void sched_set_fifo(struct task_struct * p) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void seq_printf(struct seq_file * m,const char * f,...) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int smp_call_function_single(int cpu,void (* func)(void * info),void * info,int wait) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void srcu_drive_gp(struct work_struct * wp) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +bool static_key_initialized; + + +#include + +int string_escape_mem(const char * src,size_t isz,char * dst,size_t osz,unsigned int flags,const char * only) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void synchronize_srcu(struct srcu_struct * ssp) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void sysfs_delete_link(struct kobject * kobj,struct kobject * targ,const char * name) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int sysfs_emit(char * buf,const char * fmt,...) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int sysfs_emit_at(char * buf,int at,const char * fmt,...) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void sysfs_notify(struct kobject * kobj,const char * dir,const char * attr) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +bool sysfs_remove_file_self(struct kobject * kobj,const struct attribute * attr) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void sysfs_remove_group(struct kobject * kobj,const struct attribute_group * grp) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +int task_work_add(struct task_struct * task,struct callback_head * work,enum task_work_notify_mode notify) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +struct callback_head * task_work_cancel(struct task_struct * task,task_work_func_t func) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +void unregister_chrdev_region(dev_t from,unsigned count) +{ + lx_emul_trace_and_stop(__func__); +} + + +extern void unregister_handler_proc(unsigned int irq,struct irqaction * action); +void unregister_handler_proc(unsigned int irq,struct irqaction * action) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +const u8 uuid_index[16] = {}; + + +#include + +void wake_q_add_safe(struct wake_q_head * head,struct task_struct * task) +{ + lx_emul_trace_and_stop(__func__); +} + diff --git a/repos/pc/src/drivers/usb_host/pc/lx_emul.c b/repos/pc/src/drivers/usb_host/pc/lx_emul.c new file mode 100644 index 0000000000..ffe09af8fb --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/lx_emul.c @@ -0,0 +1,205 @@ +/* + * \brief Linux emulation environment specific to this driver + * \author Stefan Kalkowski + * \date 2021-08-31 + */ + +/* + * Copyright (C) 2021 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +#include +#include + +#include +#include + + +#include +#include + +void __const_udelay(unsigned long xloops) +{ + unsigned long usecs = xloops / 0x10C7UL; + if (usecs < 100) + lx_emul_time_udelay(usecs); + else + usleep_range(usecs, usecs * 10); +} + + +void __udelay(unsigned long usecs) +{ + lx_emul_time_udelay(usecs); +} + + +#include + +atomic_t __num_online_cpus = ATOMIC_INIT(1); + + +#include + +dma_addr_t dma_map_page_attrs(struct device * dev, + struct page * page, + size_t offset, + size_t size, + enum dma_data_direction dir, + unsigned long attrs) +{ + dma_addr_t const dma_addr = page_to_phys(page); + unsigned long const virt_addr = (unsigned long)page_to_virt(page); + + lx_emul_mem_cache_clean_invalidate((void *)(virt_addr + offset), size); + return dma_addr + offset; +} + + +#include + +struct dma_pool { size_t size; }; + +void * dma_pool_alloc(struct dma_pool * pool, gfp_t mem_flags, dma_addr_t * handle) +{ + void * ret = + lx_emul_mem_alloc_aligned_uncached(pool->size, PAGE_SIZE); + *handle = lx_emul_mem_dma_addr(ret); + return ret; +} + + +struct dma_pool * dma_pool_create(const char * name, + struct device * dev, + size_t size, + size_t align, + size_t boundary) +{ + struct dma_pool * pool = kmalloc(sizeof(struct dma_pool), GFP_KERNEL); + pool->size = size; + return pool; +} + + +void dma_pool_free(struct dma_pool * pool,void * vaddr,dma_addr_t dma) +{ + lx_emul_mem_free(vaddr); +} + + +#include + +int dma_supported(struct device * dev,u64 mask) +{ + lx_emul_trace(__func__); + return 1; +} + + +#include + +void dma_unmap_page_attrs(struct device * dev, + dma_addr_t addr, + size_t size, + enum dma_data_direction dir, + unsigned long attrs) +{ + unsigned long const virt_addr = lx_emul_mem_virt_addr((void*)addr); + + if (!virt_addr) + return; + + if (dir == DMA_FROM_DEVICE) + lx_emul_mem_cache_invalidate((void *)virt_addr, size); +} + + +#include + +void * kmalloc_order(size_t size, gfp_t flags, unsigned int order) +{ + return kmalloc(size, flags); +} + + +#include +#include +#include + +int simple_pin_fs(struct file_system_type * type, struct vfsmount ** mount, int * count) +{ + *mount = kmalloc(sizeof(struct vfsmount), GFP_KERNEL); + return 0; +} + + +#include + +void simple_release_fs(struct vfsmount ** mount,int * count) +{ + kfree(*mount); +} + + +#include + +struct inode * alloc_anon_inode(struct super_block * s) +{ + return kmalloc(sizeof(struct inode), GFP_KERNEL); +} + + +#include + +void tasklet_setup(struct tasklet_struct * t, + void (* callback)(struct tasklet_struct *)) +{ + t->next = NULL; + t->state = 0; + atomic_set(&t->count, 0); + t->callback = callback; + t->use_callback = true; + t->data = 0; +} + + +void __tasklet_schedule(struct tasklet_struct * t) +{ + if (test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) + t->callback(t); +} + + +void __tasklet_hi_schedule(struct tasklet_struct * t) +{ + if (test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) + t->callback(t); +} + + +#include + +void call_rcu(struct rcu_head * head,rcu_callback_t func) +{ + lx_emul_trace(__func__); + func(head); +} + + +#include + +void __iomem * ioremap(resource_size_t phys_addr, unsigned long size) +{ + return lx_emul_io_mem_map(phys_addr, size); +} + + +#include + +void iounmap(volatile void __iomem * addr) +{ + (void)addr; +} diff --git a/repos/pc/src/drivers/usb_host/pc/lx_emul.h b/repos/pc/src/drivers/usb_host/pc/lx_emul.h new file mode 100644 index 0000000000..fc240b2d77 --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/lx_emul.h @@ -0,0 +1,33 @@ +/** + * \brief Dummy definitions of Linux Kernel functions + * \author Stefan Kalkowski + * \date 2021-03-16 + */ + +/* + * Copyright (C) 2021 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +/* Needed to trace and stop */ +#include + +/* fix for wait_for_completion_timeout where the __sched include is missing */ +#include + +/* fix for missing include in linux/dynamic_debug.h */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void lx_backtrace(void); + +void lx_emul_time_udelay(unsigned long usec); + +#ifdef __cplusplus +} +#endif diff --git a/repos/pc/src/drivers/usb_host/pc/lx_emul/initcall_order.h b/repos/pc/src/drivers/usb_host/pc/lx_emul/initcall_order.h new file mode 100644 index 0000000000..b717d64148 --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/lx_emul/initcall_order.h @@ -0,0 +1,166 @@ +/* + * \brief Array defining order of Linux Kernel initcalls + * \author Automatically generated file - do no edit + * \date 2022-01-13 + */ + +#pragma once + +static const char * lx_emul_initcall_order[] = { + "__initcall_init_hw_perf_eventsearly", + "__initcall_start", + "__initcall_init_real_modeearly", + "__initcall_validate_x2apicearly", + "__initcall_register_nmi_cpu_backtrace_handlerearly", + "__initcall_spawn_ksoftirqdearly", + "__initcall_static_call_initearly", + "__initcall_init_zero_pfnearly", + "__initcall_initialize_ptr_randomearly", + "__initcall_init_mmap_min_addr0", + "__initcall_pci_realloc_setup_params0", + "__initcall_reboot_init1", + "__initcall_wq_sysfs_init1", + "__initcall_ksysfs_init1", + "__initcall_rcu_set_runtime_mode1", + "__initcall_init_jiffies_clocksource1", + "__initcall_init_script_binfmt1", + "__initcall_init_elf_binfmt1", + "__initcall_prandom_init_early1", + "__initcall_irq_sysfs_init2", + "__initcall_bdi_class_init2", + "__initcall_mm_sysfs_init2", + "__initcall_init_per_zone_wmark_min2", + "__initcall_pcibus_class_init2", + "__initcall_pci_driver_init2", + "__initcall_tty_class_init2", + "__initcall_vtconsole_class_init2", + "__initcall_devlink_class_init2", + "__initcall_software_node_init2", + "__initcall_amd_postcore_init2", + "__initcall_bts_init3", + "__initcall_pt_init3", + "__initcall_boot_params_ksysfs_init3", + "__initcall_sbf_init3", + "__initcall_arch_kdebugfs_init3", + "__initcall_intel_pconfig_init3", + "__initcall_pci_arch_init3", + "__initcall_init_vdso4", + "__initcall_fixup_ht_bug4", + "__initcall_topology_init4", + "__initcall_uid_cache_init4", + "__initcall_param_sysfs_init4", + "__initcall_user_namespace_sysctl_init4", + "__initcall_oom_init4", + "__initcall_default_bdi_init4", + "__initcall_percpu_enable_async4", + "__initcall_init_user_reserve4", + "__initcall_init_admin_reserve4", + "__initcall_init_reserve_notifier4", + "__initcall_pci_slot_init4", + "__initcall_misc_init4", + "__initcall_vga_arb_device_init4", + "__initcall_usb_common_init4", + "__initcall_usb_init4", + "__initcall_serio_init4", + "__initcall_input_init4", + "__initcall_pci_subsys_init4", + "__initcall_nmi_warning_debugfs5", + "__initcall_hpet_late_init5", + "__initcall_init_amd_nbs5", + "__initcall_iomem_init_inode5", + "__initcall_clocksource_done_booting5", + "__initcall_init_pipe_fs5", + "__initcall_anon_inode_init5", + "__initcall_proc_cmdline_init5", + "__initcall_proc_consoles_init5", + "__initcall_proc_cpuinfo_init5", + "__initcall_proc_devices_init5", + "__initcall_proc_interrupts_init5", + "__initcall_proc_loadavg_init5", + "__initcall_proc_meminfo_init5", + "__initcall_proc_stat_init5", + "__initcall_proc_uptime_init5", + "__initcall_proc_version_init5", + "__initcall_proc_softirqs_init5", + "__initcall_proc_kmsg_init5", + "__initcall_proc_page_init5", + "__initcall_init_ramfs_fs5", + "__initcall_chr_dev_init5", + "__initcall_pcibios_assign_resources5", + "__initcall_pci_apply_final_quirks5s", + "__initcall_populate_rootfsrootfs", + "__initcall_pci_iommu_initrootfs", + "__initcall_rapl_pmu_init6", + "__initcall_amd_uncore_init6", + "__initcall_amd_ibs_init6", + "__initcall_msr_init6", + "__initcall_intel_uncore_init6", + "__initcall_cstate_pmu_init6", + "__initcall_register_kernel_offset_dumper6", + "__initcall_i8259A_init_ops6", + "__initcall_init_tsc_clocksource6", + "__initcall_add_rtc_cmos6", + "__initcall_umwait_init6", + "__initcall_ioapic_init_ops6", + "__initcall_sysfb_init6", + "__initcall_proc_execdomains_init6", + "__initcall_ioresources_init6", + "__initcall_timekeeping_init_ops6", + "__initcall_init_clocksource_sysfs6", + "__initcall_init_timer_list_procfs6", + "__initcall_alarmtimer_init6", + "__initcall_clockevents_init_sysfs6", + "__initcall_utsname_sysctl_init6", + "__initcall_perf_event_sysfs_init6", + "__initcall_kswapd_init6", + "__initcall_workingset_init6", + "__initcall_proc_vmalloc_init6", + "__initcall_fcntl_init6", + "__initcall_proc_filesystems_init6", + "__initcall_start_dirtytime_writeback6", + "__initcall_init_devpts_fs6", + "__initcall_pci_proc_init6", + "__initcall_gpio_clk_driver_init6", + "__initcall_plt_clk_driver_init6", + "__initcall_n_null_init6", + "__initcall_pty_init6", + "__initcall_serial8250_init6", + "__initcall_serial_pci_driver_init6", + "__initcall_exar_pci_driver_init6", + "__initcall_lpss8250_pci_driver_init6", + "__initcall_mid8250_pci_driver_init6", + "__initcall_topology_sysfs_init6", + "__initcall_cacheinfo_sysfs_init6", + "__initcall_ehci_hcd_init6", + "__initcall_ehci_pci_init6", + "__initcall_ohci_hcd_mod_init6", + "__initcall_ohci_pci_init6", + "__initcall_xhci_hcd_init6", + "__initcall_xhci_pci_init6", + "__initcall_i8042_init6", + "__initcall_serport_init6", + "__initcall_atkbd_init6", + "__initcall_psmouse_init6", + "__initcall_pmc_atom_init6", + "__initcall_usbnet_init6", + "__initcall_update_mp_table7", + "__initcall_lapic_insert_resource7", + "__initcall_print_ICs7", + "__initcall_create_tlb_single_page_flush_ceiling7", + "__initcall_init_oops_id7", + "__initcall_reboot_ksysfs_init7", + "__initcall_sched_clock_init_late7", + "__initcall_sched_init_debug7", + "__initcall_printk_late_init7", + "__initcall_check_early_ioremap_leak7", + "__initcall_prandom_init_late7", + "__initcall_pci_resource_alignment_sysfs_init7", + "__initcall_pci_sysfs_init7", + "__initcall_sync_state_resume_initcall7", + "__initcall_deferred_probe_initcall7", + "__initcall_clk_disable_unused7s", + "__initcall_con_initcon", + "__initcall_end", + "__initcall_univ8250_console_initcon", + "END_OF_INITCALL_ORDER_ARRAY_DUMMY_ENTRY" +}; diff --git a/repos/pc/src/drivers/usb_host/pc/lx_emul/pci_fixups.h b/repos/pc/src/drivers/usb_host/pc/lx_emul/pci_fixups.h new file mode 100644 index 0000000000..860d419eec --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/lx_emul/pci_fixups.h @@ -0,0 +1,22 @@ +/** + * \brief PCI fixup calls to execute + * \author Josef Soentgen + * \date 2022-02-07 + */ + +/* + * Copyright (C) 2022 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +#ifndef _LX_EMUL__PCI_FIXUPS_H_ +#define _LX_EMUL__PCI_FIXUPS_H_ + +static const char * lx_emul_pci_final_fixups[] = { + "__pci_fixup_final_quirk_usb_early_handoff", + "END_OF_PCI_FIXUPS" +}; + +#endif /* _LX_EMUL__PCI_FIXUPS_H_ */ diff --git a/repos/pc/src/drivers/usb_host/pc/main.cc b/repos/pc/src/drivers/usb_host/pc/main.cc new file mode 100644 index 0000000000..f8c0c44906 --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/main.cc @@ -0,0 +1,113 @@ +/* + * \brief i.MX8 USB-card driver Linux port + * \author Stefan Kalkowski + * \date 2021-06-29 + */ + +/* + * Copyright (C) 2021 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + + +using namespace Genode; + + +extern "C" struct genode_attached_dataspace * +genode_usb_allocate_peer_buffer(unsigned long size) +{ + Attached_dataspace & ds = Lx_kit::env().memory.alloc_dataspace(size); + + /* + * We have to call virt_to_pages eagerly here, + * to get contingous page objects registered + */ + lx_emul_virt_to_pages(ds.local_addr(), size >> 12); + return genode_attached_dataspace_ptr(ds); +} + + +extern "C" void genode_usb_free_peer_buffer(struct genode_attached_dataspace * ptr) +{ + Attached_dataspace *ds = static_cast(ptr); + lx_emul_forget_pages(ds->local_addr(), ds->size()); + Lx_kit::env().memory.free_dataspace(ds->local_addr()); +} + + +static bool _bios_handoff; + + +extern "C" int inhibit_pci_fixup(char const *name) +{ + if (_bios_handoff) + return 0; + + char const *handoff = "__pci_fixup_final_quirk_usb_early_handoff"; + + size_t length = Genode::min(Genode::strlen(name), + Genode::strlen(handoff)); + + return Genode::strcmp(handoff, name, length) == 0; +} + + +struct Main : private Entrypoint::Io_progress_handler +{ + Env & env; + Signal_handler
signal_handler { env.ep(), *this, + &Main::handle_signal }; + Sliced_heap sliced_heap { env.ram(), env.rm() }; + + Attached_rom_dataspace config_rom { env, "config" }; + + /** + * Entrypoint::Io_progress_handler + */ + void handle_io_progress() override + { + genode_usb_notify_peers(); + } + + void handle_signal() + { + lx_user_handle_io(); + Lx_kit::env().scheduler.schedule(); + } + + Main(Env & env) : env(env) + { + _bios_handoff = config_rom.xml().attribute_value("bios_handoff", true); + + Lx_kit::initialize(env); + + genode_usb_init(genode_env_ptr(env), + genode_allocator_ptr(sliced_heap), + genode_signal_handler_ptr(signal_handler), + &genode_usb_rpc_callbacks_obj); + + lx_emul_start_kernel(nullptr); + + env.ep().register_io_progress_handler(*this); + } +}; + + +void Component::construct(Env & env) +{ + static Main main(env); +} diff --git a/repos/pc/src/drivers/usb_host/pc/misc.cc b/repos/pc/src/drivers/usb_host/pc/misc.cc new file mode 100644 index 0000000000..73f6e67174 --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/misc.cc @@ -0,0 +1,20 @@ +/* + * \brief Misc + * \author Josef Soentgen + * \date 2022-01-20 + */ + +/* + * Copyright (C) 2022 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +/* Genode includes */ +#include + +extern "C" void lx_backtrace(void) +{ + Genode::backtrace(); +} diff --git a/repos/pc/src/drivers/usb_host/pc/spec/x86_32/dep.list b/repos/pc/src/drivers/usb_host/pc/spec/x86_32/dep.list new file mode 100644 index 0000000000..c10c7b7fab --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/spec/x86_32/dep.list @@ -0,0 +1,14 @@ +arch/x86/include/asm/checksum_32.h +arch/x86/include/asm/cmpxchg_32.h +arch/x86/include/asm/page_32.h +arch/x86/include/asm/page_32_types.h +arch/x86/include/asm/pgtable-2level_types.h +arch/x86/include/asm/pgtable_32_areas.h +arch/x86/include/asm/pgtable_32_types.h +arch/x86/include/asm/uaccess_32.h +arch/x86/include/asm/user_32.h +arch/x86/include/uapi/asm/posix_types_32.h +include/asm-generic/bitops/fls64.h +include/asm-generic/pgtable-nopmd.h +include/asm-generic/pgtable-nopud.h + diff --git a/repos/pc/src/drivers/usb_host/pc/spec/x86_32/source.list b/repos/pc/src/drivers/usb_host/pc/spec/x86_32/source.list new file mode 100644 index 0000000000..75a584da51 --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/spec/x86_32/source.list @@ -0,0 +1,116 @@ +arch/x86/pci/legacy.c +drivers/base/bus.c +drivers/base/class.c +drivers/base/component.c +drivers/base/core.c +drivers/base/dd.c +drivers/base/devres.c +drivers/base/driver.c +drivers/base/platform.c +drivers/base/property.c +drivers/clk/clk-devres.c +drivers/pci/access.c +drivers/pci/bus.c +drivers/pci/host-bridge.c +drivers/pci/msi.c +drivers/pci/pci.c +drivers/pci/pci-driver.c +drivers/pci/pci-sysfs.c +drivers/pci/probe.c +drivers/pci/rom.c +drivers/pci/search.c +drivers/pci/setup-res.c +drivers/pci/slot.c +drivers/usb/common/common.c +drivers/usb/common/debug.c +drivers/usb/core/buffer.c +drivers/usb/core/config.c +drivers/usb/core/devices.c +drivers/usb/core/devio.c +drivers/usb/core/driver.c +drivers/usb/core/endpoint.c +drivers/usb/core/file.c +drivers/usb/core/generic.c +drivers/usb/core/hcd-pci.c +drivers/usb/core/hcd.c +drivers/usb/core/hub.c +drivers/usb/core/message.c +drivers/usb/core/notify.c +drivers/usb/core/phy.c +drivers/usb/core/port.c +drivers/usb/core/quirks.c +drivers/usb/core/sysfs.c +drivers/usb/core/urb.c +drivers/usb/core/usb.c +drivers/usb/host/ehci-hcd.c +drivers/usb/host/ehci-pci.c +drivers/usb/host/ohci-hcd.c +drivers/usb/host/ohci-pci.c +drivers/usb/host/pci-quirks.c +drivers/usb/host/xhci-dbg.c +drivers/usb/host/xhci-ext-caps.c +drivers/usb/host/xhci-hub.c +drivers/usb/host/xhci-mem.c +drivers/usb/host/xhci-pci.c +drivers/usb/host/xhci-ring.c +drivers/usb/host/xhci-trace.c +drivers/usb/host/xhci.c +fs/nls/nls_base.c +kernel/irq/chip.c +kernel/irq/devres.c +kernel/irq/handle.c +kernel/irq/irqdesc.c +kernel/irq/manage.c +kernel/irq/resend.c +kernel/kthread.c +kernel/locking/mutex.c +kernel/locking/osq_lock.c +kernel/locking/rwsem.c +kernel/notifier.c +kernel/panic.c +kernel/resource.c +kernel/sched/clock.c +kernel/sched/completion.c +kernel/sched/swait.c +kernel/sched/wait.c +kernel/smpboot.c +kernel/time/clockevents.c +kernel/time/clocksource.c +kernel/time/hrtimer.c +kernel/time/jiffies.c +kernel/time/ntp.c +kernel/time/tick-common.c +kernel/time/time.c +kernel/time/timeconv.c +kernel/time/timecounter.c +kernel/time/timekeeping.c +kernel/time/timer.c +kernel/time/timer_list.c +kernel/workqueue.c +lib/bitmap.c +lib/crc32.c +lib/ctype.c +lib/debug_locks.c +lib/find_bit.c +lib/hexdump.c +lib/idr.c +lib/iomap.c +lib/irq_regs.c +lib/kasprintf.c +lib/klist.c +lib/kobject.c +lib/kstrtox.c +lib/list_sort.c +lib/math/div64.c +lib/pci_iomap.c +lib/radix-tree.c +lib/rbtree.c +lib/scatterlist.c +lib/siphash.c +lib/sort.c +lib/string.c +lib/timerqueue.c +lib/vsprintf.c +lib/xarray.c +mm/mempool.c +mm/util.c diff --git a/repos/pc/src/drivers/usb_host/pc/spec/x86_32/target.mk b/repos/pc/src/drivers/usb_host/pc/spec/x86_32/target.mk new file mode 100644 index 0000000000..998cd5af96 --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/spec/x86_32/target.mk @@ -0,0 +1,5 @@ + +include $(REP_DIR)/src/drivers/usb_host/pc/target.inc + +REQUIRES += 32bit +SRC_C += lx_emul/spec/x86_32/atomic64_32.c diff --git a/repos/pc/src/drivers/usb_host/pc/spec/x86_64/dep.list b/repos/pc/src/drivers/usb_host/pc/spec/x86_64/dep.list new file mode 100644 index 0000000000..004bc68b90 --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/spec/x86_64/dep.list @@ -0,0 +1,14 @@ +arch/x86/include/asm/atomic64_64.h +arch/x86/include/asm/checksum_64.h +arch/x86/include/asm/cmpxchg_64.h +arch/x86/include/asm/kaslr.h +arch/x86/include/asm/page_64.h +arch/x86/include/asm/page_64_types.h +arch/x86/include/asm/pgtable_64_types.h +arch/x86/include/asm/sparsemem.h +arch/x86/include/asm/string_64.h +arch/x86/include/asm/uaccess_64.h +arch/x86/include/asm/user_64.h +arch/x86/include/uapi/asm/posix_types_64.h +arch/x86/include/uapi/asm/vsyscall.h +include/asm-generic/div64.h diff --git a/repos/pc/src/drivers/usb_host/pc/spec/x86_64/source.list b/repos/pc/src/drivers/usb_host/pc/spec/x86_64/source.list new file mode 100644 index 0000000000..9d98939d7d --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/spec/x86_64/source.list @@ -0,0 +1,117 @@ +arch/x86/pci/legacy.c +drivers/base/bus.c +drivers/base/class.c +drivers/base/component.c +drivers/base/core.c +drivers/base/dd.c +drivers/base/devres.c +drivers/base/driver.c +drivers/base/platform.c +drivers/base/property.c +drivers/clk/clk-devres.c +drivers/pci/access.c +drivers/pci/bus.c +drivers/pci/host-bridge.c +drivers/pci/msi.c +drivers/pci/pci.c +drivers/pci/pci-driver.c +drivers/pci/pci-sysfs.c +drivers/pci/probe.c +drivers/pci/rom.c +drivers/pci/search.c +drivers/pci/setup-res.c +drivers/pci/slot.c +drivers/usb/common/common.c +drivers/usb/common/debug.c +drivers/usb/core/buffer.c +drivers/usb/core/config.c +drivers/usb/core/devices.c +drivers/usb/core/devio.c +drivers/usb/core/driver.c +drivers/usb/core/endpoint.c +drivers/usb/core/file.c +drivers/usb/core/generic.c +drivers/usb/core/hcd-pci.c +drivers/usb/core/hcd.c +drivers/usb/core/hub.c +drivers/usb/core/message.c +drivers/usb/core/notify.c +drivers/usb/core/phy.c +drivers/usb/core/port.c +drivers/usb/core/quirks.c +drivers/usb/core/sysfs.c +drivers/usb/core/urb.c +drivers/usb/core/usb.c +drivers/usb/host/ehci-hcd.c +drivers/usb/host/ehci-pci.c +drivers/usb/host/ohci-hcd.c +drivers/usb/host/ohci-pci.c +drivers/usb/host/pci-quirks.c +drivers/usb/host/xhci-dbg.c +drivers/usb/host/xhci-ext-caps.c +drivers/usb/host/xhci-hub.c +drivers/usb/host/xhci-mem.c +drivers/usb/host/xhci-pci.c +drivers/usb/host/xhci-ring.c +drivers/usb/host/xhci-trace.c +drivers/usb/host/xhci.c +fs/nls/nls_base.c +kernel/irq/chip.c +kernel/irq/devres.c +kernel/irq/handle.c +kernel/irq/irqdesc.c +kernel/irq/irqdomain.c +kernel/irq/manage.c +kernel/irq/resend.c +kernel/kthread.c +kernel/locking/mutex.c +kernel/locking/osq_lock.c +kernel/locking/rwsem.c +kernel/notifier.c +kernel/panic.c +kernel/resource.c +kernel/sched/clock.c +kernel/sched/completion.c +kernel/sched/swait.c +kernel/sched/wait.c +kernel/smpboot.c +kernel/time/clockevents.c +kernel/time/clocksource.c +kernel/time/hrtimer.c +kernel/time/jiffies.c +kernel/time/ntp.c +kernel/time/tick-broadcast.c +kernel/time/tick-common.c +kernel/time/time.c +kernel/time/timeconv.c +kernel/time/timecounter.c +kernel/time/timekeeping.c +kernel/time/timer.c +kernel/time/timer_list.c +kernel/workqueue.c +lib/bitmap.c +lib/crc32.c +lib/ctype.c +lib/debug_locks.c +lib/find_bit.c +lib/hexdump.c +lib/idr.c +lib/irq_regs.c +lib/kasprintf.c +lib/klist.c +lib/kobject.c +lib/kstrtox.c +lib/list_sort.c +lib/iomap.c +lib/pci_iomap.c +lib/radix-tree.c +lib/rbtree.c +lib/scatterlist.c +lib/siphash.c +lib/sort.c +lib/string.c +lib/timerqueue.c +lib/vsprintf.c +lib/xarray.c +mm/mempool.c +mm/util.c diff --git a/repos/pc/src/drivers/usb_host/pc/spec/x86_64/target.mk b/repos/pc/src/drivers/usb_host/pc/spec/x86_64/target.mk new file mode 100644 index 0000000000..61794803d7 --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/spec/x86_64/target.mk @@ -0,0 +1,3 @@ +include $(REP_DIR)/src/drivers/usb_host/pc/target.inc + +REQUIRES += 64bit diff --git a/repos/pc/src/drivers/usb_host/pc/target.inc b/repos/pc/src/drivers/usb_host/pc/target.inc new file mode 100644 index 0000000000..dc438658dd --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/target.inc @@ -0,0 +1,28 @@ +REQUIRES := x86 + +REL_PRG_DIR := $(PRG_DIR)/../.. + +TARGET := pc_usb_host_drv +LIBS := base pc_lx_emul +INC_DIR := $(REL_PRG_DIR) +SRC_CC += main.cc +SRC_CC += misc.cc +SRC_CC += time.cc +SRC_C += dummies.c +SRC_C += lx_emul.c +SRC_C += usb.c +SRC_C += $(notdir $(wildcard $(REL_PRG_DIR)/generated_dummies.c)) +SRC_C += common_dummies.c +SRC_C += lx_emul/spec/x86/pci.c + +vpath %.c $(REL_PRG_DIR) +vpath %.cc $(REL_PRG_DIR) +vpath common_dummies.c $(REP_DIR)/src/lib/pc/lx_emul + +# +# Genode C-API backends +# + +SRC_CC += genode_c_api/usb.cc + +vpath genode_c_api/usb.cc $(subst /genode_c_api,,$(call select_from_repositories,src/lib/genode_c_api)) diff --git a/repos/pc/src/drivers/usb_host/pc/time.cc b/repos/pc/src/drivers/usb_host/pc/time.cc new file mode 100644 index 0000000000..0f8f40ad69 --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/time.cc @@ -0,0 +1,25 @@ +/* + * \brief Lx_emul udelay function for very short delays + * \author Stefan Kalkowski + * \date 2021-07-10 + */ + +/* + * Copyright (C) 2021 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +#include +#include + +extern "C" void lx_emul_time_udelay(unsigned long usec); +extern "C" void lx_emul_time_udelay(unsigned long usec) +{ + if (usec > 100) + Genode::error("Cannot delay that long ", usec, " microseconds"); + + unsigned long long start = Lx_kit::env().timer.curr_time().trunc_to_plain_us().value; + while (Lx_kit::env().timer.curr_time().trunc_to_plain_us().value < (start + usec)) { ; } +} diff --git a/repos/pc/src/drivers/usb_host/pc/usb.c b/repos/pc/src/drivers/usb_host/pc/usb.c new file mode 100644 index 0000000000..93c90f9c2d --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/usb.c @@ -0,0 +1,573 @@ +/* + * \brief Post kernel userland activity + * \author Stefan Kalkowski + * \date 2021-07-14 + */ + +/* + * Copyright (C) 2021 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +#include +#include +#include + +#include +#include +#include + +#include + +struct usb_find_request { + genode_usb_bus_num_t bus; + genode_usb_dev_num_t dev; + struct usb_device * ret; +}; + +static int check_usb_device(struct usb_device *usb_dev, void * data) +{ + struct usb_find_request * req = (struct usb_find_request *) data; + if (usb_dev->devnum == req->dev && usb_dev->bus->busnum == req->bus) + req->ret = usb_dev; + return 0; +} + +static struct usb_device * find_usb_device(genode_usb_bus_num_t bus, + genode_usb_dev_num_t dev) +{ + struct usb_find_request req = { bus, dev, NULL }; + usb_for_each_dev(&req, check_usb_device); + return req.ret; +} + + +static struct usb_interface * interface(genode_usb_bus_num_t bus, + genode_usb_dev_num_t dev, + unsigned index) +{ + struct usb_device * udev = find_usb_device(bus, dev); + + if (!udev) + return NULL; + + if (!udev->actconfig) + return NULL; + + if (index >= udev->actconfig->desc.bNumInterfaces) + return NULL; + + return udev->actconfig->interface[index]; +} + + +static unsigned config_descriptor(genode_usb_bus_num_t bus, + genode_usb_dev_num_t dev, + void * dev_desc, void *conf_desc) +{ + struct usb_device * udev = find_usb_device(bus, dev); + if (!udev) + return 0; + + memcpy(dev_desc, &udev->descriptor, sizeof(struct usb_device_descriptor)); + if (udev->actconfig) + memcpy(conf_desc, &udev->actconfig->desc, + sizeof(struct usb_config_descriptor)); + else + memset(conf_desc, 0, sizeof(struct usb_config_descriptor)); + + return udev->speed; +} + + +static int alt_settings(genode_usb_bus_num_t bus, genode_usb_dev_num_t dev, + unsigned index) +{ + struct usb_interface * iface = interface(bus, dev, index); + return (iface) ? iface->num_altsetting : -1; +} + + +static int interface_descriptor(genode_usb_bus_num_t bus, + genode_usb_dev_num_t dev, + unsigned index, unsigned setting, + void * buf, unsigned long size, int * active) +{ + struct usb_interface * iface = interface(bus, dev, index); + + if (!iface) + return -1; + + memcpy(buf, &iface->altsetting[setting].desc, + min(sizeof(struct usb_interface_descriptor), size)); + + *active = &iface->altsetting[setting] == iface->cur_altsetting; + return 0; +} + + +static int interface_extra(genode_usb_bus_num_t bus, + genode_usb_dev_num_t dev, + unsigned index, unsigned setting, + void * buf, unsigned long size) +{ + struct usb_interface * iface = interface(bus, dev, index); + unsigned long len; + + if (!iface) + return -1; + + len = min((unsigned long)iface->altsetting[setting].extralen, size); + memcpy(buf, iface->altsetting[setting].extra, len); + return len; +} + + +static int endpoint_descriptor(genode_usb_bus_num_t bus, + genode_usb_dev_num_t dev, + unsigned iface_num, unsigned setting, + unsigned endp, void * buf, unsigned long size) +{ + struct usb_device * udev = find_usb_device(bus, dev); + struct usb_interface * iface; + struct usb_host_endpoint * ep; + + if (!udev) + return -1; + iface = usb_ifnum_to_if(udev, iface_num); + + if (!iface) + return -2; + + ep = &iface->altsetting[setting].endpoint[endp]; + if (!ep) + return -3; + + memcpy(buf, &ep->desc, + min(sizeof(struct usb_endpoint_descriptor), size)); + + return 0; +} + + +struct genode_usb_rpc_callbacks genode_usb_rpc_callbacks_obj = { + .alloc_fn = genode_usb_allocate_peer_buffer, + .free_fn = genode_usb_free_peer_buffer, + .cfg_desc_fn = config_descriptor, + .alt_settings_fn = alt_settings, + .iface_desc_fn = interface_descriptor, + .iface_extra_fn = interface_extra, + .endp_desc_fn = endpoint_descriptor, +}; + + +static genode_usb_request_ret_t +handle_ctrl_request(struct genode_usb_request_control * req, + void * buf, unsigned long size, void * data) +{ + struct usb_device * udev = (struct usb_device *) data; + + int pipe = (req->request_type & 0x80) + ? usb_rcvctrlpipe(udev, 0) : usb_sndctrlpipe(udev, 0); + + int err = usb_control_msg(udev, pipe, req->request, req->request_type, + req->value, req->index, buf, size, req->timeout); + + if (err >= 0) { + req->actual_size = err; + return NO_ERROR; + } + + req->actual_size = 0; + + switch (err) { + case -ENOENT: return INTERFACE_OR_ENDPOINT_ERROR; + case -ENODEV: return NO_DEVICE_ERROR; + case -ESHUTDOWN: return NO_DEVICE_ERROR; + case -EPROTO: return PROTOCOL_ERROR; + case -EILSEQ: return PROTOCOL_ERROR; + case -EPIPE: return STALL_ERROR; + case -ETIMEDOUT: return TIMEOUT_ERROR; + } + + return UNKNOWN_ERROR; +} + + +static genode_usb_request_ret_t +handle_string_request(struct genode_usb_request_string * req, + void * buf, unsigned long size, void * data) +{ + struct usb_device * udev = (struct usb_device *) data; + + int length = usb_string(udev, req->index, buf, size); + if (length < 0) { + printk("Could not read string descriptor index: %u\n", req->index); + req->length = 0; + } else { + /* returned length is in bytes (char) */ + req->length = length / 2; + return NO_ERROR; + } + + return UNKNOWN_ERROR; +} + + +static genode_usb_request_ret_t +handle_altsetting_request(unsigned iface, unsigned alt_setting, void * data) +{ + struct usb_device * udev = (struct usb_device *) data; + return (usb_set_interface(udev, iface, alt_setting)) ? NO_ERROR + : UNKNOWN_ERROR; +} + + +static genode_usb_request_ret_t +handle_config_request(unsigned cfg_idx, void * data) +{ + struct usb_device * udev = (struct usb_device *) data; + return (usb_set_configuration(udev, cfg_idx)) ? UNKNOWN_ERROR : NO_ERROR; +} + + +static genode_usb_request_ret_t +handle_flush_request(unsigned char ep, void * data) +{ + struct usb_device * udev = (struct usb_device *) data; + struct usb_host_endpoint * endpoint = + ep & USB_DIR_IN ? udev->ep_in[ep & 0xf] + : udev->ep_out[ep & 0xf]; + if (!endpoint) + return INTERFACE_OR_ENDPOINT_ERROR; + + usb_hcd_flush_endpoint(udev, endpoint); + return NO_ERROR; +} + + +static genode_usb_request_ret_t +handle_transfer_response(struct genode_usb_request_transfer * req, + void * data) +{ + struct urb * urb = (struct urb *) data; + + int i; + + if (urb->status == 0) { + req->actual_size = urb->actual_length; + + if (usb_pipein(urb->pipe)) + for (i = 0; i < urb->number_of_packets; i++) + req->actual_packet_size[i] = urb->iso_frame_desc[i].actual_length; + + return NO_ERROR; + } + + switch (urb->status) { + case -ESHUTDOWN: return NO_DEVICE_ERROR; + case -EPROTO: return PROTOCOL_ERROR; + case -EILSEQ: return PROTOCOL_ERROR; + case -EPIPE: return STALL_ERROR; + }; + return UNKNOWN_ERROR; +} + + +static void async_complete(struct urb *urb) +{ + unsigned long handle = (unsigned long)urb->context; + genode_usb_session_handle_t session = + (genode_usb_session_handle_t) (handle >> 16); + genode_usb_request_handle_t request = + (genode_usb_request_handle_t) (handle & 0xffff); + + genode_usb_ack_request(session, request, + handle_transfer_response, (void*)urb); + usb_free_urb(urb); + lx_user_handle_io(); +} + + +static int fill_bulk_urb(struct usb_device * udev, + struct genode_usb_request_transfer * req, + unsigned long handle, + void * buf, + unsigned long size, + int read, + struct urb ** urb) +{ + int pipe = (read) + ? usb_rcvbulkpipe(udev, req->ep) : usb_sndbulkpipe(udev, req->ep); + + *urb = usb_alloc_urb(0, GFP_KERNEL); + if (!*urb) + return -ENOMEM; + + usb_fill_bulk_urb(*urb, udev, pipe, buf, size, + async_complete, (void*)handle); + return 0; +} + + +static int fill_irq_urb(struct usb_device * udev, + struct genode_usb_request_transfer * req, + unsigned long handle, + void * buf, + unsigned long size, + int read, + struct urb ** urb) +{ + int polling_interval; + int pipe = (read) + ? usb_rcvintpipe(udev, req->ep) : usb_sndintpipe(udev, req->ep); + + *urb = usb_alloc_urb(0, GFP_KERNEL); + if (!*urb) + return -ENOMEM; + + if (req->polling_interval == -1) { + + struct usb_host_endpoint *ep = (req->ep & USB_DIR_IN) ? + udev->ep_in[req->ep & 0xf] : udev->ep_out[req->ep & 0xf]; + + if (!ep) + return -ENOENT; + + polling_interval = ep->desc.bInterval; + } else + polling_interval = req->polling_interval; + + usb_fill_int_urb(*urb, udev, pipe, buf, size, + async_complete, (void*)handle, polling_interval); + return 0; +} + + +static int fill_isoc_urb(struct usb_device * udev, + struct genode_usb_request_transfer * req, + unsigned long handle, + void * buf, + unsigned long size, + int read, + struct urb ** urb) +{ + int i; + unsigned offset = 0; + int pipe = (read) + ? usb_rcvisocpipe(udev, req->ep) : usb_sndisocpipe(udev, req->ep); + struct usb_host_endpoint * ep = + req->ep & USB_DIR_IN ? udev->ep_in[req->ep & 0xf] + : udev->ep_out[req->ep & 0xf]; + + *urb = usb_alloc_urb(req->number_of_packets, GFP_KERNEL); + if (!*urb) + return -ENOMEM; + + (*urb)->dev = udev; + (*urb)->pipe = pipe; + (*urb)->start_frame = -1; + (*urb)->stream_id = 0; + (*urb)->transfer_buffer = buf; + (*urb)->transfer_buffer_length = size; + (*urb)->number_of_packets = req->number_of_packets; + (*urb)->interval = 1 << min(15, ep->desc.bInterval - 1); + (*urb)->context = (void *)handle; + (*urb)->transfer_flags = URB_ISO_ASAP | (read ? URB_DIR_IN : URB_DIR_OUT); + (*urb)->complete = async_complete; + + for (i = 0; i < req->number_of_packets; i++) { + (*urb)->iso_frame_desc[i].offset = offset; + (*urb)->iso_frame_desc[i].length = req->packet_size[i]; + offset += req->packet_size[i]; + } + + return 0; +} + + +static genode_usb_request_ret_t +handle_transfer_request(struct genode_usb_request_transfer * req, + genode_usb_transfer_type_t type, + genode_usb_session_handle_t session_handle, + genode_usb_request_handle_t request_handle, + void * buf, unsigned long size, void * data) +{ + struct usb_device * udev = (struct usb_device *) data; + int err = 0; + int read = (req->ep & 0x80); + unsigned long handle = session_handle << 16 | request_handle; + struct urb * urb; + + switch (type) { + case BULK: + err = fill_bulk_urb(udev, req, handle, buf, size, read, &urb); + break; + case IRQ: + err = fill_irq_urb(udev, req, handle, buf, size, read, &urb); + break; + case ISOC: + err = fill_isoc_urb(udev, req, handle, buf, size, read, &urb); + break; + default: + printk("Unknown USB transfer request!\n"); + return UNKNOWN_ERROR; + }; + + if (!err) { + err = usb_submit_urb(urb, GFP_KERNEL); + + if (!err) + return NO_ERROR; + + usb_free_urb(urb); + } + + switch (err) { + case -ENOENT: return INTERFACE_OR_ENDPOINT_ERROR; + case -ENODEV: return NO_DEVICE_ERROR; + case -ESHUTDOWN: return NO_DEVICE_ERROR; + case -ENOSPC: return STALL_ERROR; + case -ENOMEM: return MEMORY_ERROR; + } + return UNKNOWN_ERROR; +} + + +static struct genode_usb_request_callbacks request_callbacks = { + .control_fn = handle_ctrl_request, + .transfer_fn = handle_transfer_request, + .string_fn = handle_string_request, + .altsetting_fn = handle_altsetting_request, + .config_fn = handle_config_request, + .flush_fn = handle_flush_request, +}; + + +static int poll_usb_device(struct usb_device *udev, void * data) +{ + genode_usb_session_handle_t session = + genode_usb_session_by_bus_dev(udev->bus->busnum, udev->devnum); + int * work_done = (int *) data; + + if (!session) + return 0; + + for (;;) { + if (!genode_usb_request_by_session(session, &request_callbacks, + (void*)udev)) + break; + *work_done = true; + } + + return 0; +} + + +static int usb_poll_sessions(void * data) +{ + for (;;) { + int work_done = false; + usb_for_each_dev(&work_done, poll_usb_device); + if (work_done) + continue; + lx_emul_task_schedule(true); + } + + return 0; +} + + +static struct task_struct * lx_user_task = NULL; + + +void lx_user_handle_io(void) +{ + if (lx_user_task) + lx_emul_task_unblock(lx_user_task); +} + + +void lx_user_init(void) +{ + int pid = kernel_thread(usb_poll_sessions, NULL, CLONE_FS | CLONE_FILES); + lx_user_task = find_task_by_pid_ns(pid, NULL);; +} + + +static int raw_notify(struct notifier_block *nb, unsigned long action, void *data) +{ + struct usb_device *udev = (struct usb_device*) data; + + switch (action) { + + case USB_DEVICE_ADD: + { + /** + * Register pseudo device class of USB device + * + * The registered value expresses the type of USB device. + * If the device has at least one HID interface, the value + * is USB_CLASS_HID. Otherwise, the class of the first interface + * is interpreted as device type. + * + * Note this classification of USB devices is meant as an interim + * solution only to assist the implementation of access-control + * policies. + */ + unsigned long class; + unsigned i; + + for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { + struct usb_interface * iface = udev->actconfig->interface[i]; + if (!iface || !iface->cur_altsetting) continue; + if (i == 0 || + iface->cur_altsetting->desc.bInterfaceClass == + USB_CLASS_HID) + class = iface->cur_altsetting->desc.bInterfaceClass; + } + + genode_usb_announce_device(udev->descriptor.idVendor, + udev->descriptor.idProduct, + class, + udev->bus->busnum, + udev->devnum); + break; + } + + case USB_DEVICE_REMOVE: + { + genode_usb_discontinue_device(udev->bus->busnum, udev->devnum); + break; + } + + case USB_BUS_ADD: + break; + + case USB_BUS_REMOVE: + break; + } + + return NOTIFY_OK; +} + + +struct notifier_block usb_nb = +{ + .notifier_call = raw_notify +}; + + +static int usbnet_init(void) +{ + usb_register_notify(&usb_nb); + return 0; +} + +/** + * Let's hook into the usbnet initcall, so we do not need to register + * an additional one + */ +module_init(usbnet_init); diff --git a/repos/pc/src/drivers/usb_host/pc/usb.h b/repos/pc/src/drivers/usb_host/pc/usb.h new file mode 100644 index 0000000000..af3a514904 --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/usb.h @@ -0,0 +1,32 @@ +/** + * \brief USB related definitions for kernel/genode c-api + * \author Stefan Kalkowski + * \date 2021-09-17 + */ + +/* + * Copyright (C) 2021 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +#include + +struct usb_interface; + +#ifdef __cplusplus +extern "C" { +#endif + +struct genode_attached_dataspace * +genode_usb_allocate_peer_buffer(unsigned long size); + +void genode_usb_free_peer_buffer(struct genode_attached_dataspace * ptr); + +extern struct genode_usb_rpc_callbacks genode_usb_rpc_callbacks_obj; + +#ifdef __cplusplus +} +#endif + diff --git a/repos/pc/src/lib/pc/lx_emul/common_dummies.c b/repos/pc/src/lib/pc/lx_emul/common_dummies.c new file mode 100644 index 0000000000..d7afc19018 --- /dev/null +++ b/repos/pc/src/lib/pc/lx_emul/common_dummies.c @@ -0,0 +1,62 @@ +/* + * \brief Dummy definitions of Linux Kernel functions - handled manually + * \author Josef Soentgen + * \date 2022-02-04 + */ + +/* + * Copyright (C) 2022 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +#include + +#include + +char __start_rodata[] = {}; +char __end_rodata[] = {}; + +#include + +int __preempt_count = 0; + +#include + +unsigned int __sw_hweight32(__u32 w) +{ + lx_emul_trace_and_stop(__func__); +} + +#include + +unsigned long __sw_hweight64(__u64 w) +{ + lx_emul_trace_and_stop(__func__); +} + + +#include + +unsigned long net_rand_noise; + + +#include + +const struct trace_print_flags gfpflag_names[] = { {0,NULL}}; + + +#include + +const struct trace_print_flags vmaflag_names[] = { {0,NULL}}; + + +#include + +const struct trace_print_flags pageflag_names[] = { {0,NULL}}; + + +#include + +struct kernel_stat kstat;