Annotation of qemu/roms/qemu-palcode/console.c, revision 1.1.1.1

1.1       root        1: /* The SRM console prompt.
                      2: 
                      3:    Copyright (C) 2011 Richard Henderson
                      4: 
                      5:    This file is part of QEMU PALcode.
                      6: 
                      7:    This program is free software; you can redistribute it and/or modify
                      8:    it under the terms of the GNU General Public License as published by
                      9:    the Free Software Foundation; either version 2 of the License or
                     10:    (at your option) any later version.
                     11: 
                     12:    This program is distributed in the hope that it will be useful,
                     13:    but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the text
                     15:    of the GNU General Public License for more details.
                     16: 
                     17:    You should have received a copy of the GNU General Public License
                     18:    along with this program; see the file COPYING.  If not see
                     19:    <http://www.gnu.org/licenses/>.  */
                     20: 
                     21: #include "protos.h"
                     22: #include "console.h"
                     23: #include "vgatables.h"
                     24: 
                     25: 
                     26: static void
                     27: output_crnl(void)
                     28: {
                     29:   crb_puts(0, "\r\n", 2);
                     30: }
                     31: 
                     32: static void
                     33: output_bell(void)
                     34: {
                     35:   crb_puts(0, "\a", 1);
                     36: }
                     37: 
                     38: static void
                     39: backspace_and_erase(void)
                     40: {
                     41:   crb_puts(0, "\b \b", 3);
                     42: }
                     43: 
                     44: static unsigned long
                     45: getline(char *buf, unsigned long bufsize)
                     46: {
                     47:   unsigned long len = 0;
                     48:   long c;
                     49: 
                     50:   while (1)
                     51:     {
                     52:       c = crb_getc(0);
                     53:       if (c < 0)
                     54:        continue;
                     55:       switch ((int)c)
                     56:        {
                     57:        case '\r':
                     58:        case '\n':
                     59:          output_crnl();
                     60:          buf[len] = 0;
                     61:          return len;
                     62: 
                     63:         case '\b':
                     64:        case 0x7f: /* Delete */
                     65:           if (len > 0)
                     66:            {
                     67:              backspace_and_erase();
                     68:               len--;
                     69:             }
                     70:          else
                     71:            output_bell();
                     72:           break;
                     73: 
                     74:         default:
                     75:          if (len + 1 < bufsize)
                     76:            {
                     77:              buf[len] = c;
                     78:               crb_puts(0, buf+len, 1);
                     79:              len++;
                     80:            }
                     81:          else
                     82:            output_bell();
                     83:          break;
                     84:         }
                     85:     }
                     86: }
                     87: 
                     88: static inline void set_console_alarm(void)
                     89: {
                     90:   /* Just set a new timeout for 10ms = 10M ns.  */
                     91:   set_alarm_rel(10 * 1000 * 1000);
                     92: }
                     93: 
                     94: void
                     95: do_entInt(unsigned long type, unsigned long vector)
                     96: {
                     97:   switch (type)
                     98:     {
                     99:     case 0:
                    100:       /* ??? SMP interrupt.  We're going to need this for starting up
                    101:          secondary cpus.  */
                    102:       break;
                    103:     case 1:
                    104:       /* Timer interrupt.  */
                    105:       set_console_alarm();
                    106:       break;
                    107:     case 2:
                    108:       /* ??? Device interrupt.  We're going to need this for virtio disk
                    109:          operations at minimum.  */
                    110:       break;
                    111:     }
                    112: }
                    113: 
                    114: void
                    115: do_console(void)
                    116: {
                    117:   char line[256];
                    118:   unsigned long len;
                    119: 
                    120:   wrkgp();
                    121:   wrent(entInt, 0);
                    122:   set_console_alarm();
                    123:   swpipl(0);
                    124: 
                    125:   if (have_vga)
                    126:   {
                    127:     unsigned short *vga, attr;
                    128:     vga = pci_mem_base + SEG_CTEXT *16;
                    129:     attr = 0x2000;
                    130:     vga[0] = 'H' + attr;
                    131:     vga[1] = 'e' + attr;
                    132:     vga[2] = 'l' + attr;
                    133:     vga[3] = 'l' + attr;
                    134:     vga[4] = 'o' + attr;
                    135:   }
                    136: 
                    137:   while (1)
                    138:     {
                    139:       crb_puts(0, ">>> ", 4);
                    140:       len = getline(line, sizeof(line));
                    141:       crb_puts(0, "got: ", 5);
                    142:       crb_puts(0, line, len);
                    143:       output_crnl();
                    144:     }
                    145: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.