/* Copyright (c) 2015 Google Inc
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * #vars device, exports read access to select kernel variables.  These
 * variables are statically set.
 *
 * To add a variable, add a DEVVARS_ENTRY(name, format) somewhere in the kernel.
 * The format is a string consisting of two characters, using a modified version
 * of QEMU's formatting rules (ignoring count): [data_format][size]
 *
 * data_format is:
 *     x (hex)
 *     d (decimal)
 *     u (unsigned)
 *     o (octal)
 *     c (char)		does not need a size
 *     s (string)	does not need a size
 * size is:
 *     b (8 bits)
 *     h (16 bits)
 *     w (32 bits)
 *     g (64 bits)
 *
 * e.g. DEVVARS_ENTRY(num_cores, "dw");
 *
 * Another thing we can consider doing is implementing create() to add variables
 * on the fly.  We can easily get the address (symbol table), but not the type,
 * unless we get debugging info.  We could consider a CTL command to allow the
 * user to change the type, though that might overload write() if we also allow
 * setting variables. */

#include <ns.h>
#include <kmalloc.h>
#include <kref.h>
#include <atomic.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <error.h>
#include <sys/queue.h>
#include <fdtap.h>
#include <syscall.h>

struct dev vars_devtab;

static char *devname(void)
{
	return vars_devtab.name;
}

static struct dirtab *vars_dir;
static size_t nr_vars;
static qlock_t vars_lock;

struct dirtab __attribute__((__section__("devvars")))
              __devvars_dot = {".", {0, 0, QTDIR}, 0, DMDIR | 0555};

DEVVARS_ENTRY(num_cores, "dw");

static bool var_is_valid(struct dirtab *dir)
{
	return dir->qid.vers != -1;
}

/* Careful with this.  c->name->s is the full path, at least sometimes. */
static struct dirtab *find_var_by_name(const char *name)
{
	for (size_t i = 0; i < nr_vars; i++)
		if (!strcmp(vars_dir[i].name, name))
			return &vars_dir[i];
	return 0;
}

static void vars_init(void)
{
	/* If you name a section without a '.', GCC will create start and stop
	 * symbols, e.g. __start_SECTION */
	extern struct dirtab __start_devvars;
	extern struct dirtab __stop_devvars;
	struct dirtab *dot, temp;

	nr_vars = &__stop_devvars - &__start_devvars;
	vars_dir = kmalloc_array(nr_vars, sizeof(struct dirtab), MEM_WAIT);
	if (!vars_dir)
		error(ENOMEM, "kmalloc_array failed, nr_vars was %p", nr_vars);
	memcpy(vars_dir, &__start_devvars, nr_vars * sizeof(struct dirtab));
	/* "." needs to be the first entry in a devtable.  It might already be
	 * first, but we can do the swap regardless. */
	temp = vars_dir[0];
	dot = find_var_by_name(".");
	assert(dot);
	vars_dir[0] = *dot;
	*dot = temp;
	qlock_init(&vars_lock);
}

static struct chan *vars_attach(char *spec)
{
	struct chan *c;

	c = devattach(devname(), spec);
	mkqid(&c->qid, 0, 0, QTDIR);
	return c;
}

static struct walkqid *vars_walk(struct chan *c, struct chan *nc, char **name,
				 unsigned int nname)
{
	ERRSTACK(1);
	struct walkqid *ret;

	qlock(&vars_lock);
	if (waserror()) {
		qunlock(&vars_lock);
		nexterror();
	}
	ret = devwalk(c, nc, name, nname, vars_dir, nr_vars, devgen);
	poperror();
	qunlock(&vars_lock);
	return ret;
}

static size_t vars_stat(struct chan *c, uint8_t *db, size_t n)
{
	ERRSTACK(1);
	size_t ret;

	qlock(&vars_lock);
	if (waserror()) {
		qunlock(&vars_lock);
		nexterror();
	}
	ret = devstat(c, db, n, vars_dir, nr_vars, devgen);
	poperror();
	qunlock(&vars_lock);
	return ret;
}

static struct chan *vars_open(struct chan *c, int omode)
{
	ERRSTACK(1);
	struct chan *ret;

	qlock(&vars_lock);
	if (waserror()) {
		qunlock(&vars_lock);
		nexterror();
	}
	ret = devopen(c, omode, vars_dir, nr_vars, devgen);
	poperror();
	qunlock(&vars_lock);
	return ret;
}

static void vars_close(struct chan *c)
{
}

static struct dirtab *find_free_var(void)
{
	for (size_t i = 0; i < nr_vars; i++)
		if (!var_is_valid(&vars_dir[i]))
			return &vars_dir[i];
	return 0;
}

