aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--stand/common/bootstrap.h31
-rw-r--r--stand/common/nvstore.c132
-rw-r--r--stand/libsa/Makefile2
-rw-r--r--stand/libsa/nvstore.c151
-rw-r--r--stand/libsa/nvstore.h39
-rw-r--r--stand/libsa/stand.h29
6 files changed, 223 insertions, 161 deletions
diff --git a/stand/common/bootstrap.h b/stand/common/bootstrap.h
index 261eefaac943..cc22cbcb729d 100644
--- a/stand/common/bootstrap.h
+++ b/stand/common/bootstrap.h
@@ -381,37 +381,6 @@ extern struct arch_switch archsw;
/* This must be provided by the MD code, but should it be in the archsw? */
void delay(int delay);
-/*
- * nvstore API.
- */
-typedef int (nvstore_getter_cb_t)(void *, const char *, void **);
-typedef int (nvstore_setter_cb_t)(void *, int, const char *,
- const void *, size_t);
-typedef int (nvstore_setter_str_cb_t)(void *, const char *, const char *,
- const char *);
-typedef int (nvstore_unset_cb_t)(void *, const char *);
-typedef int (nvstore_print_cb_t)(void *, void *);
-typedef int (nvstore_iterate_cb_t)(void *, int (*)(void *, void *));
-
-typedef struct nvs_callbacks {
- nvstore_getter_cb_t *nvs_getter;
- nvstore_setter_cb_t *nvs_setter;
- nvstore_setter_str_cb_t *nvs_setter_str;
- nvstore_unset_cb_t *nvs_unset;
- nvstore_print_cb_t *nvs_print;
- nvstore_iterate_cb_t *nvs_iterate;
-} nvs_callbacks_t;
-
-int nvstore_init(const char *, nvs_callbacks_t *, void *);
-int nvstore_fini(const char *);
-void *nvstore_get_store(const char *);
-int nvstore_print(void *);
-int nvstore_get_var(void *, const char *, void **);
-int nvstore_set_var(void *, int, const char *, void *, size_t);
-int nvstore_set_var_from_string(void *, const char *, const char *,
- const char *);
-int nvstore_unset_var(void *, const char *);
-
/* common code to set currdev variable. */
int gen_setcurrdev(struct env_var *ev, int flags, const void *value);
int mount_currdev(struct env_var *, int, const void *);
diff --git a/stand/common/nvstore.c b/stand/common/nvstore.c
index c6d230584f9d..3cdb094c858f 100644
--- a/stand/common/nvstore.c
+++ b/stand/common/nvstore.c
@@ -29,138 +29,12 @@
* nvstore is abstraction layer to implement data read/write to different
* types of non-volatile storage.
*
- * User interfaces:
- * Provide mapping via environment: setenv/unsetenv/putenv. Access via
- * environment functions/commands is available once nvstore has
- * attached the backend and stored textual data is mapped to environment.
- *
- * Provide command "nvstore" to create new data instances.
- *
- * API: TBD.
- * nvstore_init(): attach new backend and create the environment mapping.
- * nvstore_fini: detach backend and unmap the related environment.
- *
- * The disk based storage, such as UFS file or ZFS bootenv label area, is
- * only accessible after root file system is set. Root file system change
- * will switch the back end storage.
+ * Provides cli command 'nvostre'
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdbool.h>
-#include <sys/queue.h>
-#include <bootstrap.h>
#include "stand.h"
-
-typedef struct nvstore {
- char *nvs_name;
- void *nvs_data;
- nvs_callbacks_t *nvs_cb;
- STAILQ_ENTRY(nvstore) nvs_next;
-} nvstore_t;
-
-typedef STAILQ_HEAD(store_list, nvstore) nvstore_list_t;
-
-nvstore_list_t stores = STAILQ_HEAD_INITIALIZER(stores);
-
-void *
-nvstore_get_store(const char *name)
-{
- nvstore_t *st;
-
- st = NULL;
-
- STAILQ_FOREACH(st, &stores, nvs_next) {
- if (strcmp(name, st->nvs_name) == 0)
- break;
- }
-
- return (st);
-}
-
-int
-nvstore_init(const char *name, nvs_callbacks_t *cb, void *data)
-{
- nvstore_t *st;
-
- st = nvstore_get_store(name);
- if (st != NULL)
- return (EEXIST);
-
- if ((st = malloc(sizeof (*st))) == NULL)
- return (ENOMEM);
-
- if ((st->nvs_name = strdup(name)) == NULL) {
- free(st);
- return (ENOMEM);
- }
-
- st->nvs_data = data;
- st->nvs_cb = cb;
-
- STAILQ_INSERT_TAIL(&stores, st, nvs_next);
- return (0);
-}
-
-int
-nvstore_fini(const char *name)
-{
- nvstore_t *st;
-
- st = nvstore_get_store(name);
- if (st == NULL)
- return (ENOENT);
-
- STAILQ_REMOVE(&stores, st, nvstore, nvs_next);
-
- free(st->nvs_name);
- free(st->nvs_data);
- free(st);
- return (0);
-}
-
-int
-nvstore_print(void *ptr)
-{
- nvstore_t *st = ptr;
-
- return (st->nvs_cb->nvs_iterate(st->nvs_data, st->nvs_cb->nvs_print));
-}
-
-int
-nvstore_get_var(void *ptr, const char *name, void **data)
-{
- nvstore_t *st = ptr;
-
- return (st->nvs_cb->nvs_getter(st->nvs_data, name, data));
-}
-
-int
-nvstore_set_var(void *ptr, int type, const char *name,
- void *data, size_t size)
-{
- nvstore_t *st = ptr;
-
- return (st->nvs_cb->nvs_setter(st->nvs_data, type, name, data, size));
-}
-
-int
-nvstore_set_var_from_string(void *ptr, const char *type, const char *name,
- const char *data)
-{
- nvstore_t *st = ptr;
-
- return (st->nvs_cb->nvs_setter_str(st->nvs_data, type, name, data));
-}
-
-int
-nvstore_unset_var(void *ptr, const char *name)
-{
- nvstore_t *st = ptr;
-
- return (st->nvs_cb->nvs_unset(st->nvs_data, name));
-}
+#include "nvstore.h"
+#include "bootstrap.h"
COMMAND_SET(nvstore, "nvstore", "manage non-volatile data", command_nvstore);
diff --git a/stand/libsa/Makefile b/stand/libsa/Makefile
index 8ec62f276a09..f009b55e89ef 100644
--- a/stand/libsa/Makefile
+++ b/stand/libsa/Makefile
@@ -15,7 +15,7 @@ LIB?= sa
# standalone components and stuff we have modified locally
SRCS+= gzguts.h zutil.h __main.c abort.c assert.c bcd.c environment.c \
getopt.c gets.c globals.c \
- hexdump.c pager.c panic.c printf.c strdup.c strerror.c \
+ hexdump.c nvstore.c pager.c panic.c printf.c strdup.c strerror.c \
random.c sbrk.c tslog.c twiddle.c zalloc.c zalloc_malloc.c
# private (pruned) versions of libc string functions
diff --git a/stand/libsa/nvstore.c b/stand/libsa/nvstore.c
new file mode 100644
index 000000000000..e5a804ff15e8
--- /dev/null
+++ b/stand/libsa/nvstore.c
@@ -0,0 +1,151 @@
+/*-
+ * Copyright 2020 Toomas Soome <tsoome@me.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Big Theory Statement.
+ *
+ * nvstore is abstraction layer to implement data read/write to different
+ * types of non-volatile storage.
+ *
+ * User interfaces:
+ * Provide mapping via environment: setenv/unsetenv/putenv. Access via
+ * environment functions/commands is available once nvstore has
+ * attached the backend and stored textual data is mapped to environment.
+ *
+ * nvstore_init(): attach new backend and create the environment mapping.
+ * nvstore_fini: detach backend and unmap the related environment.
+ *
+ * The disk based storage, such as UFS file or ZFS bootenv label area, is
+ * only accessible after root file system is set. Root file system change
+ * will switch the back end storage.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <stdbool.h>
+#include <sys/queue.h>
+#include "stand.h"
+#include "nvstore.h"
+
+nvstore_list_t stores = STAILQ_HEAD_INITIALIZER(stores);
+
+void *
+nvstore_get_store(const char *name)
+{
+ nvstore_t *st;
+
+ st = NULL;
+
+ STAILQ_FOREACH(st, &stores, nvs_next) {
+ if (strcmp(name, st->nvs_name) == 0)
+ break;
+ }
+
+ return (st);
+}
+
+int
+nvstore_init(const char *name, nvs_callbacks_t *cb, void *data)
+{
+ nvstore_t *st;
+
+ st = nvstore_get_store(name);
+ if (st != NULL)
+ return (EEXIST);
+
+ if ((st = malloc(sizeof (*st))) == NULL)
+ return (ENOMEM);
+
+ if ((st->nvs_name = strdup(name)) == NULL) {
+ free(st);
+ return (ENOMEM);
+ }
+
+ st->nvs_data = data;
+ st->nvs_cb = cb;
+
+ STAILQ_INSERT_TAIL(&stores, st, nvs_next);
+ return (0);
+}
+
+int
+nvstore_fini(const char *name)
+{
+ nvstore_t *st;
+
+ st = nvstore_get_store(name);
+ if (st == NULL)
+ return (ENOENT);
+
+ STAILQ_REMOVE(&stores, st, nvstore, nvs_next);
+
+ free(st->nvs_name);
+ free(st->nvs_data);
+ free(st);
+ return (0);
+}
+
+int
+nvstore_print(void *ptr)
+{
+ nvstore_t *st = ptr;
+
+ return (st->nvs_cb->nvs_iterate(st->nvs_data, st->nvs_cb->nvs_print));
+}
+
+int
+nvstore_get_var(void *ptr, const char *name, void **data)
+{
+ nvstore_t *st = ptr;
+
+ return (st->nvs_cb->nvs_getter(st->nvs_data, name, data));
+}
+
+int
+nvstore_set_var(void *ptr, int type, const char *name,
+ void *data, size_t size)
+{
+ nvstore_t *st = ptr;
+
+ return (st->nvs_cb->nvs_setter(st->nvs_data, type, name, data, size));
+}
+
+int
+nvstore_set_var_from_string(void *ptr, const char *type, const char *name,
+ const char *data)
+{
+ nvstore_t *st = ptr;
+
+ return (st->nvs_cb->nvs_setter_str(st->nvs_data, type, name, data));
+}
+
+int
+nvstore_unset_var(void *ptr, const char *name)
+{
+ nvstore_t *st = ptr;
+
+ return (st->nvs_cb->nvs_unset(st->nvs_data, name));
+}
diff --git a/stand/libsa/nvstore.h b/stand/libsa/nvstore.h
new file mode 100644
index 000000000000..a03a73249194
--- /dev/null
+++ b/stand/libsa/nvstore.h
@@ -0,0 +1,39 @@
+/*-
+ * Copyright 2020 Toomas Soome <tsoome@me.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* Private part of nvstore API, for internal use only */
+
+#pragma once
+
+typedef struct nvstore {
+ char *nvs_name;
+ void *nvs_data;
+ nvs_callbacks_t *nvs_cb;
+ STAILQ_ENTRY(nvstore) nvs_next;
+} nvstore_t;
+
+typedef STAILQ_HEAD(store_list, nvstore) nvstore_list_t;
+
+extern nvstore_list_t stores;
diff --git a/stand/libsa/stand.h b/stand/libsa/stand.h
index 87b86fb98b20..83bfabd1c878 100644
--- a/stand/libsa/stand.h
+++ b/stand/libsa/stand.h
@@ -503,6 +503,35 @@ caddr_t ptov(uintptr_t);
/* hexdump.c */
void hexdump(caddr_t region, size_t len);
+/* nvstore.c */
+typedef int (nvstore_getter_cb_t)(void *, const char *, void **);
+typedef int (nvstore_setter_cb_t)(void *, int, const char *,
+ const void *, size_t);
+typedef int (nvstore_setter_str_cb_t)(void *, const char *, const char *,
+ const char *);
+typedef int (nvstore_unset_cb_t)(void *, const char *);
+typedef int (nvstore_print_cb_t)(void *, void *);
+typedef int (nvstore_iterate_cb_t)(void *, int (*)(void *, void *));
+
+typedef struct nvs_callbacks {
+ nvstore_getter_cb_t *nvs_getter;
+ nvstore_setter_cb_t *nvs_setter;
+ nvstore_setter_str_cb_t *nvs_setter_str;
+ nvstore_unset_cb_t *nvs_unset;
+ nvstore_print_cb_t *nvs_print;
+ nvstore_iterate_cb_t *nvs_iterate;
+} nvs_callbacks_t;
+
+int nvstore_init(const char *, nvs_callbacks_t *, void *);
+int nvstore_fini(const char *);
+void *nvstore_get_store(const char *);
+int nvstore_print(void *);
+int nvstore_get_var(void *, const char *, void **);
+int nvstore_set_var(void *, int, const char *, void *, size_t);
+int nvstore_set_var_from_string(void *, const char *, const char *,
+ const char *);
+int nvstore_unset_var(void *, const char *);
+
/* tslog.c */
#define TSRAW(a, b, c) tslog(a, b, c)
#define TSENTER() TSRAW("ENTER", __func__, NULL)