Mercurial > sos > sos
view arch/cons.c @ 96:a480d02a10c8
merge
author | Jonathan Pevarnek <pevarnj@gmail.com> |
---|---|
date | Sat, 14 May 2011 12:54:47 -0400 |
parents | c75be274ce23 |
children |
line wrap: on
line source
#include "channel.h" #include "ebcdic.h" #include <die.h> #define CON_LEN 132 static u32 consch; int putline(char *buf, int len) { char data[CON_LEN]; struct orb orb; struct ccw ccw; if ((len <= 0) || (len > CON_LEN)) return -1; __builtin_memcpy(data, buf, len); ascii2ebcdic((u8*) data, len); ccw.cmd = 0x01; ccw.flags = 0; ccw.count = len; ccw.addr = (u32) (u64) data; __builtin_memset(&orb, 0, sizeof(struct orb)); orb.lpm = 0xff; orb.addr = (u32) (u64) &ccw; orb.f = 1; if (start_sch(consch, &orb)) die(); wait_for_io_int(); return len; } int getline(char *buf, int len) { struct orb orb; struct ccw ccw; int i; if ((len <= 0) || (len > CON_LEN)) return -1; wait_for_io_int(); __builtin_memset(buf, 0, len); ccw.cmd = 0x0a; ccw.flags = 0x20; ccw.count = len; ccw.addr = (u32) (u64) buf; __builtin_memset(&orb, 0, sizeof(struct orb)); orb.lpm = 0xff; orb.addr = (u32) (u64) &ccw; orb.f = 1; if (start_sch(consch, &orb)) die(); wait_for_io_int(); for(i=0; i<len; i++) if (!buf[i]) break; if (i) ebcdic2ascii((u8*) buf, i); return i; } void init_console() { u32 sch; sch = find_dev(CON_DEV); if (!sch) die(); consch = sch; }