Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Jan 2026 19:09:43 +0000
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: dfc4186c6dcf - main - x86 lapic: Dump LVTs from the ddb show lapic command
Message-ID:  <697275f7.bd4c.5a32280@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=dfc4186c6dcf2986b510fac108784011a236554d

commit dfc4186c6dcf2986b510fac108784011a236554d
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-01-22 18:00:56 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-01-22 19:09:21 +0000

    x86 lapic: Dump LVTs from the ddb show lapic command
    
    Add description for each LVT element, use it in show lapic dump.
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
---
 sys/x86/x86/local_apic.c | 40 ++++++++++++++++++++++++++++++++++------
 1 file changed, 34 insertions(+), 6 deletions(-)

diff --git a/sys/x86/x86/local_apic.c b/sys/x86/x86/local_apic.c
index b444142d5481..c5399984c896 100644
--- a/sys/x86/x86/local_apic.c
+++ b/sys/x86/x86/local_apic.c
@@ -129,6 +129,7 @@ struct lvt {
 	u_int lvt_mode:16;
 	u_int lvt_vector:8;
 	u_int lvt_reg;
+	const char *lvt_desc;
 };
 
 struct lapic {
@@ -158,6 +159,7 @@ static struct lvt lvts[] = {
 		.lvt_mode = APIC_LVT_DM_EXTINT,
 		.lvt_vector = 0,
 		.lvt_reg = LAPIC_LVT_LINT0,
+		.lvt_desc = "LINT0",
 	},
 	/* LINT1: NMI */
 	[APIC_LVT_LINT1] = {
@@ -168,6 +170,7 @@ static struct lvt lvts[] = {
 		.lvt_mode = APIC_LVT_DM_NMI,
 		.lvt_vector = 0,
 		.lvt_reg = LAPIC_LVT_LINT1,
+		.lvt_desc = "LINT1",
 	},
 	[APIC_LVT_TIMER] = {
 		.lvt_edgetrigger = 1,
@@ -177,6 +180,7 @@ static struct lvt lvts[] = {
 		.lvt_mode = APIC_LVT_DM_FIXED,
 		.lvt_vector = APIC_TIMER_INT,
 		.lvt_reg = LAPIC_LVT_TIMER,
+		.lvt_desc = "TIMER",
 	},
 	[APIC_LVT_ERROR] = {
 		.lvt_edgetrigger = 1,
@@ -186,6 +190,7 @@ static struct lvt lvts[] = {
 		.lvt_mode = APIC_LVT_DM_FIXED,
 		.lvt_vector = APIC_ERROR_INT,
 		.lvt_reg = LAPIC_LVT_ERROR,
+		.lvt_desc = "ERROR",
 	},
 	[APIC_LVT_PMC] = {
 		.lvt_edgetrigger = 1,
@@ -195,6 +200,7 @@ static struct lvt lvts[] = {
 		.lvt_mode = APIC_LVT_DM_NMI,
 		.lvt_vector = 0,
 		.lvt_reg = LAPIC_LVT_PCINT,
+		.lvt_desc = "PMC",
 	},
 	[APIC_LVT_THERMAL] = {
 		.lvt_edgetrigger = 1,
@@ -204,6 +210,7 @@ static struct lvt lvts[] = {
 		.lvt_mode = APIC_LVT_DM_FIXED,
 		.lvt_vector = APIC_THERMAL_INT,
 		.lvt_reg = LAPIC_LVT_THERMAL,
+		.lvt_desc = "THERM",
 	},
 	[APIC_LVT_CMCI] = {
 		.lvt_edgetrigger = 1,
@@ -213,6 +220,7 @@ static struct lvt lvts[] = {
 		.lvt_mode = APIC_LVT_DM_FIXED,
 		.lvt_vector = APIC_CMC_INT,
 		.lvt_reg = LAPIC_LVT_CMCI,
+		.lvt_desc = "CMCI",
 	},
 };
 
@@ -226,6 +234,7 @@ static struct lvt elvts[] = {
 		.lvt_mode = APIC_LVT_DM_FIXED,
 		.lvt_vector = 0,
 		.lvt_reg = LAPIC_EXT_LVT0,
+		.lvt_desc = "ELVT0",
 	},
 	[APIC_ELVT_MCA] = {
 		.lvt_edgetrigger = 1,
@@ -235,6 +244,7 @@ static struct lvt elvts[] = {
 		.lvt_mode = APIC_LVT_DM_FIXED,
 		.lvt_vector = APIC_CMC_INT,
 		.lvt_reg = LAPIC_EXT_LVT1,
+		.lvt_desc = "MCA",
 	},
 	[APIC_ELVT_DEI] = {
 		.lvt_edgetrigger = 1,
@@ -244,6 +254,7 @@ static struct lvt elvts[] = {
 		.lvt_mode = APIC_LVT_DM_FIXED,
 		.lvt_vector = 0,
 		.lvt_reg = LAPIC_EXT_LVT2,
+		.lvt_desc = "ELVT2",
 	},
 	[APIC_ELVT_SBI] = {
 		.lvt_edgetrigger = 1,
@@ -253,6 +264,7 @@ static struct lvt elvts[] = {
 		.lvt_mode = APIC_LVT_DM_FIXED,
 		.lvt_vector = 0,
 		.lvt_reg = LAPIC_EXT_LVT3,
+		.lvt_desc = "ELVT3",
 	},
 };
 
@@ -1890,18 +1902,34 @@ dump_mask(const char *prefix, uint32_t v, int base)
 /* Show info from the lapic regs for this CPU. */
 DB_SHOW_COMMAND_FLAGS(lapic, db_show_lapic, DB_CMD_MEMSAFE)
 {
-	uint32_t v;
+	const struct lvt *l;
+	int elvt_count, lvts_count, i;
+	uint32_t v, vr;
 
 	db_printf("lapic ID = %d\n", lapic_id());
 	v = lapic_read32(LAPIC_VERSION);
-	db_printf("version  = %d.%d\n", (v & APIC_VER_VERSION) >> 4,
-	    v & 0xf);
+	db_printf("version  = %d.%d (%#x) \n", (v & APIC_VER_VERSION) >> 4,
+	    v & 0xf, v);
 	db_printf("max LVT  = %d\n", lapic_maxlvt(v));
-	v = lapic_read32(LAPIC_SVR);
-	db_printf("SVR      = %02x (%s)\n", v & APIC_SVR_VECTOR,
-	    v & APIC_SVR_ENABLE ? "enabled" : "disabled");
+	vr = lapic_read32(LAPIC_SVR);
+	db_printf("SVR      = %02x (%s)\n", vr & APIC_SVR_VECTOR,
+	    vr & APIC_SVR_ENABLE ? "enabled" : "disabled");
 	db_printf("TPR      = %02x\n", lapic_read32(LAPIC_TPR));
 
+	lvts_count = min(nitems(lvts), lapic_maxlvt(v) + 1);
+	for (i = 0; i < lvts_count; i++) {
+		l = &lvts[i];
+		db_printf("LVT%d  (reg %#x %-5s) = %#010x\n", i, l->lvt_reg,
+		    l->lvt_desc, lapic_read32(l->lvt_reg));
+	}
+
+	elvt_count = amd_read_elvt_count();
+	for (i = 0; i < elvt_count; i++) {
+		l = &elvts[i];
+		db_printf("ELVT%d (reg %#x %-5s) = %#010x\n", i, l->lvt_reg,
+		    l->lvt_desc, lapic_read32(l->lvt_reg));
+	}
+
 #define dump_field(prefix, regn, index)					\
 	dump_mask(__XSTRING(prefix ## index), 				\
 	    lapic_read32(LAPIC_ ## regn ## index),			\


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?697275f7.bd4c.5a32280>