lkml.org 
[lkml]   [2001]   [Jun]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] Support for SRM environment variables through procfs
Hi!

I've found a patch on Compaq's Jumpstart-CD which provides access to
SRM'S environment variables. I've ported that patch to 2.4.x and
here's the patch. Please test it. However, I've not got an Alpha
system booting via SRM handy so this patch is untested:-(

MfG, JBG

--
Fehler eingestehen, Größe zeigen: Nehmt die Rechtschreibreform zurück!!!
/* Jan-Benedict Glaw <jbglaw@lug-owl.de> -- +49-172-7608481 */
keyID=0x8399E1BB fingerprint=250D 3BCF 7127 0D8C A444 A961 1DBD 5E75 8399 E1BB
"insmod vi.o and there we go..." (Alexander Viro on linux-kernel)
diff -Nur linux-2.4.6-pre1/Documentation/Configure.help linux-2.4.6-pre1-srm/Documentation/Configure.help
--- linux-2.4.6-pre1/Documentation/Configure.help Tue Jun 5 11:24:47 2001
+++ linux-2.4.6-pre1-srm/Documentation/Configure.help Tue Jun 5 12:15:29 2001
@@ -17311,6 +17311,16 @@

If you're not sure, say N.

+SRM environment variables in procfs
+CONFIG_SRM_ENV
+ If you enable this option, a subdirectory called srm_environment
+ will give you access to the most important SRM environment
+ variables. If you've got an Alpha style system supporting
+ SRC, then it is a good idea to say Yes or Module to this driver.
+
+ This driver is also available as a module and will be called
+ srm_env.o if you build it as a module.
+
Footbridge internal watchdog
CONFIG_21285_WATCHDOG
The Intel Footbridge chip contains a builtin watchdog circuit. Say Y
diff -Nur linux-2.4.6-pre1/arch/alpha/config.in linux-2.4.6-pre1-srm/arch/alpha/config.in
--- linux-2.4.6-pre1/arch/alpha/config.in Tue Jun 5 11:22:08 2001
+++ linux-2.4.6-pre1-srm/arch/alpha/config.in Tue Jun 5 12:15:29 2001
@@ -179,7 +179,7 @@
-o "$CONFIG_ALPHA_TAKARA" = "y" -o "$CONFIG_ALPHA_EB164" = "y" \
-o "$CONFIG_ALPHA_ALCOR" = "y" -o "$CONFIG_ALPHA_MIATA" = "y" \
-o "$CONFIG_ALPHA_LX164" = "y" -o "$CONFIG_ALPHA_SX164" = "y" \
- -o "$CONFIG_ALPHA_NAUTILUS" = "y" ]
+ -o "$CONFIG_ALPHA_NAUTILUS" = "y" -o "$CONFIG_ALPHA_NONAME" = "y" ]
then
bool 'Use SRM as bootloader' CONFIG_ALPHA_SRM
fi
@@ -235,6 +235,10 @@
"ELF CONFIG_KCORE_ELF \
A.OUT CONFIG_KCORE_AOUT" ELF
fi
+if [ "$CONFIG_PROC_FS" != "n" -a CONFIG_ALPHA_SRM = "y" ]; then
+ tristate 'SRM environment through procfs' CONFIG_SRM_ENV
+fi
+
tristate 'Kernel support for a.out (ECOFF) binaries' CONFIG_BINFMT_AOUT
tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF
tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC
diff -Nur linux-2.4.6-pre1/arch/alpha/kernel/Makefile linux-2.4.6-pre1-srm/arch/alpha/kernel/Makefile
--- linux-2.4.6-pre1/arch/alpha/kernel/Makefile Tue Jun 5 11:07:28 2001
+++ linux-2.4.6-pre1-srm/arch/alpha/kernel/Makefile Tue Jun 5 12:15:29 2001
@@ -32,6 +32,7 @@

obj-$(CONFIG_SMP) += smp.o irq_smp.o
obj-$(CONFIG_PCI) += pci.o pci_iommu.o
+obj-$(CONFIG_SRM_ENV) += srm_env.o

ifdef CONFIG_ALPHA_GENERIC

diff -Nur linux-2.4.6-pre1/arch/alpha/kernel/alpha_ksyms.c linux-2.4.6-pre1-srm/arch/alpha/kernel/alpha_ksyms.c
--- linux-2.4.6-pre1/arch/alpha/kernel/alpha_ksyms.c Tue Jun 5 11:22:08 2001
+++ linux-2.4.6-pre1-srm/arch/alpha/kernel/alpha_ksyms.c Tue Jun 5 12:16:35 2001
@@ -18,6 +18,7 @@
#include <linux/mm.h>

