2
0

qdev-monitor.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617
  1. /*
  2. * Dynamic device configuration and creation.
  3. *
  4. * Copyright (c) 2009 CodeSourcery
  5. *
  6. * This library is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2 of the License, or (at your option) any later version.
  10. *
  11. * This library is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #include "qdev.h"
  20. #include "monitor/monitor.h"
  21. #include "qmp-commands.h"
  22. #include "arch_init.h"
  23. #include "qemu-config.h"
  24. /*
  25. * Aliases were a bad idea from the start. Let's keep them
  26. * from spreading further.
  27. */
  28. typedef struct QDevAlias
  29. {
  30. const char *typename;
  31. const char *alias;
  32. uint32_t arch_mask;
  33. } QDevAlias;
  34. static const QDevAlias qdev_alias_table[] = {
  35. { "virtio-blk-pci", "virtio-blk", QEMU_ARCH_ALL & ~QEMU_ARCH_S390X },
  36. { "virtio-net-pci", "virtio-net", QEMU_ARCH_ALL & ~QEMU_ARCH_S390X },
  37. { "virtio-serial-pci", "virtio-serial", QEMU_ARCH_ALL & ~QEMU_ARCH_S390X },
  38. { "virtio-balloon-pci", "virtio-balloon",
  39. QEMU_ARCH_ALL & ~QEMU_ARCH_S390X },
  40. { "virtio-blk-s390", "virtio-blk", QEMU_ARCH_S390X },
  41. { "virtio-net-s390", "virtio-net", QEMU_ARCH_S390X },
  42. { "virtio-serial-s390", "virtio-serial", QEMU_ARCH_S390X },
  43. { "lsi53c895a", "lsi" },
  44. { "ich9-ahci", "ahci" },
  45. { "kvm-pci-assign", "pci-assign" },
  46. { }
  47. };
  48. static const char *qdev_class_get_alias(DeviceClass *dc)
  49. {
  50. const char *typename = object_class_get_name(OBJECT_CLASS(dc));
  51. int i;
  52. for (i = 0; qdev_alias_table[i].typename; i++) {
  53. if (qdev_alias_table[i].arch_mask &&
  54. !(qdev_alias_table[i].arch_mask & arch_type)) {
  55. continue;
  56. }
  57. if (strcmp(qdev_alias_table[i].typename, typename) == 0) {
  58. return qdev_alias_table[i].alias;
  59. }
  60. }
  61. return NULL;
  62. }
  63. static bool qdev_class_has_alias(DeviceClass *dc)
  64. {
  65. return (qdev_class_get_alias(dc) != NULL);
  66. }
  67. static void qdev_print_devinfo(ObjectClass *klass, void *opaque)
  68. {
  69. DeviceClass *dc;
  70. bool *show_no_user = opaque;
  71. dc = (DeviceClass *)object_class_dynamic_cast(klass, TYPE_DEVICE);
  72. if (!dc || (show_no_user && !*show_no_user && dc->no_user)) {
  73. return;
  74. }
  75. error_printf("name \"%s\"", object_class_get_name(klass));
  76. if (dc->bus_type) {
  77. error_printf(", bus %s", dc->bus_type);
  78. }
  79. if (qdev_class_has_alias(dc)) {
  80. error_printf(", alias \"%s\"", qdev_class_get_alias(dc));
  81. }
  82. if (dc->desc) {
  83. error_printf(", desc \"%s\"", dc->desc);
  84. }
  85. if (dc->no_user) {
  86. error_printf(", no-user");
  87. }
  88. error_printf("\n");
  89. }
  90. static int set_property(const char *name, const char *value, void *opaque)
  91. {
  92. DeviceState *dev = opaque;
  93. if (strcmp(name, "driver") == 0)
  94. return 0;
  95. if (strcmp(name, "bus") == 0)
  96. return 0;
  97. if (qdev_prop_parse(dev, name, value) == -1) {
  98. return -1;
  99. }
  100. return 0;
  101. }
  102. static const char *find_typename_by_alias(const char *alias)
  103. {
  104. int i;
  105. for (i = 0; qdev_alias_table[i].alias; i++) {
  106. if (qdev_alias_table[i].arch_mask &&
  107. !(qdev_alias_table[i].arch_mask & arch_type)) {
  108. continue;
  109. }
  110. if (strcmp(qdev_alias_table[i].alias, alias) == 0) {
  111. return qdev_alias_table[i].typename;
  112. }
  113. }
  114. return NULL;
  115. }
  116. int qdev_device_help(QemuOpts *opts)
  117. {
  118. const char *driver;
  119. Property *prop;
  120. ObjectClass *klass;
  121. driver = qemu_opt_get(opts, "driver");
  122. if (driver && is_help_option(driver)) {
  123. bool show_no_user = false;
  124. object_class_foreach(qdev_print_devinfo, TYPE_DEVICE, false, &show_no_user);
  125. return 1;
  126. }
  127. if (!driver || !qemu_opt_has_help_opt(opts)) {
  128. return 0;
  129. }
  130. klass = object_class_by_name(driver);
  131. if (!klass) {
  132. const char *typename = find_typename_by_alias(driver);
  133. if (typename) {
  134. driver = typename;
  135. klass = object_class_by_name(driver);
  136. }
  137. }
  138. if (!klass) {
  139. return 0;
  140. }
  141. do {
  142. for (prop = DEVICE_CLASS(klass)->props; prop && prop->name; prop++) {
  143. /*
  144. * TODO Properties without a parser are just for dirty hacks.
  145. * qdev_prop_ptr is the only such PropertyInfo. It's marked
  146. * for removal. This conditional should be removed along with
  147. * it.
  148. */
  149. if (!prop->info->set) {
  150. continue; /* no way to set it, don't show */
  151. }
  152. error_printf("%s.%s=%s\n", driver, prop->name,
  153. prop->info->legacy_name ?: prop->info->name);
  154. }
  155. klass = object_class_get_parent(klass);
  156. } while (klass != object_class_by_name(TYPE_DEVICE));
  157. return 1;
  158. }
  159. static Object *qdev_get_peripheral(void)
  160. {
  161. static Object *dev;
  162. if (dev == NULL) {
  163. dev = container_get(qdev_get_machine(), "/peripheral");
  164. }
  165. return dev;
  166. }
  167. static Object *qdev_get_peripheral_anon(void)
  168. {
  169. static Object *dev;
  170. if (dev == NULL) {
  171. dev = container_get(qdev_get_machine(), "/peripheral-anon");
  172. }
  173. return dev;
  174. }
  175. static void qbus_list_bus(DeviceState *dev)
  176. {
  177. BusState *child;
  178. const char *sep = " ";
  179. error_printf("child busses at \"%s\":",
  180. dev->id ? dev->id : object_get_typename(OBJECT(dev)));
  181. QLIST_FOREACH(child, &dev->child_bus, sibling) {
  182. error_printf("%s\"%s\"", sep, child->name);
  183. sep = ", ";
  184. }
  185. error_printf("\n");
  186. }
  187. static void qbus_list_dev(BusState *bus)
  188. {
  189. BusChild *kid;
  190. const char *sep = " ";
  191. error_printf("devices at \"%s\":", bus->name);
  192. QTAILQ_FOREACH(kid, &bus->children, sibling) {
  193. DeviceState *dev = kid->child;
  194. error_printf("%s\"%s\"", sep, object_get_typename(OBJECT(dev)));
  195. if (dev->id)
  196. error_printf("/\"%s\"", dev->id);
  197. sep = ", ";
  198. }
  199. error_printf("\n");
  200. }
  201. static BusState *qbus_find_bus(DeviceState *dev, char *elem)
  202. {
  203. BusState *child;
  204. QLIST_FOREACH(child, &dev->child_bus, sibling) {
  205. if (strcmp(child->name, elem) == 0) {
  206. return child;
  207. }
  208. }
  209. return NULL;
  210. }
  211. static DeviceState *qbus_find_dev(BusState *bus, char *elem)
  212. {
  213. BusChild *kid;
  214. /*
  215. * try to match in order:
  216. * (1) instance id, if present
  217. * (2) driver name
  218. * (3) driver alias, if present
  219. */
  220. QTAILQ_FOREACH(kid, &bus->children, sibling) {
  221. DeviceState *dev = kid->child;
  222. if (dev->id && strcmp(dev->id, elem) == 0) {
  223. return dev;
  224. }
  225. }
  226. QTAILQ_FOREACH(kid, &bus->children, sibling) {
  227. DeviceState *dev = kid->child;
  228. if (strcmp(object_get_typename(OBJECT(dev)), elem) == 0) {
  229. return dev;
  230. }
  231. }
  232. QTAILQ_FOREACH(kid, &bus->children, sibling) {
  233. DeviceState *dev = kid->child;
  234. DeviceClass *dc = DEVICE_GET_CLASS(dev);
  235. if (qdev_class_has_alias(dc) &&
  236. strcmp(qdev_class_get_alias(dc), elem) == 0) {
  237. return dev;
  238. }
  239. }
  240. return NULL;
  241. }
  242. static BusState *qbus_find_recursive(BusState *bus, const char *name,
  243. const char *bus_typename)
  244. {
  245. BusChild *kid;
  246. BusState *child, *ret;
  247. int match = 1;
  248. if (name && (strcmp(bus->name, name) != 0)) {
  249. match = 0;
  250. }
  251. if (bus_typename && !object_dynamic_cast(OBJECT(bus), bus_typename)) {
  252. match = 0;
  253. }
  254. if (match) {
  255. return bus;
  256. }
  257. QTAILQ_FOREACH(kid, &bus->children, sibling) {
  258. DeviceState *dev = kid->child;
  259. QLIST_FOREACH(child, &dev->child_bus, sibling) {
  260. ret = qbus_find_recursive(child, name, bus_typename);
  261. if (ret) {
  262. return ret;
  263. }
  264. }
  265. }
  266. return NULL;
  267. }
  268. static BusState *qbus_find(const char *path)
  269. {
  270. DeviceState *dev;
  271. BusState *bus;
  272. char elem[128];
  273. int pos, len;
  274. /* find start element */
  275. if (path[0] == '/') {
  276. bus = sysbus_get_default();
  277. pos = 0;
  278. } else {
  279. if (sscanf(path, "%127[^/]%n", elem, &len) != 1) {
  280. assert(!path[0]);
  281. elem[0] = len = 0;
  282. }
  283. bus = qbus_find_recursive(sysbus_get_default(), elem, NULL);
  284. if (!bus) {
  285. qerror_report(QERR_BUS_NOT_FOUND, elem);
  286. return NULL;
  287. }
  288. pos = len;
  289. }
  290. for (;;) {
  291. assert(path[pos] == '/' || !path[pos]);
  292. while (path[pos] == '/') {
  293. pos++;
  294. }
  295. if (path[pos] == '\0') {
  296. return bus;
  297. }
  298. /* find device */
  299. if (sscanf(path+pos, "%127[^/]%n", elem, &len) != 1) {
  300. assert(0);
  301. elem[0] = len = 0;
  302. }
  303. pos += len;
  304. dev = qbus_find_dev(bus, elem);
  305. if (!dev) {
  306. qerror_report(QERR_DEVICE_NOT_FOUND, elem);
  307. if (!monitor_cur_is_qmp()) {
  308. qbus_list_dev(bus);
  309. }
  310. return NULL;
  311. }
  312. assert(path[pos] == '/' || !path[pos]);
  313. while (path[pos] == '/') {
  314. pos++;
  315. }
  316. if (path[pos] == '\0') {
  317. /* last specified element is a device. If it has exactly
  318. * one child bus accept it nevertheless */
  319. switch (dev->num_child_bus) {
  320. case 0:
  321. qerror_report(QERR_DEVICE_NO_BUS, elem);
  322. return NULL;
  323. case 1:
  324. return QLIST_FIRST(&dev->child_bus);
  325. default:
  326. qerror_report(QERR_DEVICE_MULTIPLE_BUSSES, elem);
  327. if (!monitor_cur_is_qmp()) {
  328. qbus_list_bus(dev);
  329. }
  330. return NULL;
  331. }
  332. }
  333. /* find bus */
  334. if (sscanf(path+pos, "%127[^/]%n", elem, &len) != 1) {
  335. assert(0);
  336. elem[0] = len = 0;
  337. }
  338. pos += len;
  339. bus = qbus_find_bus(dev, elem);
  340. if (!bus) {
  341. qerror_report(QERR_BUS_NOT_FOUND, elem);
  342. if (!monitor_cur_is_qmp()) {
  343. qbus_list_bus(dev);
  344. }
  345. return NULL;
  346. }
  347. }
  348. }
  349. DeviceState *qdev_device_add(QemuOpts *opts)
  350. {
  351. ObjectClass *obj;
  352. DeviceClass *k;
  353. const char *driver, *path, *id;
  354. DeviceState *qdev;
  355. BusState *bus;
  356. driver = qemu_opt_get(opts, "driver");
  357. if (!driver) {
  358. qerror_report(QERR_MISSING_PARAMETER, "driver");
  359. return NULL;
  360. }
  361. /* find driver */
  362. obj = object_class_by_name(driver);
  363. if (!obj) {
  364. const char *typename = find_typename_by_alias(driver);
  365. if (typename) {
  366. driver = typename;
  367. obj = object_class_by_name(driver);
  368. }
  369. }
  370. if (!obj) {
  371. qerror_report(QERR_INVALID_PARAMETER_VALUE, "driver", "device type");
  372. return NULL;
  373. }
  374. k = DEVICE_CLASS(obj);
  375. /* find bus */
  376. path = qemu_opt_get(opts, "bus");
  377. if (path != NULL) {
  378. bus = qbus_find(path);
  379. if (!bus) {
  380. return NULL;
  381. }
  382. if (!object_dynamic_cast(OBJECT(bus), k->bus_type)) {
  383. qerror_report(QERR_BAD_BUS_FOR_DEVICE,
  384. driver, object_get_typename(OBJECT(bus)));
  385. return NULL;
  386. }
  387. } else {
  388. bus = qbus_find_recursive(sysbus_get_default(), NULL, k->bus_type);
  389. if (!bus) {
  390. qerror_report(QERR_NO_BUS_FOR_DEVICE,
  391. k->bus_type, driver);
  392. return NULL;
  393. }
  394. }
  395. if (qdev_hotplug && !bus->allow_hotplug) {
  396. qerror_report(QERR_BUS_NO_HOTPLUG, bus->name);
  397. return NULL;
  398. }
  399. if (!bus) {
  400. bus = sysbus_get_default();
  401. }
  402. /* create device, set properties */
  403. qdev = DEVICE(object_new(driver));
  404. qdev_set_parent_bus(qdev, bus);
  405. id = qemu_opts_id(opts);
  406. if (id) {
  407. qdev->id = id;
  408. }
  409. if (qemu_opt_foreach(opts, set_property, qdev, 1) != 0) {
  410. qdev_free(qdev);
  411. return NULL;
  412. }
  413. if (qdev->id) {
  414. object_property_add_child(qdev_get_peripheral(), qdev->id,
  415. OBJECT(qdev), NULL);
  416. } else {
  417. static int anon_count;
  418. gchar *name = g_strdup_printf("device[%d]", anon_count++);
  419. object_property_add_child(qdev_get_peripheral_anon(), name,
  420. OBJECT(qdev), NULL);
  421. g_free(name);
  422. }
  423. if (qdev_init(qdev) < 0) {
  424. qerror_report(QERR_DEVICE_INIT_FAILED, driver);
  425. return NULL;
  426. }
  427. qdev->opts = opts;
  428. return qdev;
  429. }
  430. #define qdev_printf(fmt, ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__)
  431. static void qbus_print(Monitor *mon, BusState *bus, int indent);
  432. static void qdev_print_props(Monitor *mon, DeviceState *dev, Property *props,
  433. int indent)
  434. {
  435. if (!props)
  436. return;
  437. for (; props->name; props++) {
  438. Error *err = NULL;
  439. char *value;
  440. char *legacy_name = g_strdup_printf("legacy-%s", props->name);
  441. if (object_property_get_type(OBJECT(dev), legacy_name, NULL)) {
  442. value = object_property_get_str(OBJECT(dev), legacy_name, &err);
  443. } else {
  444. value = object_property_print(OBJECT(dev), props->name, &err);
  445. }
  446. g_free(legacy_name);
  447. if (err) {
  448. error_free(err);
  449. continue;
  450. }
  451. qdev_printf("%s = %s\n", props->name,
  452. value && *value ? value : "<null>");
  453. g_free(value);
  454. }
  455. }
  456. static void bus_print_dev(BusState *bus, Monitor *mon, DeviceState *dev, int indent)
  457. {
  458. BusClass *bc = BUS_GET_CLASS(bus);
  459. if (bc->print_dev) {
  460. bc->print_dev(mon, dev, indent);
  461. }
  462. }
  463. static void qdev_print(Monitor *mon, DeviceState *dev, int indent)
  464. {
  465. ObjectClass *class;
  466. BusState *child;
  467. qdev_printf("dev: %s, id \"%s\"\n", object_get_typename(OBJECT(dev)),
  468. dev->id ? dev->id : "");
  469. indent += 2;
  470. if (dev->num_gpio_in) {
  471. qdev_printf("gpio-in %d\n", dev->num_gpio_in);
  472. }
  473. if (dev->num_gpio_out) {
  474. qdev_printf("gpio-out %d\n", dev->num_gpio_out);
  475. }
  476. class = object_get_class(OBJECT(dev));
  477. do {
  478. qdev_print_props(mon, dev, DEVICE_CLASS(class)->props, indent);
  479. class = object_class_get_parent(class);
  480. } while (class != object_class_by_name(TYPE_DEVICE));
  481. bus_print_dev(dev->parent_bus, mon, dev, indent);
  482. QLIST_FOREACH(child, &dev->child_bus, sibling) {
  483. qbus_print(mon, child, indent);
  484. }
  485. }
  486. static void qbus_print(Monitor *mon, BusState *bus, int indent)
  487. {
  488. BusChild *kid;
  489. qdev_printf("bus: %s\n", bus->name);
  490. indent += 2;
  491. qdev_printf("type %s\n", object_get_typename(OBJECT(bus)));
  492. QTAILQ_FOREACH(kid, &bus->children, sibling) {
  493. DeviceState *dev = kid->child;
  494. qdev_print(mon, dev, indent);
  495. }
  496. }
  497. #undef qdev_printf
  498. void do_info_qtree(Monitor *mon)
  499. {
  500. if (sysbus_get_default())
  501. qbus_print(mon, sysbus_get_default(), 0);
  502. }
  503. void do_info_qdm(Monitor *mon)
  504. {
  505. object_class_foreach(qdev_print_devinfo, TYPE_DEVICE, false, NULL);
  506. }
  507. int do_device_add(Monitor *mon, const QDict *qdict, QObject **ret_data)
  508. {
  509. Error *local_err = NULL;
  510. QemuOpts *opts;
  511. opts = qemu_opts_from_qdict(qemu_find_opts("device"), qdict, &local_err);
  512. if (error_is_set(&local_err)) {
  513. qerror_report_err(local_err);
  514. error_free(local_err);
  515. return -1;
  516. }
  517. if (!monitor_cur_is_qmp() && qdev_device_help(opts)) {
  518. qemu_opts_del(opts);
  519. return 0;
  520. }
  521. if (!qdev_device_add(opts)) {
  522. qemu_opts_del(opts);
  523. return -1;
  524. }
  525. return 0;
  526. }
  527. void qmp_device_del(const char *id, Error **errp)
  528. {
  529. DeviceState *dev;
  530. dev = qdev_find_recursive(sysbus_get_default(), id);
  531. if (NULL == dev) {
  532. error_set(errp, QERR_DEVICE_NOT_FOUND, id);
  533. return;
  534. }
  535. qdev_unplug(dev, errp);
  536. }
  537. void qdev_machine_init(void)
  538. {
  539. qdev_get_peripheral_anon();
  540. qdev_get_peripheral();
  541. }