xen-hvm.c 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431
  1. /*
  2. * Copyright (C) 2010 Citrix Ltd.
  3. *
  4. * This work is licensed under the terms of the GNU GPL, version 2. See
  5. * the COPYING file in the top-level directory.
  6. *
  7. * Contributions after 2012-01-13 are licensed under the terms of the
  8. * GNU GPL, version 2 or (at your option) any later version.
  9. */
  10. #include "qemu/osdep.h"
  11. #include "cpu.h"
  12. #include "hw/pci/pci.h"
  13. #include "hw/i386/pc.h"
  14. #include "hw/i386/apic-msidef.h"
  15. #include "hw/xen/xen_common.h"
  16. #include "hw/xen/xen_backend.h"
  17. #include "qmp-commands.h"
  18. #include "qemu/error-report.h"
  19. #include "qemu/range.h"
  20. #include "sysemu/xen-mapcache.h"
  21. #include "trace.h"
  22. #include "exec/address-spaces.h"
  23. #include <xen/hvm/ioreq.h>
  24. #include <xen/hvm/params.h>
  25. #include <xen/hvm/e820.h>
  26. //#define DEBUG_XEN_HVM
  27. #ifdef DEBUG_XEN_HVM
  28. #define DPRINTF(fmt, ...) \
  29. do { fprintf(stderr, "xen: " fmt, ## __VA_ARGS__); } while (0)
  30. #else
  31. #define DPRINTF(fmt, ...) \
  32. do { } while (0)
  33. #endif
  34. static MemoryRegion ram_memory, ram_640k, ram_lo, ram_hi;
  35. static MemoryRegion *framebuffer;
  36. static bool xen_in_migration;
  37. /* Compatibility with older version */
  38. /* This allows QEMU to build on a system that has Xen 4.5 or earlier
  39. * installed. This here (not in hw/xen/xen_common.h) because xen/hvm/ioreq.h
  40. * needs to be included before this block and hw/xen/xen_common.h needs to
  41. * be included before xen/hvm/ioreq.h
  42. */
  43. #ifndef IOREQ_TYPE_VMWARE_PORT
  44. #define IOREQ_TYPE_VMWARE_PORT 3
  45. struct vmware_regs {
  46. uint32_t esi;
  47. uint32_t edi;
  48. uint32_t ebx;
  49. uint32_t ecx;
  50. uint32_t edx;
  51. };
  52. typedef struct vmware_regs vmware_regs_t;
  53. struct shared_vmport_iopage {
  54. struct vmware_regs vcpu_vmport_regs[1];
  55. };
  56. typedef struct shared_vmport_iopage shared_vmport_iopage_t;
  57. #endif
  58. static inline uint32_t xen_vcpu_eport(shared_iopage_t *shared_page, int i)
  59. {
  60. return shared_page->vcpu_ioreq[i].vp_eport;
  61. }
  62. static inline ioreq_t *xen_vcpu_ioreq(shared_iopage_t *shared_page, int vcpu)
  63. {
  64. return &shared_page->vcpu_ioreq[vcpu];
  65. }
  66. #define BUFFER_IO_MAX_DELAY 100
  67. typedef struct XenPhysmap {
  68. hwaddr start_addr;
  69. ram_addr_t size;
  70. const char *name;
  71. hwaddr phys_offset;
  72. QLIST_ENTRY(XenPhysmap) list;
  73. } XenPhysmap;
  74. typedef struct XenIOState {
  75. ioservid_t ioservid;
  76. shared_iopage_t *shared_page;
  77. shared_vmport_iopage_t *shared_vmport_page;
  78. buffered_iopage_t *buffered_io_page;
  79. QEMUTimer *buffered_io_timer;
  80. CPUState **cpu_by_vcpu_id;
  81. /* the evtchn port for polling the notification, */
  82. evtchn_port_t *ioreq_local_port;
  83. /* evtchn local port for buffered io */
  84. evtchn_port_t bufioreq_local_port;
  85. /* the evtchn fd for polling */
  86. xenevtchn_handle *xce_handle;
  87. /* which vcpu we are serving */
  88. int send_vcpu;
  89. struct xs_handle *xenstore;
  90. MemoryListener memory_listener;
  91. MemoryListener io_listener;
  92. DeviceListener device_listener;
  93. QLIST_HEAD(, XenPhysmap) physmap;
  94. hwaddr free_phys_offset;
  95. const XenPhysmap *log_for_dirtybit;
  96. Notifier exit;
  97. Notifier suspend;
  98. Notifier wakeup;
  99. } XenIOState;
  100. /* Xen specific function for piix pci */
  101. int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
  102. {
  103. return irq_num + ((pci_dev->devfn >> 3) << 2);
  104. }
  105. void xen_piix3_set_irq(void *opaque, int irq_num, int level)
  106. {
  107. xen_set_pci_intx_level(xen_domid, 0, 0, irq_num >> 2,
  108. irq_num & 3, level);
  109. }
  110. void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len)
  111. {
  112. int i;
  113. /* Scan for updates to PCI link routes (0x60-0x63). */
  114. for (i = 0; i < len; i++) {
  115. uint8_t v = (val >> (8 * i)) & 0xff;
  116. if (v & 0x80) {
  117. v = 0;
  118. }
  119. v &= 0xf;
  120. if (((address + i) >= 0x60) && ((address + i) <= 0x63)) {
  121. xen_set_pci_link_route(xen_domid, address + i - 0x60, v);
  122. }
  123. }
  124. }
  125. int xen_is_pirq_msi(uint32_t msi_data)
  126. {
  127. /* If vector is 0, the msi is remapped into a pirq, passed as
  128. * dest_id.
  129. */
  130. return ((msi_data & MSI_DATA_VECTOR_MASK) >> MSI_DATA_VECTOR_SHIFT) == 0;
  131. }
  132. void xen_hvm_inject_msi(uint64_t addr, uint32_t data)
  133. {
  134. xen_inject_msi(xen_domid, addr, data);
  135. }
  136. static void xen_suspend_notifier(Notifier *notifier, void *data)
  137. {
  138. xc_set_hvm_param(xen_xc, xen_domid, HVM_PARAM_ACPI_S_STATE, 3);
  139. }
  140. /* Xen Interrupt Controller */
  141. static void xen_set_irq(void *opaque, int irq, int level)
  142. {
  143. xen_set_isa_irq_level(xen_domid, irq, level);
  144. }
  145. qemu_irq *xen_interrupt_controller_init(void)
  146. {
  147. return qemu_allocate_irqs(xen_set_irq, NULL, 16);
  148. }
  149. /* Memory Ops */
  150. static void xen_ram_init(PCMachineState *pcms,
  151. ram_addr_t ram_size, MemoryRegion **ram_memory_p)
  152. {
  153. MemoryRegion *sysmem = get_system_memory();
  154. ram_addr_t block_len;
  155. uint64_t user_lowmem = object_property_get_int(qdev_get_machine(),
  156. PC_MACHINE_MAX_RAM_BELOW_4G,
  157. &error_abort);
  158. /* Handle the machine opt max-ram-below-4g. It is basically doing
  159. * min(xen limit, user limit).
  160. */
  161. if (!user_lowmem) {
  162. user_lowmem = HVM_BELOW_4G_RAM_END; /* default */
  163. }
  164. if (HVM_BELOW_4G_RAM_END <= user_lowmem) {
  165. user_lowmem = HVM_BELOW_4G_RAM_END;
  166. }
  167. if (ram_size >= user_lowmem) {
  168. pcms->above_4g_mem_size = ram_size - user_lowmem;
  169. pcms->below_4g_mem_size = user_lowmem;
  170. } else {
  171. pcms->above_4g_mem_size = 0;
  172. pcms->below_4g_mem_size = ram_size;
  173. }
  174. if (!pcms->above_4g_mem_size) {
  175. block_len = ram_size;
  176. } else {
  177. /*
  178. * Xen does not allocate the memory continuously, it keeps a
  179. * hole of the size computed above or passed in.
  180. */
  181. block_len = (1ULL << 32) + pcms->above_4g_mem_size;
  182. }
  183. memory_region_init_ram(&ram_memory, NULL, "xen.ram", block_len,
  184. &error_fatal);
  185. *ram_memory_p = &ram_memory;
  186. vmstate_register_ram_global(&ram_memory);
  187. memory_region_init_alias(&ram_640k, NULL, "xen.ram.640k",
  188. &ram_memory, 0, 0xa0000);
  189. memory_region_add_subregion(sysmem, 0, &ram_640k);
  190. /* Skip of the VGA IO memory space, it will be registered later by the VGA
  191. * emulated device.
  192. *
  193. * The area between 0xc0000 and 0x100000 will be used by SeaBIOS to load
  194. * the Options ROM, so it is registered here as RAM.
  195. */
  196. memory_region_init_alias(&ram_lo, NULL, "xen.ram.lo",
  197. &ram_memory, 0xc0000,
  198. pcms->below_4g_mem_size - 0xc0000);
  199. memory_region_add_subregion(sysmem, 0xc0000, &ram_lo);
  200. if (pcms->above_4g_mem_size > 0) {
  201. memory_region_init_alias(&ram_hi, NULL, "xen.ram.hi",
  202. &ram_memory, 0x100000000ULL,
  203. pcms->above_4g_mem_size);
  204. memory_region_add_subregion(sysmem, 0x100000000ULL, &ram_hi);
  205. }
  206. }
  207. void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size, MemoryRegion *mr,
  208. Error **errp)
  209. {
  210. unsigned long nr_pfn;
  211. xen_pfn_t *pfn_list;
  212. int i;
  213. if (runstate_check(RUN_STATE_INMIGRATE)) {
  214. /* RAM already populated in Xen */
  215. fprintf(stderr, "%s: do not alloc "RAM_ADDR_FMT
  216. " bytes of ram at "RAM_ADDR_FMT" when runstate is INMIGRATE\n",
  217. __func__, size, ram_addr);
  218. return;
  219. }
  220. if (mr == &ram_memory) {
  221. return;
  222. }
  223. trace_xen_ram_alloc(ram_addr, size);
  224. nr_pfn = size >> TARGET_PAGE_BITS;
  225. pfn_list = g_malloc(sizeof (*pfn_list) * nr_pfn);
  226. for (i = 0; i < nr_pfn; i++) {
  227. pfn_list[i] = (ram_addr >> TARGET_PAGE_BITS) + i;
  228. }
  229. if (xc_domain_populate_physmap_exact(xen_xc, xen_domid, nr_pfn, 0, 0, pfn_list)) {
  230. error_setg(errp, "xen: failed to populate ram at " RAM_ADDR_FMT,
  231. ram_addr);
  232. }
  233. g_free(pfn_list);
  234. }
  235. static XenPhysmap *get_physmapping(XenIOState *state,
  236. hwaddr start_addr, ram_addr_t size)
  237. {
  238. XenPhysmap *physmap = NULL;
  239. start_addr &= TARGET_PAGE_MASK;
  240. QLIST_FOREACH(physmap, &state->physmap, list) {
  241. if (range_covers_byte(physmap->start_addr, physmap->size, start_addr)) {
  242. return physmap;
  243. }
  244. }
  245. return NULL;
  246. }
  247. static hwaddr xen_phys_offset_to_gaddr(hwaddr start_addr,
  248. ram_addr_t size, void *opaque)
  249. {
  250. hwaddr addr = start_addr & TARGET_PAGE_MASK;
  251. XenIOState *xen_io_state = opaque;
  252. XenPhysmap *physmap = NULL;
  253. QLIST_FOREACH(physmap, &xen_io_state->physmap, list) {
  254. if (range_covers_byte(physmap->phys_offset, physmap->size, addr)) {
  255. return physmap->start_addr;
  256. }
  257. }
  258. return start_addr;
  259. }
  260. static int xen_add_to_physmap(XenIOState *state,
  261. hwaddr start_addr,
  262. ram_addr_t size,
  263. MemoryRegion *mr,
  264. hwaddr offset_within_region)
  265. {
  266. unsigned long i = 0;
  267. int rc = 0;
  268. XenPhysmap *physmap = NULL;
  269. hwaddr pfn, start_gpfn;
  270. hwaddr phys_offset = memory_region_get_ram_addr(mr);
  271. char path[80], value[17];
  272. const char *mr_name;
  273. if (get_physmapping(state, start_addr, size)) {
  274. return 0;
  275. }
  276. if (size <= 0) {
  277. return -1;
  278. }
  279. /* Xen can only handle a single dirty log region for now and we want
  280. * the linear framebuffer to be that region.
  281. * Avoid tracking any regions that is not videoram and avoid tracking
  282. * the legacy vga region. */
  283. if (mr == framebuffer && start_addr > 0xbffff) {
  284. goto go_physmap;
  285. }
  286. return -1;
  287. go_physmap:
  288. DPRINTF("mapping vram to %"HWADDR_PRIx" - %"HWADDR_PRIx"\n",
  289. start_addr, start_addr + size);
  290. pfn = phys_offset >> TARGET_PAGE_BITS;
  291. start_gpfn = start_addr >> TARGET_PAGE_BITS;
  292. for (i = 0; i < size >> TARGET_PAGE_BITS; i++) {
  293. unsigned long idx = pfn + i;
  294. xen_pfn_t gpfn = start_gpfn + i;
  295. rc = xen_xc_domain_add_to_physmap(xen_xc, xen_domid, XENMAPSPACE_gmfn, idx, gpfn);
  296. if (rc) {
  297. DPRINTF("add_to_physmap MFN %"PRI_xen_pfn" to PFN %"
  298. PRI_xen_pfn" failed: %d (errno: %d)\n", idx, gpfn, rc, errno);
  299. return -rc;
  300. }
  301. }
  302. mr_name = memory_region_name(mr);
  303. physmap = g_malloc(sizeof (XenPhysmap));
  304. physmap->start_addr = start_addr;
  305. physmap->size = size;
  306. physmap->name = mr_name;
  307. physmap->phys_offset = phys_offset;
  308. QLIST_INSERT_HEAD(&state->physmap, physmap, list);
  309. xc_domain_pin_memory_cacheattr(xen_xc, xen_domid,
  310. start_addr >> TARGET_PAGE_BITS,
  311. (start_addr + size - 1) >> TARGET_PAGE_BITS,
  312. XEN_DOMCTL_MEM_CACHEATTR_WB);
  313. snprintf(path, sizeof(path),
  314. "/local/domain/0/device-model/%d/physmap/%"PRIx64"/start_addr",
  315. xen_domid, (uint64_t)phys_offset);
  316. snprintf(value, sizeof(value), "%"PRIx64, (uint64_t)start_addr);
  317. if (!xs_write(state->xenstore, 0, path, value, strlen(value))) {
  318. return -1;
  319. }
  320. snprintf(path, sizeof(path),
  321. "/local/domain/0/device-model/%d/physmap/%"PRIx64"/size",
  322. xen_domid, (uint64_t)phys_offset);
  323. snprintf(value, sizeof(value), "%"PRIx64, (uint64_t)size);
  324. if (!xs_write(state->xenstore, 0, path, value, strlen(value))) {
  325. return -1;
  326. }
  327. if (mr_name) {
  328. snprintf(path, sizeof(path),
  329. "/local/domain/0/device-model/%d/physmap/%"PRIx64"/name",
  330. xen_domid, (uint64_t)phys_offset);
  331. if (!xs_write(state->xenstore, 0, path, mr_name, strlen(mr_name))) {
  332. return -1;
  333. }
  334. }
  335. return 0;
  336. }
  337. static int xen_remove_from_physmap(XenIOState *state,
  338. hwaddr start_addr,
  339. ram_addr_t size)
  340. {
  341. unsigned long i = 0;
  342. int rc = 0;
  343. XenPhysmap *physmap = NULL;
  344. hwaddr phys_offset = 0;
  345. physmap = get_physmapping(state, start_addr, size);
  346. if (physmap == NULL) {
  347. return -1;
  348. }
  349. phys_offset = physmap->phys_offset;
  350. size = physmap->size;
  351. DPRINTF("unmapping vram to %"HWADDR_PRIx" - %"HWADDR_PRIx", at "
  352. "%"HWADDR_PRIx"\n", start_addr, start_addr + size, phys_offset);
  353. size >>= TARGET_PAGE_BITS;
  354. start_addr >>= TARGET_PAGE_BITS;
  355. phys_offset >>= TARGET_PAGE_BITS;
  356. for (i = 0; i < size; i++) {
  357. xen_pfn_t idx = start_addr + i;
  358. xen_pfn_t gpfn = phys_offset + i;
  359. rc = xen_xc_domain_add_to_physmap(xen_xc, xen_domid, XENMAPSPACE_gmfn, idx, gpfn);
  360. if (rc) {
  361. fprintf(stderr, "add_to_physmap MFN %"PRI_xen_pfn" to PFN %"
  362. PRI_xen_pfn" failed: %d (errno: %d)\n", idx, gpfn, rc, errno);
  363. return -rc;
  364. }
  365. }
  366. QLIST_REMOVE(physmap, list);
  367. if (state->log_for_dirtybit == physmap) {
  368. state->log_for_dirtybit = NULL;
  369. }
  370. g_free(physmap);
  371. return 0;
  372. }
  373. static void xen_set_memory(struct MemoryListener *listener,
  374. MemoryRegionSection *section,
  375. bool add)
  376. {
  377. XenIOState *state = container_of(listener, XenIOState, memory_listener);
  378. hwaddr start_addr = section->offset_within_address_space;
  379. ram_addr_t size = int128_get64(section->size);
  380. bool log_dirty = memory_region_is_logging(section->mr, DIRTY_MEMORY_VGA);
  381. hvmmem_type_t mem_type;
  382. if (section->mr == &ram_memory) {
  383. return;
  384. } else {
  385. if (add) {
  386. xen_map_memory_section(xen_domid, state->ioservid,
  387. section);
  388. } else {
  389. xen_unmap_memory_section(xen_domid, state->ioservid,
  390. section);
  391. }
  392. }
  393. if (!memory_region_is_ram(section->mr)) {
  394. return;
  395. }
  396. if (log_dirty != add) {
  397. return;
  398. }
  399. trace_xen_client_set_memory(start_addr, size, log_dirty);
  400. start_addr &= TARGET_PAGE_MASK;
  401. size = TARGET_PAGE_ALIGN(size);
  402. if (add) {
  403. if (!memory_region_is_rom(section->mr)) {
  404. xen_add_to_physmap(state, start_addr, size,
  405. section->mr, section->offset_within_region);
  406. } else {
  407. mem_type = HVMMEM_ram_ro;
  408. if (xen_set_mem_type(xen_domid, mem_type,
  409. start_addr >> TARGET_PAGE_BITS,
  410. size >> TARGET_PAGE_BITS)) {
  411. DPRINTF("xen_set_mem_type error, addr: "TARGET_FMT_plx"\n",
  412. start_addr);
  413. }
  414. }
  415. } else {
  416. if (xen_remove_from_physmap(state, start_addr, size) < 0) {
  417. DPRINTF("physmapping does not exist at "TARGET_FMT_plx"\n", start_addr);
  418. }
  419. }
  420. }
  421. static void xen_region_add(MemoryListener *listener,
  422. MemoryRegionSection *section)
  423. {
  424. memory_region_ref(section->mr);
  425. xen_set_memory(listener, section, true);
  426. }
  427. static void xen_region_del(MemoryListener *listener,
  428. MemoryRegionSection *section)
  429. {
  430. xen_set_memory(listener, section, false);
  431. memory_region_unref(section->mr);
  432. }
  433. static void xen_io_add(MemoryListener *listener,
  434. MemoryRegionSection *section)
  435. {
  436. XenIOState *state = container_of(listener, XenIOState, io_listener);
  437. MemoryRegion *mr = section->mr;
  438. if (mr->ops == &unassigned_io_ops) {
  439. return;
  440. }
  441. memory_region_ref(mr);
  442. xen_map_io_section(xen_domid, state->ioservid, section);
  443. }
  444. static void xen_io_del(MemoryListener *listener,
  445. MemoryRegionSection *section)
  446. {
  447. XenIOState *state = container_of(listener, XenIOState, io_listener);
  448. MemoryRegion *mr = section->mr;
  449. if (mr->ops == &unassigned_io_ops) {
  450. return;
  451. }
  452. xen_unmap_io_section(xen_domid, state->ioservid, section);
  453. memory_region_unref(mr);
  454. }
  455. static void xen_device_realize(DeviceListener *listener,
  456. DeviceState *dev)
  457. {
  458. XenIOState *state = container_of(listener, XenIOState, device_listener);
  459. if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
  460. PCIDevice *pci_dev = PCI_DEVICE(dev);
  461. xen_map_pcidev(xen_domid, state->ioservid, pci_dev);
  462. }
  463. }
  464. static void xen_device_unrealize(DeviceListener *listener,
  465. DeviceState *dev)
  466. {
  467. XenIOState *state = container_of(listener, XenIOState, device_listener);
  468. if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
  469. PCIDevice *pci_dev = PCI_DEVICE(dev);
  470. xen_unmap_pcidev(xen_domid, state->ioservid, pci_dev);
  471. }
  472. }
  473. static void xen_sync_dirty_bitmap(XenIOState *state,
  474. hwaddr start_addr,
  475. ram_addr_t size)
  476. {
  477. hwaddr npages = size >> TARGET_PAGE_BITS;
  478. const int width = sizeof(unsigned long) * 8;
  479. unsigned long bitmap[DIV_ROUND_UP(npages, width)];
  480. int rc, i, j;
  481. const XenPhysmap *physmap = NULL;
  482. physmap = get_physmapping(state, start_addr, size);
  483. if (physmap == NULL) {
  484. /* not handled */
  485. return;
  486. }
  487. if (state->log_for_dirtybit == NULL) {
  488. state->log_for_dirtybit = physmap;
  489. } else if (state->log_for_dirtybit != physmap) {
  490. /* Only one range for dirty bitmap can be tracked. */
  491. return;
  492. }
  493. rc = xen_track_dirty_vram(xen_domid, start_addr >> TARGET_PAGE_BITS,
  494. npages, bitmap);
  495. if (rc < 0) {
  496. #ifndef ENODATA
  497. #define ENODATA ENOENT
  498. #endif
  499. if (errno == ENODATA) {
  500. memory_region_set_dirty(framebuffer, 0, size);
  501. DPRINTF("xen: track_dirty_vram failed (0x" TARGET_FMT_plx
  502. ", 0x" TARGET_FMT_plx "): %s\n",
  503. start_addr, start_addr + size, strerror(errno));
  504. }
  505. return;
  506. }
  507. for (i = 0; i < ARRAY_SIZE(bitmap); i++) {
  508. unsigned long map = bitmap[i];
  509. while (map != 0) {
  510. j = ctzl(map);
  511. map &= ~(1ul << j);
  512. memory_region_set_dirty(framebuffer,
  513. (i * width + j) * TARGET_PAGE_SIZE,
  514. TARGET_PAGE_SIZE);
  515. };
  516. }
  517. }
  518. static void xen_log_start(MemoryListener *listener,
  519. MemoryRegionSection *section,
  520. int old, int new)
  521. {
  522. XenIOState *state = container_of(listener, XenIOState, memory_listener);
  523. if (new & ~old & (1 << DIRTY_MEMORY_VGA)) {
  524. xen_sync_dirty_bitmap(state, section->offset_within_address_space,
  525. int128_get64(section->size));
  526. }
  527. }
  528. static void xen_log_stop(MemoryListener *listener, MemoryRegionSection *section,
  529. int old, int new)
  530. {
  531. XenIOState *state = container_of(listener, XenIOState, memory_listener);
  532. if (old & ~new & (1 << DIRTY_MEMORY_VGA)) {
  533. state->log_for_dirtybit = NULL;
  534. /* Disable dirty bit tracking */
  535. xen_track_dirty_vram(xen_domid, 0, 0, NULL);
  536. }
  537. }
  538. static void xen_log_sync(MemoryListener *listener, MemoryRegionSection *section)
  539. {
  540. XenIOState *state = container_of(listener, XenIOState, memory_listener);
  541. xen_sync_dirty_bitmap(state, section->offset_within_address_space,
  542. int128_get64(section->size));
  543. }
  544. static void xen_log_global_start(MemoryListener *listener)
  545. {
  546. if (xen_enabled()) {
  547. xen_in_migration = true;
  548. }
  549. }
  550. static void xen_log_global_stop(MemoryListener *listener)
  551. {
  552. xen_in_migration = false;
  553. }
  554. static MemoryListener xen_memory_listener = {
  555. .region_add = xen_region_add,
  556. .region_del = xen_region_del,
  557. .log_start = xen_log_start,
  558. .log_stop = xen_log_stop,
  559. .log_sync = xen_log_sync,
  560. .log_global_start = xen_log_global_start,
  561. .log_global_stop = xen_log_global_stop,
  562. .priority = 10,
  563. };
  564. static MemoryListener xen_io_listener = {
  565. .region_add = xen_io_add,
  566. .region_del = xen_io_del,
  567. .priority = 10,
  568. };
  569. static DeviceListener xen_device_listener = {
  570. .realize = xen_device_realize,
  571. .unrealize = xen_device_unrealize,
  572. };
  573. /* get the ioreq packets from share mem */
  574. static ioreq_t *cpu_get_ioreq_from_shared_memory(XenIOState *state, int vcpu)
  575. {
  576. ioreq_t *req = xen_vcpu_ioreq(state->shared_page, vcpu);
  577. if (req->state != STATE_IOREQ_READY) {
  578. DPRINTF("I/O request not ready: "
  579. "%x, ptr: %x, port: %"PRIx64", "
  580. "data: %"PRIx64", count: %u, size: %u\n",
  581. req->state, req->data_is_ptr, req->addr,
  582. req->data, req->count, req->size);
  583. return NULL;
  584. }
  585. xen_rmb(); /* see IOREQ_READY /then/ read contents of ioreq */
  586. req->state = STATE_IOREQ_INPROCESS;
  587. return req;
  588. }
  589. /* use poll to get the port notification */
  590. /* ioreq_vec--out,the */
  591. /* retval--the number of ioreq packet */
  592. static ioreq_t *cpu_get_ioreq(XenIOState *state)
  593. {
  594. int i;
  595. evtchn_port_t port;
  596. port = xenevtchn_pending(state->xce_handle);
  597. if (port == state->bufioreq_local_port) {
  598. timer_mod(state->buffered_io_timer,
  599. BUFFER_IO_MAX_DELAY + qemu_clock_get_ms(QEMU_CLOCK_REALTIME));
  600. return NULL;
  601. }
  602. if (port != -1) {
  603. for (i = 0; i < max_cpus; i++) {
  604. if (state->ioreq_local_port[i] == port) {
  605. break;
  606. }
  607. }
  608. if (i == max_cpus) {
  609. hw_error("Fatal error while trying to get io event!\n");
  610. }
  611. /* unmask the wanted port again */
  612. xenevtchn_unmask(state->xce_handle, port);
  613. /* get the io packet from shared memory */
  614. state->send_vcpu = i;
  615. return cpu_get_ioreq_from_shared_memory(state, i);
  616. }
  617. /* read error or read nothing */
  618. return NULL;
  619. }
  620. static uint32_t do_inp(uint32_t addr, unsigned long size)
  621. {
  622. switch (size) {
  623. case 1:
  624. return cpu_inb(addr);
  625. case 2:
  626. return cpu_inw(addr);
  627. case 4:
  628. return cpu_inl(addr);
  629. default:
  630. hw_error("inp: bad size: %04x %lx", addr, size);
  631. }
  632. }
  633. static void do_outp(uint32_t addr,
  634. unsigned long size, uint32_t val)
  635. {
  636. switch (size) {
  637. case 1:
  638. return cpu_outb(addr, val);
  639. case 2:
  640. return cpu_outw(addr, val);
  641. case 4:
  642. return cpu_outl(addr, val);
  643. default:
  644. hw_error("outp: bad size: %04x %lx", addr, size);
  645. }
  646. }
  647. /*
  648. * Helper functions which read/write an object from/to physical guest
  649. * memory, as part of the implementation of an ioreq.
  650. *
  651. * Equivalent to
  652. * cpu_physical_memory_rw(addr + (req->df ? -1 : +1) * req->size * i,
  653. * val, req->size, 0/1)
  654. * except without the integer overflow problems.
  655. */
  656. static void rw_phys_req_item(hwaddr addr,
  657. ioreq_t *req, uint32_t i, void *val, int rw)
  658. {
  659. /* Do everything unsigned so overflow just results in a truncated result
  660. * and accesses to undesired parts of guest memory, which is up
  661. * to the guest */
  662. hwaddr offset = (hwaddr)req->size * i;
  663. if (req->df) {
  664. addr -= offset;
  665. } else {
  666. addr += offset;
  667. }
  668. cpu_physical_memory_rw(addr, val, req->size, rw);
  669. }
  670. static inline void read_phys_req_item(hwaddr addr,
  671. ioreq_t *req, uint32_t i, void *val)
  672. {
  673. rw_phys_req_item(addr, req, i, val, 0);
  674. }
  675. static inline void write_phys_req_item(hwaddr addr,
  676. ioreq_t *req, uint32_t i, void *val)
  677. {
  678. rw_phys_req_item(addr, req, i, val, 1);
  679. }
  680. static void cpu_ioreq_pio(ioreq_t *req)
  681. {
  682. uint32_t i;
  683. trace_cpu_ioreq_pio(req, req->dir, req->df, req->data_is_ptr, req->addr,
  684. req->data, req->count, req->size);
  685. if (req->size > sizeof(uint32_t)) {
  686. hw_error("PIO: bad size (%u)", req->size);
  687. }
  688. if (req->dir == IOREQ_READ) {
  689. if (!req->data_is_ptr) {
  690. req->data = do_inp(req->addr, req->size);
  691. trace_cpu_ioreq_pio_read_reg(req, req->data, req->addr,
  692. req->size);
  693. } else {
  694. uint32_t tmp;
  695. for (i = 0; i < req->count; i++) {
  696. tmp = do_inp(req->addr, req->size);
  697. write_phys_req_item(req->data, req, i, &tmp);
  698. }
  699. }
  700. } else if (req->dir == IOREQ_WRITE) {
  701. if (!req->data_is_ptr) {
  702. trace_cpu_ioreq_pio_write_reg(req, req->data, req->addr,
  703. req->size);
  704. do_outp(req->addr, req->size, req->data);
  705. } else {
  706. for (i = 0; i < req->count; i++) {
  707. uint32_t tmp = 0;
  708. read_phys_req_item(req->data, req, i, &tmp);
  709. do_outp(req->addr, req->size, tmp);
  710. }
  711. }
  712. }
  713. }
  714. static void cpu_ioreq_move(ioreq_t *req)
  715. {
  716. uint32_t i;
  717. trace_cpu_ioreq_move(req, req->dir, req->df, req->data_is_ptr, req->addr,
  718. req->data, req->count, req->size);
  719. if (req->size > sizeof(req->data)) {
  720. hw_error("MMIO: bad size (%u)", req->size);
  721. }
  722. if (!req->data_is_ptr) {
  723. if (req->dir == IOREQ_READ) {
  724. for (i = 0; i < req->count; i++) {
  725. read_phys_req_item(req->addr, req, i, &req->data);
  726. }
  727. } else if (req->dir == IOREQ_WRITE) {
  728. for (i = 0; i < req->count; i++) {
  729. write_phys_req_item(req->addr, req, i, &req->data);
  730. }
  731. }
  732. } else {
  733. uint64_t tmp;
  734. if (req->dir == IOREQ_READ) {
  735. for (i = 0; i < req->count; i++) {
  736. read_phys_req_item(req->addr, req, i, &tmp);
  737. write_phys_req_item(req->data, req, i, &tmp);
  738. }
  739. } else if (req->dir == IOREQ_WRITE) {
  740. for (i = 0; i < req->count; i++) {
  741. read_phys_req_item(req->data, req, i, &tmp);
  742. write_phys_req_item(req->addr, req, i, &tmp);
  743. }
  744. }
  745. }
  746. }
  747. static void regs_to_cpu(vmware_regs_t *vmport_regs, ioreq_t *req)
  748. {
  749. X86CPU *cpu;
  750. CPUX86State *env;
  751. cpu = X86_CPU(current_cpu);
  752. env = &cpu->env;
  753. env->regs[R_EAX] = req->data;
  754. env->regs[R_EBX] = vmport_regs->ebx;
  755. env->regs[R_ECX] = vmport_regs->ecx;
  756. env->regs[R_EDX] = vmport_regs->edx;
  757. env->regs[R_ESI] = vmport_regs->esi;
  758. env->regs[R_EDI] = vmport_regs->edi;
  759. }
  760. static void regs_from_cpu(vmware_regs_t *vmport_regs)
  761. {
  762. X86CPU *cpu = X86_CPU(current_cpu);
  763. CPUX86State *env = &cpu->env;
  764. vmport_regs->ebx = env->regs[R_EBX];
  765. vmport_regs->ecx = env->regs[R_ECX];
  766. vmport_regs->edx = env->regs[R_EDX];
  767. vmport_regs->esi = env->regs[R_ESI];
  768. vmport_regs->edi = env->regs[R_EDI];
  769. }
  770. static void handle_vmport_ioreq(XenIOState *state, ioreq_t *req)
  771. {
  772. vmware_regs_t *vmport_regs;
  773. assert(state->shared_vmport_page);
  774. vmport_regs =
  775. &state->shared_vmport_page->vcpu_vmport_regs[state->send_vcpu];
  776. QEMU_BUILD_BUG_ON(sizeof(*req) < sizeof(*vmport_regs));
  777. current_cpu = state->cpu_by_vcpu_id[state->send_vcpu];
  778. regs_to_cpu(vmport_regs, req);
  779. cpu_ioreq_pio(req);
  780. regs_from_cpu(vmport_regs);
  781. current_cpu = NULL;
  782. }
  783. static void handle_ioreq(XenIOState *state, ioreq_t *req)
  784. {
  785. trace_handle_ioreq(req, req->type, req->dir, req->df, req->data_is_ptr,
  786. req->addr, req->data, req->count, req->size);
  787. if (!req->data_is_ptr && (req->dir == IOREQ_WRITE) &&
  788. (req->size < sizeof (target_ulong))) {
  789. req->data &= ((target_ulong) 1 << (8 * req->size)) - 1;
  790. }
  791. if (req->dir == IOREQ_WRITE)
  792. trace_handle_ioreq_write(req, req->type, req->df, req->data_is_ptr,
  793. req->addr, req->data, req->count, req->size);
  794. switch (req->type) {
  795. case IOREQ_TYPE_PIO:
  796. cpu_ioreq_pio(req);
  797. break;
  798. case IOREQ_TYPE_COPY:
  799. cpu_ioreq_move(req);
  800. break;
  801. case IOREQ_TYPE_VMWARE_PORT:
  802. handle_vmport_ioreq(state, req);
  803. break;
  804. case IOREQ_TYPE_TIMEOFFSET:
  805. break;
  806. case IOREQ_TYPE_INVALIDATE:
  807. xen_invalidate_map_cache();
  808. break;
  809. case IOREQ_TYPE_PCI_CONFIG: {
  810. uint32_t sbdf = req->addr >> 32;
  811. uint32_t val;
  812. /* Fake a write to port 0xCF8 so that
  813. * the config space access will target the
  814. * correct device model.
  815. */
  816. val = (1u << 31) |
  817. ((req->addr & 0x0f00) << 16) |
  818. ((sbdf & 0xffff) << 8) |
  819. (req->addr & 0xfc);
  820. do_outp(0xcf8, 4, val);
  821. /* Now issue the config space access via
  822. * port 0xCFC
  823. */
  824. req->addr = 0xcfc | (req->addr & 0x03);
  825. cpu_ioreq_pio(req);
  826. break;
  827. }
  828. default:
  829. hw_error("Invalid ioreq type 0x%x\n", req->type);
  830. }
  831. if (req->dir == IOREQ_READ) {
  832. trace_handle_ioreq_read(req, req->type, req->df, req->data_is_ptr,
  833. req->addr, req->data, req->count, req->size);
  834. }
  835. }
  836. static int handle_buffered_iopage(XenIOState *state)
  837. {
  838. buffered_iopage_t *buf_page = state->buffered_io_page;
  839. buf_ioreq_t *buf_req = NULL;
  840. ioreq_t req;
  841. int qw;
  842. if (!buf_page) {
  843. return 0;
  844. }
  845. memset(&req, 0x00, sizeof(req));
  846. req.state = STATE_IOREQ_READY;
  847. req.count = 1;
  848. req.dir = IOREQ_WRITE;
  849. for (;;) {
  850. uint32_t rdptr = buf_page->read_pointer, wrptr;
  851. xen_rmb();
  852. wrptr = buf_page->write_pointer;
  853. xen_rmb();
  854. if (rdptr != buf_page->read_pointer) {
  855. continue;
  856. }
  857. if (rdptr == wrptr) {
  858. break;
  859. }
  860. buf_req = &buf_page->buf_ioreq[rdptr % IOREQ_BUFFER_SLOT_NUM];
  861. req.size = 1U << buf_req->size;
  862. req.addr = buf_req->addr;
  863. req.data = buf_req->data;
  864. req.type = buf_req->type;
  865. xen_rmb();
  866. qw = (req.size == 8);
  867. if (qw) {
  868. if (rdptr + 1 == wrptr) {
  869. hw_error("Incomplete quad word buffered ioreq");
  870. }
  871. buf_req = &buf_page->buf_ioreq[(rdptr + 1) %
  872. IOREQ_BUFFER_SLOT_NUM];
  873. req.data |= ((uint64_t)buf_req->data) << 32;
  874. xen_rmb();
  875. }
  876. handle_ioreq(state, &req);
  877. /* Only req.data may get updated by handle_ioreq(), albeit even that
  878. * should not happen as such data would never make it to the guest (we
  879. * can only usefully see writes here after all).
  880. */
  881. assert(req.state == STATE_IOREQ_READY);
  882. assert(req.count == 1);
  883. assert(req.dir == IOREQ_WRITE);
  884. assert(!req.data_is_ptr);
  885. atomic_add(&buf_page->read_pointer, qw + 1);
  886. }
  887. return req.count;
  888. }
  889. static void handle_buffered_io(void *opaque)
  890. {
  891. XenIOState *state = opaque;
  892. if (handle_buffered_iopage(state)) {
  893. timer_mod(state->buffered_io_timer,
  894. BUFFER_IO_MAX_DELAY + qemu_clock_get_ms(QEMU_CLOCK_REALTIME));
  895. } else {
  896. timer_del(state->buffered_io_timer);
  897. xenevtchn_unmask(state->xce_handle, state->bufioreq_local_port);
  898. }
  899. }
  900. static void cpu_handle_ioreq(void *opaque)
  901. {
  902. XenIOState *state = opaque;
  903. ioreq_t *req = cpu_get_ioreq(state);
  904. handle_buffered_iopage(state);
  905. if (req) {
  906. ioreq_t copy = *req;
  907. xen_rmb();
  908. handle_ioreq(state, &copy);
  909. req->data = copy.data;
  910. if (req->state != STATE_IOREQ_INPROCESS) {
  911. fprintf(stderr, "Badness in I/O request ... not in service?!: "
  912. "%x, ptr: %x, port: %"PRIx64", "
  913. "data: %"PRIx64", count: %u, size: %u, type: %u\n",
  914. req->state, req->data_is_ptr, req->addr,
  915. req->data, req->count, req->size, req->type);
  916. destroy_hvm_domain(false);
  917. return;
  918. }
  919. xen_wmb(); /* Update ioreq contents /then/ update state. */
  920. /*
  921. * We do this before we send the response so that the tools
  922. * have the opportunity to pick up on the reset before the
  923. * guest resumes and does a hlt with interrupts disabled which
  924. * causes Xen to powerdown the domain.
  925. */
  926. if (runstate_is_running()) {
  927. ShutdownCause request;
  928. if (qemu_shutdown_requested_get()) {
  929. destroy_hvm_domain(false);
  930. }
  931. request = qemu_reset_requested_get();
  932. if (request) {
  933. qemu_system_reset(request);
  934. destroy_hvm_domain(true);
  935. }
  936. }
  937. req->state = STATE_IORESP_READY;
  938. xenevtchn_notify(state->xce_handle,
  939. state->ioreq_local_port[state->send_vcpu]);
  940. }
  941. }
  942. static void xen_main_loop_prepare(XenIOState *state)
  943. {
  944. int evtchn_fd = -1;
  945. if (state->xce_handle != NULL) {
  946. evtchn_fd = xenevtchn_fd(state->xce_handle);
  947. }
  948. state->buffered_io_timer = timer_new_ms(QEMU_CLOCK_REALTIME, handle_buffered_io,
  949. state);
  950. if (evtchn_fd != -1) {
  951. CPUState *cpu_state;
  952. DPRINTF("%s: Init cpu_by_vcpu_id\n", __func__);
  953. CPU_FOREACH(cpu_state) {
  954. DPRINTF("%s: cpu_by_vcpu_id[%d]=%p\n",
  955. __func__, cpu_state->cpu_index, cpu_state);
  956. state->cpu_by_vcpu_id[cpu_state->cpu_index] = cpu_state;
  957. }
  958. qemu_set_fd_handler(evtchn_fd, cpu_handle_ioreq, NULL, state);
  959. }
  960. }
  961. static void xen_hvm_change_state_handler(void *opaque, int running,
  962. RunState rstate)
  963. {
  964. XenIOState *state = opaque;
  965. if (running) {
  966. xen_main_loop_prepare(state);
  967. }
  968. xen_set_ioreq_server_state(xen_domid,
  969. state->ioservid,
  970. (rstate == RUN_STATE_RUNNING));
  971. }
  972. static void xen_exit_notifier(Notifier *n, void *data)
  973. {
  974. XenIOState *state = container_of(n, XenIOState, exit);
  975. xenevtchn_close(state->xce_handle);
  976. xs_daemon_close(state->xenstore);
  977. }
  978. static void xen_read_physmap(XenIOState *state)
  979. {
  980. XenPhysmap *physmap = NULL;
  981. unsigned int len, num, i;
  982. char path[80], *value = NULL;
  983. char **entries = NULL;
  984. snprintf(path, sizeof(path),
  985. "/local/domain/0/device-model/%d/physmap", xen_domid);
  986. entries = xs_directory(state->xenstore, 0, path, &num);
  987. if (entries == NULL)
  988. return;
  989. for (i = 0; i < num; i++) {
  990. physmap = g_malloc(sizeof (XenPhysmap));
  991. physmap->phys_offset = strtoull(entries[i], NULL, 16);
  992. snprintf(path, sizeof(path),
  993. "/local/domain/0/device-model/%d/physmap/%s/start_addr",
  994. xen_domid, entries[i]);
  995. value = xs_read(state->xenstore, 0, path, &len);
  996. if (value == NULL) {
  997. g_free(physmap);
  998. continue;
  999. }
  1000. physmap->start_addr = strtoull(value, NULL, 16);
  1001. free(value);
  1002. snprintf(path, sizeof(path),
  1003. "/local/domain/0/device-model/%d/physmap/%s/size",
  1004. xen_domid, entries[i]);
  1005. value = xs_read(state->xenstore, 0, path, &len);
  1006. if (value == NULL) {
  1007. g_free(physmap);
  1008. continue;
  1009. }
  1010. physmap->size = strtoull(value, NULL, 16);
  1011. free(value);
  1012. snprintf(path, sizeof(path),
  1013. "/local/domain/0/device-model/%d/physmap/%s/name",
  1014. xen_domid, entries[i]);
  1015. physmap->name = xs_read(state->xenstore, 0, path, &len);
  1016. QLIST_INSERT_HEAD(&state->physmap, physmap, list);
  1017. }
  1018. free(entries);
  1019. }
  1020. static void xen_wakeup_notifier(Notifier *notifier, void *data)
  1021. {
  1022. xc_set_hvm_param(xen_xc, xen_domid, HVM_PARAM_ACPI_S_STATE, 0);
  1023. }
  1024. void xen_hvm_init(PCMachineState *pcms, MemoryRegion **ram_memory)
  1025. {
  1026. int i, rc;
  1027. xen_pfn_t ioreq_pfn;
  1028. xen_pfn_t bufioreq_pfn;
  1029. evtchn_port_t bufioreq_evtchn;
  1030. XenIOState *state;
  1031. state = g_malloc0(sizeof (XenIOState));
  1032. state->xce_handle = xenevtchn_open(NULL, 0);
  1033. if (state->xce_handle == NULL) {
  1034. perror("xen: event channel open");
  1035. goto err;
  1036. }
  1037. state->xenstore = xs_daemon_open();
  1038. if (state->xenstore == NULL) {
  1039. perror("xen: xenstore open");
  1040. goto err;
  1041. }
  1042. if (xen_domid_restrict) {
  1043. rc = xen_restrict(xen_domid);
  1044. if (rc < 0) {
  1045. error_report("failed to restrict: error %d", errno);
  1046. goto err;
  1047. }
  1048. }
  1049. xen_create_ioreq_server(xen_domid, &state->ioservid);
  1050. state->exit.notify = xen_exit_notifier;
  1051. qemu_add_exit_notifier(&state->exit);
  1052. state->suspend.notify = xen_suspend_notifier;
  1053. qemu_register_suspend_notifier(&state->suspend);
  1054. state->wakeup.notify = xen_wakeup_notifier;
  1055. qemu_register_wakeup_notifier(&state->wakeup);
  1056. rc = xen_get_ioreq_server_info(xen_domid, state->ioservid,
  1057. &ioreq_pfn, &bufioreq_pfn,
  1058. &bufioreq_evtchn);
  1059. if (rc < 0) {
  1060. error_report("failed to get ioreq server info: error %d handle=%p",
  1061. errno, xen_xc);
  1062. goto err;
  1063. }
  1064. DPRINTF("shared page at pfn %lx\n", ioreq_pfn);
  1065. DPRINTF("buffered io page at pfn %lx\n", bufioreq_pfn);
  1066. DPRINTF("buffered io evtchn is %x\n", bufioreq_evtchn);
  1067. state->shared_page = xenforeignmemory_map(xen_fmem, xen_domid,
  1068. PROT_READ|PROT_WRITE,
  1069. 1, &ioreq_pfn, NULL);
  1070. if (state->shared_page == NULL) {
  1071. error_report("map shared IO page returned error %d handle=%p",
  1072. errno, xen_xc);
  1073. goto err;
  1074. }
  1075. rc = xen_get_vmport_regs_pfn(xen_xc, xen_domid, &ioreq_pfn);
  1076. if (!rc) {
  1077. DPRINTF("shared vmport page at pfn %lx\n", ioreq_pfn);
  1078. state->shared_vmport_page =
  1079. xenforeignmemory_map(xen_fmem, xen_domid, PROT_READ|PROT_WRITE,
  1080. 1, &ioreq_pfn, NULL);
  1081. if (state->shared_vmport_page == NULL) {
  1082. error_report("map shared vmport IO page returned error %d handle=%p",
  1083. errno, xen_xc);
  1084. goto err;
  1085. }
  1086. } else if (rc != -ENOSYS) {
  1087. error_report("get vmport regs pfn returned error %d, rc=%d",
  1088. errno, rc);
  1089. goto err;
  1090. }
  1091. state->buffered_io_page = xenforeignmemory_map(xen_fmem, xen_domid,
  1092. PROT_READ|PROT_WRITE,
  1093. 1, &bufioreq_pfn, NULL);
  1094. if (state->buffered_io_page == NULL) {
  1095. error_report("map buffered IO page returned error %d", errno);
  1096. goto err;
  1097. }
  1098. /* Note: cpus is empty at this point in init */
  1099. state->cpu_by_vcpu_id = g_malloc0(max_cpus * sizeof(CPUState *));
  1100. rc = xen_set_ioreq_server_state(xen_domid, state->ioservid, true);
  1101. if (rc < 0) {
  1102. error_report("failed to enable ioreq server info: error %d handle=%p",
  1103. errno, xen_xc);
  1104. goto err;
  1105. }
  1106. state->ioreq_local_port = g_malloc0(max_cpus * sizeof (evtchn_port_t));
  1107. /* FIXME: how about if we overflow the page here? */
  1108. for (i = 0; i < max_cpus; i++) {
  1109. rc = xenevtchn_bind_interdomain(state->xce_handle, xen_domid,
  1110. xen_vcpu_eport(state->shared_page, i));
  1111. if (rc == -1) {
  1112. error_report("shared evtchn %d bind error %d", i, errno);
  1113. goto err;
  1114. }
  1115. state->ioreq_local_port[i] = rc;
  1116. }
  1117. rc = xenevtchn_bind_interdomain(state->xce_handle, xen_domid,
  1118. bufioreq_evtchn);
  1119. if (rc == -1) {
  1120. error_report("buffered evtchn bind error %d", errno);
  1121. goto err;
  1122. }
  1123. state->bufioreq_local_port = rc;
  1124. /* Init RAM management */
  1125. xen_map_cache_init(xen_phys_offset_to_gaddr, state);
  1126. xen_ram_init(pcms, ram_size, ram_memory);
  1127. qemu_add_vm_change_state_handler(xen_hvm_change_state_handler, state);
  1128. state->memory_listener = xen_memory_listener;
  1129. QLIST_INIT(&state->physmap);
  1130. memory_listener_register(&state->memory_listener, &address_space_memory);
  1131. state->log_for_dirtybit = NULL;
  1132. state->io_listener = xen_io_listener;
  1133. memory_listener_register(&state->io_listener, &address_space_io);
  1134. state->device_listener = xen_device_listener;
  1135. device_listener_register(&state->device_listener);
  1136. /* Initialize backend core & drivers */
  1137. if (xen_be_init() != 0) {
  1138. error_report("xen backend core setup failed");
  1139. goto err;
  1140. }
  1141. xen_be_register_common();
  1142. xen_read_physmap(state);
  1143. /* Disable ACPI build because Xen handles it */
  1144. pcms->acpi_build_enabled = false;
  1145. return;
  1146. err:
  1147. error_report("xen hardware virtual machine initialisation failed");
  1148. exit(1);
  1149. }
  1150. void destroy_hvm_domain(bool reboot)
  1151. {
  1152. xc_interface *xc_handle;
  1153. int sts;
  1154. xc_handle = xc_interface_open(0, 0, 0);
  1155. if (xc_handle == NULL) {
  1156. fprintf(stderr, "Cannot acquire xenctrl handle\n");
  1157. } else {
  1158. sts = xc_domain_shutdown(xc_handle, xen_domid,
  1159. reboot ? SHUTDOWN_reboot : SHUTDOWN_poweroff);
  1160. if (sts != 0) {
  1161. fprintf(stderr, "xc_domain_shutdown failed to issue %s, "
  1162. "sts %d, %s\n", reboot ? "reboot" : "poweroff",
  1163. sts, strerror(errno));
  1164. } else {
  1165. fprintf(stderr, "Issued domain %d %s\n", xen_domid,
  1166. reboot ? "reboot" : "poweroff");
  1167. }
  1168. xc_interface_close(xc_handle);
  1169. }
  1170. }
  1171. void xen_register_framebuffer(MemoryRegion *mr)
  1172. {
  1173. framebuffer = mr;
  1174. }
  1175. void xen_shutdown_fatal_error(const char *fmt, ...)
  1176. {
  1177. va_list ap;
  1178. va_start(ap, fmt);
  1179. vfprintf(stderr, fmt, ap);
  1180. va_end(ap);
  1181. fprintf(stderr, "Will destroy the domain.\n");
  1182. /* destroy the domain */
  1183. qemu_system_shutdown_request(SHUTDOWN_CAUSE_HOST_ERROR);
  1184. }
  1185. void xen_hvm_modified_memory(ram_addr_t start, ram_addr_t length)
  1186. {
  1187. if (unlikely(xen_in_migration)) {
  1188. int rc;
  1189. ram_addr_t start_pfn, nb_pages;
  1190. if (length == 0) {
  1191. length = TARGET_PAGE_SIZE;
  1192. }
  1193. start_pfn = start >> TARGET_PAGE_BITS;
  1194. nb_pages = ((start + length + TARGET_PAGE_SIZE - 1) >> TARGET_PAGE_BITS)
  1195. - start_pfn;
  1196. rc = xen_modified_memory(xen_domid, start_pfn, nb_pages);
  1197. if (rc) {
  1198. fprintf(stderr,
  1199. "%s failed for "RAM_ADDR_FMT" ("RAM_ADDR_FMT"): %i, %s\n",
  1200. __func__, start, nb_pages, rc, strerror(-rc));
  1201. }
  1202. }
  1203. }
  1204. void qmp_xen_set_global_dirty_log(bool enable, Error **errp)
  1205. {
  1206. if (enable) {
  1207. memory_global_dirty_log_start();
  1208. } else {
  1209. memory_global_dirty_log_stop();
  1210. }
  1211. }