Re: [fix] emulators/qemu: allow OpenBSD/hppa to boot
Go ahead. Thanks. On 10/6/2020 4:43 PM, Charlene Wendling wrote: Hi, I wanted to install the latest OpenBSD/hppa snapshot using qemu, but it croaked when configuring lasi0 with: assertion "(val & LASI_IRQ_BITS) == val" failed It makes the system impossible to boot. It appears that NetBSD folks already met the issue and upstreamed a fix [0]. After reading our lasi(4) code i've found out that we do the same thing. With the below diff, i've been able to boot the ramdisk, then perform a full hppa install. It boots properly from that install, but is stuck after enabling pf if you were curious about that. Comments/feedback are welcome, Charlène. [0] https://github.com/qemu/qemu/commit/b899fe41 Index: Makefile === RCS file: /cvs/ports/emulators/qemu/Makefile,v retrieving revision 1.198 diff -u -p -u -p -r1.198 Makefile --- Makefile17 Aug 2020 09:58:44 - 1.198 +++ Makefile6 Oct 2020 20:12:32 - @@ -5,6 +5,7 @@ ONLY_FOR_ARCHS= aarch64 amd64 arm i386 p COMMENT= multi system emulator DISTNAME= qemu-5.1.0 +REVISION= 0 CATEGORIES= emulators MASTER_SITES= https://download.qemu.org/ EXTRACT_SUFX= .tar.xz Index: patches/patch-hw_hppa_lasi_c === RCS file: patches/patch-hw_hppa_lasi_c diff -N patches/patch-hw_hppa_lasi_c --- /dev/null 1 Jan 1970 00:00:00 - +++ patches/patch-hw_hppa_lasi_c6 Oct 2020 20:12:32 - @@ -0,0 +1,33 @@ +$OpenBSD$ + +From upstream commit b899fe41: + +OpenBSD initializes the LASI IMR value with 0x to disable all LASI +interrupts. This triggered an assert() and stopped the emulation. By replacing +the check with a warning in the guest log we now allow OpenBSD to boot again. + +Index: hw/hppa/lasi.c +--- hw/hppa/lasi.c.orig hw/hppa/lasi.c +@@ -11,6 +11,7 @@ + + #include "qemu/osdep.h" + #include "qemu/units.h" ++#include "qemu/log.h" + #include "qapi/error.h" + #include "cpu.h" + #include "trace.h" +@@ -172,8 +173,11 @@ static MemTxResult lasi_chip_write_with_attrs(void *op + /* read-only. */ + break; + case LASI_IMR: +-s->imr = val; /* 0x20 ?? */ +-assert((val & LASI_IRQ_BITS) == val); ++s->imr = val; ++if (((val & LASI_IRQ_BITS) != val) && (val != 0x)) ++qemu_log_mask(LOG_GUEST_ERROR, ++"LASI: tried to set invalid %lx IMR value.\n", ++(unsigned long) val); + break; + case LASI_IPR: + /* Any write to IPR clears the register. */
[fix] emulators/qemu: allow OpenBSD/hppa to boot
Hi, I wanted to install the latest OpenBSD/hppa snapshot using qemu, but it croaked when configuring lasi0 with: > assertion "(val & LASI_IRQ_BITS) == val" failed It makes the system impossible to boot. It appears that NetBSD folks already met the issue and upstreamed a fix [0]. After reading our lasi(4) code i've found out that we do the same thing. With the below diff, i've been able to boot the ramdisk, then perform a full hppa install. It boots properly from that install, but is stuck after enabling pf if you were curious about that. Comments/feedback are welcome, Charlène. [0] https://github.com/qemu/qemu/commit/b899fe41 Index: Makefile === RCS file: /cvs/ports/emulators/qemu/Makefile,v retrieving revision 1.198 diff -u -p -u -p -r1.198 Makefile --- Makefile17 Aug 2020 09:58:44 - 1.198 +++ Makefile6 Oct 2020 20:12:32 - @@ -5,6 +5,7 @@ ONLY_FOR_ARCHS= aarch64 amd64 arm i386 p COMMENT= multi system emulator DISTNAME= qemu-5.1.0 +REVISION= 0 CATEGORIES=emulators MASTER_SITES= https://download.qemu.org/ EXTRACT_SUFX= .tar.xz Index: patches/patch-hw_hppa_lasi_c === RCS file: patches/patch-hw_hppa_lasi_c diff -N patches/patch-hw_hppa_lasi_c --- /dev/null 1 Jan 1970 00:00:00 - +++ patches/patch-hw_hppa_lasi_c6 Oct 2020 20:12:32 - @@ -0,0 +1,33 @@ +$OpenBSD$ + +From upstream commit b899fe41: + +OpenBSD initializes the LASI IMR value with 0x to disable all LASI +interrupts. This triggered an assert() and stopped the emulation. By replacing +the check with a warning in the guest log we now allow OpenBSD to boot again. + +Index: hw/hppa/lasi.c +--- hw/hppa/lasi.c.orig hw/hppa/lasi.c +@@ -11,6 +11,7 @@ + + #include "qemu/osdep.h" + #include "qemu/units.h" ++#include "qemu/log.h" + #include "qapi/error.h" + #include "cpu.h" + #include "trace.h" +@@ -172,8 +173,11 @@ static MemTxResult lasi_chip_write_with_attrs(void *op + /* read-only. */ + break; + case LASI_IMR: +-s->imr = val; /* 0x20 ?? */ +-assert((val & LASI_IRQ_BITS) == val); ++s->imr = val; ++if (((val & LASI_IRQ_BITS) != val) && (val != 0x)) ++qemu_log_mask(LOG_GUEST_ERROR, ++"LASI: tried to set invalid %lx IMR value.\n", ++(unsigned long) val); + break; + case LASI_IPR: + /* Any write to IPR clears the register. */