[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-ia64
Subject:    [Linux-ia64] [PATCH] /proc/efi moves to /proc/efi/vars
From:       Matt Domsch <Matt_Domsch () Dell ! com>
Date:       2001-04-20 17:02:46
[Download RAW message or body]

Below please find a patch, against 2.4.3 + ia64-010405 which moves the
EFI variables from /proc/efi to /proc/efi/vars.  This allows other
modules to create files in /proc/efi and not clash with the
variables.  Also, CONFIG_IA64_EFIVARS has changed to CONFIG_EFI_VARS,
consistent with CONFIG_EFI_PARTITION.
I've tested this against 2.4.3 and it works.  David, please include
this in your next IA-64 patch.

Thanks,
Matt

-- 
Matt Domsch
Sr. Software Engineer
Dell Linux Systems Group
Linux OS Development
www.dell.com/linux



diff -burN linux/Documentation/Configure.help linux.efivars/Documentation/Configure.help
--- linux/Documentation/Configure.help	Fri Apr 20 11:49:06 2001
+++ linux.efivars/Documentation/Configure.help	Thu Apr 19 16:33:38 2001
@@ -17342,12 +17342,11 @@
   To use this option, you have to check that the "/proc file system
   support" (CONFIG_PROC_FS) is enabled, too.

-/proc/efi support
-CONFIG_IA64_EFIVARS
+/proc/efi/vars support
+CONFIG_EFI_VARS
   If you say Y here, you are able to get EFI (Extensible Firmware
-  Interface) variable information in /proc/pal.  This can be used to
-  change the boot order in the EFI Boot Manager.
-
+  Interface) variable information in /proc/efi/vars.  You may read,
+  write, create, and destroy EFI variables through this interface.

   To use this option, you have to check that the "/proc file system
   support" (CONFIG_PROC_FS) is enabled, too.
diff -burN linux/arch/ia64/config.in linux.efivars/arch/ia64/config.in
--- linux/arch/ia64/config.in	Fri Apr 20 11:49:06 2001
+++ linux.efivars/arch/ia64/config.in	Thu Apr 19 16:33:38 2001
@@ -110,7 +110,7 @@
 bool 'SMP support' CONFIG_SMP
 bool 'Performance monitor support' CONFIG_PERFMON
 tristate '/proc/pal support' CONFIG_IA64_PALINFO
-tristate '/proc/efi support' CONFIG_IA64_EFIVARS
+tristate '/proc/efi/vars support' CONFIG_EFI_VARS

 bool 'Networking support' CONFIG_NET
 bool 'System V IPC' CONFIG_SYSVIPC
diff -burN linux/arch/ia64/kernel/Makefile linux.efivars/arch/ia64/kernel/Makefile
--- linux/arch/ia64/kernel/Makefile	Fri Apr 20 11:49:06 2001
+++ linux.efivars/arch/ia64/kernel/Makefile	Thu Apr 19 16:33:38 2001
@@ -19,7 +19,7 @@
 obj-$(CONFIG_IA64_GENERIC) += machvec.o iosapic.o
 obj-$(CONFIG_IA64_DIG) += iosapic.o
 obj-$(CONFIG_IA64_PALINFO) += palinfo.o
-obj-$(CONFIG_IA64_EFIVARS) += efivars.o
+obj-$(CONFIG_EFI_VARS) += efivars.o
 obj-$(CONFIG_PCI) += pci.o
 obj-$(CONFIG_SMP) += smp.o smpboot.o
 obj-$(CONFIG_IA64_MCA) += mca.o mca_asm.o
diff -burN linux/arch/ia64/kernel/efi.c linux.efivars/arch/ia64/kernel/efi.c
--- linux/arch/ia64/kernel/efi.c	Fri Apr 20 11:49:06 2001
+++ linux.efivars/arch/ia64/kernel/efi.c	Fri Apr 20 11:35:07 2001
@@ -23,6 +23,7 @@
 #include <linux/init.h>
 #include <linux/types.h>
 #include <linux/time.h>
