aboutsummaryrefslogtreecommitdiff
path: root/patches/gnumach/79_dde-debian.patch
diff options
context:
space:
mode:
authorPasha <pasha@member.fsf.org>2024-02-29 19:30:30 +0000
committerPasha <pasha@member.fsf.org>2024-02-29 19:30:30 +0000
commit84d199451cf33734003c00c043a1480920f5563b (patch)
tree4655f03b3637184bfb363b4e86d376756e85c9e3 /patches/gnumach/79_dde-debian.patch
downloadcross-hurd-84d199451cf33734003c00c043a1480920f5563b.tar.gz
cross-hurd-84d199451cf33734003c00c043a1480920f5563b.tar.bz2
initial commit
Diffstat (limited to 'patches/gnumach/79_dde-debian.patch')
-rw-r--r--patches/gnumach/79_dde-debian.patch274
1 files changed, 274 insertions, 0 deletions
diff --git a/patches/gnumach/79_dde-debian.patch b/patches/gnumach/79_dde-debian.patch
new file mode 100644
index 0000000..b6a0f17
--- /dev/null
+++ b/patches/gnumach/79_dde-debian.patch
@@ -0,0 +1,274 @@
+This contains a compatibility layer for netdde and rump still using the experimental irq/alloc_contig support. It is the output of
+
+git diff master master-user_level_drivers-debian
+
+(master was 6054cda4de2341b9a77ec4421411725f3684006b and
+master-user_level_drivers-debian was 19283fdffa782b2e485ef39e0de1574006ec4a1a at
+the time)
+
+When dropping this, break netdde (<< 0.0.20200330-5),
+hurd-libs0.3 (<< hurd_1:0.9.git20200718-1+b1)
+
+---
+ Makefrag.am | 1
+ device/ds_routines.c | 64 +++++++++++++++++++++++++++++++++++++++-
+ device/intr.c | 16 ++++++----
+ device/intr.h | 3 +
+ include/mach/experimental.defs | 38 +++++++++++++++++++++++
+ linux/dev/drivers/block/genhd.c | 4 +-
+ vm/vm_user.c | 14 ++++++++
+ 7 files changed, 130 insertions(+), 10 deletions(-)
+
+--- a/Makefrag.am
++++ b/Makefrag.am
+@@ -362,7 +362,6 @@ include_device_HEADERS = \
+ include/device/disk_status.h \
+ include/device/input.h \
+ include/device/net_status.h \
+- include/device/notify.defs \
+ include/device/notify.h \
+ include/device/tape_status.h \
+ include/device/tty_status.h
+--- a/device/ds_routines.c
++++ b/device/ds_routines.c
+@@ -354,7 +354,7 @@ ds_device_intr_register (device_t dev, i
+ if (! name_equal(mdev->dev_ops->d_name, 3, "irq"))
+ return D_INVALID_OPERATION;
+
+- user_intr_t *e = insert_intr_entry (&irqtab, id, receive_port);
++ user_intr_t *e = insert_intr_entry (&irqtab, id, receive_port, 0);
+ if (!e)
+ return D_NO_MEMORY;
+
+@@ -371,6 +371,52 @@ ds_device_intr_register (device_t dev, i
+ #endif /* MACH_XEN */
+ }
+
++static ipc_port_t intr_receive_ports[16];
++io_return_t
++experimental_device_intr_register (ipc_port_t master_port, int line,
++ int id, int flags, ipc_port_t receive_port)
++{
++#ifdef MACH_XEN
++ return D_INVALID_OPERATION;
++#else /* MACH_XEN */
++ io_return_t ret;
++ /* Open must be called on the master device port. */
++ if (master_port != master_device_port)
++ return D_INVALID_OPERATION;
++
++ /* XXX: move to arch-specific */
++ if (line < 0 || line >= 16)
++ return D_INVALID_OPERATION;
++
++ if (flags != 0x04000000)
++ return D_INVALID_OPERATION;
++
++ user_intr_t *user_intr = insert_intr_entry (&irqtab, line, receive_port, 1);
++ if (!user_intr)
++ return D_NO_MEMORY;
++
++ // TODO The original port should be replaced
++ // when the same device driver calls it again,
++ // in order to handle the case that the device driver crashes and restarts.
++ ret = install_user_intr_handler (&irqtab, line, 0, user_intr);
++
++ if (ret == 0)
++ {
++ /* If the port is installed successfully, increase its reference by 1.
++ * Thus, the port won't be destroyed after its task is terminated. */
++ ip_reference (receive_port);
++
++ intr_receive_ports[line] = receive_port;
++ /* For now netdde calls device_intr_enable once after registration. Assume
++ * it does so for now. When we move to IRQ acknowledgment convention we will
++ * change this. */
++ __disable_irq (line);
++ }
++
++ return ret;
++#endif /* MACH_XEN */
++}
++
+ kern_return_t
+ ds_device_intr_ack (device_t dev, ipc_port_t receive_port)
+ {
+@@ -399,6 +445,22 @@ ds_device_intr_ack (device_t dev, ipc_po
+ #endif /* MACH_XEN */
+ }
+
++kern_return_t
++experimental_device_intr_enable(ipc_port_t master_port, int line, char status)
++{
++#ifdef MACH_XEN
++ return D_INVALID_OPERATION;
++#else /* MACH_XEN */
++ if (master_port != master_device_port)
++ return D_INVALID_OPERATION;
++
++ if (status != 1)
++ return D_INVALID_OPERATION;
++
++ return irq_acknowledge(intr_receive_ports[line]);
++#endif /* MACH_XEN */
++}
++
+ boolean_t
+ ds_notify (mach_msg_header_t *msg)
+ {
+--- a/device/intr.c
++++ b/device/intr.c
+@@ -25,7 +25,7 @@
+ #ifndef MACH_XEN
+
+ queue_head_t main_intr_queue;
+-static boolean_t deliver_intr (int id, ipc_port_t dst_port);
++static boolean_t deliver_intr (int id, mach_msg_id_t msgh_id, ipc_port_t dst_port);
+
+ #ifndef LINUX_DEV
+ #define SA_SHIRQ 0x04000000
+@@ -122,7 +122,7 @@ deliver_user_intr (struct irqdev *dev, i
+ * This entry exists in the queue until
+ * the corresponding interrupt port is removed.*/
+ user_intr_t *
+-insert_intr_entry (struct irqdev *dev, int id, ipc_port_t dst_port)
++insert_intr_entry (struct irqdev *dev, int id, ipc_port_t dst_port, int compat)
+ {
+ user_intr_t *e, *new, *ret;
+ int free = 0;
+@@ -146,7 +146,11 @@ insert_intr_entry (struct irqdev *dev, i
+ new->id = id;
+ new->dst_port = dst_port;
+ new->interrupts = 0;
+- new->n_unacked = 0;
++ new->compat = compat;
++ if (compat)
++ new->n_unacked = 1;
++ else
++ new->n_unacked = 0;
+
+ queue_enter (dev->intr_queue, new, user_intr_t *, chain);
+ out:
+@@ -268,7 +272,7 @@ intr_thread (void)
+ irqtab.tot_num_intr--;
+
+ splx (s);
+- deliver_intr (id, dst_port);
++ deliver_intr (id, e->compat ? 424242 : DEVICE_INTR_NOTIFY, dst_port);
+ s = splhigh ();
+ }
+ }
+@@ -307,7 +311,7 @@ intr_thread (void)
+ }
+
+ static boolean_t
+-deliver_intr (int id, ipc_port_t dst_port)
++deliver_intr (int id, mach_msg_id_t msgh_id, ipc_port_t dst_port)
+ {
+ ipc_kmsg_t kmsg;
+ device_intr_notification_t *n;
+@@ -331,7 +335,7 @@ deliver_intr (int id, ipc_port_t dst_por
+ m->msgh_seqno = DEVICE_NOTIFY_MSGH_SEQNO;
+ m->msgh_local_port = MACH_PORT_NULL;
+ m->msgh_remote_port = MACH_PORT_NULL;
+- m->msgh_id = DEVICE_INTR_NOTIFY;
++ m->msgh_id = msgh_id;
+
+ t->msgt_name = MACH_MSG_TYPE_INTEGER_32;
+ t->msgt_size = 32;
+--- a/device/intr.h
++++ b/device/intr.h
+@@ -36,6 +36,7 @@ typedef struct {
+ int n_unacked; /* Number of times irqs were disabled for this */
+ ipc_port_t dst_port; /* Notification port */
+ int id; /* Mapping to machine dependent irq_t array elem */
++ int compat;
+ } user_intr_t;
+
+ struct irqdev {
+@@ -52,7 +53,7 @@ struct irqdev {
+ extern queue_head_t main_intr_queue;
+ extern int install_user_intr_handler (struct irqdev *dev, int id, unsigned long flags, user_intr_t *e);
+ extern int deliver_user_intr (struct irqdev *dev, int id, user_intr_t *e);
+-extern user_intr_t *insert_intr_entry (struct irqdev *dev, int id, ipc_port_t receive_port);
++extern user_intr_t *insert_intr_entry (struct irqdev *dev, int id, ipc_port_t receive_port, int compat);
+
+ void intr_thread (void);
+ kern_return_t irq_acknowledge (ipc_port_t receive_port);
+--- a/include/mach/experimental.defs
++++ b/include/mach/experimental.defs
+@@ -13,3 +13,41 @@ subsystem
+ serverprefix experimental_;
+
+ /* This is free for experimenting RPCs, with no backward compatibility guarantees. */
++
++type notify_port_t = MACH_MSG_TYPE_MOVE_SEND_ONCE
++ ctype: mach_port_t;
++
++skip; /*simpleroutine mach_intr_notify(
++ notify : notify_port_t;
++ name : int);*/
++
++routine device_intr_register(
++ master_port : mach_port_t;
++ in line : int;
++ in id : int;
++ in flags : int;
++ in receive_port : mach_port_send_t
++ );
++
++/*
++ * enable/disable the specified line.
++ */
++/* XXX: Naming a function taht can disable something "xxx_enable" is confusing. */
++/* Is the disable part actually used at all? AIUI, the kernel IRQ handler
++should always disable the line; and the userspace driver only has to
++reenable it, after acknowledging and handling the interrupt...
++*/
++routine device_intr_enable(
++ master_port : mach_port_t;
++ line : int;
++ status : char);
++
++/*
++ * This routine is for compatibility with old userland drivers.
++ */
++routine vm_allocate_contiguous(
++ host_priv : host_priv_t;
++ target_task : vm_task_t;
++ out vaddr : vm_address_t;
++ out paddr : vm_address_t;
++ size : vm_size_t);
+--- a/linux/dev/drivers/block/genhd.c
++++ b/linux/dev/drivers/block/genhd.c
+@@ -1060,7 +1060,9 @@ void device_setup(void)
+ scsi_dev_init();
+ #endif
+ #ifdef CONFIG_INET
+- net_dev_init();
++ extern char *kernel_cmdline;
++ if (!strstr(kernel_cmdline, " nonetdev"))
++ net_dev_init();
+ #endif
+ #ifndef MACH
+ console_map_init();
+--- a/vm/vm_user.c
++++ b/vm/vm_user.c
+@@ -688,3 +688,17 @@ kern_return_t vm_allocate_contiguous(
+
+ return KERN_SUCCESS;
+ }
++
++kern_return_t experimental_vm_allocate_contiguous(host_priv, map, result_vaddr, result_paddr, size)
++ host_t host_priv;
++ vm_map_t map;
++ vm_address_t *result_vaddr;
++ vm_address_t *result_paddr;
++ vm_size_t size;
++{
++ rpc_phys_addr_t paddr;
++ kern_return_t ret;
++ ret = vm_allocate_contiguous(host_priv, map, result_vaddr, &paddr, size, 0, ~0ULL, 0);
++ *result_paddr = paddr;
++ return ret;
++}