diff options
Diffstat (limited to 'qemu/roms/ipxe/src/arch/i386/include/bits')
16 files changed, 134 insertions, 23 deletions
diff --git a/qemu/roms/ipxe/src/arch/i386/include/bits/byteswap.h b/qemu/roms/ipxe/src/arch/i386/include/bits/byteswap.h index 0d9cb967c..53b6a454d 100644 --- a/qemu/roms/ipxe/src/arch/i386/include/bits/byteswap.h +++ b/qemu/roms/ipxe/src/arch/i386/include/bits/byteswap.h @@ -9,7 +9,7 @@ #include <stdint.h> -FILE_LICENCE ( GPL2_OR_LATER ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); static inline __attribute__ (( always_inline, const )) uint16_t __bswap_variable_16 ( uint16_t x ) { diff --git a/qemu/roms/ipxe/src/arch/i386/include/bits/compiler.h b/qemu/roms/ipxe/src/arch/i386/include/bits/compiler.h index d48b4b385..87201135f 100644 --- a/qemu/roms/ipxe/src/arch/i386/include/bits/compiler.h +++ b/qemu/roms/ipxe/src/arch/i386/include/bits/compiler.h @@ -1,7 +1,10 @@ #ifndef _BITS_COMPILER_H #define _BITS_COMPILER_H -FILE_LICENCE ( GPL2_OR_LATER ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); + +/** Dummy relocation type */ +#define RELOC_TYPE_NONE R_386_NONE #ifndef ASSEMBLY diff --git a/qemu/roms/ipxe/src/arch/i386/include/bits/endian.h b/qemu/roms/ipxe/src/arch/i386/include/bits/endian.h deleted file mode 100644 index 841885424..000000000 --- a/qemu/roms/ipxe/src/arch/i386/include/bits/endian.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef ETHERBOOT_BITS_ENDIAN_H -#define ETHERBOOT_BITS_ENDIAN_H - -FILE_LICENCE ( GPL2_OR_LATER ); - -#define __BYTE_ORDER __LITTLE_ENDIAN - -#endif /* ETHERBOOT_BITS_ENDIAN_H */ diff --git a/qemu/roms/ipxe/src/arch/i386/include/bits/entropy.h b/qemu/roms/ipxe/src/arch/i386/include/bits/entropy.h index 6dcceec6d..bfeb5e3b5 100644 --- a/qemu/roms/ipxe/src/arch/i386/include/bits/entropy.h +++ b/qemu/roms/ipxe/src/arch/i386/include/bits/entropy.h @@ -7,7 +7,7 @@ * */ -FILE_LICENCE ( GPL2_OR_LATER ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <ipxe/rtc_entropy.h> diff --git a/qemu/roms/ipxe/src/arch/i386/include/bits/hyperv.h b/qemu/roms/ipxe/src/arch/i386/include/bits/hyperv.h new file mode 100644 index 000000000..3565c8a83 --- /dev/null +++ b/qemu/roms/ipxe/src/arch/i386/include/bits/hyperv.h @@ -0,0 +1,72 @@ +#ifndef _BITS_HYPERV_H +#define _BITS_HYPERV_H + +/** @file + * + * Hyper-V interface + * + */ + +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); + +#include <stddef.h> +#include <stdint.h> +#include <ipxe/io.h> + +/** + * Issue hypercall + * + * @v hv Hyper-V hypervisor + * @v code Call code + * @v in Input parameters + * @v out Output parameters + * @ret status Status code + */ +static inline __attribute__ (( always_inline )) int +hv_call ( struct hv_hypervisor *hv, unsigned int code, const void *in, + void *out ) { + void *hypercall = hv->hypercall; + uint32_t in_phys; + uint32_t out_phys; + uint32_t discard_ecx; + uint32_t discard_edx; + uint16_t result; + + in_phys = ( ( __builtin_constant_p ( in ) && ( in == NULL ) ) + ? 0 : virt_to_phys ( in ) ); + out_phys = ( ( __builtin_constant_p ( out ) && ( out == NULL ) ) + ? 0 : virt_to_phys ( out ) ); + __asm__ __volatile__ ( "call *%9" + : "=a" ( result ), "=c" ( discard_ecx ), + "=d" ( discard_edx ) + : "d" ( 0 ), "a" ( code ), + "b" ( 0 ), "c" ( in_phys ), + "D" ( 0 ), "S" ( out_phys ), + "m" ( hypercall ) ); + return result; +} + +/** + * Set bit atomically + * + * @v bits Bit field + * @v bit Bit to set + */ +static inline __attribute__ (( always_inline )) void +hv_set_bit ( void *bits, unsigned int bit ) { + struct { + uint32_t dword[ ( bit / 32 ) + 1 ]; + } *dwords = bits; + + /* Set bit using "lock bts". Inform compiler that any memory + * from the start of the bit field up to and including the + * dword containing this bit may be modified. (This is + * overkill but shouldn't matter in practice since we're + * unlikely to subsequently read other bits from the same bit + * field.) + */ + __asm__ __volatile__ ( "lock bts %1, %0" + : "+m" ( *dwords ) : "Ir" ( bit ) ); +} + +#endif /* _BITS_HYPERV_H */ diff --git a/qemu/roms/ipxe/src/arch/i386/include/bits/nap.h b/qemu/roms/ipxe/src/arch/i386/include/bits/nap.h index 64066e6ab..e8bcfd13b 100644 --- a/qemu/roms/ipxe/src/arch/i386/include/bits/nap.h +++ b/qemu/roms/ipxe/src/arch/i386/include/bits/nap.h @@ -7,7 +7,7 @@ * */ -FILE_LICENCE ( GPL2_OR_LATER ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <ipxe/bios_nap.h> #include <ipxe/efi/efix86_nap.h> diff --git a/qemu/roms/ipxe/src/arch/i386/include/bits/profile.h b/qemu/roms/ipxe/src/arch/i386/include/bits/profile.h index f3ee54ae9..e184d7b51 100644 --- a/qemu/roms/ipxe/src/arch/i386/include/bits/profile.h +++ b/qemu/roms/ipxe/src/arch/i386/include/bits/profile.h @@ -7,7 +7,7 @@ * */ -FILE_LICENCE ( GPL2_OR_LATER ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <stdint.h> diff --git a/qemu/roms/ipxe/src/arch/i386/include/bits/reboot.h b/qemu/roms/ipxe/src/arch/i386/include/bits/reboot.h index 5b09e95f7..803dacfe4 100644 --- a/qemu/roms/ipxe/src/arch/i386/include/bits/reboot.h +++ b/qemu/roms/ipxe/src/arch/i386/include/bits/reboot.h @@ -7,7 +7,7 @@ * */ -FILE_LICENCE ( GPL2_OR_LATER ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <ipxe/bios_reboot.h> diff --git a/qemu/roms/ipxe/src/arch/i386/include/bits/sanboot.h b/qemu/roms/ipxe/src/arch/i386/include/bits/sanboot.h index 9c77a4d42..f02d2e649 100644 --- a/qemu/roms/ipxe/src/arch/i386/include/bits/sanboot.h +++ b/qemu/roms/ipxe/src/arch/i386/include/bits/sanboot.h @@ -7,7 +7,7 @@ * */ -FILE_LICENCE ( GPL2_OR_LATER ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <ipxe/bios_sanboot.h> diff --git a/qemu/roms/ipxe/src/arch/i386/include/bits/smbios.h b/qemu/roms/ipxe/src/arch/i386/include/bits/smbios.h index cc79eec51..2ab31e74b 100644 --- a/qemu/roms/ipxe/src/arch/i386/include/bits/smbios.h +++ b/qemu/roms/ipxe/src/arch/i386/include/bits/smbios.h @@ -7,7 +7,7 @@ * */ -FILE_LICENCE ( GPL2_OR_LATER ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <ipxe/bios_smbios.h> diff --git a/qemu/roms/ipxe/src/arch/i386/include/bits/stdint.h b/qemu/roms/ipxe/src/arch/i386/include/bits/stdint.h index 8edf13192..fe1f9946a 100644 --- a/qemu/roms/ipxe/src/arch/i386/include/bits/stdint.h +++ b/qemu/roms/ipxe/src/arch/i386/include/bits/stdint.h @@ -1,7 +1,7 @@ #ifndef _BITS_STDINT_H #define _BITS_STDINT_H -FILE_LICENCE ( GPL2_OR_LATER ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); typedef __SIZE_TYPE__ size_t; typedef signed long ssize_t; diff --git a/qemu/roms/ipxe/src/arch/i386/include/bits/strings.h b/qemu/roms/ipxe/src/arch/i386/include/bits/strings.h index 092bcb593..453545f00 100644 --- a/qemu/roms/ipxe/src/arch/i386/include/bits/strings.h +++ b/qemu/roms/ipxe/src/arch/i386/include/bits/strings.h @@ -1,7 +1,51 @@ #ifndef _BITS_STRINGS_H #define _BITS_STRINGS_H -FILE_LICENCE ( GPL2_OR_LATER ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); + +/** + * Find first (i.e. least significant) set bit + * + * @v value Value + * @ret lsb Least significant bit set in value (LSB=1), or zero + */ +static inline __attribute__ (( always_inline )) int __ffsl ( long value ) { + long lsb_minus_one; + + /* If the input value is zero, the BSF instruction returns + * ZF=0 and leaves an undefined value in the output register. + * Perform this check in C rather than asm so that it can be + * omitted in cases where the compiler is able to prove that + * the input is non-zero. + */ + if ( value ) { + __asm__ ( "bsfl %1, %0" + : "=r" ( lsb_minus_one ) + : "rm" ( value ) ); + return ( lsb_minus_one + 1 ); + } else { + return 0; + } +} + +/** + * Find first (i.e. least significant) set bit + * + * @v value Value + * @ret lsb Least significant bit set in value (LSB=1), or zero + */ +static inline __attribute__ (( always_inline )) int __ffsll ( long long value ){ + unsigned long high = ( value >> 32 ); + unsigned long low = ( value >> 0 ); + + if ( low ) { + return ( __ffsl ( low ) ); + } else if ( high ) { + return ( 32 + __ffsl ( high ) ); + } else { + return 0; + } +} /** * Find last (i.e. most significant) set bit @@ -13,7 +57,7 @@ static inline __attribute__ (( always_inline )) int __flsl ( long value ) { long msb_minus_one; /* If the input value is zero, the BSR instruction returns - * ZF=1 and leaves an undefined value in the output register. + * ZF=0 and leaves an undefined value in the output register. * Perform this check in C rather than asm so that it can be * omitted in cases where the compiler is able to prove that * the input is non-zero. diff --git a/qemu/roms/ipxe/src/arch/i386/include/bits/time.h b/qemu/roms/ipxe/src/arch/i386/include/bits/time.h index 24dd020e9..6a5d63d32 100644 --- a/qemu/roms/ipxe/src/arch/i386/include/bits/time.h +++ b/qemu/roms/ipxe/src/arch/i386/include/bits/time.h @@ -7,7 +7,7 @@ * */ -FILE_LICENCE ( GPL2_OR_LATER ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <ipxe/rtc_time.h> diff --git a/qemu/roms/ipxe/src/arch/i386/include/bits/timer.h b/qemu/roms/ipxe/src/arch/i386/include/bits/timer.h index 50b676b77..f7d86d78c 100644 --- a/qemu/roms/ipxe/src/arch/i386/include/bits/timer.h +++ b/qemu/roms/ipxe/src/arch/i386/include/bits/timer.h @@ -7,7 +7,7 @@ * */ -FILE_LICENCE ( GPL2_OR_LATER ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <ipxe/bios_timer.h> #include <ipxe/rdtsc_timer.h> diff --git a/qemu/roms/ipxe/src/arch/i386/include/bits/uaccess.h b/qemu/roms/ipxe/src/arch/i386/include/bits/uaccess.h index 2bb52e021..aac09ba95 100644 --- a/qemu/roms/ipxe/src/arch/i386/include/bits/uaccess.h +++ b/qemu/roms/ipxe/src/arch/i386/include/bits/uaccess.h @@ -7,7 +7,7 @@ * */ -FILE_LICENCE ( GPL2_OR_LATER ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <librm.h> diff --git a/qemu/roms/ipxe/src/arch/i386/include/bits/umalloc.h b/qemu/roms/ipxe/src/arch/i386/include/bits/umalloc.h index 54fb006f0..113f16fd1 100644 --- a/qemu/roms/ipxe/src/arch/i386/include/bits/umalloc.h +++ b/qemu/roms/ipxe/src/arch/i386/include/bits/umalloc.h @@ -7,7 +7,7 @@ * */ -FILE_LICENCE ( GPL2_OR_LATER ); +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <ipxe/memtop_umalloc.h> |