setup.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. /*
  2. * init routines
  3. */
  4. #include "defs.h"
  5. #include "fns.h"
  6. char *symfil;
  7. char *corfil;
  8. Map *symmap;
  9. Map *cormap;
  10. Map *dotmap;
  11. int fsym, fcor;
  12. static Fhdr fhdr;
  13. static int getfile(char*, int, int);
  14. void
  15. setsym(void)
  16. {
  17. Symbol s;
  18. if((fsym = getfile(symfil, 1, wtflag)) < 0) {
  19. symmap = dumbmap(-1);
  20. return;
  21. }
  22. if (crackhdr(fsym, &fhdr)) {
  23. machbytype(fhdr.type);
  24. symmap = loadmap(symmap, fsym, &fhdr);
  25. if (symmap == 0)
  26. symmap = dumbmap(fsym);
  27. if (syminit(fsym, &fhdr) < 0)
  28. dprint("%r\n");
  29. if (mach->sbreg && lookup(0, mach->sbreg, &s))
  30. mach->sb = s.value;
  31. }
  32. else
  33. symmap = dumbmap(fsym);
  34. }
  35. void
  36. setcor(void)
  37. {
  38. int i;
  39. if (cormap) {
  40. for (i = 0; i < cormap->nsegs; i++)
  41. if (cormap->seg[i].inuse)
  42. close(cormap->seg[i].fd);
  43. }
  44. fcor = getfile(corfil, 2, ORDWR);
  45. if (fcor <= 0) {
  46. if (cormap)
  47. free(cormap);
  48. cormap = dumbmap(-1);
  49. return;
  50. }
  51. if(pid > 0) { /* provide addressability to executing process */
  52. cormap = attachproc(pid, kflag, fcor, &fhdr);
  53. if (!cormap)
  54. cormap = dumbmap(-1);
  55. } else {
  56. cormap = newmap(cormap, 2);
  57. if (!cormap)
  58. cormap = dumbmap(-1);
  59. setmap(cormap, fcor, fhdr.txtaddr, fhdr.txtaddr+fhdr.txtsz, fhdr.txtaddr, "text");
  60. setmap(cormap, fcor, fhdr.dataddr, 0xffffffff, fhdr.dataddr, "data");
  61. }
  62. kmsys();
  63. return;
  64. }
  65. Map *
  66. dumbmap(int fd)
  67. {
  68. Map *dumb;
  69. extern Mach mi386;
  70. extern Machdata i386mach;
  71. dumb = newmap(0, 1);
  72. setmap(dumb, fd, 0, 0xffffffff, 0, "data");
  73. if (!mach) /* default machine = 386 */
  74. mach = &mi386;
  75. if (!machdata)
  76. machdata = &i386mach;
  77. return dumb;
  78. }
  79. /*
  80. * set up maps for a direct process image (/proc)
  81. */
  82. void
  83. cmdmap(Map *map)
  84. {
  85. int i;
  86. char name[MAXSYM];
  87. extern char lastc;
  88. rdc();
  89. readsym(name);
  90. i = findseg(map, name);
  91. if (i < 0) /* not found */
  92. error("Invalid map name");
  93. if (expr(0)) {
  94. if (strcmp(name, "text") == 0)
  95. textseg(expv, &fhdr);
  96. map->seg[i].b = expv;
  97. } else
  98. error("Invalid base address");
  99. if (expr(0))
  100. map->seg[i].e = expv;
  101. else
  102. error("Invalid end address");
  103. if (expr(0))
  104. map->seg[i].f = expv;
  105. else
  106. error("Invalid file offset");
  107. if (rdc()=='?' && map == cormap) {
  108. if (fcor)
  109. close(fcor);
  110. fcor=fsym;
  111. corfil=symfil;
  112. cormap = symmap;
  113. } else if (lastc == '/' && map == symmap) {
  114. if (fsym)
  115. close(fsym);
  116. fsym=fcor;
  117. symfil=corfil;
  118. symmap=cormap;
  119. } else
  120. reread();
  121. }
  122. static int
  123. getfile(char *filnam, int cnt, int omode)
  124. {
  125. int f;
  126. if (filnam == 0)
  127. return -1;
  128. if (strcmp(filnam, "-") == 0)
  129. return 0;
  130. f = open(filnam, omode|OCEXEC);
  131. if(f < 0 && omode == ORDWR){
  132. f = open(filnam, OREAD|OCEXEC);
  133. if(f >= 0)
  134. dprint("%s open read-only\n", filnam);
  135. }
  136. if (f < 0 && xargc > cnt)
  137. if (wtflag)
  138. f = create(filnam, 1, 0666);
  139. if (f < 0) {
  140. dprint("cannot open `%s': %r\n", filnam);
  141. return -1;
  142. }
  143. return f;
  144. }
  145. void
  146. kmsys(void)
  147. {
  148. int i;
  149. i = findseg(symmap, "text");
  150. if (i >= 0) {
  151. symmap->seg[i].b = symmap->seg[i].b&~mach->ktmask;
  152. symmap->seg[i].e = ~0;
  153. }
  154. i = findseg(symmap, "data");
  155. if (i >= 0) {
  156. symmap->seg[i].b |= mach->kbase;
  157. symmap->seg[i].e |= mach->kbase;
  158. }
  159. }
  160. void
  161. attachprocess(void)
  162. {
  163. char buf[100];
  164. Dir *sym, *mem;
  165. int fd;
  166. if (!adrflg) {
  167. dprint("used pid$a\n");
  168. return;
  169. }
  170. sym = dirfstat(fsym);
  171. sprint(buf, "/proc/%lud/mem", adrval);
  172. corfil = buf;
  173. setcor();
  174. sprint(buf, "/proc/%lud/text", adrval);
  175. fd = open(buf, OREAD);
  176. mem = nil;
  177. if (sym==nil || fd < 0 || (mem=dirfstat(fd))==nil
  178. || sym->qid.path != mem->qid.path)
  179. dprint("warning: text images may be inconsistent\n");
  180. free(sym);
  181. free(mem);
  182. if (fd >= 0)
  183. close(fd);
  184. }