/* We ignore the perm - they are all hard-coded in the dirtab */
static void vars_create(struct chan *c, char *name, int omode, uint32_t perm,
                        char *ext)
{
	struct dirtab *new_slot;
	uintptr_t addr;
	char *bang;
	size_t size;

	if (perm & DMSYMLINK)
		error(EINVAL, "#%s doesn't support symlinks", devname());
	/* TODO: check that the user is privileged */
	bang = strchr(name, '!');
	if (!bang)
		error(EINVAL, "Var %s has no ! in its format string", name);
	*bang = 0;
	addr = get_symbol_addr(name);
	*bang = '!';
	if (!addr)
		error(EINVAL, "Could not find symbol for %s", name);
	bang++;
	/* Note that we don't check the symbol type against the format.  We're
	 * trusting the user here.  o/w we'd need dwarf support. */
	switch (*bang) {
	case 'c':
		size = sizeof(char);
		break;
	case 's':
		size = sizeof(char*);
		break;
	case 'd':
	case 'x':
	case 'u':
	case 'o':
		bang++;
		switch (*bang) {
		case 'b':
			size = sizeof(uint8_t);
			break;
		case 'h':
			size = sizeof(uint16_t);
			break;
		case 'w':
			size = sizeof(uint32_t);
			break;
		case 'g':
			size = sizeof(uint64_t);
			break;
		default:
			error(EINVAL, "Bad var size '%c'", *bang);
		}
		break;
	default:
		error(EINVAL, "Unknown var data_format '%c'", *bang);
	}
	bang++;
	if (*bang)
		error(EINVAL, "Extra chars for var %s", name);

	qlock(&vars_lock);
	new_slot = find_free_var();
	if (!new_slot) {
		vars_dir = kreallocarray(vars_dir, nr_vars * 2,
					 sizeof(struct dirtab), MEM_WAIT);
		if (!vars_dir)
			error(ENOMEM, "krealloc_array failed, nr_vars was %p",
			      nr_vars);
		memset(vars_dir + nr_vars, 0, nr_vars * sizeof(struct dirtab));
		for (size_t i = nr_vars; i < nr_vars * 2; i++)
			vars_dir[i].qid.vers = -1;
		new_slot = vars_dir + nr_vars;
		nr_vars *= 2;
	}
	strlcpy(new_slot->name, name, sizeof(new_slot->name));
	new_slot->qid.path = addr;
	new_slot->qid.vers = 0;
	new_slot->qid.type = QTFILE;
	new_slot->length = size;
	new_slot->perm = 0444;
	c->qid = new_slot->qid;		/* need to update c with its new qid */
	qunlock(&vars_lock);
	c->mode = openmode(omode);
}

static const char *get_integer_fmt(char data_fmt, char data_size)
{
	switch (data_fmt) {
	case 'x':
		switch (data_size) {
		case 'b':
		case 'h':
		case 'w':
			return "0x%x";
		case 'g':
			return "0x%lx";
		}
	case 'd':
		switch (data_size) {
		case 'b':
		case 'h':
		case 'w':
			return "%d";
		case 'g':
			return "%ld";
		}
	case 'u':
		switch (data_size) {
		case 'b':
		case 'h':
		case 'w':
			return "%u";
		case 'g':
			return "%lu";
		}
	case 'o':
		switch (data_size) {
		case 'b':
		case 'h':
		case 'w':
			return "0%o";
		case 'g':
			return "0%lo";
		}
	}
	return 0;
}

static size_t vars_read(struct chan *c, void *ubuf, size_t n, off64_t offset)
{
	ERRSTACK(1);
	char tmp[128];	/* big enough for any number and most strings */
	size_t size = sizeof(tmp);
	char data_size, data_fmt, *fmt;
	const char *fmt_int;
	bool is_signed = FALSE;
	size_t ret;

	qlock(&vars_lock);
	if (waserror()) {
		qunlock(&vars_lock);
		nexterror();
	}

	if (c->qid.type == QTDIR) {
		ret = devdirread(c, ubuf, n, vars_dir, nr_vars, devgen);
		poperror();
		qunlock(&vars_lock);
		return ret;
	}

	/* These checks are mostly for the static variables.  They are a
	 * double-check for the user-provided vars. */
	fmt = strchr(c->name->s, '!');
	if (!fmt)
		error(EINVAL, "var %s has no ! in its format string",
		      c->name->s);
	fmt++;
	data_fmt = *fmt;
	if (!data_fmt)
		error(EINVAL, "var %s has no data_format", c->name->s);

	switch (data_fmt) {
	case 'c':
		size = snprintf(tmp, size, "%c", *(char*)c->qid.path);
		break;
	case 's':
		size = snprintf(tmp, size, "%s", *(char**)c->qid.path);
		break;
	case 'd':
		is_signed = TRUE;
		/* fall through */
	case 'x':
	case 'u':
	case 'o':
		fmt++;
		data_size = *fmt;
		if (!data_size)
			error(EINVAL, "var %s has no size", c->name->s);
		fmt_int = get_integer_fmt(data_fmt, data_size);
		if (!fmt_int)
			error(EINVAL, "#%s was unable to get an int fmt for %s",
			      devname(), c->name->s);
		switch (data_size) {
		case 'b':
			if (is_signed)
				size = snprintf(tmp, size, fmt_int,
						*(int8_t*)c->qid.path);
			else
				size = snprintf(tmp, size, fmt_int,
						*(uint8_t*)c->qid.path);
			break;
		case 'h':
			if (is_signed)
				size = snprintf(tmp, size, fmt_int,
						*(int16_t*)c->qid.path);
			else
				size = snprintf(tmp, size, fmt_int,
						*(uint16_t*)c->qid.path);
			break;
		case 'w':
			if (is_signed)
				size = snprintf(tmp, size, fmt_int,
						*(int32_t*)c->qid.path);
			else
				size = snprintf(tmp, size, fmt_int,
						*(uint32_t*)c->qid.path);
			break;
		case 'g':
			if (is_signed)
				size = snprintf(tmp, size, fmt_int,
						*(int64_t*)c->qid.path);
			else
				size = snprintf(tmp, size, fmt_int,
						*(uint64_t*)c->qid.path);
			break;
		default:
			error(EINVAL, "Bad #%s size %c", devname(), data_size);
		}
		break;
	default:
		error(EINVAL, "Unknown #%s data_format %c", devname(),
		      data_fmt);
	}
	fmt++;
	if (*fmt)
		error(EINVAL, "Extra characters after var %s", c->name->s);
	ret = readmem(offset, ubuf, n, tmp, size + 1);
	poperror();
	qunlock(&vars_lock);
	return ret;
}

