iPXE
Functions
stdlib.h File Reference
#include <stdint.h>
#include <assert.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
 FILE_SECBOOT (PERMITTED)
 
unsigned long strtoul (const char *string, char **endp, int base)
 Convert string to numeric value. More...
 
unsigned long long strtoull (const char *string, char **endp, int base)
 Convert string to numeric value. More...
 
void *__malloc malloc (size_t size)
 Allocate memory. More...
 
void * realloc (void *old_ptr, size_t new_size)
 Reallocate memory. More...
 
void free (void *ptr)
 Free memory. More...
 
void *__malloc zalloc (size_t len)
 Allocate cleared memory. More...
 
static void *__malloc calloc (size_t nmemb, size_t size)
 Allocate cleared memory. More...
 
long int random (void)
 Generate a pseudo-random number between 0 and 2147483647L or 2147483562? More...
 
void srandom (unsigned int seed)
 Seed the pseudo-random number generator. More...
 
static int rand (void)
 
static void srand (unsigned int seed)
 
static __attribute__ ((always_inline)) int abs(int value)
 
int system (const char *command)
 Execute command line. More...
 
__asmcall int main (void)
 Main entry point. More...
 

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED  )

◆ strtoul()

unsigned long strtoul ( const char *  string,
char **  endp,
int  base 
)

Convert string to numeric value.

Parameters
stringString
endpEnd pointer (or NULL)
baseNumeric base (or zero to autodetect)
Return values
valueNumeric value

Definition at line 485 of file string.c.

485  {
486  unsigned long value = 0;
487  unsigned int digit;
488  int negate;
489 
490  /* Preprocess string */
491  string = strtoul_pre ( string, &negate, &base );
492 
493  /* Process digits */
494  for ( ; ; string++ ) {
495  digit = digit_value ( *string );
496  if ( digit >= ( unsigned int ) base )
497  break;
498  value = ( ( value * base ) + digit );
499  }
500 
501  /* Negate value if, applicable */
502  if ( negate )
503  value = -value;
504 
505  /* Fill in end pointer, if applicable */
506  if ( endp )
507  *endp = ( ( char * ) string );
508 
509  return value;
510 }
uint32_t base
Base.
Definition: librm.h:138
unsigned int digit_value(unsigned int character)
Calculate digit value.
Definition: string.c:427
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
static const char * strtoul_pre(const char *string, int *negate, int *base)
Preprocess string for strtoul() or strtoull()
Definition: string.c:446

References base, digit_value(), strtoul_pre(), and value.

Referenced by aoe_parse_uri(), bzimage_parse_cmdline(), cpio_parse_cmdline(), efi_snp_hii_store(), fc_aton(), fc_id_aton(), ftp_parse_value(), ftp_reply(), http_parse_content_length(), http_parse_retry_after(), http_parse_status(), http_rx_chunk_len(), ib_srp_parse_integer(), inet6_aton(), inet_aton(), iscsi_handle_chap_i_value(), iscsi_handle_maxburstlength_value(), iscsi_handle_targetaddress_value(), iscsi_parse_root_path(), mac_address_from_string_specs(), parse_int_setting(), parse_integer(), parse_setting_tag(), pnm_ascii(), scsi_parse_lun(), slam_parse_multicast_address(), string_test_exec(), tftp_process_blksize(), tftp_process_multicast(), tftp_process_tsize(), uart_find(), uri_decode(), uri_port(), and xenstore_read_num().

◆ strtoull()

unsigned long long strtoull ( const char *  string,
char **  endp,
int  base 
)

Convert string to numeric value.

Parameters
stringString
endpEnd pointer (or NULL)
baseNumeric base (or zero to autodetect)
Return values
valueNumeric value

Definition at line 520 of file string.c.

520  {
521  unsigned long long value = 0;
522  unsigned int digit;
523  int negate;
524 
525  /* Preprocess string */
526  string = strtoul_pre ( string, &negate, &base );
527 
528  /* Process digits */
529  for ( ; ; string++ ) {
530  digit = digit_value ( *string );
531  if ( digit >= ( unsigned int ) base )
532  break;
533  value = ( ( value * base ) + digit );
534  }
535 
536  /* Negate value if, applicable */
537  if ( negate )
538  value = -value;
539 
540  /* Fill in end pointer, if applicable */
541  if ( endp )
542  *endp = ( ( char * ) string );
543 
544  return value;
545 }
uint32_t base
Base.
Definition: librm.h:138
unsigned int digit_value(unsigned int character)
Calculate digit value.
Definition: string.c:427
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
static const char * strtoul_pre(const char *string, int *negate, int *base)
Preprocess string for strtoul() or strtoull()
Definition: string.c:446

References base, digit_value(), strtoul_pre(), and value.

◆ malloc()

void* __malloc malloc ( size_t  size)

Allocate memory.

Parameters
sizeRequested size
Return values
ptrMemory, or NULL

Allocates memory with no particular alignment requirement. ptr will be aligned to at least a multiple of sizeof(void*).

Definition at line 621 of file malloc.c.

621  {
622  void *ptr;
623 
624  ptr = realloc ( NULL, size );
625  if ( ASSERTED ) {
626  DBGC ( &heap, "HEAP detected possible memory corruption "
627  "from %p\n", __builtin_return_address ( 0 ) );
628  }
629  return ptr;
630 }
uint16_t size
Buffer size.
Definition: dwmac.h:14
#define DBGC(...)
Definition: compiler.h:505
#define ASSERTED
Definition: assert.h:26
A heap.
Definition: malloc.h:45
void * realloc(void *old_ptr, size_t new_size)
Reallocate memory.
Definition: malloc.c:607
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322

References ASSERTED, DBGC, NULL, realloc(), and size.

Referenced by add_tls(), aes_unwrap(), aes_wrap(), alloc_iob_raw(), apply_dns_search(), ath5k_hw_rfregs_init(), chap_init(), deflate_test_exec(), der_asn1(), derwin(), dhcpv6_rx(), dhe_key(), dupwin(), eap_rx_mschapv2_request(), eap_tx_response(), ecdsa_alloc(), efi_block_label(), efi_boot_path(), efi_cacert_all(), efi_cmdline_init(), efi_download_start(), efi_load_path(), efi_local_check_volume_name(), efi_local_len(), efi_locate_device(), efi_vasprintf(), efivars_fetch(), eisabus_probe(), fc_ulp_login(), fetch_setting_copy(), format_uri_alloc(), http_format_ntlm_auth(), icert_encode(), int13_hook(), ipair_rx_pubkey(), ipoib_map_remac(), ipv4_add_miniroute(), isabus_probe(), isapnpbus_probe(), iscsi_handle_chap_c_value(), iscsi_handle_chap_r_value(), iscsi_rx_buffered_data(), iscsi_scsi_command(), jme_alloc_rx_resources(), jme_alloc_tx_resources(), lldp_rx(), loopback_test(), mcabus_probe(), memcpy_test_speed(), mlx_memory_alloc_priv(), net80211_probe_start(), net80211_register(), newwin(), nfs_uri_symlink(), ntlm_authenticate_okx(), ocsp_response(), ocsp_uri_string(), parse_kv(), parse_net_args(), pci_vpd_resize(), pcibus_probe(), peerblk_decrypt(), peerblk_parse_header(), pem_asn1(), rsa_alloc(), sandev_parse_iso9660(), storef_setting(), storen_setting(), strndup(), t509bus_probe(), tls_new_server_key_exchange(), tls_new_session_ticket(), tls_select_handshake(), tls_send_client_key_exchange_dhe(), uhci_enqueue(), usb_config_descriptor(), usb_get_string_descriptor(), usbio_config(), usbio_path(), vasprintf(), vesafb_mode_list(), vmbus_open(), wpa_make_rsn_ie(), wpa_start(), and zalloc().

◆ realloc()

void* realloc ( void *  old_ptr,
size_t  new_size 
)

Reallocate memory.

Parameters
old_ptrMemory previously allocated by malloc(), or NULL
new_sizeRequested size
Return values
new_ptrAllocated memory, or NULL

Definition at line 607 of file malloc.c.

607  {
608 
609  return heap_realloc ( &heap, old_ptr, new_size );
610 }
A heap.
Definition: malloc.h:45
void * heap_realloc(struct heap *heap, void *old_ptr, size_t new_size)
Reallocate memory.
Definition: malloc.c:537

References heap_realloc().

Referenced by __attribute__(), asn1_grow(), bitmap_resize(), cachedhcp_record(), dhcpopt_init(), efi_ifr_op(), efi_ifr_string(), efivars_find(), free(), ibft_alloc_string(), ibft_install(), line_buffer(), malloc(), nvo_realloc(), process_script(), and xferbuf_malloc_realloc().

◆ free()

void free ( void *  ptr)

Free memory.

Parameters
ptrMemory allocated by malloc(), or NULL

Memory allocated with malloc_phys() cannot be freed with free(); it must be freed with free_phys() instead.

If ptr is NULL, no action is taken.

Definition at line 642 of file malloc.c.

642  {
643 
644  realloc ( ptr, 0 );
645  if ( ASSERTED ) {
646  DBGC ( &heap, "HEAP detected possible memory corruption "
647  "from %p\n", __builtin_return_address ( 0 ) );
648  }
649 }
#define DBGC(...)
Definition: compiler.h:505
#define ASSERTED
Definition: assert.h:26
A heap.
Definition: malloc.h:45
void * realloc(void *old_ptr, size_t new_size)
Reallocate memory.
Definition: malloc.c:607

References ASSERTED, DBGC, and realloc().

◆ zalloc()

void* __malloc zalloc ( size_t  size)

Allocate cleared memory.

Parameters
sizeRequested size
Return values
ptrAllocated memory

Allocate memory as per malloc(), and zero it.

This function name is non-standard, but pretty intuitive. zalloc(size) is always equivalent to calloc(1,size)

Definition at line 662 of file malloc.c.

662  {
663  void *data;
664 
665  data = malloc ( size );
666  if ( data )
667  memset ( data, 0, size );
668  if ( ASSERTED ) {
669  DBGC ( &heap, "HEAP detected possible memory corruption "
670  "from %p\n", __builtin_return_address ( 0 ) );
671  }
672  return data;
673 }
uint16_t size
Buffer size.
Definition: dwmac.h:14
#define DBGC(...)
Definition: compiler.h:505
#define ASSERTED
Definition: assert.h:26
void * malloc(size_t size)
Allocate memory.
Definition: malloc.c:621
A heap.
Definition: malloc.h:45
uint8_t data[48]
Additional event data.
Definition: ena.h:22
void * memset(void *dest, int character, size_t len) __nonnull

References ASSERTED, data, DBGC, malloc(), memset(), and size.

Referenced by add_dynui_item(), add_parameter(), alloc_form(), alloc_gpios(), alloc_ibdev(), alloc_image(), alloc_netdev(), alloc_pixbuf(), alloc_sandev(), alloc_uart(), alloc_usb(), alloc_usb_bus(), alloc_usb_hub(), aoecmd_create(), aoedev_open(), ar9300_eeprom_restore_internal(), arbel_alloc(), arbel_create_cq(), arbel_create_qp(), ata_open(), atadev_command(), ath5k_hw_attach(), ath5k_probe(), ath9k_init_softc(), ath_descdma_setup(), atl1e_setup_ring_resources(), autovivify_child_settings(), block_translate(), cachedhcp_record(), calloc(), cms_message(), cms_parse_participants(), concat_args(), cpio_okx(), create_downloader(), create_dynui(), create_parameters(), create_pinger(), create_validator(), dhcp_deliver(), dhcpv6_register(), dns_resolv(), dt_probe_node(), dwgpio_group_probe(), dwusb_probe(), efi_block_exec(), efi_block_install(), efi_fcp_path(), efi_file_open_image(), efi_ib_srp_path(), efi_image_path(), efi_iscsi_path(), efi_local_open(), efi_netdev_path(), efi_path_uri(), efi_paths(), efi_pxe_install(), efi_snp_hii_fetch(), efi_snp_hii_install(), efi_snp_hii_process(), efi_snp_hii_store(), efi_snp_probe(), efi_uri_path(), efi_usb_install(), efi_usb_open(), efi_usb_path(), efi_usb_probe(), efidev_alloc(), efipci_start(), efivars_find(), ehci_endpoint_open(), ehci_probe(), ehci_ring_alloc(), eoib_create_peer(), exanic_probe(), fc_els_create(), fc_ns_query(), fc_peer_create(), fc_port_open(), fc_ulp_create(), fc_xchg_create(), fcpdev_open(), fcpdev_scsi_command(), fetch_string_setting_copy_alloc(), fetchf_setting_copy(), flexboot_nodnic_create_cq(), flexboot_nodnic_create_qp(), flexboot_nodnic_eth_open(), flexboot_nodnic_probe(), fragment_reassemble(), ftp_open(), generic_settings_store(), golan_alloc(), golan_create_cq(), golan_create_qp_aux(), guestinfo_fetch_type(), hermon_alloc(), hermon_create_cq(), hermon_create_qp(), http_connect(), http_open(), http_open_uri(), hub_probe(), hv_probe(), hvm_probe(), hw_open(), ib_cmrc_open(), ib_create_conn(), ib_create_cq(), ib_create_madx(), ib_create_mi(), ib_create_path(), ib_create_qp(), ib_mcast_attach(), ib_srp_open(), ibft_install(), icert_certs(), imux_probe(), init_mlx_utils(), ipair_create(), ipv6_add_miniroute(), iscsi_open(), linda_create_send_wq(), mlx_memory_zalloc_priv(), ndp_register_settings(), neighbour_create(), net80211_handle_mgmt(), net80211_prepare_assoc(), net80211_probe_start(), net80211_probe_step(), net80211_step_associate(), nfs_open(), nii_map(), numeric_resolv(), ocsp_check(), ocsp_uri_string(), open(), parse_uri(), pcibridge_probe(), peerblk_open(), peerdisc_create(), peerdisc_discovered(), peermux_filter(), ping_open(), png_pixbuf(), pxe_menu_parse(), qib7322_create_send_bufs(), qib7322_create_send_wq(), qib7322_probe(), rc80211_init(), resolv(), resolv_setting(), rtl818x_probe(), scsi_open(), scsidev_command(), sec80211_install(), sis190_mii_probe(), skge_probe(), skge_ring_alloc(), sky2_probe(), sky2_up(), slam_open(), srp_open(), srpdev_scsi_command(), start_dhcp(), start_dhcpv6(), start_ipv6conf(), start_ntp(), start_pxebs(), tcp_open(), tftp_core_open(), tg3_alloc_consistent(), tls_session(), tls_set_cipher(), txnic_bgx_probe(), txnic_pf_probe(), ucode_exec(), udp_open_common(), uhci_endpoint_open(), uhci_probe(), undipci_probe(), undirom_probe(), uri_dup(), usb_probe_all(), usbblk_probe(), usbio_endpoint_open(), usbio_interfaces(), usbio_interrupt_open(), usbio_start(), usbkbd_probe(), validator_start_download(), virtnet_open_legacy(), virtnet_open_modern(), vmbus_probe(), vmbus_probe_channels(), vxge_hw_device_initialize(), x509_alloc_chain(), x509_append(), x509_certificate(), xcm_create(), xenbus_probe_device(), xenstore_response(), xfer_open_named_socket(), xhci_bus_open(), xhci_device_open(), xhci_endpoint_open(), xhci_probe(), xhci_ring_alloc(), xsigo_ib_probe(), xve_create(), and zlib_deflate().

◆ calloc()

static void* __malloc calloc ( size_t  nmemb,
size_t  size 
)
inlinestatic

Allocate cleared memory.

Parameters
nmembNumber of members
sizeSize of each member
Return values
ptrAllocated memory

Allocate memory as per malloc(), and zero it.

This is implemented as a static inline, with the body of the function in zalloc(), since in most cases nmemb will be 1 and doing the multiply is just wasteful.

Definition at line 46 of file stdlib.h.

46  {
47  return zalloc ( nmemb * size );
48 }
void *__malloc zalloc(size_t len)
Allocate cleared memory.
Definition: malloc.c:662
uint16_t size
Buffer size.
Definition: dwmac.h:14

References size, and zalloc().

Referenced by ath5k_desc_alloc(), ath5k_eeprom_convert_pcal_info_2413(), ath5k_eeprom_convert_pcal_info_5111(), ath5k_eeprom_convert_pcal_info_5112(), and slk_init().

◆ random()

long int random ( void  )

Generate a pseudo-random number between 0 and 2147483647L or 2147483562?

Return values
randPseudo-random number

Definition at line 32 of file random.c.

32  {
33  int32_t q;
34 
35  /* Initialize linear congruential generator */
36  if ( ! rnd_seed )
37  srandom ( time ( NULL ) );
38 
39  /* simplified version of the LCG given in Bruce Schneier's
40  "Applied Cryptography" */
41  q = ( rnd_seed / 53668 );
42  rnd_seed = ( 40014 * ( rnd_seed - 53668 * q ) - 12211 * q );
43  if ( rnd_seed < 0 )
44  rnd_seed += 2147483563L;
45  return rnd_seed;
46 }
static int32_t rnd_seed
Definition: random.c:14
void srandom(unsigned int seed)
Seed the pseudo-random number generator.
Definition: random.c:21
signed int int32_t
Definition: stdint.h:17
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322

References NULL, rnd_seed, and srandom().

Referenced by arbel_alloc_qpn(), cipher_cost(), digest_cost(), dns_send_packet(), eap_rx_mschapv2_request(), efi_pxe_udp_write(), efi_snp_hii_random_guid(), eth_random_addr(), forcedeth_open(), hermon_alloc_qpn(), http_digest_authenticate(), ib_create_conn(), ib_create_qp(), inject_corruption_nonzero(), inject_fault_nonzero(), iscsi_handle_chap_c_value(), iscsi_open_connection(), loopback_test(), memcpy_test_speed(), ntlm_response(), peerdisc_create(), profile_test_exec(), rand(), start_dhcp(), start_dhcpv6(), tcp_open(), tcpip_bind(), tcpip_random_okx(), tls_client_hello(), tls_new_server_hello(), tls_send_client_key_exchange_pubkey(), vmbus_open(), and wep_encrypt().

◆ srandom()

void srandom ( unsigned int  seed)

Seed the pseudo-random number generator.

Parameters
seedSeed value

Definition at line 21 of file random.c.

21  {
22  rnd_seed = seed;
23  if ( ! rnd_seed )
24  rnd_seed = 4; /* Chosen by fair dice roll */
25 }
static int32_t rnd_seed
Definition: random.c:14

References rnd_seed.

Referenced by random(), srand(), and tcpip_random_okx().

◆ rand()

static int rand ( void  )
inlinestatic

Definition at line 60 of file stdlib.h.

60  {
61  return random();
62 }
long int random(void)
Generate a pseudo-random number between 0 and 2147483647L or 2147483562?
Definition: random.c:32

References random().

Referenced by cipher_cost(), digest_cost(), mlx_utils_rand_priv(), oncrpc_init_session(), and register_netdev().

◆ srand()

static void srand ( unsigned int  seed)
inlinestatic

Definition at line 64 of file stdlib.h.

64  {
65  srandom ( seed );
66 }
void srandom(unsigned int seed)
Seed the pseudo-random number generator.
Definition: random.c:21

References srandom().

Referenced by cipher_cost(), digest_cost(), and register_netdev().

◆ __attribute__()

static __attribute__ ( (always_inline)  )
inlinestatic

Definition at line 75 of file stdlib.h.

75  {
76  return __builtin_abs ( value );
77 }
pseudo_bit_t value[0x00020]
Definition: arbel.h:13

References value.

◆ system()

int system ( const char *  command)

Execute command line.

Parameters
commandCommand line
Return values
rcReturn status code

