]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[settings] Expose build architecture and platform via settings
authorMichael Brown <mcb30@ipxe.org>
Sat, 6 Apr 2013 10:27:27 +0000 (11:27 +0100)
committerMichael Brown <mcb30@ipxe.org>
Sat, 6 Apr 2013 10:33:34 +0000 (11:33 +0100)
Expose the build architecture (e.g. "i386" or "x86_64") via
${buildarch} and the firmware platform (e.g. "pcbios" or "efi") via
${platform}.  These settings directly expose the ARCH and PLATFORM
variables from the Makefile.

Note that the build architecture reflects the architecture for which
iPXE was compiled, not the architecture on which iPXE is currently
running.  The "cpuid" command can be used to detect a 64-bit system at
runtime.

Requested-by: James A. Peltier <jpeltier@sfu.ca>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/settings.c

index 656ae19fe642b55914f9a80888d9c65fc7f1ea2b..43715fbd307badcb94d5032abb1b9ae8cf5ca1cd 100644 (file)
@@ -1985,6 +1985,19 @@ struct setting priority_setting __setting ( SETTING_MISC ) = {
  ******************************************************************************
  */
 
+/** A built-in setting operation */
+struct builtin_setting_operation {
+       /** Setting */
+       struct setting *setting;
+       /** Fetch setting value
+        *
+        * @v data              Buffer to fill with setting data
+        * @v len               Length of buffer
+        * @ret len             Length of setting data, or negative error
+        */
+       int ( * fetch ) ( void *data, size_t len );
+};
+
 /** Built-in setting tag magic */
 #define BUILTIN_SETTING_TAG_MAGIC 0xb1
 
@@ -2010,15 +2023,11 @@ struct setting errno_setting __setting ( SETTING_MISC ) = {
 /**
  * Fetch error number setting
  *
- * @v settings         Settings block
- * @v setting          Setting to fetch
- * @v data             Setting data, or NULL to clear setting
- * @v len              Length of setting data
- * @ret rc             Return status code
+ * @v data             Buffer to fill with setting data
+ * @v len              Length of buffer
+ * @ret len            Length of setting data, or negative error
  */
-static int errno_fetch ( struct settings *settings __unused,
-                        struct setting *setting __unused,
-                        void *data, size_t len ) {
+static int errno_fetch ( void *data, size_t len ) {
        uint32_t content;
 
        /* Return current error */
@@ -2029,24 +2038,85 @@ static int errno_fetch ( struct settings *settings __unused,
        return sizeof ( content );
 }
 
+/** "buildarch" setting tag */
+#define BUILTIN_SETTING_TAG_BUILDARCH BUILTIN_SETTING_TAG ( 0x02 )
+
+/** Build architecture setting */
+struct setting buildarch_setting __setting ( SETTING_MISC ) = {
+       .name = "buildarch",
+       .description = "Build architecture",
+       .tag = BUILTIN_SETTING_TAG_BUILDARCH,
+       .type = &setting_type_string,
+};
+
+/**
+ * Fetch build architecture setting
+ *
+ * @v data             Buffer to fill with setting data
+ * @v len              Length of buffer
+ * @ret len            Length of setting data, or negative error
+ */
+static int buildarch_fetch ( void *data, size_t len ) {
+       static const char buildarch[] = _S2 ( ARCH );
+
+       strncpy ( data, buildarch, len );
+       return ( sizeof ( buildarch ) - 1 /* NUL */ );
+}
+
+/** "platform" setting tag */
+#define BUILTIN_SETTING_TAG_PLATFORM BUILTIN_SETTING_TAG ( 0x03 )
+
+/** Platform setting */
+struct setting platform_setting __setting ( SETTING_MISC ) = {
+       .name = "platform",
+       .description = "Platform",
+       .tag = BUILTIN_SETTING_TAG_PLATFORM,
+       .type = &setting_type_string,
+};
+
+/**
+ * Fetch platform setting
+ *
+ * @v data             Buffer to fill with setting data
+ * @v len              Length of buffer
+ * @ret len            Length of setting data, or negative error
+ */
+static int platform_fetch ( void *data, size_t len ) {
+       static const char platform[] = _S2 ( PLATFORM );
+
+       strncpy ( data, platform, len );
+       return ( sizeof ( platform ) - 1 /* NUL */ );
+}
+
+/** List of built-in setting operations */
+static struct builtin_setting_operation builtin_setting_operations[] = {
+       { &errno_setting, errno_fetch },
+       { &buildarch_setting, buildarch_fetch },
+       { &platform_setting, platform_fetch },
+};
+
 /**
  * Fetch built-in setting
  *
  * @v settings         Settings block
  * @v setting          Setting to fetch
- * @v data             Setting data, or NULL to clear setting
- * @v len              Length of setting data
- * @ret rc             Return status code
+ * @v data             Buffer to fill with setting data
+ * @v len              Length of buffer
+ * @ret len            Length of setting data, or negative error
  */
 static int builtin_fetch ( struct settings *settings __unused,
                           struct setting *setting,
                           void *data, size_t len ) {
+       struct builtin_setting_operation *builtin;
+       unsigned int i;
 
-       if ( setting_cmp ( setting, &errno_setting ) == 0 ) {
-               return errno_fetch ( settings, setting, data, len );
-       } else {
-               return -ENOENT;
+       for ( i = 0 ; i < ( sizeof ( builtin_setting_operations ) /
+                           sizeof ( builtin_setting_operations[0] ) ) ; i++ ) {
+               builtin = &builtin_setting_operations[i];
+               if ( setting_cmp ( setting, builtin->setting ) == 0 )
+                       return builtin->fetch ( data, len );
        }
+       return -ENOENT;
 }
 
 /**