david/ipxe
Archived
1
0

[settings] Make built-in settings a linker table

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>
This commit is contained in:
Michael Brown 2013-08-27 13:46:12 +01:00
parent 6d72b498c2
commit 3e975ecf3f
2 changed files with 68 additions and 46 deletions

View 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 */ /** Built-in setting scope */
static struct settings_scope builtin_scope; 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,
};
/** /**
* Fetch error number setting * Fetch error number setting
@ -2289,14 +2268,20 @@ static int errno_fetch ( void *data, size_t len ) {
return sizeof ( content ); return sizeof ( content );
} }
/** Build architecture setting */ /** Error number setting */
struct setting buildarch_setting __setting ( SETTING_MISC ) = { struct setting errno_setting __setting ( SETTING_MISC ) = {
.name = "buildarch", .name = "errno",
.description = "Build architecture", .description = "Last error",
.type = &setting_type_string, .type = &setting_type_uint32,
.scope = &builtin_scope, .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 * Fetch build architecture setting
* *
@ -2311,14 +2296,20 @@ static int buildarch_fetch ( void *data, size_t len ) {
return ( sizeof ( buildarch ) - 1 /* NUL */ ); return ( sizeof ( buildarch ) - 1 /* NUL */ );
} }
/** Platform setting */ /** Build architecture setting */
struct setting platform_setting __setting ( SETTING_MISC ) = { struct setting buildarch_setting __setting ( SETTING_MISC ) = {
.name = "platform", .name = "buildarch",
.description = "Platform", .description = "Build architecture",
.type = &setting_type_string, .type = &setting_type_string,
.scope = &builtin_scope, .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 * Fetch platform setting
* *
@ -2333,14 +2324,20 @@ static int platform_fetch ( void *data, size_t len ) {
return ( sizeof ( platform ) - 1 /* NUL */ ); return ( sizeof ( platform ) - 1 /* NUL */ );
} }
/** Version setting */ /** Platform setting */
struct setting version_setting __setting ( SETTING_MISC ) = { struct setting platform_setting __setting ( SETTING_MISC ) = {
.name = "version", .name = "platform",
.description = "Version", .description = "Platform",
.type = &setting_type_string, .type = &setting_type_string,
.scope = &builtin_scope, .scope = &builtin_scope,
}; };
/** Platform built-in setting */
struct builtin_setting platform_builtin_setting __builtin_setting = {
.setting = &platform_setting,
.fetch = platform_fetch,
};
/** /**
* Fetch version setting * Fetch version setting
* *
@ -2353,12 +2350,18 @@ static int version_fetch ( void *data, size_t len ) {
return ( strlen ( product_version ) ); return ( strlen ( product_version ) );
} }
/** List of built-in setting operations */ /** Version setting */
static struct builtin_setting_operation builtin_setting_operations[] = { struct setting version_setting __setting ( SETTING_MISC ) = {
{ &errno_setting, errno_fetch }, .name = "version",
{ &buildarch_setting, buildarch_fetch }, .description = "Version",
{ &platform_setting, platform_fetch }, .type = &setting_type_string,
{ &version_setting, version_fetch }, .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, static int builtin_fetch ( struct settings *settings __unused,
struct setting *setting, struct setting *setting,
void *data, size_t len ) { void *data, size_t len ) {
struct builtin_setting_operation *builtin; struct builtin_setting *builtin;
unsigned int i;
for ( i = 0 ; i < ( sizeof ( builtin_setting_operations ) / for_each_table_entry ( builtin, BUILTIN_SETTINGS ) {
sizeof ( builtin_setting_operations[0] ) ) ; i++ ) {
builtin = &builtin_setting_operations[i];
if ( setting_cmp ( setting, builtin->setting ) == 0 ) if ( setting_cmp ( setting, builtin->setting ) == 0 )
return builtin->fetch ( data, len ); return builtin->fetch ( data, len );
} }

View File

@ -253,6 +253,28 @@ struct settings_applicator {
/** Declare a settings applicator */ /** Declare a settings applicator */
#define __settings_applicator __table_entry ( SETTINGS_APPLICATORS, 01 ) #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 * A generic settings block
* *