Skip to content

Commit

Permalink
[libc] Enable automated extraction of error usage reports
Browse files Browse the repository at this point in the history
Add preprocessor magic to the error definitions to enable every error
usage to be tracked.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed May 31, 2010
1 parent d2415be commit 6c0e8c1
Show file tree
Hide file tree
Showing 22 changed files with 1,499 additions and 391 deletions.
1 change: 1 addition & 0 deletions src/Makefile
Expand Up @@ -43,6 +43,7 @@ ELF2EFI32 := ./util/elf2efi32
ELF2EFI64 := ./util/elf2efi64
EFIROM := ./util/efirom
ICCFIX := ./util/iccfix
EINFO := ./util/einfo
DOXYGEN := doxygen
BINUTILS_DIR := /usr
BFD_DIR := $(BINUTILS_DIR)
Expand Down
21 changes: 21 additions & 0 deletions src/Makefile.housekeeping
Expand Up @@ -550,6 +550,18 @@ $(BIN)/embedded.o : override CC := env CCACHE_DISABLE=1 $(CC)

CFLAGS_embedded = -DEMBED_ALL="$(EMBED_ALL)"

# Generate error usage information
#
$(BIN)/%.einfo : $(BIN)/%.o
$(QM)$(ECHO) " [EINFO] $@"
$(Q)$(OBJCOPY) -O binary -j .einfo --set-section-flags .einfo=alloc \
$< $@

EINFOS := $(patsubst $(BIN)/%.o,$(BIN)/%.einfo,$(BOBJS))
$(BIN)/errors : $(EINFOS) $(EINFO)
$(QM)$(ECHO) " [EINFO] $@"
$(Q)$(EINFO) $(EINFOS) | sort > $@

# Generate the NIC file from the parsed source files. The NIC file is
# only for rom-o-matic.
#
Expand Down Expand Up @@ -902,6 +914,15 @@ $(ICCFIX) : util/iccfix.c $(MAKEDEPS)
$(Q)$(HOST_CC) -idirafter include -O2 -o $@ $<
CLEANUP += $(ICCFIX)

###############################################################################
#
# The error usage information utility
#
$(EINFO) : util/einfo.c $(MAKEDEPS)
$(QM)$(ECHO) " [HOSTCC] $@"
$(Q)$(HOST_CC) -idirafter include -O2 -o $@ $<
CLEANUP += $(EINFO)

###############################################################################
#
# Local configs
Expand Down
2 changes: 2 additions & 0 deletions src/arch/i386/scripts/i386.lds
Expand Up @@ -162,6 +162,8 @@ SECTIONS {
*(.eh_frame.*)
*(.rel)
*(.rel.*)
*(.einfo)
*(.einfo.*)
*(.discard)
}

Expand Down
2 changes: 2 additions & 0 deletions src/arch/x86/scripts/efi.lds
Expand Up @@ -99,6 +99,8 @@ SECTIONS {
*(.eh_frame.*)
*(.rel)
*(.rel.*)
*(.einfo)
*(.einfo.*)
*(.discard)
}
}
6 changes: 4 additions & 2 deletions src/drivers/net/ipoib.c
Expand Up @@ -77,11 +77,13 @@ static struct ipoib_mac ipoib_broadcast = {
};

/** Link status for "broadcast join in progress" */
#define EINPROGRESS_JOINING ( EINPROGRESS | EUNIQ_01 )
#define EINPROGRESS_JOINING __einfo_error ( EINFO_EINPROGRESS_JOINING )
#define EINFO_EINPROGRESS_JOINING __einfo_uniqify \
( EINFO_EINPROGRESS, 0x01, "Joining" )

/** Human-readable message for the link status */
struct errortab ipoib_errors[] __errortab = {
{ EINPROGRESS_JOINING, "Joining" },
__einfo_errortab ( EINFO_EINPROGRESS_JOINING ),
};

/****************************************************************************
Expand Down
34 changes: 17 additions & 17 deletions src/hci/strerror.c
Expand Up @@ -102,21 +102,21 @@ const char * strerror ( int errno ) {

/** The most common errors */
struct errortab common_errors[] __errortab = {
{ 0, "No error" },
{ EACCES, "Permission denied" },
{ ECANCELED, "Operation cancelled" },
{ ECONNRESET, "Connection reset" },
{ EINVAL, "Invalid argument" },
{ EIO, "Input/output error" },
{ ENETUNREACH, "Network unreachable" },
{ ENODEV, "No such device" },
{ ENOENT, "File not found" },
{ ENOEXEC, "Not an executable image" },
{ ENOMEM, "Out of memory" },
{ ENOSPC, "No space left on device" },
{ ENOTCONN, "Not connected" },
{ ENOTSUP, "Not supported" },
{ EPERM, "Operation not permitted" },
{ ERANGE, "Out of range" },
{ ETIMEDOUT, "Connection timed out" },
__einfo_errortab ( EINFO_ENOERR ),
__einfo_errortab ( EINFO_EACCES ),
__einfo_errortab ( EINFO_ECANCELED ),
__einfo_errortab ( EINFO_ECONNRESET ),
__einfo_errortab ( EINFO_EINVAL ),
__einfo_errortab ( EINFO_EIO ),
__einfo_errortab ( EINFO_ENETUNREACH ),
__einfo_errortab ( EINFO_ENODEV ),
__einfo_errortab ( EINFO_ENOENT ),
__einfo_errortab ( EINFO_ENOEXEC ),
__einfo_errortab ( EINFO_ENOMEM ),
__einfo_errortab ( EINFO_ENOSPC ),
__einfo_errortab ( EINFO_ENOTCONN ),
__einfo_errortab ( EINFO_ENOTSUP ),
__einfo_errortab ( EINFO_EPERM ),
__einfo_errortab ( EINFO_ERANGE ),
__einfo_errortab ( EINFO_ETIMEDOUT ),
};
164 changes: 77 additions & 87 deletions src/hci/wireless_errors.c
Expand Up @@ -20,99 +20,89 @@ FILE_LICENCE ( GPL2_OR_LATER );

#include <errno.h>
#include <ipxe/errortab.h>
#include <ipxe/net80211_err.h>

/* Record errors as though they come from the 802.11 stack */
#undef ERRFILE
#define ERRFILE ERRFILE_net80211

/** All 802.11 errors
*
* These follow the 802.11 standard as much as is feasible, but most
* have been abbreviated to fit the 50-character limit imposed by
* strerror.
*/
struct errortab wireless_errors[] __errortab = {
/* iPXE 802.11 stack errors */
{ EINVAL | EUNIQ_01, "Packet too short" },
{ EINVAL | EUNIQ_02, "Packet 802.11 version not supported" },
{ EINVAL | EUNIQ_03, "Packet not a data packet" },
{ EINVAL | EUNIQ_04, "Packet not from an Access Point" },
{ EINVAL | EUNIQ_05, "Packet has invalid LLC header" },
{ EINVAL | EUNIQ_06, "Packet decryption error", },
{ EINVAL | EUNIQ_07, "Invalid active scan requested" },

/* 802.11 status codes (IEEE Std 802.11-2007, Table 7-23) */
/* Maximum error length: 50 chars | */
{ ECONNREFUSED | EUNIQ_01, "Unspecified failure" },
{ ECONNREFUSED | EUNIQ_0A, "Cannot support all requested capabilities" },
{ ECONNREFUSED | EUNIQ_0B, "Reassociation denied due to lack of association" },
{ ECONNREFUSED | EUNIQ_0C, "Association denied for another reason" },
{ ECONNREFUSED | EUNIQ_0D, "Authentication algorithm unsupported" },
{ ECONNREFUSED | EUNIQ_0E, "Authentication sequence number unexpected" },
{ ECONNREFUSED | EUNIQ_0F, "Authentication rejected due to challenge failure" },
{ ECONNREFUSED | EUNIQ_10, "Authentication rejected due to timeout" },
{ ECONNREFUSED | EUNIQ_11, "Association denied because AP is out of resources" },
{ ECONNREFUSED | EUNIQ_12, "Association denied; basic rate support required" },
{ ECONNREFUSED | EUNIQ_13, "Association denied; short preamble support req'd" },
{ ECONNREFUSED | EUNIQ_14, "Association denied; PBCC modulation support req'd" },
{ ECONNREFUSED | EUNIQ_15, "Association denied; Channel Agility support req'd" },
{ ECONNREFUSED | EUNIQ_16, "Association denied; Spectrum Management required" },
{ ECONNREFUSED | EUNIQ_17, "Association denied; Power Capability unacceptable" },
{ ECONNREFUSED | EUNIQ_18, "Association denied; Supported Channels unacceptable" },
{ ECONNREFUSED | EUNIQ_19, "Association denied; Short Slot Tume support req'd" },
{ ECONNREFUSED | EUNIQ_1A, "Association denied; DSSS-OFDM support required" },
{ EHOSTUNREACH, "Unspecified, QoS-related failure" },
{ EHOSTUNREACH | EUNIQ_01, "Association denied; QoS AP out of QoS resources" },
{ EHOSTUNREACH | EUNIQ_02, "Association denied due to excessively poor link" },
{ EHOSTUNREACH | EUNIQ_03, "Association denied; QoS support required" },
{ EHOSTUNREACH | EUNIQ_05, "The request has been declined" },
{ EHOSTUNREACH | EUNIQ_06, "Request unsuccessful due to invalid parameters" },
{ EHOSTUNREACH | EUNIQ_07, "TS not created due to bad specification" },
{ EHOSTUNREACH | EUNIQ_08, "Invalid information element" },
{ EHOSTUNREACH | EUNIQ_09, "Invalid group cipher" },
{ EHOSTUNREACH | EUNIQ_0A, "Invalid pairwise cipher" },
{ EHOSTUNREACH | EUNIQ_0B, "Invalid AKMP" },
{ EHOSTUNREACH | EUNIQ_0C, "Unsupported RSN information element version" },
{ EHOSTUNREACH | EUNIQ_0D, "Invalid RSN information element capabilities" },
{ EHOSTUNREACH | EUNIQ_0E, "Cipher suite rejected because of security policy" },
{ EHOSTUNREACH | EUNIQ_0F, "TS not created due to insufficient delay" },
{ EHOSTUNREACH | EUNIQ_10, "Direct link is not allowed in the BSS by policy" },
{ EHOSTUNREACH | EUNIQ_11, "The Destination STA is not present within the BSS" },
{ EHOSTUNREACH | EUNIQ_12, "The Destination STA is not a QoS STA" },
{ EHOSTUNREACH | EUNIQ_13, "Association denied; Listen Interval is too large" },

/* 802.11 reason codes (IEEE Std 802.11-2007, Table 7-22) */
/* Maximum error length: 50 chars | */
{ ECONNRESET | EUNIQ_01, "Unspecified reason" },
{ ECONNRESET | EUNIQ_02, "Previous authentication no longer valid" },
{ ECONNRESET | EUNIQ_03, "Deauthenticated due to leaving network" },
{ ECONNRESET | EUNIQ_04, "Disassociated due to inactivity" },
{ ECONNRESET | EUNIQ_05, "Disassociated because AP is out of resources" },
{ ECONNRESET | EUNIQ_06, "Class 2 frame received from nonauthenticated STA" },
{ ECONNRESET | EUNIQ_07, "Class 3 frame received from nonassociated STA" },
{ ECONNRESET | EUNIQ_08, "Disassociated due to roaming" },
{ ECONNRESET | EUNIQ_09, "STA requesting (re)association not authenticated" },
{ ECONNRESET | EUNIQ_0A, "Disassociated; Power Capability unacceptable" },
{ ECONNRESET | EUNIQ_0B, "Disassociated; Supported Channels unacceptable" },
{ ECONNRESET | EUNIQ_0D, "Invalid information element" },
{ ECONNRESET | EUNIQ_0E, "Message integrity code (MIC) failure" },
{ ECONNRESET | EUNIQ_0F, "4-Way Handshake timeout" },
{ ECONNRESET | EUNIQ_10, "Group Key Handshake timeout" },
{ ECONNRESET | EUNIQ_11, "4-Way Handshake information element changed unduly" },
{ ECONNRESET | EUNIQ_12, "Invalid group cipher" },
{ ECONNRESET | EUNIQ_13, "Invalid pairwise cipher" },
{ ECONNRESET | EUNIQ_14, "Invalid AKMP" },
{ ECONNRESET | EUNIQ_15, "Unsupported RSN information element version" },
{ ECONNRESET | EUNIQ_16, "Invalid RSN information element capabilities" },
{ ECONNRESET | EUNIQ_17, "IEEE 802.1X authentication failed" },
{ ECONNRESET | EUNIQ_18, "Cipher suite rejected because of security policy" },
{ ENETRESET, "Disassociated for unspecified, QoS-related reason" },
{ ENETRESET | EUNIQ_01, "Disassociated; QoS AP is out of QoS resources" },
{ ENETRESET | EUNIQ_02, "Disassociated due to excessively poor link" },
{ ENETRESET | EUNIQ_03, "Disassociated due to TXOP limit violation" },
{ ENETRESET | EUNIQ_04, "Requested; STA is leaving the BSS (or resetting)" },
{ ENETRESET | EUNIQ_05, "Requested; does not want to use the mechanism" },
{ ENETRESET | EUNIQ_06, "Requested; setup is required" },
{ ENETRESET | EUNIQ_07, "Requested from peer STA due to timeout" },
{ ENETRESET | EUNIQ_0D, "Peer STA does not support requested cipher suite" },
__einfo_errortab ( EINFO_EINVAL_PKT_TOO_SHORT ),
__einfo_errortab ( EINFO_EINVAL_PKT_VERSION ),
__einfo_errortab ( EINFO_EINVAL_PKT_NOT_DATA ),
__einfo_errortab ( EINFO_EINVAL_PKT_NOT_FROMDS ),
__einfo_errortab ( EINFO_EINVAL_PKT_LLC_HEADER ),
__einfo_errortab ( EINFO_EINVAL_CRYPTO_REQUEST ),
__einfo_errortab ( EINFO_EINVAL_ACTIVE_SCAN ),
__einfo_errortab ( EINFO_ECONNREFUSED_FAILURE ),
__einfo_errortab ( EINFO_ECONNREFUSED_CAPAB_UNSUPP ),
__einfo_errortab ( EINFO_ECONNREFUSED_REASSOC_INVALID ),
__einfo_errortab ( EINFO_ECONNREFUSED_ASSOC_DENIED ),
__einfo_errortab ( EINFO_ECONNREFUSED_AUTH_ALGO_UNSUPP ),
__einfo_errortab ( EINFO_ECONNREFUSED_AUTH_SEQ_INVALID ),
__einfo_errortab ( EINFO_ECONNREFUSED_AUTH_CHALL_INVALID ),
__einfo_errortab ( EINFO_ECONNREFUSED_AUTH_TIMEOUT ),
__einfo_errortab ( EINFO_ECONNREFUSED_ASSOC_NO_ROOM ),
__einfo_errortab ( EINFO_ECONNREFUSED_ASSOC_NEED_RATE ),
__einfo_errortab ( EINFO_ECONNREFUSED_ASSOC_NEED_SHORT_PMBL ),
__einfo_errortab ( EINFO_ECONNREFUSED_ASSOC_NEED_PBCC ),
__einfo_errortab ( EINFO_ECONNREFUSED_ASSOC_NEED_CHAN_AGILITY ),
__einfo_errortab ( EINFO_ECONNREFUSED_ASSOC_NEED_SPECTRUM_MGMT ),
__einfo_errortab ( EINFO_ECONNREFUSED_ASSOC_BAD_POWER ),
__einfo_errortab ( EINFO_ECONNREFUSED_ASSOC_BAD_CHANNELS ),
__einfo_errortab ( EINFO_ECONNREFUSED_ASSOC_NEED_SHORT_SLOT ),
__einfo_errortab ( EINFO_ECONNREFUSED_ASSOC_NEED_DSSS_OFDM ),
__einfo_errortab ( EINFO_EHOSTUNREACH_QOS_FAILURE ),
__einfo_errortab ( EINFO_EHOSTUNREACH_QOS_NO_ROOM ),
__einfo_errortab ( EINFO_EHOSTUNREACH_LINK_IS_HORRIBLE ),
__einfo_errortab ( EINFO_EHOSTUNREACH_ASSOC_NEED_QOS ),
__einfo_errortab ( EINFO_EHOSTUNREACH_REQUEST_DECLINED ),
__einfo_errortab ( EINFO_EHOSTUNREACH_REQUEST_INVALID ),
__einfo_errortab ( EINFO_EHOSTUNREACH_TS_NOT_CREATED_AGAIN ),
__einfo_errortab ( EINFO_EHOSTUNREACH_INVALID_IE ),
__einfo_errortab ( EINFO_EHOSTUNREACH_GROUP_CIPHER_INVALID ),
__einfo_errortab ( EINFO_EHOSTUNREACH_PAIR_CIPHER_INVALID ),
__einfo_errortab ( EINFO_EHOSTUNREACH_AKMP_INVALID ),
__einfo_errortab ( EINFO_EHOSTUNREACH_RSN_VERSION_UNSUPP ),
__einfo_errortab ( EINFO_EHOSTUNREACH_RSN_CAPAB_INVALID ),
__einfo_errortab ( EINFO_EHOSTUNREACH_CIPHER_REJECTED ),
__einfo_errortab ( EINFO_EHOSTUNREACH_TS_NOT_CREATED_WAIT ),
__einfo_errortab ( EINFO_EHOSTUNREACH_DIRECT_LINK_FORBIDDEN ),
__einfo_errortab ( EINFO_EHOSTUNREACH_DEST_NOT_PRESENT ),
__einfo_errortab ( EINFO_EHOSTUNREACH_DEST_NOT_QOS ),
__einfo_errortab ( EINFO_EHOSTUNREACH_ASSOC_LISTEN_TOO_HIGH ),
__einfo_errortab ( EINFO_ECONNRESET_UNSPECIFIED ),
__einfo_errortab ( EINFO_ECONNRESET_AUTH_NO_LONGER_VALID ),
__einfo_errortab ( EINFO_ECONNRESET_LEAVING ),
__einfo_errortab ( EINFO_ECONNRESET_INACTIVITY ),
__einfo_errortab ( EINFO_ECONNRESET_OUT_OF_RESOURCES ),
__einfo_errortab ( EINFO_ECONNRESET_NEED_AUTH ),
__einfo_errortab ( EINFO_ECONNRESET_NEED_ASSOC ),
__einfo_errortab ( EINFO_ECONNRESET_LEAVING_TO_ROAM ),
__einfo_errortab ( EINFO_ECONNRESET_REASSOC_INVALID ),
__einfo_errortab ( EINFO_ECONNRESET_BAD_POWER ),
__einfo_errortab ( EINFO_ECONNRESET_BAD_CHANNELS ),
__einfo_errortab ( EINFO_ECONNRESET_INVALID_IE ),
__einfo_errortab ( EINFO_ECONNRESET_MIC_FAILURE ),
__einfo_errortab ( EINFO_ECONNRESET_4WAY_TIMEOUT ),
__einfo_errortab ( EINFO_ECONNRESET_GROUPKEY_TIMEOUT ),
__einfo_errortab ( EINFO_ECONNRESET_4WAY_INVALID ),
__einfo_errortab ( EINFO_ECONNRESET_GROUP_CIPHER_INVALID ),
__einfo_errortab ( EINFO_ECONNRESET_PAIR_CIPHER_INVALID ),
__einfo_errortab ( EINFO_ECONNRESET_AKMP_INVALID ),
__einfo_errortab ( EINFO_ECONNRESET_RSN_VERSION_INVALID ),
__einfo_errortab ( EINFO_ECONNRESET_RSN_CAPAB_INVALID ),
__einfo_errortab ( EINFO_ECONNRESET_8021X_FAILURE ),
__einfo_errortab ( EINFO_ECONNRESET_CIPHER_REJECTED ),
__einfo_errortab ( EINFO_ENETRESET_QOS_UNSPECIFIED ),
__einfo_errortab ( EINFO_ENETRESET_QOS_OUT_OF_RESOURCES ),
__einfo_errortab ( EINFO_ENETRESET_LINK_IS_HORRIBLE ),
__einfo_errortab ( EINFO_ENETRESET_INVALID_TXOP ),
__einfo_errortab ( EINFO_ENETRESET_REQUESTED_LEAVING ),
__einfo_errortab ( EINFO_ENETRESET_REQUESTED_NO_USE ),
__einfo_errortab ( EINFO_ENETRESET_REQUESTED_NEED_SETUP ),
__einfo_errortab ( EINFO_ENETRESET_REQUESTED_TIMEOUT ),
__einfo_errortab ( EINFO_ENETRESET_CIPHER_UNSUPPORTED ),
};
25 changes: 14 additions & 11 deletions src/image/segment.c
Expand Up @@ -31,6 +31,19 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/errortab.h>
#include <ipxe/segment.h>

/**
* Segment-specific error messages
*
* This error happens sufficiently often to merit a user-friendly
* description.
*/
#define ERANGE_SEGMENT __einfo_error ( EINFO_ERANGE_SEGMENT )
#define EINFO_ERANGE_SEGMENT \
__einfo_uniqify ( EINFO_ERANGE, 0x01, "Requested memory not available" )
struct errortab segment_errors[] __errortab = {
__einfo_errortab ( EINFO_ERANGE_SEGMENT ),
};

/**
* Prepare segment for loading
*
Expand Down Expand Up @@ -73,15 +86,5 @@ int prep_segment ( userptr_t segment, size_t filesz, size_t memsz ) {
/* No suitable memory region found */
DBG ( "Segment [%lx,%lx,%lx) does not fit into available memory\n",
start, mid, end );
return -ERANGE;
return -ERANGE_SEGMENT;
}

/**
* Segment-specific error messages
*
* This error happens sufficiently often to merit a user-friendly
* description.
*/
struct errortab segment_errors[] __errortab = {
{ ERANGE, "Requested memory not available" },
};

0 comments on commit 6c0e8c1

Please sign in to comment.