cons.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. #include "u.h"
  2. #include "mem.h"
  3. #include "dat.h"
  4. #include "fns.h"
  5. #include "lib.h"
  6. enum {
  7. /* prom operations */
  8. Promop_getc = 1,
  9. Promop_puts = 2,
  10. Promop_open = 0x10,
  11. Promop_close = 0x11,
  12. Promop_read = 0x13,
  13. Promop_write = 0x14,
  14. Promop_getenv = 0x22,
  15. /* environment variable indices for getenv */
  16. /* auto_action might be 1; it looks that way. */
  17. Promenv_booted_dev = 4,
  18. Promenv_booted_file = 6,
  19. Promenv_booted_osflags = 8,
  20. Promenv_tty_dev = 0xf,
  21. };
  22. Hwrpb *hwrpb;
  23. static uvlong dispatchf;
  24. static ulong clk2ms;
  25. void
  26. consinit(void)
  27. {
  28. Procdesc *p;
  29. Hwcrb *crb;
  30. Hwdsr *dsr;
  31. char *s;
  32. hwrpb = (Hwrpb*)0x10000000;
  33. crb = (Hwcrb*)((ulong)hwrpb + hwrpb->crboff);
  34. p = (Procdesc*)(crb->dispatchva);
  35. dispatchf = p->addr;
  36. clk2ms = hwrpb->cfreq/1000;
  37. print("\nAlpha Plan 9 secondary boot\n");
  38. if (hwrpb->rev >= 6) {
  39. dsr = (Hwdsr*)((ulong)hwrpb + hwrpb->dsroff);
  40. s = (char*)dsr + dsr->sysnameoff + 8;
  41. print("%s\n", s);
  42. }
  43. }
  44. uvlong
  45. dispatch(uvlong r16, uvlong r17, uvlong r18, uvlong r19, uvlong r20)
  46. {
  47. return gendispatch(dispatchf, r16, r17, r18, r19, r20);
  48. };
  49. int
  50. devopen(char *s)
  51. {
  52. vlong ret;
  53. int n;
  54. n = strlen(s);
  55. ret = dispatch(0x10, (uvlong)s, n, 0, 0);
  56. if (ret < 0)
  57. return -1;
  58. return (int) ret;
  59. }
  60. int
  61. devclose(int fd)
  62. {
  63. vlong ret;
  64. ret = dispatch(0x11, fd, 0, 0, 0);
  65. if (ret < 0)
  66. return -1;
  67. return 0;
  68. }
  69. int
  70. devread(int fd, uchar *buf, int len, int blkno)
  71. {
  72. vlong ret;
  73. ret = dispatch(0x13, fd, len, (uvlong)buf, blkno);
  74. if (ret < 0)
  75. return -1;
  76. return (int) ret;
  77. }
  78. int
  79. devwrite(int fd, uchar *buf, int len, int blkno)
  80. {
  81. vlong ret;
  82. ret = dispatch(0x14, fd, len, (uvlong)buf, blkno);
  83. if (ret < 0)
  84. return -1;
  85. return (int) ret;
  86. }
  87. void
  88. dumpenv(void)
  89. {
  90. int id, n;
  91. static char buf[256];
  92. /* old upper bound was 0x100, which blows up on my 164LX. 50 works. */
  93. for (id = 1; id < 50; id++) {
  94. n = dispatch(Promop_getenv, id, (uvlong)buf, sizeof(buf)-1, 0);
  95. if (n == 0)
  96. continue;
  97. if (n < 0) {
  98. print("dispatch failed at id %d\n", id);
  99. break;
  100. }
  101. buf[n] = 0;
  102. print("env[0x%x]: %s\n", id, buf);
  103. }
  104. }
  105. char *
  106. getenv(char *name)
  107. {
  108. int id, n;
  109. static char buf[256];
  110. if (strcmp(name, "booted_dev") == 0)
  111. id = Promenv_booted_dev;
  112. else
  113. return 0;
  114. n = dispatch(Promop_getenv, id, (uvlong)buf, sizeof(buf), 0);
  115. if (n < 0)
  116. return 0;
  117. buf[n] = 0;
  118. return buf;
  119. }
  120. void
  121. putstrn0(char *s, int n)
  122. {
  123. uvlong ret;
  124. int cnt;
  125. for (;;) {
  126. ret = dispatch(2, 0, (uvlong)s, n, 0);
  127. cnt = (int) ret;
  128. s += cnt;
  129. n -= cnt;
  130. if (n <= 0)
  131. break;
  132. }
  133. }
  134. void
  135. putstrn(char *s, int n)
  136. {
  137. char *p;
  138. for (;;) {
  139. if (n == 0)
  140. return;
  141. p = memchr(s, '\n', n);
  142. if (p == 0) {
  143. putstrn0(s, n);
  144. return;
  145. }
  146. putstrn0(s, p-s);
  147. putstrn0("\r\n", 2);
  148. n -= p-s+1;
  149. s = p+1;
  150. }
  151. }
  152. int
  153. snprint(char *s, int n, char *fmt, ...)
  154. {
  155. va_list arg;
  156. va_start(arg, fmt);
  157. n = doprint(s, s+n, fmt, arg) - s;
  158. va_end(arg);
  159. return n;
  160. }
  161. int
  162. sprint(char *s, char *fmt, ...)
  163. {
  164. int n;
  165. va_list arg;
  166. va_start(arg, fmt);
  167. n = doprint(s, s+PRINTSIZE, fmt, arg) - s;
  168. va_end(arg);
  169. return n;
  170. }
  171. int
  172. print(char *fmt, ...)
  173. {
  174. int n;
  175. va_list arg;
  176. char buf[PRINTSIZE];
  177. va_start(arg, fmt);
  178. n = doprint(buf, buf+sizeof(buf), fmt, arg) - buf;
  179. va_end(arg);
  180. putstrn(buf, n);
  181. return n;
  182. }
  183. void
  184. panic(char *fmt, ...)
  185. {
  186. int n;
  187. va_list arg;
  188. char buf[PRINTSIZE];
  189. strcpy(buf, "panic: ");
  190. va_start(arg, fmt);
  191. n = doprint(buf+strlen(buf), buf+sizeof(buf), fmt, arg) - buf;
  192. va_end(arg);
  193. buf[n] = '\n';
  194. putstrn(buf, n+1);
  195. firmware();
  196. }
  197. ulong
  198. msec(void)
  199. {
  200. static ulong last, wrap;
  201. ulong cnt;
  202. cnt = pcc_cnt();
  203. if (cnt < last)
  204. wrap++;
  205. last = cnt;
  206. return (((uvlong)wrap << 32) + cnt)/clk2ms;
  207. }