|
|
1.1 ! root 1: /* Console Callback Routines. ! 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 "hwrpb.h" ! 22: #include "protos.h" ! 23: #include "console.h" ! 24: #include "uart.h" ! 25: ! 26: ! 27: /* All routines use the high bit to signal error. */ ! 28: #define ERR 0x8000000000000000ul ! 29: ! 30: ! 31: unsigned long ! 32: crb_getc(long unit) ! 33: { ! 34: /* Multiple consoles not yet supported. */ ! 35: if (unit != 0) ! 36: return ERR; ! 37: ! 38: return uart_getchar(COM1); ! 39: } ! 40: ! 41: unsigned long ! 42: crb_process_keycode(long unit, long keycode, long again) ! 43: { ! 44: /* This routine might be needed for real keyboards, and mostly for ! 45: internationalization stuff. */ ! 46: /* Return Failure: routine not supported. */ ! 47: return 0xc000000000000000ul; ! 48: } ! 49: ! 50: unsigned long ! 51: crb_puts(long unit, const char *buf, unsigned long length) ! 52: { ! 53: unsigned int orig_length = length; ! 54: ! 55: /* Multiple consoles not yet supported. */ ! 56: if (unit != 0) ! 57: return ERR; ! 58: ! 59: for (; length != 0; --length, ++buf) ! 60: uart_putchar_raw(COM1, (unsigned char)*buf); ! 61: ! 62: /* Bits <31:0> of the return value are the number of bytes written. ! 63: To me that implies that the input value must be 32-bit, but v2 ! 64: of the ARM doesn't explicitly say. */ ! 65: return orig_length; ! 66: } ! 67: ! 68: unsigned long ! 69: crb_reset_term(long unit) ! 70: { ! 71: /* Multiple consoles not yet supported. */ ! 72: if (unit != 0) ! 73: return ERR; ! 74: ! 75: uart_init_line(COM1, 9600); ! 76: return 0; ! 77: } ! 78: ! 79: static unsigned long ! 80: crb_set_term_ctl(long unit, long ctb) ! 81: { ! 82: /* ??? The contents of the CTB do not seem to be defined anywhere. ! 83: How, therefore, can the user set new contents? */ ! 84: return ERR; ! 85: } ! 86: ! 87: static unsigned long ! 88: crb_set_term_int(long unit, long mask) ! 89: { ! 90: /* We do no buffering, therefore we don't need to support interrupts. */ ! 91: if (unit != 0 || (mask & 0x22) != 0) ! 92: return ERR; ! 93: return 0; ! 94: } ! 95: ! 96: unsigned long ! 97: crb_open(const char *devstr, unsigned long length) ! 98: { ! 99: /* FIXME */ ! 100: return ERR; ! 101: } ! 102: ! 103: unsigned long ! 104: crb_close(long channel) ! 105: { ! 106: /* FIXME */ ! 107: return 0; ! 108: } ! 109: ! 110: static unsigned long ! 111: crb_ioctl(long channel) ! 112: { ! 113: /* We do not, nor will not, support virtual tapes. */ ! 114: return ERR; ! 115: } ! 116: ! 117: unsigned long ! 118: crb_read(long channel, unsigned long length, char *buf, unsigned long block) ! 119: { ! 120: /* FIXME */ ! 121: return ERR; ! 122: } ! 123: ! 124: unsigned long ! 125: crb_write(long channel, unsigned long length, const char *buf, ! 126: unsigned long block) ! 127: { ! 128: /* FIXME */ ! 129: return ERR; ! 130: } ! 131: ! 132: unsigned long ! 133: crb_get_env(unsigned long id, char *buf, unsigned long length) ! 134: { ! 135: /* FIXME */ ! 136: return 0xc000000000000000ul; ! 137: } ! 138: ! 139: unsigned long ! 140: crb_set_env(unsigned long id, const char *buf, unsigned long length) ! 141: { ! 142: /* FIXME */ ! 143: return 0xc000000000000000ul; ! 144: } ! 145: ! 146: static unsigned long ! 147: crb_reset_env(unsigned long id, char *buf, unsigned long length) ! 148: { ! 149: /* FIXME */ ! 150: return 0xc000000000000000ul; ! 151: } ! 152: ! 153: static unsigned long ! 154: crb_save_env(void) ! 155: { ! 156: /* FIXME */ ! 157: return 0xc000000000000000ul; ! 158: } ! 159: ! 160: static unsigned long ! 161: crb_pswitch(long action, long cpu_id) ! 162: { ! 163: /* Why would we ever need to support switching primary processor? */ ! 164: return ERR; ! 165: } ! 166: ! 167: static unsigned long __attribute__((used)) ! 168: int_crb_dispatch(long select, long a1, long a2, long a3, long a4) ! 169: { ! 170: switch (select) ! 171: { ! 172: case CRB_GETC: ! 173: return crb_getc(a1); ! 174: case CRB_PUTS: ! 175: return crb_puts(a1, (const char *)a2, a3); ! 176: case CRB_RESET_TERM: ! 177: return crb_reset_term(a1); ! 178: case CRB_SET_TERM_INT: ! 179: return crb_set_term_int(a1, a2); ! 180: case CRB_SET_TERM_CTL: ! 181: return crb_set_term_ctl(a1, a2); ! 182: case CRB_PROCESS_KEYCODE: ! 183: return crb_process_keycode(a1, a2, a3); ! 184: ! 185: case CRB_OPEN: ! 186: return crb_open((const char*)a1, a2); ! 187: case CRB_CLOSE: ! 188: return crb_close(a1); ! 189: case CRB_IOCTL: ! 190: return crb_ioctl(a1); ! 191: case CRB_READ: ! 192: return crb_read(a1, a2, (char *)a3, a4); ! 193: case CRB_WRITE: ! 194: return crb_write(a1, a2, (const char *)a3, a4); ! 195: ! 196: case CRB_SET_ENV: ! 197: return crb_set_env(a1, (const char *)a2, a3); ! 198: case CRB_RESET_ENV: ! 199: return crb_reset_env(a1, (char *)a2, a3); ! 200: case CRB_GET_ENV: ! 201: return crb_get_env(a1, (char *)a2, a3); ! 202: case CRB_SAVE_ENV: ! 203: return crb_save_env(); ! 204: ! 205: case CRB_PSWITCH: ! 206: return crb_pswitch(a1, a2); ! 207: } ! 208: return ERR; ! 209: } ! 210: ! 211: static unsigned long __attribute__((used)) ! 212: int_crb_fixup(unsigned long vptptr, unsigned long hwrpb) ! 213: { ! 214: /* Given that this console is written to use the KSEG, and not be ! 215: mapped into any page-table address space, it doesn't seem like ! 216: we need to do anything at all here. */ ! 217: return 0; ! 218: } ! 219: ! 220: /* The CRB DISPATCH and FIXUP functions are defined to use the VMS ! 221: calling convention. This has several effects: ! 222: (1) The set of call-saved registers is different. ! 223: (2) $27 contains the procdesc_struct, not the called function. ! 224: Map between the two calling conventions here. */ ! 225: ! 226: asm(".macro VMStoUNIX name\n" ! 227: " .globl \\name\n" ! 228: " .ent \\name\n" ! 229: "\\name:\n" ! 230: " .frame $sp, 64, $26, 0\n" ! 231: " subq $sp, 64, $sp\n" ! 232: " stq $26, 0($sp)\n" ! 233: " stq $2, 8($sp)\n" ! 234: " stq $3, 16($sp)\n" ! 235: " stq $4, 24($sp)\n" ! 236: " stq $5, 32($sp)\n" ! 237: " stq $6, 40($sp)\n" ! 238: " stq $7, 48($sp)\n" ! 239: " stq $8, 56($sp)\n" ! 240: " .mask 0x40001fc, 0\n" ! 241: " .prologue 2\n" ! 242: " br $gp, .+4\n" ! 243: " ldgp $gp, 0($gp)\n" ! 244: " bsr $26, int_\\name !samegp\n" ! 245: " ldq $26, 0($sp)\n" ! 246: " ldq $2, 8($sp)\n" ! 247: " ldq $3, 16($sp)\n" ! 248: " ldq $4, 24($sp)\n" ! 249: " ldq $5, 32($sp)\n" ! 250: " ldq $6, 40($sp)\n" ! 251: " ldq $7, 48($sp)\n" ! 252: " ldq $8, 56($sp)\n" ! 253: " addq $sp, 64, $sp\n" ! 254: " ret\n" ! 255: " .end \\name\n" ! 256: ".endm\n" ! 257: " VMStoUNIX crb_dispatch\n" ! 258: " VMStoUNIX crb_fixup\n" ! 259: );
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.