iPXE
bigint.h File Reference

Big integer support. More...

#include <stdint.h>
#include <string.h>

Go to the source code of this file.

Typedefs

typedef uint32_t bigint_element_t
 Element of a big integer.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
static __attribute__ ((always_inline)) void bigint_init_raw(uint32_t *value0
 Initialise big integer.
__asm__ __volatile__ ("jecxz 2f\n\t" "\n1:\n\t" "movb -1(%3,%1), %%al\n\t" "stosb\n\t" "loop 1b\n\t" "\n2:\n\t" "xorl %%eax, %%eax\n\t" "mov %4, %1\n\t" "rep stosb\n\t" :"=&D"(discard_D), "=&c"(discard_c), "+m"(*value) :"r"(data), "g"(pad_len), "0"(value0), "1"(len) :"eax")
__asm__ __volatile__ ("xor %0, %0\n\t" "\n1:\n\t" "lodsl\n\t" "adcl %%eax, (%5,%0,4)\n\t" "inc %0\n\t" "loop 1b\n\t" :"=&r"(index), "=&S"(discard_S), "=&c"(discard_c), "=@ccc"(carry), "+m"(*value) :"r"(value0), "1"(addend0), "2"(size) :"eax")
__asm__ __volatile__ ("xor %0, %0\n\t" "\n1:\n\t" "lodsl\n\t" "sbbl %%eax, (%5,%0,4)\n\t" "inc %0\n\t" "loop 1b\n\t" :"=&r"(index), "=&S"(discard_S), "=&c"(discard_c), "=@ccc"(borrow), "+m"(*value) :"r"(value0), "1"(subtrahend0), "2"(size) :"eax")
__asm__ __volatile__ ("xor %0, %0\n\t" "\n1:\n\t" "rcll $1, (%4,%0,4)\n\t" "inc %0\n\t" "loop 1b\n\t" :"=&r"(index), "=&c"(discard_c), "=@ccc"(out), "+m"(*value) :"r"(value0), "1"(size))
__asm__ __volatile__ ("clc\n\t" "\n1:\n\t" "rcrl $1, -4(%3,%0,4)\n\t" "loop 1b\n\t" :"=&c"(discard_c), "=@ccc"(out), "+m"(*value) :"r"(value0), "0"(size))
static __attribute__ ((always_inline, pure)) int bigint_is_zero_raw(const uint32_t *value0
 Test if big integer is equal to zero.
__asm__ __volatile__ ("xor %0, %0\n\t" "repe scasl\n\t" "sete %b0\n\t" :"=&a"(result), "=&D"(discard_D), "=&c"(discard_c) :"1"(value0), "2"(size))
__asm__ __volatile__ ("\n1:\n\t" "movl -4(%3, %1, 4), %k2\n\t" "cmpl -4(%4, %1, 4), %k2\n\t" "loope 1b\n\t" "setae %b0\n\t" :"=q"(result), "=&c"(discard_c), "=&r"(discard_tmp) :"r"(value0), "r"(reference0), "0"(0), "1"(size))
__asm__ __volatile__ ("\n1:\n\t" "bsrl -4(%2,%1,4), %0\n\t" "loopz 1b\n\t" "rol %1\n\t" "rol %1\n\t" "leal 1(%k0,%k1,8), %k0\n\t" "jnz 2f\n\t" "xor %0, %0\n\t" "\n2:\n\t" :"=&r"(result), "=&c"(discard_c) :"r"(value0), "1"(size))
__asm__ __volatile__ ("rep movsl\n\t" "xorl %%eax, %%eax\n\t" "mov %4, %2\n\t" "rep stosl\n\t" :"=&D"(discard_D), "=&S"(discard_S), "=&c"(discard_c), "+m"(*dest) :"g"(pad_size), "0"(dest0), "1"(source0), "2"(source_size) :"eax")
__asm__ __volatile__ ("rep movsl\n\t" :"=&D"(discard_D), "=&S"(discard_S), "=&c"(discard_c), "+m"(*dest) :"0"(dest0), "1"(source0), "2"(dest_size) :"eax")
__asm__ __volatile__ ("jecxz 2f\n\t" "\n1:\n\t" "movb -1(%3,%1), %%al\n\t" "stosb\n\t" "loop 1b\n\t" "\n2:\n\t" :"=&D"(discard_D), "=&c"(discard_c), "+m"(*out_bytes) :"r"(value0), "0"(out), "1"(len) :"eax")
__asm__ __volatile__ ("mull %3\n\t" "addl %5, %0\n\t" "adcl $0, %1\n\t" "addl %0, %2\n\t" "adcl $0, %1\n\t" :"=&a"(discard_a), "=&d"(*carry), "+m"(*result) :"g"(multiplicand), "0"(multiplier), "r"(*carry))

Variables

static unsigned int size
static unsigned int const void * data
static unsigned int const void size_t len
long pad_len = ( sizeof ( *value ) - len )
void * discard_D
long discard_c
static uint32_tvalue0
long index = ( bit / ( 8 * sizeof ( value->element[0] ) ) )
void * discard_S
int carry
int borrow
int out
int result
static const uint32_treference0
long discard_tmp
static unsigned int source_size
static unsigned int uint32_tdest0
static unsigned int uint32_t unsigned int dest_size
long pad_size = ( dest_size - source_size )
static unsigned int source_size __unused
static const uint32_t multiplier
 Port multiplier number.

Detailed Description

Big integer support.

Definition in file bigint.h.

Typedef Documentation

◆ bigint_element_t

Element of a big integer.

Definition at line 16 of file bigint.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ __attribute__() [1/2]

__attribute__ ( (always_inline) )
inlinestatic

Initialise big integer.

Multiply big integer elements.

Finalise big integer.

Shrink big integer.

Grow big integer.

Find highest bit set in big integer.

Shift big integer right.

Shift big integer left.

Subtract big integers.

Add big integers.

Parameters
value0Element 0 of big integer to initialise
sizeNumber of elements
dataRaw data
lenLength of raw data
addend0Element 0 of big integer to add
value0Element 0 of big integer to be added to
sizeNumber of elements
Return values
carryCarry flag
Parameters
subtrahend0Element 0 of big integer to subtract
value0Element 0 of big integer to be subtracted from
sizeNumber of elements
Return values
borrowBorrow flag
Parameters
value0Element 0 of big integer
sizeNumber of elements
Return values
outBit shifted out
Parameters
value0Element 0 of big integer
sizeNumber of elements
Return values
max_bitHighest bit set + 1 (or 0 if no bits set)
Parameters
source0Element 0 of source big integer
source_sizeNumber of elements in source big integer
dest0Element 0 of destination big integer
dest_sizeNumber of elements in destination big integer
value0Element 0 of big integer to finalise
sizeNumber of elements
outOutput buffer
lenLength of output buffer
multiplicandMultiplicand element
multiplierMultiplier element
resultResult element
carryCarry element

◆ __volatile__() [1/12]

__asm__ __volatile__ ( "jecxz 2f\n\t" "\n1:\n\t" "movb - 1%3,%1,
%%al\n\t" "stosb\n\t" "loop 1b\n\t" "\n2:\n\t" "xorl %% eax,
%%eax\n\t" "mov % 4 )

◆ __volatile__() [2/12]

__asm__ __volatile__ ( "xor % 0,
%0\n\t" "\n1:\n\t" "lodsl\n\t" "adcl %% eax )

◆ __volatile__() [3/12]

__asm__ __volatile__ ( "xor % 0,
%0\n\t" "\n1:\n\t" "lodsl\n\t" "sbbl %% eax )

◆ __volatile__() [4/12]

__asm__ __volatile__ ( "xor % 0,
%0\n\t" "\n1:\n\t" "rcll $1 )

References __asm__(), discard_c, index, out, size, value, and value0.

◆ __volatile__() [5/12]

__asm__ __volatile__ ( "clc\n\t" "\n1:\n\t" "rcrl $1)

References __asm__(), discard_c, out, size, value, and value0.

◆ __attribute__() [2/2]

__attribute__ ( (always_inline, pure) ) const
inlinestatic

Test if big integer is equal to zero.

Compare big integers.

Parameters
value0Element 0 of big integer
sizeNumber of elements
Return values
is_zeroBig integer is equal to zero
Parameters
value0Element 0 of big integer
reference0Element 0 of reference big integer
sizeNumber of elements
Return values
geqBig integer is greater than or equal to the reference

References discard_c, discard_D, size, and value0.

◆ __volatile__() [6/12]

__asm__ __volatile__ ( "xor % 0)

◆ __volatile__() [7/12]

__asm__ __volatile__ ( "\n1:\n\t" "movl - 4%3, %1, 4,
%k2\n\t" "cmpl - 4%4, %1, 4 )

◆ __volatile__() [8/12]

__asm__ __volatile__ ( "\n1:\n\t" "bsrl - 4%2,%1,4,
%0\n\t" "loopz 1b\n\t" "rol %1\n\t" "rol %1\n\t" "leal 1%k0,%k1, 8,
%k0\n\t" "jnz 2f\n\t" "xor % 0 )

References __asm__(), discard_c, result, size, and value0.

◆ __volatile__() [9/12]

__asm__ __volatile__ ( "rep movsl\n\t" "xorl %% eax,
%%eax\n\t" "mov % 4 )

◆ __volatile__() [10/12]

__asm__ __volatile__ ( )

◆ __volatile__() [11/12]

__asm__ __volatile__ ( "jecxz 2f\n\t" "\n1:\n\t" "movb - 1%3,%1)

References __asm__(), discard_c, discard_D, len, out, and value0.

◆ __volatile__() [12/12]

__asm__ __volatile__ ( "mull %3\n\t" "addl % 5,
%0\n\t" "adcl $0,
%1\n\t" "addl % 0,
%2\n\t" "adcl $0 )

References __asm__(), carry, multiplier, and result.

Variable Documentation

◆ size

unsigned int size
Initial value:
{
bigint_t ( size ) __attribute__ (( may_alias )) *value =
( ( void * ) value0 )
pseudo_bit_t value[0x00020]
Definition arbel.h:2
static uint32_t * value0
Definition bigint.h:61
uint16_t size
Buffer size.
Definition dwmac.h:3
#define __attribute__(x)
Definition compiler.h:10
#define bigint_t(size)
Define a big-integer type.
Definition bigint.h:20

Definition at line 27 of file bigint.h.

◆ data

unsigned int const void* data

Definition at line 28 of file bigint.h.

◆ len

unsigned int size void size_t len
Initial value:
{
bigint_t ( size ) __attribute__ (( may_alias )) *value =
( ( void * ) value0 )

Definition at line 28 of file bigint.h.

◆ pad_len

◆ discard_D

◆ discard_c

◆ value0

◆ index

unsigned int index = ( bit / ( 8 * sizeof ( value->element[0] ) ) )

Definition at line 65 of file bigint.h.

Referenced by __volatile__(), __volatile__(), __volatile__(), _tg3_flag(), _tg3_flag_clear(), _tg3_flag_set(), a3c90x_prepare_rx_desc(), acpi_find(), acpi_find(), acpi_find_rsdt(), acpi_find_via_rsdt(), acpi_table(), acpi_test_find(), amd8111e_poll(), amd8111e_transmit(), amd8111e_wait_tx_ring(), arbel_cmd_hw2sw_eq(), arbel_cmd_read_mgm(), arbel_cmd_sw2hw_eq(), arbel_cmd_sw2hw_mpt(), arbel_cmd_write_mgm(), arbel_mcast_attach(), arbel_mcast_detach(), ath5k_hw_rfb_op(), atl1e_clean_tx_ring(), b44_cam_write(), b44_cam_write(), b44_populate_rx_descriptor(), bitmap_set(), bitmap_test(), cpio_header(), deflate_inflate(), deflate_length(), deflate_set_length(), des_generate(), dns_send_packet(), draw_menu_item(), dt_ioremap(), dynui_item(), ecam_find(), ecam_read(), ecam_write(), efi_block_boot(), efi_entropy_tick(), efi_file_read_dir(), efi_null_usb_get_endpoint_descriptor(), efi_null_usb_get_string_descriptor(), efi_usb_async_start(), efi_usb_async_stop(), efi_usb_close(), efi_usb_control_transfer(), efi_usb_get_endpoint_descriptor(), efi_usb_get_string_descriptor(), efi_usb_is_open(), efi_usb_open(), efi_usb_sync_transfer(), efi_wait_for_event_wrapper(), efifb_draw(), efifb_draw_unknown(), efifb_dynamic(), efifb_glyph(), efipci_discover_any(), efipci_discover_one(), ehci_dequeue(), ehci_endpoint_poll(), ehci_enqueue(), ena_admin(), ena_admin_req(), ena_poll_rx(), ena_poll_tx(), ena_refill_rx(), ena_transmit(), exanic_expired(), exanic_poll_rx(), exanic_probe_port(), exanic_remove_port(), falcon_read_sram(), falcon_write_sram(), fbcon_cell(), fdt_cells(), fdt_reg_address(), fdt_reg_size(), fdtmem_update_node(), find_smbios(), gve_admin(), gve_admin_command(), gve_poll_rx(), gve_poll_tx(), gve_refill_rx(), gve_transmit(), hermon_cmd_hw2sw_eq(), hermon_cmd_hw2sw_mpt(), hermon_cmd_query_eq(), hermon_cmd_read_mcg(), hermon_cmd_sw2hw_eq(), hermon_cmd_sw2hw_mpt(), hermon_cmd_write_mcg(), hermon_mcast_attach(), hermon_mcast_detach(), igbvf_rar_set_vf(), intelxl_admin_command(), intelxl_admin_event_init(), intelxl_context(), intelxl_context_dump(), intelxl_context_line(), intelxlvf_admin_event(), isapnp_read_iobase(), isapnp_read_irqno(), jump_scroll(), memmap_settings_fetch(), nodnic_port_add_mac_filter(), nodnic_port_recv_db_dma(), nodnic_port_remove_mac_filter(), nodnic_port_send_db_dma(), nodnic_port_update_ring_doorbell(), nvconfig_get_tlv_type_and_class(), nvconfig_nvdata_access(), nvconfig_nvdata_default_access(), nvconfig_read_rom_ini_values(), nvconfig_set_fw_reset_level(), pcicloud_find(), pcnet32_dwio_read_bcr(), pcnet32_dwio_read_csr(), pcnet32_dwio_write_bcr(), pcnet32_dwio_write_csr(), pcnet32_wio_read_bcr(), pcnet32_wio_read_csr(), pcnet32_wio_write_bcr(), pcnet32_wio_write_csr(), peerdist_info_block(), peerdist_info_segment(), peerdist_info_v1_block_offset(), peerdist_info_v1_segment(), peerdist_info_v2_segment(), phantom_clp_cmd(), phantom_refill_rx_ring(), phantom_transmit(), phantom_update_macaddr(), pnm_bitmap(), pnm_data(), pnm_greymap(), pnm_pixmap(), pxe_menu_draw_item(), qib7322_send_buffer_offset(), return(), ring_next(), select_setting_row(), sign_extend32(), smbios_string(), smscusb_get_statistics(), uart_find(), uhci_dequeue(), uhci_endpoint_poll(), uhci_enqueue(), usb_autoconfigure(), usb_clear_feature(), usb_config_descriptor(), usb_control(), usb_endpoint_described(), usb_endpoint_descriptor(), usb_get_config_descriptor(), usb_get_descriptor(), usb_get_status(), usb_get_string_descriptor(), usb_hub_clear_port_feature(), usb_hub_set_port_feature(), usb_message(), usb_set_configuration(), usb_set_feature(), usb_settings_fetch(), usbio_bulk_in_poll(), usbio_bulk_out_poll(), usbio_control_poll(), usbio_endpoint_close(), usbio_endpoint_enqueue(), usbio_interrupt_callback(), usbio_interrupt_poll(), vesafb_glyph(), xen_hvm_get_param(), xhci_dequeue(), xhci_enqueue(), xhci_ring_consumed(), and xhci_set_tr_dequeue_pointer().

◆ discard_S

◆ carry

const uint32_t uint32_t uint32_t * carry
Initial value:
{
uint32_t discard_a
unsigned int uint32_t
Definition stdint.h:12

Definition at line 68 of file bigint.h.

Referenced by __volatile__(), __volatile__(), apm_poweroff(), bigint_add_okx(), bigint_montgomery_relaxed_raw(), bigint_multiply_one(), bigint_reduce_raw(), and gcm_multiply_x().

◆ borrow

return borrow

Definition at line 100 of file bigint.h.

Referenced by __volatile__(), and bigint_subtract_okx().

◆ out

unsigned int size void* out

Definition at line 130 of file bigint.h.

◆ result

const uint32_t uint32_t* result

Definition at line 178 of file bigint.h.

◆ reference0

const uint32_t* reference0

Definition at line 198 of file bigint.h.

Referenced by __volatile__(), bigint_is_geq_raw(), and bigint_is_geq_sample().

◆ discard_tmp

long discard_tmp

Definition at line 201 of file bigint.h.

Referenced by __volatile__().

◆ source_size

unsigned int source_size

◆ dest0

◆ dest_size

unsigned int source_size uint32_t unsigned int dest_size
Initial value:
{
bigint_t ( dest_size ) __attribute__ (( may_alias )) *dest =
( ( void * ) dest0 )
static unsigned int uint32_t unsigned int dest_size
Definition bigint.h:252
static unsigned int uint32_t * dest0
Definition bigint.h:252
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" retur dest)
Definition string.h:151

Definition at line 252 of file bigint.h.

Referenced by __volatile__(), bigint_grow_raw(), bigint_grow_sample(), bigint_shrink_raw(), and bigint_shrink_sample().

◆ pad_size

long pad_size = ( dest_size - source_size )

Definition at line 255 of file bigint.h.

Referenced by __volatile__().

◆ __unused

unsigned int size __unused

Definition at line 280 of file bigint.h.

◆ multiplier