dump.c 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713
  1. /*
  2. * QEMU dump
  3. *
  4. * Copyright Fujitsu, Corp. 2011, 2012
  5. *
  6. * Authors:
  7. * Wen Congyang <wency@cn.fujitsu.com>
  8. *
  9. * This work is licensed under the terms of the GNU GPL, version 2 or later.
  10. * See the COPYING file in the top-level directory.
  11. *
  12. */
  13. #include "qemu-common.h"
  14. #include "elf.h"
  15. #include "cpu.h"
  16. #include "exec/cpu-all.h"
  17. #include "exec/hwaddr.h"
  18. #include "monitor/monitor.h"
  19. #include "sysemu/kvm.h"
  20. #include "sysemu/dump.h"
  21. #include "sysemu/sysemu.h"
  22. #include "sysemu/memory_mapping.h"
  23. #include "sysemu/cpus.h"
  24. #include "qapi/error.h"
  25. #include "qmp-commands.h"
  26. #include <zlib.h>
  27. #ifdef CONFIG_LZO
  28. #include <lzo/lzo1x.h>
  29. #endif
  30. #ifdef CONFIG_SNAPPY
  31. #include <snappy-c.h>
  32. #endif
  33. #ifndef ELF_MACHINE_UNAME
  34. #define ELF_MACHINE_UNAME "Unknown"
  35. #endif
  36. uint16_t cpu_to_dump16(DumpState *s, uint16_t val)
  37. {
  38. if (s->dump_info.d_endian == ELFDATA2LSB) {
  39. val = cpu_to_le16(val);
  40. } else {
  41. val = cpu_to_be16(val);
  42. }
  43. return val;
  44. }
  45. uint32_t cpu_to_dump32(DumpState *s, uint32_t val)
  46. {
  47. if (s->dump_info.d_endian == ELFDATA2LSB) {
  48. val = cpu_to_le32(val);
  49. } else {
  50. val = cpu_to_be32(val);
  51. }
  52. return val;
  53. }
  54. uint64_t cpu_to_dump64(DumpState *s, uint64_t val)
  55. {
  56. if (s->dump_info.d_endian == ELFDATA2LSB) {
  57. val = cpu_to_le64(val);
  58. } else {
  59. val = cpu_to_be64(val);
  60. }
  61. return val;
  62. }
  63. static int dump_cleanup(DumpState *s)
  64. {
  65. guest_phys_blocks_free(&s->guest_phys_blocks);
  66. memory_mapping_list_free(&s->list);
  67. close(s->fd);
  68. if (s->resume) {
  69. vm_start();
  70. }
  71. return 0;
  72. }
  73. static void dump_error(DumpState *s, const char *reason, Error **errp)
  74. {
  75. dump_cleanup(s);
  76. error_setg(errp, "%s", reason);
  77. }
  78. static int fd_write_vmcore(const void *buf, size_t size, void *opaque)
  79. {
  80. DumpState *s = opaque;
  81. size_t written_size;
  82. written_size = qemu_write_full(s->fd, buf, size);
  83. if (written_size != size) {
  84. return -1;
  85. }
  86. return 0;
  87. }
  88. static void write_elf64_header(DumpState *s, Error **errp)
  89. {
  90. Elf64_Ehdr elf_header;
  91. int ret;
  92. memset(&elf_header, 0, sizeof(Elf64_Ehdr));
  93. memcpy(&elf_header, ELFMAG, SELFMAG);
  94. elf_header.e_ident[EI_CLASS] = ELFCLASS64;
  95. elf_header.e_ident[EI_DATA] = s->dump_info.d_endian;
  96. elf_header.e_ident[EI_VERSION] = EV_CURRENT;
  97. elf_header.e_type = cpu_to_dump16(s, ET_CORE);
  98. elf_header.e_machine = cpu_to_dump16(s, s->dump_info.d_machine);
  99. elf_header.e_version = cpu_to_dump32(s, EV_CURRENT);
  100. elf_header.e_ehsize = cpu_to_dump16(s, sizeof(elf_header));
  101. elf_header.e_phoff = cpu_to_dump64(s, sizeof(Elf64_Ehdr));
  102. elf_header.e_phentsize = cpu_to_dump16(s, sizeof(Elf64_Phdr));
  103. elf_header.e_phnum = cpu_to_dump16(s, s->phdr_num);
  104. if (s->have_section) {
  105. uint64_t shoff = sizeof(Elf64_Ehdr) + sizeof(Elf64_Phdr) * s->sh_info;
  106. elf_header.e_shoff = cpu_to_dump64(s, shoff);
  107. elf_header.e_shentsize = cpu_to_dump16(s, sizeof(Elf64_Shdr));
  108. elf_header.e_shnum = cpu_to_dump16(s, 1);
  109. }
  110. ret = fd_write_vmcore(&elf_header, sizeof(elf_header), s);
  111. if (ret < 0) {
  112. dump_error(s, "dump: failed to write elf header", errp);
  113. }
  114. }
  115. static void write_elf32_header(DumpState *s, Error **errp)
  116. {
  117. Elf32_Ehdr elf_header;
  118. int ret;
  119. memset(&elf_header, 0, sizeof(Elf32_Ehdr));
  120. memcpy(&elf_header, ELFMAG, SELFMAG);
  121. elf_header.e_ident[EI_CLASS] = ELFCLASS32;
  122. elf_header.e_ident[EI_DATA] = s->dump_info.d_endian;
  123. elf_header.e_ident[EI_VERSION] = EV_CURRENT;
  124. elf_header.e_type = cpu_to_dump16(s, ET_CORE);
  125. elf_header.e_machine = cpu_to_dump16(s, s->dump_info.d_machine);
  126. elf_header.e_version = cpu_to_dump32(s, EV_CURRENT);
  127. elf_header.e_ehsize = cpu_to_dump16(s, sizeof(elf_header));
  128. elf_header.e_phoff = cpu_to_dump32(s, sizeof(Elf32_Ehdr));
  129. elf_header.e_phentsize = cpu_to_dump16(s, sizeof(Elf32_Phdr));
  130. elf_header.e_phnum = cpu_to_dump16(s, s->phdr_num);
  131. if (s->have_section) {
  132. uint32_t shoff = sizeof(Elf32_Ehdr) + sizeof(Elf32_Phdr) * s->sh_info;
  133. elf_header.e_shoff = cpu_to_dump32(s, shoff);
  134. elf_header.e_shentsize = cpu_to_dump16(s, sizeof(Elf32_Shdr));
  135. elf_header.e_shnum = cpu_to_dump16(s, 1);
  136. }
  137. ret = fd_write_vmcore(&elf_header, sizeof(elf_header), s);
  138. if (ret < 0) {
  139. dump_error(s, "dump: failed to write elf header", errp);
  140. }
  141. }
  142. static void write_elf64_load(DumpState *s, MemoryMapping *memory_mapping,
  143. int phdr_index, hwaddr offset,
  144. hwaddr filesz, Error **errp)
  145. {
  146. Elf64_Phdr phdr;
  147. int ret;
  148. memset(&phdr, 0, sizeof(Elf64_Phdr));
  149. phdr.p_type = cpu_to_dump32(s, PT_LOAD);
  150. phdr.p_offset = cpu_to_dump64(s, offset);
  151. phdr.p_paddr = cpu_to_dump64(s, memory_mapping->phys_addr);
  152. phdr.p_filesz = cpu_to_dump64(s, filesz);
  153. phdr.p_memsz = cpu_to_dump64(s, memory_mapping->length);
  154. phdr.p_vaddr = cpu_to_dump64(s, memory_mapping->virt_addr);
  155. assert(memory_mapping->length >= filesz);
  156. ret = fd_write_vmcore(&phdr, sizeof(Elf64_Phdr), s);
  157. if (ret < 0) {
  158. dump_error(s, "dump: failed to write program header table", errp);
  159. }
  160. }
  161. static void write_elf32_load(DumpState *s, MemoryMapping *memory_mapping,
  162. int phdr_index, hwaddr offset,
  163. hwaddr filesz, Error **errp)
  164. {
  165. Elf32_Phdr phdr;
  166. int ret;
  167. memset(&phdr, 0, sizeof(Elf32_Phdr));
  168. phdr.p_type = cpu_to_dump32(s, PT_LOAD);
  169. phdr.p_offset = cpu_to_dump32(s, offset);
  170. phdr.p_paddr = cpu_to_dump32(s, memory_mapping->phys_addr);
  171. phdr.p_filesz = cpu_to_dump32(s, filesz);
  172. phdr.p_memsz = cpu_to_dump32(s, memory_mapping->length);
  173. phdr.p_vaddr = cpu_to_dump32(s, memory_mapping->virt_addr);
  174. assert(memory_mapping->length >= filesz);
  175. ret = fd_write_vmcore(&phdr, sizeof(Elf32_Phdr), s);
  176. if (ret < 0) {
  177. dump_error(s, "dump: failed to write program header table", errp);
  178. }
  179. }
  180. static void write_elf64_note(DumpState *s, Error **errp)
  181. {
  182. Elf64_Phdr phdr;
  183. hwaddr begin = s->memory_offset - s->note_size;
  184. int ret;
  185. memset(&phdr, 0, sizeof(Elf64_Phdr));
  186. phdr.p_type = cpu_to_dump32(s, PT_NOTE);
  187. phdr.p_offset = cpu_to_dump64(s, begin);
  188. phdr.p_paddr = 0;
  189. phdr.p_filesz = cpu_to_dump64(s, s->note_size);
  190. phdr.p_memsz = cpu_to_dump64(s, s->note_size);
  191. phdr.p_vaddr = 0;
  192. ret = fd_write_vmcore(&phdr, sizeof(Elf64_Phdr), s);
  193. if (ret < 0) {
  194. dump_error(s, "dump: failed to write program header table", errp);
  195. }
  196. }
  197. static inline int cpu_index(CPUState *cpu)
  198. {
  199. return cpu->cpu_index + 1;
  200. }
  201. static void write_elf64_notes(WriteCoreDumpFunction f, DumpState *s,
  202. Error **errp)
  203. {
  204. CPUState *cpu;
  205. int ret;
  206. int id;
  207. CPU_FOREACH(cpu) {
  208. id = cpu_index(cpu);
  209. ret = cpu_write_elf64_note(f, cpu, id, s);
  210. if (ret < 0) {
  211. dump_error(s, "dump: failed to write elf notes", errp);
  212. return;
  213. }
  214. }
  215. CPU_FOREACH(cpu) {
  216. ret = cpu_write_elf64_qemunote(f, cpu, s);
  217. if (ret < 0) {
  218. dump_error(s, "dump: failed to write CPU status", errp);
  219. return;
  220. }
  221. }
  222. }
  223. static void write_elf32_note(DumpState *s, Error **errp)
  224. {
  225. hwaddr begin = s->memory_offset - s->note_size;
  226. Elf32_Phdr phdr;
  227. int ret;
  228. memset(&phdr, 0, sizeof(Elf32_Phdr));
  229. phdr.p_type = cpu_to_dump32(s, PT_NOTE);
  230. phdr.p_offset = cpu_to_dump32(s, begin);
  231. phdr.p_paddr = 0;
  232. phdr.p_filesz = cpu_to_dump32(s, s->note_size);
  233. phdr.p_memsz = cpu_to_dump32(s, s->note_size);
  234. phdr.p_vaddr = 0;
  235. ret = fd_write_vmcore(&phdr, sizeof(Elf32_Phdr), s);
  236. if (ret < 0) {
  237. dump_error(s, "dump: failed to write program header table", errp);
  238. }
  239. }
  240. static void write_elf32_notes(WriteCoreDumpFunction f, DumpState *s,
  241. Error **errp)
  242. {
  243. CPUState *cpu;
  244. int ret;
  245. int id;
  246. CPU_FOREACH(cpu) {
  247. id = cpu_index(cpu);
  248. ret = cpu_write_elf32_note(f, cpu, id, s);
  249. if (ret < 0) {
  250. dump_error(s, "dump: failed to write elf notes", errp);
  251. return;
  252. }
  253. }
  254. CPU_FOREACH(cpu) {
  255. ret = cpu_write_elf32_qemunote(f, cpu, s);
  256. if (ret < 0) {
  257. dump_error(s, "dump: failed to write CPU status", errp);
  258. return;
  259. }
  260. }
  261. }
  262. static void write_elf_section(DumpState *s, int type, Error **errp)
  263. {
  264. Elf32_Shdr shdr32;
  265. Elf64_Shdr shdr64;
  266. int shdr_size;
  267. void *shdr;
  268. int ret;
  269. if (type == 0) {
  270. shdr_size = sizeof(Elf32_Shdr);
  271. memset(&shdr32, 0, shdr_size);
  272. shdr32.sh_info = cpu_to_dump32(s, s->sh_info);
  273. shdr = &shdr32;
  274. } else {
  275. shdr_size = sizeof(Elf64_Shdr);
  276. memset(&shdr64, 0, shdr_size);
  277. shdr64.sh_info = cpu_to_dump32(s, s->sh_info);
  278. shdr = &shdr64;
  279. }
  280. ret = fd_write_vmcore(&shdr, shdr_size, s);
  281. if (ret < 0) {
  282. dump_error(s, "dump: failed to write section header table", errp);
  283. }
  284. }
  285. static void write_data(DumpState *s, void *buf, int length, Error **errp)
  286. {
  287. int ret;
  288. ret = fd_write_vmcore(buf, length, s);
  289. if (ret < 0) {
  290. dump_error(s, "dump: failed to save memory", errp);
  291. }
  292. }
  293. /* write the memory to vmcore. 1 page per I/O. */
  294. static void write_memory(DumpState *s, GuestPhysBlock *block, ram_addr_t start,
  295. int64_t size, Error **errp)
  296. {
  297. int64_t i;
  298. Error *local_err = NULL;
  299. for (i = 0; i < size / TARGET_PAGE_SIZE; i++) {
  300. write_data(s, block->host_addr + start + i * TARGET_PAGE_SIZE,
  301. TARGET_PAGE_SIZE, &local_err);
  302. if (local_err) {
  303. error_propagate(errp, local_err);
  304. return;
  305. }
  306. }
  307. if ((size % TARGET_PAGE_SIZE) != 0) {
  308. write_data(s, block->host_addr + start + i * TARGET_PAGE_SIZE,
  309. size % TARGET_PAGE_SIZE, &local_err);
  310. if (local_err) {
  311. error_propagate(errp, local_err);
  312. return;
  313. }
  314. }
  315. }
  316. /* get the memory's offset and size in the vmcore */
  317. static void get_offset_range(hwaddr phys_addr,
  318. ram_addr_t mapping_length,
  319. DumpState *s,
  320. hwaddr *p_offset,
  321. hwaddr *p_filesz)
  322. {
  323. GuestPhysBlock *block;
  324. hwaddr offset = s->memory_offset;
  325. int64_t size_in_block, start;
  326. /* When the memory is not stored into vmcore, offset will be -1 */
  327. *p_offset = -1;
  328. *p_filesz = 0;
  329. if (s->has_filter) {
  330. if (phys_addr < s->begin || phys_addr >= s->begin + s->length) {
  331. return;
  332. }
  333. }
  334. QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) {
  335. if (s->has_filter) {
  336. if (block->target_start >= s->begin + s->length ||
  337. block->target_end <= s->begin) {
  338. /* This block is out of the range */
  339. continue;
  340. }
  341. if (s->begin <= block->target_start) {
  342. start = block->target_start;
  343. } else {
  344. start = s->begin;
  345. }
  346. size_in_block = block->target_end - start;
  347. if (s->begin + s->length < block->target_end) {
  348. size_in_block -= block->target_end - (s->begin + s->length);
  349. }
  350. } else {
  351. start = block->target_start;
  352. size_in_block = block->target_end - block->target_start;
  353. }
  354. if (phys_addr >= start && phys_addr < start + size_in_block) {
  355. *p_offset = phys_addr - start + offset;
  356. /* The offset range mapped from the vmcore file must not spill over
  357. * the GuestPhysBlock, clamp it. The rest of the mapping will be
  358. * zero-filled in memory at load time; see
  359. * <http://refspecs.linuxbase.org/elf/gabi4+/ch5.pheader.html>.
  360. */
  361. *p_filesz = phys_addr + mapping_length <= start + size_in_block ?
  362. mapping_length :
  363. size_in_block - (phys_addr - start);
  364. return;
  365. }
  366. offset += size_in_block;
  367. }
  368. }
  369. static void write_elf_loads(DumpState *s, Error **errp)
  370. {
  371. hwaddr offset, filesz;
  372. MemoryMapping *memory_mapping;
  373. uint32_t phdr_index = 1;
  374. uint32_t max_index;
  375. Error *local_err = NULL;
  376. if (s->have_section) {
  377. max_index = s->sh_info;
  378. } else {
  379. max_index = s->phdr_num;
  380. }
  381. QTAILQ_FOREACH(memory_mapping, &s->list.head, next) {
  382. get_offset_range(memory_mapping->phys_addr,
  383. memory_mapping->length,
  384. s, &offset, &filesz);
  385. if (s->dump_info.d_class == ELFCLASS64) {
  386. write_elf64_load(s, memory_mapping, phdr_index++, offset,
  387. filesz, &local_err);
  388. } else {
  389. write_elf32_load(s, memory_mapping, phdr_index++, offset,
  390. filesz, &local_err);
  391. }
  392. if (local_err) {
  393. error_propagate(errp, local_err);
  394. return;
  395. }
  396. if (phdr_index >= max_index) {
  397. break;
  398. }
  399. }
  400. }
  401. /* write elf header, PT_NOTE and elf note to vmcore. */
  402. static void dump_begin(DumpState *s, Error **errp)
  403. {
  404. Error *local_err = NULL;
  405. /*
  406. * the vmcore's format is:
  407. * --------------
  408. * | elf header |
  409. * --------------
  410. * | PT_NOTE |
  411. * --------------
  412. * | PT_LOAD |
  413. * --------------
  414. * | ...... |
  415. * --------------
  416. * | PT_LOAD |
  417. * --------------
  418. * | sec_hdr |
  419. * --------------
  420. * | elf note |
  421. * --------------
  422. * | memory |
  423. * --------------
  424. *
  425. * we only know where the memory is saved after we write elf note into
  426. * vmcore.
  427. */
  428. /* write elf header to vmcore */
  429. if (s->dump_info.d_class == ELFCLASS64) {
  430. write_elf64_header(s, &local_err);
  431. } else {
  432. write_elf32_header(s, &local_err);
  433. }
  434. if (local_err) {
  435. error_propagate(errp, local_err);
  436. return;
  437. }
  438. if (s->dump_info.d_class == ELFCLASS64) {
  439. /* write PT_NOTE to vmcore */
  440. write_elf64_note(s, &local_err);
  441. if (local_err) {
  442. error_propagate(errp, local_err);
  443. return;
  444. }
  445. /* write all PT_LOAD to vmcore */
  446. write_elf_loads(s, &local_err);
  447. if (local_err) {
  448. error_propagate(errp, local_err);
  449. return;
  450. }
  451. /* write section to vmcore */
  452. if (s->have_section) {
  453. write_elf_section(s, 1, &local_err);
  454. if (local_err) {
  455. error_propagate(errp, local_err);
  456. return;
  457. }
  458. }
  459. /* write notes to vmcore */
  460. write_elf64_notes(fd_write_vmcore, s, &local_err);
  461. if (local_err) {
  462. error_propagate(errp, local_err);
  463. return;
  464. }
  465. } else {
  466. /* write PT_NOTE to vmcore */
  467. write_elf32_note(s, &local_err);
  468. if (local_err) {
  469. error_propagate(errp, local_err);
  470. return;
  471. }
  472. /* write all PT_LOAD to vmcore */
  473. write_elf_loads(s, &local_err);
  474. if (local_err) {
  475. error_propagate(errp, local_err);
  476. return;
  477. }
  478. /* write section to vmcore */
  479. if (s->have_section) {
  480. write_elf_section(s, 0, &local_err);
  481. if (local_err) {
  482. error_propagate(errp, local_err);
  483. return;
  484. }
  485. }
  486. /* write notes to vmcore */
  487. write_elf32_notes(fd_write_vmcore, s, &local_err);
  488. if (local_err) {
  489. error_propagate(errp, local_err);
  490. return;
  491. }
  492. }
  493. }
  494. static void dump_completed(DumpState *s)
  495. {
  496. dump_cleanup(s);
  497. }
  498. static int get_next_block(DumpState *s, GuestPhysBlock *block)
  499. {
  500. while (1) {
  501. block = QTAILQ_NEXT(block, next);
  502. if (!block) {
  503. /* no more block */
  504. return 1;
  505. }
  506. s->start = 0;
  507. s->next_block = block;
  508. if (s->has_filter) {
  509. if (block->target_start >= s->begin + s->length ||
  510. block->target_end <= s->begin) {
  511. /* This block is out of the range */
  512. continue;
  513. }
  514. if (s->begin > block->target_start) {
  515. s->start = s->begin - block->target_start;
  516. }
  517. }
  518. return 0;
  519. }
  520. }
  521. /* write all memory to vmcore */
  522. static void dump_iterate(DumpState *s, Error **errp)
  523. {
  524. GuestPhysBlock *block;
  525. int64_t size;
  526. Error *local_err = NULL;
  527. do {
  528. block = s->next_block;
  529. size = block->target_end - block->target_start;
  530. if (s->has_filter) {
  531. size -= s->start;
  532. if (s->begin + s->length < block->target_end) {
  533. size -= block->target_end - (s->begin + s->length);
  534. }
  535. }
  536. write_memory(s, block, s->start, size, &local_err);
  537. if (local_err) {
  538. error_propagate(errp, local_err);
  539. return;
  540. }
  541. } while (!get_next_block(s, block));
  542. dump_completed(s);
  543. }
  544. static void create_vmcore(DumpState *s, Error **errp)
  545. {
  546. Error *local_err = NULL;
  547. dump_begin(s, &local_err);
  548. if (local_err) {
  549. error_propagate(errp, local_err);
  550. return;
  551. }
  552. dump_iterate(s, errp);
  553. }
  554. static int write_start_flat_header(int fd)
  555. {
  556. MakedumpfileHeader *mh;
  557. int ret = 0;
  558. QEMU_BUILD_BUG_ON(sizeof *mh > MAX_SIZE_MDF_HEADER);
  559. mh = g_malloc0(MAX_SIZE_MDF_HEADER);
  560. memcpy(mh->signature, MAKEDUMPFILE_SIGNATURE,
  561. MIN(sizeof mh->signature, sizeof MAKEDUMPFILE_SIGNATURE));
  562. mh->type = cpu_to_be64(TYPE_FLAT_HEADER);
  563. mh->version = cpu_to_be64(VERSION_FLAT_HEADER);
  564. size_t written_size;
  565. written_size = qemu_write_full(fd, mh, MAX_SIZE_MDF_HEADER);
  566. if (written_size != MAX_SIZE_MDF_HEADER) {
  567. ret = -1;
  568. }
  569. g_free(mh);
  570. return ret;
  571. }
  572. static int write_end_flat_header(int fd)
  573. {
  574. MakedumpfileDataHeader mdh;
  575. mdh.offset = END_FLAG_FLAT_HEADER;
  576. mdh.buf_size = END_FLAG_FLAT_HEADER;
  577. size_t written_size;
  578. written_size = qemu_write_full(fd, &mdh, sizeof(mdh));
  579. if (written_size != sizeof(mdh)) {
  580. return -1;
  581. }
  582. return 0;
  583. }
  584. static int write_buffer(int fd, off_t offset, const void *buf, size_t size)
  585. {
  586. size_t written_size;
  587. MakedumpfileDataHeader mdh;
  588. mdh.offset = cpu_to_be64(offset);
  589. mdh.buf_size = cpu_to_be64(size);
  590. written_size = qemu_write_full(fd, &mdh, sizeof(mdh));
  591. if (written_size != sizeof(mdh)) {
  592. return -1;
  593. }
  594. written_size = qemu_write_full(fd, buf, size);
  595. if (written_size != size) {
  596. return -1;
  597. }
  598. return 0;
  599. }
  600. static int buf_write_note(const void *buf, size_t size, void *opaque)
  601. {
  602. DumpState *s = opaque;
  603. /* note_buf is not enough */
  604. if (s->note_buf_offset + size > s->note_size) {
  605. return -1;
  606. }
  607. memcpy(s->note_buf + s->note_buf_offset, buf, size);
  608. s->note_buf_offset += size;
  609. return 0;
  610. }
  611. /* write common header, sub header and elf note to vmcore */
  612. static void create_header32(DumpState *s, Error **errp)
  613. {
  614. DiskDumpHeader32 *dh = NULL;
  615. KdumpSubHeader32 *kh = NULL;
  616. size_t size;
  617. uint32_t block_size;
  618. uint32_t sub_hdr_size;
  619. uint32_t bitmap_blocks;
  620. uint32_t status = 0;
  621. uint64_t offset_note;
  622. Error *local_err = NULL;
  623. /* write common header, the version of kdump-compressed format is 6th */
  624. size = sizeof(DiskDumpHeader32);
  625. dh = g_malloc0(size);
  626. strncpy(dh->signature, KDUMP_SIGNATURE, strlen(KDUMP_SIGNATURE));
  627. dh->header_version = cpu_to_dump32(s, 6);
  628. block_size = TARGET_PAGE_SIZE;
  629. dh->block_size = cpu_to_dump32(s, block_size);
  630. sub_hdr_size = sizeof(struct KdumpSubHeader32) + s->note_size;
  631. sub_hdr_size = DIV_ROUND_UP(sub_hdr_size, block_size);
  632. dh->sub_hdr_size = cpu_to_dump32(s, sub_hdr_size);
  633. /* dh->max_mapnr may be truncated, full 64bit is in kh.max_mapnr_64 */
  634. dh->max_mapnr = cpu_to_dump32(s, MIN(s->max_mapnr, UINT_MAX));
  635. dh->nr_cpus = cpu_to_dump32(s, s->nr_cpus);
  636. bitmap_blocks = DIV_ROUND_UP(s->len_dump_bitmap, block_size) * 2;
  637. dh->bitmap_blocks = cpu_to_dump32(s, bitmap_blocks);
  638. strncpy(dh->utsname.machine, ELF_MACHINE_UNAME, sizeof(dh->utsname.machine));
  639. if (s->flag_compress & DUMP_DH_COMPRESSED_ZLIB) {
  640. status |= DUMP_DH_COMPRESSED_ZLIB;
  641. }
  642. #ifdef CONFIG_LZO
  643. if (s->flag_compress & DUMP_DH_COMPRESSED_LZO) {
  644. status |= DUMP_DH_COMPRESSED_LZO;
  645. }
  646. #endif
  647. #ifdef CONFIG_SNAPPY
  648. if (s->flag_compress & DUMP_DH_COMPRESSED_SNAPPY) {
  649. status |= DUMP_DH_COMPRESSED_SNAPPY;
  650. }
  651. #endif
  652. dh->status = cpu_to_dump32(s, status);
  653. if (write_buffer(s->fd, 0, dh, size) < 0) {
  654. dump_error(s, "dump: failed to write disk dump header", errp);
  655. goto out;
  656. }
  657. /* write sub header */
  658. size = sizeof(KdumpSubHeader32);
  659. kh = g_malloc0(size);
  660. /* 64bit max_mapnr_64 */
  661. kh->max_mapnr_64 = cpu_to_dump64(s, s->max_mapnr);
  662. kh->phys_base = cpu_to_dump32(s, PHYS_BASE);
  663. kh->dump_level = cpu_to_dump32(s, DUMP_LEVEL);
  664. offset_note = DISKDUMP_HEADER_BLOCKS * block_size + size;
  665. kh->offset_note = cpu_to_dump64(s, offset_note);
  666. kh->note_size = cpu_to_dump32(s, s->note_size);
  667. if (write_buffer(s->fd, DISKDUMP_HEADER_BLOCKS *
  668. block_size, kh, size) < 0) {
  669. dump_error(s, "dump: failed to write kdump sub header", errp);
  670. goto out;
  671. }
  672. /* write note */
  673. s->note_buf = g_malloc0(s->note_size);
  674. s->note_buf_offset = 0;
  675. /* use s->note_buf to store notes temporarily */
  676. write_elf32_notes(buf_write_note, s, &local_err);
  677. if (local_err) {
  678. error_propagate(errp, local_err);
  679. goto out;
  680. }
  681. if (write_buffer(s->fd, offset_note, s->note_buf,
  682. s->note_size) < 0) {
  683. dump_error(s, "dump: failed to write notes", errp);
  684. goto out;
  685. }
  686. /* get offset of dump_bitmap */
  687. s->offset_dump_bitmap = (DISKDUMP_HEADER_BLOCKS + sub_hdr_size) *
  688. block_size;
  689. /* get offset of page */
  690. s->offset_page = (DISKDUMP_HEADER_BLOCKS + sub_hdr_size + bitmap_blocks) *
  691. block_size;
  692. out:
  693. g_free(dh);
  694. g_free(kh);
  695. g_free(s->note_buf);
  696. }
  697. /* write common header, sub header and elf note to vmcore */
  698. static void create_header64(DumpState *s, Error **errp)
  699. {
  700. DiskDumpHeader64 *dh = NULL;
  701. KdumpSubHeader64 *kh = NULL;
  702. size_t size;
  703. uint32_t block_size;
  704. uint32_t sub_hdr_size;
  705. uint32_t bitmap_blocks;
  706. uint32_t status = 0;
  707. uint64_t offset_note;
  708. Error *local_err = NULL;
  709. /* write common header, the version of kdump-compressed format is 6th */
  710. size = sizeof(DiskDumpHeader64);
  711. dh = g_malloc0(size);
  712. strncpy(dh->signature, KDUMP_SIGNATURE, strlen(KDUMP_SIGNATURE));
  713. dh->header_version = cpu_to_dump32(s, 6);
  714. block_size = TARGET_PAGE_SIZE;
  715. dh->block_size = cpu_to_dump32(s, block_size);
  716. sub_hdr_size = sizeof(struct KdumpSubHeader64) + s->note_size;
  717. sub_hdr_size = DIV_ROUND_UP(sub_hdr_size, block_size);
  718. dh->sub_hdr_size = cpu_to_dump32(s, sub_hdr_size);
  719. /* dh->max_mapnr may be truncated, full 64bit is in kh.max_mapnr_64 */
  720. dh->max_mapnr = cpu_to_dump32(s, MIN(s->max_mapnr, UINT_MAX));
  721. dh->nr_cpus = cpu_to_dump32(s, s->nr_cpus);
  722. bitmap_blocks = DIV_ROUND_UP(s->len_dump_bitmap, block_size) * 2;
  723. dh->bitmap_blocks = cpu_to_dump32(s, bitmap_blocks);
  724. strncpy(dh->utsname.machine, ELF_MACHINE_UNAME, sizeof(dh->utsname.machine));
  725. if (s->flag_compress & DUMP_DH_COMPRESSED_ZLIB) {
  726. status |= DUMP_DH_COMPRESSED_ZLIB;
  727. }
  728. #ifdef CONFIG_LZO
  729. if (s->flag_compress & DUMP_DH_COMPRESSED_LZO) {
  730. status |= DUMP_DH_COMPRESSED_LZO;
  731. }
  732. #endif
  733. #ifdef CONFIG_SNAPPY
  734. if (s->flag_compress & DUMP_DH_COMPRESSED_SNAPPY) {
  735. status |= DUMP_DH_COMPRESSED_SNAPPY;
  736. }
  737. #endif
  738. dh->status = cpu_to_dump32(s, status);
  739. if (write_buffer(s->fd, 0, dh, size) < 0) {
  740. dump_error(s, "dump: failed to write disk dump header", errp);
  741. goto out;
  742. }
  743. /* write sub header */
  744. size = sizeof(KdumpSubHeader64);
  745. kh = g_malloc0(size);
  746. /* 64bit max_mapnr_64 */
  747. kh->max_mapnr_64 = cpu_to_dump64(s, s->max_mapnr);
  748. kh->phys_base = cpu_to_dump64(s, PHYS_BASE);
  749. kh->dump_level = cpu_to_dump32(s, DUMP_LEVEL);
  750. offset_note = DISKDUMP_HEADER_BLOCKS * block_size + size;
  751. kh->offset_note = cpu_to_dump64(s, offset_note);
  752. kh->note_size = cpu_to_dump64(s, s->note_size);
  753. if (write_buffer(s->fd, DISKDUMP_HEADER_BLOCKS *
  754. block_size, kh, size) < 0) {
  755. dump_error(s, "dump: failed to write kdump sub header", errp);
  756. goto out;
  757. }
  758. /* write note */
  759. s->note_buf = g_malloc0(s->note_size);
  760. s->note_buf_offset = 0;
  761. /* use s->note_buf to store notes temporarily */
  762. write_elf64_notes(buf_write_note, s, &local_err);
  763. if (local_err) {
  764. error_propagate(errp, local_err);
  765. goto out;
  766. }
  767. if (write_buffer(s->fd, offset_note, s->note_buf,
  768. s->note_size) < 0) {
  769. dump_error(s, "dump: failed to write notes", errp);
  770. goto out;
  771. }
  772. /* get offset of dump_bitmap */
  773. s->offset_dump_bitmap = (DISKDUMP_HEADER_BLOCKS + sub_hdr_size) *
  774. block_size;
  775. /* get offset of page */
  776. s->offset_page = (DISKDUMP_HEADER_BLOCKS + sub_hdr_size + bitmap_blocks) *
  777. block_size;
  778. out:
  779. g_free(dh);
  780. g_free(kh);
  781. g_free(s->note_buf);
  782. }
  783. static void write_dump_header(DumpState *s, Error **errp)
  784. {
  785. Error *local_err = NULL;
  786. if (s->dump_info.d_class == ELFCLASS32) {
  787. create_header32(s, &local_err);
  788. } else {
  789. create_header64(s, &local_err);
  790. }
  791. if (local_err) {
  792. error_propagate(errp, local_err);
  793. }
  794. }
  795. /*
  796. * set dump_bitmap sequencely. the bit before last_pfn is not allowed to be
  797. * rewritten, so if need to set the first bit, set last_pfn and pfn to 0.
  798. * set_dump_bitmap will always leave the recently set bit un-sync. And setting
  799. * (last bit + sizeof(buf) * 8) to 0 will do flushing the content in buf into
  800. * vmcore, ie. synchronizing un-sync bit into vmcore.
  801. */
  802. static int set_dump_bitmap(uint64_t last_pfn, uint64_t pfn, bool value,
  803. uint8_t *buf, DumpState *s)
  804. {
  805. off_t old_offset, new_offset;
  806. off_t offset_bitmap1, offset_bitmap2;
  807. uint32_t byte, bit;
  808. /* should not set the previous place */
  809. assert(last_pfn <= pfn);
  810. /*
  811. * if the bit needed to be set is not cached in buf, flush the data in buf
  812. * to vmcore firstly.
  813. * making new_offset be bigger than old_offset can also sync remained data
  814. * into vmcore.
  815. */
  816. old_offset = BUFSIZE_BITMAP * (last_pfn / PFN_BUFBITMAP);
  817. new_offset = BUFSIZE_BITMAP * (pfn / PFN_BUFBITMAP);
  818. while (old_offset < new_offset) {
  819. /* calculate the offset and write dump_bitmap */
  820. offset_bitmap1 = s->offset_dump_bitmap + old_offset;
  821. if (write_buffer(s->fd, offset_bitmap1, buf,
  822. BUFSIZE_BITMAP) < 0) {
  823. return -1;
  824. }
  825. /* dump level 1 is chosen, so 1st and 2nd bitmap are same */
  826. offset_bitmap2 = s->offset_dump_bitmap + s->len_dump_bitmap +
  827. old_offset;
  828. if (write_buffer(s->fd, offset_bitmap2, buf,
  829. BUFSIZE_BITMAP) < 0) {
  830. return -1;
  831. }
  832. memset(buf, 0, BUFSIZE_BITMAP);
  833. old_offset += BUFSIZE_BITMAP;
  834. }
  835. /* get the exact place of the bit in the buf, and set it */
  836. byte = (pfn % PFN_BUFBITMAP) / CHAR_BIT;
  837. bit = (pfn % PFN_BUFBITMAP) % CHAR_BIT;
  838. if (value) {
  839. buf[byte] |= 1u << bit;
  840. } else {
  841. buf[byte] &= ~(1u << bit);
  842. }
  843. return 0;
  844. }
  845. /*
  846. * exam every page and return the page frame number and the address of the page.
  847. * bufptr can be NULL. note: the blocks here is supposed to reflect guest-phys
  848. * blocks, so block->target_start and block->target_end should be interal
  849. * multiples of the target page size.
  850. */
  851. static bool get_next_page(GuestPhysBlock **blockptr, uint64_t *pfnptr,
  852. uint8_t **bufptr, DumpState *s)
  853. {
  854. GuestPhysBlock *block = *blockptr;
  855. hwaddr addr;
  856. uint8_t *buf;
  857. /* block == NULL means the start of the iteration */
  858. if (!block) {
  859. block = QTAILQ_FIRST(&s->guest_phys_blocks.head);
  860. *blockptr = block;
  861. assert((block->target_start & ~TARGET_PAGE_MASK) == 0);
  862. assert((block->target_end & ~TARGET_PAGE_MASK) == 0);
  863. *pfnptr = paddr_to_pfn(block->target_start);
  864. if (bufptr) {
  865. *bufptr = block->host_addr;
  866. }
  867. return true;
  868. }
  869. *pfnptr = *pfnptr + 1;
  870. addr = pfn_to_paddr(*pfnptr);
  871. if ((addr >= block->target_start) &&
  872. (addr + TARGET_PAGE_SIZE <= block->target_end)) {
  873. buf = block->host_addr + (addr - block->target_start);
  874. } else {
  875. /* the next page is in the next block */
  876. block = QTAILQ_NEXT(block, next);
  877. *blockptr = block;
  878. if (!block) {
  879. return false;
  880. }
  881. assert((block->target_start & ~TARGET_PAGE_MASK) == 0);
  882. assert((block->target_end & ~TARGET_PAGE_MASK) == 0);
  883. *pfnptr = paddr_to_pfn(block->target_start);
  884. buf = block->host_addr;
  885. }
  886. if (bufptr) {
  887. *bufptr = buf;
  888. }
  889. return true;
  890. }
  891. static void write_dump_bitmap(DumpState *s, Error **errp)
  892. {
  893. int ret = 0;
  894. uint64_t last_pfn, pfn;
  895. void *dump_bitmap_buf;
  896. size_t num_dumpable;
  897. GuestPhysBlock *block_iter = NULL;
  898. /* dump_bitmap_buf is used to store dump_bitmap temporarily */
  899. dump_bitmap_buf = g_malloc0(BUFSIZE_BITMAP);
  900. num_dumpable = 0;
  901. last_pfn = 0;
  902. /*
  903. * exam memory page by page, and set the bit in dump_bitmap corresponded
  904. * to the existing page.
  905. */
  906. while (get_next_page(&block_iter, &pfn, NULL, s)) {
  907. ret = set_dump_bitmap(last_pfn, pfn, true, dump_bitmap_buf, s);
  908. if (ret < 0) {
  909. dump_error(s, "dump: failed to set dump_bitmap", errp);
  910. goto out;
  911. }
  912. last_pfn = pfn;
  913. num_dumpable++;
  914. }
  915. /*
  916. * set_dump_bitmap will always leave the recently set bit un-sync. Here we
  917. * set last_pfn + PFN_BUFBITMAP to 0 and those set but un-sync bit will be
  918. * synchronized into vmcore.
  919. */
  920. if (num_dumpable > 0) {
  921. ret = set_dump_bitmap(last_pfn, last_pfn + PFN_BUFBITMAP, false,
  922. dump_bitmap_buf, s);
  923. if (ret < 0) {
  924. dump_error(s, "dump: failed to sync dump_bitmap", errp);
  925. goto out;
  926. }
  927. }
  928. /* number of dumpable pages that will be dumped later */
  929. s->num_dumpable = num_dumpable;
  930. out:
  931. g_free(dump_bitmap_buf);
  932. }
  933. static void prepare_data_cache(DataCache *data_cache, DumpState *s,
  934. off_t offset)
  935. {
  936. data_cache->fd = s->fd;
  937. data_cache->data_size = 0;
  938. data_cache->buf_size = BUFSIZE_DATA_CACHE;
  939. data_cache->buf = g_malloc0(BUFSIZE_DATA_CACHE);
  940. data_cache->offset = offset;
  941. }
  942. static int write_cache(DataCache *dc, const void *buf, size_t size,
  943. bool flag_sync)
  944. {
  945. /*
  946. * dc->buf_size should not be less than size, otherwise dc will never be
  947. * enough
  948. */
  949. assert(size <= dc->buf_size);
  950. /*
  951. * if flag_sync is set, synchronize data in dc->buf into vmcore.
  952. * otherwise check if the space is enough for caching data in buf, if not,
  953. * write the data in dc->buf to dc->fd and reset dc->buf
  954. */
  955. if ((!flag_sync && dc->data_size + size > dc->buf_size) ||
  956. (flag_sync && dc->data_size > 0)) {
  957. if (write_buffer(dc->fd, dc->offset, dc->buf, dc->data_size) < 0) {
  958. return -1;
  959. }
  960. dc->offset += dc->data_size;
  961. dc->data_size = 0;
  962. }
  963. if (!flag_sync) {
  964. memcpy(dc->buf + dc->data_size, buf, size);
  965. dc->data_size += size;
  966. }
  967. return 0;
  968. }
  969. static void free_data_cache(DataCache *data_cache)
  970. {
  971. g_free(data_cache->buf);
  972. }
  973. static size_t get_len_buf_out(size_t page_size, uint32_t flag_compress)
  974. {
  975. switch (flag_compress) {
  976. case DUMP_DH_COMPRESSED_ZLIB:
  977. return compressBound(page_size);
  978. case DUMP_DH_COMPRESSED_LZO:
  979. /*
  980. * LZO will expand incompressible data by a little amount. Please check
  981. * the following URL to see the expansion calculation:
  982. * http://www.oberhumer.com/opensource/lzo/lzofaq.php
  983. */
  984. return page_size + page_size / 16 + 64 + 3;
  985. #ifdef CONFIG_SNAPPY
  986. case DUMP_DH_COMPRESSED_SNAPPY:
  987. return snappy_max_compressed_length(page_size);
  988. #endif
  989. }
  990. return 0;
  991. }
  992. /*
  993. * check if the page is all 0
  994. */
  995. static inline bool is_zero_page(const uint8_t *buf, size_t page_size)
  996. {
  997. return buffer_is_zero(buf, page_size);
  998. }
  999. static void write_dump_pages(DumpState *s, Error **errp)
  1000. {
  1001. int ret = 0;
  1002. DataCache page_desc, page_data;
  1003. size_t len_buf_out, size_out;
  1004. #ifdef CONFIG_LZO
  1005. lzo_bytep wrkmem = NULL;
  1006. #endif
  1007. uint8_t *buf_out = NULL;
  1008. off_t offset_desc, offset_data;
  1009. PageDescriptor pd, pd_zero;
  1010. uint8_t *buf;
  1011. GuestPhysBlock *block_iter = NULL;
  1012. uint64_t pfn_iter;
  1013. /* get offset of page_desc and page_data in dump file */
  1014. offset_desc = s->offset_page;
  1015. offset_data = offset_desc + sizeof(PageDescriptor) * s->num_dumpable;
  1016. prepare_data_cache(&page_desc, s, offset_desc);
  1017. prepare_data_cache(&page_data, s, offset_data);
  1018. /* prepare buffer to store compressed data */
  1019. len_buf_out = get_len_buf_out(TARGET_PAGE_SIZE, s->flag_compress);
  1020. assert(len_buf_out != 0);
  1021. #ifdef CONFIG_LZO
  1022. wrkmem = g_malloc(LZO1X_1_MEM_COMPRESS);
  1023. #endif
  1024. buf_out = g_malloc(len_buf_out);
  1025. /*
  1026. * init zero page's page_desc and page_data, because every zero page
  1027. * uses the same page_data
  1028. */
  1029. pd_zero.size = cpu_to_dump32(s, TARGET_PAGE_SIZE);
  1030. pd_zero.flags = cpu_to_dump32(s, 0);
  1031. pd_zero.offset = cpu_to_dump64(s, offset_data);
  1032. pd_zero.page_flags = cpu_to_dump64(s, 0);
  1033. buf = g_malloc0(TARGET_PAGE_SIZE);
  1034. ret = write_cache(&page_data, buf, TARGET_PAGE_SIZE, false);
  1035. g_free(buf);
  1036. if (ret < 0) {
  1037. dump_error(s, "dump: failed to write page data (zero page)", errp);
  1038. goto out;
  1039. }
  1040. offset_data += TARGET_PAGE_SIZE;
  1041. /*
  1042. * dump memory to vmcore page by page. zero page will all be resided in the
  1043. * first page of page section
  1044. */
  1045. while (get_next_page(&block_iter, &pfn_iter, &buf, s)) {
  1046. /* check zero page */
  1047. if (is_zero_page(buf, TARGET_PAGE_SIZE)) {
  1048. ret = write_cache(&page_desc, &pd_zero, sizeof(PageDescriptor),
  1049. false);
  1050. if (ret < 0) {
  1051. dump_error(s, "dump: failed to write page desc", errp);
  1052. goto out;
  1053. }
  1054. } else {
  1055. /*
  1056. * not zero page, then:
  1057. * 1. compress the page
  1058. * 2. write the compressed page into the cache of page_data
  1059. * 3. get page desc of the compressed page and write it into the
  1060. * cache of page_desc
  1061. *
  1062. * only one compression format will be used here, for
  1063. * s->flag_compress is set. But when compression fails to work,
  1064. * we fall back to save in plaintext.
  1065. */
  1066. size_out = len_buf_out;
  1067. if ((s->flag_compress & DUMP_DH_COMPRESSED_ZLIB) &&
  1068. (compress2(buf_out, (uLongf *)&size_out, buf,
  1069. TARGET_PAGE_SIZE, Z_BEST_SPEED) == Z_OK) &&
  1070. (size_out < TARGET_PAGE_SIZE)) {
  1071. pd.flags = cpu_to_dump32(s, DUMP_DH_COMPRESSED_ZLIB);
  1072. pd.size = cpu_to_dump32(s, size_out);
  1073. ret = write_cache(&page_data, buf_out, size_out, false);
  1074. if (ret < 0) {
  1075. dump_error(s, "dump: failed to write page data", errp);
  1076. goto out;
  1077. }
  1078. #ifdef CONFIG_LZO
  1079. } else if ((s->flag_compress & DUMP_DH_COMPRESSED_LZO) &&
  1080. (lzo1x_1_compress(buf, TARGET_PAGE_SIZE, buf_out,
  1081. (lzo_uint *)&size_out, wrkmem) == LZO_E_OK) &&
  1082. (size_out < TARGET_PAGE_SIZE)) {
  1083. pd.flags = cpu_to_dump32(s, DUMP_DH_COMPRESSED_LZO);
  1084. pd.size = cpu_to_dump32(s, size_out);
  1085. ret = write_cache(&page_data, buf_out, size_out, false);
  1086. if (ret < 0) {
  1087. dump_error(s, "dump: failed to write page data", errp);
  1088. goto out;
  1089. }
  1090. #endif
  1091. #ifdef CONFIG_SNAPPY
  1092. } else if ((s->flag_compress & DUMP_DH_COMPRESSED_SNAPPY) &&
  1093. (snappy_compress((char *)buf, TARGET_PAGE_SIZE,
  1094. (char *)buf_out, &size_out) == SNAPPY_OK) &&
  1095. (size_out < TARGET_PAGE_SIZE)) {
  1096. pd.flags = cpu_to_dump32(s, DUMP_DH_COMPRESSED_SNAPPY);
  1097. pd.size = cpu_to_dump32(s, size_out);
  1098. ret = write_cache(&page_data, buf_out, size_out, false);
  1099. if (ret < 0) {
  1100. dump_error(s, "dump: failed to write page data", errp);
  1101. goto out;
  1102. }
  1103. #endif
  1104. } else {
  1105. /*
  1106. * fall back to save in plaintext, size_out should be
  1107. * assigned TARGET_PAGE_SIZE
  1108. */
  1109. pd.flags = cpu_to_dump32(s, 0);
  1110. size_out = TARGET_PAGE_SIZE;
  1111. pd.size = cpu_to_dump32(s, size_out);
  1112. ret = write_cache(&page_data, buf, TARGET_PAGE_SIZE, false);
  1113. if (ret < 0) {
  1114. dump_error(s, "dump: failed to write page data", errp);
  1115. goto out;
  1116. }
  1117. }
  1118. /* get and write page desc here */
  1119. pd.page_flags = cpu_to_dump64(s, 0);
  1120. pd.offset = cpu_to_dump64(s, offset_data);
  1121. offset_data += size_out;
  1122. ret = write_cache(&page_desc, &pd, sizeof(PageDescriptor), false);
  1123. if (ret < 0) {
  1124. dump_error(s, "dump: failed to write page desc", errp);
  1125. goto out;
  1126. }
  1127. }
  1128. }
  1129. ret = write_cache(&page_desc, NULL, 0, true);
  1130. if (ret < 0) {
  1131. dump_error(s, "dump: failed to sync cache for page_desc", errp);
  1132. goto out;
  1133. }
  1134. ret = write_cache(&page_data, NULL, 0, true);
  1135. if (ret < 0) {
  1136. dump_error(s, "dump: failed to sync cache for page_data", errp);
  1137. goto out;
  1138. }
  1139. out:
  1140. free_data_cache(&page_desc);
  1141. free_data_cache(&page_data);
  1142. #ifdef CONFIG_LZO
  1143. g_free(wrkmem);
  1144. #endif
  1145. g_free(buf_out);
  1146. }
  1147. static void create_kdump_vmcore(DumpState *s, Error **errp)
  1148. {
  1149. int ret;
  1150. Error *local_err = NULL;
  1151. /*
  1152. * the kdump-compressed format is:
  1153. * File offset
  1154. * +------------------------------------------+ 0x0
  1155. * | main header (struct disk_dump_header) |
  1156. * |------------------------------------------+ block 1
  1157. * | sub header (struct kdump_sub_header) |
  1158. * |------------------------------------------+ block 2
  1159. * | 1st-dump_bitmap |
  1160. * |------------------------------------------+ block 2 + X blocks
  1161. * | 2nd-dump_bitmap | (aligned by block)
  1162. * |------------------------------------------+ block 2 + 2 * X blocks
  1163. * | page desc for pfn 0 (struct page_desc) | (aligned by block)
  1164. * | page desc for pfn 1 (struct page_desc) |
  1165. * | : |
  1166. * |------------------------------------------| (not aligned by block)
  1167. * | page data (pfn 0) |
  1168. * | page data (pfn 1) |
  1169. * | : |
  1170. * +------------------------------------------+
  1171. */
  1172. ret = write_start_flat_header(s->fd);
  1173. if (ret < 0) {
  1174. dump_error(s, "dump: failed to write start flat header", errp);
  1175. return;
  1176. }
  1177. write_dump_header(s, &local_err);
  1178. if (local_err) {
  1179. error_propagate(errp, local_err);
  1180. return;
  1181. }
  1182. write_dump_bitmap(s, &local_err);
  1183. if (local_err) {
  1184. error_propagate(errp, local_err);
  1185. return;
  1186. }
  1187. write_dump_pages(s, &local_err);
  1188. if (local_err) {
  1189. error_propagate(errp, local_err);
  1190. return;
  1191. }
  1192. ret = write_end_flat_header(s->fd);
  1193. if (ret < 0) {
  1194. dump_error(s, "dump: failed to write end flat header", errp);
  1195. return;
  1196. }
  1197. dump_completed(s);
  1198. }
  1199. static ram_addr_t get_start_block(DumpState *s)
  1200. {
  1201. GuestPhysBlock *block;
  1202. if (!s->has_filter) {
  1203. s->next_block = QTAILQ_FIRST(&s->guest_phys_blocks.head);
  1204. return 0;
  1205. }
  1206. QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) {
  1207. if (block->target_start >= s->begin + s->length ||
  1208. block->target_end <= s->begin) {
  1209. /* This block is out of the range */
  1210. continue;
  1211. }
  1212. s->next_block = block;
  1213. if (s->begin > block->target_start) {
  1214. s->start = s->begin - block->target_start;
  1215. } else {
  1216. s->start = 0;
  1217. }
  1218. return s->start;
  1219. }
  1220. return -1;
  1221. }
  1222. static void get_max_mapnr(DumpState *s)
  1223. {
  1224. GuestPhysBlock *last_block;
  1225. last_block = QTAILQ_LAST(&s->guest_phys_blocks.head, GuestPhysBlockHead);
  1226. s->max_mapnr = paddr_to_pfn(last_block->target_end);
  1227. }
  1228. static void dump_init(DumpState *s, int fd, bool has_format,
  1229. DumpGuestMemoryFormat format, bool paging, bool has_filter,
  1230. int64_t begin, int64_t length, Error **errp)
  1231. {
  1232. CPUState *cpu;
  1233. int nr_cpus;
  1234. Error *err = NULL;
  1235. int ret;
  1236. /* kdump-compressed is conflict with paging and filter */
  1237. if (has_format && format != DUMP_GUEST_MEMORY_FORMAT_ELF) {
  1238. assert(!paging && !has_filter);
  1239. }
  1240. if (runstate_is_running()) {
  1241. vm_stop(RUN_STATE_SAVE_VM);
  1242. s->resume = true;
  1243. } else {
  1244. s->resume = false;
  1245. }
  1246. /* If we use KVM, we should synchronize the registers before we get dump
  1247. * info or physmap info.
  1248. */
  1249. cpu_synchronize_all_states();
  1250. nr_cpus = 0;
  1251. CPU_FOREACH(cpu) {
  1252. nr_cpus++;
  1253. }
  1254. s->fd = fd;
  1255. s->has_filter = has_filter;
  1256. s->begin = begin;
  1257. s->length = length;
  1258. memory_mapping_list_init(&s->list);
  1259. guest_phys_blocks_init(&s->guest_phys_blocks);
  1260. guest_phys_blocks_append(&s->guest_phys_blocks);
  1261. s->start = get_start_block(s);
  1262. if (s->start == -1) {
  1263. error_set(errp, QERR_INVALID_PARAMETER, "begin");
  1264. goto cleanup;
  1265. }
  1266. /* get dump info: endian, class and architecture.
  1267. * If the target architecture is not supported, cpu_get_dump_info() will
  1268. * return -1.
  1269. */
  1270. ret = cpu_get_dump_info(&s->dump_info, &s->guest_phys_blocks);
  1271. if (ret < 0) {
  1272. error_set(errp, QERR_UNSUPPORTED);
  1273. goto cleanup;
  1274. }
  1275. s->note_size = cpu_get_note_size(s->dump_info.d_class,
  1276. s->dump_info.d_machine, nr_cpus);
  1277. if (s->note_size < 0) {
  1278. error_set(errp, QERR_UNSUPPORTED);
  1279. goto cleanup;
  1280. }
  1281. /* get memory mapping */
  1282. if (paging) {
  1283. qemu_get_guest_memory_mapping(&s->list, &s->guest_phys_blocks, &err);
  1284. if (err != NULL) {
  1285. error_propagate(errp, err);
  1286. goto cleanup;
  1287. }
  1288. } else {
  1289. qemu_get_guest_simple_memory_mapping(&s->list, &s->guest_phys_blocks);
  1290. }
  1291. s->nr_cpus = nr_cpus;
  1292. get_max_mapnr(s);
  1293. uint64_t tmp;
  1294. tmp = DIV_ROUND_UP(DIV_ROUND_UP(s->max_mapnr, CHAR_BIT), TARGET_PAGE_SIZE);
  1295. s->len_dump_bitmap = tmp * TARGET_PAGE_SIZE;
  1296. /* init for kdump-compressed format */
  1297. if (has_format && format != DUMP_GUEST_MEMORY_FORMAT_ELF) {
  1298. switch (format) {
  1299. case DUMP_GUEST_MEMORY_FORMAT_KDUMP_ZLIB:
  1300. s->flag_compress = DUMP_DH_COMPRESSED_ZLIB;
  1301. break;
  1302. case DUMP_GUEST_MEMORY_FORMAT_KDUMP_LZO:
  1303. #ifdef CONFIG_LZO
  1304. if (lzo_init() != LZO_E_OK) {
  1305. error_setg(errp, "failed to initialize the LZO library");
  1306. goto cleanup;
  1307. }
  1308. #endif
  1309. s->flag_compress = DUMP_DH_COMPRESSED_LZO;
  1310. break;
  1311. case DUMP_GUEST_MEMORY_FORMAT_KDUMP_SNAPPY:
  1312. s->flag_compress = DUMP_DH_COMPRESSED_SNAPPY;
  1313. break;
  1314. default:
  1315. s->flag_compress = 0;
  1316. }
  1317. return;
  1318. }
  1319. if (s->has_filter) {
  1320. memory_mapping_filter(&s->list, s->begin, s->length);
  1321. }
  1322. /*
  1323. * calculate phdr_num
  1324. *
  1325. * the type of ehdr->e_phnum is uint16_t, so we should avoid overflow
  1326. */
  1327. s->phdr_num = 1; /* PT_NOTE */
  1328. if (s->list.num < UINT16_MAX - 2) {
  1329. s->phdr_num += s->list.num;
  1330. s->have_section = false;
  1331. } else {
  1332. s->have_section = true;
  1333. s->phdr_num = PN_XNUM;
  1334. s->sh_info = 1; /* PT_NOTE */
  1335. /* the type of shdr->sh_info is uint32_t, so we should avoid overflow */
  1336. if (s->list.num <= UINT32_MAX - 1) {
  1337. s->sh_info += s->list.num;
  1338. } else {
  1339. s->sh_info = UINT32_MAX;
  1340. }
  1341. }
  1342. if (s->dump_info.d_class == ELFCLASS64) {
  1343. if (s->have_section) {
  1344. s->memory_offset = sizeof(Elf64_Ehdr) +
  1345. sizeof(Elf64_Phdr) * s->sh_info +
  1346. sizeof(Elf64_Shdr) + s->note_size;
  1347. } else {
  1348. s->memory_offset = sizeof(Elf64_Ehdr) +
  1349. sizeof(Elf64_Phdr) * s->phdr_num + s->note_size;
  1350. }
  1351. } else {
  1352. if (s->have_section) {
  1353. s->memory_offset = sizeof(Elf32_Ehdr) +
  1354. sizeof(Elf32_Phdr) * s->sh_info +
  1355. sizeof(Elf32_Shdr) + s->note_size;
  1356. } else {
  1357. s->memory_offset = sizeof(Elf32_Ehdr) +
  1358. sizeof(Elf32_Phdr) * s->phdr_num + s->note_size;
  1359. }
  1360. }
  1361. return;
  1362. cleanup:
  1363. dump_cleanup(s);
  1364. }
  1365. void qmp_dump_guest_memory(bool paging, const char *file, bool has_begin,
  1366. int64_t begin, bool has_length,
  1367. int64_t length, bool has_format,
  1368. DumpGuestMemoryFormat format, Error **errp)
  1369. {
  1370. const char *p;
  1371. int fd = -1;
  1372. DumpState *s;
  1373. Error *local_err = NULL;
  1374. /*
  1375. * kdump-compressed format need the whole memory dumped, so paging or
  1376. * filter is not supported here.
  1377. */
  1378. if ((has_format && format != DUMP_GUEST_MEMORY_FORMAT_ELF) &&
  1379. (paging || has_begin || has_length)) {
  1380. error_setg(errp, "kdump-compressed format doesn't support paging or "
  1381. "filter");
  1382. return;
  1383. }
  1384. if (has_begin && !has_length) {
  1385. error_set(errp, QERR_MISSING_PARAMETER, "length");
  1386. return;
  1387. }
  1388. if (!has_begin && has_length) {
  1389. error_set(errp, QERR_MISSING_PARAMETER, "begin");
  1390. return;
  1391. }
  1392. /* check whether lzo/snappy is supported */
  1393. #ifndef CONFIG_LZO
  1394. if (has_format && format == DUMP_GUEST_MEMORY_FORMAT_KDUMP_LZO) {
  1395. error_setg(errp, "kdump-lzo is not available now");
  1396. return;
  1397. }
  1398. #endif
  1399. #ifndef CONFIG_SNAPPY
  1400. if (has_format && format == DUMP_GUEST_MEMORY_FORMAT_KDUMP_SNAPPY) {
  1401. error_setg(errp, "kdump-snappy is not available now");
  1402. return;
  1403. }
  1404. #endif
  1405. #if !defined(WIN32)
  1406. if (strstart(file, "fd:", &p)) {
  1407. fd = monitor_get_fd(cur_mon, p, errp);
  1408. if (fd == -1) {
  1409. return;
  1410. }
  1411. }
  1412. #endif
  1413. if (strstart(file, "file:", &p)) {
  1414. fd = qemu_open(p, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, S_IRUSR);
  1415. if (fd < 0) {
  1416. error_setg_file_open(errp, errno, p);
  1417. return;
  1418. }
  1419. }
  1420. if (fd == -1) {
  1421. error_set(errp, QERR_INVALID_PARAMETER, "protocol");
  1422. return;
  1423. }
  1424. s = g_malloc0(sizeof(DumpState));
  1425. dump_init(s, fd, has_format, format, paging, has_begin,
  1426. begin, length, &local_err);
  1427. if (local_err) {
  1428. g_free(s);
  1429. error_propagate(errp, local_err);
  1430. return;
  1431. }
  1432. if (has_format && format != DUMP_GUEST_MEMORY_FORMAT_ELF) {
  1433. create_kdump_vmcore(s, errp);
  1434. } else {
  1435. create_vmcore(s, errp);
  1436. }
  1437. g_free(s);
  1438. }
  1439. DumpGuestMemoryCapability *qmp_query_dump_guest_memory_capability(Error **errp)
  1440. {
  1441. DumpGuestMemoryFormatList *item;
  1442. DumpGuestMemoryCapability *cap =
  1443. g_malloc0(sizeof(DumpGuestMemoryCapability));
  1444. /* elf is always available */
  1445. item = g_malloc0(sizeof(DumpGuestMemoryFormatList));
  1446. cap->formats = item;
  1447. item->value = DUMP_GUEST_MEMORY_FORMAT_ELF;
  1448. /* kdump-zlib is always available */
  1449. item->next = g_malloc0(sizeof(DumpGuestMemoryFormatList));
  1450. item = item->next;
  1451. item->value = DUMP_GUEST_MEMORY_FORMAT_KDUMP_ZLIB;
  1452. /* add new item if kdump-lzo is available */
  1453. #ifdef CONFIG_LZO
  1454. item->next = g_malloc0(sizeof(DumpGuestMemoryFormatList));
  1455. item = item->next;
  1456. item->value = DUMP_GUEST_MEMORY_FORMAT_KDUMP_LZO;
  1457. #endif
  1458. /* add new item if kdump-snappy is available */
  1459. #ifdef CONFIG_SNAPPY
  1460. item->next = g_malloc0(sizeof(DumpGuestMemoryFormatList));
  1461. item = item->next;
  1462. item->value = DUMP_GUEST_MEMORY_FORMAT_KDUMP_SNAPPY;
  1463. #endif
  1464. return cap;
  1465. }