Browse Source

[settings] Expose build architecture and platform via settings

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>
tags/v1.20.1
Michael Brown 11 years ago
parent
commit
0e2ba15a58
1 changed files with 85 additions and 15 deletions
  1. 85
    15
      src/core/settings.c

+ 85
- 15
src/core/settings.c View File

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
 /** Built-in setting tag magic */
2001
 /** Built-in setting tag magic */
1989
 #define BUILTIN_SETTING_TAG_MAGIC 0xb1
2002
 #define BUILTIN_SETTING_TAG_MAGIC 0xb1
1990
 
2003
 
2010
 /**
2023
 /**
2011
  * Fetch error number setting
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
 	uint32_t content;
2031
 	uint32_t content;
2023
 
2032
 
2024
 	/* Return current error */
2033
 	/* Return current error */
2029
 	return sizeof ( content );
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
  * Fetch built-in setting
2099
  * Fetch built-in setting
2034
  *
2100
  *
2035
  * @v settings		Settings block
2101
  * @v settings		Settings block
2036
  * @v setting		Setting to fetch
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
 static int builtin_fetch ( struct settings *settings __unused,
2107
 static int builtin_fetch ( struct settings *settings __unused,
2042
 			   struct setting *setting,
2108
 			   struct setting *setting,
2043
 			   void *data, size_t len ) {
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
 /**

Loading…
Cancel
Save