diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2020-11-22 16:02:59 +0000 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2023-06-23 23:55:57 +1000 |
commit | 739e31c5578828a40bfb775b3b08afb3e715a22d (patch) | |
tree | af7da55b369a2c6722f53ad0236fb69bb0c8c762 | |
parent | 8c3ae8e7f2e91f9c5b2dc909b447d21fb3e5f539 (diff) |
patches/intr_lock.diff: Lock the kernel on interruptdebian/0_20191130-6
-rw-r--r-- | debian/changelog | 6 | ||||
-rw-r--r-- | debian/patches/ahcisata-atapi.diff | 2 | ||||
-rw-r--r-- | debian/patches/intr_lock.diff | 53 | ||||
-rw-r--r-- | debian/patches/print-error.diff | 67 | ||||
-rw-r--r-- | debian/patches/series | 1 |
5 files changed, 129 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog index 4eead6d4..c11986bd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +rumpkernel (0~20191130-6) unreleased; urgency=medium + + * patches/intr_lock.diff: Lock the kernel on interrupt. + + -- Samuel Thibault <sthibault@debian.org> Sun, 22 Nov 2020 18:46:53 +0000 + rumpkernel (0~20191130-5) unreleased; urgency=medium * patches/ahcisata-atapi.diff: Add ATAPI support on top of AHCI. diff --git a/debian/patches/ahcisata-atapi.diff b/debian/patches/ahcisata-atapi.diff index 5208a791..5450aa59 100644 --- a/debian/patches/ahcisata-atapi.diff +++ b/debian/patches/ahcisata-atapi.diff @@ -1,3 +1,5 @@ +TODO: merge with ahcisata-rump.diff? + Index: rumpkernel/buildrump.sh/src/sys/rump/dev/lib/libpci_ahcisata/AHCISATA.ioconf =================================================================== --- rumpkernel.orig/buildrump.sh/src/sys/rump/dev/lib/libpci_ahcisata/AHCISATA.ioconf diff --git a/debian/patches/intr_lock.diff b/debian/patches/intr_lock.diff new file mode 100644 index 00000000..db718a88 --- /dev/null +++ b/debian/patches/intr_lock.diff @@ -0,0 +1,53 @@ +TODO: submit upstream: intr handlers such as rumpns_scsipi_done seem to assume +that klock is to be locked before entering the interrupt handler. + +Index: rumpkernel/pci-userspace/src-gnu/pci_user-gnu.c +=================================================================== +--- rumpkernel.orig/pci-userspace/src-gnu/pci_user-gnu.c ++++ rumpkernel/pci-userspace/src-gnu/pci_user-gnu.c +@@ -344,9 +344,9 @@ intrthread(void *arg) + } + + MACH_PRINT("k_handle..."); +- rumpuser_component_schedule(NULL); ++ rumpuser_component_klock(1); + irq->handler(irq->data); +- rumpuser_component_unschedule(); ++ rumpuser_component_kunlock(1); + MACH_PRINT("k_done\n"); + + device_intr_ack (irq_dev, irq->irqport, MACH_MSG_TYPE_MAKE_SEND); +Index: rumpkernel/buildrump.sh/src/lib/librumpuser/rumpuser_component.c +=================================================================== +--- rumpkernel.orig/buildrump.sh/src/lib/librumpuser/rumpuser_component.c ++++ rumpkernel/buildrump.sh/src/lib/librumpuser/rumpuser_component.c +@@ -62,6 +62,17 @@ rumpuser_component_schedule(void *cookie + } + + void ++rumpuser_component_klock(int nlock) ++{ ++ rump_user_schedule(nlock, NULL); ++} ++void ++rumpuser_component_kunlock(int nlock) ++{ ++ rump_user_unschedule(nlock, NULL, NULL); ++} ++ ++void + rumpuser_component_kthread(void) + { + +Index: rumpkernel/buildrump.sh/src/lib/librumpuser/rumpuser_component.h +=================================================================== +--- rumpkernel.orig/buildrump.sh/src/lib/librumpuser/rumpuser_component.h ++++ rumpkernel/buildrump.sh/src/lib/librumpuser/rumpuser_component.h +@@ -37,4 +37,7 @@ struct lwp *rumpuser_component_curlwp(vo + void rumpuser_component_switchlwp(struct lwp *); + void rumpuser_component_kthread_release(void); + ++void rumpuser_component_klock(int nlock); ++void rumpuser_component_kunlock(int nlock); ++ + #endif /* _RUMP_RUMPUSER_COMPONENT_H_ */ diff --git a/debian/patches/print-error.diff b/debian/patches/print-error.diff index 98b36da3..1c30afe5 100644 --- a/debian/patches/print-error.diff +++ b/debian/patches/print-error.diff @@ -1,3 +1,5 @@ +TODO: should probably go upstream + Index: rumpkernel/buildrump.sh/src/sys/rump/include/rump-sys/kern.h =================================================================== --- rumpkernel.orig/buildrump.sh/src/sys/rump/include/rump-sys/kern.h @@ -11,3 +13,68 @@ Index: rumpkernel/buildrump.sh/src/sys/rump/include/rump-sys/kern.h } while (/*CONSTCOND*/0) #define RUMPMEM_UNLIMITED ((unsigned long)-1) +Index: rumpkernel/buildrump.sh/src/sys/kern/subr_prf.c +=================================================================== +--- rumpkernel.orig/buildrump.sh/src/sys/kern/subr_prf.c ++++ rumpkernel/buildrump.sh/src/sys/kern/subr_prf.c +@@ -339,6 +339,7 @@ vpanic(const char *fmt, va_list ap) + #ifdef DDB + db_panic(); + #endif ++ rumpuser_abort(); + cpu_reboot(bootopt, NULL); + } + +Index: rumpkernel/buildrump.sh/src/lib/librumpuser/rumpuser.c +=================================================================== +--- rumpkernel.orig/buildrump.sh/src/lib/librumpuser/rumpuser.c ++++ rumpkernel/buildrump.sh/src/lib/librumpuser/rumpuser.c +@@ -50,6 +50,7 @@ __RCSID("$NetBSD: rumpuser.c,v 1.67 2015 + #include <string.h> + #include <time.h> + #include <unistd.h> ++#include <execinfo.h> + + #include <rump/rumpuser.h> + +@@ -237,6 +238,27 @@ rumpuser_exit(int rv) + exit(rv); + } + ++__dead void ++rumpuser_abort(void) ++{ ++ const size_t size = 128; ++ const size_t skip = 1; ++ int nptrs; ++ void *buffer[size]; ++ ++ nptrs = backtrace(buffer, size); ++ if (nptrs > skip) { ++ char **syms = backtrace_symbols(&buffer[skip], nptrs - skip); ++ size_t i; ++ ++ for (i = skip; i < nptrs; i++) ++ fprintf(stderr,"%p: %s\n", buffer[i], syms[i - skip]); ++ fflush(stderr); ++ } ++ ++ abort(); ++} ++ + void + rumpuser_seterrno(int error) + { +Index: rumpkernel/buildrump.sh/src/sys/rump/include/rump/rumpuser.h +=================================================================== +--- rumpkernel.orig/buildrump.sh/src/sys/rump/include/rump/rumpuser.h ++++ rumpkernel/buildrump.sh/src/sys/rump/include/rump/rumpuser.h +@@ -151,6 +151,8 @@ int rumpuser_kill(int64_t, int); + #define RUMPUSER_PANIC (-1) + void rumpuser_exit(int) __dead; + ++void rumpuser_abort(void) __dead; ++ + /* + * console output + */ diff --git a/debian/patches/series b/debian/patches/series index a5accbb0..20e8c2a4 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -10,3 +10,4 @@ rumpuser-rng-debug.diff machirqdev.diff ahcisata-atapi.diff print-error.diff +intr_lock.diff |