* [PATCH v4] powernv: boot OpenBSD on POWER9
@ 2026-07-19 14:55 Kirill A. Korinsky
2026-08-11 8:11 ` Aditya Gupta
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Kirill A. Korinsky @ 2026-07-19 14:55 UTC (permalink / raw)
To: shivangu, adityag, qemu-devel, qemu-ppc, npiggin, harshpb, milesg,
rathc, brad
Cc: Kirill A. Korinsky
The POWER9 Processor User's Manual, section 4.9.4, specifies that POWER9
ignores PTCR[PATS] and only supports a 64 KiB partition table. Use an
effective PATS value of 4 on POWER9; other processors keep the existing
ISA v3.0 interpretation.
The PSI model now exposes POWER9 IRQ level and pending status registers,
and keeps both updated while delivering through the existing XIVE LSI
source. This lets guests that select the POWER9 PSI LSI IRQ method
continue to receive LPC interrupts.
The blast radius is probably minimal: the PTCR change is limited to
POWER9, while the PSI change only touches POWER9 PSI state and reuses
the existing delivery path.
---
hw/ppc/pnv_psi.c | 11 ++++--
target/ppc/mmu-book3s-v3.c | 21 +++++++++--
tests/functional/ppc64/meson.build | 2 +
tests/functional/ppc64/test_openbsd.py | 52 ++++++++++++++++++++++++++
4 files changed, 79 insertions(+), 7 deletions(-)
create mode 100755 tests/functional/ppc64/test_openbsd.py
diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
index e8701c6100..39ec448f3c 100644
--- a/hw/ppc/pnv_psi.c
+++ b/hw/ppc/pnv_psi.c
@@ -688,6 +688,8 @@ static uint64_t pnv_psi_p9_mmio_read(void *opaque, hwaddr addr, unsigned size)
case PSIHB9_ESB_CI_BASE:
case PSIHB9_ESB_NOTIF_ADDR:
case PSIHB9_IVT_OFFSET:
+ case PSIHB9_IRQ_LEVEL:
+ case PSIHB9_IRQ_STAT:
val = psi->regs[reg];
break;
default:
@@ -818,17 +820,20 @@ static void pnv_psi_power9_set_irq(void *opaque, int irq, int state)
{
PnvPsi *psi = opaque;
uint64_t irq_method = psi->regs[PSIHB_REG(PSIHB9_INTERRUPT_CONTROL)];
+ uint64_t irq_bit = PPC_BIT(irq);
if (irq_method & PSIHB9_IRQ_METHOD) {
qemu_log_mask(LOG_GUEST_ERROR, "PSI: LSI IRQ method no supported\n");
return;
}
- /* Update LSI levels */
+ /* Update LSI levels and pending status */
if (state) {
- psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] |= PPC_BIT(irq);
+ psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] |= irq_bit;
+ psi->regs[PSIHB_REG(PSIHB9_IRQ_STAT)] |= irq_bit;
} else {
- psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] &= ~PPC_BIT(irq);
+ psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] &= ~irq_bit;
+ psi->regs[PSIHB_REG(PSIHB9_IRQ_STAT)] &= ~irq_bit;
}
qemu_set_irq(psi->qirqs[irq], state);
diff --git a/target/ppc/mmu-book3s-v3.c b/target/ppc/mmu-book3s-v3.c
index 3865556310..f329a7a0f2 100644
--- a/target/ppc/mmu-book3s-v3.c
+++ b/target/ppc/mmu-book3s-v3.c
@@ -23,24 +23,37 @@
#include "mmu-hash64.h"
#include "mmu-book3s-v3.h"
+#define PPC64_V3_PATE_SIZE 16 /* two 64-bit words */
+
bool ppc64_v3_get_pate(PowerPCCPU *cpu, target_ulong lpid, ppc_v3_pate_t *entry)
{
uint64_t patb = cpu->env.spr[SPR_PTCR] & PTCR_PATB;
uint64_t pats = cpu->env.spr[SPR_PTCR] & PTCR_PATS;
+ uint64_t table_size;
+ uint64_t entries;
+
+ /*
+ * The POWER9 Processor User's Manual, section 4.9.4, specifies that
+ * POWER9 ignores PTCR[PATS] and only supports a 64 KiB partition table.
+ */
+ if (cpu->env.excp_model == POWERPC_EXCP_POWER9) {
+ pats = 4;
+ }
+ table_size = 1ULL << (pats + 12);
/* Check if partition table is properly aligned */
- if (patb & MAKE_64BIT_MASK(0, pats + 12)) {
+ if (patb & (table_size - 1)) {
return false;
}
/* Calculate number of entries */
- pats = 1ull << (pats + 12 - 4);
- if (pats <= lpid) {
+ entries = table_size / PPC64_V3_PATE_SIZE;
+ if (entries <= lpid) {
return false;
}
/* Grab entry */
- patb += 16 * lpid;
+ patb += PPC64_V3_PATE_SIZE * lpid;
entry->dw0 = ldq_phys(CPU(cpu)->as, patb);
entry->dw1 = ldq_phys(CPU(cpu)->as, patb + 8);
return true;
diff --git a/tests/functional/ppc64/meson.build b/tests/functional/ppc64/meson.build
index f0f8ab8f61..cb3c745624 100644
--- a/tests/functional/ppc64/meson.build
+++ b/tests/functional/ppc64/meson.build
@@ -4,6 +4,7 @@ test_ppc64_timeouts = {
'fadump' : 480,
'hv' : 1000,
'mac99' : 120,
+ 'openbsd' : 240,
'powernv' : 480,
'pseries' : 480,
'replay' : 210,
@@ -20,6 +21,7 @@ tests_ppc64_system_thorough = [
'fadump',
'hv',
'mac99',
+ 'openbsd',
'powernv',
'pseries',
'replay',
diff --git a/tests/functional/ppc64/test_openbsd.py b/tests/functional/ppc64/test_openbsd.py
new file mode 100755
index 0000000000..bdbef6bf82
--- /dev/null
+++ b/tests/functional/ppc64/test_openbsd.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+#
+# Test that OpenBSD boots on a ppc powernv machine and reaches the installer.
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+from qemu_test import QemuSystemTest, Asset
+from qemu_test import wait_for_console_pattern
+
+
+class OpenBSDPowerNV(QemuSystemTest):
+
+ ASSET_MINIROOT = Asset(
+ 'https://kirill.korins.ky/pub/qemu-powerpc64-openbsd/miniroot79.img',
+ '7829e42b75d81cafd732038b9d63228b79c1f5828d8375872a4bb655e1d6b13c')
+
+ ASSET_BOOTKERNEL = Asset(
+ 'https://kirill.korins.ky/pub/qemu-powerpc64-openbsd/pnor.BOOTKERNEL',
+ '397ce43ce61910e1a2c4f13d301f957e61513a9ec5371bc3e87d3095411fae7b')
+
+ def test_powernv9_openbsd_installer(self):
+ self.set_machine('powernv9')
+ self.require_accelerator('tcg')
+
+ miniroot_path = self.ASSET_MINIROOT.fetch()
+ bootkernel_path = self.ASSET_BOOTKERNEL.fetch()
+
+ self.vm.set_console()
+ self.vm.add_args('-cpu', 'power9',
+ '-accel', 'tcg,thread=single',
+ '-smp', '1,cores=1,threads=1',
+ '-m', '2g',
+ '-kernel', bootkernel_path,
+ '-device',
+ 'ich9-ahci,id=sata0,bus=pcie.0,addr=0x0',
+ '-drive',
+ f'file={miniroot_path},format=raw,if=none,'
+ 'id=bootdisk,snapshot=on',
+ '-device',
+ 'ide-hd,bus=sata0.0,unit=0,drive=bootdisk,'
+ 'bootindex=1')
+ self.vm.launch()
+
+ wait_for_console_pattern(self, 'OpenBSD 7.9 (RAMDISK)', 'panic:')
+ wait_for_console_pattern(
+ self,
+ '(I)nstall, (U)pgrade, (A)utoinstall or (S)hell?',
+ 'panic:')
+
+
+if __name__ == '__main__':
+ QemuSystemTest.main()
--
2.55.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v4] powernv: boot OpenBSD on POWER9
2026-07-19 14:55 [PATCH v4] powernv: boot OpenBSD on POWER9 Kirill A. Korinsky
@ 2026-08-11 8:11 ` Aditya Gupta
2026-08-14 10:47 ` Chinmay Rath
2026-08-20 10:49 ` Chinmay Rath
2 siblings, 0 replies; 5+ messages in thread
From: Aditya Gupta @ 2026-08-11 8:11 UTC (permalink / raw)
To: Kirill A. Korinsky
Cc: shivangu, qemu-devel, qemu-ppc, npiggin, harshpb, milesg, rathc,
brad
On 26/07/19 04:55PM, Kirill A. Korinsky wrote:
> The POWER9 Processor User's Manual, section 4.9.4, specifies that POWER9
> ignores PTCR[PATS] and only supports a 64 KiB partition table. Use an
> effective PATS value of 4 on POWER9; other processors keep the existing
> ISA v3.0 interpretation.
>
> The PSI model now exposes POWER9 IRQ level and pending status registers,
> and keeps both updated while delivering through the existing XIVE LSI
> source. This lets guests that select the POWER9 PSI LSI IRQ method
> continue to receive LPC interrupts.
>
> The blast radius is probably minimal: the PTCR change is limited to
> POWER9, while the PSI change only touches POWER9 PSI state and reuses
> the existing delivery path.
> ---
> hw/ppc/pnv_psi.c | 11 ++++--
> target/ppc/mmu-book3s-v3.c | 21 +++++++++--
> tests/functional/ppc64/meson.build | 2 +
> tests/functional/ppc64/test_openbsd.py | 52 ++++++++++++++++++++++++++
> 4 files changed, 79 insertions(+), 7 deletions(-)
> create mode 100755 tests/functional/ppc64/test_openbsd.py
Looks good to me. Thank you for adding openbsd support :)
Reviewed-by: Aditya Gupta <adityag@linux.ibm.com>
Thanks,
- Aditya G
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v4] powernv: boot OpenBSD on POWER9
2026-07-19 14:55 [PATCH v4] powernv: boot OpenBSD on POWER9 Kirill A. Korinsky
2026-08-11 8:11 ` Aditya Gupta
@ 2026-08-14 10:47 ` Chinmay Rath
2026-08-20 10:49 ` Chinmay Rath
2 siblings, 0 replies; 5+ messages in thread
From: Chinmay Rath @ 2026-08-14 10:47 UTC (permalink / raw)
To: Kirill A. Korinsky, shivangu, adityag, qemu-devel, qemu-ppc,
npiggin, harshpb, milesg, brad
On 7/19/26 20:25, Kirill A. Korinsky wrote:
> The POWER9 Processor User's Manual, section 4.9.4, specifies that POWER9
> ignores PTCR[PATS] and only supports a 64 KiB partition table. Use an
> effective PATS value of 4 on POWER9; other processors keep the existing
> ISA v3.0 interpretation.
>
> The PSI model now exposes POWER9 IRQ level and pending status registers,
> and keeps both updated while delivering through the existing XIVE LSI
> source. This lets guests that select the POWER9 PSI LSI IRQ method
> continue to receive LPC interrupts.
>
> The blast radius is probably minimal: the PTCR change is limited to
> POWER9, while the PSI change only touches POWER9 PSI state and reuses
> the existing delivery path.
> ---
> hw/ppc/pnv_psi.c | 11 ++++--
> target/ppc/mmu-book3s-v3.c | 21 +++++++++--
Acked-by: Chinmay Rath <rathc@linux.ibm.com>
> tests/functional/ppc64/meson.build | 2 +
> tests/functional/ppc64/test_openbsd.py | 52 ++++++++++++++++++++++++++
> 4 files changed, 79 insertions(+), 7 deletions(-)
> create mode 100755 tests/functional/ppc64/test_openbsd.py
>
> diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
> index e8701c6100..39ec448f3c 100644
> --- a/hw/ppc/pnv_psi.c
> +++ b/hw/ppc/pnv_psi.c
> @@ -688,6 +688,8 @@ static uint64_t pnv_psi_p9_mmio_read(void *opaque, hwaddr addr, unsigned size)
> case PSIHB9_ESB_CI_BASE:
> case PSIHB9_ESB_NOTIF_ADDR:
> case PSIHB9_IVT_OFFSET:
> + case PSIHB9_IRQ_LEVEL:
> + case PSIHB9_IRQ_STAT:
> val = psi->regs[reg];
> break;
> default:
> @@ -818,17 +820,20 @@ static void pnv_psi_power9_set_irq(void *opaque, int irq, int state)
> {
> PnvPsi *psi = opaque;
> uint64_t irq_method = psi->regs[PSIHB_REG(PSIHB9_INTERRUPT_CONTROL)];
> + uint64_t irq_bit = PPC_BIT(irq);
>
> if (irq_method & PSIHB9_IRQ_METHOD) {
> qemu_log_mask(LOG_GUEST_ERROR, "PSI: LSI IRQ method no supported\n");
> return;
> }
>
> - /* Update LSI levels */
> + /* Update LSI levels and pending status */
> if (state) {
> - psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] |= PPC_BIT(irq);
> + psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] |= irq_bit;
> + psi->regs[PSIHB_REG(PSIHB9_IRQ_STAT)] |= irq_bit;
> } else {
> - psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] &= ~PPC_BIT(irq);
> + psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] &= ~irq_bit;
> + psi->regs[PSIHB_REG(PSIHB9_IRQ_STAT)] &= ~irq_bit;
> }
>
> qemu_set_irq(psi->qirqs[irq], state);
> diff --git a/target/ppc/mmu-book3s-v3.c b/target/ppc/mmu-book3s-v3.c
> index 3865556310..f329a7a0f2 100644
> --- a/target/ppc/mmu-book3s-v3.c
> +++ b/target/ppc/mmu-book3s-v3.c
> @@ -23,24 +23,37 @@
> #include "mmu-hash64.h"
> #include "mmu-book3s-v3.h"
>
> +#define PPC64_V3_PATE_SIZE 16 /* two 64-bit words */
> +
> bool ppc64_v3_get_pate(PowerPCCPU *cpu, target_ulong lpid, ppc_v3_pate_t *entry)
> {
> uint64_t patb = cpu->env.spr[SPR_PTCR] & PTCR_PATB;
> uint64_t pats = cpu->env.spr[SPR_PTCR] & PTCR_PATS;
> + uint64_t table_size;
> + uint64_t entries;
> +
> + /*
> + * The POWER9 Processor User's Manual, section 4.9.4, specifies that
> + * POWER9 ignores PTCR[PATS] and only supports a 64 KiB partition table.
> + */
> + if (cpu->env.excp_model == POWERPC_EXCP_POWER9) {
> + pats = 4;
> + }
> + table_size = 1ULL << (pats + 12);
>
> /* Check if partition table is properly aligned */
> - if (patb & MAKE_64BIT_MASK(0, pats + 12)) {
> + if (patb & (table_size - 1)) {
> return false;
> }
>
> /* Calculate number of entries */
> - pats = 1ull << (pats + 12 - 4);
> - if (pats <= lpid) {
> + entries = table_size / PPC64_V3_PATE_SIZE;
> + if (entries <= lpid) {
> return false;
> }
>
> /* Grab entry */
> - patb += 16 * lpid;
> + patb += PPC64_V3_PATE_SIZE * lpid;
> entry->dw0 = ldq_phys(CPU(cpu)->as, patb);
> entry->dw1 = ldq_phys(CPU(cpu)->as, patb + 8);
> return true;
> diff --git a/tests/functional/ppc64/meson.build b/tests/functional/ppc64/meson.build
> index f0f8ab8f61..cb3c745624 100644
> --- a/tests/functional/ppc64/meson.build
> +++ b/tests/functional/ppc64/meson.build
> @@ -4,6 +4,7 @@ test_ppc64_timeouts = {
> 'fadump' : 480,
> 'hv' : 1000,
> 'mac99' : 120,
> + 'openbsd' : 240,
> 'powernv' : 480,
> 'pseries' : 480,
> 'replay' : 210,
> @@ -20,6 +21,7 @@ tests_ppc64_system_thorough = [
> 'fadump',
> 'hv',
> 'mac99',
> + 'openbsd',
> 'powernv',
> 'pseries',
> 'replay',
> diff --git a/tests/functional/ppc64/test_openbsd.py b/tests/functional/ppc64/test_openbsd.py
> new file mode 100755
> index 0000000000..bdbef6bf82
> --- /dev/null
> +++ b/tests/functional/ppc64/test_openbsd.py
> @@ -0,0 +1,52 @@
> +#!/usr/bin/env python3
> +#
> +# Test that OpenBSD boots on a ppc powernv machine and reaches the installer.
> +#
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +
> +from qemu_test import QemuSystemTest, Asset
> +from qemu_test import wait_for_console_pattern
> +
> +
> +class OpenBSDPowerNV(QemuSystemTest):
> +
> + ASSET_MINIROOT = Asset(
> + 'https://kirill.korins.ky/pub/qemu-powerpc64-openbsd/miniroot79.img',
> + '7829e42b75d81cafd732038b9d63228b79c1f5828d8375872a4bb655e1d6b13c')
> +
> + ASSET_BOOTKERNEL = Asset(
> + 'https://kirill.korins.ky/pub/qemu-powerpc64-openbsd/pnor.BOOTKERNEL',
> + '397ce43ce61910e1a2c4f13d301f957e61513a9ec5371bc3e87d3095411fae7b')
> +
> + def test_powernv9_openbsd_installer(self):
> + self.set_machine('powernv9')
> + self.require_accelerator('tcg')
> +
> + miniroot_path = self.ASSET_MINIROOT.fetch()
> + bootkernel_path = self.ASSET_BOOTKERNEL.fetch()
> +
> + self.vm.set_console()
> + self.vm.add_args('-cpu', 'power9',
> + '-accel', 'tcg,thread=single',
> + '-smp', '1,cores=1,threads=1',
> + '-m', '2g',
> + '-kernel', bootkernel_path,
> + '-device',
> + 'ich9-ahci,id=sata0,bus=pcie.0,addr=0x0',
> + '-drive',
> + f'file={miniroot_path},format=raw,if=none,'
> + 'id=bootdisk,snapshot=on',
> + '-device',
> + 'ide-hd,bus=sata0.0,unit=0,drive=bootdisk,'
> + 'bootindex=1')
> + self.vm.launch()
> +
> + wait_for_console_pattern(self, 'OpenBSD 7.9 (RAMDISK)', 'panic:')
> + wait_for_console_pattern(
> + self,
> + '(I)nstall, (U)pgrade, (A)utoinstall or (S)hell?',
> + 'panic:')
> +
> +
> +if __name__ == '__main__':
> + QemuSystemTest.main()
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v4] powernv: boot OpenBSD on POWER9
2026-07-19 14:55 [PATCH v4] powernv: boot OpenBSD on POWER9 Kirill A. Korinsky
2026-08-11 8:11 ` Aditya Gupta
2026-08-14 10:47 ` Chinmay Rath
@ 2026-08-20 10:49 ` Chinmay Rath
2026-08-20 11:56 ` Kirill A. Korinsky
2 siblings, 1 reply; 5+ messages in thread
From: Chinmay Rath @ 2026-08-20 10:49 UTC (permalink / raw)
To: Kirill A. Korinsky, shivangu, adityag, qemu-devel, qemu-ppc,
npiggin, harshpb, milesg, brad
On 7/19/26 20:25, Kirill A. Korinsky wrote:
> The POWER9 Processor User's Manual, section 4.9.4, specifies that POWER9
> ignores PTCR[PATS] and only supports a 64 KiB partition table. Use an
> effective PATS value of 4 on POWER9; other processors keep the existing
> ISA v3.0 interpretation.
>
> The PSI model now exposes POWER9 IRQ level and pending status registers,
> and keeps both updated while delivering through the existing XIVE LSI
> source. This lets guests that select the POWER9 PSI LSI IRQ method
> continue to receive LPC interrupts.
>
> The blast radius is probably minimal: the PTCR change is limited to
> POWER9, while the PSI change only touches POWER9 PSI state and reuses
> the existing delivery path.
<Signed-off-by> is missing :)
> ---
> hw/ppc/pnv_psi.c | 11 ++++--
> target/ppc/mmu-book3s-v3.c | 21 +++++++++--
> tests/functional/ppc64/meson.build | 2 +
> tests/functional/ppc64/test_openbsd.py | 52 ++++++++++++++++++++++++++
> 4 files changed, 79 insertions(+), 7 deletions(-)
> create mode 100755 tests/functional/ppc64/test_openbsd.py
>
> diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
> index e8701c6100..39ec448f3c 100644
> --- a/hw/ppc/pnv_psi.c
> +++ b/hw/ppc/pnv_psi.c
> @@ -688,6 +688,8 @@ static uint64_t pnv_psi_p9_mmio_read(void *opaque, hwaddr addr, unsigned size)
> case PSIHB9_ESB_CI_BASE:
> case PSIHB9_ESB_NOTIF_ADDR:
> case PSIHB9_IVT_OFFSET:
> + case PSIHB9_IRQ_LEVEL:
> + case PSIHB9_IRQ_STAT:
> val = psi->regs[reg];
> break;
> default:
> @@ -818,17 +820,20 @@ static void pnv_psi_power9_set_irq(void *opaque, int irq, int state)
> {
> PnvPsi *psi = opaque;
> uint64_t irq_method = psi->regs[PSIHB_REG(PSIHB9_INTERRUPT_CONTROL)];
> + uint64_t irq_bit = PPC_BIT(irq);
>
> if (irq_method & PSIHB9_IRQ_METHOD) {
> qemu_log_mask(LOG_GUEST_ERROR, "PSI: LSI IRQ method no supported\n");
> return;
> }
>
> - /* Update LSI levels */
> + /* Update LSI levels and pending status */
> if (state) {
> - psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] |= PPC_BIT(irq);
> + psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] |= irq_bit;
> + psi->regs[PSIHB_REG(PSIHB9_IRQ_STAT)] |= irq_bit;
> } else {
> - psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] &= ~PPC_BIT(irq);
> + psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] &= ~irq_bit;
> + psi->regs[PSIHB_REG(PSIHB9_IRQ_STAT)] &= ~irq_bit;
> }
>
> qemu_set_irq(psi->qirqs[irq], state);
> diff --git a/target/ppc/mmu-book3s-v3.c b/target/ppc/mmu-book3s-v3.c
> index 3865556310..f329a7a0f2 100644
> --- a/target/ppc/mmu-book3s-v3.c
> +++ b/target/ppc/mmu-book3s-v3.c
> @@ -23,24 +23,37 @@
> #include "mmu-hash64.h"
> #include "mmu-book3s-v3.h"
>
> +#define PPC64_V3_PATE_SIZE 16 /* two 64-bit words */
> +
> bool ppc64_v3_get_pate(PowerPCCPU *cpu, target_ulong lpid, ppc_v3_pate_t *entry)
> {
> uint64_t patb = cpu->env.spr[SPR_PTCR] & PTCR_PATB;
> uint64_t pats = cpu->env.spr[SPR_PTCR] & PTCR_PATS;
> + uint64_t table_size;
> + uint64_t entries;
> +
> + /*
> + * The POWER9 Processor User's Manual, section 4.9.4, specifies that
> + * POWER9 ignores PTCR[PATS] and only supports a 64 KiB partition table.
> + */
> + if (cpu->env.excp_model == POWERPC_EXCP_POWER9) {
> + pats = 4;
> + }
> + table_size = 1ULL << (pats + 12);
>
> /* Check if partition table is properly aligned */
> - if (patb & MAKE_64BIT_MASK(0, pats + 12)) {
> + if (patb & (table_size - 1)) {
> return false;
> }
>
> /* Calculate number of entries */
> - pats = 1ull << (pats + 12 - 4);
> - if (pats <= lpid) {
> + entries = table_size / PPC64_V3_PATE_SIZE;
> + if (entries <= lpid) {
> return false;
> }
>
> /* Grab entry */
> - patb += 16 * lpid;
> + patb += PPC64_V3_PATE_SIZE * lpid;
> entry->dw0 = ldq_phys(CPU(cpu)->as, patb);
> entry->dw1 = ldq_phys(CPU(cpu)->as, patb + 8);
> return true;
> diff --git a/tests/functional/ppc64/meson.build b/tests/functional/ppc64/meson.build
> index f0f8ab8f61..cb3c745624 100644
> --- a/tests/functional/ppc64/meson.build
> +++ b/tests/functional/ppc64/meson.build
> @@ -4,6 +4,7 @@ test_ppc64_timeouts = {
> 'fadump' : 480,
> 'hv' : 1000,
> 'mac99' : 120,
> + 'openbsd' : 240,
> 'powernv' : 480,
> 'pseries' : 480,
> 'replay' : 210,
> @@ -20,6 +21,7 @@ tests_ppc64_system_thorough = [
> 'fadump',
> 'hv',
> 'mac99',
> + 'openbsd',
> 'powernv',
> 'pseries',
> 'replay',
> diff --git a/tests/functional/ppc64/test_openbsd.py b/tests/functional/ppc64/test_openbsd.py
> new file mode 100755
> index 0000000000..bdbef6bf82
> --- /dev/null
> +++ b/tests/functional/ppc64/test_openbsd.py
> @@ -0,0 +1,52 @@
> +#!/usr/bin/env python3
> +#
> +# Test that OpenBSD boots on a ppc powernv machine and reaches the installer.
> +#
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +
> +from qemu_test import QemuSystemTest, Asset
> +from qemu_test import wait_for_console_pattern
> +
> +
> +class OpenBSDPowerNV(QemuSystemTest):
> +
> + ASSET_MINIROOT = Asset(
> + 'https://kirill.korins.ky/pub/qemu-powerpc64-openbsd/miniroot79.img',
> + '7829e42b75d81cafd732038b9d63228b79c1f5828d8375872a4bb655e1d6b13c')
> +
> + ASSET_BOOTKERNEL = Asset(
> + 'https://kirill.korins.ky/pub/qemu-powerpc64-openbsd/pnor.BOOTKERNEL',
> + '397ce43ce61910e1a2c4f13d301f957e61513a9ec5371bc3e87d3095411fae7b')
> +
> + def test_powernv9_openbsd_installer(self):
> + self.set_machine('powernv9')
> + self.require_accelerator('tcg')
> +
> + miniroot_path = self.ASSET_MINIROOT.fetch()
> + bootkernel_path = self.ASSET_BOOTKERNEL.fetch()
> +
> + self.vm.set_console()
> + self.vm.add_args('-cpu', 'power9',
> + '-accel', 'tcg,thread=single',
> + '-smp', '1,cores=1,threads=1',
> + '-m', '2g',
> + '-kernel', bootkernel_path,
> + '-device',
> + 'ich9-ahci,id=sata0,bus=pcie.0,addr=0x0',
> + '-drive',
> + f'file={miniroot_path},format=raw,if=none,'
> + 'id=bootdisk,snapshot=on',
> + '-device',
> + 'ide-hd,bus=sata0.0,unit=0,drive=bootdisk,'
> + 'bootindex=1')
> + self.vm.launch()
> +
> + wait_for_console_pattern(self, 'OpenBSD 7.9 (RAMDISK)', 'panic:')
> + wait_for_console_pattern(
> + self,
> + '(I)nstall, (U)pgrade, (A)utoinstall or (S)hell?',
> + 'panic:')
> +
> +
> +if __name__ == '__main__':
> + QemuSystemTest.main()
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v4] powernv: boot OpenBSD on POWER9
2026-08-20 10:49 ` Chinmay Rath
@ 2026-08-20 11:56 ` Kirill A. Korinsky
0 siblings, 0 replies; 5+ messages in thread
From: Kirill A. Korinsky @ 2026-08-20 11:56 UTC (permalink / raw)
To: Chinmay Rath
Cc: shivangu, adityag, qemu-devel, qemu-ppc, npiggin, harshpb, milesg,
brad
On Thu, 20 Aug 2026 12:49:36 +0200,
Chinmay Rath <rathc@linux.ibm.com> wrote:
>
>
> On 7/19/26 20:25, Kirill A. Korinsky wrote:
> > The POWER9 Processor User's Manual, section 4.9.4, specifies that POWER9
> > ignores PTCR[PATS] and only supports a 64 KiB partition table. Use an
> > effective PATS value of 4 on POWER9; other processors keep the existing
> > ISA v3.0 interpretation.
> >
> > The PSI model now exposes POWER9 IRQ level and pending status registers,
> > and keeps both updated while delivering through the existing XIVE LSI
> > source. This lets guests that select the POWER9 PSI LSI IRQ method
> > continue to receive LPC interrupts.
> >
> > The blast radius is probably minimal: the PTCR change is limited to
> > POWER9, while the PSI change only touches POWER9 PSI state and reuses
> > the existing delivery path.
> <Signed-off-by> is missing :)
Oops, shall I send a v5 version with:
Signed-off-by: Kirill A. Korinsky <kirill@korins.ky>
or it's ok?
> > ---
> > hw/ppc/pnv_psi.c | 11 ++++--
> > target/ppc/mmu-book3s-v3.c | 21 +++++++++--
> > tests/functional/ppc64/meson.build | 2 +
> > tests/functional/ppc64/test_openbsd.py | 52 ++++++++++++++++++++++++++
> > 4 files changed, 79 insertions(+), 7 deletions(-)
> > create mode 100755 tests/functional/ppc64/test_openbsd.py
> >
> > diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
> > index e8701c6100..39ec448f3c 100644
> > --- a/hw/ppc/pnv_psi.c
> > +++ b/hw/ppc/pnv_psi.c
> > @@ -688,6 +688,8 @@ static uint64_t pnv_psi_p9_mmio_read(void *opaque, hwaddr addr, unsigned size)
> > case PSIHB9_ESB_CI_BASE:
> > case PSIHB9_ESB_NOTIF_ADDR:
> > case PSIHB9_IVT_OFFSET:
> > + case PSIHB9_IRQ_LEVEL:
> > + case PSIHB9_IRQ_STAT:
> > val = psi->regs[reg];
> > break;
> > default:
> > @@ -818,17 +820,20 @@ static void pnv_psi_power9_set_irq(void *opaque, int irq, int state)
> > {
> > PnvPsi *psi = opaque;
> > uint64_t irq_method = psi->regs[PSIHB_REG(PSIHB9_INTERRUPT_CONTROL)];
> > + uint64_t irq_bit = PPC_BIT(irq);
> > if (irq_method & PSIHB9_IRQ_METHOD) {
> > qemu_log_mask(LOG_GUEST_ERROR, "PSI: LSI IRQ method no supported\n");
> > return;
> > }
> > - /* Update LSI levels */
> > + /* Update LSI levels and pending status */
> > if (state) {
> > - psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] |= PPC_BIT(irq);
> > + psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] |= irq_bit;
> > + psi->regs[PSIHB_REG(PSIHB9_IRQ_STAT)] |= irq_bit;
> > } else {
> > - psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] &= ~PPC_BIT(irq);
> > + psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] &= ~irq_bit;
> > + psi->regs[PSIHB_REG(PSIHB9_IRQ_STAT)] &= ~irq_bit;
> > }
> > qemu_set_irq(psi->qirqs[irq], state);
> > diff --git a/target/ppc/mmu-book3s-v3.c b/target/ppc/mmu-book3s-v3.c
> > index 3865556310..f329a7a0f2 100644
> > --- a/target/ppc/mmu-book3s-v3.c
> > +++ b/target/ppc/mmu-book3s-v3.c
> > @@ -23,24 +23,37 @@
> > #include "mmu-hash64.h"
> > #include "mmu-book3s-v3.h"
> > +#define PPC64_V3_PATE_SIZE 16 /* two 64-bit words */
> > +
> > bool ppc64_v3_get_pate(PowerPCCPU *cpu, target_ulong lpid, ppc_v3_pate_t *entry)
> > {
> > uint64_t patb = cpu->env.spr[SPR_PTCR] & PTCR_PATB;
> > uint64_t pats = cpu->env.spr[SPR_PTCR] & PTCR_PATS;
> > + uint64_t table_size;
> > + uint64_t entries;
> > +
> > + /*
> > + * The POWER9 Processor User's Manual, section 4.9.4, specifies that
> > + * POWER9 ignores PTCR[PATS] and only supports a 64 KiB partition table.
> > + */
> > + if (cpu->env.excp_model == POWERPC_EXCP_POWER9) {
> > + pats = 4;
> > + }
> > + table_size = 1ULL << (pats + 12);
> > /* Check if partition table is properly aligned */
> > - if (patb & MAKE_64BIT_MASK(0, pats + 12)) {
> > + if (patb & (table_size - 1)) {
> > return false;
> > }
> > /* Calculate number of entries */
> > - pats = 1ull << (pats + 12 - 4);
> > - if (pats <= lpid) {
> > + entries = table_size / PPC64_V3_PATE_SIZE;
> > + if (entries <= lpid) {
> > return false;
> > }
> > /* Grab entry */
> > - patb += 16 * lpid;
> > + patb += PPC64_V3_PATE_SIZE * lpid;
> > entry->dw0 = ldq_phys(CPU(cpu)->as, patb);
> > entry->dw1 = ldq_phys(CPU(cpu)->as, patb + 8);
> > return true;
> > diff --git a/tests/functional/ppc64/meson.build b/tests/functional/ppc64/meson.build
> > index f0f8ab8f61..cb3c745624 100644
> > --- a/tests/functional/ppc64/meson.build
> > +++ b/tests/functional/ppc64/meson.build
> > @@ -4,6 +4,7 @@ test_ppc64_timeouts = {
> > 'fadump' : 480,
> > 'hv' : 1000,
> > 'mac99' : 120,
> > + 'openbsd' : 240,
> > 'powernv' : 480,
> > 'pseries' : 480,
> > 'replay' : 210,
> > @@ -20,6 +21,7 @@ tests_ppc64_system_thorough = [
> > 'fadump',
> > 'hv',
> > 'mac99',
> > + 'openbsd',
> > 'powernv',
> > 'pseries',
> > 'replay',
> > diff --git a/tests/functional/ppc64/test_openbsd.py b/tests/functional/ppc64/test_openbsd.py
> > new file mode 100755
> > index 0000000000..bdbef6bf82
> > --- /dev/null
> > +++ b/tests/functional/ppc64/test_openbsd.py
> > @@ -0,0 +1,52 @@
> > +#!/usr/bin/env python3
> > +#
> > +# Test that OpenBSD boots on a ppc powernv machine and reaches the installer.
> > +#
> > +# SPDX-License-Identifier: GPL-2.0-or-later
> > +
> > +from qemu_test import QemuSystemTest, Asset
> > +from qemu_test import wait_for_console_pattern
> > +
> > +
> > +class OpenBSDPowerNV(QemuSystemTest):
> > +
> > + ASSET_MINIROOT = Asset(
> > + 'https://kirill.korins.ky/pub/qemu-powerpc64-openbsd/miniroot79.img',
> > + '7829e42b75d81cafd732038b9d63228b79c1f5828d8375872a4bb655e1d6b13c')
> > +
> > + ASSET_BOOTKERNEL = Asset(
> > + 'https://kirill.korins.ky/pub/qemu-powerpc64-openbsd/pnor.BOOTKERNEL',
> > + '397ce43ce61910e1a2c4f13d301f957e61513a9ec5371bc3e87d3095411fae7b')
> > +
> > + def test_powernv9_openbsd_installer(self):
> > + self.set_machine('powernv9')
> > + self.require_accelerator('tcg')
> > +
> > + miniroot_path = self.ASSET_MINIROOT.fetch()
> > + bootkernel_path = self.ASSET_BOOTKERNEL.fetch()
> > +
> > + self.vm.set_console()
> > + self.vm.add_args('-cpu', 'power9',
> > + '-accel', 'tcg,thread=single',
> > + '-smp', '1,cores=1,threads=1',
> > + '-m', '2g',
> > + '-kernel', bootkernel_path,
> > + '-device',
> > + 'ich9-ahci,id=sata0,bus=pcie.0,addr=0x0',
> > + '-drive',
> > + f'file={miniroot_path},format=raw,if=none,'
> > + 'id=bootdisk,snapshot=on',
> > + '-device',
> > + 'ide-hd,bus=sata0.0,unit=0,drive=bootdisk,'
> > + 'bootindex=1')
> > + self.vm.launch()
> > +
> > + wait_for_console_pattern(self, 'OpenBSD 7.9 (RAMDISK)', 'panic:')
> > + wait_for_console_pattern(
> > + self,
> > + '(I)nstall, (U)pgrade, (A)utoinstall or (S)hell?',
> > + 'panic:')
> > +
> > +
> > +if __name__ == '__main__':
> > + QemuSystemTest.main()
--
wbr, Kirill
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-08-20 11:57 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-19 14:55 [PATCH v4] powernv: boot OpenBSD on POWER9 Kirill A. Korinsky
2026-08-11 8:11 ` Aditya Gupta
2026-08-14 10:47 ` Chinmay Rath
2026-08-20 10:49 ` Chinmay Rath
2026-08-20 11:56 ` Kirill A. Korinsky
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.