cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

generic_event_device.h (3482B)


      1/*
      2 *
      3 * Copyright (c) 2018 Intel Corporation
      4 * Copyright (c) 2019 Huawei Technologies R & D (UK) Ltd
      5 * Written by Samuel Ortiz, Shameer Kolothum
      6 *
      7 * This program is free software; you can redistribute it and/or modify it
      8 * under the terms and conditions of the GNU General Public License,
      9 * version 2 or later, as published by the Free Software Foundation.
     10 *
     11 * The ACPI Generic Event Device (GED) is a hardware-reduced specific
     12 * device[ACPI v6.1 Section 5.6.9] that handles all platform events,
     13 * including the hotplug ones. Generic Event Device allows platforms
     14 * to handle interrupts in ACPI ASL statements. It follows a very
     15 * similar approach like the _EVT method from GPIO events. All
     16 * interrupts are listed in  _CRS and the handler is written in _EVT
     17 * method. Here, we use a single interrupt for the GED device, relying
     18 * on IO memory region to communicate the type of device affected by
     19 * the interrupt. This way, we can support up to 32 events with a
     20 * unique interrupt.
     21 *
     22 * Here is an example.
     23 *
     24 * Device (\_SB.GED)
     25 * {
     26 *     Name (_HID, "ACPI0013")
     27 *     Name (_UID, Zero)
     28 *     Name (_CRS, ResourceTemplate ()
     29 *     {
     30 *         Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, ,, )
     31 *         {
     32 *              0x00000029,
     33 *         }
     34 *     })
     35 *     OperationRegion (EREG, SystemMemory, 0x09080000, 0x04)
     36 *     Field (EREG, DWordAcc, NoLock, WriteAsZeros)
     37 *     {
     38 *         ESEL,   32
     39 *     }
     40 *
     41 *     Method (_EVT, 1, Serialized)  // _EVT: Event
     42 *     {
     43 *         Local0 = ESEL // ESEL = IO memory region which specifies the
     44 *                       // device type.
     45 *         If (((Local0 & One) == One))
     46 *         {
     47 *             MethodEvent1()
     48 *         }
     49 *         If ((Local0 & 0x2) == 0x2)
     50 *         {
     51 *             MethodEvent2()
     52 *         }
     53 *         ...
     54 *     }
     55 * }
     56 *
     57 */
     58
     59#ifndef HW_ACPI_GED_H
     60#define HW_ACPI_GED_H
     61
     62#include "hw/sysbus.h"
     63#include "hw/acpi/memory_hotplug.h"
     64#include "hw/acpi/ghes.h"
     65#include "qom/object.h"
     66
     67#define ACPI_POWER_BUTTON_DEVICE "PWRB"
     68
     69#define TYPE_ACPI_GED "acpi-ged"
     70OBJECT_DECLARE_SIMPLE_TYPE(AcpiGedState, ACPI_GED)
     71
     72#define TYPE_ACPI_GED_X86 "acpi-ged-x86"
     73
     74#define ACPI_GED_EVT_SEL_OFFSET    0x0
     75#define ACPI_GED_EVT_SEL_LEN       0x4
     76
     77#define ACPI_GED_REG_SLEEP_CTL     0x00
     78#define ACPI_GED_REG_SLEEP_STS     0x01
     79#define ACPI_GED_REG_RESET         0x02
     80#define ACPI_GED_REG_COUNT         0x03
     81
     82/* ACPI_GED_REG_RESET value for reset*/
     83#define ACPI_GED_RESET_VALUE       0x42
     84
     85/* ACPI_GED_REG_SLEEP_CTL.SLP_TYP value for S5 (aka poweroff) */
     86#define ACPI_GED_SLP_TYP_S5        0x05
     87
     88#define GED_DEVICE      "GED"
     89#define AML_GED_EVT_REG "EREG"
     90#define AML_GED_EVT_SEL "ESEL"
     91
     92/*
     93 * Platforms need to specify the GED event bitmap
     94 * to describe what kind of events they want to support
     95 * through GED.
     96 */
     97#define ACPI_GED_MEM_HOTPLUG_EVT   0x1
     98#define ACPI_GED_PWR_DOWN_EVT      0x2
     99#define ACPI_GED_NVDIMM_HOTPLUG_EVT 0x4
    100
    101typedef struct GEDState {
    102    MemoryRegion evt;
    103    MemoryRegion regs;
    104    uint32_t     sel;
    105} GEDState;
    106
    107struct AcpiGedState {
    108    SysBusDevice parent_obj;
    109    MemHotplugState memhp_state;
    110    MemoryRegion container_memhp;
    111    GEDState ged_state;
    112    uint32_t ged_event_bitmap;
    113    qemu_irq irq;
    114    AcpiGhesState ghes_state;
    115};
    116
    117void build_ged_aml(Aml *table, const char* name, HotplugHandler *hotplug_dev,
    118                   uint32_t ged_irq, AmlRegionSpace rs, hwaddr ged_base);
    119void acpi_dsdt_add_power_button(Aml *scope);
    120
    121#endif