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

sse-counter.h (3271B)


      1/*
      2 * Arm SSE Subsystem System Counter
      3 *
      4 * Copyright (c) 2020 Linaro Limited
      5 * Written by Peter Maydell
      6 *
      7 * This program is free software; you can redistribute it and/or modify
      8 * it under the terms of the GNU General Public License version 2 or
      9 * (at your option) any later version.
     10 */
     11
     12/*
     13 * This is a model of the "System counter" which is documented in
     14 * the Arm SSE-123 Example Subsystem Technical Reference Manual:
     15 * https://developer.arm.com/documentation/101370/latest/
     16 *
     17 * QEMU interface:
     18 *  + Clock input "CLK": clock
     19 *  + sysbus MMIO region 0: the control register frame
     20 *  + sysbus MMIO region 1: the status register frame
     21 *
     22 * Consumers of the system counter's timestamp, such as the SSE
     23 * System Timer device, can also use the APIs sse_counter_for_timestamp(),
     24 * sse_counter_tick_to_time() and sse_counter_register_consumer() to
     25 * interact with an instance of the System Counter. Generally the
     26 * consumer device should have a QOM link property which the board
     27 * code can set to the appropriate instance of the system counter.
     28 */
     29
     30#ifndef SSE_COUNTER_H
     31#define SSE_COUNTER_H
     32
     33#include "hw/sysbus.h"
     34#include "qom/object.h"
     35#include "qemu/notify.h"
     36
     37#define TYPE_SSE_COUNTER "sse-counter"
     38OBJECT_DECLARE_SIMPLE_TYPE(SSECounter, SSE_COUNTER)
     39
     40struct SSECounter {
     41    /*< private >*/
     42    SysBusDevice parent_obj;
     43
     44    /*< public >*/
     45    MemoryRegion control_mr;
     46    MemoryRegion status_mr;
     47    Clock *clk;
     48    NotifierList notifier_list;
     49
     50    uint32_t cntcr;
     51    uint32_t cntscr0;
     52
     53    /*
     54     * These are used for handling clock frequency changes: they are a
     55     * tuple of (QEMU_CLOCK_VIRTUAL timestamp, CNTCV at that time),
     56     * taken when the clock frequency changes. sse_cntcv() needs them
     57     * to calculate the current CNTCV.
     58     */
     59    uint64_t ns_then;
     60    uint64_t ticks_then;
     61};
     62
     63/*
     64 * These functions are the interface by which a consumer of
     65 * the system timestamp (such as the SSE system timer device)
     66 * can communicate with the SSECounter.
     67 */
     68
     69/**
     70 * sse_counter_for_timestamp:
     71 * @counter: SSECounter
     72 * @ns: timestamp of QEMU_CLOCK_VIRTUAL in nanoseconds
     73 *
     74 * Returns the value of the timestamp counter at the specified
     75 * point in time (assuming that no changes to scale factor, enable, etc
     76 * happen in the meantime).
     77 */
     78uint64_t sse_counter_for_timestamp(SSECounter *counter, uint64_t ns);
     79
     80/**
     81 * sse_counter_tick_to_time:
     82 * @counter: SSECounter
     83 * @tick: tick value
     84 *
     85 * Returns the time (a QEMU_CLOCK_VIRTUAL timestamp in nanoseconds)
     86 * when the timestamp counter will reach the specified tick count.
     87 * If the counter is not currently running, returns UINT64_MAX.
     88 */
     89uint64_t sse_counter_tick_to_time(SSECounter *counter, uint64_t tick);
     90
     91/**
     92 * sse_counter_register_consumer:
     93 * @counter: SSECounter
     94 * @notifier: Notifier which is notified on counter changes
     95 *
     96 * Registers @notifier with the SSECounter. When the counter's
     97 * configuration changes in a way that might invalidate information
     98 * previously returned via sse_counter_for_timestamp() or
     99 * sse_counter_tick_to_time(), the notifier will be called.
    100 * Devices which consume the timestamp counter can use this as
    101 * a cue to recalculate timer events.
    102 */
    103void sse_counter_register_consumer(SSECounter *counter, Notifier *notifier);
    104
    105#endif