diff --git a/repos/dde_linux/recipes/src/usb_hid_drv/content.mk b/repos/dde_linux/recipes/src/usb_hid_drv/content.mk
new file mode 100644
index 0000000000..f7e4013edb
--- /dev/null
+++ b/repos/dde_linux/recipes/src/usb_hid_drv/content.mk
@@ -0,0 +1,11 @@
+MIRROR_FROM_REP_DIR := src/drivers/usb_hid
+
+content: $(MIRROR_FROM_REP_DIR)
+$(MIRROR_FROM_REP_DIR):
+ $(mirror_from_rep_dir)
+
+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/dde_linux/recipes/src/usb_hid_drv/hash b/repos/dde_linux/recipes/src/usb_hid_drv/hash
new file mode 100644
index 0000000000..bab11d3b38
--- /dev/null
+++ b/repos/dde_linux/recipes/src/usb_hid_drv/hash
@@ -0,0 +1 @@
+2023-07-04-e 3ad103c64cb765420638f0dccaed76d7b702b7e5
diff --git a/repos/dde_linux/recipes/src/usb_hid_drv/used_apis b/repos/dde_linux/recipes/src/usb_hid_drv/used_apis
new file mode 100644
index 0000000000..f8a20a9841
--- /dev/null
+++ b/repos/dde_linux/recipes/src/usb_hid_drv/used_apis
@@ -0,0 +1,8 @@
+base
+event_session
+genode_c_api
+jitterentropy
+os
+report_session
+usb_session
+virt_linux
diff --git a/repos/dde_linux/src/drivers/usb_hid/README b/repos/dde_linux/src/drivers/usb_hid/README
new file mode 100644
index 0000000000..d2d304d001
--- /dev/null
+++ b/repos/dde_linux/src/drivers/usb_hid/README
@@ -0,0 +1,29 @@
+USB HID driver
+##############
+
+Supports keyboard and mouse connected via USB. It connects to one or multiple
+USB sessions and reports input events to an event session. A run script can be
+found under 'run/usb_hid_raw.run'.
+
+Configuration snippet:
+
+!
+!
+!
+!
+
+When the use_report attribute is set, the HID driver will request a ROM called
+"report" that is used to iterate over all devices provided by the USB host
+controller driver (resp. a rom filter). In that mode the driver tries to
+claim all HID devices (class 0x3) via dedicated USB sessions.
+
+
+Keyboard LED handling
+~~~~~~~~~~~~~~~~~~~~~
+
+The state of the keyboard LEDs like capslock can be controlled by providing
+a corresponding ROM to the driver and configure it appropriately:
+
+!...
+!
+!...
diff --git a/repos/dde_linux/src/drivers/usb_hid/dep.list b/repos/dde_linux/src/drivers/usb_hid/dep.list
new file mode 100644
index 0000000000..5d11304586
--- /dev/null
+++ b/repos/dde_linux/src/drivers/usb_hid/dep.list
@@ -0,0 +1,1230 @@
+arch/arm64/include/asm/alternative.h
+arch/arm64/include/asm/alternative-macros.h
+arch/arm64/include/asm/archrandom.h
+arch/arm64/include/asm/arch_timer.h
+arch/arm64/include/asm/asm-bug.h
+arch/arm64/include/asm/asm-extable.h
+arch/arm64/include/asm/asm-offsets.h
+arch/arm64/include/asm/assembler.h
+arch/arm64/include/asm/atomic.h
+arch/arm64/include/asm/atomic_ll_sc.h
+arch/arm64/include/asm/barrier.h
+arch/arm64/include/asm/bitops.h
+arch/arm64/include/asm/boot.h
+arch/arm64/include/asm/brk-imm.h
+arch/arm64/include/asm/bug.h
+arch/arm64/include/asm/cacheflush.h
+arch/arm64/include/asm/cache.h
+arch/arm64/include/asm/checksum.h
+arch/arm64/include/asm/clocksource.h
+arch/arm64/include/asm/cmpxchg.h
+arch/arm64/include/asm/compat.h
+arch/arm64/include/asm/compiler.h
+arch/arm64/include/asm/cpufeature.h
+arch/arm64/include/asm/cputype.h
+arch/arm64/include/asm/debug-monitors.h
+arch/arm64/include/asm/device.h
+arch/arm64/include/asm/elf.h
+arch/arm64/include/asm/esr.h
+arch/arm64/include/asm/exec.h
+arch/arm64/include/asm/extable.h
+arch/arm64/include/asm/fpsimd.h
+arch/arm64/include/asm/ftrace.h
+arch/arm64/include/asm/gpr-num.h
+arch/arm64/include/asm/hardirq.h
+arch/arm64/include/asm/hw_breakpoint.h
+arch/arm64/include/asm/hwcap.h
+arch/arm64/include/asm/insn-def.h
+arch/arm64/include/asm/insn.h
+arch/arm64/include/asm/io.h
+arch/arm64/include/asm/irq.h
+arch/arm64/include/asm/irq_work.h
+arch/arm64/include/asm/kasan.h
+arch/arm64/include/asm/kernel-pgtable.h
+arch/arm64/include/asm/kgdb.h
+arch/arm64/include/asm/kprobes.h
+arch/arm64/include/asm/kvm_arm.h
+arch/arm64/include/asm/linkage.h
+arch/arm64/include/asm/lse.h
+arch/arm64/include/asm/mman.h
+arch/arm64/include/asm/mmu_context.h
+arch/arm64/include/asm/mmu.h
+arch/arm64/include/asm/module.h
+arch/arm64/include/asm/mte-def.h
+arch/arm64/include/asm/mte.h
+arch/arm64/include/asm/mte-kasan.h
+arch/arm64/include/asm/page-def.h
+arch/arm64/include/asm/percpu.h
+arch/arm64/include/asm/pgtable-hwdef.h
+arch/arm64/include/asm/pgtable-prot.h
+arch/arm64/include/asm/pgtable-types.h
+arch/arm64/include/asm/pointer_auth.h
+arch/arm64/include/asm/preempt.h
+arch/arm64/include/asm/processor.h
+arch/arm64/include/asm/proc-fns.h
+arch/arm64/include/asm/ptrace.h
+arch/arm64/include/asm/rwonce.h
+arch/arm64/include/asm/sections.h
+arch/arm64/include/asm/shmparam.h
+arch/arm64/include/asm/signal.h
+arch/arm64/include/asm/smp.h
+arch/arm64/include/asm/sparsemem.h
+arch/arm64/include/asm/spectre.h
+arch/arm64/include/asm/spinlock_types.h
+arch/arm64/include/asm/stack_pointer.h
+arch/arm64/include/asm/stat.h
+arch/arm64/include/asm/string.h
+arch/arm64/include/asm/syscall_wrapper.h
+arch/arm64/include/asm/sysreg.h
+arch/arm64/include/asm/thread_info.h
+arch/arm64/include/asm/timex.h
+arch/arm64/include/asm/tlbflush.h
+arch/arm64/include/asm/topology.h
+arch/arm64/include/asm/uaccess.h
+arch/arm64/include/asm/unistd.h
+arch/arm64/include/asm/vdso/clocksource.h
+arch/arm64/include/asm/vdso/processor.h
+arch/arm64/include/asm/virt.h
+arch/arm64/include/asm/vmalloc.h
+arch/arm64/include/asm/word-at-a-time.h
+arch/arm64/include/uapi/asm/auxvec.h
+arch/arm64/include/uapi/asm/bitsperlong.h
+arch/arm64/include/uapi/asm/bpf_perf_event.h
+arch/arm64/include/uapi/asm/byteorder.h
+arch/arm64/include/uapi/asm/fcntl.h
+arch/arm64/include/uapi/asm/hwcap.h
+arch/arm64/include/uapi/asm/mman.h
+arch/arm64/include/uapi/asm/param.h
+arch/arm64/include/uapi/asm/perf_regs.h
+arch/arm64/include/uapi/asm/posix_types.h
+arch/arm64/include/uapi/asm/ptrace.h
+arch/arm64/include/uapi/asm/sigcontext.h
+arch/arm64/include/uapi/asm/signal.h
+arch/arm64/include/uapi/asm/sve_context.h
+arch/arm64/include/uapi/asm/unistd.h
+arch/arm/include/asm/archrandom.h
+arch/arm/include/asm/asm-offsets.h
+arch/arm/include/asm/assembler.h
+arch/arm/include/asm/atomic.h
+arch/arm/include/asm/auxvec.h
+arch/arm/include/asm/barrier.h
+arch/arm/include/asm/bitops.h
+arch/arm/include/asm/bug.h
+arch/arm/include/asm/cacheflush.h
+arch/arm/include/asm/cache.h
+arch/arm/include/asm/cachetype.h
+arch/arm/include/asm/checksum.h
+arch/arm/include/asm/cmpxchg.h
+arch/arm/include/asm/compiler.h
+arch/arm/include/asm/cpu.h
+arch/arm/include/asm/cputype.h
+arch/arm/include/asm/device.h
+arch/arm/include/asm/div64.h
+arch/arm/include/asm/domain.h
+arch/arm/include/asm/elf.h
+arch/arm/include/asm/fpstate.h
+arch/arm/include/asm/ftrace.h
+arch/arm/include/asm/glue-cache.h
+arch/arm/include/asm/glue.h
+arch/arm/include/asm/glue-proc.h
+arch/arm/include/asm/hardirq.h
+arch/arm/include/asm/hw_breakpoint.h
+arch/arm/include/asm/hwcap.h
+arch/arm/include/asm/hw_irq.h
+arch/arm/include/asm/insn.h
+arch/arm/include/asm/io.h
+arch/arm/include/asm/irq.h
+arch/arm/include/asm/irq_work.h
+arch/arm/include/asm/kprobes.h
+arch/arm/include/asm/linkage.h
+arch/arm/include/asm/mmu_context.h
+arch/arm/include/asm/mmu.h
+arch/arm/include/asm/module.h
+arch/arm/include/asm/opcodes.h
+arch/arm/include/asm/opcodes-virt.h
+arch/arm/include/asm/outercache.h
+arch/arm/include/asm/page-nommu.h
+arch/arm/include/asm/percpu.h
+arch/arm/include/asm/processor.h
+arch/arm/include/asm/proc-fns.h
+arch/arm/include/asm/ptrace.h
+arch/arm/include/asm/sections.h
+arch/arm/include/asm/shmparam.h
+arch/arm/include/asm/signal.h
+arch/arm/include/asm/smp.h
+arch/arm/include/asm/smp_plat.h
+arch/arm/include/asm/spinlock_types.h
+arch/arm/include/asm/string.h
+arch/arm/include/asm/swab.h
+arch/arm/include/asm/switch_to.h
+arch/arm/include/asm/thread_info.h
+arch/arm/include/asm/timex.h
+arch/arm/include/asm/topology.h
+arch/arm/include/asm/uaccess-asm.h
+arch/arm/include/asm/uaccess.h
+arch/arm/include/asm/unified.h
+arch/arm/include/asm/unistd.h
+arch/arm/include/asm/unwind.h
+arch/arm/include/asm/user.h
+arch/arm/include/asm/vdso/cp15.h
+arch/arm/include/asm/vdso_datapage.h
+arch/arm/include/asm/vdso/gettimeofday.h
+arch/arm/include/asm/vdso/processor.h
+arch/arm/include/asm/vmalloc.h
+arch/arm/include/asm/word-at-a-time.h
+arch/arm/include/uapi/asm/auxvec.h
+arch/arm/include/uapi/asm/byteorder.h
+arch/arm/include/uapi/asm/fcntl.h
+arch/arm/include/uapi/asm/hwcap.h
+arch/arm/include/uapi/asm/mman.h
+arch/arm/include/uapi/asm/perf_regs.h
+arch/arm/include/uapi/asm/posix_types.h
+arch/arm/include/uapi/asm/ptrace.h
+arch/arm/include/uapi/asm/sigcontext.h
+arch/arm/include/uapi/asm/signal.h
+arch/arm/include/uapi/asm/stat.h
+arch/arm/include/uapi/asm/swab.h
+arch/arm/include/uapi/asm/types.h
+arch/arm/include/uapi/asm/unistd.h
+arch/arm/lib/bitops.h
+arch/x86/include/asm/alternative.h
+arch/x86/include/asm/apicdef.h
+arch/x86/include/asm/arch_hweight.h
+arch/x86/include/asm/archrandom.h
+arch/x86/include/asm/asm.h
+arch/x86/include/asm/atomic64_64.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/cacheflush.h
+arch/x86/include/asm/cache.h
+arch/x86/include/asm/checksum_32.h
+arch/x86/include/asm/checksum_64.h
+arch/x86/include/asm/checksum.h
+arch/x86/include/asm/clocksource.h
+arch/x86/include/asm/cmpxchg_32.h
+arch/x86/include/asm/cmpxchg_64.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/cpufeature.h
+arch/x86/include/asm/cpufeatures.h
+arch/x86/include/asm/cpu.h
+arch/x86/include/asm/cpumask.h
+arch/x86/include/asm/delay.h
+arch/x86/include/asm/desc_defs.h
+arch/x86/include/asm/desc.h
+arch/x86/include/asm/device.h
+arch/x86/include/asm/disabled-features.h
+arch/x86/include/asm/div64.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_fixup_types.h
+arch/x86/include/asm/extable.h
+arch/x86/include/asm/fixmap.h
+arch/x86/include/asm/fpu/api.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/ibt.h
+arch/x86/include/asm/intel_ds.h
+arch/x86/include/asm/invpcid.h
+arch/x86/include/asm/irq.h
+arch/x86/include/asm/irq_stack.h
+arch/x86/include/asm/irq_vectors.h
+arch/x86/include/asm/irq_work.h
+arch/x86/include/asm/ist.h
+arch/x86/include/asm/kaslr.h
+arch/x86/include/asm/kdebug.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/mmu_context.h
+arch/x86/include/asm/mmu.h
+arch/x86/include/asm/module.h
+arch/x86/include/asm/msr.h
+arch/x86/include/asm/msr-index.h
+arch/x86/include/asm/nops.h
+arch/x86/include/asm/orc_types.h
+arch/x86/include/asm/page_32.h
+arch/x86/include/asm/page_32_types.h
+arch/x86/include/asm/page_64_types.h
+arch/x86/include/asm/page_types.h
+arch/x86/include/asm/paravirt.h
+arch/x86/include/asm/percpu.h
+arch/x86/include/asm/perf_event.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/pgtable_64_types.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/shared/msr.h
+arch/x86/include/asm/shared/tdx.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/softirq_stack.h
+arch/x86/include/asm/sparsemem.h
+arch/x86/include/asm/spinlock_types.h
+arch/x86/include/asm/stacktrace.h
+arch/x86/include/asm/static_call.h
+arch/x86/include/asm/string_64.h
+arch/x86/include/asm/string.h
+arch/x86/include/asm/syscall_wrapper.h
+arch/x86/include/asm/tdx.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/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_32.h
+arch/x86/include/asm/user32.h
+arch/x86/include/asm/user_64.h
+arch/x86/include/asm/user.h
+arch/x86/include/asm/vdso/clocksource.h
+arch/x86/include/asm/vdso.h
+arch/x86/include/asm/vdso/processor.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/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/posix_types_32.h
+arch/x86/include/uapi/asm/posix_types_64.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
+arch/x86/include/uapi/asm/vsyscall.h
+drivers/base/base.h
+drivers/base/physical_location.h
+drivers/base/power/power.h
+drivers/base/trace.h
+drivers/hid/hid-ids.h
+drivers/hid/usbhid/usbhid.h
+drivers/input/input-compat.h
+drivers/input/input-core-private.h
+drivers/input/input-poller.h
+drivers/usb/core/hub.h
+drivers/usb/core/otg_productlist.h
+drivers/usb/core/usb.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/actbl1.h
+include/acpi/actbl2.h
+include/acpi/actbl3.h
+include/acpi/actbl.h
+include/acpi/actypes.h
+include/acpi/platform/acenvex.h
+include/acpi/platform/acenv.h
+include/acpi/platform/acgccex.h
+include/acpi/platform/acgcc.h
+include/acpi/platform/aclinuxex.h
+include/acpi/platform/aclinux.h
+include/asm-generic/access_ok.h
+include/asm-generic/archrandom.h
+include/asm-generic/asm-prototypes.h
+include/asm-generic/barrier.h
+include/asm-generic/bitops/arch_hweight.h
+include/asm-generic/bitops/atomic.h
+include/asm-generic/bitops/builtin-__ffs.h
+include/asm-generic/bitops/builtin-ffs.h
+include/asm-generic/bitops/builtin-__fls.h
+include/asm-generic/bitops/builtin-fls.h
+include/asm-generic/bitops/const_hweight.h
+include/asm-generic/bitops/ext2-atomic-setbit.h
+include/asm-generic/bitops/ffz.h
+include/asm-generic/bitops/fls64.h
+include/asm-generic/bitops/generic-non-atomic.h
+include/asm-generic/bitops/hweight.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/lock.h
+include/asm-generic/bitops/non-atomic.h
+include/asm-generic/bitops/non-instrumented-non-atomic.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/checksum.h
+include/asm-generic/cmpxchg-local.h
+include/asm-generic/compat.h
+include/asm-generic/delay.h
+include/asm-generic/div64.h
+include/asm-generic/dma-mapping.h
+include/asm-generic/early_ioremap.h
+include/asm-generic/emergency-restart.h
+include/asm-generic/error-injection.h
+include/asm-generic/exec.h
+include/asm-generic/export.h
+include/asm-generic/extable.h
+include/asm-generic/fixmap.h
+include/asm-generic/getorder.h
+include/asm-generic/hardirq.h
+include/asm-generic/hw_irq.h
+include/asm-generic/int-ll64.h
+include/asm-generic/ioctl.h
+include/asm-generic/io.h
+include/asm-generic/iomap.h
+include/asm-generic/irqflags.h
+include/asm-generic/irq.h
+include/asm-generic/irq_regs.h
+include/asm-generic/kdebug.h
+include/asm-generic/kmap_size.h
+include/asm-generic/kprobes.h
+include/asm-generic/kvm_para.h
+include/asm-generic/local64.h
+include/asm-generic/local.h
+include/asm-generic/memory_model.h
+include/asm-generic/mm_hooks.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_iomap.h
+include/asm-generic/percpu.h
+include/asm-generic/pgtable-nop4d.h
+include/asm-generic/pgtable-nopmd.h
+include/asm-generic/pgtable-nopud.h
+include/asm-generic/pgtable_uffd.h
+include/asm-generic/preempt.h
+include/asm-generic/qrwlock_types.h
+include/asm-generic/qspinlock_types.h
+include/asm-generic/resource.h
+include/asm-generic/rwonce.h
+include/asm-generic/sections.h
+include/asm-generic/shmparam.h
+include/asm-generic/signal.h
+include/asm-generic/softirq_stack.h
+include/asm-generic/switch_to.h
+include/asm-generic/timex.h
+include/asm-generic/topology.h
+include/asm-generic/trace_clock.h
+include/asm-generic/unaligned.h
+include/asm-generic/user.h
+include/clocksource/arm_arch_timer.h
+include/dt-bindings/leds/common.h
+include/linux/acpi.h
+include/linux/alarmtimer.h
+include/linux/align.h
+include/linux/apm_bios.h
+include/linux/arch_topology.h
+include/linux/arm-smccc.h
+include/linux/assoc_array.h
+include/linux/async.h
+include/linux/atomic/atomic-arch-fallback.h
+include/linux/atomic/atomic-instrumented.h
+include/linux/atomic/atomic-long.h
+include/linux/atomic.h
+include/linux/audit_arch.h
+include/linux/audit.h
+include/linux/auxvec.h
+include/linux/backing-dev-defs.h
+include/linux/binfmts.h
+include/linux/bio.h
+include/linux/bitfield.h
+include/linux/bitmap.h
+include/linux/bitops.h
+include/linux/bits.h
+include/linux/bit_spinlock.h
+include/linux/blkdev.h
+include/linux/blk_types.h
+include/linux/bottom_half.h
+include/linux/bpf-cgroup-defs.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/cacheflush.h
+include/linux/cache.h
+include/linux/capability.h
+include/linux/cc_platform.h
+include/linux/cdev.h
+include/linux/cgroup_api.h
+include/linux/cgroup-defs.h
+include/linux/cgroup.h
+include/linux/clk.h
+include/linux/clk-provider.h
+include/linux/clockchips.h
+include/linux/clocksource.h
+include/linux/clocksource_ids.h
+include/linux/compat.h
+include/linux/compiler_attributes.h
+include/linux/compiler-gcc.h
+include/linux/compiler.h
+include/linux/compiler_types.h
+include/linux/compiler-version.h
+include/linux/completion.h
+include/linux/const.h
+include/linux/container_of.h
+include/linux/context_tracking.h
+include/linux/context_tracking_irq.h
+include/linux/context_tracking_state.h
+include/linux/cpufreq.h
+include/linux/cpu.h
+include/linux/cpuhotplug.h
+include/linux/cpumask_api.h
+include/linux/cpumask.h
+include/linux/cpuset.h
+include/linux/cred.h
+include/linux/ctype.h
+include/linux/dcache.h
+include/linux/debugfs.h
+include/linux/debug_locks.h
+include/linux/debugobjects.h
+include/linux/delayed_call.h
+include/linux/delay.h
+include/linux/device/bus.h
+include/linux/device/class.h
+include/linux/device/driver.h
+include/linux/device.h
+include/linux/dev_printk.h
+include/linux/dma-direction.h
+include/linux/dma-map-ops.h
+include/linux/dma-mapping.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/elf.h
+include/linux/elf-randomize.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/ethtool.h
+include/linux/eventfd.h
+include/linux/export.h
+include/linux/extcon.h
+include/linux/fault-inject.h
+include/linux/fault-inject-usercopy.h
+include/linux/fcntl.h
+include/linux/file.h
+include/linux/find.h
+include/linux/flex_proportions.h
+include/linux/freelist.h
+include/linux/freezer.h
+include/linux/fs_api.h
+include/linux/fs.h
+include/linux/fs_types.h
+include/linux/ftrace.h
+include/linux/ftrace_irq.h
+include/linux/fwnode.h
+include/linux/gfp.h
+include/linux/gfp_types.h
+include/linux/gpio/consumer.h
+include/linux/hardirq.h
+include/linux/hash.h
+include/linux/hashtable_api.h
+include/linux/hashtable.h
+include/linux/hid-debug.h
+include/linux/hiddev.h
+include/linux/hid.h
+include/linux/hidraw.h
+include/linux/highmem.h
+include/linux/highmem-internal.h
+include/linux/highuid.h
+include/linux/hrtimer_api.h
+include/linux/hrtimer_defs.h
+include/linux/hrtimer.h
+include/linux/huge_mm.h
+include/linux/hugetlb.h
+include/linux/hugetlb_inline.h
+include/linux/idr.h
+include/linux/if_ether.h
+include/linux/if_link.h
+include/linux/in6.h
+include/linux/indirect_call_wrapper.h
+include/linux/in.h
+include/linux/init.h
+include/linux/init_task.h
+include/linux/input/elan-i2c-ids.h
+include/linux/input.h
+include/linux/input/mt.h
+include/linux/instruction_pointer.h
+include/linux/instrumentation.h
+include/linux/instrumented.h
+include/linux/interrupt.h
+include/linux/ioasid.h
+include/linux/iocontext.h
+include/linux/io.h
+include/linux/iopoll.h
+include/linux/ioport.h
+include/linux/ioprio.h
+include/linux/ipc.h
+include/linux/ipv6.h
+include/linux/irqchip.h
+include/linux/irqdesc.h
+include/linux/irqdomain.h
+include/linux/irqflags.h
+include/linux/irq.h
+include/linux/irqhandler.h
+include/linux/irqnr.h
+include/linux/irqreturn.h
+include/linux/irq_work.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-enabled.h
+include/linux/kasan.h
+include/linux/kasan-tags.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/kernel.h
+include/linux/kernel_read_file.h
+include/linux/kernel_stat.h
+include/linux/kernfs.h
+include/linux/kern_levels.h
+include/linux/key.h
+include/linux/kgdb.h
+include/linux/klist.h
+include/linux/kmemleak.h
+include/linux/kmod.h
+include/linux/kmsan-checks.h
+include/linux/kmsan.h
+include/linux/kmsan_types.h
+include/linux/kobject_api.h
+include/linux/kobject.h
+include/linux/kobject_ns.h
+include/linux/kprobes.h
+include/linux/kref_api.h
+include/linux/kref.h
+include/linux/kstrtox.h
+include/linux/kthread.h
+include/linux/ktime_api.h
+include/linux/ktime.h
+include/linux/kvm_para.h
+include/linux/latencytop.h
+include/linux/leds.h
+include/linux/limits.h
+include/linux/linkage.h
+include/linux/linkmode.h
+include/linux/list_bl.h
+include/linux/list.h
+include/linux/list_lru.h
+include/linux/list_nulls.h
+include/linux/livepatch.h
+include/linux/llist.h
+include/linux/local_lock.h
+include/linux/local_lock_internal.h
+include/linux/lockdep_api.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/maple_tree.h
+include/linux/math64.h
+include/linux/math.h
+include/linux/mdio.h
+include/linux/memcontrol.h
+include/linux/mem_encrypt.h
+include/linux/memory_hotplug.h
+include/linux/mempolicy.h
+include/linux/mempool.h
+include/linux/memremap.h
+include/linux/migrate_mode.h
+include/linux/mii.h
+include/linux/mii_timestamper.h
+include/linux/minmax.h
+include/linux/mman.h
+include/linux/mmap_lock.h
+include/linux/mmdebug.h
+include/linux/mm.h
+include/linux/mm_types.h
+include/linux/mm_types_task.h
+include/linux/mmu_context.h
+include/linux/mmzone.h
+include/linux/mnt_idmapping.h
+include/linux/mod_devicetable.h
+include/linux/module.h
+include/linux/moduleparam.h
+include/linux/mount.h
+include/linux/mutex_api.h
+include/linux/mutex.h
+include/linux/netdev_features.h
+include/linux/netdevice.h
+include/linux/netfilter_defs.h
+include/linux/net.h
+include/linux/netlink.h
+include/linux/nfs_fs_i.h
+include/linux/nmi.h
+include/linux/node.h
+include/linux/nodemask.h
+include/linux/nospec.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_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.h
+include/linux/of_irq.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/pageblock-flags.h
+include/linux/page_counter.h
+include/linux/page_ext.h
+include/linux/page-flags.h
+include/linux/page-flags-layout.h
+include/linux/pagemap.h
+include/linux/page_ref.h
+include/linux/panic.h
+include/linux/path.h
+include/linux/percpu_counter.h
+include/linux/percpu-defs.h
+include/linux/percpu.h
+include/linux/percpu-refcount.h
+include/linux/percpu-rwsem.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.h
+include/linux/phy/phy-lvds.h
+include/linux/phy/phy-mipi-dphy.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_opp.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/power_supply.h
+include/linux/prandom.h
+include/linux/preempt.h
+include/linux/prefetch.h
+include/linux/printk.h
+include/linux/processor.h
+include/linux/proc_fs.h
+include/linux/profile.h
+include/linux/projid.h
+include/linux/property.h
+include/linux/psi.h
+include/linux/psi_types.h
+include/linux/ptrace_api.h
+include/linux/ptrace.h
+include/linux/ptr_ring.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_latch.h
+include/linux/rbtree_types.h
+include/linux/rculist_bl.h
+include/linux/rculist.h
+include/linux/rculist_nulls.h
+include/linux/rcu_node_tree.h
+include/linux/rcupdate.h
+include/linux/rcu_segcblist.h
+include/linux/rcu_sync.h
+include/linux/rcutree.h
+include/linux/rcuwait.h
+include/linux/reboot.h
+include/linux/refcount.h
+include/linux/ref_tracker.h
+include/linux/regulator/consumer.h
+include/linux/resource_ext.h
+include/linux/resource.h
+include/linux/restart_block.h
+include/linux/rethook.h
+include/linux/rhashtable-types.h
+include/linux/ring_buffer.h
+include/linux/rmap.h
+include/linux/rtc.h
+include/linux/rtmutex.h
+include/linux/rtnetlink.h
+include/linux/rv.h
+include/linux/rwlock_api_smp.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/affinity.h
+include/linux/sched/autogroup.h
+include/linux/sched/clock.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.h
+include/linux/sched/hotplug.h
+include/linux/sched/idle.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/rseq_api.h
+include/linux/sched/rt.h
+include/linux/sched/sd_flags.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_flags.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/screen_info.h
+include/linux/seccomp.h
+include/linux/securebits.h
+include/linux/security.h
+include/linux/semaphore.h
+include/linux/sem.h
+include/linux/seq_buf.h
+include/linux/seq_file.h
+include/linux/seq_file_net.h
+include/linux/seqlock.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/smpboot.h
+include/linux/smp.h
+include/linux/smp_types.h
+include/linux/socket.h
+include/linux/sockptr.h
+include/linux/softirq.h
+include/linux/spinlock_api.h
+include/linux/spinlock_api_smp.h
+include/linux/spinlock.h
+include/linux/spinlock_types.h
+include/linux/spinlock_types_raw.h
+include/linux/splice.h
+include/linux/srcu.h
+include/linux/srcutree.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/stdarg.h
+include/linux/stddef.h
+include/linux/stop_machine.h
+include/linux/string.h
+include/linux/stringhash.h
+include/linux/string_helpers.h
+include/linux/stringify.h
+include/linux/suspend.h
+include/linux/swab.h
+include/linux/swait_api.h
+include/linux/swait.h
+include/linux/swap.h
+include/linux/swapops.h
+include/linux/swiotlb.h
+include/linux/sync_core.h
+include/linux/syscalls_api.h
+include/linux/syscalls.h
+include/linux/syscall_user_dispatch.h
+include/linux/syscore_ops.h
+include/linux/sysctl.h
+include/linux/sysfs.h
+include/linux/task_io_accounting.h
+include/linux/tcp.h
+include/linux/textsearch.h
+include/linux/thread_info.h
+include/linux/threads.h
+include/linux/tick.h
+include/linux/time32.h
+include/linux/time64.h
+include/linux/timecounter.h
+include/linux/time.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/tracepoint-defs.h
+include/linux/tracepoint.h
+include/linux/trace_recursion.h
+include/linux/trace_seq.h
+include/linux/typecheck.h
+include/linux/types.h
+include/linux/u64_stats_sync_api.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/ch9.h
+include/linux/usbdevice_fs.h
+include/linux/usb.h
+include/linux/usb/hcd.h
+include/linux/usb/of.h
+include/linux/usb/onboard_hub.h
+include/linux/usb/otg.h
+include/linux/usb/phy.h
+include/linux/usb/quirks.h
+include/linux/userfaultfd_k.h
+include/linux/user_namespace.h
+include/linux/utsname.h
+include/linux/uuid.h
+include/linux/vmalloc.h
+include/linux/vm_event_item.h
+include/linux/vmpressure.h
+include/linux/vmstat.h
+include/linux/vtime.h
+include/linux/wait_api.h
+include/linux/wait_bit.h
+include/linux/wait.h
+include/linux/win_minmax.h
+include/linux/workqueue_api.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/dropreason.h
+include/net/dst.h
+include/net/dst_ops.h
+include/net/fib_notifier.h
+include/net/fib_rules.h
+include/net/flow_dissector.h
+include/net/flow.h
+include/net/if_inet6.h
+include/net/inet_connection_sock.h
+include/net/inet_dscp.h
+include/net/inet_frag.h
+include/net/inet_sock.h
+include/net/inet_timewait_sock.h
+include/net/ipv6.h
+include/net/l3mdev.h
+include/net/neighbour.h
+include/net/net_debug.h
+include/net/netlink.h
+include/net/net_namespace.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/mctp.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/xdp.h
+include/net/netns/xfrm.h
+include/net/netprio_cgroup.h
+include/net/net_trackers.h
+include/net/page_pool.h
+include/net/request_sock.h
+include/net/rtnetlink.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/lock.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/ipcbuf.h
+include/uapi/asm-generic/kvm_para.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/sembuf.h
+include/uapi/asm-generic/shmbuf.h
+include/uapi/asm-generic/siginfo.h
+include/uapi/asm-generic/signal-defs.h
+include/uapi/asm-generic/signal.h
+include/uapi/asm-generic/socket.h
+include/uapi/asm-generic/sockios.h
+include/uapi/asm-generic/stat.h
+include/uapi/asm-generic/swab.h
+include/uapi/asm-generic/types.h
+include/uapi/asm-generic/unistd.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_perf_event.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/fs.h
+include/uapi/linux/hdlc/ioctl.h
+include/uapi/linux/hiddev.h
+include/uapi/linux/hid.h
+include/uapi/linux/hidraw.h
+include/uapi/linux/icmpv6.h
+include/uapi/linux/if_addr.h
+include/uapi/linux/if_bonding.h
+include/uapi/linux/if_ether.h
+include/uapi/linux/if.h
+include/uapi/linux/if_link.h
+include/uapi/linux/if_packet.h
+include/uapi/linux/in6.h
+include/uapi/linux/in.h
+include/uapi/linux/input-event-codes.h
+include/uapi/linux/input.h
+include/uapi/linux/ioctl.h
+include/uapi/linux/ioprio.h
+include/uapi/linux/ipc.h
+include/uapi/linux/ipv6.h
+include/uapi/linux/irqnr.h
+include/uapi/linux/kcov.h
+include/uapi/linux/kdev_t.h
+include/uapi/linux/kernel.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/netdevice.h
+include/uapi/linux/netfilter.h
+include/uapi/linux/netfilter/nf_tables.h
+include/uapi/linux/net.h
+include/uapi/linux/netlink.h
+include/uapi/linux/net_tstamp.h
+include/uapi/linux/openat2.h
+include/uapi/linux/param.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/prctl.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/time.h
+include/uapi/linux/time_types.h
+include/uapi/linux/timex.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/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/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/datapage.h
+include/vdso/jiffies.h
+include/vdso/ktime.h
+include/vdso/limits.h
+include/vdso/math64.h
+include/vdso/processor.h
+include/vdso/time32.h
+include/vdso/time64.h
+include/vdso/time.h
+include/video/edid.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/locking/ww_mutex.h
+kernel/sched/autogroup.h
+kernel/sched/clock.c
+kernel/sched/completion.c
+kernel/sched/cpudeadline.h
+kernel/sched/cpupri.c
+kernel/sched/cpupri.h
+kernel/sched/features.h
+kernel/sched/isolation.c
+kernel/sched/loadavg.c
+kernel/sched/sched.h
+kernel/sched/sched-pelt.h
+kernel/sched/stats.h
+kernel/sched/stop_task.c
+kernel/sched/swait.c
+kernel/sched/topology.c
+kernel/sched/wait_bit.c
+kernel/sched/wait.c
+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/kstrtox.h
+mm/internal.h
+mm/slab.h
+mm/swap.h
diff --git a/repos/dde_linux/src/drivers/usb_hid/dummies.c b/repos/dde_linux/src/drivers/usb_hid/dummies.c
new file mode 100644
index 0000000000..c3201509eb
--- /dev/null
+++ b/repos/dde_linux/src/drivers/usb_hid/dummies.c
@@ -0,0 +1,348 @@
+/*
+ * \brief Dummy definitions of Linux Kernel functions
+ * \author Sebastian Sumpf
+ * \date 2023-06-29
+ */
+
+/*
+ * Copyright (C) 2023 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#include
+
+#include
+
+DEFINE_STATIC_KEY_FALSE(force_irqthreads_key);
+
+#ifdef __arm__
+#include
+
+unsigned long arm_copy_to_user(void *to, const void *from, unsigned long n)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+asmlinkage void __div0(void);
+asmlinkage void __div0(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void arch_teardown_dma_ops(struct device * dev)
+{
+ lx_emul_trace(__func__);
+}
+
+
+extern void arm_heavy_mb(void);
+void arm_heavy_mb(void)
+{
+ // FIXME: on Cortex A9 we potentially need to flush L2-cache
+ lx_emul_trace(__func__);
+}
+
+#else
+
+#include
+
+noinstr void ct_irq_enter(void)
+{
+ lx_emul_trace(__func__);
+}
+
+
+#include
+noinstr void ct_irq_exit(void)
+{
+ lx_emul_trace(__func__);
+}
+
+#include
+void update_vsyscall(struct timekeeper * tk)
+{
+ lx_emul_trace(__func__);
+}
+
+#endif
+
+
+unsigned long __must_check __arch_copy_to_user(void __user *to, const void *from, unsigned long n);
+unsigned long __must_check __arch_copy_to_user(void __user *to, const void *from, unsigned long n)
+
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void net_ns_init(void)
+{
+ lx_emul_trace(__func__);
+}
+
+
+#include
+
+int kobject_uevent(struct kobject * kobj,enum kobject_action action)
+{
+ 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;
+}
+
+
+#include
+
+void register_syscore_ops(struct syscore_ops * ops)
+{
+ lx_emul_trace(__func__);
+}
+
+
+#include
+
+void __init usb_init_pool_max(void)
+{
+ lx_emul_trace(__func__);
+}
+
+
+#include
+
+void usb_hcd_synchronize_unlinks(struct usb_device * udev)
+{
+ lx_emul_trace(__func__);
+}
+
+
+#include
+
+void refcount_warn_saturate(refcount_t * r,enum refcount_saturation_type t)
+{
+ lx_emul_trace(__func__);
+}
+
+
+#include
+
+int __sched down_interruptible(struct semaphore * sem)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+extern int usb_major_init(void);
+int usb_major_init(void)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+extern int __init usb_devio_init(void);
+int __init usb_devio_init(void)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+#include
+
+int usb_string(struct usb_device * dev,int index,char * buf,size_t size)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+extern char * usb_cache_string(struct usb_device * udev,int index);
+char * usb_cache_string(struct usb_device * udev,int index)
+{
+ lx_emul_trace(__func__);
+ return NULL;
+}
+
+
+void usb_kill_urb(struct urb * urb)
+{
+ lx_emul_trace(__func__);
+}
+
+
+#include
+
+struct usb_hcd * usb_get_hcd(struct usb_hcd * hcd)
+{
+ lx_emul_trace(__func__);
+ return hcd;
+}
+
+
+#include
+
+void usb_put_hcd(struct usb_hcd * hcd)
+{
+ lx_emul_trace(__func__);
+}
+
+
+#include
+
+bool parse_option_str(const char * str,const char * option)
+{
+ lx_emul_trace(__func__);
+ return false;
+}
+
+
+#include
+
+void __sched up(struct semaphore * sem)
+{
+ lx_emul_trace(__func__);
+}
+
+
+#include
+
+void __sched down(struct semaphore * sem)
+{
+ lx_emul_trace(__func__);
+}
+
+
+#include
+
+int __sched down_trylock(struct semaphore * sem)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+#include
+
+void synchronize_rcu(void)
+{
+ lx_emul_trace(__func__);
+}
+
+
+#include
+
+void input_ff_destroy(struct input_dev * dev)
+{
+ lx_emul_trace(__func__);
+}
+
+
+#include
+
+void input_mt_destroy_slots(struct input_dev * dev)
+{
+ lx_emul_trace(__func__);
+}
+
+
+#include
+
+void skb_init()
+{
+ lx_emul_trace(__func__);
+}
+
+
+extern void software_node_notify(struct device * dev);
+void software_node_notify(struct device * dev)
+{
+ lx_emul_trace(__func__);
+}
+
+
+extern void software_node_notify_remove(struct device * dev);
+void software_node_notify_remove(struct device * dev)
+{
+ lx_emul_trace(__func__);
+}
+
+
+extern int usb_create_sysfs_dev_files(struct usb_device * udev);
+int usb_create_sysfs_dev_files(struct usb_device * udev)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+extern void usb_remove_sysfs_dev_files(struct usb_device * udev);
+void usb_remove_sysfs_dev_files(struct usb_device * udev)
+{
+ lx_emul_trace(__func__);
+}
+
+
+extern int usb_create_ep_devs(struct device * parent,struct usb_host_endpoint * endpoint,struct usb_device * udev);
+int usb_create_ep_devs(struct device * parent,struct usb_host_endpoint * endpoint,struct usb_device * udev)
+{
+ lx_emul_trace(__func__);
+ return 0;
+}
+
+
+extern void usb_remove_ep_devs(struct usb_host_endpoint * endpoint);
+void usb_remove_ep_devs(struct usb_host_endpoint * endpoint)
+{
+ lx_emul_trace(__func__);
+}
+
+
+extern void usb_notify_add_device(struct usb_device * udev);
+void usb_notify_add_device(struct usb_device * udev)
+{
+ lx_emul_trace(__func__);
+}
+
+
+extern void usb_notify_remove_device(struct usb_device * udev);
+void usb_notify_remove_device(struct usb_device * udev)
+{
+ lx_emul_trace(__func__);
+}
+
+
+extern void usb_create_sysfs_intf_files(struct usb_interface * intf);
+void usb_create_sysfs_intf_files(struct usb_interface * intf)
+{
+ lx_emul_trace(__func__);
+}
+
+
+extern void usb_remove_sysfs_intf_files(struct usb_interface * intf);
+void usb_remove_sysfs_intf_files(struct usb_interface * intf)
+{
+ lx_emul_trace(__func__);
+}
+
+
+extern void usb_disable_interface(struct usb_device * dev,struct usb_interface * intf,bool reset_hardware);
+void usb_disable_interface(struct usb_device * dev,struct usb_interface * intf,bool reset_hardware)
+{
+ lx_emul_trace(__func__);
+}
diff --git a/repos/dde_linux/src/drivers/usb_hid/led.c b/repos/dde_linux/src/drivers/usb_hid/led.c
new file mode 100644
index 0000000000..70d577e491
--- /dev/null
+++ b/repos/dde_linux/src/drivers/usb_hid/led.c
@@ -0,0 +1,206 @@
+/*
+ * \brief Keyboard LED handling
+ * \author Sebastian Sumpf
+ * \date 2023-06-29
+ */
+
+/*
+ * Copyright (C) 2023 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#include
+#include
+#include
+#include
+
+struct keyboard
+{
+ struct input_dev *input_dev;
+ struct usb_interface *intf;
+ struct usb_device *udev;
+ struct list_head list;
+};
+
+
+enum Update_state { NONE, UPDATE, BLOCKED };
+
+struct led_update
+{
+ enum Update_state state;
+ struct completion update;
+ unsigned leds;
+};
+
+
+static LIST_HEAD(_keyboards);
+static struct led_update _led_update;
+
+
+static bool keyboard_match(struct keyboard *kbd, struct input_dev *input_dev)
+{
+ return kbd->input_dev == input_dev;
+}
+
+
+static void keyboard_update(struct keyboard *kbd, unsigned leds)
+{
+ usb_control_msg(kbd->udev, usb_sndctrlpipe(kbd->udev, 0),
+ 0x9, USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0x200,
+ kbd->intf->cur_altsetting->desc.bInterfaceNumber,
+ &leds, 1, 500);
+}
+
+
+void lx_led_state_update(bool capslock, bool numlock, bool scrlock)
+{
+
+ struct keyboard *kbd;
+ unsigned leds = 0;
+
+ leds |= capslock ? 1u << LED_CAPSL : 0;
+ leds |= numlock ? 1u << LED_NUML : 0;
+ leds |= scrlock ? 1u << LED_SCROLLL : 0;
+
+ _led_update.leds = leds;
+ _led_update.state = UPDATE;
+
+ /* udpdate keyboards */
+ list_for_each_entry(kbd, &_keyboards, list) {
+ keyboard_update(kbd, leds);
+ }
+
+ if (_led_update.state == BLOCKED)
+ complete(&_led_update.update);
+
+ _led_update.state = NONE;
+}
+
+
+static void wait_for_update(void)
+{
+ if (_led_update.state == UPDATE) {
+ _led_update.state = BLOCKED;
+ wait_for_completion(&_led_update.update);
+ }
+}
+
+
+static int led_connect(struct input_handler *handler, struct input_dev *dev,
+ const struct input_device_id *id)
+{
+ struct keyboard *kbd;
+ struct input_handle *handle;
+
+ wait_for_update();
+
+ handle = (struct input_handle *)kzalloc(sizeof(*handle), 0);
+ if (!handle) return -ENOMEM;
+ handle->dev = input_get_device(dev);
+ handle->handler = handler;
+
+ kbd = (struct keyboard *)kzalloc(sizeof(*kbd), GFP_KERNEL);
+ if (!kbd) goto err;
+
+ kbd->input_dev = input_get_device(dev);
+ kbd->intf = container_of(kbd->input_dev->dev.parent->parent, struct usb_interface, dev);
+ kbd->udev = interface_to_usbdev(kbd->intf);
+
+ INIT_LIST_HEAD(&kbd->list);
+ list_add_tail(&kbd->list, &_keyboards);
+
+ keyboard_update(kbd, _led_update.leds);
+
+ input_register_handle(handle);
+
+ return 0;
+
+err:
+ kfree(handle);
+ return -ENOMEM;
+}
+
+
+static void led_disconnect(struct input_handle *handle)
+{
+ struct input_dev *dev = handle->dev;
+ struct keyboard *kbd, *temp;
+
+ wait_for_update();
+
+ list_for_each_entry_safe(kbd, temp, &_keyboards, list) {
+ if (keyboard_match(kbd, dev)) {
+ list_del(&kbd->list);
+ kfree(kbd);
+ }
+ }
+ input_unregister_handle(handle);
+ input_put_device(dev);
+ kfree(handle);
+}
+
+
+static bool led_match(struct input_handler *handler, struct input_dev *dev)
+{
+ struct hid_device *hid = (struct hid_device *)input_get_drvdata(dev);
+ struct hid_report *report;
+ struct hid_usage *usage;
+ unsigned i, j;
+
+ /* search report for keyboard entries */
+ list_for_each_entry(report, &hid->report_enum[0].report_list, list) {
+
+ for (i = 0; i < report->maxfield; i++)
+ for (j = 0; j < report->field[i]->maxusage; j++) {
+ usage = report->field[i]->usage + j;
+ if ((usage->hid & HID_USAGE_PAGE) == HID_UP_KEYBOARD) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+
+static struct input_device_id led_ids[] = {
+ { .driver_info = 1 }, /* match all */
+ { },
+};
+
+
+MODULE_DEVICE_TABLE(input, led_ids);
+
+static struct input_handler led_handler = {
+ .name = "keyboard_led",
+ .connect = led_connect,
+ .disconnect = led_disconnect,
+ .id_table = led_ids,
+ .match = led_match,
+ .id_table = led_ids,
+};
+
+
+static int __init input_leds_init(void)
+{
+ _led_update.state = NONE;
+ init_completion(&_led_update.update);
+
+ return input_register_handler(&led_handler);
+}
+
+
+static void __exit input_leds_exit(void)
+{
+ input_unregister_handler(&led_handler);
+}
+
+
+/**
+ * Let's hook into the input_leds initcall, so we do not need to register
+ * an additional one
+ */
+module_init(input_leds_init);
+module_exit(input_leds_exit);
diff --git a/repos/dde_linux/src/drivers/usb_hid/led_state.h b/repos/dde_linux/src/drivers/usb_hid/led_state.h
new file mode 100644
index 0000000000..c35c5db955
--- /dev/null
+++ b/repos/dde_linux/src/drivers/usb_hid/led_state.h
@@ -0,0 +1,66 @@
+/*
+ * \brief Configuration of keyboard mode indicators
+ * \author Norman Feske
+ * \date 2017-10-25
+ */
+
+/*
+ * Copyright (C) 2023 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#ifndef _INPUT__LED_STATE_H_
+#define _INPUT__LED_STATE_H_
+
+#include
+#include
+#include
+
+namespace Usb { struct Led_state; }
+
+
+struct Usb::Led_state
+{
+ Genode::Env &_env;
+
+ typedef Genode::String<32> Name;
+
+ Name const _name;
+
+ Genode::Constructible _rom { };
+
+ bool _enabled = false;
+
+ Led_state(Genode::Env &env, Name const &name) : _env(env), _name(name) { }
+
+ void update(Genode::Xml_node config, Genode::Signal_context_capability sigh)
+ {
+ typedef Genode::String<32> Attr;
+ typedef Genode::String<16> Value;
+
+ Attr const attr(_name, "_led");
+ Value const value = config.attribute_value(attr.string(), Value());
+
+ bool const rom_configured = (value == "rom");
+
+ if (rom_configured && !_rom.constructed()) {
+ _rom.construct(_env, _name.string());
+ _rom->sigh(sigh);
+ }
+
+ if (!rom_configured && _rom.constructed())
+ _rom.destruct();
+
+ if (_rom.constructed())
+ _rom->update();
+
+ _enabled = _rom.constructed() ? _rom->xml().attribute_value("enabled", false)
+ : config.attribute_value(attr.string(), false);
+ }
+
+ bool enabled() const { return _enabled; }
+};
+
+#endif /* _INPUT__LED_STATE_H_ */
diff --git a/repos/dde_linux/src/drivers/usb_hid/lx_emul.c b/repos/dde_linux/src/drivers/usb_hid/lx_emul.c
new file mode 100644
index 0000000000..0489a48afd
--- /dev/null
+++ b/repos/dde_linux/src/drivers/usb_hid/lx_emul.c
@@ -0,0 +1,35 @@
+/*
+ * \brief Implementation of driver specific Linux functions
+ * \author Sebastian Sumpf
+ * \date 2023-06-29
+ */
+
+/*
+ * Copyright (C) 2023 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+
+const struct attribute_group input_poller_attribute_group;
+pteval_t __default_kernel_pte_mask __read_mostly = ~0;
+
+struct device_type usb_if_device_type = {
+ .name = "usb_interface"
+};
+
+struct usb_driver usbfs_driver = {
+ .name = "usbfs"
+};
+const struct attribute_group *usb_device_groups[] = { };
+
+
diff --git a/repos/dde_linux/src/drivers/usb_hid/lx_emul.h b/repos/dde_linux/src/drivers/usb_hid/lx_emul.h
new file mode 100644
index 0000000000..8dbf02c248
--- /dev/null
+++ b/repos/dde_linux/src/drivers/usb_hid/lx_emul.h
@@ -0,0 +1,21 @@
+/*
+ * \brief Dummy definitions of Linux Kernel functions
+ * \author Sebastian Sumpf
+ * \date 2023-07-11
+ */
+
+/*
+ * Copyright (C) 2023 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#include
+#include
+#include
+#include
+
+struct input_dev_poller;
+struct input_event;
+struct usb_hub;
diff --git a/repos/dde_linux/src/drivers/usb_hid/lx_user.c b/repos/dde_linux/src/drivers/usb_hid/lx_user.c
new file mode 100644
index 0000000000..f65d78749b
--- /dev/null
+++ b/repos/dde_linux/src/drivers/usb_hid/lx_user.c
@@ -0,0 +1,46 @@
+/*
+ * \brief Post kernel activity
+ * \author Sebastian Sumpf
+ * \date 2023-06-29
+ */
+
+/*
+ * Copyright (C) 2023 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#include
+#include
+
+static struct task_struct *main_task = NULL;
+
+
+struct task_struct *lx_user_new_usb_task(int (*func)(void*), void *args)
+{
+ int pid = kernel_thread(func, args, CLONE_FS | CLONE_FILES);
+ return find_task_by_pid_ns(pid, NULL);
+}
+
+
+void lx_user_destroy_usb_task(struct task_struct *task)
+{
+ if (task != current) {
+ printk("%s: task: %px is not current: %px\n", __func__,
+ task, current);
+ return;
+ }
+
+ /* unblock main task which initiated destruction */
+ lx_emul_task_unblock(main_task);
+
+ do_exit(0);
+}
+
+
+void lx_user_init(void)
+{
+ int pid = kernel_thread(lx_user_main_task, &main_task, CLONE_FS | CLONE_FILES);
+ main_task = find_task_by_pid_ns(pid, NULL);
+}
diff --git a/repos/dde_linux/src/drivers/usb_hid/main.cc b/repos/dde_linux/src/drivers/usb_hid/main.cc
new file mode 100644
index 0000000000..2c3a39c60a
--- /dev/null
+++ b/repos/dde_linux/src/drivers/usb_hid/main.cc
@@ -0,0 +1,371 @@
+/*
+ * \brief C++ initialization, session, and client handling
+ * \author Sebastian Sumpf
+ * \date 2023-06-29
+ */
+
+/*
+ * Copyright (C) 2023 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
+
+/* C-interface */
+#include
+
+#include
+
+using namespace Genode;
+
+struct Task_handler
+{
+ task_struct *task;
+ Signal_handler handler;
+ bool handling_signal { false };
+ bool running { true };
+
+ /*
+ * If the task is currently executing and the signal handler
+ * is called again via 'block_and_schedule()', we need to
+ * keep this information, so the task does not block at the
+ * end when a new signal already occurred.
+ *
+ * Initialized as true for the initial run of the task.
+ */
+ bool _signal_pending { true };
+
+ void handle_signal()
+ {
+ _signal_pending = true;
+ lx_emul_task_unblock(task);
+ handling_signal = true;
+ Lx_kit::env().scheduler.execute();
+ handling_signal = false;
+ }
+
+ bool signal_pending()
+ {
+ bool ret = _signal_pending;
+ _signal_pending = false;
+ return ret;
+ }
+
+ void block_and_schedule()
+ {
+ lx_emul_task_schedule(true);
+ }
+
+ void destroy_task()
+ {
+ running = false;
+ lx_emul_task_unblock(task);
+ /* will be unblocked by lx_user_destroy_usb_task */
+ lx_emul_task_schedule(true);
+ }
+
+ Task_handler(Entrypoint & ep, task_struct *task)
+ : task(task), handler(ep, *this, &Task_handler::handle_signal) { }
+
+ /* non-copyable */
+ Task_handler(const Task_handler&) = delete;
+ Task_handler & operator=(const Task_handler&) = delete;
+};
+
+
+struct Leds
+{
+ Env &env;
+
+ Attached_rom_dataspace &config_rom;
+
+ task_struct *led_task { lx_user_new_usb_task(led_task_entry, this) };
+
+ Task_handler led_task_handler { env.ep(), led_task };
+
+ Usb::Led_state capslock { env, "capslock" },
+ numlock { env, "numlock" },
+ scrlock { env, "scrlock" };
+
+ Leds(Env &env, Attached_rom_dataspace &config_rom)
+ : env(env), config_rom(config_rom) { };
+
+ /* non-copyable */
+ Leds(const Leds&) = delete;
+ Leds & operator=(const Leds&) = delete;
+
+ void handle_config()
+ {
+ config_rom.update();
+ Genode::Xml_node config =config_rom.xml();
+
+ capslock.update(config, led_task_handler.handler);
+ numlock .update(config, led_task_handler.handler);
+ scrlock .update(config, led_task_handler.handler);
+ }
+
+
+ /**********
+ ** Task **
+ **********/
+
+ static int led_task_entry(void *arg)
+ {
+ Leds &led = *reinterpret_cast(arg);
+
+ while (true) {
+ led.handle_config();
+
+ lx_led_state_update(led.capslock.enabled(),
+ led.numlock.enabled(),
+ led.scrlock.enabled());
+
+ led.led_task_handler.block_and_schedule();
+ }
+ }
+};
+
+
+struct Device : Registry::Element
+{
+ using Label = String<64>;
+
+ Env &env;
+ Label label;
+
+ /*
+ * Dedicated allocator per device to notice dangling
+ * allocations on device destruction.
+ */
+ Allocator_avl alloc { &Lx_kit::env().heap };
+
+ task_struct *state_task { lx_user_new_usb_task(state_task_entry, this) };
+ task_struct *urb_task { lx_user_new_usb_task(urb_task_entry, this) };
+
+ Task_handler state_task_handler { env.ep(), state_task };
+ Task_handler urb_task_handler { env.ep(), urb_task };
+
+ genode_usb_client_handle_t usb_handle {
+ genode_usb_client_create(genode_env_ptr(env),
+ genode_allocator_ptr(Lx_kit::env().heap),
+ genode_range_allocator_ptr(alloc),
+ label.string(),
+ genode_signal_handler_ptr(state_task_handler.handler)) };
+
+ bool updated { true };
+ bool registered { false };
+
+ void *lx_device_handle { nullptr };
+
+ Device(Env &env, Registry ®istry, Label label)
+ :
+ Registry::Element(registry, *this),
+ env(env), label(label)
+ {
+ genode_usb_client_sigh_ack_avail(usb_handle,
+ genode_signal_handler_ptr(urb_task_handler.handler));
+ }
+
+ ~Device()
+ {
+ genode_usb_client_destroy(usb_handle,
+ genode_allocator_ptr(Lx_kit::env().heap));
+
+ state_task_handler.destroy_task();
+ urb_task_handler.destroy_task();
+ }
+
+ /* non-copyable */
+ Device(const Device&) = delete;
+ Device & operator=(const Device&) = delete;
+
+ void register_device()
+ {
+ registered = true;
+ lx_device_handle = lx_emul_usb_client_register_device(usb_handle, label.string());
+ if (!lx_device_handle) registered = false;
+ }
+
+ void unregister_device()
+ {
+ lx_emul_usb_client_unregister_device(usb_handle, lx_device_handle);
+ registered = false;
+ }
+
+ bool deinit() { return !registered &&
+ !state_task_handler.handling_signal &&
+ !urb_task_handler.handling_signal; }
+
+ /**********
+ ** Task **
+ **********/
+
+ static int state_task_entry(void *arg)
+ {
+ Device &device = *reinterpret_cast(arg);
+
+ while (device.state_task_handler.running) {
+ while (device.state_task_handler.signal_pending()) {
+ if (genode_usb_client_plugged(device.usb_handle) && !device.registered)
+ device.register_device();
+
+ if (!genode_usb_client_plugged(device.usb_handle) && device.registered)
+ device.unregister_device();
+ }
+ device.state_task_handler.block_and_schedule();
+ }
+ lx_user_destroy_usb_task(device.state_task_handler.task);
+ return 0;
+ }
+
+ static int urb_task_entry(void *arg)
+ {
+ Device &device = *reinterpret_cast(arg);
+
+ while (device.urb_task_handler.running) {
+ if (device.registered)
+ genode_usb_client_execute_completions(device.usb_handle);
+
+ device.urb_task_handler.block_and_schedule();
+ }
+ lx_user_destroy_usb_task(device.urb_task_handler.task);
+ return 0;
+ }
+};
+
+
+struct Driver
+{
+ Env &env;
+
+ Task_handler task_handler;
+
+ Heap &heap { Lx_kit::env().heap };
+
+ bool use_report { false };
+
+ Constructible report_rom { };
+
+ Attached_rom_dataspace config_rom { env, "config" };
+
+ Leds leds { env, config_rom };
+
+ Registry devices { };
+
+ Driver(Env &env, task_struct *task)
+ : env(env), task_handler(env.ep(), task)
+ {
+ try {
+ Xml_node config = config_rom.xml();
+ use_report = config.attribute_value("use_report", false);
+ } catch(...) { }
+
+ if (use_report)
+ warning("use compatibility mode: ",
+ "will claim all HID devices from USB report");
+ }
+
+ void scan_report()
+ {
+ if (!report_rom.constructed()) {
+ report_rom.construct(env, "report");
+ report_rom->sigh(task_handler.handler);
+ }
+
+ report_rom->update();
+
+ devices.for_each([&] (Device & d) { d.updated = false; });
+
+ try {
+ Xml_node report_node = report_rom->xml();
+ report_node.for_each_sub_node([&] (Xml_node & dev_node)
+ {
+ unsigned long c = 0;
+ dev_node.attribute("class").value(c);
+ if (c != 0x3 /* USB_CLASS_HID */) return;
+
+ Device::Label label;
+ dev_node.attribute("label").value(label);
+
+ bool found = false;
+
+ devices.for_each([&] (Device & d) {
+ if (d.label == label) d.updated = found = true; });
+
+ if (!found) new (heap) Device(env, devices, label);
+ });
+ } catch(...) {
+ error("Error parsing USB devices report");
+ throw;
+ };
+
+ devices.for_each([&] (Device & d) {
+ if (!d.updated && d.deinit()) {
+ destroy(heap, &d);
+ }
+ });
+ }
+};
+
+
+struct Main
+{
+ Env &env;
+
+ Signal_handler signal_handler { env.ep(), *this, &Main::handle_signal };
+
+ Main(Env &env) : env(env) { }
+
+ void handle_signal()
+ {
+ Lx_kit::env().scheduler.execute();
+ }
+};
+
+
+void Component::construct(Env & env)
+{
+ static Main main { env };
+ Lx_kit::initialize(env, main.signal_handler);
+
+ env.exec_static_constructors();
+
+ genode_event_init(genode_env_ptr(env),
+ genode_allocator_ptr(Lx_kit::env().heap));
+
+ lx_emul_start_kernel(nullptr);
+}
+
+
+/**********
+ ** Task **
+ **********/
+
+int lx_user_main_task(void *data)
+{
+ task_struct *task = *static_cast(data);
+
+ static Driver driver { Lx_kit::env().env, task };
+
+ for (;;) {
+ while (driver.task_handler.signal_pending()) {
+ if (!driver.use_report)
+ static Device dev(driver.env, driver.devices, Device::Label(""));
+ else
+ driver.scan_report();
+ }
+ driver.task_handler.block_and_schedule();
+ }
+ return 0;
+}
diff --git a/repos/dde_linux/src/drivers/usb_hid/spec/arm/generated_dummies.c b/repos/dde_linux/src/drivers/usb_hid/spec/arm/generated_dummies.c
new file mode 100644
index 0000000000..6e7fc08671
--- /dev/null
+++ b/repos/dde_linux/src/drivers/usb_hid/spec/arm/generated_dummies.c
@@ -0,0 +1,634 @@
+/*
+ * \brief Dummy definitions of Linux Kernel functions
+ * \author Automatically generated file - do no edit
+ * \date 2023-07-01
+ */
+
+#include
+
+
+#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
+
+struct cpumask __cpu_active_mask;
+
+
+#include
+
+struct irq_domain * __irq_domain_add(struct fwnode_handle * fwnode,unsigned int size,irq_hw_number_t hwirq_max,int direct_max,const struct irq_domain_ops * ops,void * host_data)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct irq_desc * __irq_resolve_mapping(struct irq_domain * domain,irq_hw_number_t hwirq,unsigned int * irq)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+unsigned long __per_cpu_offset[NR_CPUS] = {};
+
+
+#include
+
+int __printk_ratelimit(const char * func)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __printk_safe_enter(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __printk_safe_exit(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __put_task_struct(struct task_struct * tsk)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int _printk_deferred(const char * fmt,...)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void add_device_randomness(const void * buf,size_t len)
+{
+ 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
+
+noinstr void ct_irq_enter(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void ct_irq_enter_irqson(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+noinstr void ct_irq_exit(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void ct_irq_exit_irqson(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int devm_led_classdev_register_ext(struct device * parent,struct led_classdev * led_cdev,struct led_init_data * init_data)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+u64 div64_u64(u64 dividend,u64 divisor)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+u64 div64_u64_rem(u64 dividend,u64 divisor,u64 * remainder)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+s64 div_s64_rem(s64 dividend,s32 divisor,s32 * remainder)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool dma_default_coherent;
+
+
+#include
+
+void do_softirq_own_stack(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+asmlinkage __visible void dump_stack(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void finish_rcuwait(struct rcuwait * w)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+const u8 guid_index[16] = {};
+
+
+#include
+
+void handle_fasteoi_irq(struct irq_desc * desc)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool initcall_debug;
+
+
+extern void input_dev_poller_finalize(struct input_dev_poller * poller);
+void input_dev_poller_finalize(struct input_dev_poller * poller)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void input_dev_poller_start(struct input_dev_poller * poller);
+void input_dev_poller_start(struct input_dev_poller * poller)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void input_dev_poller_stop(struct input_dev_poller * poller);
+void input_dev_poller_stop(struct input_dev_poller * poller)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int input_ff_create_memless(struct input_dev * dev,void * data,int (* play_effect)(struct input_dev *,void *,struct ff_effect *))
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int input_ff_event(struct input_dev * dev,unsigned int type,unsigned int code,int value)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void input_mt_release_slots(struct input_dev * dev);
+void input_mt_release_slots(struct input_dev * dev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __sched io_schedule(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#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
+
+int irq_can_set_affinity(unsigned int irq)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void irq_domain_free_irqs_common(struct irq_domain * domain,unsigned int virq,unsigned int nr_irqs)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void irq_domain_set_info(struct irq_domain * domain,unsigned int virq,irq_hw_number_t hwirq,const struct irq_chip * chip,void * chip_data,irq_flow_handler_t handler,void * handler_data,const char * handler_name)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void irq_modify_status(unsigned int irq,unsigned long clr,unsigned long set)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int irq_set_affinity(unsigned int irq,const struct cpumask * cpumask)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void irq_set_default_host(struct irq_domain * domain)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct irq_desc * irq_to_desc(unsigned int irq)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void irq_work_tick(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void * kmem_cache_alloc_lru(struct kmem_cache * cachep,struct list_lru * lru,gfp_t flags)
+{
+ 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
+
+unsigned long lpj_fine;
+
+
+#include
+
+void of_device_uevent(struct device * dev,struct kobj_uevent_env * env)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct property * of_find_property(const struct device_node * np,const char * name,int * lenp)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+const struct fwnode_operations of_fwnode_ops;
+
+
+#include
+
+const char * of_prop_next_string(struct property * prop,const char * cur)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int of_property_read_string(const struct device_node * np,const char * propname,const char ** out_string)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void smp_call_function_many(const struct cpumask * mask,smp_call_func_t func,void * info,bool wait)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool static_key_initialized;
+
+
+#include
+
+void tick_broadcast(const struct cpumask * mask)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool timerqueue_add(struct timerqueue_head * head,struct timerqueue_node * node)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool timerqueue_del(struct timerqueue_head * head,struct timerqueue_node * node)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct timerqueue_node * timerqueue_iterate_next(struct timerqueue_node * node)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void usb_block_urb(struct urb * urb)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_clear_halt(struct usb_device * dev,int pipe)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void usb_devio_cleanup(void);
+void usb_devio_cleanup(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void usb_disable_endpoint(struct usb_device * dev,unsigned int epaddr,bool reset_hardware);
+void usb_disable_endpoint(struct usb_device * dev,unsigned int epaddr,bool reset_hardware)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_free_streams(struct usb_interface * interface,struct usb_host_endpoint ** eps,unsigned int num_eps,gfp_t mem_flags)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int usb_get_device_descriptor(struct usb_device * dev,unsigned int size);
+int usb_get_device_descriptor(struct usb_device * dev,unsigned int size)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_get_status(struct usb_device * dev,int recip,int type,int target,void * data)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_hcd_alloc_bandwidth(struct usb_device * udev,struct usb_host_config * new_config,struct usb_host_interface * cur_alt,struct usb_host_interface * new_alt)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_hcd_find_raw_port_number(struct usb_hcd * hcd,int port1)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int usb_hub_create_port_device(struct usb_hub * hub,int port1);
+int usb_hub_create_port_device(struct usb_hub * hub,int port1)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void usb_hub_remove_port_device(struct usb_hub * hub,int port1);
+void usb_hub_remove_port_device(struct usb_hub * hub,int port1)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_interrupt_msg(struct usb_device * usb_dev,unsigned int pipe,void * data,int len,int * actual_length,int timeout)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void usb_major_cleanup(void);
+void usb_major_cleanup(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct device_node * usb_of_get_device_node(struct usb_device * hub,int port1)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int usb_set_isoch_delay(struct usb_device * dev);
+int usb_set_isoch_delay(struct usb_device * dev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+const char * usb_speed_string(enum usb_device_speed speed)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_unlink_urb(struct urb * urb)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void usb_unpoison_urb(struct urb * urb)
+{
+ 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/dde_linux/src/drivers/usb_hid/spec/arm/source.list b/repos/dde_linux/src/drivers/usb_hid/spec/arm/source.list
new file mode 100644
index 0000000000..ae8c5f44bf
--- /dev/null
+++ b/repos/dde_linux/src/drivers/usb_hid/spec/arm/source.list
@@ -0,0 +1,72 @@
+arch/arm/lib/clearbit.S
+arch/arm/lib/div64.S
+arch/arm/lib/findbit.S
+arch/arm/lib/setbit.S
+arch/arm/lib/strchr.S
+arch/arm/lib/testclearbit.S
+arch/arm/lib/testsetbit.S
+drivers/base/bus.c
+drivers/base/core.c
+drivers/base/class.c
+drivers/base/devres.c
+drivers/base/driver.c
+drivers/base/dd.c
+drivers/base/property.c
+drivers/hid/hid-apple.c
+drivers/hid/hid-cherry.c
+drivers/hid/hid-core.c
+drivers/hid/hid-generic.c
+drivers/hid/hid-holtek-mouse.c
+drivers/hid/hid-input.c
+drivers/hid/hid-microsoft.c
+drivers/hid/hid-quirks.c
+drivers/hid/usbhid/hid-core.c
+drivers/input/input.c
+drivers/usb/core/config.c
+drivers/usb/core/driver.c
+drivers/usb/core/generic.c
+drivers/usb/core/hub.c
+drivers/usb/core/quirks.c
+drivers/usb/core/usb.c
+kernel/kthread.c
+kernel/locking/mutex.c
+kernel/locking/osq_lock.c
+kernel/locking/rwsem.c
+kernel/notifier.c
+kernel/sched/build_utility.c
+kernel/smpboot.c
+kernel/softirq.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-broadcast-hrtimer.c
+kernel/time/tick-common.c
+kernel/time/tick-oneshot.c
+kernel/time/tick-sched.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
+mm/util.c
+lib/bitmap.c
+lib/ctype.c
+lib/find_bit.c
+lib/hexdump.c
+lib/hweight.c
+lib/idr.c
+lib/kasprintf.c
+lib/klist.c
+lib/kobject.c
+lib/kstrtox.c
+lib/radix-tree.c
+lib/xarray.c
+lib/siphash.c
+lib/string.c
+lib/string_helpers.c
+lib/vsprintf.c
diff --git a/repos/dde_linux/src/drivers/usb_hid/spec/arm/target.mk b/repos/dde_linux/src/drivers/usb_hid/spec/arm/target.mk
new file mode 100644
index 0000000000..9428a3be70
--- /dev/null
+++ b/repos/dde_linux/src/drivers/usb_hid/spec/arm/target.mk
@@ -0,0 +1,3 @@
+REQUIRES := arm
+
+include $(PRG_DIR)/../../target.inc
diff --git a/repos/dde_linux/src/drivers/usb_hid/spec/arm_64/generated_dummies.c b/repos/dde_linux/src/drivers/usb_hid/spec/arm_64/generated_dummies.c
new file mode 100644
index 0000000000..d94e736a94
--- /dev/null
+++ b/repos/dde_linux/src/drivers/usb_hid/spec/arm_64/generated_dummies.c
@@ -0,0 +1,599 @@
+/*
+ * \brief Dummy definitions of Linux Kernel functions
+ * \author Automatically generated file - do no edit
+ * \date 2023-06-28
+ */
+
+#include
+
+
+#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
+
+struct cpumask __cpu_active_mask;
+
+
+#include
+
+struct irq_domain * __irq_domain_add(struct fwnode_handle * fwnode,unsigned int size,irq_hw_number_t hwirq_max,int direct_max,const struct irq_domain_ops * ops,void * host_data)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct irq_desc * __irq_resolve_mapping(struct irq_domain * domain,irq_hw_number_t hwirq,unsigned int * irq)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+unsigned long __per_cpu_offset[NR_CPUS] = {};
+
+
+#include
+
+int __printk_ratelimit(const char * func)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __printk_safe_enter(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __printk_safe_exit(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __put_task_struct(struct task_struct * tsk)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int _printk_deferred(const char * fmt,...)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void add_device_randomness(const void * buf,size_t len)
+{
+ 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
+
+void ct_irq_enter_irqson(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void ct_irq_exit_irqson(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int devm_led_classdev_register_ext(struct device * parent,struct led_classdev * led_cdev,struct led_init_data * init_data)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool dma_default_coherent;
+
+
+#include
+
+void do_softirq_own_stack(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+asmlinkage __visible void dump_stack(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void finish_rcuwait(struct rcuwait * w)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+const u8 guid_index[16] = {};
+
+
+#include
+
+void handle_fasteoi_irq(struct irq_desc * desc)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool initcall_debug;
+
+
+extern void input_dev_poller_finalize(struct input_dev_poller * poller);
+void input_dev_poller_finalize(struct input_dev_poller * poller)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void input_dev_poller_start(struct input_dev_poller * poller);
+void input_dev_poller_start(struct input_dev_poller * poller)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void input_dev_poller_stop(struct input_dev_poller * poller);
+void input_dev_poller_stop(struct input_dev_poller * poller)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int input_ff_create_memless(struct input_dev * dev,void * data,int (* play_effect)(struct input_dev *,void *,struct ff_effect *))
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int input_ff_event(struct input_dev * dev,unsigned int type,unsigned int code,int value)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void input_mt_release_slots(struct input_dev * dev);
+void input_mt_release_slots(struct input_dev * dev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __sched io_schedule(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#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
+
+struct io_tlb_mem io_tlb_default_mem;
+
+
+#include
+
+int irq_can_set_affinity(unsigned int irq)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void irq_domain_free_irqs_common(struct irq_domain * domain,unsigned int virq,unsigned int nr_irqs)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void irq_domain_set_info(struct irq_domain * domain,unsigned int virq,irq_hw_number_t hwirq,const struct irq_chip * chip,void * chip_data,irq_flow_handler_t handler,void * handler_data,const char * handler_name)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void irq_modify_status(unsigned int irq,unsigned long clr,unsigned long set)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int irq_set_affinity(unsigned int irq,const struct cpumask * cpumask)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void irq_set_default_host(struct irq_domain * domain)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct irq_desc * irq_to_desc(unsigned int irq)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void irq_work_tick(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void * kmem_cache_alloc_lru(struct kmem_cache * cachep,struct list_lru * lru,gfp_t flags)
+{
+ 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
+
+unsigned long lpj_fine;
+
+
+#include
+
+void of_device_uevent(struct device * dev,struct kobj_uevent_env * env)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct property * of_find_property(const struct device_node * np,const char * name,int * lenp)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+const struct fwnode_operations of_fwnode_ops;
+
+
+#include
+
+const char * of_prop_next_string(struct property * prop,const char * cur)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int of_property_read_string(const struct device_node * np,const char * propname,const char ** out_string)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void smp_call_function_many(const struct cpumask * mask,smp_call_func_t func,void * info,bool wait)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool static_key_initialized;
+
+
+#include
+
+void tick_broadcast(const struct cpumask * mask)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool timerqueue_add(struct timerqueue_head * head,struct timerqueue_node * node)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool timerqueue_del(struct timerqueue_head * head,struct timerqueue_node * node)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct timerqueue_node * timerqueue_iterate_next(struct timerqueue_node * node)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void usb_block_urb(struct urb * urb)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_clear_halt(struct usb_device * dev,int pipe)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void usb_devio_cleanup(void);
+void usb_devio_cleanup(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void usb_disable_endpoint(struct usb_device * dev,unsigned int epaddr,bool reset_hardware);
+void usb_disable_endpoint(struct usb_device * dev,unsigned int epaddr,bool reset_hardware)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_free_streams(struct usb_interface * interface,struct usb_host_endpoint ** eps,unsigned int num_eps,gfp_t mem_flags)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int usb_get_device_descriptor(struct usb_device * dev,unsigned int size);
+int usb_get_device_descriptor(struct usb_device * dev,unsigned int size)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_get_status(struct usb_device * dev,int recip,int type,int target,void * data)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_hcd_alloc_bandwidth(struct usb_device * udev,struct usb_host_config * new_config,struct usb_host_interface * cur_alt,struct usb_host_interface * new_alt)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_hcd_find_raw_port_number(struct usb_hcd * hcd,int port1)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int usb_hub_create_port_device(struct usb_hub * hub,int port1);
+int usb_hub_create_port_device(struct usb_hub * hub,int port1)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void usb_hub_remove_port_device(struct usb_hub * hub,int port1);
+void usb_hub_remove_port_device(struct usb_hub * hub,int port1)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_interrupt_msg(struct usb_device * usb_dev,unsigned int pipe,void * data,int len,int * actual_length,int timeout)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void usb_major_cleanup(void);
+void usb_major_cleanup(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct device_node * usb_of_get_device_node(struct usb_device * hub,int port1)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int usb_set_isoch_delay(struct usb_device * dev);
+int usb_set_isoch_delay(struct usb_device * dev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+const char * usb_speed_string(enum usb_device_speed speed)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_unlink_urb(struct urb * urb)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void usb_unpoison_urb(struct urb * urb)
+{
+ 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/dde_linux/src/drivers/usb_hid/spec/arm_64/source.list b/repos/dde_linux/src/drivers/usb_hid/spec/arm_64/source.list
new file mode 100644
index 0000000000..a7e5322d02
--- /dev/null
+++ b/repos/dde_linux/src/drivers/usb_hid/spec/arm_64/source.list
@@ -0,0 +1,70 @@
+arch/arm64/lib/memcmp.S
+arch/arm64/lib/strchr.S
+arch/arm64/lib/strcmp.S
+arch/arm64/lib/strlen.S
+arch/arm64/lib/strncmp.S
+drivers/base/bus.c
+drivers/base/core.c
+drivers/base/class.c
+drivers/base/devres.c
+drivers/base/driver.c
+drivers/base/dd.c
+drivers/base/property.c
+drivers/hid/hid-apple.c
+drivers/hid/hid-cherry.c
+drivers/hid/hid-core.c
+drivers/hid/hid-generic.c
+drivers/hid/hid-holtek-mouse.c
+drivers/hid/hid-input.c
+drivers/hid/hid-microsoft.c
+drivers/hid/hid-quirks.c
+drivers/hid/usbhid/hid-core.c
+drivers/input/input.c
+drivers/usb/core/config.c
+drivers/usb/core/driver.c
+drivers/usb/core/generic.c
+drivers/usb/core/hub.c
+drivers/usb/core/quirks.c
+drivers/usb/core/usb.c
+kernel/kthread.c
+kernel/locking/mutex.c
+kernel/locking/osq_lock.c
+kernel/locking/rwsem.c
+kernel/notifier.c
+kernel/sched/build_utility.c
+kernel/smpboot.c
+kernel/softirq.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-broadcast-hrtimer.c
+kernel/time/tick-common.c
+kernel/time/tick-oneshot.c
+kernel/time/tick-sched.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
+mm/util.c
+lib/bitmap.c
+lib/ctype.c
+lib/find_bit.c
+lib/hexdump.c
+lib/hweight.c
+lib/idr.c
+lib/kasprintf.c
+lib/klist.c
+lib/kobject.c
+lib/kstrtox.c
+lib/radix-tree.c
+lib/xarray.c
+lib/siphash.c
+lib/string.c
+lib/string_helpers.c
+lib/vsprintf.c
diff --git a/repos/dde_linux/src/drivers/usb_hid/spec/arm_64/target.mk b/repos/dde_linux/src/drivers/usb_hid/spec/arm_64/target.mk
new file mode 100644
index 0000000000..ef575f8cbd
--- /dev/null
+++ b/repos/dde_linux/src/drivers/usb_hid/spec/arm_64/target.mk
@@ -0,0 +1,5 @@
+REQUIRES := arm_64
+
+SRC_C += lx_emul/shadow/arch/arm64/kernel/smp.c
+
+include $(PRG_DIR)/../../target.inc
diff --git a/repos/dde_linux/src/drivers/usb_hid/spec/x86_32/generated_dummies.c b/repos/dde_linux/src/drivers/usb_hid/spec/x86_32/generated_dummies.c
new file mode 100644
index 0000000000..d3fd15ca47
--- /dev/null
+++ b/repos/dde_linux/src/drivers/usb_hid/spec/x86_32/generated_dummies.c
@@ -0,0 +1,498 @@
+/*
+ * \brief Dummy definitions of Linux Kernel functions
+ * \author Automatically generated file - do no edit
+ * \date 2023-06-28
+ */
+
+#include
+
+
+#include
+
+int ___ratelimit(struct ratelimit_state * rs,const char * func)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct cpumask __cpu_active_mask;
+
+
+#include
+
+int __printk_ratelimit(const char * func)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __printk_safe_enter(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __printk_safe_exit(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __put_task_struct(struct task_struct * tsk)
+{
+ 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__);
+}
+
+
+#include
+
+int _printk_deferred(const char * fmt,...)
+{
+ 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
+
+void add_device_randomness(const void * buf,size_t len)
+{
+ 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
+
+int devm_led_classdev_register_ext(struct device * parent,struct led_classdev * led_cdev,struct led_init_data * init_data)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+u64 div64_u64(u64 dividend,u64 divisor)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+u64 div64_u64_rem(u64 dividend,u64 divisor,u64 * remainder)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+s64 div_s64_rem(s64 dividend,s32 divisor,s32 * remainder)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void do_softirq_own_stack(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+asmlinkage __visible void dump_stack(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void finish_rcuwait(struct rcuwait * w)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+const u8 guid_index[16] = {};
+
+
+#include
+
+unsigned long init_stack[THREAD_SIZE / sizeof(unsigned long)] = {};
+
+
+#include
+
+bool initcall_debug;
+
+
+extern void input_dev_poller_finalize(struct input_dev_poller * poller);
+void input_dev_poller_finalize(struct input_dev_poller * poller)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void input_dev_poller_start(struct input_dev_poller * poller);
+void input_dev_poller_start(struct input_dev_poller * poller)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void input_dev_poller_stop(struct input_dev_poller * poller);
+void input_dev_poller_stop(struct input_dev_poller * poller)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int input_ff_create_memless(struct input_dev * dev,void * data,int (* play_effect)(struct input_dev *,void *,struct ff_effect *))
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int input_ff_event(struct input_dev * dev,unsigned int type,unsigned int code,int value)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void input_mt_release_slots(struct input_dev * dev);
+void input_mt_release_slots(struct input_dev * dev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void __sched io_schedule(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#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
+
+int irq_can_set_affinity(unsigned int irq)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int irq_set_affinity(unsigned int irq,const struct cpumask * cpumask)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void irq_work_tick(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void * kmem_cache_alloc_lru(struct kmem_cache * cachep,struct list_lru * lru,gfp_t flags)
+{
+ 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
+
+int param_set_copystring(const char * val,const struct kernel_param * kp)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void smp_call_function_many(const struct cpumask * mask,smp_call_func_t func,void * info,bool wait)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int smp_call_function_single(int cpu,smp_call_func_t func,void * info,int wait)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool static_key_initialized;
+
+
+#include
+
+bool timerqueue_add(struct timerqueue_head * head,struct timerqueue_node * node)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+bool timerqueue_del(struct timerqueue_head * head,struct timerqueue_node * node)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+struct timerqueue_node * timerqueue_iterate_next(struct timerqueue_node * node)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+void usb_block_urb(struct urb * urb)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_clear_halt(struct usb_device * dev,int pipe)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void usb_devio_cleanup(void);
+void usb_devio_cleanup(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void usb_disable_endpoint(struct usb_device * dev,unsigned int epaddr,bool reset_hardware);
+void usb_disable_endpoint(struct usb_device * dev,unsigned int epaddr,bool reset_hardware)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_free_streams(struct usb_interface * interface,struct usb_host_endpoint ** eps,unsigned int num_eps,gfp_t mem_flags)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int usb_get_device_descriptor(struct usb_device * dev,unsigned int size);
+int usb_get_device_descriptor(struct usb_device * dev,unsigned int size)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_get_status(struct usb_device * dev,int recip,int type,int target,void * data)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_hcd_alloc_bandwidth(struct usb_device * udev,struct usb_host_config * new_config,struct usb_host_interface * cur_alt,struct usb_host_interface * new_alt)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_hcd_find_raw_port_number(struct usb_hcd * hcd,int port1)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int usb_hub_create_port_device(struct usb_hub * hub,int port1);
+int usb_hub_create_port_device(struct usb_hub * hub,int port1)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void usb_hub_remove_port_device(struct usb_hub * hub,int port1);
+void usb_hub_remove_port_device(struct usb_hub * hub,int port1)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+int usb_interrupt_msg(struct usb_device * usb_dev,unsigned int pipe,void * data,int len,int * actual_length,int timeout)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern void usb_major_cleanup(void);
+void usb_major_cleanup(void)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+extern int usb_set_isoch_delay(struct usb_device * dev);
+int usb_set_isoch_delay(struct usb_device * dev)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include
+
+const char * usb_speed_string(enum usb_device_speed speed)
+{
+ lx_emul_trace_and_stop(__func__);
+}
+
+
+#include