start.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.start.c 1.10 07/25/01 18:13:07 trini
  3.  */
  4. /*
  5.  * Copyright (C) Paul Mackerras 1997.
  6.  *
  7.  * This program is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU General Public License
  9.  * as published by the Free Software Foundation; either version
  10.  * 2 of the License, or (at your option) any later version.
  11.  */
  12. #include <stdarg.h>
  13. extern int strlen(const char *s);
  14. extern void boot(int a1, int a2, void *prom);
  15. int (*prom)();
  16. void *chosen_handle;
  17. void *stdin;
  18. void *stdout;
  19. void *stderr;
  20. void exit(void);
  21. void *finddevice(const char *name);
  22. int getprop(void *phandle, const char *name, void *buf, int buflen);
  23. void printk(char *fmt, ...);
  24. void
  25. start(int a1, int a2, void *promptr)
  26. {
  27.     prom = (int (*)()) promptr;
  28.     chosen_handle = finddevice("/chosen");
  29.     if (chosen_handle == (void *) -1)
  30. exit();
  31.     if (getprop(chosen_handle, "stdout", &stdout, sizeof(stdout)) != 4)
  32. exit();
  33.     stderr = stdout;
  34.     if (getprop(chosen_handle, "stdin", &stdin, sizeof(stdin)) != 4)
  35. exit();
  36.     boot(a1, a2, promptr);
  37.     for (;;)
  38. exit();
  39. }
  40. int
  41. write(void *handle, void *ptr, int nb)
  42. {
  43.     struct prom_args {
  44. char *service;
  45. int nargs;
  46. int nret;
  47. void *ihandle;
  48. void *addr;
  49. int len;
  50. int actual;
  51.     } args;
  52.     args.service = "write";
  53.     args.nargs = 3;
  54.     args.nret = 1;
  55.     args.ihandle = handle;
  56.     args.addr = ptr;
  57.     args.len = nb;
  58.     args.actual = -1;
  59.     (*prom)(&args);
  60.     return args.actual;
  61. }
  62. int writestring(void *f, char *ptr, int nb)
  63. {
  64. int w = 0, i;
  65. char *ret = "r";
  66. for (i = 0; i < nb; ++i) {
  67. if (ptr[i] == 'n') {
  68. if (i > w) {
  69. write(f, ptr + w, i - w);
  70. w = i;
  71. }
  72. write(f, ret, 1);
  73. }
  74. }
  75. if (w < nb)
  76. write(f, ptr + w, nb - w);
  77. return nb;
  78. }
  79. int
  80. read(void *handle, void *ptr, int nb)
  81. {
  82.     struct prom_args {
  83. char *service;
  84. int nargs;
  85. int nret;
  86. void *ihandle;
  87. void *addr;
  88. int len;
  89. int actual;
  90.     } args;
  91.     args.service = "read";
  92.     args.nargs = 3;
  93.     args.nret = 1;
  94.     args.ihandle = handle;
  95.     args.addr = ptr;
  96.     args.len = nb;
  97.     args.actual = -1;
  98.     (*prom)(&args);
  99.     return args.actual;
  100. }
  101. void
  102. exit(void)
  103. {
  104.     struct prom_args {
  105. char *service;
  106.     } args;
  107.     for (;;) {
  108. args.service = "exit";
  109. (*prom)(&args);
  110.     }
  111. }
  112. void
  113. pause(void)
  114. {
  115.     struct prom_args {
  116. char *service;
  117.     } args;
  118.     args.service = "enter";
  119.     (*prom)(&args);
  120. }
  121. void *
  122. finddevice(const char *name)
  123. {
  124.     struct prom_args {
  125. char *service;
  126. int nargs;
  127. int nret;
  128. const char *devspec;
  129. void *phandle;
  130.     } args;
  131.     args.service = "finddevice";
  132.     args.nargs = 1;
  133.     args.nret = 1;
  134.     args.devspec = name;
  135.     args.phandle = (void *) -1;
  136.     (*prom)(&args);
  137.     return args.phandle;
  138. }
  139. void *
  140. claim(unsigned int virt, unsigned int size, unsigned int align)
  141. {
  142.     struct prom_args {
  143. char *service;
  144. int nargs;
  145. int nret;
  146. unsigned int virt;
  147. unsigned int size;
  148. unsigned int align;
  149. void *ret;
  150.     } args;
  151.     args.service = "claim";
  152.     args.nargs = 3;
  153.     args.nret = 1;
  154.     args.virt = virt;
  155.     args.size = size;
  156.     args.align = align;
  157.     (*prom)(&args);
  158.     return args.ret;
  159. }
  160. void
  161. release(void *virt, unsigned int size)
  162. {
  163.     struct prom_args {
  164. char *service;
  165. int nargs;
  166. int nret;
  167. void *virt;
  168. unsigned int size;
  169.     } args;
  170.     args.service = "release";
  171.     args.nargs = 2;
  172.     args.nret = 0;
  173.     args.virt = virt;
  174.     args.size = size;
  175.     (*prom)(&args);
  176. }
  177. int
  178. getprop(void *phandle, const char *name, void *buf, int buflen)
  179. {
  180.     struct prom_args {
  181. char *service;
  182. int nargs;
  183. int nret;
  184. void *phandle;
  185. const char *name;
  186. void *buf;
  187. int buflen;
  188. int size;
  189.     } args;
  190.     args.service = "getprop";
  191.     args.nargs = 4;
  192.     args.nret = 1;
  193.     args.phandle = phandle;
  194.     args.name = name;
  195.     args.buf = buf;
  196.     args.buflen = buflen;
  197.     args.size = -1;
  198.     (*prom)(&args);
  199.     return args.size;
  200. }
  201. int
  202. putc(int c, void *f)
  203. {
  204.     char ch = c;
  205.     return writestring(f, &ch, 1) == 1? c: -1;
  206. }
  207. int
  208. putchar(int c)
  209. {
  210.     return putc(c, stdout);
  211. }
  212. int
  213. fputs(char *str, void *f)
  214. {
  215.     int n = strlen(str);
  216.     return writestring(f, str, n) == n? 0: -1;
  217. }
  218. int
  219. readchar(void)
  220. {
  221.     char ch;
  222.     for (;;) {
  223. switch (read(stdin, &ch, 1)) {
  224. case 1:
  225.     return ch;
  226. case -1:
  227.     printk("read(stdin) returned -1n");
  228.     return -1;
  229. }
  230.     }
  231. }
  232. static char line[256];
  233. static char *lineptr;
  234. static int lineleft;
  235. int
  236. getchar(void)
  237. {
  238.     int c;
  239.     if (lineleft == 0) {
  240. lineptr = line;
  241. for (;;) {
  242.     c = readchar();
  243.     if (c == -1 || c == 4)
  244. break;
  245.     if (c == 'r' || c == 'n') {
  246. *lineptr++ = 'n';
  247. putchar('n');
  248. break;
  249.     }
  250.     switch (c) {
  251.     case 0177:
  252.     case 'b':
  253. if (lineptr > line) {
  254.     putchar('b');
  255.     putchar(' ');
  256.     putchar('b');
  257.     --lineptr;
  258. }
  259. break;
  260.     case 'U' & 0x1F:
  261. while (lineptr > line) {
  262.     putchar('b');
  263.     putchar(' ');
  264.     putchar('b');
  265.     --lineptr;
  266. }
  267. break;
  268.     default:
  269. if (lineptr >= &line[sizeof(line) - 1])
  270.     putchar('a');
  271. else {
  272.     putchar(c);
  273.     *lineptr++ = c;
  274. }
  275.     }
  276. }
  277. lineleft = lineptr - line;
  278. lineptr = line;
  279.     }
  280.     if (lineleft == 0)
  281. return -1;
  282.     --lineleft;
  283.     return *lineptr++;
  284. }
  285. extern int vsprintf(char *buf, const char *fmt, va_list args);
  286. static char sprint_buf[1024];
  287. void
  288. printk(char *fmt, ...)
  289. {
  290. va_list args;
  291. int n;
  292. va_start(args, fmt);
  293. n = vsprintf(sprint_buf, fmt, args);
  294. va_end(args);
  295. writestring(stdout, sprint_buf, n);
  296. }
  297. int
  298. printf(char *fmt, ...)
  299. {
  300. va_list args;
  301. int n;
  302. va_start(args, fmt);
  303. n = vsprintf(sprint_buf, fmt, args);
  304. va_end(args);
  305. writestring(stdout, sprint_buf, n);
  306. return n;
  307. }