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>
