Browse Source

[arm] Avoid instruction references to symbols defined via ".equ"

When building for 64-bit ARM, some symbol references may be resolved
via an "adrp" instruction (to obtain the start of the 4kB page
containing the symbol) and a separate 12-bit offset.  For example
(taken from the GNU assembler documentation):

  adrp x0, foo
  ldr  x0, [x0, #:lo12:foo]

We occasionally refer to symbols defined via mechanisms that are not
directly visible to gcc.  For example:

  extern char some_magic_symbol[];
  __asm__ ( ".equ some_magic_symbol, some_magic_expression" );

The subsequent use of the ":lo12:" prefix on such magically-defined
symbols triggers an assertion failure in the assembler.

This problem seems to affect only "private_key_len" in the current
codebase.  Fix by storing this value as static data; this avoids the
need to provide the value as a literal within the instruction stream,
and so avoids the problematic use of the ":lo12:" prefix.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 8 years ago
parent
commit
2a187f480e
1 changed files with 8 additions and 2 deletions
  1. 8
    2
      src/crypto/privkey.c

+ 8
- 2
src/crypto/privkey.c View File

69
 	.len = ( ( size_t ) private_key_len ),
69
 	.len = ( ( size_t ) private_key_len ),
70
 };
70
 };
71
 
71
 
72
+/** Default private key */
73
+static struct asn1_cursor default_private_key = {
74
+	.data = private_key_data,
75
+	.len = ( ( size_t ) private_key_len ),
76
+};
77
+
72
 /** Private key setting */
78
 /** Private key setting */
73
 static struct setting privkey_setting __setting ( SETTING_CRYPTO, privkey ) = {
79
 static struct setting privkey_setting __setting ( SETTING_CRYPTO, privkey ) = {
74
 	.name = "privkey",
80
 	.name = "privkey",
92
 	if ( ALLOW_KEY_OVERRIDE ) {
98
 	if ( ALLOW_KEY_OVERRIDE ) {
93
 
99
 
94
 		/* Restore default private key */
100
 		/* Restore default private key */
95
-		private_key.data = private_key_data;
96
-		private_key.len = ( ( size_t ) private_key_len );
101
+		memcpy ( &private_key, &default_private_key,
102
+			 sizeof ( private_key ) );
97
 
103
 
98
 		/* Fetch new private key, if any */
104
 		/* Fetch new private key, if any */
99
 		free ( key_data );
105
 		free ( key_data );

Loading…
Cancel
Save