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

replay-input.c (3921B)


      1/*
      2 * replay-input.c
      3 *
      4 * Copyright (c) 2010-2015 Institute for System Programming
      5 *                         of the Russian Academy of Sciences.
      6 *
      7 * This work is licensed under the terms of the GNU GPL, version 2 or later.
      8 * See the COPYING file in the top-level directory.
      9 *
     10 */
     11
     12#include "qemu/osdep.h"
     13#include "sysemu/replay.h"
     14#include "replay-internal.h"
     15#include "qemu/notify.h"
     16#include "ui/input.h"
     17#include "qapi/clone-visitor.h"
     18#include "qapi/qapi-visit-ui.h"
     19
     20void replay_save_input_event(InputEvent *evt)
     21{
     22    InputKeyEvent *key;
     23    InputBtnEvent *btn;
     24    InputMoveEvent *move;
     25    replay_put_dword(evt->type);
     26
     27    switch (evt->type) {
     28    case INPUT_EVENT_KIND_KEY:
     29        key = evt->u.key.data;
     30        replay_put_dword(key->key->type);
     31
     32        switch (key->key->type) {
     33        case KEY_VALUE_KIND_NUMBER:
     34            replay_put_qword(key->key->u.number.data);
     35            replay_put_byte(key->down);
     36            break;
     37        case KEY_VALUE_KIND_QCODE:
     38            replay_put_dword(key->key->u.qcode.data);
     39            replay_put_byte(key->down);
     40            break;
     41        case KEY_VALUE_KIND__MAX:
     42            /* keep gcc happy */
     43            break;
     44        }
     45        break;
     46    case INPUT_EVENT_KIND_BTN:
     47        btn = evt->u.btn.data;
     48        replay_put_dword(btn->button);
     49        replay_put_byte(btn->down);
     50        break;
     51    case INPUT_EVENT_KIND_REL:
     52        move = evt->u.rel.data;
     53        replay_put_dword(move->axis);
     54        replay_put_qword(move->value);
     55        break;
     56    case INPUT_EVENT_KIND_ABS:
     57        move = evt->u.abs.data;
     58        replay_put_dword(move->axis);
     59        replay_put_qword(move->value);
     60        break;
     61    case INPUT_EVENT_KIND__MAX:
     62        /* keep gcc happy */
     63        break;
     64    }
     65}
     66
     67InputEvent *replay_read_input_event(void)
     68{
     69    InputEvent evt;
     70    KeyValue keyValue;
     71    InputKeyEvent key;
     72    key.key = &keyValue;
     73    InputBtnEvent btn;
     74    InputMoveEvent rel;
     75    InputMoveEvent abs;
     76
     77    evt.type = replay_get_dword();
     78    switch (evt.type) {
     79    case INPUT_EVENT_KIND_KEY:
     80        evt.u.key.data = &key;
     81        evt.u.key.data->key->type = replay_get_dword();
     82
     83        switch (evt.u.key.data->key->type) {
     84        case KEY_VALUE_KIND_NUMBER:
     85            evt.u.key.data->key->u.number.data = replay_get_qword();
     86            evt.u.key.data->down = replay_get_byte();
     87            break;
     88        case KEY_VALUE_KIND_QCODE:
     89            evt.u.key.data->key->u.qcode.data = (QKeyCode)replay_get_dword();
     90            evt.u.key.data->down = replay_get_byte();
     91            break;
     92        case KEY_VALUE_KIND__MAX:
     93            /* keep gcc happy */
     94            break;
     95        }
     96        break;
     97    case INPUT_EVENT_KIND_BTN:
     98        evt.u.btn.data = &btn;
     99        evt.u.btn.data->button = (InputButton)replay_get_dword();
    100        evt.u.btn.data->down = replay_get_byte();
    101        break;
    102    case INPUT_EVENT_KIND_REL:
    103        evt.u.rel.data = &rel;
    104        evt.u.rel.data->axis = (InputAxis)replay_get_dword();
    105        evt.u.rel.data->value = replay_get_qword();
    106        break;
    107    case INPUT_EVENT_KIND_ABS:
    108        evt.u.abs.data = &abs;
    109        evt.u.abs.data->axis = (InputAxis)replay_get_dword();
    110        evt.u.abs.data->value = replay_get_qword();
    111        break;
    112    case INPUT_EVENT_KIND__MAX:
    113        /* keep gcc happy */
    114        break;
    115    }
    116
    117    return QAPI_CLONE(InputEvent, &evt);
    118}
    119
    120void replay_input_event(QemuConsole *src, InputEvent *evt)
    121{
    122    if (replay_mode == REPLAY_MODE_PLAY) {
    123        /* Nothing */
    124    } else if (replay_mode == REPLAY_MODE_RECORD) {
    125        replay_add_input_event(QAPI_CLONE(InputEvent, evt));
    126    } else {
    127        qemu_input_event_send_impl(src, evt);
    128    }
    129}
    130
    131void replay_input_sync_event(void)
    132{
    133    if (replay_mode == REPLAY_MODE_PLAY) {
    134        /* Nothing */
    135    } else if (replay_mode == REPLAY_MODE_RECORD) {
    136        replay_add_input_sync_event();
    137    } else {
    138        qemu_input_event_sync_impl();
    139    }
    140}