Loading [MathJax]/extensions/tex2jax.js
CS350 COS
COS
All Data Structures Files Functions Variables Typedefs Macros
console.c
Go to the documentation of this file.
1
2#include <stdbool.h>
3#include <stdint.h>
4
5#include <sys/spinlock.h>
6#include <sys/kmem.h>
7#include <sys/thread.h>
8
9#include "console.h"
10#include "x86/vgacons.h"
11#include "x86/sercons.h"
12#include "x86/debugcons.h"
13
16
17/*
18 * Initialize console devices for debugging purposes. At this point interrupts
19 * and device state is not initialized.
20 */
21void
23{
24 VGA_Init();
27
28 Console_Puts("Castor Operating System\n");
29
31
32 Spinlock_Init(&consoles.keyLock, "Console Keyboard Lock", SPINLOCK_TYPE_NORMAL);
33 consoles.nextKey = 0;
34 consoles.lastKey = 0;
35}
36
37/*
38 * Setup interrupts and input devices that may not be ready
39 */
40void
42{
44}
45
46char
48{
49 while (1) {
52 char key = consoles.keyBuf[consoles.nextKey];
55 return key;
56 }
58
59 // Support serial debugging if interrupts are disabled
60 if (Serial_HasData()) {
61 char key = Serial_Getc();
62 switch (key) {
63 case '\r':
64 return '\n';
65 case 0x7f:
66 return '\b';
67 default:
68 return key;
69 }
70 }
71 }
72}
73
74void
76{
80 return;
81 }
85}
86
87void
88Console_Gets(char *str, size_t n)
89{
90 int i;
91
92 for (i = 0; i < (n - 1); i++)
93 {
94 char ch = Console_Getc();
95 if (ch == '\b') {
96 if (i > 0) {
97 Console_Putc(ch);
98 i--;
99 }
100 i--;
101 continue;
102 }
103 if (ch == '\n') {
104 Console_Putc('\n');
105 str[i] = '\0';
106 return;
107 }
108 if (ch == '\r') {
109 Console_Putc('\n');
110 str[i] = '\0';
111 return;
112 }
113 if (ch == '\t') {
114 Console_Putc('\t');
115 str[i] = '\t';
116 continue;
117 }
118 if (ch < 0x20)
119 {
120 // Unprintable character
121 continue;
122 }
123 Console_Putc(ch);
124 str[i] = ch;
125 }
126
127 str[i+1] = '\0';
128}
129
130void
132{
134 VGA_Putc(ch);
135 Serial_Putc(ch);
138}
139
140void
141Console_Puts(const char *str)
142{
144 VGA_Puts(str);
145 Serial_Puts(str);
148}
149
150int
152{
154 uint64_t i;
155
156 for (i = 0; i < len; i++)
157 {
158 char c = Console_Getc();
159 Console_Putc(c);
160 Copy_Out(&c, b+i, 1);
161 }
162
163 return len;
164}
165
166int
168{
169 int i;
171 char kbuf[512];
172 uint64_t nbytes = 0;
173
174 while (len > nbytes) {
175 uint64_t chunksz = len > 512 ? 512 : len;
176 Copy_In(b + nbytes, &kbuf, chunksz);
177 nbytes += chunksz;
178
179 for (i = 0; i < chunksz; i++)
180 Console_Putc(kbuf[i]);
181 }
182
183 return nbytes;
184}
185
186int
188{
189 return 0;
190}
191
192int
194{
195 Handle_Free(handle);
196 return 0;
197}
198
199Handle *
201{
202 Handle *handle = Handle_Alloc();
203 if (!handle)
204 return NULL;
205
206 handle->read = &Console_Read;
207 handle->write = &Console_Write;
208 handle->flush = &Console_Flush;
209 handle->close = &Console_Close;
210
211 return handle;
212}
213
void Console_Gets(char *str, size_t n)
Definition: console.c:88
void Console_Puts(const char *str)
Definition: console.c:141
Console consoles
Definition: console.c:15
int Console_Close(Handle *handle)
Definition: console.c:193
void Console_Init()
Definition: console.c:22
void Console_Putc(char ch)
Definition: console.c:131
int Console_Write(Handle *handle, void *buf, uint64_t off, uint64_t len)
Definition: console.c:167
void Console_EnqueueKey(char key)
Definition: console.c:75
int Console_Read(Handle *handle, void *buf, uint64_t off, uint64_t len)
Definition: console.c:151
int Console_Flush(Handle *handle)
Definition: console.c:187
Spinlock consoleLock
Definition: console.c:14
Handle * Console_OpenHandle()
Definition: console.c:200
char Console_Getc()
Definition: console.c:47
void Console_LateInit()
Definition: console.c:41
char keyBuf[CONSOLE_KEYBUF_MAXLEN]
Definition: console.h:26
int nextKey
Definition: console.h:24
Spinlock keyLock
Definition: console.h:27
int lastKey
Definition: console.h:25
#define CONSOLE_KEYBUF_MAXLEN
Definition: console.h:20
void DebugConsole_Puts(const char *str)
Definition: debugcons.c:22
void DebugConsole_Init()
Definition: debugcons.c:13
void DebugConsole_Putc(short c)
Definition: debugcons.c:17
static char buf[4096]
Definition: ethdump.c:10
int Copy_In(uintptr_t fromuser, void *tokernel, uintptr_t len)
Definition: copy.c:34
int Copy_Out(void *fromkernel, uintptr_t touser, uintptr_t len)
Definition: copy.c:70
uint64_t len
Definition: multiboot.h:2
void Serial_Init(void)
Definition: sercons.c:40
void Serial_LateInit(void)
Definition: sercons.c:59
bool Serial_HasData()
Definition: sercons.c:73
char Serial_Getc()
Definition: sercons.c:78
void Serial_Putc(char ch)
Definition: sercons.c:87
void Serial_Puts(const char *str)
Definition: sercons.c:102
void Spinlock_Unlock(Spinlock *lock) __UNLOCK_EX(*lock)
Definition: spinlock.c:109
#define SPINLOCK_TYPE_NORMAL
Definition: spinlock.h:12
void Spinlock_Lock(Spinlock *lock) __LOCK_EX(*lock)
Definition: spinlock.c:75
void Spinlock_Init(Spinlock *lock, const char *name, uint64_t type)
Definition: spinlock.c:43
#define NULL
Definition: stddef.h:6
Definition: handle.h:17
int(* close)(Handle *)
Definition: handle.h:26
int(* write)(Handle *, void *, uint64_t, uint64_t)
Definition: handle.h:24
int(* read)(Handle *, void *, uint64_t, uint64_t)
Definition: handle.h:23
int(* flush)(Handle *)
Definition: handle.h:25
uint64_t uintptr_t
Definition: types.h:16
unsigned long uint64_t
Definition: types.h:13
void VGA_Init(void)
Definition: vgacons.c:75
void VGA_Puts(const char *str)
Definition: vgacons.c:157
void VGA_Putc(short c)
Definition: vgacons.c:115