[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>
This commit is contained in:
parent
1a16f67a28
commit
2a187f480e
|
@ -69,6 +69,12 @@ struct asn1_cursor private_key = {
|
||||||
.len = ( ( size_t ) private_key_len ),
|
.len = ( ( size_t ) private_key_len ),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Default private key */
|
||||||
|
static struct asn1_cursor default_private_key = {
|
||||||
|
.data = private_key_data,
|
||||||
|
.len = ( ( size_t ) private_key_len ),
|
||||||
|
};
|
||||||
|
|
||||||
/** Private key setting */
|
/** Private key setting */
|
||||||
static struct setting privkey_setting __setting ( SETTING_CRYPTO, privkey ) = {
|
static struct setting privkey_setting __setting ( SETTING_CRYPTO, privkey ) = {
|
||||||
.name = "privkey",
|
.name = "privkey",
|
||||||
|
@ -92,8 +98,8 @@ static int privkey_apply_settings ( void ) {
|
||||||
if ( ALLOW_KEY_OVERRIDE ) {
|
if ( ALLOW_KEY_OVERRIDE ) {
|
||||||
|
|
||||||
/* Restore default private key */
|
/* Restore default private key */
|
||||||
private_key.data = private_key_data;
|
memcpy ( &private_key, &default_private_key,
|
||||||
private_key.len = ( ( size_t ) private_key_len );
|
sizeof ( private_key ) );
|
||||||
|
|
||||||
/* Fetch new private key, if any */
|
/* Fetch new private key, if any */
|
||||||
free ( key_data );
|
free ( key_data );
|
||||||
|
|
Reference in New Issue