Re: git: 65b133e5d292 - main - x86: allow to have more than one kind of IOMMU

From: Cy Schubert <Cy.Schubert_at_cschubert.com>
Date: Wed, 04 Sep 2024 23:52:04 UTC
In message <202409042150.484LoeAq031493@gitrepo.freebsd.org>, Konstantin 
Belous
ov writes:
> The branch main has been updated by kib:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=65b133e5d292686fe20f11dd39b53812
> 226a8684
>
> commit 65b133e5d292686fe20f11dd39b53812226a8684
> Author:     Konstantin Belousov <kib@FreeBSD.org>
> AuthorDate: 2024-05-29 14:38:14 +0000
> Commit:     Konstantin Belousov <kib@FreeBSD.org>
> CommitDate: 2024-09-04 21:50:18 +0000
>
>     x86: allow to have more than one kind of IOMMU
>     
>     Sponsored by:   Advanced Micro Devices (AMD)
>     Sponsored by:   The FreeBSD Foundation
>     MFC after:      1 week
> ---
>  sys/x86/iommu/intel_ctx.c     | 22 +++++------
>  sys/x86/iommu/intel_dmar.h    | 18 ++++++++-
>  sys/x86/iommu/intel_drv.c     | 30 ++++++++++++--
>  sys/x86/iommu/intel_intrmap.c | 10 ++---
>  sys/x86/iommu/iommu_utils.c   | 91 +++++++++++++++++++++++++++++++++++++++++
> +-
>  sys/x86/iommu/x86_iommu.h     | 25 +++++++++++-
>  6 files changed, 173 insertions(+), 23 deletions(-)
>
> diff --git a/sys/x86/iommu/intel_ctx.c b/sys/x86/iommu/intel_ctx.c
> index baee0109e5a9..a3ff35dc527e 100644
> --- a/sys/x86/iommu/intel_ctx.c
> +++ b/sys/x86/iommu/intel_ctx.c
> @@ -75,6 +75,9 @@ static void dmar_unref_domain_locked(struct dmar_unit *dmar
> ,
>      struct dmar_domain *domain);
>  static void dmar_domain_destroy(struct dmar_domain *domain);
>  
> +static void dmar_free_ctx_locked(struct dmar_unit *dmar, struct dmar_ctx *ct
> x);
> +static void dmar_free_ctx(struct dmar_ctx *ctx);
> +
>  static void
>  dmar_ensure_ctx_page(struct dmar_unit *dmar, int bus)
>  {
> @@ -745,7 +748,7 @@ dmar_unref_domain_locked(struct dmar_unit *dmar, struct d
> mar_domain *domain)
>  	dmar_domain_destroy(domain);
>  }
>  
> -void
> +static void
>  dmar_free_ctx_locked(struct dmar_unit *dmar, struct dmar_ctx *ctx)
>  {
>  	struct sf_buf *sf;
> @@ -819,7 +822,7 @@ dmar_free_ctx_locked(struct dmar_unit *dmar, struct dmar_
> ctx *ctx)
>  	TD_PINNED_ASSERT;
>  }
>  
> -void
> +static void
>  dmar_free_ctx(struct dmar_ctx *ctx)
>  {
>  	struct dmar_unit *dmar;
> @@ -867,7 +870,7 @@ dmar_domain_free_entry(struct iommu_map_entry *entry, boo
> l free)
>   * the entry's dmamap_link field.
>   */
>  void
> -iommu_domain_unload_entry(struct iommu_map_entry *entry, bool free,
> +dmar_domain_unload_entry(struct iommu_map_entry *entry, bool free,
>      bool cansleep)
>  {
>  	struct dmar_domain *domain;
> @@ -909,7 +912,7 @@ dmar_domain_unload_emit_wait(struct dmar_domain *domain,
>  }
>  
>  void
> -iommu_domain_unload(struct iommu_domain *iodom,
> +dmar_domain_unload(struct iommu_domain *iodom,
>      struct iommu_map_entries_tailq *entries, bool cansleep)
>  {
>  	struct dmar_domain *domain;
> @@ -947,37 +950,34 @@ iommu_domain_unload(struct iommu_domain *iodom,
>  }
>  
>  struct iommu_ctx *
> -iommu_get_ctx(struct iommu_unit *iommu, device_t dev, uint16_t rid,
> +dmar_get_ctx(struct iommu_unit *iommu, device_t dev, uint16_t rid,
>      bool id_mapped, bool rmrr_init)
>  {
>  	struct dmar_unit *dmar;
>  	struct dmar_ctx *ret;
>  
>  	dmar = IOMMU2DMAR(iommu);
> -
>  	ret = dmar_get_ctx_for_dev(dmar, dev, rid, id_mapped, rmrr_init);
> -
>  	return (CTX2IOCTX(ret));
>  }
>  
>  void
> -iommu_free_ctx_locked(struct iommu_unit *iommu, struct iommu_ctx *context)
> +dmar_free_ctx_locked_method(struct iommu_unit *iommu,
> +    struct iommu_ctx *context)
>  {
>  	struct dmar_unit *dmar;
>  	struct dmar_ctx *ctx;
>  
>  	dmar = IOMMU2DMAR(iommu);
>  	ctx = IOCTX2CTX(context);
> -
>  	dmar_free_ctx_locked(dmar, ctx);
>  }
>  
>  void
> -iommu_free_ctx(struct iommu_ctx *context)
> +dmar_free_ctx_method(struct iommu_ctx *context)
>  {
>  	struct dmar_ctx *ctx;
>  
>  	ctx = IOCTX2CTX(context);
> -
>  	dmar_free_ctx(ctx);
>  }
> diff --git a/sys/x86/iommu/intel_dmar.h b/sys/x86/iommu/intel_dmar.h
> index 4ae005238074..0ede955e12b9 100644
> --- a/sys/x86/iommu/intel_dmar.h
> +++ b/sys/x86/iommu/intel_dmar.h
> @@ -293,10 +293,17 @@ struct dmar_ctx *dmar_get_ctx_for_devpath(struct dmar_u
> nit *dmar, uint16_t rid,
>      int dev_domain, int dev_busno, const void *dev_path, int dev_path_len,
>      bool id_mapped, bool rmrr_init);
>  int dmar_move_ctx_to_domain(struct dmar_domain *domain, struct dmar_ctx *ctx
> );
> -void dmar_free_ctx_locked(struct dmar_unit *dmar, struct dmar_ctx *ctx);
> -void dmar_free_ctx(struct dmar_ctx *ctx);
> +void dmar_free_ctx_locked_method(struct iommu_unit *dmar,
> +    struct iommu_ctx *ctx);
> +void dmar_free_ctx_method(struct iommu_ctx *ctx);
>  struct dmar_ctx *dmar_find_ctx_locked(struct dmar_unit *dmar, uint16_t rid);
> +struct iommu_ctx *dmar_get_ctx(struct iommu_unit *iommu, device_t dev,
> +    uint16_t rid, bool id_mapped, bool rmrr_init);
>  void dmar_domain_free_entry(struct iommu_map_entry *entry, bool free);
> +void dmar_domain_unload_entry(struct iommu_map_entry *entry, bool free,
> +    bool cansleep);
> +void dmar_domain_unload(struct iommu_domain *iodom,
> +    struct iommu_map_entries_tailq *entries, bool cansleep);
>  
>  void dmar_dev_parse_rmrr(struct dmar_domain *domain, int dev_domain,
>      int dev_busno, const void *dev_path, int dev_path_len,
> @@ -308,6 +315,13 @@ void dmar_quirks_pre_use(struct iommu_unit *dmar);
>  
>  int dmar_init_irt(struct dmar_unit *unit);
>  void dmar_fini_irt(struct dmar_unit *unit);
> +int dmar_alloc_msi_intr(device_t src, u_int *cookies, u_int count);
> +int dmar_map_msi_intr(device_t src, u_int cpu, u_int vector, u_int cookie,
> +    uint64_t *addr, uint32_t *data);
> +int dmar_unmap_msi_intr(device_t src, u_int cookie);
> +int dmar_map_ioapic_intr(u_int ioapic_id, u_int cpu, u_int vector, bool edge
> ,
> +    bool activehi, int irq, u_int *cookie, uint32_t *hi, uint32_t *lo);
> +int dmar_unmap_ioapic_intr(u_int ioapic_id, u_int *cookie);
>  
>  extern int haw;
>  extern int dmar_batch_coalesce;
> diff --git a/sys/x86/iommu/intel_drv.c b/sys/x86/iommu/intel_drv.c
> index 636534173715..79350358cced 100644
> --- a/sys/x86/iommu/intel_drv.c
> +++ b/sys/x86/iommu/intel_drv.c
> @@ -64,6 +64,8 @@
>  #include <dev/pci/pcivar.h>
>  #include <machine/bus.h>
>  #include <machine/pci_cfgreg.h>
> +#include <machine/md_var.h>
> +#include <machine/cputypes.h>
>  #include <x86/include/busdma_impl.h>
>  #include <dev/iommu/busdma_iommu.h>
>  #include <x86/iommu/intel_reg.h>
> @@ -1357,12 +1359,34 @@ DB_SHOW_ALL_COMMAND(dmars, db_show_all_dmars)
>  }
>  #endif
>  
> -struct iommu_unit *
> -iommu_find(device_t dev, bool verbose)
> +static struct iommu_unit *
> +dmar_find_method(device_t dev, bool verbose)
>  {
>  	struct dmar_unit *dmar;
>  
>  	dmar = dmar_find(dev, verbose);
> -
>  	return (&dmar->iommu);
>  }
> +
> +static struct x86_iommu dmar_x86_iommu = {
> +	.domain_unload_entry = dmar_domain_unload_entry,
> +	.domain_unload = dmar_domain_unload,
> +	.get_ctx = dmar_get_ctx,
> +	.free_ctx_locked = dmar_free_ctx_locked_method,
> +	.free_ctx = dmar_free_ctx_method,
> +	.find = dmar_find_method,
> +	.alloc_msi_intr = dmar_alloc_msi_intr,
> +	.map_msi_intr = dmar_map_msi_intr,
> +	.unmap_msi_intr = dmar_unmap_msi_intr,
> +	.map_ioapic_intr = dmar_map_ioapic_intr,
> +	.unmap_ioapic_intr = dmar_unmap_ioapic_intr,
> +};
> +
> +static void
> +x86_iommu_set_intel(void *arg __unused)
> +{
> +	if (cpu_vendor_id == CPU_VENDOR_INTEL)
> +		set_x86_iommu(&dmar_x86_iommu);
> +}
> +
> +SYSINIT(x86_iommu, SI_SUB_TUNABLES, SI_ORDER_ANY, x86_iommu_set_intel, NULL)
> ;
> diff --git a/sys/x86/iommu/intel_intrmap.c b/sys/x86/iommu/intel_intrmap.c
> index 22fd51bc8be9..a6979a9d2501 100644
> --- a/sys/x86/iommu/intel_intrmap.c
> +++ b/sys/x86/iommu/intel_intrmap.c
> @@ -65,7 +65,7 @@ static void dmar_ir_program_irte(struct dmar_unit *unit, u_
> int idx,
>  static int dmar_ir_free_irte(struct dmar_unit *unit, u_int cookie);
>  
>  int
> -iommu_alloc_msi_intr(device_t src, u_int *cookies, u_int count)
> +dmar_alloc_msi_intr(device_t src, u_int *cookies, u_int count)
>  {
>  	struct dmar_unit *unit;
>  	vmem_addr_t vmem_res;
> @@ -93,7 +93,7 @@ iommu_alloc_msi_intr(device_t src, u_int *cookies, u_int co
> unt)
>  }
>  
>  int
> -iommu_map_msi_intr(device_t src, u_int cpu, u_int vector, u_int cookie,
> +dmar_map_msi_intr(device_t src, u_int cpu, u_int vector, u_int cookie,
>      uint64_t *addr, uint32_t *data)
>  {
>  	struct dmar_unit *unit;
> @@ -139,7 +139,7 @@ iommu_map_msi_intr(device_t src, u_int cpu, u_int vector,
>  u_int cookie,
>  }
>  
>  int
> -iommu_unmap_msi_intr(device_t src, u_int cookie)
> +dmar_unmap_msi_intr(device_t src, u_int cookie)
>  {
>  	struct dmar_unit *unit;
>  
> @@ -150,7 +150,7 @@ iommu_unmap_msi_intr(device_t src, u_int cookie)
>  }
>  
>  int
> -iommu_map_ioapic_intr(u_int ioapic_id, u_int cpu, u_int vector, bool edge,
> +dmar_map_ioapic_intr(u_int ioapic_id, u_int cpu, u_int vector, bool edge,
>      bool activehi, int irq, u_int *cookie, uint32_t *hi, uint32_t *lo)
>  {
>  	struct dmar_unit *unit;
> @@ -213,7 +213,7 @@ iommu_map_ioapic_intr(u_int ioapic_id, u_int cpu, u_int v
> ector, bool edge,
>  }
>  
>  int
> -iommu_unmap_ioapic_intr(u_int ioapic_id, u_int *cookie)
> +dmar_unmap_ioapic_intr(u_int ioapic_id, u_int *cookie)
>  {
>  	struct dmar_unit *unit;
>  	u_int idx;
> diff --git a/sys/x86/iommu/iommu_utils.c b/sys/x86/iommu/iommu_utils.c
> index ffea1cc1a190..ea2c0358e072 100644
> --- a/sys/x86/iommu/iommu_utils.c
> +++ b/sys/x86/iommu/iommu_utils.c
> @@ -1,7 +1,7 @@
>  /*-
>   * SPDX-License-Identifier: BSD-2-Clause
>   *
> - * Copyright (c) 2013, 2014 The FreeBSD Foundation
> + * Copyright (c) 2013, 2014, 2024 The FreeBSD Foundation
>   *
>   * This software was developed by Konstantin Belousov <kib@FreeBSD.org>
>   * under sponsorship from the FreeBSD Foundation.
> @@ -50,6 +50,7 @@
>  #include <dev/iommu/busdma_iommu.h>
>  #include <dev/iommu/iommu.h>
>  #include <x86/iommu/x86_iommu.h>
> +#include <x86/iommu/iommu_intrmap.h>
>  
>  vm_page_t
>  iommu_pgalloc(vm_object_t obj, vm_pindex_t idx, int flags)
> @@ -162,3 +163,91 @@ SYSCTL_NODE(_hw_iommu, OID_AUTO, dmar, CTLFLAG_RD | CTLF
> LAG_MPSAFE,
>  SYSCTL_INT(_hw_iommu_dmar, OID_AUTO, tbl_pagecnt, CTLFLAG_RD,
>      &iommu_tbl_pagecnt, 0,
>      "Count of pages used for DMAR pagetables");
> +
> +static struct x86_iommu *x86_iommu;
> +
> +void
> +set_x86_iommu(struct x86_iommu *x)
> +{
> +	MPASS(x86_iommu == NULL);
> +	x86_iommu = x;
> +}
> +
> +struct x86_iommu *
> +get_x86_iommu(void)
> +{
> +	return (x86_iommu);
> +}
> +
> +void
> +iommu_domain_unload_entry(struct iommu_map_entry *entry, bool free,
> +    bool cansleep)
> +{
> +	x86_iommu->domain_unload_entry(entry, free, cansleep);
> +}
> +
> +void
> +iommu_domain_unload(struct iommu_domain *iodom,
> +    struct iommu_map_entries_tailq *entries, bool cansleep)
> +{
> +	x86_iommu->domain_unload(iodom, entries, cansleep);
> +}
> +
> +struct iommu_ctx *
> +iommu_get_ctx(struct iommu_unit *iommu, device_t dev, uint16_t rid,
> +    bool id_mapped, bool rmrr_init)
> +{
> +	return (x86_iommu->get_ctx(iommu, dev, rid, id_mapped, rmrr_init));
> +}
> +
> +void
> +iommu_free_ctx_locked(struct iommu_unit *iommu, struct iommu_ctx *context)
> +{
> +	x86_iommu->free_ctx_locked(iommu, context);
> +}
> +
> +void
> +iommu_free_ctx(struct iommu_ctx *context)
> +{
> +	x86_iommu->free_ctx(context);
> +}
> +
> +struct iommu_unit *
> +iommu_find(device_t dev, bool verbose)
> +{
> +	return (x86_iommu->find(dev, verbose));
> +}
> +
> +int
> +iommu_alloc_msi_intr(device_t src, u_int *cookies, u_int count)
> +{
> +	return (x86_iommu->alloc_msi_intr(src, cookies, count));
> +}
> +
> +int
> +iommu_map_msi_intr(device_t src, u_int cpu, u_int vector, u_int cookie,
> +    uint64_t *addr, uint32_t *data)
> +{
> +	return (x86_iommu->map_msi_intr(src, cpu, vector, cookie,
> +	    addr, data));
> +}
> +
> +int
> +iommu_unmap_msi_intr(device_t src, u_int cookie)
> +{
> +	return (x86_iommu->unmap_msi_intr(src, cookie));
> +}
> +
> +int
> +iommu_map_ioapic_intr(u_int ioapic_id, u_int cpu, u_int vector, bool edge,
> +    bool activehi, int irq, u_int *cookie, uint32_t *hi, uint32_t *lo)
> +{
> +	return (x86_iommu->map_ioapic_intr(ioapic_id, cpu, vector, edge,
> +	    activehi, irq, cookie, hi, lo));
> +}
> +
> +int
> +iommu_unmap_ioapic_intr(u_int ioapic_id, u_int *cookie)
> +{
> +	return (x86_iommu->unmap_ioapic_intr(ioapic_id, cookie));
> +}
> diff --git a/sys/x86/iommu/x86_iommu.h b/sys/x86/iommu/x86_iommu.h
> index 3789586f1eaf..8c908964acd0 100644
> --- a/sys/x86/iommu/x86_iommu.h
> +++ b/sys/x86/iommu/x86_iommu.h
> @@ -1,7 +1,7 @@
>  /*-
>   * SPDX-License-Identifier: BSD-2-Clause
>   *
> - * Copyright (c) 2013-2015 The FreeBSD Foundation
> + * Copyright (c) 2013-2015, 2024 The FreeBSD Foundation
>   *
>   * This software was developed by Konstantin Belousov <kib@FreeBSD.org>
>   * under sponsorship from the FreeBSD Foundation.
> @@ -59,4 +59,27 @@ extern int iommu_tbl_pagecnt;
>  SYSCTL_DECL(_hw_iommu);
>  SYSCTL_DECL(_hw_iommu_dmar);
>  
> +struct x86_iommu {
> +	void (*domain_unload_entry)(struct iommu_map_entry *entry, bool free,
> +	    bool cansleep);
> +	void (*domain_unload)(struct iommu_domain *iodom,
> +		struct iommu_map_entries_tailq *entries, bool cansleep);
> +	struct iommu_ctx *(*get_ctx)(struct iommu_unit *iommu,
> +	    device_t dev, uint16_t rid, bool id_mapped, bool rmrr_init);
> +	void (*free_ctx_locked)(struct iommu_unit *iommu,
> +	    struct iommu_ctx *context);
> +	void (*free_ctx)(struct iommu_ctx *context);
> +	struct iommu_unit *(*find)(device_t dev, bool verbose);
> +	int (*alloc_msi_intr)(device_t src, u_int *cookies, u_int count);
> +	int (*map_msi_intr)(device_t src, u_int cpu, u_int vector,
> +	    u_int cookie, uint64_t *addr, uint32_t *data);
> +	int (*unmap_msi_intr)(device_t src, u_int cookie);
> +	int (*map_ioapic_intr)(u_int ioapic_id, u_int cpu, u_int vector,
> +	    bool edge, bool activehi, int irq, u_int *cookie, uint32_t *hi,
> +	    uint32_t *lo);
> +	int (*unmap_ioapic_intr)(u_int ioapic_id, u_int *cookie);
> +};
> +void set_x86_iommu(struct x86_iommu *);
> +struct x86_iommu *get_x86_iommu(void);
> +
>  #endif
>

I suspect this commit but could be one of the others that caused this panic 
during intialization. From a serial console log:

Hit [Enter] to boot immediately, or any other key for command prompt.
Booting [/boot/kernel/kernel] in 10 seconds... ^MBooting 
[/boot/kernel/kernel] in 9 seconds... ^MBooting [/boot/kernel/kernel]...    
           ^M
\^HGDB: no debug ports present
KDB: debugger backends: ddb
KDB: current backend: ddb
---<<BOOT>>---
Copyright (c) 1992-2024 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 15.0-CURRENT #60 komquats-n272059-e28ee29d2d13: Wed Sep  4 15:07:36 
PDT 2024
    root@cwsys:/export/obj/opt/src/git-src/amd64.amd64/sys/BREAK amd64
FreeBSD clang version 18.1.6 (https://github.com/llvm/llvm-project.git 
llvmorg-18.1.6-0-g1118c2e05e67)
VT(vga): text 80x25
CPU: AMD Processor model unknown (3000.06-MHz K8-class CPU)
  Origin="AuthenticAMD"  Id=0x100f43  Family=0x10  Model=0x4  Stepping=3
  Features=0x178bfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,M
CA,CMOV,PAT,PSE36,CLFLUSH,MMX,FXSR,SSE,SSE2,HTT>
  Features2=0x802009<SSE3,MON,CX16,POPCNT>
  AMD Features=0xee500800<SYSCALL,NX,MMX+,FFXSR,Page1GB,RDTSCP,LM,3DNow!+,3D
Now!>
  AMD Features2=0x37ff<LAHF,CMP,SVM,ExtAPIC,CR8,ABM,SSE4A,MAS,Prefetch,OSVW,
IBS,SKINIT,WDT>
  SVM: NP,NRIP,NAsids=64
  TSC: P-state invariant
real memory  = 8589934592 (8192 MB)
avail memory = 8145883136 (7768 MB)
Event timer "LAPIC" quality 100
ACPI APIC Table: <ATI    ASUSACPI>
FreeBSD/SMP: Multiprocessor System Detected: 4 CPUs
FreeBSD/SMP: 1 package(s) x 4 core(s)
random: unblocking device.
Firmware Warning (ACPI): 32/64X length mismatch in FADT/Pm1aEventBlock: 
32/8 (20230628/tbfadt-748)
Firmware Warning (ACPI): 32/64X length mismatch in FADT/Pm1aControlBlock: 
16/8 (20230628/tbfadt-748)
Firmware Warning (ACPI): 32/64X length mismatch in FADT/PmTimerBlock: 32/8 
(20230628/tbfadt-748)
Firmware Warning (ACPI): 32/64X length mismatch in FADT/Gpe0Block: 64/8 
(20230628/tbfadt-748)
Firmware Warning (ACPI): Invalid length for FADT/Pm1aEventBlock: 8, using 
default 32 (20230628/tbfadt-850)
Firmware Warning (ACPI): Invalid length for FADT/Pm1aControlBlock: 8, using 
default 16 (20230628/tbfadt-850)
Firmware Warning (ACPI): Invalid length for FADT/PmTimerBlock: 8, using 
default 32 (20230628/tbfadt-850)
ioapic0: MADT APIC ID 4 != hw id 0
kernel trap 12 with interrupts disabled


Fatal trap 12: page fault while in kernel mode
cpuid = 0; apic id = 00
fault virtual address   = 0x78
fault code              = supervisor read data, page not present
instruction pointer     = 0x20:0xffffffff80a2c48b
stack pointer           = 0x28:0xffffffff81f05e90
frame pointer           = 0x28:0xffffffff81f05e90
code segment            = base 0x0, limit 0xfffff, type 0x1b
                        = DPL 0, pres 1, long 1, def32 0, gran 1
processor eflags        = resume, IOPL = 0
current process         = 0 (swapper)
rdi: 0000000000000004 rsi: 0000000000000000 rdx: 0000000000000000
rcx: 0000000000000001  r8: 0000000000000001  r9: 00000000ffffffff
rax: 0000000000000000 rbx: fffff800fec00000 rbp: ffffffff81f05e90
r10: 0000000000000000 r11: 00000000fff5cfdf r12: 0000000000000010
r13: fffff800033aa8ec r14: fffff800033aa8e4 r15: 0000000000000000
trap number             = 12
panic: page fault
cpuid = 0
time = 1
KDB: stack backtrace:
db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 
0xffffffff81f05b80
vpanic() at vpanic+0x13f/frame 0xffffffff81f05cb0
panic() at panic+0x43/frame 0xffffffff81f05d10
trap_fatal() at trap_fatal+0x40b/frame 0xffffffff81f05d70
trap_pfault() at trap_pfault+0x46/frame 0xffffffff81f05dc0
calltrap() at calltrap+0x8/frame 0xffffffff81f05dc0
--- trap 0xc, rip = 0xffffffff80a2c48b, rsp = 0xffffffff81f05e90, rbp = 
0xffffffff81f05e90 ---
iommu_map_ioapic_intr() at iommu_map_ioapic_intr+0xb/frame 
0xffffffff81f05e90
ioapic_create() at ioapic_create+0x460/frame 0xffffffff81f05f20
madt_parse_apics() at madt_parse_apics+0x51/frame 0xffffffff81f05f40
acpi_walk_subtables() at acpi_walk_subtables+0x31/frame 0xffffffff81f05f70
madt_setup_io() at madt_setup_io+0x62/frame 0xffffffff81f05f90
apic_setup_io() at apic_setup_io+0x24/frame 0xffffffff81f05fa0
mi_startup() at mi_startup+0x1c8/frame 0xffffffff81f05ff0
Uptime: 1s
Automatic reboot in 15 seconds - press a key on the console to abort
--> Press a key on the console to reboot,
--> or switch off the system now.
Rebooting...


-- 
Cheers,
Cy Schubert <Cy.Schubert@cschubert.com>
FreeBSD UNIX:  <cy@FreeBSD.org>   Web:  https://FreeBSD.org
NTP:           <cy@nwtime.org>    Web:  https://nwtime.org

			e^(i*pi)+1=0