start.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.start.c 1.8 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. int (*prom)(void *args);
  14. void *chosen_handle;
  15. void *stdin;
  16. void *stdout;
  17. void *stderr;
  18. void exit(void);
  19. void *finddevice(const char *name);
  20. int getprop(void *phandle, const char *name, void *buf, int buflen);
  21. void printk(char *fmt, ...);
  22. extern void chrpboot(int a1, int a2, void *prom);
  23. extern int strlen(const char *s);
  24. void
  25. start(int a1, int a2, void *promptr)
  26. {
  27.     prom = 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.     chrpboot(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
  63. read(void *handle, void *ptr, int nb)
  64. {
  65.     struct prom_args {
  66. char *service;
  67. int nargs;
  68. int nret;
  69. void *ihandle;
  70. void *addr;
  71. int len;
  72. int actual;
  73.     } args;
  74.     args.service = "read";
  75.     args.nargs = 3;
  76.     args.nret = 1;
  77.     args.ihandle = handle;
  78.     args.addr = ptr;
  79.     args.len = nb;
  80.     args.actual = -1;
  81.     (*prom)(&args);
  82.     return args.actual;
  83. }
  84. void
  85. exit(void)
  86. {
  87.     struct prom_args {
  88. char *service;
  89.     } args;
  90.     for (;;) {
  91. args.service = "exit";
  92. (*prom)(&args);
  93.     }
  94. }
  95. void
  96. pause(void)
  97. {
  98.     struct prom_args {
  99. char *service;
  100.     } args;
  101.     args.service = "enter";
  102.     (*prom)(&args);
  103. }
  104. void *
  105. finddevice(const char *name)
  106. {
  107.     struct prom_args {
  108. char *service;
  109. int nargs;
  110. int nret;
  111. const char *devspec;
  112. void *phandle;
  113.     } args;
  114.     args.service = "finddevice";
  115.     args.nargs = 1;
  116.     args.nret = 1;
  117.     args.devspec = name;
  118.     args.phandle = (void *) -1;
  119.     (*prom)(&args);
  120.     return args.phandle;
  121. }
  122. void *
  123. claim(unsigned int virt, unsigned int size, unsigned int align)
  124. {
  125.     struct prom_args {
  126. char *service;
  127. int nargs;
  128. int nret;
  129. unsigned int virt;
  130. unsigned int size;
  131. unsigned int align;
  132. void *ret;
  133.     } args;
  134.     args.service = "claim";
  135.     args.nargs = 3;
  136.     args.nret = 1;
  137.     args.virt = virt;
  138.     args.size = size;
  139.     args.align = align;
  140.     (*prom)(&args);
  141.     return args.ret;
  142. }
  143. int
  144. getprop(void *phandle, const char *name, void *buf, int buflen)
  145. {
  146.     struct prom_args {
  147. char *service;
  148. int nargs;
  149. int nret;
  150. void *phandle;
  151. const char *name;
  152. void *buf;
  153. int buflen;
  154. int size;
  155.     } args;
  156.     args.service = "getprop";
  157.     args.nargs = 4;
  158.     args.nret = 1;
  159.     args.phandle = phandle;
  160.     args.name = name;
  161.     args.buf = buf;
  162.     args.buflen = buflen;
  163.     args.size = -1;
  164.     (*prom)(&args);
  165.     return args.size;
  166. }
  167. int
  168. putc(int c, void *f)
  169. {
  170.     char ch = c;
  171.     if (c == 'n')
  172. putc('r', f);
  173.     return write(f, &ch, 1) == 1? c: -1;
  174. }
  175. int
  176. putchar(int c)
  177. {
  178.     return putc(c, stdout);
  179. }
  180. int
  181. fputs(char *str, void *f)
  182. {
  183.     int n = strlen(str);
  184.     return write(f, str, n) == n? 0: -1;
  185. }
  186. int
  187. readchar(void)
  188. {
  189.     char ch;
  190.     for (;;) {
  191. switch (read(stdin, &ch, 1)) {
  192. case 1:
  193.     return ch;
  194. case -1:
  195.     printk("read(stdin) returned -1rn");
  196.     return -1;
  197. }
  198.     }
  199. }
  200. static char line[256];
  201. static char *lineptr;
  202. static int lineleft;
  203. int
  204. getchar(void)
  205. {
  206.     int c;
  207.     if (lineleft == 0) {
  208. lineptr = line;
  209. for (;;) {
  210.     c = readchar();
  211.     if (c == -1 || c == 4)
  212. break;
  213.     if (c == 'r' || c == 'n') {
  214. *lineptr++ = 'n';
  215. putchar('n');
  216. break;
  217.     }
  218.     switch (c) {
  219.     case 0177:
  220.     case 'b':
  221. if (lineptr > line) {
  222.     putchar('b');
  223.     putchar(' ');
  224.     putchar('b');
  225.     --lineptr;
  226. }
  227. break;
  228.     case 'U' & 0x1F:
  229. while (lineptr > line) {
  230.     putchar('b');
  231.     putchar(' ');
  232.     putchar('b');
  233.     --lineptr;
  234. }
  235. break;
  236.     default:
  237. if (lineptr >= &line[sizeof(line) - 1])
  238.     putchar('a');
  239. else {
  240.     putchar(c);
  241.     *lineptr++ = c;
  242. }
  243.     }
  244. }
  245. lineleft = lineptr - line;
  246. lineptr = line;
  247.     }
  248.     if (lineleft == 0)
  249. return -1;
  250.     --lineleft;
  251.     return *lineptr++;
  252. }
  253. extern int vsprintf(char *buf, const char *fmt, va_list args);
  254. static char sprint_buf[1024];
  255. void
  256. printk(char *fmt, ...)
  257. {
  258. va_list args;
  259. int n;
  260. va_start(args, fmt);
  261. n = vsprintf(sprint_buf, fmt, args);
  262. va_end(args);
  263. write(stdout, sprint_buf, n);
  264. }
  265. int
  266. printf(char *fmt, ...)
  267. {
  268. va_list args;
  269. int n;
  270. va_start(args, fmt);
  271. n = vsprintf(sprint_buf, fmt, args);
  272. va_end(args);
  273. write(stdout, sprint_buf, n);
  274. return n;
  275. }