4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / qemu.h H
#ifndef HEADER_QEMU
#define HEADER_QEMU

#include <stdint.h>
#include <pthread.h>

#define NVME_OFFSET_ACQ (0x30)
#define NVME_OFFSET_ASQ (0x28)
#define NVME_OFFSET_AQA (0x24)
#define NVME_OFFSET_CC (0x14)
#define NVME_OFFSET_SQyTDBL (0x1000)

#define HDA_OFFSET_IN0_LVI (0x8c)
#define HDA_OFFSET_IN1_LVI (0xac)
#define HDA_OFFSET_IN2_LVI (0xcc)
#define HDA_OFFSET_IN3_LVI (0xec)
#define HDA_OFFSET_ICH6_REG_GCTL (0x8)
#define HDA_OFFSET_IN0_CTL (0x80)
#define HDA_OFFSET_IN1_CTL (0xa0)
#define HDA_OFFSET_IN2_CTL (0xc0)
#define HDA_OFFSET_IN3_CTL (0xe0)
#define HDA_OFFSET_IN0_BDLPL (0x98)
#define HDA_OFFSET_IN0_BDLPU (0x9c)

#define QEMU_PACKED __attribute__((packed))

typedef struct QEMU_PACKED NvmeSglDescriptor
{
    uint64_t addr;
    uint32_t len;
    uint8_t rsvd[3];
    uint8_t type;
} NvmeSglDescriptor;

typedef union NvmeCmdDptr
{
    struct
    {
        uint64_t prp1;
        uint64_t prp2;
    };

    NvmeSglDescriptor sgl;
} NvmeCmdDptr;

enum NvmePsdt
{
    NVME_PSDT_PRP = 0x0,
    NVME_PSDT_SGL_MPTR_CONTIGUOUS = 0x1,
    NVME_PSDT_SGL_MPTR_SGL = 0x2,
};

typedef struct QEMU_PACKED NvmeCmd
{
    uint8_t opcode;
    uint8_t flags;
    uint16_t cid;
    uint32_t nsid;
    uint64_t res1;
    uint64_t mptr;
    NvmeCmdDptr dptr;
    uint32_t cdw10;
    uint32_t cdw11;
    uint32_t cdw12;
    uint32_t cdw13;
    uint32_t cdw14;
    uint32_t cdw15;
} NvmeCmd;

typedef struct QEMU_PACKED NvmeCqe
{
    uint32_t result;
    uint32_t dw1;
    uint16_t sq_head;
    uint16_t sq_id;
    uint16_t cid;
    uint16_t status;
} NvmeCqe;

typedef enum
{
    QEMU_CLOCK_REALTIME = 0,
    QEMU_CLOCK_VIRTUAL = 1,
    QEMU_CLOCK_HOST = 2,
    QEMU_CLOCK_VIRTUAL_RT = 3,
    QEMU_CLOCK_MAX
} QEMUClockType;

#define QLIST_ENTRY(type)                                             \
    struct                                                            \
    {                                                                 \
        struct type *le_next;  /* next element */                     \
        struct type **le_prev; /* address of previous next element */ \
    }

#define QLIST_HEAD(name, type)                     \
    struct name                                    \
    {                                              \
        struct type *lh_first; /* first element */ \
    }

typedef struct QemuMutex QemuMutex;
struct QemuMutex
{
    pthread_mutex_t lock;
#ifdef CONFIG_DEBUG_MUTEX
    const char *file;
    int line;
#endif
    bool initialized;
};

typedef struct QEMUClock
{
    /* We rely on BQL to protect the timerlists */
    QLIST_HEAD(, QEMUTimerList)
    timerlists;

    QEMUClockType type;
    bool enabled;
} QEMUClock;

typedef struct QemuEvent QemuEvent;
struct QemuEvent
{
    unsigned value;
    bool initialized;
};

/* A QEMUTimerList is a list of timers attached to a clock. More
 * than one QEMUTimerList can be attached to each clock, for instance
 * used by different AioContexts / threads. Each clock also has
 * a list of the QEMUTimerLists associated with it, in order that
 * reenabling the clock can call all the notifiers.
 */
typedef void QEMUTimerListNotifyCB(void *opaque, QEMUClockType type);
typedef struct QEMUTimerList QEMUTimerList;
typedef struct QEMUTimer QEMUTimer;
struct QEMUTimerList
{
    QEMUClock *clock;
    QemuMutex active_timers_lock;
    QEMUTimer *active_timers;
    QLIST_ENTRY(QEMUTimerList)
    list;
    QEMUTimerListNotifyCB *notify_cb;
    void *notify_opaque;

    /* lightweight method to mark the end of timerlist's running */
    QemuEvent timers_done_ev;
};

typedef void QEMUTimerCB(void *opaque);
struct QEMUTimer
{
    int64_t expire_time; /* in nanoseconds */
    QEMUTimerList *timer_list;
    QEMUTimerCB *cb;
    void *opaque;
    QEMUTimer *next;
    int attributes;
    int scale;
};

#endif