+#include <linux/proc_fs.h>

 #include <asm/efi.h>
 #include <asm/io.h>
@@ -37,6 +38,17 @@
 struct efi efi;
 static efi_runtime_services_t *runtime;

+/*
+ * efi_dir is allocated here, but the directory isn't created
+ * here, as proc_mkdir() doesn't work this early in the bootup
+ * process.  Therefore, each module, like efivars, must test for
+ *    if (!efi_dir)  efi_dir = proc_mkdir("efi", NULL);
+ * prior to creating their own entries under /proc/efi.
+ */
+#ifdef CONFIG_PROC_FS
+struct proc_dir_entry *efi_dir = NULL;
+#endif
+
 static unsigned long mem_limit = ~0UL;

 static efi_status_t
@@ -441,4 +454,10 @@
 	efi.set_variable = __va(runtime->set_variable);
 	efi.get_next_high_mono_count = __va(runtime->get_next_high_mono_count);
 	efi.reset_system = __va(runtime->reset_system);
+}
+
+static void __exit
+efivars_exit(void)
+{
+ 	remove_proc_entry(efi_dir->name, NULL);
 }
diff -burN linux/arch/ia64/kernel/efivars.c linux.efivars/arch/ia64/kernel/efivars.c
--- linux/arch/ia64/kernel/efivars.c	Fri Apr 20 11:49:06 2001
+++ linux.efivars/arch/ia64/kernel/efivars.c	Fri Apr 20 11:33:58 2001
@@ -6,8 +6,8 @@
  * This code takes all variables accessible from EFI runtime and
  *  exports them via /proc
  *
- * Reads to /proc/efi/varname return an efi_variable_t structure.
- * Writes to /proc/efi/varname must be an efi_variable_t structure.
+ * Reads to /proc/efi/vars/varname return an efi_variable_t structure.
+ * Writes to /proc/efi/vars/varname must be an efi_variable_t structure.
  * Writes with DataSize = 0 or Attributes = 0 deletes the variable.
  * Writes with a new value in VariableName+VendorGuid creates
  * a new variable.
@@ -29,6 +29,15 @@
  *
  * Changelog:
  *
+ *  20 April 2001 - Matt Domsch <Matt_Domsch@dell.com>
+ *   Moved vars from /proc/efi to /proc/efi/vars, and made
+ *   efi.c own the /proc/efi directory.
+ *   v0.03 release to linux-ia64@linuxia64.org
+ *
+ *  26 March 2001 - Matt Domsch <Matt_Domsch@dell.com>
+ *   At the request of Stephane, moved ownership of /proc/efi
+ *   to efi.c, and now efivars lives under /proc/efi/vars.
+ *
  *  12 March 2001 - Matt Domsch <Matt_Domsch@dell.com>
  *   Feedback received from Stephane Eranian incorporated.
  *   efivar_write() checks copy_from_user() return value.
@@ -57,7 +66,7 @@
 MODULE_AUTHOR("Matt Domsch <Matt_Domsch@Dell.com>");
 MODULE_DESCRIPTION("/proc interface to EFI Variables");