static size_t vars_write(struct chan *c, void *ubuf, size_t n, off64_t offset)
{
	error(EFAIL, "Can't write to a #%s file", devname());
}

/* remove is interesting.  we mark the qid in the dirtab as -1, which is a
 * signal to devgen that it is an invalid entry.  someone could already have
 * done a walk (before we qlocked) and grabbed the qid before it was -1.  as far
 * as they are concerned, they have a valid entry, since "the qid is the file"
 * for devvars.  (i.e. the chan gets a copy of the entire file, which fits into
 * the qid). */
static void vars_remove(struct chan *c)
{
	ERRSTACK(1);
	struct dirtab *dir;
	char *dir_name;

	/* chan may have multiple elements in the path; get the last one. */
	dir_name = strrchr(c->name->s, '/');
	dir_name = dir_name ? dir_name + 1 : c->name->s;

	qlock(&vars_lock);
	if (waserror()) {
		qunlock(&vars_lock);
		nexterror();
	}
	dir = find_var_by_name(dir_name);
	if (!dir || dir->qid.vers == -1)
		error(ENOENT, "Failed to remove %s, was it already removed?",
		      c->name->s);
	dir->qid.vers = -1;
	poperror();
	qunlock(&vars_lock);
}

struct dev vars_devtab __devtab = {
	.name = "vars",
	.reset = devreset,
	.init = vars_init,
	.shutdown = devshutdown,
	.attach = vars_attach,
	.walk = vars_walk,
	.stat = vars_stat,
	.open = vars_open,
	.create = vars_create,
	.close = vars_close,
	.read = vars_read,
	.bread = devbread,
	.write = vars_write,
	.bwrite = devbwrite,
	.remove = vars_remove,
	.wstat = devwstat,
	.power = devpower,
	.chaninfo = devchaninfo,
	.tapfd = 0,
};

/* The utest needs these variables exported */
#ifdef CONFIG_DEVVARS_TEST

static char *s = "string";
static char c = 'x';
static uint8_t  u8  = 8;
static uint16_t u16 = 16;
static uint32_t u32 = 32;
static uint64_t u64 = 64;
static uint8_t  d8  = -8;
static uint16_t d16 = -16;
static uint32_t d32 = -32;
static uint64_t d64 = -64;
static uint8_t  x8  = 0x8;
static uint16_t x16 = 0x16;
static uint32_t x32 = 0x32;
static uint64_t x64 = 0x64;
static uint8_t  o8  = 01;
static uint16_t o16 = 016;
static uint32_t o32 = 032;
static uint64_t o64 = 064;

/* For testing creation.  There is no ENTRY for this. */
char *devvars_foobar = "foobar";

DEVVARS_ENTRY(s, "s");
DEVVARS_ENTRY(c, "c");
DEVVARS_ENTRY(u8,  "ub");
DEVVARS_ENTRY(u16, "uh");
DEVVARS_ENTRY(u32, "uw");
DEVVARS_ENTRY(u64, "ug");
DEVVARS_ENTRY(d8,  "db");
DEVVARS_ENTRY(d16, "dh");
DEVVARS_ENTRY(d32, "dw");
DEVVARS_ENTRY(d64, "dg");
DEVVARS_ENTRY(x8,  "xb");
DEVVARS_ENTRY(x16, "xh");
DEVVARS_ENTRY(x32, "xw");
DEVVARS_ENTRY(x64, "xg");
DEVVARS_ENTRY(o8,  "ob");
DEVVARS_ENTRY(o16, "oh");
DEVVARS_ENTRY(o32, "ow");
DEVVARS_ENTRY(o64, "og");

#endif /* CONFIG_DEVVARS_TEST */
