write.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include "snap.h"
  5. char *pfile[Npfile] = {
  6. [Psegment] "segment",
  7. [Pfd] "fd",
  8. [Pfpregs] "fpregs",
  9. [Pnoteid] "noteid",
  10. [Pkregs] "kregs",
  11. [Pns] "ns",
  12. [Pproc] "proc",
  13. [Pregs] "regs",
  14. [Pstatus] "status",
  15. };
  16. static void
  17. writeseg(Biobuf *b, Proc *proc, Seg *s)
  18. {
  19. int i, npg;
  20. Page **pp, *p;
  21. int type;
  22. if(s == nil){
  23. Bprint(b, "%-11ud %-11ud ", 0, 0);
  24. return;
  25. }
  26. type = proc->text == s ? 't' : 'm';
  27. npg = (s->len+Pagesize-1)/Pagesize;
  28. if(npg != s->npg)
  29. abort();
  30. Bprint(b, "%-11llud %-11llud ", s->offset, s->len);
  31. if(s->len == 0)
  32. return;
  33. for(i=0, pp=s->pg, p=*pp; i<npg; i++, pp++, p=*pp) {
  34. if(p->written) {
  35. if(p->type == 'z') {
  36. Bprint(b, "z");
  37. continue;
  38. }
  39. Bprint(b, "%c%-11ld %-11llud ", p->type, p->pid, p->offset);
  40. } else {
  41. Bprint(b, "r");
  42. Bwrite(b, p->data, p->len);
  43. if(p->len != Pagesize && i != npg-1)
  44. abort();
  45. p->written = 1;
  46. p->type = type;
  47. p->offset = s->offset + i*Pagesize;
  48. p->pid = proc->pid;
  49. }
  50. }
  51. }
  52. void
  53. writesnap(Biobuf *b, Proc *p)
  54. {
  55. int i, n;
  56. Data *d;
  57. for(i=0; i<Npfile; i++)
  58. if(d = p->d[i]) {
  59. Bprint(b, "%-11ld %s\n%-11lud ", p->pid, pfile[i], d->len);
  60. Bwrite(b, d->data, d->len);
  61. }
  62. if(p->text) {
  63. Bprint(b, "%-11ld text\n", p->pid);
  64. writeseg(b, p, p->text);
  65. }
  66. if(n = p->nseg) {
  67. Bprint(b, "%-11ld mem\n%-11d ", p->pid, n);
  68. for(i=0; i<n; i++)
  69. writeseg(b, p, p->seg[i]);
  70. }
  71. }