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

qnum.h (1909B)


      1/*
      2 * QNum Module
      3 *
      4 * Copyright (C) 2009 Red Hat Inc.
      5 *
      6 * Authors:
      7 *  Luiz Capitulino <lcapitulino@redhat.com>
      8 *  Anthony Liguori <aliguori@us.ibm.com>
      9 *  Marc-André Lureau <marcandre.lureau@redhat.com>
     10 *
     11 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
     12 * See the COPYING.LIB file in the top-level directory.
     13 */
     14
     15#ifndef QNUM_H
     16#define QNUM_H
     17
     18#include "qapi/qmp/qobject.h"
     19
     20typedef enum {
     21    QNUM_I64,
     22    QNUM_U64,
     23    QNUM_DOUBLE
     24} QNumKind;
     25
     26/*
     27 * QNum encapsulates how our dialect of JSON fills in the blanks left
     28 * by the JSON specification (RFC 8259) regarding numbers.
     29 *
     30 * Conceptually, we treat number as an abstract type with three
     31 * concrete subtypes: floating-point, signed integer, unsigned
     32 * integer.  QNum implements this as a discriminated union of double,
     33 * int64_t, uint64_t.
     34 *
     35 * The JSON parser picks the subtype as follows.  If the number has a
     36 * decimal point or an exponent, it is floating-point.  Else if it
     37 * fits into int64_t, it's signed integer.  Else if it fits into
     38 * uint64_t, it's unsigned integer.  Else it's floating-point.
     39 *
     40 * Any number can serve as double: qnum_get_double() converts under
     41 * the hood.
     42 *
     43 * An integer can serve as signed / unsigned integer as long as it is
     44 * in range: qnum_get_try_int() / qnum_get_try_uint() check range and
     45 * convert under the hood.
     46 */
     47struct QNum {
     48    struct QObjectBase_ base;
     49    QNumKind kind;
     50    union {
     51        int64_t i64;
     52        uint64_t u64;
     53        double dbl;
     54    } u;
     55};
     56
     57QNum *qnum_from_int(int64_t value);
     58QNum *qnum_from_uint(uint64_t value);
     59QNum *qnum_from_double(double value);
     60
     61bool qnum_get_try_int(const QNum *qn, int64_t *val);
     62int64_t qnum_get_int(const QNum *qn);
     63
     64bool qnum_get_try_uint(const QNum *qn, uint64_t *val);
     65uint64_t qnum_get_uint(const QNum *qn);
     66
     67double qnum_get_double(QNum *qn);
     68
     69char *qnum_to_string(QNum *qn);
     70
     71#endif /* QNUM_H */