Execute the named command and arguments.

Definition at line 288 of file exec.c.

288  {
289  int count = split_command ( ( char * ) command, NULL );
290  char *all_tokens[ count + 1 ];
291  int ( * process_next ) ( int rc );
292  char *command_copy;
293  char **tokens;
294  int argc;
295  int process;
296  int rc = 0;
297 
298  /* Create modifiable copy of command */
299  command_copy = strdup ( command );
300  if ( ! command_copy )
301  return -ENOMEM;
302 
303  /* Split command into tokens */
304  split_command ( command_copy, all_tokens );
305  all_tokens[count] = NULL;
306 
307  /* Process individual commands */
308  process = 1;
309  for ( tokens = all_tokens ; ; tokens += ( argc + 1 ) ) {
310 
311  /* Find command terminator */
312  argc = command_terminator ( tokens, &process_next );
313 
314  /* Expand tokens and execute command */
315  if ( process ) {
316  char *argv[ argc + 1 ];
317 
318  /* Expand tokens */
319  if ( ( rc = expand_tokens ( argc, tokens, argv ) ) != 0)
320  break;
321  argv[argc] = NULL;
322 
323  /* Execute command */
324  rc = execv ( argv[0], argv );
325 
326  /* Free tokens */
327  free_tokens ( argv );
328  }
329 
330  /* Stop processing, if applicable */
332  break;
333 
334  /* Stop processing if we have reached the end of the
335  * command.
336  */
337  if ( ! process_next )
338  break;
339 
340  /* Determine whether or not to process next command */
341  process = process_next ( rc );
342  }
343 
344  /* Free modified copy of command */
345  free ( command_copy );
346 
347  return rc;
348 }
A process.
Definition: process.h:18
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
A command-line command.
Definition: command.h:10
static void free_tokens(char **argv)
Free an expanded token list.
Definition: exec.c:273
static int expand_tokens(int argc, char **tokens, char **argv)
Expand settings within a token list.
Definition: exec.c:249
#define ENOMEM
Not enough space.
Definition: errno.h:535
Stop processing current command line.
Definition: shell.h:23
static unsigned int count
Number of entries.
Definition: dwmac.h:225
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:55
char * strdup(const char *src)
Duplicate string.
Definition: string.c:394
int shell_stopped(int stop)
Test and consume shell stop state.
Definition: exec.c:228
static int command_terminator(char **tokens, int(**process_next)(int rc))
Find command terminator.
Definition: exec.c:184
static int split_command(char *command, char **tokens)
Split command line into tokens.
Definition: exec.c:122
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
int execv(const char *command, char *const argv[])
Execute command.
Definition: exec.c:61

References command_terminator(), count, ENOMEM, execv(), expand_tokens(), free, free_tokens(), NULL, rc, SHELL_STOP_COMMAND, shell_stopped(), split_command(), and strdup().

◆ main()

__asmcall int main ( void  )

Main entry point.

Return values
rcReturn status code

Definition at line 29 of file main.c.

29  {
30  int rc;
31 
32  /* Perform one-time-only initialisation (e.g. heap) */
33  initialise();
34 
35  /* Some devices take an unreasonably long time to initialise */
36  printf ( "%s initialising devices...\n", product_short_name );
37  startup();
38 
39  /* Attempt to boot */
40  if ( ( rc = ipxe ( NULL ) ) != 0 )
41  goto err_ipxe;
42 
43  err_ipxe:
44  shutdown_exit();
45  return rc;
46 }
const char product_short_name[]
Product short name string.
Definition: version.c:77
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:465
void initialise(void)
Initialise iPXE.
Definition: init.c:53
int ipxe(struct net_device *netdev)
Main iPXE flow of execution.
Definition: autoboot.c:586
static void shutdown_exit(void)
Shut down system for exit back to firmware.
Definition: init.h:86
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
void startup(void)
Start up iPXE.
Definition: init.c:70

References initialise(), ipxe(), NULL, printf(), product_short_name, rc, shutdown_exit(), and startup().

Referenced by _efi_start().