|  | @@ -1985,6 +1985,19 @@ struct setting priority_setting __setting ( SETTING_MISC ) = {
 | 
		
	
		
			
			| 1985 | 1985 |   ******************************************************************************
 | 
		
	
		
			
			| 1986 | 1986 |   */
 | 
		
	
		
			
			| 1987 | 1987 |  
 | 
		
	
		
			
			|  | 1988 | +/** A built-in setting operation */
 | 
		
	
		
			
			|  | 1989 | +struct builtin_setting_operation {
 | 
		
	
		
			
			|  | 1990 | +	/** Setting */
 | 
		
	
		
			
			|  | 1991 | +	struct setting *setting;
 | 
		
	
		
			
			|  | 1992 | +	/** Fetch setting value
 | 
		
	
		
			
			|  | 1993 | +	 *
 | 
		
	
		
			
			|  | 1994 | +	 * @v data		Buffer to fill with setting data
 | 
		
	
		
			
			|  | 1995 | +	 * @v len		Length of buffer
 | 
		
	
		
			
			|  | 1996 | +	 * @ret len		Length of setting data, or negative error
 | 
		
	
		
			
			|  | 1997 | +	 */
 | 
		
	
		
			
			|  | 1998 | +	int ( * fetch ) ( void *data, size_t len );
 | 
		
	
		
			
			|  | 1999 | +};
 | 
		
	
		
			
			|  | 2000 | +
 | 
		
	
		
			
			| 1988 | 2001 |  /** Built-in setting tag magic */
 | 
		
	
		
			
			| 1989 | 2002 |  #define BUILTIN_SETTING_TAG_MAGIC 0xb1
 | 
		
	
		
			
			| 1990 | 2003 |  
 | 
		
	
	
		
			
			|  | @@ -2010,15 +2023,11 @@ struct setting errno_setting __setting ( SETTING_MISC ) = {
 | 
		
	
		
			
			| 2010 | 2023 |  /**
 | 
		
	
		
			
			| 2011 | 2024 |   * Fetch error number setting
 | 
		
	
		
			
			| 2012 | 2025 |   *
 | 
		
	
		
			
			| 2013 |  | - * @v settings		Settings block
 | 
		
	
		
			
			| 2014 |  | - * @v setting		Setting to fetch
 | 
		
	
		
			
			| 2015 |  | - * @v data		Setting data, or NULL to clear setting
 | 
		
	
		
			
			| 2016 |  | - * @v len		Length of setting data
 | 
		
	
		
			
			| 2017 |  | - * @ret rc		Return status code
 | 
		
	
		
			
			|  | 2026 | + * @v data		Buffer to fill with setting data
 | 
		
	
		
			
			|  | 2027 | + * @v len		Length of buffer
 | 
		
	
		
			
			|  | 2028 | + * @ret len		Length of setting data, or negative error
 | 
		
	
		
			
			| 2018 | 2029 |   */
 | 
		
	
		
			
			| 2019 |  | -static int errno_fetch ( struct settings *settings __unused,
 | 
		
	
		
			
			| 2020 |  | -			 struct setting *setting __unused,
 | 
		
	
		
			
			| 2021 |  | -			 void *data, size_t len ) {
 | 
		
	
		
			
			|  | 2030 | +static int errno_fetch ( void *data, size_t len ) {
 | 
		
	
		
			
			| 2022 | 2031 |  	uint32_t content;
 | 
		
	
		
			
			| 2023 | 2032 |  
 | 
		
	
		
			
			| 2024 | 2033 |  	/* Return current error */
 | 
		
	
	
		
			
			|  | @@ -2029,24 +2038,85 @@ static int errno_fetch ( struct settings *settings __unused,
 | 
		
	
		
			
			| 2029 | 2038 |  	return sizeof ( content );
 | 
		
	
		
			
			| 2030 | 2039 |  }
 | 
		
	
		
			
			| 2031 | 2040 |  
 | 
		
	
		
			
			|  | 2041 | +/** "buildarch" setting tag */
 | 
		
	
		
			
			|  | 2042 | +#define BUILTIN_SETTING_TAG_BUILDARCH BUILTIN_SETTING_TAG ( 0x02 )
 | 
		
	
		
			
			|  | 2043 | +
 | 
		
	
		
			
			|  | 2044 | +/** Build architecture setting */
 | 
		
	
		
			
			|  | 2045 | +struct setting buildarch_setting __setting ( SETTING_MISC ) = {
 | 
		
	
		
			
			|  | 2046 | +	.name = "buildarch",
 | 
		
	
		
			
			|  | 2047 | +	.description = "Build architecture",
 | 
		
	
		
			
			|  | 2048 | +	.tag = BUILTIN_SETTING_TAG_BUILDARCH,
 | 
		
	
		
			
			|  | 2049 | +	.type = &setting_type_string,
 | 
		
	
		
			
			|  | 2050 | +};
 | 
		
	
		
			
			|  | 2051 | +
 | 
		
	
		
			
			|  | 2052 | +/**
 | 
		
	
		
			
			|  | 2053 | + * Fetch build architecture setting
 | 
		
	
		
			
			|  | 2054 | + *
 | 
		
	
		
			
			|  | 2055 | + * @v data		Buffer to fill with setting data
 | 
		
	
		
			
			|  | 2056 | + * @v len		Length of buffer
 | 
		
	
		
			
			|  | 2057 | + * @ret len		Length of setting data, or negative error
 | 
		
	
		
			
			|  | 2058 | + */
 | 
		
	
		
			
			|  | 2059 | +static int buildarch_fetch ( void *data, size_t len ) {
 | 
		
	
		
			
			|  | 2060 | +	static const char buildarch[] = _S2 ( ARCH );
 | 
		
	
		
			
			|  | 2061 | +
 | 
		
	
		
			
			|  | 2062 | +	strncpy ( data, buildarch, len );
 | 
		
	
		
			
			|  | 2063 | +	return ( sizeof ( buildarch ) - 1 /* NUL */ );
 | 
		
	
		
			
			|  | 2064 | +}
 | 
		
	
		
			
			|  | 2065 | +
 | 
		
	
		
			
			|  | 2066 | +/** "platform" setting tag */
 | 
		
	
		
			
			|  | 2067 | +#define BUILTIN_SETTING_TAG_PLATFORM BUILTIN_SETTING_TAG ( 0x03 )
 | 
		
	
		
			
			|  | 2068 | +
 | 
		
	
		
			
			|  | 2069 | +/** Platform setting */
 | 
		
	
		
			
			|  | 2070 | +struct setting platform_setting __setting ( SETTING_MISC ) = {
 | 
		
	
		
			
			|  | 2071 | +	.name = "platform",
 | 
		
	
		
			
			|  | 2072 | +	.description = "Platform",
 | 
		
	
		
			
			|  | 2073 | +	.tag = BUILTIN_SETTING_TAG_PLATFORM,
 | 
		
	
		
			
			|  | 2074 | +	.type = &setting_type_string,
 | 
		
	
		
			
			|  | 2075 | +};
 | 
		
	
		
			
			|  | 2076 | +
 | 
		
	
		
			
			|  | 2077 | +/**
 | 
		
	
		
			
			|  | 2078 | + * Fetch platform setting
 | 
		
	
		
			
			|  | 2079 | + *
 | 
		
	
		
			
			|  | 2080 | + * @v data		Buffer to fill with setting data
 | 
		
	
		
			
			|  | 2081 | + * @v len		Length of buffer
 | 
		
	
		
			
			|  | 2082 | + * @ret len		Length of setting data, or negative error
 | 
		
	
		
			
			|  | 2083 | + */
 | 
		
	
		
			
			|  | 2084 | +static int platform_fetch ( void *data, size_t len ) {
 | 
		
	
		
			
			|  | 2085 | +	static const char platform[] = _S2 ( PLATFORM );
 | 
		
	
		
			
			|  | 2086 | +
 | 
		
	
		
			
			|  | 2087 | +	strncpy ( data, platform, len );
 | 
		
	
		
			
			|  | 2088 | +	return ( sizeof ( platform ) - 1 /* NUL */ );
 | 
		
	
		
			
			|  | 2089 | +}
 | 
		
	
		
			
			|  | 2090 | +
 | 
		
	
		
			
			|  | 2091 | +/** List of built-in setting operations */
 | 
		
	
		
			
			|  | 2092 | +static struct builtin_setting_operation builtin_setting_operations[] = {
 | 
		
	
		
			
			|  | 2093 | +	{ &errno_setting, errno_fetch },
 | 
		
	
		
			
			|  | 2094 | +	{ &buildarch_setting, buildarch_fetch },
 | 
		
	
		
			
			|  | 2095 | +	{ &platform_setting, platform_fetch },
 | 
		
	
		
			
			|  | 2096 | +};
 | 
		
	
		
			
			|  | 2097 | +
 | 
		
	
		
			
			| 2032 | 2098 |  /**
 | 
		
	
		
			
			| 2033 | 2099 |   * Fetch built-in setting
 | 
		
	
		
			
			| 2034 | 2100 |   *
 | 
		
	
		
			
			| 2035 | 2101 |   * @v settings		Settings block
 | 
		
	
		
			
			| 2036 | 2102 |   * @v setting		Setting to fetch
 | 
		
	
		
			
			| 2037 |  | - * @v data		Setting data, or NULL to clear setting
 | 
		
	
		
			
			| 2038 |  | - * @v len		Length of setting data
 | 
		
	
		
			
			| 2039 |  | - * @ret rc		Return status code
 | 
		
	
		
			
			|  | 2103 | + * @v data		Buffer to fill with setting data
 | 
		
	
		
			
			|  | 2104 | + * @v len		Length of buffer
 | 
		
	
		
			
			|  | 2105 | + * @ret len		Length of setting data, or negative error
 | 
		
	
		
			
			| 2040 | 2106 |   */
 | 
		
	
		
			
			| 2041 | 2107 |  static int builtin_fetch ( struct settings *settings __unused,
 | 
		
	
		
			
			| 2042 | 2108 |  			   struct setting *setting,
 | 
		
	
		
			
			| 2043 | 2109 |  			   void *data, size_t len ) {
 | 
		
	
		
			
			|  | 2110 | +	struct builtin_setting_operation *builtin;
 | 
		
	
		
			
			|  | 2111 | +	unsigned int i;
 | 
		
	
		
			
			| 2044 | 2112 |  
 | 
		
	
		
			
			| 2045 |  | -	if ( setting_cmp ( setting, &errno_setting ) == 0 ) {
 | 
		
	
		
			
			| 2046 |  | -		return errno_fetch ( settings, setting, data, len );
 | 
		
	
		
			
			| 2047 |  | -	} else {
 | 
		
	
		
			
			| 2048 |  | -		return -ENOENT;
 | 
		
	
		
			
			|  | 2113 | +	for ( i = 0 ; i < ( sizeof ( builtin_setting_operations ) /
 | 
		
	
		
			
			|  | 2114 | +			    sizeof ( builtin_setting_operations[0] ) ) ; i++ ) {
 | 
		
	
		
			
			|  | 2115 | +		builtin = &builtin_setting_operations[i];
 | 
		
	
		
			
			|  | 2116 | +		if ( setting_cmp ( setting, builtin->setting ) == 0 )
 | 
		
	
		
			
			|  | 2117 | +			return builtin->fetch ( data, len );
 | 
		
	
		
			
			| 2049 | 2118 |  	}
 | 
		
	
		
			
			|  | 2119 | +	return -ENOENT;
 | 
		
	
		
			
			| 2050 | 2120 |  }
 | 
		
	
		
			
			| 2051 | 2121 |  
 | 
		
	
		
			
			| 2052 | 2122 |  /**
 |