arch_init.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /*
  2. * QEMU System Emulator
  3. *
  4. * Copyright (c) 2003-2008 Fabrice Bellard
  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. #include "qemu/osdep.h"
  25. #include "qemu-common.h"
  26. #include "cpu.h"
  27. #include "sysemu/sysemu.h"
  28. #include "sysemu/arch_init.h"
  29. #include "hw/pci/pci.h"
  30. #include "hw/audio/audio.h"
  31. #include "qemu/config-file.h"
  32. #include "qemu/error-report.h"
  33. #include "qmp-commands.h"
  34. #include "hw/acpi/acpi.h"
  35. #include "qemu/help_option.h"
  36. #ifdef TARGET_SPARC
  37. int graphic_width = 1024;
  38. int graphic_height = 768;
  39. int graphic_depth = 8;
  40. #else
  41. int graphic_width = 800;
  42. int graphic_height = 600;
  43. int graphic_depth = 32;
  44. #endif
  45. #if defined(TARGET_ALPHA)
  46. #define QEMU_ARCH QEMU_ARCH_ALPHA
  47. #elif defined(TARGET_ARM)
  48. #define QEMU_ARCH QEMU_ARCH_ARM
  49. #elif defined(TARGET_CRIS)
  50. #define QEMU_ARCH QEMU_ARCH_CRIS
  51. #elif defined(TARGET_I386)
  52. #define QEMU_ARCH QEMU_ARCH_I386
  53. #elif defined(TARGET_M68K)
  54. #define QEMU_ARCH QEMU_ARCH_M68K
  55. #elif defined(TARGET_LM32)
  56. #define QEMU_ARCH QEMU_ARCH_LM32
  57. #elif defined(TARGET_MICROBLAZE)
  58. #define QEMU_ARCH QEMU_ARCH_MICROBLAZE
  59. #elif defined(TARGET_MIPS)
  60. #define QEMU_ARCH QEMU_ARCH_MIPS
  61. #elif defined(TARGET_MOXIE)
  62. #define QEMU_ARCH QEMU_ARCH_MOXIE
  63. #elif defined(TARGET_NIOS2)
  64. #define QEMU_ARCH QEMU_ARCH_NIOS2
  65. #elif defined(TARGET_OPENRISC)
  66. #define QEMU_ARCH QEMU_ARCH_OPENRISC
  67. #elif defined(TARGET_PPC)
  68. #define QEMU_ARCH QEMU_ARCH_PPC
  69. #elif defined(TARGET_S390X)
  70. #define QEMU_ARCH QEMU_ARCH_S390X
  71. #elif defined(TARGET_SH4)
  72. #define QEMU_ARCH QEMU_ARCH_SH4
  73. #elif defined(TARGET_SPARC)
  74. #define QEMU_ARCH QEMU_ARCH_SPARC
  75. #elif defined(TARGET_XTENSA)
  76. #define QEMU_ARCH QEMU_ARCH_XTENSA
  77. #elif defined(TARGET_UNICORE32)
  78. #define QEMU_ARCH QEMU_ARCH_UNICORE32
  79. #elif defined(TARGET_TRICORE)
  80. #define QEMU_ARCH QEMU_ARCH_TRICORE
  81. #endif
  82. const uint32_t arch_type = QEMU_ARCH;
  83. struct soundhw {
  84. const char *name;
  85. const char *descr;
  86. int enabled;
  87. int isa;
  88. union {
  89. int (*init_isa) (ISABus *bus);
  90. int (*init_pci) (PCIBus *bus);
  91. } init;
  92. };
  93. static struct soundhw soundhw[9];
  94. static int soundhw_count;
  95. void isa_register_soundhw(const char *name, const char *descr,
  96. int (*init_isa)(ISABus *bus))
  97. {
  98. assert(soundhw_count < ARRAY_SIZE(soundhw) - 1);
  99. soundhw[soundhw_count].name = name;
  100. soundhw[soundhw_count].descr = descr;
  101. soundhw[soundhw_count].isa = 1;
  102. soundhw[soundhw_count].init.init_isa = init_isa;
  103. soundhw_count++;
  104. }
  105. void pci_register_soundhw(const char *name, const char *descr,
  106. int (*init_pci)(PCIBus *bus))
  107. {
  108. assert(soundhw_count < ARRAY_SIZE(soundhw) - 1);
  109. soundhw[soundhw_count].name = name;
  110. soundhw[soundhw_count].descr = descr;
  111. soundhw[soundhw_count].isa = 0;
  112. soundhw[soundhw_count].init.init_pci = init_pci;
  113. soundhw_count++;
  114. }
  115. void select_soundhw(const char *optarg)
  116. {
  117. struct soundhw *c;
  118. if (is_help_option(optarg)) {
  119. show_valid_cards:
  120. if (soundhw_count) {
  121. printf("Valid sound card names (comma separated):\n");
  122. for (c = soundhw; c->name; ++c) {
  123. printf ("%-11s %s\n", c->name, c->descr);
  124. }
  125. printf("\n-soundhw all will enable all of the above\n");
  126. } else {
  127. printf("Machine has no user-selectable audio hardware "
  128. "(it may or may not have always-present audio hardware).\n");
  129. }
  130. exit(!is_help_option(optarg));
  131. }
  132. else {
  133. size_t l;
  134. const char *p;
  135. char *e;
  136. int bad_card = 0;
  137. if (!strcmp(optarg, "all")) {
  138. for (c = soundhw; c->name; ++c) {
  139. c->enabled = 1;
  140. }
  141. return;
  142. }
  143. p = optarg;
  144. while (*p) {
  145. e = strchr(p, ',');
  146. l = !e ? strlen(p) : (size_t) (e - p);
  147. for (c = soundhw; c->name; ++c) {
  148. if (!strncmp(c->name, p, l) && !c->name[l]) {
  149. c->enabled = 1;
  150. break;
  151. }
  152. }
  153. if (!c->name) {
  154. if (l > 80) {
  155. error_report("Unknown sound card name (too big to show)");
  156. }
  157. else {
  158. error_report("Unknown sound card name `%.*s'",
  159. (int) l, p);
  160. }
  161. bad_card = 1;
  162. }
  163. p += l + (e != NULL);
  164. }
  165. if (bad_card) {
  166. goto show_valid_cards;
  167. }
  168. }
  169. }
  170. void audio_init(void)
  171. {
  172. struct soundhw *c;
  173. ISABus *isa_bus = (ISABus *) object_resolve_path_type("", TYPE_ISA_BUS, NULL);
  174. PCIBus *pci_bus = (PCIBus *) object_resolve_path_type("", TYPE_PCI_BUS, NULL);
  175. for (c = soundhw; c->name; ++c) {
  176. if (c->enabled) {
  177. if (c->isa) {
  178. if (!isa_bus) {
  179. error_report("ISA bus not available for %s", c->name);
  180. exit(1);
  181. }
  182. c->init.init_isa(isa_bus);
  183. } else {
  184. if (!pci_bus) {
  185. error_report("PCI bus not available for %s", c->name);
  186. exit(1);
  187. }
  188. c->init.init_pci(pci_bus);
  189. }
  190. }
  191. }
  192. }
  193. int kvm_available(void)
  194. {
  195. #ifdef CONFIG_KVM
  196. return 1;
  197. #else
  198. return 0;
  199. #endif
  200. }
  201. int xen_available(void)
  202. {
  203. #ifdef CONFIG_XEN
  204. return 1;
  205. #else
  206. return 0;
  207. #endif
  208. }
  209. TargetInfo *qmp_query_target(Error **errp)
  210. {
  211. TargetInfo *info = g_malloc0(sizeof(*info));
  212. info->arch = g_strdup(TARGET_NAME);
  213. return info;
  214. }