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

qmp-registry.c (2254B)


      1/*
      2 * Core Definitions for QAPI/QMP Dispatch
      3 *
      4 * Copyright IBM, Corp. 2011
      5 *
      6 * Authors:
      7 *  Anthony Liguori   <aliguori@us.ibm.com>
      8 *  Michael Roth      <mdroth@us.ibm.com>
      9 *
     10 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
     11 * See the COPYING.LIB file in the top-level directory.
     12 *
     13 */
     14
     15#include "qemu/osdep.h"
     16#include "qapi/qmp/dispatch.h"
     17
     18void qmp_register_command(QmpCommandList *cmds, const char *name,
     19                          QmpCommandFunc *fn, QmpCommandOptions options)
     20{
     21    QmpCommand *cmd = g_malloc0(sizeof(*cmd));
     22
     23    /* QCO_COROUTINE and QCO_ALLOW_OOB are incompatible for now */
     24    assert(!((options & QCO_COROUTINE) && (options & QCO_ALLOW_OOB)));
     25
     26    cmd->name = name;
     27    cmd->fn = fn;
     28    cmd->enabled = true;
     29    cmd->options = options;
     30    QTAILQ_INSERT_TAIL(cmds, cmd, node);
     31}
     32
     33const QmpCommand *qmp_find_command(const QmpCommandList *cmds, const char *name)
     34{
     35    QmpCommand *cmd;
     36
     37    QTAILQ_FOREACH(cmd, cmds, node) {
     38        if (strcmp(cmd->name, name) == 0) {
     39            return cmd;
     40        }
     41    }
     42    return NULL;
     43}
     44
     45static void qmp_toggle_command(QmpCommandList *cmds, const char *name,
     46                               bool enabled, const char *disable_reason)
     47{
     48    QmpCommand *cmd;
     49
     50    QTAILQ_FOREACH(cmd, cmds, node) {
     51        if (strcmp(cmd->name, name) == 0) {
     52            cmd->enabled = enabled;
     53            cmd->disable_reason = disable_reason;
     54            return;
     55        }
     56    }
     57}
     58
     59void qmp_disable_command(QmpCommandList *cmds, const char *name,
     60                         const char *disable_reason)
     61{
     62    qmp_toggle_command(cmds, name, false, disable_reason);
     63}
     64
     65void qmp_enable_command(QmpCommandList *cmds, const char *name)
     66{
     67    qmp_toggle_command(cmds, name, true, NULL);
     68}
     69
     70bool qmp_command_is_enabled(const QmpCommand *cmd)
     71{
     72    return cmd->enabled;
     73}
     74
     75const char *qmp_command_name(const QmpCommand *cmd)
     76{
     77    return cmd->name;
     78}
     79
     80bool qmp_has_success_response(const QmpCommand *cmd)
     81{
     82    return !(cmd->options & QCO_NO_SUCCESS_RESP);
     83}
     84
     85void qmp_for_each_command(const QmpCommandList *cmds, qmp_cmd_callback_fn fn,
     86                          void *opaque)
     87{
     88    const QmpCommand *cmd;
     89
     90    QTAILQ_FOREACH(cmd, cmds, node) {
     91        fn(cmd, opaque);
     92    }
     93}