linux-old/arch/ppc/boot/chrp/start.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) Paul Mackerras 1997.
   3 *
   4 * This program is free software; you can redistribute it and/or
   5 * modify it under the terms of the GNU General Public License
   6 * as published by the Free Software Foundation; either version
   7 * 2 of the License, or (at your option) any later version.
   8 */
   9#include <stdarg.h>
  10#include "of1275.h"
  11
  12int (*prom)(void *args);
  13
  14phandle stdin;
  15phandle stdout;
  16phandle stderr;
  17
  18void printk(char *fmt, ...);
  19
  20extern void chrpboot(int a1, int a2, void *prom);
  21extern int strlen(const char *s);
  22
  23void
  24start(int a1, int a2, void *promptr)
  25{
  26    ofinit(promptr);
  27    if (ofstdio(&stdin, &stdout, &stderr))
  28        exit();
  29    chrpboot(a1, a2, promptr);
  30    for (;;)
  31        exit();
  32}
  33
  34int
  35putc(int c, void *f)
  36{
  37    char ch = c;
  38
  39    if (c == '\n')
  40        putc('\r', f);
  41    return write(f, &ch, 1) == 1? c: -1;
  42}
  43
  44int
  45putchar(int c)
  46{
  47    return putc(c, stdout);
  48}
  49
  50int
  51fputs(char *str, void *f)
  52{
  53    int n = strlen(str);
  54
  55    return write(f, str, n) == n? 0: -1;
  56}
  57
  58int
  59readchar(void)
  60{
  61    char ch;
  62
  63    for (;;) {
  64        switch (read(stdin, &ch, 1)) {
  65        case 1:
  66            return ch;
  67        case -1:
  68            printk("read(stdin) returned -1\r\n");
  69            return -1;
  70        }
  71    }
  72}
  73
  74static char line[256];
  75static char *lineptr;
  76static int lineleft;
  77
  78int
  79getchar(void)
  80{
  81    int c;
  82
  83    if (lineleft == 0) {
  84        lineptr = line;
  85        for (;;) {
  86            c = readchar();
  87            if (c == -1 || c == 4)
  88                break;
  89            if (c == '\r' || c == '\n') {
  90                *lineptr++ = '\n';
  91                putchar('\n');
  92                break;
  93            }
  94            switch (c) {
  95            case 0177:
  96            case '\b':
  97                if (lineptr > line) {
  98                    putchar('\b');
  99                    putchar(' ');
 100                    putchar('\b');
 101                    --lineptr;
 102                }
 103                break;
 104            case 'U' & 0x1F:
 105                while (lineptr > line) {
 106                    putchar('\b');
 107                    putchar(' ');
 108                    putchar('\b');
 109                    --lineptr;
 110                }
 111                break;
 112            default:
 113                if (lineptr >= &line[sizeof(line) - 1])
 114                    putchar('\a');
 115                else {
 116                    putchar(c);
 117                    *lineptr++ = c;
 118                }
 119            }
 120        }
 121        lineleft = lineptr - line;
 122        lineptr = line;
 123    }
 124    if (lineleft == 0)
 125        return -1;
 126    --lineleft;
 127    return *lineptr++;
 128}
 129
 130extern int vsprintf(char *buf, const char *fmt, va_list args);
 131static char sprint_buf[1024];
 132
 133void
 134printk(char *fmt, ...)
 135{
 136        va_list args;
 137        int n;
 138
 139        va_start(args, fmt);
 140        n = vsprintf(sprint_buf, fmt, args);
 141        va_end(args);
 142        write(stdout, sprint_buf, n);
 143}
 144
 145int
 146printf(char *fmt, ...)
 147{
 148        va_list args;
 149        int n;
 150
 151        va_start(args, fmt);
 152        n = vsprintf(sprint_buf, fmt, args);
 153        va_end(args);
 154        write(stdout, sprint_buf, n);
 155        return n;
 156}
 157
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.