| /* Copyright (c) 2012 The Regents of the University of California |
| * Barret Rhoden <brho@cs.berkeley.edu> |
| * See LICENSE for details. |
| * |
| * Console (Keyboard/serial/whatever) related functions. */ |
| |
| #pragma once |
| |
| #include <atomic.h> |
| #include <kthread.h> |
| #include <trap.h> |
| |
| #define KB_BUF_SIZE 256 /* Make sure this is a power of 2 */ |
| |
| /* Ring buffer for keyboard/character devices. Might make a more generic |
| * version in the future (allowing both sides to block, etc). Adding will drop |
| * any overflow, and getting will block til the full amount is read. */ |
| struct kb_buffer { |
| unsigned int prod_idx; |
| unsigned int cons_idx; |
| spinlock_t buf_lock; |
| struct semaphore buf_sem; |
| char buf[KB_BUF_SIZE]; |
| }; |
| extern struct kb_buffer cons_buf; /* kernel's console buffer */ |
| |
| void kb_buf_init(struct kb_buffer *kb); |
| /* These are not irq-safe. and get will block. */ |
| void kb_add_to_buf(struct kb_buffer *kb, char c); |
| void kb_get_from_buf(struct kb_buffer *kb, char *dst, size_t cnt); |
| |
| /* Kernel messages associated with the console. Arch-specific interrupt |
| * handlers need to call these. For add char, a0 = &cons_buf and a1 = the char |
| * you read. Call __run_mon on your 'magic' input. */ |
| void __cons_add_char(uint32_t srcid, long a0, long a1, long a2); |
| void __run_mon(uint32_t srcid, long a0, long a1, long a2); |
| |
| /* function to run one command. */ |
| int onecmd(int argc, char *argv[], struct hw_trapframe *hw_tf); |