/* 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);
