]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[settings] Make built-in settings a linker table
authorMichael Brown <mcb30@ipxe.org>
Tue, 27 Aug 2013 12:46:12 +0000 (13:46 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 27 Aug 2013 12:46:12 +0000 (13:46 +0100)
Allow for configurable provision of built-in settings by placing them
in a linker table rather than an array.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/settings.c
src/include/ipxe/settings.h

index 87de0d1b1b1dc089850e06d2c20dbcf0212a0c0b..0fe8b2ebf496a7b85cc2fbba81e8194b2beaf350 100644 (file)
@@ -2247,29 +2247,8 @@ 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 scope */
-static struct settings_scope builtin_scope;
-
-/** Error number setting */
-struct setting errno_setting __setting ( SETTING_MISC ) = {
-       .name = "errno",
-       .description = "Last error",
-       .type = &setting_type_uint32,
-       .scope = &builtin_scope,
-};
+struct settings_scope builtin_scope;
 
 /**
  * Fetch error number setting
@@ -2289,14 +2268,20 @@ static int errno_fetch ( void *data, size_t len ) {
        return sizeof ( content );
 }
 
-/** Build architecture setting */
-struct setting buildarch_setting __setting ( SETTING_MISC ) = {
-       .name = "buildarch",
-       .description = "Build architecture",
-       .type = &setting_type_string,
+/** Error number setting */
+struct setting errno_setting __setting ( SETTING_MISC ) = {
+       .name = "errno",
+       .description = "Last error",
+       .type = &setting_type_uint32,
        .scope = &builtin_scope,
 };
 
+/** Error number built-in setting */
+struct builtin_setting errno_builtin_setting __builtin_setting = {
+       .setting = &errno_setting,
+       .fetch = errno_fetch,
+};
+
 /**
  * Fetch build architecture setting
  *
@@ -2311,14 +2296,20 @@ static int buildarch_fetch ( void *data, size_t len ) {
        return ( sizeof ( buildarch ) - 1 /* NUL */ );
 }
 
-/** Platform setting */
-struct setting platform_setting __setting ( SETTING_MISC ) = {
-       .name = "platform",
-       .description = "Platform",
+/** Build architecture setting */
+struct setting buildarch_setting __setting ( SETTING_MISC ) = {
+       .name = "buildarch",
+       .description = "Build architecture",
        .type = &setting_type_string,
        .scope = &builtin_scope,
 };
 
+/** Build architecture built-in setting */
+struct builtin_setting buildarch_builtin_setting __builtin_setting = {
+       .setting = &buildarch_setting,
+       .fetch = buildarch_fetch,
+};
+
 /**
  * Fetch platform setting
  *
@@ -2333,14 +2324,20 @@ static int platform_fetch ( void *data, size_t len ) {
        return ( sizeof ( platform ) - 1 /* NUL */ );
 }
 
-/** Version setting */
-struct setting version_setting __setting ( SETTING_MISC ) = {
-       .name = "version",
-       .description = "Version",
+/** Platform setting */
+struct setting platform_setting __setting ( SETTING_MISC ) = {
+       .name = "platform",
+       .description = "Platform",
        .type = &setting_type_string,
        .scope = &builtin_scope,
 };
 
+/** Platform built-in setting */
+struct builtin_setting platform_builtin_setting __builtin_setting = {
+       .setting = &platform_setting,
+       .fetch = platform_fetch,
+};
+
 /**
  * Fetch version setting
  *
@@ -2353,12 +2350,18 @@ static int version_fetch ( void *data, size_t len ) {
        return ( strlen ( product_version ) );
 }
 
-/** 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 },
-       { &version_setting, version_fetch },
+/** Version setting */
+struct setting version_setting __setting ( SETTING_MISC ) = {
+       .name = "version",
+       .description = "Version",
+       .type = &setting_type_string,
+       .scope = &builtin_scope,
+};
+
+/** Version built-in setting */
+struct builtin_setting version_builtin_setting __builtin_setting = {
+       .setting = &version_setting,
+       .fetch = version_fetch,
 };
 
 /**
@@ -2373,12 +2376,9 @@ static struct builtin_setting_operation builtin_setting_operations[] = {
 static int builtin_fetch ( struct settings *settings __unused,
                           struct setting *setting,
                           void *data, size_t len ) {
-       struct builtin_setting_operation *builtin;
-       unsigned int i;
+       struct builtin_setting *builtin;
 
-       for ( i = 0 ; i < ( sizeof ( builtin_setting_operations ) /
-                           sizeof ( builtin_setting_operations[0] ) ) ; i++ ) {
-               builtin = &builtin_setting_operations[i];
+       for_each_table_entry ( builtin, BUILTIN_SETTINGS ) {
                if ( setting_cmp ( setting, builtin->setting ) == 0 )
                        return builtin->fetch ( data, len );
        }
index d1666e1d90b2a3558d49c54007d014964cb3e00d..4f16107202ad1cbafabfb00f671a0ec8735f640a 100644 (file)
@@ -253,6 +253,28 @@ struct settings_applicator {
 /** Declare a settings applicator */
 #define __settings_applicator __table_entry ( SETTINGS_APPLICATORS, 01 )
 
+/** A built-in setting */
+struct builtin_setting {
+       /** 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 settings table */
+#define BUILTIN_SETTINGS __table ( struct builtin_setting, "builtin_settings" )
+
+/** Declare a built-in setting */
+#define __builtin_setting __table_entry ( BUILTIN_SETTINGS, 01 )
+
+/** Built-in setting scope */
+extern struct settings_scope builtin_scope;
+
 /**
  * A generic settings block
  *