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

fifo32.h (4234B)


      1/*
      2 * Generic FIFO32 component, based on FIFO8.
      3 *
      4 * Copyright (c) 2016 Jean-Christophe Dubois
      5 *
      6 * This program is free software; you can redistribute it and/or
      7 * modify it under the terms of the GNU General Public License
      8 * as published by the Free Software Foundation; either version
      9 * 2 of the License, or (at your option) any later version.
     10 *
     11 * You should have received a copy of the GNU General Public License along
     12 * with this program; if not, see <http://www.gnu.org/licenses/>.
     13 */
     14
     15#ifndef FIFO32_H
     16#define FIFO32_H
     17
     18#include "qemu/fifo8.h"
     19
     20typedef struct {
     21    Fifo8 fifo;
     22} Fifo32;
     23
     24/**
     25 * fifo32_create:
     26 * @fifo: struct Fifo32 to initialise with new FIFO
     27 * @capacity: capacity of the newly created FIFO expressed in 32 bit words
     28 *
     29 * Create a FIFO of the specified size. Clients should call fifo32_destroy()
     30 * when finished using the fifo. The FIFO is initially empty.
     31 */
     32
     33static inline void fifo32_create(Fifo32 *fifo, uint32_t capacity)
     34{
     35    fifo8_create(&fifo->fifo, capacity * sizeof(uint32_t));
     36}
     37
     38/**
     39 * fifo32_destroy:
     40 * @fifo: FIFO to cleanup
     41 *
     42 * Cleanup a FIFO created with fifo32_create(). Frees memory created for FIFO
     43 * storage. The FIFO is no longer usable after this has been called.
     44 */
     45
     46static inline void fifo32_destroy(Fifo32 *fifo)
     47{
     48    fifo8_destroy(&fifo->fifo);
     49}
     50
     51/**
     52 * fifo32_num_free:
     53 * @fifo: FIFO to check
     54 *
     55 * Return the number of free uint32_t slots in the FIFO.
     56 *
     57 * Returns: Number of free 32 bit words.
     58 */
     59
     60static inline uint32_t fifo32_num_free(Fifo32 *fifo)
     61{
     62    return DIV_ROUND_UP(fifo8_num_free(&fifo->fifo), sizeof(uint32_t));
     63}
     64
     65/**
     66 * fifo32_num_used:
     67 * @fifo: FIFO to check
     68 *
     69 * Return the number of used uint32_t slots in the FIFO.
     70 *
     71 * Returns: Number of used 32 bit words.
     72 */
     73
     74static inline uint32_t fifo32_num_used(Fifo32 *fifo)
     75{
     76    return DIV_ROUND_UP(fifo8_num_used(&fifo->fifo), sizeof(uint32_t));
     77}
     78
     79/**
     80 * fifo32_push:
     81 * @fifo: FIFO to push to
     82 * @data: 32 bits data word to push
     83 *
     84 * Push a 32 bits data word to the FIFO. Behaviour is undefined if the FIFO
     85 * is full. Clients are responsible for checking for fullness using
     86 * fifo32_is_full().
     87 */
     88
     89static inline void fifo32_push(Fifo32 *fifo, uint32_t data)
     90{
     91    int i;
     92
     93    for (i = 0; i < sizeof(data); i++) {
     94        fifo8_push(&fifo->fifo, data & 0xff);
     95        data >>= 8;
     96    }
     97}
     98
     99/**
    100 * fifo32_push_all:
    101 * @fifo: FIFO to push to
    102 * @data: data to push
    103 * @size: number of 32 bit words to push
    104 *
    105 * Push a 32 bit word array to the FIFO. Behaviour is undefined if the FIFO
    106 * is full. Clients are responsible for checking the space left in the FIFO
    107 * using fifo32_num_free().
    108 */
    109
    110static inline void fifo32_push_all(Fifo32 *fifo, const uint32_t *data,
    111                                   uint32_t num)
    112{
    113    int i;
    114
    115    for (i = 0; i < num; i++) {
    116        fifo32_push(fifo, data[i]);
    117    }
    118}
    119
    120/**
    121 * fifo32_pop:
    122 * @fifo: fifo to pop from
    123 *
    124 * Pop a 32 bits data word from the FIFO. Behaviour is undefined if the FIFO
    125 * is empty. Clients are responsible for checking for emptiness using
    126 * fifo32_is_empty().
    127 *
    128 * Returns: The popped 32 bits data word.
    129 */
    130
    131static inline uint32_t fifo32_pop(Fifo32 *fifo)
    132{
    133    uint32_t ret = 0;
    134    int i;
    135
    136    for (i = 0; i < sizeof(uint32_t); i++) {
    137        ret |= (fifo8_pop(&fifo->fifo) << (i * 8));
    138    }
    139
    140    return ret;
    141}
    142
    143/**
    144 * There is no fifo32_pop_buf() because the data is not stored in the buffer
    145 * as a set of native-order words.
    146 */
    147
    148/**
    149 * fifo32_reset:
    150 * @fifo: FIFO to reset
    151 *
    152 * Reset a FIFO. All data is discarded and the FIFO is emptied.
    153 */
    154
    155static inline void fifo32_reset(Fifo32 *fifo)
    156{
    157    fifo8_reset(&fifo->fifo);
    158}
    159
    160/**
    161 * fifo32_is_empty:
    162 * @fifo: FIFO to check
    163 *
    164 * Check if a FIFO is empty.
    165 *
    166 * Returns: True if the fifo is empty, false otherwise.
    167 */
    168
    169static inline bool fifo32_is_empty(Fifo32 *fifo)
    170{
    171    return fifo8_is_empty(&fifo->fifo);
    172}
    173
    174/**
    175 * fifo32_is_full:
    176 * @fifo: FIFO to check
    177 *
    178 * Check if a FIFO is full.
    179 *
    180 * Returns: True if the fifo is full, false otherwise.
    181 */
    182
    183static inline bool fifo32_is_full(Fifo32 *fifo)
    184{
    185    return fifo8_num_free(&fifo->fifo) < sizeof(uint32_t);
    186}
    187
    188#define VMSTATE_FIFO32(_field, _state) VMSTATE_FIFO8(_field.fifo, _state)
    189
    190#endif /* FIFO32_H */