-#define EFIVARS_VERSION "0.02 2001-Mar-12"
+#define EFIVARS_VERSION "0.03 2001-Apr-20"

 static int
 efivar_read(char *page, char **start, off_t off,
@@ -92,7 +101,7 @@

 spinlock_t efivars_lock = SPIN_LOCK_UNLOCKED;
 static LIST_HEAD(efivar_list);
-static struct proc_dir_entry *efi_dir = NULL;
+static struct proc_dir_entry *efi_vars_dir = NULL;

 #define efivar_entry(n) list_entry(n, efivar_entry_t, list)

@@ -188,7 +197,7 @@


 	/* Create the entry in proc */
-	new_efivar->entry = create_proc_entry(short_name, 0600, efi_dir);
+	new_efivar->entry = create_proc_entry(short_name, 0600, efi_vars_dir);
 	kfree(short_name); short_name = NULL;
 	if (!new_efivar->entry) return 1;

@@ -286,7 +295,7 @@
 	/* Since the data ptr we've currently got is probably for
 	   a different variable find the right variable.
 	   This allows any properly formatted data structure to
-	   be written to any of the files in /proc/efi and it will work.
+	   be written to any of the files in /proc/efi/vars and it will work.
 	*/
 	list_for_each(pos, &efivar_list) {
 		search_efivar = efivar_entry(pos);
@@ -320,7 +329,7 @@

 	if (!var_data->DataSize || !var_data->Attributes) {
 		/* We just deleted the NVRAM variable */
-		remove_proc_entry(efivar->entry->name, efi_dir);
+		remove_proc_entry(efivar->entry->name, efi_vars_dir);
 		list_del(&efivar->list);
 		kfree(efivar);
 	}
@@ -354,12 +364,22 @@

 	printk(KERN_INFO "EFI Variables Facility v%s\n", EFIVARS_VERSION);

+        /* Since efi.c happens before procfs is available,
+           we create the directory here if it doesn't
+           already exist.  There's probably a better way
+           to do this.
+        */
+        if (!efi_dir)
+                efi_dir = proc_mkdir("efi", NULL);
+
+	efi_vars_dir = proc_mkdir("vars", efi_dir);
+
+
+
 	/* Per EFI spec, the maximum storage allocated for both
 	   the variable name and variable data is 1024 bytes.
 	*/

-	efi_dir = proc_mkdir("efi", NULL);
-
 	memset(variable_name, 0, 1024);

 	do {
@@ -401,11 +421,11 @@

 	list_for_each(pos, &efivar_list) {
 		efivar = efivar_entry(pos);
-		remove_proc_entry(efivar->entry->name, efi_dir);
+		remove_proc_entry(efivar->entry->name, efi_vars_dir);
 		list_del(&efivar->list);
 		kfree(efivar);
 	}
-	remove_proc_entry(efi_dir->name, NULL);
+	remove_proc_entry(efi_vars_dir->name, efi_dir);
 	spin_unlock(&efivars_lock);

 }
diff -burN linux/arch/ia64/kernel/ia64_ksyms.c linux.efivars/arch/ia64/kernel/ia64_ksyms.c
--- linux/arch/ia64/kernel/ia64_ksyms.c	Fri Apr 20 11:49:06 2001
+++ linux.efivars/arch/ia64/kernel/ia64_ksyms.c	Thu Apr 19 16:33:38 2001
@@ -137,3 +137,8 @@

 extern struct efi efi;
 EXPORT_SYMBOL(efi);
+
+#include <linux/proc_fs.h>
+extern struct proc_dir_entry *efi_dir;
+EXPORT_SYMBOL(efi_dir);
+
diff -burN linux/include/asm-ia64/efi.h linux.efivars/include/asm-ia64/efi.h
--- linux/include/asm-ia64/efi.h	Fri Apr 20 11:49:07 2001
+++ linux.efivars/include/asm-ia64/efi.h	Fri Apr 20 11:32:23 2001
@@ -15,6 +15,7 @@
 #include <linux/string.h>
 #include <linux/time.h>
 #include <linux/types.h>
+#include <linux/proc_fs.h>

 #include <asm/page.h>
 #include <asm/system.h>
@@ -245,5 +246,13 @@
 #define EFI_VARIABLE_NON_VOLATILE       0x0000000000000001
 #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002
 #define EFI_VARIABLE_RUNTIME_ACCESS     0x0000000000000004
+
+
+/*
+ * efi_dir is allocated in arch/ia64/kernel/efi.c.
+ */
+#ifdef CONFIG_PROC_FS
+extern struct proc_dir_entry *efi_dir;
+#endif

 #endif /* _ASM_IA64_EFI_H */




[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic