10#define __attribute__(x)
36#pragma GCC visibility push(hidden)
46#define _C1( x, y ) x ## y
48#define _C2( x, y ) _C1 ( x, y )
53#define _S2( x ) _S1 ( x )
57#define PROGBITS _C2 ( ASM_TCHAR, progbits )
58#define NOBITS _C2 ( ASM_TCHAR, nobits )
60#define PROGBITS_OPS _S2 ( ASM_TCHAR_OPS ) "progbits"
61#define PROGBITS _S2 ( ASM_TCHAR ) "progbits"
62#define NOBITS_OPS _S2 ( ASM_TCHAR_OPS ) "nobits"
63#define NOBITS _S2 ( ASM_TCHAR ) "nobits"
77#define PROVIDE_SYMBOL( symbol ) \
78 .section ".provided", "a", NOBITS ; \
84#define PROVIDE_SYMBOL( symbol ) \
86 __attribute__ (( section ( ".provided" ) ))
98#define REQUEST_SYMBOL( symbol ) \
99 .equ __request_ ## symbol, symbol
101#define REQUEST_SYMBOL( symbol ) \
102 __asm__ ( ".equ __request_" #symbol ", " #symbol )
118#define REQUIRE_SYMBOL( symbol ) \
119 .reloc __requiring_symbol__, RELOC_TYPE_NONE, symbol
121#define REQUIRE_SYMBOL( symbol ) \
122 __asm__ ( ".reloc __requiring_symbol__, " \
123 _S2 ( RELOC_TYPE_NONE ) ", " #symbol )
137#define REQUIRING_SYMBOL( symbol ) \
138 .equ __requiring_symbol__, symbol
140#define REQUIRING_SYMBOL( symbol ) \
141 __asm__ ( ".equ __requiring_symbol__, " #symbol )
152#define PROVIDE_REQUIRING_SYMBOL() \
153 .section ".tbl.requiring_symbols", "a", PROGBITS ; \
154 __requiring_symbol__: .byte 0 ; \
155 .size __requiring_symbol__, . - __requiring_symbol__ ; \
158#define PROVIDE_REQUIRING_SYMBOL() \
159 __asm__ ( ".section \".tbl.requiring_symbols\", " \
160 " \"a\", " PROGBITS "\n" \
161 "__requiring_symbol__:\t.byte 0\n" \
162 ".size __requiring_symbol__, " \
163 " . - __requiring_symbol__\n" \
175#define IPXE_NOTE( type ) \
176 __asm__ ( ".section \".note.ipxe\", \"\", " \
177 _S2 ( ASM_TCHAR ) "note\n\t" \
183 ".long " _S2 ( _C2 ( IPXE_NOTE_, type ) ) \
186 ".ascii \"iPXE\"\n\t" \
190#define IPXE_NOTE_DISKLOG 0x18aed109
199#define PREFIX_OBJECT( _prefix ) _C2 ( _prefix, OBJECT )
200#define OBJECT_SYMBOL PREFIX_OBJECT ( obj_ )
213#define REQUEST_OBJECT( object ) REQUEST_SYMBOL ( obj_ ## object )
227#define REQUIRE_OBJECT( object ) REQUIRE_SYMBOL ( obj_ ## object )
232#define ERRFILE PREFIX_OBJECT ( ERRFILE_ )
244#define __weak __attribute__ (( weak, noinline ))
299#define DBGLVL_DFLT DBGLVL_MAX
310 const
void *
data,
unsigned long len );
311extern
void dbg_md5_da (
unsigned long dispaddr,
312 const
void *
data,
unsigned long len );
317#define __debug_disable( object ) _C2 ( __debug_disable_, object )
319#define DBG_DISABLE_OBJECT( object, level ) do { \
320 extern char __debug_disable(object); \
321 __debug_disable(object) |= (level); \
323#define DBG_ENABLE_OBJECT( object, level ) do { \
324 extern char __debug_disable(object); \
325 __debug_disable(object) &= ~(level); \
328#define DBGLVL ( DBGLVL_MAX & ~__debug_disable(OBJECT) )
329#define DBG_DISABLE( level ) do { \
330 __debug_disable(OBJECT) |= ( (level) & DBGLVL_MAX ); \
332#define DBG_ENABLE( level ) do { \
333 __debug_disable(OBJECT) &= ~( (level) & DBGLVL_MAX ); \
337#define DBG_DISABLE( level ) do { } while ( 0 )
338#define DBG_ENABLE( level ) do { } while ( 0 )
342#define DBG_LOG ( DBGLVL & DBGLVL_LOG )
343#define DBGLVL_EXTRA 2
344#define DBG_EXTRA ( DBGLVL & DBGLVL_EXTRA )
345#define DBGLVL_PROFILE 4
346#define DBG_PROFILE ( DBGLVL & DBGLVL_PROFILE )
348#define DBG_IO ( DBGLVL & DBGLVL_IO )
356#define DBG_IF( level, ... ) do { \
357 if ( DBG_ ## level ) { \
358 dbg_printf ( __VA_ARGS__ ); \
370#define DBG_HDA_IF( level, dispaddr, data, len ) do { \
371 if ( DBG_ ## level ) { \
374 typeof ( dispaddr ) raw; \
378 dbg_hex_dump_da ( da.ul, data, len ); \
389#define DBG_HD_IF( level, data, len ) do { \
390 const void *_data = data; \
391 DBG_HDA_IF ( level, _data, _data, len ); \
402#define DBG_MD5A_IF( level, dispaddr, data, len ) do { \
403 if ( DBG_ ## level ) { \
406 typeof ( dispaddr ) raw; \
410 dbg_md5_da ( da.ul, data, len ); \
421#define DBG_MD5_IF( level, data, len ) do { \
422 const void *_data = data; \
423 DBG_MD5A_IF ( level, _data, _data, len ); \
431#define DBG_PAUSE_IF( level, ... ) do { \
432 if ( DBG_ ## level ) { \
442#define DBG_MORE_IF( level, ... ) do { \
443 if ( DBG_ ## level ) { \
454#define DBG_AC_IF( level, id ) do { \
455 if ( DBG_ ## level ) { \
461 dbg_stream.raw = id; \
462 dbg_autocolourise ( dbg_stream.ul ); \
471#define DBG_DC_IF( level ) do { \
472 if ( DBG_ ## level ) { \
479#define DBGC_IF( level, id, ... ) do { \
480 DBG_AC_IF ( level, id ); \
481 DBG_IF ( level, __VA_ARGS__ ); \
482 DBG_DC_IF ( level ); \
485#define DBGC_HDA_IF( level, id, ... ) do { \
486 DBG_AC_IF ( level, id ); \
487 DBG_HDA_IF ( level, __VA_ARGS__ ); \
488 DBG_DC_IF ( level ); \
491#define DBGC_HD_IF( level, id, ... ) do { \
492 DBG_AC_IF ( level, id ); \
493 DBG_HD_IF ( level, __VA_ARGS__ ); \
494 DBG_DC_IF ( level ); \
497#define DBGC_MD5A_IF( level, id, ... ) do { \
498 DBG_AC_IF ( level, id ); \
499 DBG_MD5A_IF ( level, __VA_ARGS__ ); \
500 DBG_DC_IF ( level ); \
503#define DBGC_MD5_IF( level, id, ... ) do { \
504 DBG_AC_IF ( level, id ); \
505 DBG_MD5_IF ( level, __VA_ARGS__ ); \
506 DBG_DC_IF ( level ); \
509#define DBGC_PAUSE_IF( level, id ) do { \
510 DBG_AC_IF ( level, id ); \
511 DBG_PAUSE_IF ( level ); \
512 DBG_DC_IF ( level ); \
515#define DBGC_MORE_IF( level, id ) do { \
516 DBG_AC_IF ( level, id ); \
517 DBG_MORE_IF ( level ); \
518 DBG_DC_IF ( level ); \
523#define DBG( ... ) DBG_IF ( LOG, ##__VA_ARGS__ )
524#define DBG_HDA( ... ) DBG_HDA_IF ( LOG, ##__VA_ARGS__ )
525#define DBG_HD( ... ) DBG_HD_IF ( LOG, ##__VA_ARGS__ )
526#define DBG_MD5A( ... ) DBG_MD5A_IF ( LOG, ##__VA_ARGS__ )
527#define DBG_MD5( ... ) DBG_MD5_IF ( LOG, ##__VA_ARGS__ )
528#define DBG_PAUSE( ... ) DBG_PAUSE_IF ( LOG, ##__VA_ARGS__ )
529#define DBG_MORE( ... ) DBG_MORE_IF ( LOG, ##__VA_ARGS__ )
530#define DBGC( ... ) DBGC_IF ( LOG, ##__VA_ARGS__ )
531#define DBGC_HDA( ... ) DBGC_HDA_IF ( LOG, ##__VA_ARGS__ )
532#define DBGC_HD( ... ) DBGC_HD_IF ( LOG, ##__VA_ARGS__ )
533#define DBGC_MD5A( ... ) DBGC_MD5A_IF ( LOG, ##__VA_ARGS__ )
534#define DBGC_MD5( ... ) DBGC_MD5_IF ( LOG, ##__VA_ARGS__ )
535#define DBGC_PAUSE( ... ) DBGC_PAUSE_IF ( LOG, ##__VA_ARGS__ )
536#define DBGC_MORE( ... ) DBGC_MORE_IF ( LOG, ##__VA_ARGS__ )
540#define DBG2( ... ) DBG_IF ( EXTRA, ##__VA_ARGS__ )
541#define DBG2_HDA( ... ) DBG_HDA_IF ( EXTRA, ##__VA_ARGS__ )
542#define DBG2_HD( ... ) DBG_HD_IF ( EXTRA, ##__VA_ARGS__ )
543#define DBG2_MD5A( ... ) DBG_MD5A_IF ( EXTRA, ##__VA_ARGS__ )
544#define DBG2_MD5( ... ) DBG_MD5_IF ( EXTRA, ##__VA_ARGS__ )
545#define DBG2_PAUSE( ... ) DBG_PAUSE_IF ( EXTRA, ##__VA_ARGS__ )
546#define DBG2_MORE( ... ) DBG_MORE_IF ( EXTRA, ##__VA_ARGS__ )
547#define DBGC2( ... ) DBGC_IF ( EXTRA, ##__VA_ARGS__ )
548#define DBGC2_HDA( ... ) DBGC_HDA_IF ( EXTRA, ##__VA_ARGS__ )
549#define DBGC2_HD( ... ) DBGC_HD_IF ( EXTRA, ##__VA_ARGS__ )
550#define DBGC2_MD5A( ... ) DBGC_MD5A_IF ( EXTRA, ##__VA_ARGS__ )
551#define DBGC2_MD5( ... ) DBGC_MD5_IF ( EXTRA, ##__VA_ARGS__ )
552#define DBGC2_PAUSE( ... ) DBGC_PAUSE_IF ( EXTRA, ##__VA_ARGS__ )
553#define DBGC2_MORE( ... ) DBGC_MORE_IF ( EXTRA, ##__VA_ARGS__ )
557#define DBGP( ... ) DBG_IF ( PROFILE, ##__VA_ARGS__ )
558#define DBGP_HDA( ... ) DBG_HDA_IF ( PROFILE, ##__VA_ARGS__ )
559#define DBGP_HD( ... ) DBG_HD_IF ( PROFILE, ##__VA_ARGS__ )
560#define DBGP_MD5A( ... ) DBG_MD5A_IF ( PROFILE, ##__VA_ARGS__ )
561#define DBGP_MD5( ... ) DBG_MD5_IF ( PROFILE, ##__VA_ARGS__ )
562#define DBGP_PAUSE( ... ) DBG_PAUSE_IF ( PROFILE, ##__VA_ARGS__ )
563#define DBGP_MORE( ... ) DBG_MORE_IF ( PROFILE, ##__VA_ARGS__ )
564#define DBGCP( ... ) DBGC_IF ( PROFILE, ##__VA_ARGS__ )
565#define DBGCP_HDA( ... ) DBGC_HDA_IF ( PROFILE, ##__VA_ARGS__ )
566#define DBGCP_HD( ... ) DBGC_HD_IF ( PROFILE, ##__VA_ARGS__ )
567#define DBGCP_MD5A( ... ) DBGC_MD5A_IF ( PROFILE, ##__VA_ARGS__ )
568#define DBGCP_MD5( ... ) DBGC_MD5_IF ( PROFILE, ##__VA_ARGS__ )
569#define DBGCP_PAUSE( ... ) DBGC_PAUSE_IF ( PROFILE, ##__VA_ARGS__ )
570#define DBGCP_MORE( ... ) DBGC_MORE_IF ( PROFILE, ##__VA_ARGS__ )
574#define DBGIO( ... ) DBG_IF ( IO, ##__VA_ARGS__ )
575#define DBGIO_HDA( ... ) DBG_HDA_IF ( IO, ##__VA_ARGS__ )
576#define DBGIO_HD( ... ) DBG_HD_IF ( IO, ##__VA_ARGS__ )
577#define DBGIO_MD5A( ... ) DBG_MD5A_IF ( IO, ##__VA_ARGS__ )
578#define DBGIO_MD5( ... ) DBG_MD5_IF ( IO, ##__VA_ARGS__ )
579#define DBGIO_PAUSE( ... ) DBG_PAUSE_IF ( IO, ##__VA_ARGS__ )
580#define DBGIO_MORE( ... ) DBG_MORE_IF ( IO, ##__VA_ARGS__ )
581#define DBGCIO( ... ) DBGC_IF ( IO, ##__VA_ARGS__ )
582#define DBGCIO_HDA( ... ) DBGC_HDA_IF ( IO, ##__VA_ARGS__ )
583#define DBGCIO_HD( ... ) DBGC_HD_IF ( IO, ##__VA_ARGS__ )
584#define DBGCIO_MD5A( ... ) DBGC_MD5A_IF ( IO, ##__VA_ARGS__ )
585#define DBGCIO_MD5( ... ) DBGC_MD5_IF ( IO, ##__VA_ARGS__ )
586#define DBGCIO_PAUSE( ... ) DBGC_PAUSE_IF ( IO, ##__VA_ARGS__ )
587#define DBGCIO_MORE( ... ) DBGC_MORE_IF ( IO, ##__VA_ARGS__ )
598#define __unused __attribute__ (( unused ))
603#define __pure __attribute__ (( pure ))
610#define __const __attribute__ (( const ))
617#define __nonnull __attribute__ (( nonnull ))
623#define __malloc __attribute__ (( malloc ))
630#define __used __attribute__ (( used ))
633#define __aligned __attribute__ (( aligned ( 16 ) ))
636#define __always_inline __attribute__ (( always_inline ))
649#define inline inline __attribute__ (( no_instrument_function ))
658#define barrier() __asm__ __volatile__ ( "" : : : "memory" )
665#define ARRAY_SIZE(array) ( sizeof (array) / sizeof ( (array)[0] ) )
680#define ABS_SYMBOL( name ) name[]
693#define ABS_VALUE_INIT( name ) ( ( typeof ( name[0] ) ) name )
748#define ABS_VALUE( name ) ( ( typeof ( name[0] ) ) ( intptr_t ) name )
750#define ABS_VALUE( name ) ( { \
751 static void * volatile static_ ## name = name; \
752 ( ( typeof ( name[0] ) ) ( intptr_t ) static_ ## name ); \
773#define FILE_LICENCE_PUBLIC_DOMAIN \
774 PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__public_domain__ ) )
782#define FILE_LICENCE_GPL2_OR_LATER \
783 PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__gpl2_or_later__ ) )
791#define FILE_LICENCE_GPL2_ONLY \
792 PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__gpl2_only__ ) )
803#define FILE_LICENCE_GPL_ANY \
804 PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__gpl_any__ ) )
828#define FILE_LICENCE_BSD3 \
829 PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__bsd3__ ) )
849#define FILE_LICENCE_BSD2 \
850 PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__bsd2__ ) )
896#define FILE_LICENCE_BSD2_PATENT \
897 PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__bsd2_patent__ ) )
906#define FILE_LICENCE_MIT \
907 PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__mit__ ) )
917#define FILE_LICENCE_GPL2_OR_LATER_OR_UBDL \
918 PROVIDE_SYMBOL ( PREFIX_OBJECT ( __licence__gpl2_or_later_or_ubdl__ ) )
921#define FILE_LICENCE( _licence ) FILE_LICENCE_ ## _licence
943#define FILE_SECBOOT_PERMITTED \
944 PROVIDE_SYMBOL ( PREFIX_OBJECT ( __secboot__permitted__ ) )
947#define FILE_SECBOOT_FORBIDDEN \
948 PROVIDE_SYMBOL ( PREFIX_OBJECT ( __secboot__forbidden__ ) )
951#define FILE_SECBOOT( _status ) FILE_SECBOOT_ ## _status
uint8_t data[48]
Additional event data.
void dbg_pause(void)
Pause until a key is pressed.
#define __debug_disable(object)
void dbg_hex_dump_da(unsigned long dispaddr, const void *data, unsigned long len)
Print hex dump with specified display address.
void dbg_more(void)
Indicate more data to follow and pause until a key is pressed.
void dbg_decolourise(void)
Revert to normal colour.
void dbg_autocolourise(unsigned long stream)
Select automatic colour for debug messages.
void dbg_md5_da(unsigned long dispaddr, const void *data, unsigned long len)
Print an MD5 checksum with specified display address.
void dbg_printf(const char *fmt,...)
Print debug message.
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
#define PROVIDE_SYMBOL(symbol)
Provide a symbol within this object file.
int printf(const char *fmt,...)
Write a formatted string to the console.
int ssize_t const char * fmt