blob: 5f26839b3a3ad9fb6283b9d37b6d0b5a019d9c2d [file] [log] [blame] [edit]
/* 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);