5i.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include <mach.h>
  5. #include "arm.h"
  6. char* file = "5.out";
  7. int datasize;
  8. int textbase;
  9. Biobuf bp, bi;
  10. Fhdr fhdr;
  11. void
  12. main(int argc, char **argv)
  13. {
  14. argc--;
  15. argv++;
  16. bioout = &bp;
  17. bin = &bi;
  18. Binit(bioout, 1, OWRITE);
  19. Binit(bin, 0, OREAD);
  20. tlb.on = 1;
  21. tlb.tlbsize = 24;
  22. if(argc)
  23. file = argv[0];
  24. argc--;
  25. argv++;
  26. text = open(file, OREAD);
  27. if(text < 0)
  28. fatal(1, "open text '%s'", file);
  29. Bprint(bioout, "5i\n");
  30. inithdr(text);
  31. initstk(argc, argv);
  32. cmd();
  33. }
  34. void
  35. initmap()
  36. {
  37. ulong t, d, b, bssend;
  38. Segment *s;
  39. t = (fhdr.txtaddr+fhdr.txtsz+(BY2PG-1)) & ~(BY2PG-1);
  40. d = (t + fhdr.datsz + (BY2PG-1)) & ~(BY2PG-1);
  41. bssend = t + fhdr.datsz + fhdr.bsssz;
  42. b = (bssend + (BY2PG-1)) & ~(BY2PG-1);
  43. s = &memory.seg[Text];
  44. s->type = Text;
  45. s->base = fhdr.txtaddr - fhdr.hdrsz;
  46. s->end = t;
  47. s->fileoff = fhdr.txtoff - fhdr.hdrsz;
  48. s->fileend = s->fileoff + fhdr.txtsz;
  49. s->table = emalloc(((s->end-s->base)/BY2PG)*BY2WD);
  50. iprof = emalloc(((s->end-s->base)/PROFGRAN)*sizeof(long));
  51. textbase = s->base;
  52. s = &memory.seg[Data];
  53. s->type = Data;
  54. s->base = t;
  55. s->end = t+(d-t);
  56. s->fileoff = fhdr.datoff;
  57. s->fileend = s->fileoff + fhdr.datsz;
  58. datasize = fhdr.datsz;
  59. s->table = emalloc(((s->end-s->base)/BY2PG)*BY2WD);
  60. s = &memory.seg[Bss];
  61. s->type = Bss;
  62. s->base = d;
  63. s->end = d+(b-d);
  64. s->table = emalloc(((s->end-s->base)/BY2PG)*BY2WD);
  65. s = &memory.seg[Stack];
  66. s->type = Stack;
  67. s->base = STACKTOP-STACKSIZE;
  68. s->end = STACKTOP;
  69. s->table = emalloc(((s->end-s->base)/BY2PG)*BY2WD);
  70. reg.r[REGPC] = fhdr.entry;
  71. }
  72. void
  73. inithdr(int fd)
  74. {
  75. Symbol s;
  76. extern Machdata armmach;
  77. seek(fd, 0, 0);
  78. if (!crackhdr(fd, &fhdr))
  79. fatal(0, "read text header");
  80. if(fhdr.type != FARM )
  81. fatal(0, "bad magic number: %d %d", fhdr.type, FARM);
  82. if (syminit(fd, &fhdr) < 0)
  83. fatal(0, "%r\n");
  84. symmap = loadmap(symmap, fd, &fhdr);
  85. if (mach->sbreg && lookup(0, mach->sbreg, &s))
  86. mach->sb = s.value;
  87. machdata = &armmach;
  88. }
  89. ulong
  90. greg(int f, ulong off)
  91. {
  92. int n;
  93. ulong l;
  94. uchar wd[BY2WD];
  95. seek(f, off, 0);
  96. n = read(f, wd, BY2WD);
  97. if(n != BY2WD)
  98. fatal(1, "read register");
  99. l = wd[0]<<24;
  100. l |= wd[1]<<16;
  101. l |= wd[2]<<8;
  102. l |= wd[3];
  103. return l;
  104. }
  105. void
  106. seginit(int fd, Segment *s, int idx, ulong vastart, ulong vaend)
  107. {
  108. int n;
  109. while(vastart < vaend) {
  110. seek(fd, vastart, 0);
  111. s->table[idx] = emalloc(BY2PG);
  112. n = read(fd, s->table[idx], BY2PG);
  113. if(n != BY2PG)
  114. fatal(1, "data read");
  115. vastart += BY2PG;
  116. idx++;
  117. }
  118. }
  119. void
  120. reset(void)
  121. {
  122. int i, l, m;
  123. Segment *s;
  124. Breakpoint *b;
  125. memset(&reg, 0, sizeof(Registers));
  126. for(i = 0; i > Nseg; i++) {
  127. s = &memory.seg[i];
  128. l = ((s->end-s->base)/BY2PG)*BY2WD;
  129. for(m = 0; m < l; m++)
  130. if(s->table[m])
  131. free(s->table[m]);
  132. free(s->table);
  133. }
  134. free(iprof);
  135. memset(&memory, 0, sizeof(memory));
  136. for(b = bplist; b; b = b->next)
  137. b->done = b->count;
  138. }
  139. void
  140. initstk(int argc, char *argv[])
  141. {
  142. ulong size;
  143. ulong sp, ap;
  144. int i;
  145. char *p;
  146. initmap();
  147. sp = STACKTOP - 4;
  148. /* Build exec stack */
  149. size = strlen(file)+1+BY2WD+BY2WD+BY2WD;
  150. for(i = 0; i < argc; i++)
  151. size += strlen(argv[i])+BY2WD+1;
  152. sp -= size;
  153. sp &= ~3;
  154. reg.r[13] = sp;
  155. reg.r[1] = STACKTOP-4; /* Plan 9 profiling clock */
  156. /* Push argc */
  157. putmem_w(sp, argc+1);
  158. sp += BY2WD;
  159. /* Compute sizeof(argv) and push argv[0] */
  160. ap = sp+((argc+1)*BY2WD)+BY2WD;
  161. putmem_w(sp, ap);
  162. sp += BY2WD;
  163. /* Build argv[0] string into stack */
  164. for(p = file; *p; p++)
  165. putmem_b(ap++, *p);
  166. putmem_b(ap++, '\0');
  167. /* Loop through pushing the arguments */
  168. for(i = 0; i < argc; i++) {
  169. putmem_w(sp, ap);
  170. sp += BY2WD;
  171. for(p = argv[i]; *p; p++)
  172. putmem_b(ap++, *p);
  173. putmem_b(ap++, '\0');
  174. }
  175. /* Null terminate argv */
  176. putmem_w(sp, 0);
  177. }
  178. void
  179. fatal(int syserr, char *fmt, ...)
  180. {
  181. char buf[ERRMAX], *s;
  182. va_list arg;
  183. va_start(arg, fmt);
  184. vseprint(buf, buf+sizeof(buf), fmt, arg);
  185. va_end(arg);
  186. s = "5i: %s\n";
  187. if(syserr)
  188. s = "5i: %s: %r\n";
  189. fprint(2, s, buf);
  190. exits(buf);
  191. }
  192. void
  193. itrace(char *fmt, ...)
  194. {
  195. char buf[128];
  196. va_list arg;
  197. va_start(arg, fmt);
  198. vseprint(buf, buf+sizeof(buf), fmt, arg);
  199. va_end(arg);
  200. Bprint(bioout, "%8lux %.8lux %2d %s\n", reg.ar, reg.ir, reg.class, buf);
  201. }
  202. void
  203. dumpreg(void)
  204. {
  205. int i;
  206. Bprint(bioout, "PC #%-8lux SP #%-8lux \n",
  207. reg.r[REGPC], reg.r[REGSP]);
  208. for(i = 0; i < 16; i++) {
  209. if((i%4) == 0 && i != 0)
  210. Bprint(bioout, "\n");
  211. Bprint(bioout, "R%-2d #%-8lux ", i, reg.r[i]);
  212. }
  213. Bprint(bioout, "\n");
  214. }
  215. void
  216. dumpfreg(void)
  217. {
  218. }
  219. void
  220. dumpdreg(void)
  221. {
  222. }
  223. void *
  224. emalloc(ulong size)
  225. {
  226. void *a;
  227. a = malloc(size);
  228. if(a == 0)
  229. fatal(0, "no memory");
  230. memset(a, 0, size);
  231. return a;
  232. }
  233. void *
  234. erealloc(void *a, ulong oldsize, ulong size)
  235. {
  236. void *n;
  237. n = malloc(size);
  238. if(n == 0)
  239. fatal(0, "no memory");
  240. memset(n, 0, size);
  241. if(size > oldsize)
  242. size = oldsize;
  243. memmove(n, a, size);
  244. return n;
  245. }