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

stellaris_input.c (2412B)


      1/*
      2 * Gamepad style buttons connected to IRQ/GPIO lines
      3 *
      4 * Copyright (c) 2007 CodeSourcery.
      5 * Written by Paul Brook
      6 *
      7 * This code is licensed under the GPL.
      8 */
      9
     10#include "qemu/osdep.h"
     11#include "hw/input/gamepad.h"
     12#include "hw/irq.h"
     13#include "migration/vmstate.h"
     14#include "ui/console.h"
     15
     16typedef struct {
     17    qemu_irq irq;
     18    int keycode;
     19    uint8_t pressed;
     20} gamepad_button;
     21
     22typedef struct {
     23    gamepad_button *buttons;
     24    int num_buttons;
     25    int extension;
     26} gamepad_state;
     27
     28static void stellaris_gamepad_put_key(void * opaque, int keycode)
     29{
     30    gamepad_state *s = (gamepad_state *)opaque;
     31    int i;
     32    int down;
     33
     34    if (keycode == 0xe0 && !s->extension) {
     35        s->extension = 0x80;
     36        return;
     37    }
     38
     39    down = (keycode & 0x80) == 0;
     40    keycode = (keycode & 0x7f) | s->extension;
     41
     42    for (i = 0; i < s->num_buttons; i++) {
     43        if (s->buttons[i].keycode == keycode
     44                && s->buttons[i].pressed != down) {
     45            s->buttons[i].pressed = down;
     46            qemu_set_irq(s->buttons[i].irq, down);
     47        }
     48    }
     49
     50    s->extension = 0;
     51}
     52
     53static const VMStateDescription vmstate_stellaris_button = {
     54    .name = "stellaris_button",
     55    .version_id = 0,
     56    .minimum_version_id = 0,
     57    .fields = (VMStateField[]) {
     58        VMSTATE_UINT8(pressed, gamepad_button),
     59        VMSTATE_END_OF_LIST()
     60    }
     61};
     62
     63static const VMStateDescription vmstate_stellaris_gamepad = {
     64    .name = "stellaris_gamepad",
     65    .version_id = 2,
     66    .minimum_version_id = 2,
     67    .fields = (VMStateField[]) {
     68        VMSTATE_INT32(extension, gamepad_state),
     69        VMSTATE_STRUCT_VARRAY_POINTER_INT32(buttons, gamepad_state,
     70                                            num_buttons,
     71                                            vmstate_stellaris_button,
     72                                            gamepad_button),
     73        VMSTATE_END_OF_LIST()
     74    }
     75};
     76
     77/* Returns an array of 5 output slots.  */
     78void stellaris_gamepad_init(int n, qemu_irq *irq, const int *keycode)
     79{
     80    gamepad_state *s;
     81    int i;
     82
     83    s = g_new0(gamepad_state, 1);
     84    s->buttons = g_new0(gamepad_button, n);
     85    for (i = 0; i < n; i++) {
     86        s->buttons[i].irq = irq[i];
     87        s->buttons[i].keycode = keycode[i];
     88    }
     89    s->num_buttons = n;
     90    qemu_add_kbd_event_handler(stellaris_gamepad_put_key, s);
     91    vmstate_register(NULL, VMSTATE_INSTANCE_ID_ANY,
     92                     &vmstate_stellaris_gamepad, s);
     93}