aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/amd64/pci/pci_bus.c7
-rw-r--r--sys/dev/acpica/acpi_pcib_acpi.c4
-rw-r--r--sys/i386/pci/pci_bus.c7
-rw-r--r--sys/kern/kern_environment.c46
-rw-r--r--sys/sys/kernel.h54
-rw-r--r--sys/sys/systm.h2
6 files changed, 110 insertions, 10 deletions
diff --git a/sys/amd64/pci/pci_bus.c b/sys/amd64/pci/pci_bus.c
index a85dd19c0027..75e118a37a8d 100644
--- a/sys/amd64/pci/pci_bus.c
+++ b/sys/amd64/pci/pci_bus.c
@@ -266,10 +266,9 @@ legacy_pcib_write_ivar(device_t dev, device_t child, int which,
SYSCTL_DECL(_hw_pci);
-static int legacy_host_mem_start = 0x80000000;
-/* No TUNABLE_ULONG :-( */
-TUNABLE_INT("hw.pci.host_mem_start", &legacy_host_mem_start);
-SYSCTL_INT(_hw_pci, OID_AUTO, host_mem_start, CTLFLAG_RDTUN,
+static unsigned long legacy_host_mem_start = 0x80000000;
+TUNABLE_ULONG("hw.pci.host_mem_start", &legacy_host_mem_start);
+SYSCTL_ULONG(_hw_pci, OID_AUTO, host_mem_start, CTLFLAG_RDTUN,
&legacy_host_mem_start, 0x80000000,
"Limit the host bridge memory to being above this address. Must be\n\
set at boot via a tunable.");
diff --git a/sys/dev/acpica/acpi_pcib_acpi.c b/sys/dev/acpica/acpi_pcib_acpi.c
index 3ba2aab758df..95b6d2add500 100644
--- a/sys/dev/acpica/acpi_pcib_acpi.c
+++ b/sys/dev/acpica/acpi_pcib_acpi.c
@@ -301,8 +301,8 @@ acpi_pcib_acpi_route_interrupt(device_t pcib, device_t dev, int pin)
return (acpi_pcib_route_interrupt(pcib, dev, pin));
}
-static int acpi_host_mem_start = 0x80000000;
-TUNABLE_INT("hw.acpi.host_mem_start", &acpi_host_mem_start);
+static unsigned long acpi_host_mem_start = 0x80000000;
+TUNABLE_ULONG("hw.acpi.host_mem_start", &acpi_host_mem_start);
struct resource *
acpi_pcib_acpi_alloc_resource(device_t dev, device_t child, int type, int *rid,
diff --git a/sys/i386/pci/pci_bus.c b/sys/i386/pci/pci_bus.c
index e561fa227798..70350ef3293f 100644
--- a/sys/i386/pci/pci_bus.c
+++ b/sys/i386/pci/pci_bus.c
@@ -472,10 +472,9 @@ legacy_pcib_write_ivar(device_t dev, device_t child, int which,
SYSCTL_DECL(_hw_pci);
-static int legacy_host_mem_start = 0x80000000;
-/* No TUNABLE_ULONG :-( */
-TUNABLE_INT("hw.pci.host_mem_start", &legacy_host_mem_start);
-SYSCTL_INT(_hw_pci, OID_AUTO, host_mem_start, CTLFLAG_RDTUN,
+static unsigned long legacy_host_mem_start = 0x80000000;
+TUNABLE_ULONG("hw.pci.host_mem_start", &legacy_host_mem_start);
+SYSCTL_ULONG(_hw_pci, OID_AUTO, host_mem_start, CTLFLAG_RDTUN,
&legacy_host_mem_start, 0x80000000,
"Limit the host bridge memory to being above this address. Must be\n\
set at boot via a tunable.");
diff --git a/sys/kern/kern_environment.c b/sys/kern/kern_environment.c
index 96b57d9170d5..7f88adca6e66 100644
--- a/sys/kern/kern_environment.c
+++ b/sys/kern/kern_environment.c
@@ -415,6 +415,36 @@ getenv_int(const char *name, int *data)
}
/*
+ * Return a long value from an environment variable.
+ */
+long
+getenv_long(const char *name, long *data)
+{
+ quad_t tmp;
+ long rval;
+
+ rval = getenv_quad(name, &tmp);
+ if (rval)
+ *data = (long) tmp;
+ return (rval);
+}
+
+/*
+ * Return an unsigned long value from an environment variable.
+ */
+unsigned long
+getenv_ulong(const char *name, unsigned long *data)
+{
+ quad_t tmp;
+ long rval;
+
+ rval = getenv_quad(name, &tmp);
+ if (rval)
+ *data = (unsigned long) tmp;
+ return (rval);
+}
+
+/*
* Return a quad_t value from an environment variable.
*/
int
@@ -464,6 +494,22 @@ tunable_int_init(void *data)
}
void
+tunable_long_init(void *data)
+{
+ struct tunable_long *d = (struct tunable_long *)data;
+
+ TUNABLE_LONG_FETCH(d->path, d->var);
+}
+
+void
+tunable_ulong_init(void *data)
+{
+ struct tunable_ulong *d = (struct tunable_ulong *)data;
+
+ TUNABLE_ULONG_FETCH(d->path, d->var);
+}
+
+void
tunable_quad_init(void *data)
{
struct tunable_quad *d = (struct tunable_quad *)data;
diff --git a/sys/sys/kernel.h b/sys/sys/kernel.h
index f5795c47bbfc..4f8f078758e8 100644
--- a/sys/sys/kernel.h
+++ b/sys/sys/kernel.h
@@ -265,6 +265,10 @@ void sysinit_add(struct sysinit **set, struct sysinit **set_end);
* loader.conf(5) for any tunables or conflicts will result.
*/
+/*
+ * int
+ * please avoid using for new tunables!
+ */
extern void tunable_int_init(void *);
struct tunable_int {
const char *path;
@@ -285,6 +289,56 @@ struct tunable_int {
#define TUNABLE_INT_FETCH(path, var) getenv_int((path), (var))
+/*
+ * long
+ */
+extern void tunable_long_init(void *);
+struct tunable_long {
+ const char *path;
+ long *var;
+};
+#define TUNABLE_LONG(path, var) \
+ _TUNABLE_LONG((path), (var), __LINE__)
+#define _TUNABLE_LONG(path, var, line) \
+ __TUNABLE_LONG((path), (var), line)
+
+#define __TUNABLE_LONG(path, var, line) \
+ static struct tunable_long __tunable_long_ ## line = { \
+ path, \
+ var, \
+ }; \
+ SYSINIT(__Tunable_init_ ## line, SI_SUB_TUNABLES, SI_ORDER_MIDDLE, \
+ tunable_long_init, &__tunable_long_ ## line)
+
+#define TUNABLE_LONG_FETCH(path, var) getenv_long((path), (var))
+
+/*
+ * unsigned long
+ */
+extern void tunable_ulong_init(void *);
+struct tunable_ulong {
+ const char *path;
+ unsigned long *var;
+};
+#define TUNABLE_ULONG(path, var) \
+ _TUNABLE_ULONG((path), (var), __LINE__)
+#define _TUNABLE_ULONG(path, var, line) \
+ __TUNABLE_ULONG((path), (var), line)
+
+#define __TUNABLE_ULONG(path, var, line) \
+ static struct tunable_ulong __tunable_ulong_ ## line = {\
+ path, \
+ var, \
+ }; \
+ SYSINIT(__Tunable_init_ ## line, SI_SUB_TUNABLES, SI_ORDER_MIDDLE, \
+ tunable_ulong_init, &__tunable_ulong_ ## line)
+
+#define TUNABLE_ULONG_FETCH(path, var) getenv_ulong((path), (var))
+
+/*
+ * Quad (64-bit)
+ * please avoid using for new tunables!
+ */
extern void tunable_quad_init(void *);
struct tunable_quad {
const char *path;
diff --git a/sys/sys/systm.h b/sys/sys/systm.h
index 4b3662f4950f..2731bc81a5c8 100644
--- a/sys/sys/systm.h
+++ b/sys/sys/systm.h
@@ -226,6 +226,8 @@ int cr_canseesocket(struct ucred *cred, struct socket *so);
char *getenv(const char *name);
void freeenv(char *env);
int getenv_int(const char *name, int *data);
+long getenv_long(const char *name, long *data);
+unsigned long getenv_ulong(const char *name, unsigned long *data);
int getenv_string(const char *name, char *data, int size);
int getenv_quad(const char *name, quad_t *data);
int setenv(const char *name, const char *value);