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

aml-build.h (15543B)


      1#ifndef HW_ACPI_AML_BUILD_H
      2#define HW_ACPI_AML_BUILD_H
      3
      4#include "hw/acpi/acpi-defs.h"
      5#include "hw/acpi/bios-linker-loader.h"
      6
      7#define ACPI_BUILD_APPNAME6 "BOCHS "
      8#define ACPI_BUILD_APPNAME8 "BXPC    "
      9
     10#define ACPI_BUILD_TABLE_FILE "etc/acpi/tables"
     11#define ACPI_BUILD_RSDP_FILE "etc/acpi/rsdp"
     12#define ACPI_BUILD_TPMLOG_FILE "etc/tpm/log"
     13#define ACPI_BUILD_LOADER_FILE "etc/table-loader"
     14
     15#define AML_NOTIFY_METHOD "NTFY"
     16
     17typedef enum {
     18    AML_NO_OPCODE = 0,/* has only data */
     19    AML_OPCODE,       /* has opcode optionally followed by data */
     20    AML_PACKAGE,      /* has opcode and uses PkgLength for its length */
     21    AML_EXT_PACKAGE,  /* Same as AML_PACKAGE but also has 'ExOpPrefix' */
     22    AML_BUFFER,       /* data encoded as 'DefBuffer' */
     23    AML_RES_TEMPLATE, /* encoded as ResourceTemplate macro */
     24} AmlBlockFlags;
     25
     26struct Aml {
     27    GArray *buf;
     28
     29    /*< private >*/
     30    uint8_t op;
     31    AmlBlockFlags block_flags;
     32};
     33
     34typedef enum {
     35    AML_COMPATIBILITY = 0,
     36    AML_TYPEA = 1,
     37    AML_TYPEB = 2,
     38    AML_TYPEF = 3,
     39} AmlDmaType;
     40
     41typedef enum {
     42    AML_NOTBUSMASTER = 0,
     43    AML_BUSMASTER = 1,
     44} AmlDmaBusMaster;
     45
     46typedef enum {
     47    AML_TRANSFER8 = 0,
     48    AML_TRANSFER8_16 = 1,
     49    AML_TRANSFER16 = 2,
     50} AmlTransferSize;
     51
     52typedef enum {
     53    AML_DECODE10 = 0,
     54    AML_DECODE16 = 1,
     55} AmlIODecode;
     56
     57typedef enum {
     58    AML_ANY_ACC = 0,
     59    AML_BYTE_ACC = 1,
     60    AML_WORD_ACC = 2,
     61    AML_DWORD_ACC = 3,
     62    AML_QWORD_ACC = 4,
     63    AML_BUFFER_ACC = 5,
     64} AmlAccessType;
     65
     66typedef enum {
     67    AML_NOLOCK = 0,
     68    AML_LOCK = 1,
     69} AmlLockRule;
     70
     71typedef enum {
     72    AML_PRESERVE = 0,
     73    AML_WRITE_AS_ONES = 1,
     74    AML_WRITE_AS_ZEROS = 2,
     75} AmlUpdateRule;
     76
     77typedef enum {
     78    AML_AS_SYSTEM_MEMORY = 0X00,
     79    AML_AS_SYSTEM_IO = 0X01,
     80    AML_AS_PCI_CONFIG = 0X02,
     81    AML_AS_EMBEDDED_CTRL = 0X03,
     82    AML_AS_SMBUS = 0X04,
     83    AML_AS_FFH = 0X7F,
     84} AmlAddressSpace;
     85
     86typedef enum {
     87    AML_SYSTEM_MEMORY = 0X00,
     88    AML_SYSTEM_IO = 0X01,
     89    AML_PCI_CONFIG = 0X02,
     90} AmlRegionSpace;
     91
     92typedef enum {
     93    AML_MEMORY_RANGE = 0,
     94    AML_IO_RANGE = 1,
     95    AML_BUS_NUMBER_RANGE = 2,
     96} AmlResourceType;
     97
     98typedef enum {
     99    AML_SUB_DECODE = 1 << 1,
    100    AML_POS_DECODE = 0
    101} AmlDecode;
    102
    103typedef enum {
    104    AML_MAX_FIXED = 1 << 3,
    105    AML_MAX_NOT_FIXED = 0,
    106} AmlMaxFixed;
    107
    108typedef enum {
    109    AML_MIN_FIXED = 1 << 2,
    110    AML_MIN_NOT_FIXED = 0
    111} AmlMinFixed;
    112
    113/*
    114 * ACPI 1.0b: Table 6-26 I/O Resource Flag (Resource Type = 1) Definitions
    115 * _RNG field definition
    116 */
    117typedef enum {
    118    AML_ISA_ONLY = 1,
    119    AML_NON_ISA_ONLY = 2,
    120    AML_ENTIRE_RANGE = 3,
    121} AmlISARanges;
    122
    123/*
    124 * ACPI 1.0b: Table 6-25 Memory Resource Flag (Resource Type = 0) Definitions
    125 * _MEM field definition
    126 */
    127typedef enum {
    128    AML_NON_CACHEABLE = 0,
    129    AML_CACHEABLE = 1,
    130    AML_WRITE_COMBINING = 2,
    131    AML_PREFETCHABLE = 3,
    132} AmlCacheable;
    133
    134/*
    135 * ACPI 1.0b: Table 6-25 Memory Resource Flag (Resource Type = 0) Definitions
    136 * _RW field definition
    137 */
    138typedef enum {
    139    AML_READ_ONLY = 0,
    140    AML_READ_WRITE = 1,
    141} AmlReadAndWrite;
    142
    143/*
    144 * ACPI 5.0: Table 6-187 Extended Interrupt Descriptor Definition
    145 * Interrupt Vector Flags Bits[0] Consumer/Producer
    146 */
    147typedef enum {
    148    AML_CONSUMER_PRODUCER = 0,
    149    AML_CONSUMER = 1,
    150} AmlConsumerAndProducer;
    151
    152/*
    153 * ACPI 5.0: Table 6-187 Extended Interrupt Descriptor Definition
    154 * _HE field definition
    155 */
    156typedef enum {
    157    AML_LEVEL = 0,
    158    AML_EDGE = 1,
    159} AmlLevelAndEdge;
    160
    161/*
    162 * ACPI 5.0: Table 6-187 Extended Interrupt Descriptor Definition
    163 * _LL field definition
    164 */
    165typedef enum {
    166    AML_ACTIVE_HIGH = 0,
    167    AML_ACTIVE_LOW = 1,
    168} AmlActiveHighAndLow;
    169
    170/*
    171 * ACPI 5.0: Table 6-187 Extended Interrupt Descriptor Definition
    172 * _SHR field definition
    173 */
    174typedef enum {
    175    AML_EXCLUSIVE = 0,
    176    AML_SHARED = 1,
    177    AML_EXCLUSIVE_AND_WAKE = 2,
    178    AML_SHARED_AND_WAKE = 3,
    179} AmlShared;
    180
    181/* ACPI 1.0b: 16.2.5.2 Named Objects Encoding: MethodFlags */
    182typedef enum {
    183    AML_NOTSERIALIZED = 0,
    184    AML_SERIALIZED = 1,
    185} AmlSerializeFlag;
    186
    187/*
    188 * ACPI 5.0: Table 6-189 GPIO Connection Descriptor Definition
    189 * GPIO Connection Type
    190 */
    191typedef enum {
    192    AML_INTERRUPT_CONNECTION = 0,
    193    AML_IO_CONNECTION = 1,
    194} AmlGpioConnectionType;
    195
    196/*
    197 * ACPI 5.0: Table 6-189 GPIO Connection Descriptor Definition
    198 * _PPI field definition
    199 */
    200typedef enum {
    201    AML_PULL_DEFAULT = 0,
    202    AML_PULL_UP = 1,
    203    AML_PULL_DOWN = 2,
    204    AML_PULL_NONE = 3,
    205} AmlPinConfig;
    206
    207typedef enum {
    208    MEM_AFFINITY_NOFLAGS      = 0,
    209    MEM_AFFINITY_ENABLED      = (1 << 0),
    210    MEM_AFFINITY_HOTPLUGGABLE = (1 << 1),
    211    MEM_AFFINITY_NON_VOLATILE = (1 << 2),
    212} MemoryAffinityFlags;
    213
    214typedef
    215struct AcpiBuildTables {
    216    GArray *table_data;
    217    GArray *rsdp;
    218    GArray *tcpalog;
    219    GArray *vmgenid;
    220    GArray *hardware_errors;
    221    BIOSLinker *linker;
    222} AcpiBuildTables;
    223
    224typedef
    225struct CrsRangeEntry {
    226    uint64_t base;
    227    uint64_t limit;
    228} CrsRangeEntry;
    229
    230typedef
    231struct CrsRangeSet {
    232    GPtrArray *io_ranges;
    233    GPtrArray *mem_ranges;
    234    GPtrArray *mem_64bit_ranges;
    235} CrsRangeSet;
    236
    237
    238/*
    239 * ACPI 5.0: 6.4.3.8.2 Serial Bus Connection Descriptors
    240 * Serial Bus Type
    241 */
    242#define AML_SERIAL_BUS_TYPE_I2C  1
    243#define AML_SERIAL_BUS_TYPE_SPI  2
    244#define AML_SERIAL_BUS_TYPE_UART 3
    245
    246/*
    247 * ACPI 5.0: 6.4.3.8.2 Serial Bus Connection Descriptors
    248 * General Flags
    249 */
    250/* Slave Mode */
    251#define AML_SERIAL_BUS_FLAG_MASTER_DEVICE       (1 << 0)
    252/* Consumer/Producer */
    253#define AML_SERIAL_BUS_FLAG_CONSUME_ONLY        (1 << 1)
    254
    255/**
    256 * init_aml_allocator:
    257 *
    258 * Called for initializing API allocator which allow to use
    259 * AML API.
    260 * Returns: toplevel container which accumulates all other
    261 * AML elements for a table.
    262 */
    263Aml *init_aml_allocator(void);
    264
    265/**
    266 * free_aml_allocator:
    267 *
    268 * Releases all elements used by AML API, frees associated memory
    269 * and invalidates AML allocator. After this call @init_aml_allocator
    270 * should be called again if AML API is to be used again.
    271 */
    272void free_aml_allocator(void);
    273
    274/**
    275 * aml_append:
    276 * @parent_ctx: context to which @child element is added
    277 * @child: element that is copied into @parent_ctx context
    278 *
    279 * Joins Aml elements together and helps to construct AML tables
    280 * Examle of usage:
    281 *   Aml *table = aml_def_block("SSDT", ...);
    282 *   Aml *sb = aml_scope("\\_SB");
    283 *   Aml *dev = aml_device("PCI0");
    284 *
    285 *   aml_append(dev, aml_name_decl("HID", aml_eisaid("PNP0A03")));
    286 *   aml_append(sb, dev);
    287 *   aml_append(table, sb);
    288 */
    289void aml_append(Aml *parent_ctx, Aml *child);
    290
    291/* non block AML object primitives */
    292Aml *aml_name(const char *name_format, ...) GCC_FMT_ATTR(1, 2);
    293Aml *aml_name_decl(const char *name, Aml *val);
    294Aml *aml_debug(void);
    295Aml *aml_return(Aml *val);
    296Aml *aml_int(const uint64_t val);
    297Aml *aml_arg(int pos);
    298Aml *aml_to_integer(Aml *arg);
    299Aml *aml_to_hexstring(Aml *src, Aml *dst);
    300Aml *aml_to_buffer(Aml *src, Aml *dst);
    301Aml *aml_to_decimalstring(Aml *src, Aml *dst);
    302Aml *aml_store(Aml *val, Aml *target);
    303Aml *aml_and(Aml *arg1, Aml *arg2, Aml *dst);
    304Aml *aml_or(Aml *arg1, Aml *arg2, Aml *dst);
    305Aml *aml_land(Aml *arg1, Aml *arg2);
    306Aml *aml_lor(Aml *arg1, Aml *arg2);
    307Aml *aml_shiftleft(Aml *arg1, Aml *count);
    308Aml *aml_shiftright(Aml *arg1, Aml *count, Aml *dst);
    309Aml *aml_lless(Aml *arg1, Aml *arg2);
    310Aml *aml_add(Aml *arg1, Aml *arg2, Aml *dst);
    311Aml *aml_subtract(Aml *arg1, Aml *arg2, Aml *dst);
    312Aml *aml_increment(Aml *arg);
    313Aml *aml_decrement(Aml *arg);
    314Aml *aml_index(Aml *arg1, Aml *idx);
    315Aml *aml_notify(Aml *arg1, Aml *arg2);
    316Aml *aml_break(void);
    317Aml *aml_call0(const char *method);
    318Aml *aml_call1(const char *method, Aml *arg1);
    319Aml *aml_call2(const char *method, Aml *arg1, Aml *arg2);
    320Aml *aml_call3(const char *method, Aml *arg1, Aml *arg2, Aml *arg3);
    321Aml *aml_call4(const char *method, Aml *arg1, Aml *arg2, Aml *arg3, Aml *arg4);
    322Aml *aml_call5(const char *method, Aml *arg1, Aml *arg2, Aml *arg3, Aml *arg4,
    323               Aml *arg5);
    324Aml *aml_call6(const char *method, Aml *arg1, Aml *arg2, Aml *arg3, Aml *arg4,
    325               Aml *arg5, Aml *arg6);
    326Aml *aml_gpio_int(AmlConsumerAndProducer con_and_pro,
    327                  AmlLevelAndEdge edge_level,
    328                  AmlActiveHighAndLow active_level, AmlShared shared,
    329                  AmlPinConfig pin_config, uint16_t debounce_timeout,
    330                  const uint32_t pin_list[], uint32_t pin_count,
    331                  const char *resource_source_name,
    332                  const uint8_t *vendor_data, uint16_t vendor_data_len);
    333Aml *aml_memory32_fixed(uint32_t addr, uint32_t size,
    334                        AmlReadAndWrite read_and_write);
    335Aml *aml_interrupt(AmlConsumerAndProducer con_and_pro,
    336                   AmlLevelAndEdge level_and_edge,
    337                   AmlActiveHighAndLow high_and_low, AmlShared shared,
    338                   uint32_t *irq_list, uint8_t irq_count);
    339Aml *aml_io(AmlIODecode dec, uint16_t min_base, uint16_t max_base,
    340            uint8_t aln, uint8_t len);
    341Aml *aml_operation_region(const char *name, AmlRegionSpace rs,
    342                          Aml *offset, uint32_t len);
    343Aml *aml_irq_no_flags(uint8_t irq);
    344Aml *aml_named_field(const char *name, unsigned length);
    345Aml *aml_reserved_field(unsigned length);
    346Aml *aml_local(int num);
    347Aml *aml_string(const char *name_format, ...) GCC_FMT_ATTR(1, 2);
    348Aml *aml_lnot(Aml *arg);
    349Aml *aml_equal(Aml *arg1, Aml *arg2);
    350Aml *aml_lgreater(Aml *arg1, Aml *arg2);
    351Aml *aml_lgreater_equal(Aml *arg1, Aml *arg2);
    352Aml *aml_processor(uint8_t proc_id, uint32_t pblk_addr, uint8_t pblk_len,
    353                   const char *name_format, ...) GCC_FMT_ATTR(4, 5);
    354Aml *aml_eisaid(const char *str);
    355Aml *aml_word_bus_number(AmlMinFixed min_fixed, AmlMaxFixed max_fixed,
    356                         AmlDecode dec, uint16_t addr_gran,
    357                         uint16_t addr_min, uint16_t addr_max,
    358                         uint16_t addr_trans, uint16_t len);
    359Aml *aml_word_io(AmlMinFixed min_fixed, AmlMaxFixed max_fixed,
    360                 AmlDecode dec, AmlISARanges isa_ranges,
    361                 uint16_t addr_gran, uint16_t addr_min,
    362                 uint16_t addr_max, uint16_t addr_trans,
    363                 uint16_t len);
    364Aml *aml_dword_io(AmlMinFixed min_fixed, AmlMaxFixed max_fixed,
    365                 AmlDecode dec, AmlISARanges isa_ranges,
    366                 uint32_t addr_gran, uint32_t addr_min,
    367                 uint32_t addr_max, uint32_t addr_trans,
    368                 uint32_t len);
    369Aml *aml_dword_memory(AmlDecode dec, AmlMinFixed min_fixed,
    370                      AmlMaxFixed max_fixed, AmlCacheable cacheable,
    371                      AmlReadAndWrite read_and_write,
    372                      uint32_t addr_gran, uint32_t addr_min,
    373                      uint32_t addr_max, uint32_t addr_trans,
    374                      uint32_t len);
    375Aml *aml_qword_memory(AmlDecode dec, AmlMinFixed min_fixed,
    376                      AmlMaxFixed max_fixed, AmlCacheable cacheable,
    377                      AmlReadAndWrite read_and_write,
    378                      uint64_t addr_gran, uint64_t addr_min,
    379                      uint64_t addr_max, uint64_t addr_trans,
    380                      uint64_t len);
    381Aml *aml_dma(AmlDmaType typ, AmlDmaBusMaster bm, AmlTransferSize sz,
    382             uint8_t channel);
    383Aml *aml_sleep(uint64_t msec);
    384Aml *aml_i2c_serial_bus_device(uint16_t address, const char *resource_source);
    385
    386/* Block AML object primitives */
    387Aml *aml_scope(const char *name_format, ...) GCC_FMT_ATTR(1, 2);
    388Aml *aml_device(const char *name_format, ...) GCC_FMT_ATTR(1, 2);
    389Aml *aml_method(const char *name, int arg_count, AmlSerializeFlag sflag);
    390Aml *aml_if(Aml *predicate);
    391Aml *aml_else(void);
    392Aml *aml_while(Aml *predicate);
    393Aml *aml_package(uint8_t num_elements);
    394Aml *aml_buffer(int buffer_size, uint8_t *byte_list);
    395Aml *aml_resource_template(void);
    396Aml *aml_field(const char *name, AmlAccessType type, AmlLockRule lock,
    397               AmlUpdateRule rule);
    398Aml *aml_mutex(const char *name, uint8_t sync_level);
    399Aml *aml_acquire(Aml *mutex, uint16_t timeout);
    400Aml *aml_release(Aml *mutex);
    401Aml *aml_alias(const char *source_object, const char *alias_object);
    402Aml *aml_create_field(Aml *srcbuf, Aml *bit_index, Aml *num_bits,
    403                      const char *name);
    404Aml *aml_create_dword_field(Aml *srcbuf, Aml *index, const char *name);
    405Aml *aml_create_qword_field(Aml *srcbuf, Aml *index, const char *name);
    406Aml *aml_varpackage(uint32_t num_elements);
    407Aml *aml_touuid(const char *uuid);
    408Aml *aml_unicode(const char *str);
    409Aml *aml_refof(Aml *arg);
    410Aml *aml_derefof(Aml *arg);
    411Aml *aml_sizeof(Aml *arg);
    412Aml *aml_concatenate(Aml *source1, Aml *source2, Aml *target);
    413Aml *aml_object_type(Aml *object);
    414
    415void build_append_int_noprefix(GArray *table, uint64_t value, int size);
    416
    417typedef struct AcpiTable {
    418    const char *sig;
    419    const uint8_t rev;
    420    const char *oem_id;
    421    const char *oem_table_id;
    422    /* private vars tracking table state */
    423    GArray *array;
    424    unsigned table_offset;
    425} AcpiTable;
    426
    427/**
    428 * acpi_table_begin:
    429 * initializes table header and keeps track of
    430 * table data/offsets
    431 * @desc: ACPI table descriptor
    432 * @array: blob where the ACPI table will be composed/stored.
    433 */
    434void acpi_table_begin(AcpiTable *desc, GArray *array);
    435
    436/**
    437 * acpi_table_end:
    438 * sets actual table length and tells bios loader
    439 * where table is for the later initialization on
    440 * guest side.
    441 * @linker: reference to BIOSLinker object to use for the table
    442 * @table: ACPI table descriptor that was used with @acpi_table_begin
    443 * counterpart
    444 */
    445void acpi_table_end(BIOSLinker *linker, AcpiTable *table);
    446
    447void *acpi_data_push(GArray *table_data, unsigned size);
    448unsigned acpi_data_len(GArray *table);
    449void acpi_add_table(GArray *table_offsets, GArray *table_data);
    450void acpi_build_tables_init(AcpiBuildTables *tables);
    451void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre);
    452void
    453build_rsdp(GArray *tbl, BIOSLinker *linker, AcpiRsdpData *rsdp_data);
    454void
    455build_rsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets,
    456           const char *oem_id, const char *oem_table_id);
    457void
    458build_xsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets,
    459           const char *oem_id, const char *oem_table_id);
    460
    461int
    462build_append_named_dword(GArray *array, const char *name_format, ...)
    463GCC_FMT_ATTR(2, 3);
    464
    465void build_append_gas(GArray *table, AmlAddressSpace as,
    466                      uint8_t bit_width, uint8_t bit_offset,
    467                      uint8_t access_width, uint64_t address);
    468
    469static inline void
    470build_append_gas_from_struct(GArray *table, const struct AcpiGenericAddress *s)
    471{
    472    build_append_gas(table, s->space_id, s->bit_width, s->bit_offset,
    473                     s->access_width, s->address);
    474}
    475
    476void crs_range_insert(GPtrArray *ranges, uint64_t base, uint64_t limit);
    477void crs_replace_with_free_ranges(GPtrArray *ranges,
    478                                         uint64_t start, uint64_t end);
    479void crs_range_set_init(CrsRangeSet *range_set);
    480void crs_range_set_free(CrsRangeSet *range_set);
    481
    482Aml *build_crs(PCIHostState *host, CrsRangeSet *range_set, uint32_t io_offset,
    483               uint32_t mmio32_offset, uint64_t mmio64_offset,
    484               uint16_t bus_nr_offset);
    485
    486void build_srat_memory(GArray *table_data, uint64_t base,
    487                       uint64_t len, int node, MemoryAffinityFlags flags);
    488
    489void build_slit(GArray *table_data, BIOSLinker *linker, MachineState *ms,
    490                const char *oem_id, const char *oem_table_id);
    491
    492void build_fadt(GArray *tbl, BIOSLinker *linker, const AcpiFadtData *f,
    493                const char *oem_id, const char *oem_table_id);
    494
    495void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
    496                const char *oem_id, const char *oem_table_id);
    497#endif