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

ipmi.c (3976B)


      1/*
      2 * QEMU IPMI emulation
      3 *
      4 * Copyright (c) 2015 Corey Minyard, MontaVista Software, LLC
      5 *
      6 * Permission is hereby granted, free of charge, to any person obtaining a copy
      7 * of this software and associated documentation files (the "Software"), to deal
      8 * in the Software without restriction, including without limitation the rights
      9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     10 * copies of the Software, and to permit persons to whom the Software is
     11 * furnished to do so, subject to the following conditions:
     12 *
     13 * The above copyright notice and this permission notice shall be included in
     14 * all copies or substantial portions of the Software.
     15 *
     16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     22 * THE SOFTWARE.
     23 */
     24
     25#include "qemu/osdep.h"
     26#include "hw/ipmi/ipmi.h"
     27#include "hw/qdev-properties.h"
     28#include "qom/object_interfaces.h"
     29#include "sysemu/runstate.h"
     30#include "qapi/error.h"
     31#include "qemu/module.h"
     32#include "hw/nmi.h"
     33
     34static uint32_t ipmi_current_uuid = 1;
     35
     36uint32_t ipmi_next_uuid(void)
     37{
     38    return ipmi_current_uuid++;
     39}
     40
     41static int ipmi_do_hw_op(IPMIInterface *s, enum ipmi_op op, int checkonly)
     42{
     43    switch (op) {
     44    case IPMI_RESET_CHASSIS:
     45        if (checkonly) {
     46            return 0;
     47        }
     48        qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
     49        return 0;
     50
     51    case IPMI_POWEROFF_CHASSIS:
     52        if (checkonly) {
     53            return 0;
     54        }
     55        qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
     56        return 0;
     57
     58    case IPMI_SEND_NMI:
     59        if (checkonly) {
     60            return 0;
     61        }
     62        /* We don't care what CPU we use. */
     63        nmi_monitor_handle(0, NULL);
     64        return 0;
     65
     66    case IPMI_SHUTDOWN_VIA_ACPI_OVERTEMP:
     67        if (checkonly) {
     68            return 0;
     69        }
     70        qemu_system_powerdown_request();
     71        return 0;
     72
     73    case IPMI_POWERCYCLE_CHASSIS:
     74    case IPMI_PULSE_DIAG_IRQ:
     75    case IPMI_POWERON_CHASSIS:
     76    default:
     77        return IPMI_CC_COMMAND_NOT_SUPPORTED;
     78    }
     79}
     80
     81static void ipmi_interface_class_init(ObjectClass *class, void *data)
     82{
     83    IPMIInterfaceClass *ik = IPMI_INTERFACE_CLASS(class);
     84
     85    ik->do_hw_op = ipmi_do_hw_op;
     86}
     87
     88static TypeInfo ipmi_interface_type_info = {
     89    .name = TYPE_IPMI_INTERFACE,
     90    .parent = TYPE_INTERFACE,
     91    .class_size = sizeof(IPMIInterfaceClass),
     92    .class_init = ipmi_interface_class_init,
     93};
     94
     95static void isa_ipmi_bmc_check(const Object *obj, const char *name,
     96                               Object *val, Error **errp)
     97{
     98    IPMIBmc *bmc = IPMI_BMC(val);
     99
    100    if (bmc->intf)
    101        error_setg(errp, "BMC object is already in use");
    102}
    103
    104void ipmi_bmc_find_and_link(Object *obj, Object **bmc)
    105{
    106    object_property_add_link(obj, "bmc", TYPE_IPMI_BMC, bmc,
    107                             isa_ipmi_bmc_check,
    108                             OBJ_PROP_LINK_STRONG);
    109}
    110
    111static Property ipmi_bmc_properties[] = {
    112    DEFINE_PROP_UINT8("slave_addr",  IPMIBmc, slave_addr, 0x20),
    113    DEFINE_PROP_END_OF_LIST(),
    114};
    115
    116static void bmc_class_init(ObjectClass *oc, void *data)
    117{
    118    DeviceClass *dc = DEVICE_CLASS(oc);
    119
    120    device_class_set_props(dc, ipmi_bmc_properties);
    121}
    122
    123static TypeInfo ipmi_bmc_type_info = {
    124    .name = TYPE_IPMI_BMC,
    125    .parent = TYPE_DEVICE,
    126    .instance_size = sizeof(IPMIBmc),
    127    .abstract = true,
    128    .class_size = sizeof(IPMIBmcClass),
    129    .class_init = bmc_class_init,
    130};
    131
    132static void ipmi_register_types(void)
    133{
    134    type_register_static(&ipmi_interface_type_info);
    135    type_register_static(&ipmi_bmc_type_info);
    136}
    137
    138type_init(ipmi_register_types)