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

ap-bridge.c (2157B)


      1/*
      2 * ap bridge
      3 *
      4 * Copyright 2018 IBM Corp.
      5 *
      6 * This work is licensed under the terms of the GNU GPL, version 2 or (at
      7 * your option) any later version. See the COPYING file in the top-level
      8 * directory.
      9 */
     10
     11#include "qemu/osdep.h"
     12#include "qapi/error.h"
     13#include "hw/sysbus.h"
     14#include "qemu/bitops.h"
     15#include "qemu/module.h"
     16#include "hw/s390x/ap-bridge.h"
     17#include "cpu.h"
     18
     19static char *ap_bus_get_dev_path(DeviceState *dev)
     20{
     21    /* at most one */
     22    return g_strdup_printf("/1");
     23}
     24
     25static void ap_bus_class_init(ObjectClass *oc, void *data)
     26{
     27    BusClass *k = BUS_CLASS(oc);
     28
     29    k->get_dev_path = ap_bus_get_dev_path;
     30    /* More than one ap device does not make sense */
     31    k->max_dev = 1;
     32}
     33
     34static const TypeInfo ap_bus_info = {
     35    .name = TYPE_AP_BUS,
     36    .parent = TYPE_BUS,
     37    .instance_size = 0,
     38    .class_init = ap_bus_class_init,
     39};
     40
     41void s390_init_ap(void)
     42{
     43    DeviceState *dev;
     44    BusState *bus;
     45
     46    /* If no AP instructions then no need for AP bridge */
     47    if (!s390_has_feat(S390_FEAT_AP)) {
     48        return;
     49    }
     50
     51    /* Create bridge device */
     52    dev = qdev_new(TYPE_AP_BRIDGE);
     53    object_property_add_child(qdev_get_machine(), TYPE_AP_BRIDGE,
     54                              OBJECT(dev));
     55    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
     56
     57    /* Create bus on bridge device */
     58    bus = qbus_new(TYPE_AP_BUS, dev, TYPE_AP_BUS);
     59
     60    /* Enable hotplugging */
     61    qbus_set_hotplug_handler(bus, OBJECT(dev));
     62 }
     63
     64static void ap_bridge_class_init(ObjectClass *oc, void *data)
     65{
     66    DeviceClass *dc = DEVICE_CLASS(oc);
     67    HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
     68
     69    hc->unplug = qdev_simple_device_unplug_cb;
     70    set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
     71}
     72
     73static const TypeInfo ap_bridge_info = {
     74    .name          = TYPE_AP_BRIDGE,
     75    .parent        = TYPE_SYS_BUS_DEVICE,
     76    .instance_size = 0,
     77    .class_init    = ap_bridge_class_init,
     78    .interfaces = (InterfaceInfo[]) {
     79        { TYPE_HOTPLUG_HANDLER },
     80        { }
     81    }
     82};
     83
     84static void ap_register(void)
     85{
     86    type_register_static(&ap_bridge_info);
     87    type_register_static(&ap_bus_info);
     88}
     89
     90type_init(ap_register)