coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
smi_handler.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include <amdblocks/acpimmio.h>
4 #include <console/console.h>
5 #include <amdblocks/smi.h>
6 #include <amdblocks/smm.h>
7 #include <cpu/x86/smm.h>
8 #include <soc/smi.h>
9 
11 {
12  printk(BIOS_WARNING, "SMI event %d is missing handler\n", event);
13 }
14 
15 static void process_smi_sources(uint32_t reg)
16 {
17  const uint32_t status = smi_read32(reg);
18  int bit_zero = 32 / sizeof(uint32_t) * (reg - SMI_REG_SMISTS0);
19  void (*source_handler)(void);
20  int i;
21 
22  for (i = 0 ; i < 32 ; i++) {
23  if (status & (1 << i)) {
24  source_handler = get_smi_source_handler(i + bit_zero);
25  if (source_handler)
26  source_handler();
27  else if (reg != SMI_REG_SMISTS0 || (status & GEVENT_MASK) == 0)
28  mainboard_handle_smi(i + bit_zero);
29  }
30  }
31 
32  if (reg == SMI_REG_SMISTS0)
33  if (status & GEVENT_MASK)
34  /* Gevent[23:0] are assumed to be mainboard-specific */
36 
37  /* Clear all events in this register */
38  smi_write32(reg, status);
39 }
40 
42 {
43  const uint16_t smi_src = smi_read16(SMI_REG_POINTER);
44 
45  if (smi_src & SMI_STATUS_SRC_SCI) {
46  printk(BIOS_WARNING, "Ignoring SCI SMI: %#x\n", smi_read32(SMI_SCI_STATUS));
47 
48  /* Clear events to prevent re-entering SMI if event isn't handled */
50  }
51  if (smi_src & SMI_STATUS_SRC_0)
53  if (smi_src & SMI_STATUS_SRC_1)
55  if (smi_src & SMI_STATUS_SRC_2)
57  if (smi_src & SMI_STATUS_SRC_3)
59  if (smi_src & SMI_STATUS_SRC_4)
61 }
static void smi_write32(uint8_t reg, uint32_t value)
Definition: acpimmio.h:161
static uint32_t smi_read32(uint8_t reg)
Definition: acpimmio.h:146
static uint16_t smi_read16(uint8_t reg)
Definition: acpimmio.h:141
#define printk(level,...)
Definition: stdlib.h:16
void __weak mainboard_smi_gpi(u32 gpi_sts)
Definition: smihandler.c:208
#define BIOS_WARNING
BIOS_WARNING - Bad configuration.
Definition: loglevel.h:86
const struct smm_save_state_ops *legacy_ops __weak
Definition: save_state.c:8
void southbridge_smi_handler(void)
Definition: smi_handler.c:41
static void process_smi_sources(uint32_t reg)
Definition: smi_handler.c:15
__weak void mainboard_handle_smi(int event)
Definition: smi_handler.c:10
#define SMI_STATUS_SRC_SCI
Definition: smi.h:152
#define SMI_STATUS_SRC_4
Definition: smi.h:157
#define SMI_SCI_STATUS
Definition: smi.h:17
#define SMI_STATUS_SRC_1
Definition: smi.h:154
#define GEVENT_MASK
Definition: smi.h:47
#define SMI_REG_POINTER
Definition: smi.h:151
#define SMI_STATUS_SRC_0
Definition: smi.h:153
#define SMI_REG_SMISTS1
Definition: smi.h:146
#define SMI_STATUS_SRC_3
Definition: smi.h:156
#define SMI_REG_SMISTS0
Definition: smi.h:145
#define SMI_STATUS_SRC_2
Definition: smi.h:155
#define SMI_REG_SMISTS4
Definition: smi.h:149
#define SMI_REG_SMISTS3
Definition: smi.h:148
#define SMI_REG_SMISTS2
Definition: smi.h:147
void * get_smi_source_handler(int source)
Definition: smihandler.c:145
void clear_smi_sci_status(void)
Definition: smi_util.c:153
unsigned short uint16_t
Definition: stdint.h:11
unsigned int uint32_t
Definition: stdint.h:14
typedef void(X86APIP X86EMU_intrFuncs)(int num)