write.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. type = proc->text == s ? 't' : 'm';
  23. npg = (s->len+Pagesize-1)/Pagesize;
  24. if(npg != s->npg)
  25. abort();
  26. Bprint(b, "%-11lud %-11lud ", s->offset, s->len);
  27. if(s->len == 0)
  28. return;
  29. for(i=0, pp=s->pg, p=*pp; i<npg; i++, pp++, p=*pp) {
  30. if(p->written) {
  31. if(p->type == 'z') {
  32. Bprint(b, "z");
  33. continue;
  34. }
  35. Bprint(b, "%c%-11ld %-11lud ", p->type, p->pid, p->offset);
  36. } else {
  37. Bprint(b, "r");
  38. Bwrite(b, p->data, p->len);
  39. if(p->len != Pagesize && i != npg-1)
  40. abort();
  41. p->written = 1;
  42. p->type = type;
  43. p->offset = s->offset + i*Pagesize;
  44. p->pid = proc->pid;
  45. }
  46. }
  47. }
  48. void
  49. writesnap(Biobuf *b, Proc *p)
  50. {
  51. int i, n;
  52. Data *d;
  53. for(i=0; i<Npfile; i++)
  54. if(d = p->d[i]) {
  55. Bprint(b, "%-11ld %s\n%-11lud ", p->pid, pfile[i], d->len);
  56. Bwrite(b, d->data, d->len);
  57. }
  58. if(p->text) {
  59. Bprint(b, "%-11ld text\n", p->pid);
  60. writeseg(b, p, p->text);
  61. }
  62. if(n = p->nseg) {
  63. Bprint(b, "%-11ld mem\n%-11d ", p->pid, n);
  64. for(i=0; i<n; i++)
  65. writeseg(b, p, p->seg[i]);
  66. }
  67. }