#include <asm/io.h>
+#include <asm/console.h>
#include <asm/hwrpb.h>
#include <asm/uaccess.h>
#include <asm/processor.h>
@@ -56,6 +57,11 @@
EXPORT_SYMBOL(probe_irq_mask);
EXPORT_SYMBOL(screen_info);
EXPORT_SYMBOL(perf_irq);
+#ifdef CONFIG_ALPHA_SRM
+EXPORT_SYMBOL(callback_getenv);
+EXPORT_SYMBOL(callback_setenv);
+EXPORT_SYMBOL(callback_save_env);
+#endif /* CONFIG_ALPHA_SRM */

/* platform dependent support */
EXPORT_SYMBOL(_inb);
diff -Nur linux-2.4.6-pre1/arch/alpha/kernel/srm_env.c linux-2.4.6-pre1-srm/arch/alpha/kernel/srm_env.c
--- linux-2.4.6-pre1/arch/alpha/kernel/srm_env.c Thu Jan 1 01:00:00 1970
+++ linux-2.4.6-pre1-srm/arch/alpha/kernel/srm_env.c Tue Jun 5 12:15:29 2001
@@ -0,0 +1,219 @@
+/*
+ * srm_env.c - Access to SRC environment variables through
+ * the linux procfs
+ *
+ * (C)2001, Jan-Benedict Glaw <jbgaw@lug-owl.de>
+ *
+ * This driver is at all a modified version of Erik Mouw's
+ * ./linux/Documentation/DocBook/procfs_example.c, so: thanky
+ * you, erik! He can be reached via email at
+ * <J.A.K.Mouw@its.tudelft.nl>. It is based on an idea
+ * provided by DEC^WCompaq's "Jumpstart" CD. They included
+ * a patch like this as well. Thanks for idea!
+ *
+ *
+ * This software has been developed while working on the LART
+ * computing board (http://www.lart.tudelft.nl/). The
+ * development has been sponsored by the Mobile Multi-media
+ * Communications (http://www.mmc.tudelft.nl/) and Ubiquitous
+ * Communications (http://www.ubicom.tudelft.nl/) projects.
+ *
+ * This program is free software; you can redistribute
+ * it and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software
+ * Foundation version 2.
+ *
+ * This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place,
+ * Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/proc_fs.h>
+#include <asm/console.h>
+#include <asm/uaccess.h>
+
+#define DIRNAME "srm_environment" /* Subdir in /proc/ */
+#define VERSION "0.0.1" /* Module version */
+#define NAME "srm_env" /* Module name */
+#define DEBUG
+
+MODULE_AUTHOR("Jan-Benedict Glaw <jbglaw@lug-owl.de>");
+MODULE_DESCRIPTION("Accessing Alpha SRM environment through procfs interface");
+EXPORT_NO_SYMBOLS;
+
+typedef struct _srm_env {
+ char *name;
+ unsigned long id;
+ struct proc_dir_entry *proc_entry;
+} srm_env_t;
+
+static struct proc_dir_entry *directory;
+static srm_env_t srm_entries[] = {
+ { "auto_action", ENV_AUTO_ACTION },
+ { "boot_dev", ENV_BOOT_DEV },
+ { "bootdef_dev", ENV_BOOTDEF_DEV },
+ { "booted_dev", ENV_BOOTED_DEV },
+ { "boot_file", ENV_BOOT_FILE },
+ { "booted_file", ENV_BOOTED_FILE },
+ { "boot_osflags", ENV_BOOT_OSFLAGS },
+ { "booted_osflags", ENV_BOOTED_OSFLAGS },
+ { "boot_reset", ENV_BOOT_RESET },
+ { "dump_dev", ENV_DUMP_DEV },
+ { "enable_audit", ENV_ENABLE_AUDIT },
+ { "license", ENV_LICENSE },
+ { "char_set", ENV_CHAR_SET },
+ { "language", ENV_LANGUAGE },
+ { "tty_dev", ENV_TTY_DEV },
+ { NULL, 0 },
+};
+
+static int srm_env_read(char *page, char **start, off_t off, int count,
+ int *eof, void *data)
+{
+ int nbytes;
+ unsigned long ret;
+ srm_env_t *entry;
+
+ MOD_INC_USE_COUNT;
+
+ if(off != 0) {
+ MOD_DEC_USE_COUNT;
+ return -EFAULT;
+ }
+
+ entry = (srm_env_t *)data;
+ ret = callback_getenv(entry->id, page, count);
+
+ if((ret >> 61) == 0)
+ nbytes = (int)ret;
+ else
+ nbytes = -EFAULT;
+
+ MOD_DEC_USE_COUNT;
+
+ return nbytes;
+}
+
+
+static int srm_env_write(struct file *file, const char *buffer,
+ unsigned long count, void *data)
+{
+#define BUFLEN 512
+ int nbytes;
+ srm_env_t *entry;
+ char buf[BUFLEN];
+ unsigned long ret1, ret2;
+
+ MOD_INC_USE_COUNT;
+
+ entry = (srm_env_t *) data;
+
+ nbytes = strlen(buffer) + 1;
+ if(nbytes > BUFLEN) {
+ MOD_DEC_USE_COUNT;
+ return -ENOMEM;
+ }
+
+ //memcpy(aligned_buffer, buffer, nbytes)
+
+ if(copy_from_user(buf, buffer, count)) {
+ MOD_DEC_USE_COUNT;
+ return -EFAULT;
+ }
+ buf[count] = 0x00;
+
+ ret1 = callback_setenv(entry->id, buf, count);
+ if((ret1 >> 61) == 0) {
+ do
+ ret2 = callback_save_env();
+ while((ret2 >> 61) == 1);
+ nbytes = (int)ret1;
+ } else
+ nbytes = -EFAULT;
+
+ MOD_DEC_USE_COUNT;
+
+ return nbytes;
+}
+
+static void srm_env_cleanup(void)
+{
+ srm_env_t *entry;
+
+ if(directory) {
+ entry = srm_entries;
+ while(entry->name != NULL && entry->id != 0) {
+ if(entry->proc_entry) {
+ remove_proc_entry(entry->name, directory);
+ entry->proc_entry = NULL;
+ }
+ entry++;
+ }
+ remove_proc_entry(DIRNAME, NULL);
+ }
+
+ return;
+}
+
+static int __init srm_env_init(void)
+{
+ srm_env_t *entry;
+
+ if(!alpha_using_srm) {
+ printk(KERN_INFO "%s: This Alpha system doesn't "
+ "know about SRM...\n", __FUNCTION__);
+ return -ENODEV;
+ }
+
+ directory = proc_mkdir(DIRNAME, NULL);
+ if(directory == NULL)
+ return -ENOMEM;
+
+ directory->owner = THIS_MODULE;
+
+ /* Now create all the nodes... */
+ entry = srm_entries;
+ while(entry->name != NULL && entry->id != 0) {
+ entry->proc_entry = create_proc_entry(entry->name, 0644,
+ directory);
+ if(entry->proc_entry == NULL)
+ goto cleanup;
+ entry->proc_entry->data = entry;
+ entry->proc_entry->read_proc = srm_env_read;
+ entry->proc_entry->write_proc = srm_env_write;
+ entry->proc_entry->owner = THIS_MODULE;
+ entry++;
+ }
+
+ printk(KERN_INFO "%s: version %s loaded successfully\n", NAME,
+ VERSION);
+ return 0;
+
+cleanup:
+ srm_env_cleanup();
+ return -ENOMEM;
+}
+
+
+static void __exit srm_env_exit(void)
+{
+ srm_env_cleanup();
+ printk(KERN_INFO "%s: unloaded successfully\n", NAME);
+ return;
+}
+
+module_init(srm_env_init);
+module_exit(srm_env_exit);
+
diff -Nur linux-2.4.6-pre1/include/asm-alpha/console.h linux-2.4.6-pre1-srm/include/asm-alpha/console.h
--- linux-2.4.6-pre1/include/asm-alpha/console.h Tue Jun 20 02:59:33 2000
+++ linux-2.4.6-pre1-srm/include/asm-alpha/console.h Tue Jun 5 12:15:29 2001
@@ -22,8 +22,8 @@
#define CCB_GET_ENV 0x22
#define CCB_SAVE_ENV 0x23

-#define CCB_PSWITCH 0x30
-#define CCB_BIOS_EMUL 0x32
+#define CCB_PSWITCH 0x30
+#define CCB_BIOS_EMUL 0x32

/*
* Environment variable numbers
@@ -51,6 +51,8 @@
extern long callback_close(long unit);
extern long callback_read(long channel, long count, const char *buf, long lbn);
extern long callback_getenv(long id, const char *buf, unsigned long buf_size);
+extern long callback_setenv(long id, const char *buf, unsigned long buf_size);
+extern long callback_save_env(void);

extern int srm_fixup(unsigned long new_callback_addr,
unsigned long new_hwrpb_addr);[unhandled content-type:application/pgp-signature]
\
 
 \ /
  Last update: 2005-03-22 12:55    [W:0.031 / U:3.584 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site