From 8a677ebb8955dbe1b09e755dbb8343a3b8fdddb1 Mon Sep 17 00:00:00 2001 From: Joshua Wise Date: Thu, 25 Sep 2008 21:19:25 -0400 Subject: [PATCH 1/1] Integrate the KBC trap into smi.h. --- aseg/counter.c | 13 +++++-------- aseg/firstrun.c | 7 ++++++- ich2/smi.c | 25 +++++++++++++++++++++++++ include/smi.h | 1 + 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/aseg/counter.c b/aseg/counter.c index 85b73eb..3c22c05 100644 --- a/aseg/counter.c +++ b/aseg/counter.c @@ -60,6 +60,11 @@ void timer_handler(smi_event_t ev) outlog(); } +void kbc_handler(smi_event_t ev) +{ + pci_dump(); +} + void smi_entry(void) { char statstr[512]; @@ -71,14 +76,6 @@ void smi_entry(void) sprintf(statstr, "15-412! %08x %08x", smi_status(), counter); strblit(statstr, 0, 0); - if (inl(0x834) & 0x1000) - { - if (inl(0x844) & 0x1000) /* devact_sts */ - { - pci_dump(); - outl(0x844, 0x1000); /* ack it */ - } - } if (inl(0x840) & 0x1000) { pci_dump(); diff --git a/aseg/firstrun.c b/aseg/firstrun.c index 323f1ab..ec09a82 100644 --- a/aseg/firstrun.c +++ b/aseg/firstrun.c @@ -8,6 +8,7 @@ extern int _bss, _bssend; extern void timer_handler(smi_event_t ev); +extern void kbc_handler(smi_event_t ev); void __firstrun_start() { unsigned char *bp; @@ -29,9 +30,13 @@ void __firstrun_start() { /* Turn on the SMIs we want */ smi_disable(); + smi_register_handler(SMI_EVENT_FAST_TIMER, timer_handler); smi_enable_event(SMI_EVENT_FAST_TIMER); - outb(0x848, ICH2_DEVTRAP_EN_KBC_TRP_EN); + + smi_register_handler(SMI_EVENT_DEVTRAP_KBC, kbc_handler); + smi_enable_event(SMI_EVENT_DEVTRAP_KBC); + smi_enable(); smram_restore_state(smram); diff --git a/ich2/smi.c b/ich2/smi.c index d255615..0a0ddf4 100644 --- a/ich2/smi.c +++ b/ich2/smi.c @@ -129,6 +129,21 @@ void smi_poll() unsigned short mon_smi = inw(_get_PMBASE() + ICH2_PMBASE_MON_SMI); unsigned long devact_sts = inl(_get_PMBASE() + ICH2_PMBASE_DEVACT_STS); unsigned long devtrap_en = inl(_get_PMBASE() + ICH2_PMBASE_DEVTRAP_EN); + + if (devact_sts & ICH2_DEVACT_STS_KBC_ACT_STS) + { + if (_handlers[SMI_EVENT_DEVTRAP_KBC] == SMI_HANDLER_NONE) + output("Unhandled: DEVACT_KBC_ACT_STS"); + else if (_handlers[SMI_EVENT_DEVTRAP_KBC] != SMI_HANDLER_IGNORE) + _handlers[SMI_EVENT_DEVTRAP_KBC](SMI_EVENT_DEVTRAP_KBC); + outl(_get_PMBASE() + ICH2_PMBASE_DEVACT_STS, ICH2_DEVACT_STS_KBC_ACT_STS); + } + + /* Refresh register cache so that we can print unhandleds as needed. */ + mon_smi = inw(_get_PMBASE() + ICH2_PMBASE_MON_SMI); + devact_sts = inl(_get_PMBASE() + ICH2_PMBASE_DEVACT_STS); + devtrap_en = inl(_get_PMBASE() + ICH2_PMBASE_DEVTRAP_EN); + if (((mon_smi & 0x0F00) >> 8) & ((mon_smi & 0xF000) >> 12)) outputf("Unhandled: MON_SMI (%04x)", mon_smi); if (devact_sts & devtrap_en) @@ -185,6 +200,11 @@ int smi_enable_event(smi_event_t ev) inl(_get_PMBASE() + ICH2_PMBASE_SMI_EN) | ICH2_SMI_EN_SWSMI_TMR_EN); return 0; + case SMI_EVENT_DEVTRAP_KBC: + outl(_get_PMBASE() + ICH2_PMBASE_DEVTRAP_EN, + inl(_get_PMBASE() + ICH2_PMBASE_DEVTRAP_EN) | + ICH2_DEVTRAP_EN_KBC_TRP_EN); + return 0; default: return -1; } @@ -199,6 +219,11 @@ int smi_disable_event(smi_event_t ev) inl(_get_PMBASE() + ICH2_PMBASE_SMI_EN) & ~ICH2_SMI_EN_SWSMI_TMR_EN); return 0; + case SMI_EVENT_DEVTRAP_KBC: + outl(_get_PMBASE() + ICH2_PMBASE_DEVTRAP_EN, + inl(_get_PMBASE() + ICH2_PMBASE_DEVTRAP_EN) & + ~ICH2_DEVTRAP_EN_KBC_TRP_EN); + return 0; default: return -1; } diff --git a/include/smi.h b/include/smi.h index 670dc63..e0fd0a0 100644 --- a/include/smi.h +++ b/include/smi.h @@ -9,6 +9,7 @@ extern unsigned long smi_status(); /* Architecturally defined; for debugging onl typedef enum { SMI_EVENT_FAST_TIMER = 0, + SMI_EVENT_DEVTRAP_KBC, SMI_EVENT_MAX } smi_event_t; -- 2.43.0